作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 讓DevC++發出聲音
時間Fri May 20 03:49:47 2011
恕刪
※ 引述《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)
→ loveme00835:你修改了4次了 XD 05/20 04:08
→ loveme00835: 3 05/20 04:09
→ tropical72:是啊,因為發現有幾個小誤,頻率、參數、原型 XD 05/20 04:11
→ tropical72:其實有更好的方法我沒提,midiOutShortMsg,複雜暫跳過.. 05/20 05:11
→ angleevil:我比較想知道linux的如何用,vc寫太多套件和函式 05/20 08:58
推 Bencrie:system("aplay sound.wav"); XD 05/20 12:43
→ firejox:/dev/audio ? 05/21 00:48
推 softwind:XXD 沒見過這種文章 推推推~ 05/21 01:10
→ ofy:Linux可以考慮GStreamer 05/21 06:17
推 Bencrie:f大那個是 OSS 的介面 XD 05/21 17:04
→ firejox:ALSA不是也可以這樣玩? 05/21 20:55
推 Bencrie:有 OSS emulation 可以啦 XD 05/22 10:20