今天在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;
}