ptt 上看到的問題,原題意是在 Dev-C 下要發出聲音,

一開始我沒幫忙解得很好,

於此將該原始碼做修改與備份 ,有空再補上怎麼看簡單的譜寫 code 之心得。

 

/* some music */
#pragma comment(lib,"winmm.lib")
#include <windows.h>
#include <mmsystem.h>
#define FREQ_CNT 8 /* 中音 do ~ 中音 do,8個音階 */
#define QUARTER_SPEED 200  /* 定義 1/4 拍 */

int main()
{
    /* range: 37~32767 */
    const DWORD Freq[FREQ_CNT+1] = {0,524,588,660,698,784,880,998,1048 };

    /* freqence */
    const DWORD SpringGod_Freq[] = {
       2,0,3,5,8,   6,8,6,5,   4,0,5,3,1, 2,0,1,
       5,5,4,4, 3,5,3,2, 5,5,4,4, 3,5,3,2,
       1,0,3,5,8,   6,8,6,5,   4,0,5,3,1, 2,0,1
    };

    /* tempo */
    const DWORD SpringGod_Tempo[] = {
       3,1,1,2,2,    2,1,1,4,  3,1,1,2,2,4,1,4,
       2,2,2,2,2,    1,1,4,    2,2,2,2,2,1,1,4,
       3,1,1,2,2,    2,1,1,4,  3,1,1,2,2,4,1,4
    };

    int i;

    for(i=0; i!=sizeof(SpringGod_Freq)/sizeof(SpringGod_Freq[0]); ++i){
       if(SpringGod_Tempo[i]==Freq[0]) Sleep(SpringGod_Tempo[i]*QUARTER_SPEED);
       else Beep(Freq[SpringGod_Freq[i]], SpringGod_Tempo[i]*QUARTER_SPEED);
    }
    return 0;
}

 

音階對照表

低音 Do Do# Re Re# Mi Fa Fa# So So# La La# Si
頻率 262 277 294 311 330 349 370 392 415 440 464 494
中音 Do Do# Re Re# Mi Fa Fa# So So# La La# Si
頻率 524 554 588 622 660 698 740 784 830 880 928 988
高音 Do Do# Re Re# Mi Fa Fa# So So# La La# Si
頻率 1048 1108 1176 1244 1320 1396 1480 1568 1660 1760 1856 1976
 

若有建議的簡譜,請不吝提供,讓小弟研究,感激不盡。

edisonx 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • novus
  • 你可以搜尋一下 midiOutOpen、midiOutShortMsg
    這是另一種不同的方向
  • 謝謝建議。在 VS 下,MIDI function 確實是較佳的,且不是由揚聲器發出聲音,意指音量也可自由控制、音質也較柔,都是較佳的優點;此於ptt之回答,因原發問者已指明 "Dev-C" 環境下,故才做此簡答,於此備份。再次感謝您的建議!!

    edisonx 於 2011/05/24 00:27 回覆

  • novus
  • midiOutOpen 等等屬於系統 API
    所有可以載入Winmm.dll 的程式都可以用,不限於VS
  • 這部份到是真沒仔細看,受益良多,非常感謝!!

    edisonx 於 2011/05/24 01:30 回覆

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼