標題:

c 語言寫音樂問題(20點重賞)

發問:

我想問一下用c語言寫音樂的問題(8051) 最近有一個功課要C語言寫一首歌 我想請網路上的大大幫忙一下 最近生體出一些毛病,一直沒碰這科目 現在完全不懂.... 不用寫出來 我只想要知道要怎麼開始寫這部分 以下是頻率(Hz) A=440 B=494 C=262------------do D=294 E=330 F=350 G=392------------so 有人能寫一段範例給我看嗎? 寫個四個音出來就好了 就 do do so so 這四個音各一秒 拜託各位的幫忙 更新: 我們是用silicon 寫的 我剛剛有去 check依下那個頻率表 ,應該是沒有錯誤的 可能是順序問題 因為題目就是這樣給的沒錯 我還有一個問題就是 他一個音1秒,但是也有兩秒的音,那我要怎麼設定兩秒的音? 原始人大 你真勇猛 謝謝妳 更新 2: 我剛用silicon去跑你打的這些程序, 但是他好像還是有些問題耶,我想問一下 以下這些是什麼?抱歉 我真的不是很懂 #include //#include #include 更新 3: 剛剛在run program時 beep的地方好像一直說有錯誤,在run之前有要先設定什麼嗎?? 假如要了話,是用hyper terminal去設定嗎? 那要怎麼讓hyperterminal 和silicon之間有關係? 更新 4: 抱歉我延長發問時間...因為我還有很多問題 我想再問一下: 假如我要做一個像是mp3功能的機器(我適用學校的實驗版c8051) 他有很多個state stop state 在這個狀態我可以選歌 有兩首歌 play state 在這狀態我可以跳到stop state 和pause state pause state 在個狀態我可以跳到playstate和stop state 請問一下 可以寫個範例給我參考看看嗎? 更新 5: 有關你之前寫的音樂部分 我想問一 下 是只要直接把她放到程式裡以及改那個beep函數之後就能讓他發音嗎? 還是還要在做其他的東西?? 我記得silicon lab這軟體沒有所謂的發音函數 好像要另外寫 我們好像用得是啥hyper terminal的東西 你知道怎麼弄嗎? 更新 6: unrestricted Keil compiler 我們還有用這個

最佳解答:

你的頻率表是錯的!440 和 494 是高八度的 La 和 Si!而且,建議頻率表由 Do 開始,不要由 La。 下面是根據你的要求、及由 La 開始的頻率表做的。C 沒有發音的函數!所以,各家各有不同!這程式在 Visual Studio C 2005 SP1 可以跑。 印象中,Dev C 也可以執行。 裡面的 Tone 是方便用來寫曲的。最後記得要補上一個負值,好結束。 #include //#include #include int main(void) { short Hz[] = { 220, 247, 262, 294, 330, 350, 392 }; char Tone[] = { 2, 2, 6, 6, -1 }, *p; p = Tone; while (Hz[*p] >= 0) Beep(Hz[*p++], 1000); // system("Pause"); return 0; } 哪不懂請補問。 2009-10-21 20:52:30 補充: 寫錯了!@.@while 裡應該是 (*p >= 0) 2009-10-21 21:07:25 補充: 外送小星星一首 int main(void) { int Delay = 200; short Hz[] = { 0, 131, 147, 165, 175, 196, 220, 247, 262, 294, 330, 349, 392, 440, 494, 523, 659, 698, 783, 880, 988, }; 2009-10-21 21:07:47 補充: char Tone[] = { 1, 1, 5, 5, 6, 6, 5, 0, 4, 4, 3, 3, 2, 2, 1, 0, 5, 5, 4, 4, 3, 3, 2, 0, 5, 5, 4, 4, 3, 3, 2, 0, 1, 1, 5, 5, 6, 6, 5, 0, 4, 4, 3, 3, 2, 2, 1, 0 }, *t; 2009-10-21 21:08:01 補充: float Beat[] = { 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.75f, .25f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.5f, .5f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.75f, .25f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.5f, .5f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.75f, .25f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.5f, .5f, -1.f}, *b; t = Tone; b = Beat; 2009-10-21 21:08:09 補充: while (*b >= 0) if (*t) Beep(Hz[*t++], *b++ * Delay); else { Sleep(*b++ * Delay); t++; } return 0; } 2009-10-23 20:40:53 補充: 它的單位是 1/1000 秒(ms) 所以,給 1000就是一秒; 這樣,你會二秒了? 2009-10-26 13:26:21 補充: Beep 不是標準函數! Turbo C 是小寫 beep; Visual Studio 是 Beep 其它 Compiler 你要找一下! 2009-10-28 13:14:00 補充: 我沒寫過 8051 的東西,不能亂說。 基本上,換 state 時要注意: 1. 會不會需要之前的 information? 如:Mpeg 就要! 所以,Mpeg 檔你在拖 play slider 到新位置時,畫面都會 花掉 一下! 如果 MP3 也要,你要能處理一開始的雜音。 2. 會不會需要 state clean? 如果要,建議在 pause / stop 時,藏下資訊! 換 曲 / 位置 / State 時,程式會比較好寫。 2009-10-30 13:22:46 補充: 應該是這樣沒錯。你試一下。

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

其他解答:

到下面的網址看看吧 ??http://*****|||||到下面的網址看看吧 ??http://*****|||||有關你之前寫的音樂部分 我想問一 下 是只要直接把她放到程式裡以及改那個beep函數之後就能讓他發音嗎? 還是還要在做其他的東西??BFC66BE0445C3814
arrow
arrow

    pxrnjl7 發表在 痞客邦 留言(0) 人氣()