主板能唱歌,而且能根據簡譜播放出美妙的旋律,你信嗎?不管你信不信,反正我是信啦,^_^。
Windows API 就提供了一個這樣奇妙的發音函數,它就是Beep函數。Beep可以通過控制主板擴音器的發聲頻率和節拍來演奏美妙的旋律,本文根據音樂簡譜來演奏幾首優美的歌曲,用以展現Beep的瘋狂魅力。
首先我們來Beep的函數原型:
BOOL Beep( DWORD dwFreq, DWORD dwDuration);
參數說明:
dwFreq 指定要發出的頻率(從37Hz到32767Hz)
dwDuration 指定發音的時間長度,以毫秒為單位。
根據簡譜知識,我們知道音樂演奏用的樂譜就是有音節和節拍組成,不同的音節就是不同頻率的聲音,下面我們來看看PC主板擴音器的模仿音節:
程式實現:
/******************************************************************* * Copyright (C) Jerry Jiang * File Name : MultiThreadDlg.cpp * Author : Jerry Jiang * Create Time : 2011-10-7 14:41:02 * Mail : jbiaojerry@gmail.com * Blog : http://blog.csdn.net/jerryjbiao * Description : Beep函數播放《送別》、《傳奇》和《生日快樂歌》 ******************************************************************/#include <iostream>#include <windows.h>using namespace std;//定義低音const int A1 = 131;const int A2 = 147;const int A3 = 165;const int A4 = 175;const int A5 = 196;const int A6 = 220;const int A7 = 247;//定義中音const int B1 = 262;const int B2 = 296;const int B3 = 330;const int B4 = 349;const int B5 = 392;const int B6 = 440;const int B7 = 494;//定義高音const int C1 = 523;const int C2 = 587;const int C3 = 659;const int C4 = 698;const int C5 = 784;const int C6 = 880;const int C7 = 988;//定義高二度const int D1 = 1047;const int D2 = 1175;const int D3 = 1319;const int D4 = 1397;const int D5 = 1568;const int D6 = 1760;const int D7 = 1976;//定義節拍const int OneBeat = 600;const int HalfBeat = 300;void HappyBirthday();void Legend();void SendOff();int main(){cout << "**************************" << endl;cout << "* 1 - 送別 *" << endl;cout << "* 2 - 傳奇 *" << endl;cout << "* 3 - 祝你生日快樂 *" << endl;cout << "**************************" << endl;cout << "請選擇歌曲:" << endl;int num = 0;cin >> num;switch (num){case 1:cout << "你選擇了:1 - 送別" << endl;SendOff();break;case 2:cout << "你選擇了:2 - 傳奇" << endl;Legend();break;case 3:cout << "你選擇了:3 - 祝你生日快樂" << endl;HappyBirthday();break;default:break;}return 0;}void HappyBirthday(){Beep(C5, HalfBeat);Beep(C5, HalfBeat);Beep(C6, OneBeat);Beep(C5, OneBeat);Beep(D1, OneBeat);Beep(C7, OneBeat * 2);Beep(C5, HalfBeat);Beep(C5, HalfBeat);Beep(C6, OneBeat);Beep(C5, OneBeat);Beep(D2, OneBeat);Beep(D1, OneBeat * 2);Beep(C5, HalfBeat);Beep(C5, HalfBeat);Beep(D5, OneBeat);Beep(D3, OneBeat);Beep(D1, OneBeat);Beep(C7, OneBeat);Beep(D4, HalfBeat);Beep(D4, HalfBeat);Beep(D3, OneBeat);Beep(D1, OneBeat);Beep(D2, OneBeat);Beep(D1, OneBeat * 2);Beep(C5, HalfBeat);Beep(C5, HalfBeat);Beep(D5, OneBeat);Beep(D3, OneBeat);Beep(D1, OneBeat);Beep(C7, HalfBeat);Beep(C6, OneBeat * 2);Beep(D4, HalfBeat);Beep(D4, HalfBeat);Beep(D3, OneBeat);Beep(D1, OneBeat);Beep(D2, OneBeat);Beep(D1, OneBeat * 3);}void Legend(){//只是因為在人群中多看了你一眼Beep(C1, HalfBeat);Beep(C1, OneBeat);Beep(C1, OneBeat);Beep(C3, OneBeat);Beep(C2, OneBeat);Beep(C2, HalfBeat);Beep(C2, HalfBeat / 2);Beep(C1, HalfBeat);Beep(C1, OneBeat);Beep(C1, HalfBeat);Beep(C2, OneBeat);Beep(C2, OneBeat);Beep(C1, HalfBeat);Beep(B6, HalfBeat);Beep(B6, HalfBeat / 2);Beep(B6, OneBeat * 2);//再也沒能忘掉你容顏Beep(B7, HalfBeat);Beep(B7, HalfBeat);Beep(B7, OneBeat);Beep(C1, HalfBeat);Beep(C2, HalfBeat);Beep(C2, OneBeat);Beep(B7, OneBeat);Beep(B6, HalfBeat);Beep(B5, HalfBeat);Beep(B3, HalfBeat);Beep(B3, OneBeat * 2);//夢想著偶然能有一天再相見Beep(C3, HalfBeat);Beep(C2, HalfBeat);Beep(C3, OneBeat);Beep(C3, HalfBeat);Beep(C3, HalfBeat / 2);Beep(C2, HalfBeat);Beep(C2, OneBeat);Beep(C2, HalfBeat / 2);Beep(C1, HalfBeat);Beep(C1, OneBeat);Beep(C2, OneBeat);Beep(B6, OneBeat);Beep(B6, HalfBeat);Beep(B6, HalfBeat / 2);Beep(C2, HalfBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat * 2);//從此我開始孤單思念Beep(B7, HalfBeat);Beep(B7, HalfBeat);Beep(B7, OneBeat);Beep(C1, HalfBeat);Beep(C2, HalfBeat / 2);Beep(C2, OneBeat);Beep(C2, OneBeat);Beep(B6, HalfBeat);Beep(B5, OneBeat);Beep(B3, OneBeat * 2);//想你時你在天邊Beep(C5, OneBeat);Beep(C2, HalfBeat / 2);Beep(C2, OneBeat);Beep(C3, OneBeat);Beep(C5, OneBeat);Beep(C2, HalfBeat);Beep(C2, OneBeat);Beep(D1, HalfBeat);Beep(B6, OneBeat * 2);Sleep(50);//想你時你在眼前Beep(C2, OneBeat);Beep(B6, HalfBeat / 2);Beep(B6, OneBeat);Beep(C3, OneBeat);Beep(C2, OneBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat);Beep(C1, OneBeat);Beep(B5, OneBeat * 2);//想你時你在腦海Beep(C5, OneBeat);Beep(C2, HalfBeat / 2);Beep(C2, OneBeat);Beep(C3, OneBeat);Beep(C5, OneBeat);Beep(C2, HalfBeat);Beep(C2, OneBeat);Beep(D1, OneBeat);Beep(B6, OneBeat * 2);Sleep(50);//想你時你在心田Beep(C2, OneBeat);Beep(B6, HalfBeat / 2);Beep(B6, OneBeat);Beep(C3, OneBeat);Beep(C2, OneBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat);Beep(C1, OneBeat);Beep(B5, OneBeat * 2);//寧願相信我們前世有約Beep(C1, HalfBeat);Beep(C1, HalfBeat);Beep(C1, OneBeat);Beep(B5, HalfBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat);Beep(C5, OneBeat);Beep(D4, OneBeat);Beep(C3, OneBeat);Beep(C2, OneBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat * 2);//今生的愛情故事不會再改變Beep(C1, HalfBeat);Beep(C3, HalfBeat);Beep(C5, HalfBeat);Beep(C6, OneBeat);Beep(C5, HalfBeat);Beep(C6, HalfBeat / 2);Beep(C6, HalfBeat);Beep(C5, OneBeat);Beep(C6, OneBeat);Beep(C5, HalfBeat);Beep(C3, HalfBeat);Beep(C3, HalfBeat);Beep(C2, OneBeat);Beep(C3, HalfBeat / 2);Beep(C3, OneBeat * 2);//寧願用這一生等你發現Beep(C1, HalfBeat);Beep(C1, HalfBeat);Beep(C1, OneBeat);Beep(B5, HalfBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat);Beep(C5, OneBeat);Beep(D4, OneBeat);Beep(C3, OneBeat);Beep(C2, OneBeat);Beep(C1, HalfBeat / 2);Beep(C1, OneBeat * 2);//我一直在你身邊從未走遠Beep(C1, HalfBeat);Beep(C3, HalfBeat);Beep(C5, HalfBeat);Beep(C6, OneBeat);Beep(C5, HalfBeat);Beep(C6, HalfBeat / 2);Beep(C6, HalfBeat);Beep(C5, OneBeat);Beep(C6, OneBeat);Beep(C5, HalfBeat);Beep(C3, HalfBeat / 2);Beep(C5, OneBeat);Beep(C5, OneBeat * 4);}void SendOff(){//送別const int ONE_BEEP = 600;const int HALF_BEEP = 300;const int NOTE_1 = 440;const int NOTE_2 = 495;const int NOTE_3 = 550;const int NOTE_4 = 587;const int NOTE_5 = 660;const int NOTE_6 = 733;const int NOTE_7 = 825;//長亭外Beep(NOTE_5, ONE_BEEP);Beep(NOTE_3, HALF_BEEP);Beep(NOTE_5, HALF_BEEP);Beep(NOTE_1 * 2, ONE_BEEP * 2);//古道邊Beep(NOTE_6, ONE_BEEP);Beep(NOTE_1 * 2, ONE_BEEP);Beep(NOTE_5, ONE_BEEP * 2);//芳草碧連天Beep(NOTE_5, ONE_BEEP);Beep(NOTE_1, HALF_BEEP);Beep(NOTE_2, HALF_BEEP);Beep(NOTE_3, ONE_BEEP);Beep(NOTE_2, HALF_BEEP);Beep(NOTE_1, HALF_BEEP);Beep(NOTE_2, ONE_BEEP * 4);//晚風扶柳笛聲殘Beep(NOTE_5, ONE_BEEP);Beep(NOTE_3, HALF_BEEP);Beep(NOTE_5, HALF_BEEP);Beep(NOTE_1 * 2, HALF_BEEP * 3);Beep(NOTE_7, HALF_BEEP);Beep(NOTE_6, ONE_BEEP);Beep(NOTE_1 * 2, ONE_BEEP);Beep(NOTE_5, ONE_BEEP * 2);//夕陽山外山Beep(NOTE_5, ONE_BEEP);Beep(NOTE_2, HALF_BEEP);Beep(NOTE_3, HALF_BEEP);Beep(NOTE_4, HALF_BEEP * 3);Beep((int)(NOTE_7 / 2 + 0.5), HALF_BEEP);Beep(NOTE_1, ONE_BEEP * 4);//天之涯Beep(NOTE_6, ONE_BEEP);Beep(NOTE_1 * 2, ONE_BEEP);Beep(NOTE_1 * 2, ONE_BEEP * 2);//地之角 Beep(NOTE_7, ONE_BEEP); Beep(NOTE_6, HALF_BEEP); Beep(NOTE_7, HALF_BEEP); Beep(NOTE_1 * 2, ONE_BEEP * 2); //知交半零落 Beep(NOTE_6, HALF_BEEP);Beep(NOTE_7, HALF_BEEP);Beep(NOTE_1 * 2, HALF_BEEP);Beep(NOTE_6, HALF_BEEP);Beep(NOTE_6, HALF_BEEP); Beep(NOTE_5, HALF_BEEP);Beep(NOTE_3, HALF_BEEP); Beep(NOTE_1, HALF_BEEP); Beep(NOTE_2, ONE_BEEP * 4); //一壺濁酒盡餘歡 Beep(NOTE_5, ONE_BEEP); Beep(NOTE_3, HALF_BEEP);Beep(NOTE_5, HALF_BEEP); Beep(NOTE_1 * 2, HALF_BEEP * 3); Beep(NOTE_7, HALF_BEEP); Beep(NOTE_6, ONE_BEEP); Beep(NOTE_1 * 2, ONE_BEEP); Beep(NOTE_5, ONE_BEEP * 2); //今宵別夢寒 Beep(NOTE_5, ONE_BEEP); Beep(NOTE_2, HALF_BEEP); Beep(NOTE_3, HALF_BEEP); Beep(NOTE_4, HALF_BEEP * 3); Beep((int)(NOTE_7 / 2 + 0.5), HALF_BEEP); Beep(NOTE_1, ONE_BEEP * 3); Sleep(10000);}