C MIDI程式設計

2021-10-23 01:18:02 字數 3149 閱讀 9921

#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,給套接字起個名字,用系統呼叫...