#include
#pragma comment(lib,"winmm.lib")
我們來看一下midi相關的api
//開啟mid裝置
mmresult midioutopen
( _out_ lphmidiout phmo,
_in_ uint udeviceid,
_in_opt_ dword_ptr dwcallback,
_in_opt_ dword_ptr dwinstance,
_in_ dword fdwopen
);//輸出midi訊號
mmresult midioutmessage
( _in_opt_ hmidiout hmo,
_in_ uint umsg,
_in_opt_ dword_ptr dw1,
_in_opt_ dword_ptr dw2
);//輸出midi短訊息
mmresult midioutshortmsg
( _in_ hmidiout hmo,
_in_ dword dwmsg
);//輸出midi長訊號
mmresult midioutlongmsg
( _in_ hmidiout hmo,
_in_reads_bytes_
(cbmh) lpmidihdr pmh,
_in_ uint cbmh
);//關閉midi裝置
mmresult midioutclose
( _in_ hmidiout hmo
);
midiout handle;
midioutopen
(handle,0,
0,0,
0)
之後就是輸出midi訊息了
本次只講解midioutshortmsg()函式,其他函式有興趣的可以自己去研究。
mmresult midioutshortmsg(hmidiout hmo,dword dwmsg);
第乙個引數就是midi的控制代碼了,第二個引數則是乙個unsigned long數值。
但是,經過我蒐集到的資料,根據關於windows下的midi基礎程式設計這篇文章的描述,這個引數應該是要放乙個8位的16進製制數。
midioutshortmsg
(handle,
0x00403c90
);
根據我的研究,這個引數只有前6位有效,應該是6位16進製制數作為引數即(當然,前面加n個0也無影響),並且,我發現這個引數可以分成三部分。以上面的引數為例,0x403c90,可以分為0x40,0x3c,0x90這三個位元組。而0x40代表音量,範圍是0x0-0x7f。0x3c代表音階,範圍是0x0-7f,0x90代表樂器,根據我的測試範圍應該是0x90-0x9f ,其中0x99為鼓類,其餘皆為鋼琴。設這三個位元組為a,b,c,將這三個位元組通過位移組合起來可得到midioutshortmsg()的合法引數
int a=
0x40
,b=0x3c
,c=0x90
;msg=
(a<<16)
+(b<<8)
+c;
然後即可呼叫midioutshortmsg()函式輸出聲音資訊,midioutshortmsg()要和sleep()配合使用才行,否則聲音會沒有長度。
midioutshortmsg
(handle,
0x00403c90);
sleep
(2000
);
最後,別忘了關閉midi裝置哦
midioutclose
(handle)
然後,奉上原始碼
#include
#include
#include
#pragma comment(lib,"winmm.lib")
using
namespace std;
/*midi引數 音量<<16+聲調<<8+樂器型別
音量範圍 0x0-0x7f
樂器範圍 0x90-0x9f 其中0x99為鼓類,其餘皆為鋼琴
音階範圍 0x0-7f 以下為中音的音調16進製制引數對照表
do:0x3c re:0x3e mi:0x40 fa:0x41 so:0x43 la:0x45 xi:0x47 do+1:0x48
*/enum scale//這是群裡的大仙幫我找到的音階引數
;enum voice
;void
summer()
;for
(auto i : summer)
if(i == _)
voice =
(volume <<16)
+(i <<8)
+0x94
;printf
("%p\n"
, voice)
;midioutshortmsg
(handle, voice)
;sleep
(sleep);}
midioutclose
(handle);}
void
piano()
,,,,
,,,,
,,,,
,,,,
,,,,
,};printf
("鋼琴已開啟,敲擊鍵盤q-u,a-j,z-m\n");
while(1
)midioutshortmsg
(handle,
(0x007f
<<16)
+(v[i]
<<8)
+0x90);
system
("cls");
printf
("請按l鍵退出\n");
printf
("已按下%c鍵\n"
, i)
;while
(getkeystate
(i)<0)
sleep
(100);
}}}}
intmain()
程式設計,還是程式設計
喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...
少兒程式設計程式設計
機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...
LINUX程式設計 socket程式設計
什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...