今天在renren上看到用matlab演奏卡农, 我是圡人, 不会用matlab…也想写个简单的小程序跑跑, 于是找c++写了一段孙燕姿的<<遇见>>(只有两小段~~), (我写过的c++代码估计仅限于有限的几道算法题了, 代码有啥不符合c++规范之类的多包涵..), 不过常用的音阶啥的都直接定义好了, 有兴趣的可以在我的代码上再修改~~
话说赶脚Beep这个玩意儿不给力啊, 有时候会卡~
以下是代码:
#include <iostream> #include <windows.h> #define B_MAX_LENGTH 100 //表示一分钟92拍,用于调节速度 #define B_SPEED 92 using namespace std; int beep_sound[B_MAX_LENGTH][2]; int length = 0; const int LONG_ITEM = 60 * 1000 / B_SPEED; //音阶频率对照表 http://zhidao.baidu.com/question/308801610.html //仅限于C调, 仅限于小字组,小字一组,小字二组(外加休止符,以0表示),简单起见用-1,1,+1这样表示 //可以再添加诸如"1+",这样表示升高半度 const char* SCALE_NAME[] = { \ "-1", "-2", "-3", "-4", "-5", "-6", "-7", \ "1", "2", "3", "4", "5", "6", "7", "0", \ "+1", "+2", "+3", "+4", "+5", "+6", "+7", \ "++1", "++2", "++3", "++4", "++5", "++6", "++7" \ }; const int SCALE_FREQ[] = { \ 131, 147, 165, 175, 196, 220, 247, \ 262, 294, 330, 349, 392, 440, 494, 0, \ 523, 587, 659, 699, 784, 880, 988, \ 1047, 1175, 1319, 1397, 1568, 1760, 1976 }; template <class T> int getArrayLen(T& array) { return (sizeof(array) / sizeof(array[0])); } //先将曲谱翻译为频率+长度 void trans(char* sound, float last_time) { for (int i = 0; i < getArrayLen(SCALE_NAME); i++) { if (strcmp(sound, SCALE_NAME[i]) == 0) { beep_sound[length][0] = SCALE_FREQ[i]; break; } } beep_sound[length][1] = LONG_ITEM * last_time; length++; } //正式演奏 void play_sound() { int i; for (i = 0; i < length; i++) { //休止符 if (beep_sound[i][0] == 0) { Sleep(beep_sound[i][1]); } else { Beep(beep_sound[i][0], beep_sound[i][1]); } } } //录入曲谱 void init() { //遇见: 升高8度... trans("+5", 0.5); trans("+3", 1.5); trans("+5", 0.5); trans("+2", 1.5); trans("+3", 0.5); trans("+2", 1); trans("+1", 2.5); trans("+1", 0.5); trans("7", 0.5); trans("6", 0.5); trans("7", 0.5); trans("+1", 0.5); trans("7", 1); trans("+1", 1); trans("+2", 0.5); trans("+3", 3.5); trans("+5", 0.5); trans("+3", 1.5); trans("+5", 0.5); trans("+2", 1.5); trans("+3", 0.5); trans("+2", 1); trans("+1", 2.5); trans("+1", 0.5); trans("7", 0.5); trans("6", 0.5); trans("7", 0.5); trans("+1", 0.5); trans("7", 1); trans("+1", 0.5); trans("+1", 0.5); trans("+2", 0.5); trans("+1", 2); trans("+5", 0.5); trans("+6", 0.5); trans("+7", 0.5); trans("++1", 1); trans("+7", 0.5); trans("++1", 0.5); trans("+7", 0.5); trans("+6", 0.5); trans("+5", 0.5); trans("+6", 1); trans("+5", 2); trans("+1", 0.5); trans("+2", 0.5); trans("+3", 0.5); trans("+4", 1); trans("+3", 0.5); trans("+4", 0.5); trans("+5", 0.5); trans("+1", 0.5); trans("+2", 0.5); trans("+3", 1); trans("+3", 1.5); trans("0", 0.5); trans("+5", 0.5); trans("+6", 0.5); trans("+7", 0.5); trans("++1", 1); trans("+7", 0.5); trans("++1", 0.5); trans("++2", 0.5); trans("++1", 0.5); trans("++2", 0.5); trans("++3", 1); trans("+5", 2); trans("+1", 0.5); trans("+2", 0.5); trans("+3", 0.5); trans("+4", 1); trans("+3", 0.5); trans("+4", 0.5); trans("+3", 0.5); trans("+2", 1); trans("+1", 0.5); trans("7", 0.5); trans("+1", 2.5); } int main() { init(); play_sound(); return 0; }
本文链接:https://www.poisonbian.com/post/472.html 转载需授权!