Re: [問題] 讓DevC++發出聲音
恕刪
※ 引述《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
05/20 04:08, 1F
→
05/20 04:09, , 2F
05/20 04:09, 2F
→
05/20 04:11, , 3F
05/20 04:11, 3F
→
05/20 05:11, , 4F
05/20 05:11, 4F
→
05/20 08:58, , 5F
05/20 08:58, 5F
推
05/20 12:43, , 6F
05/20 12:43, 6F
→
05/21 00:48, , 7F
05/21 00:48, 7F
推
05/21 01:10, , 8F
05/21 01:10, 8F
→
05/21 02:18, , 9F
05/21 02:18, 9F
→
05/21 06:17, , 10F
05/21 06:17, 10F
推
05/21 17:04, , 11F
05/21 17:04, 11F
→
05/21 20:55, , 12F
05/21 20:55, 12F
推
05/22 10:20, , 13F
05/22 10:20, 13F
討論串 (同標題文章)