Re: [問題] 讓DevC++發出聲音

看板C_and_CPP作者 (藍影)時間13年前 (2011/05/20 03:49), 編輯推噓4(409)
留言13則, 7人參與, 最新討論串2/2 (看更多)
恕刪 ※ 引述《jc91027557 ()》之銘言: : 感覺兩個函式都是我設定或是安裝的地方不完整 : 可是查了好久資料都是大陸那邊重覆的東西 : 不知道是我方向錯還是找錯東西 : 還請大家指點迷津了.... 之前做過類似的事,可以達到的方法不少,當時是用 VC 開發, 不確定 Dev-C 也適用 (沒特別確認過),予以參考。 最簡單、最容易被砍的是用 system("C:\\MyMusic.wav"); 最大缺點為會跳出一播放軟體出來 (可用 WinExec, SW_HIDE 改善) 而 Win32 API 之方式你也知道了,大致長這樣 #pragma comment(lib,"winmm.lib") #include <windows.h> #include <mmsystem.h> #include <conio.h> int main() { PlaySound("F:\\MyWav.wav", NULL,SND_ASYNC | SND_LOOP | SND_FILENAME); getch(); reutrn 0; } MSDN 上對 PlaySound 參數有詳細說明,於此便不贅述。 唯應注意,PlaySound 在使用前應先確定該 wav 是可播放的, 有遇過的經驗是,的確是 wav 格式 (判別前 4 bytes 為 RIFF, 0x8~0xe 為 WAVEfmt) 播放器可以播,PlaySound return TRUE,但就是沒聲音。 PlaySound in MSDN: http://msdn.microsoft.com/en-us/library/dd743680(v=vs.85).aspx 上述使用 system、PlaySound ,要播 mp3、要播 wav 都可以, 優點是喇叭要多大有多大、要重低音都沒問題,缺點便不再贅述。 ------ 其它 compiler library 提供的 beep 我不甚了解, VC 下可調用 Beep, 配合 Sleep 去做, 優點是要什麼歌有什麼歌 (前提是要會看譜), 缺點是揚聲器就只能那麼大聲,要換顆大聲的揚聲器又不是那麼方便。 Beep 原型如下 BOOL Beep(int dwFreq, int dwDuration); 要用 Beep 做編譜勢必對樂譜要有一點點概念, 第一個參數 dwFreq 為頻率,這裡先給出低音 Do~ 高音 Si 頻率 #define N 7 static unsigned LoFullSound[N] = {262,294,330,349,392,440,494}; static unsigned MiFullSound[N] = {524,588,660,698,784,880,998}; static unsigned HiFullSound[N] = {1048,1176,1320,1396,1568,1760,1976}; 裡面跳過了 Do#, Re#, Fa#, So#, La# 音階,要更全網路查一下會有。 至於第二個參數 dwDuration 為延時,就是這個頻率要放多久, 一般而言,一拍大概 600 ms,其它的半拍、四分之一拍乘上去就好。 編碼時不要怕 tempo 不準,反正寫出來的東西不會拿去投音樂獎。 這裡給個範例碼,tempo 沒很準 (不好意思,我是雙英白痴,英文+音樂) 參考看看 /* 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] = {37,524,588,660,698,784,880,998,1048 }; /* freqence */ const DWORD SpringGod_Freq[] = { 1,3,5,8, 6,8,6,5, 4,5,3,1, 2,1, 5,5,4,4, 3,5,3,2, 5,5,4,4, 3,5,3,2, 1,3,5,8, 6,8,6,5, 4,5,3,1, 2,1 }; /* tempo */ const DWORD SpringGod_Tempo[] = { 4,2,2,2, 2,1,1,4, 4,2,2,2,4,4, 2,2,2,2, 2,1,1,4, 2,2,2,2,2,1,1,4, 4,2,2,2, 2,1,1,4, 4,2,2,2,4,4 }; int i; for(i=0; i!=sizeof(SpringGod_Freq)/sizeof(SpringGod_Freq[0]); ++i){ Beep(Freq[SpringGod_Freq[i]], SpringGod_Tempo[i]*QUARTER_SPEED) } return 0; } -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222 ※ 編輯: tropical72 來自: 180.177.73.222 (05/20 04:05)

05/20 04:08, , 1F
你修改了4次了 XD
05/20 04:08, 1F

05/20 04:09, , 2F
3
05/20 04:09, 2F

05/20 04:11, , 3F
是啊,因為發現有幾個小誤,頻率、參數、原型 XD
05/20 04:11, 3F

05/20 05:11, , 4F
其實有更好的方法我沒提,midiOutShortMsg,複雜暫跳過..
05/20 05:11, 4F

05/20 08:58, , 5F
我比較想知道linux的如何用,vc寫太多套件和函式
05/20 08:58, 5F

05/20 12:43, , 6F
system("aplay sound.wav"); XD
05/20 12:43, 6F

05/21 00:48, , 7F
/dev/audio ?
05/21 00:48, 7F

05/21 01:10, , 8F
XXD 沒見過這種文章 推推推~
05/21 01:10, 8F

05/21 02:18, , 9F
補一個自己還看不懂的資料XD http://tinyurl.com/6997ov
05/21 02:18, 9F

05/21 06:17, , 10F
Linux可以考慮GStreamer
05/21 06:17, 10F

05/21 17:04, , 11F
f大那個是 OSS 的介面 XD
05/21 17:04, 11F

05/21 20:55, , 12F
ALSA不是也可以這樣玩?
05/21 20:55, 12F

05/22 10:20, , 13F
有 OSS emulation 可以啦 XD
05/22 10:20, 13F
文章代碼(AID): #1DrNHUP9 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DrNHUP9 (C_and_CPP)