程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#調用Windows API播放Midi

C#調用Windows API播放Midi

編輯:C#基礎知識
繼續,前面已經實現了C#調用Windows API實現了彈出對話框功能。使用了User32.dll文件,主要代碼如下:

[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);
詳情請參考:http://hovertree.com/h/bjaf/psjdasa2.htm

效果如下:


也練習了調用winmm.dll播放wav聲音文件,主要代碼:
[DllImport("winmm.dll")]
private static extern int sndPlaySoundA(byte[] lpszSoundName, int uFlags);

詳情參考:http://hovertree.com/h/bjaf/jeg0ytf5.htm

效果圖:


接下來繼續練習調用別API,就調用winmm.dll的midi播放功能吧。

MIDI(Musical Instrument Digital Interface)樂器數字接口 ,是20 世紀80 年代初為解決電聲樂器之間的通信問題而提出的。MIDI是編曲界最廣泛的音樂標准格式,可稱為“計算機能理解的樂譜”。它用音符的數字控制信號來記錄音樂。一首完整的MIDI音樂只有幾十KB大,而能包含數十條音樂軌道。幾乎所有的現代音樂都是用MIDI加上音色庫來制作合成的。MIDI 傳輸的不是聲音信號, 而是音符、控制參數等指令, 它指示MIDI 設備要做什麼,怎麼做, 如演奏哪個音符、多大音量等。它們被統一表示成MIDI 消息(MIDI Message) 。傳輸時采用異步串行通信, 標准通信波特率為31.25×( 1±0.01) KBaud。

所以調用API播放midi也是按照格式指定播放指令。接下來就測試實現midi功能。

首先是打開midi輸出設備的API:
MMRESULT midiOutOpen(
LPHMIDIOUT lphmo,
UINT uDeviceID,
DWORD_PTR dwCallback,
DWORD_PTR dwCallbackInstance,
DWORD dwFlags
);
詳情請看:http://hovertree.com/h/bjaf/tug59e9l.htm

在C#中調用該API:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutOpen(out UInt32 lphMidiOut, uint uDeviceID, UInt32 dwCallback, UInt32 dwInstance, UInt32 dwFlags);

其中lphMidiOut 為設備的句柄 ,在後面播放聲音會用到。

然後是向設備發送播放指令API:
MMRESULT midiOutShortMsg(
HMIDIOUT hmo,
DWORD dwMsg
);
詳情請參考:http://hovertree.com/h/bjaf/4ext7m8l.htm

在C#中調用:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutShortMsg(UInt32 hMidiOut, UInt32 dwMsg);

這裡hMidiOut就是midiOutOpen方法的lphMidiOut

接下來就封裝這些API,Midi輸出設備需要打開之後才能播放聲音,在封裝的類HewenqiMidi中加一個狀態,表示設備是否打開,代碼為:private bool _isOpened; 因為是調用API,所以設備有一個句柄,也就是上面提到的lphMidiOut ,所以類中加一個設備句柄字段,句柄的類型為32位無符號整形UNIT,參考:http://hovertree.com/h/bjaf/exee7473.htm,代碼為:private uint _deviceHandle; 用來存儲midiOutOpen獲得的句柄lphMidiOut,這兩個字段可以封裝為屬性,只讀的屬性。

接下來,實現設備的打開功能,主要代碼:
uint h_Device;
uint h_r = midiOutOpen(out h_Device, 0, 0, 0, 0);
當h_r等與0時,表示打開成功,否則打開不成功,具體返回值可以參考:http://hovertree.com/h/bjaf/tug59e9l.htm

播放聲音的方法:
public uint ShortPlay(uint msg)
{
if (_isOpened)
return midiOutShortMsg(_deviceHandle, msg);
else
return 621;
}
先檢查設備是否已經打開,打開了就播放聲音,返回0表示成功。參考: http://hovertree.com/h/bjaf/37iovb7c.htm

參數msg表示要播放的聲音,這個參數可以包含音量和音高等信息,詳情請參考:
http://hovertree.com/h/bjaf/4ext7m8l.htm
根據這個參數構造以下方法:

/// <summary>
/// 播放聲音
/// </summary>
/// <param name="key">音高(音調)</param>
/// <param name="volume">音量</param>
/// <param name="chenel">通道</param>
/// <returns></returns>
public uint ShortPlay(uint key, uint volume, uint chenel)
{
return ShortPlay(144 + key * 256 + volume * 65536 + chenel);
}


這樣就可以方便調節播放的音量和音高了。當然還有可以設置音色,先放到後邊介紹。

打開MIDI設備後,要怎麼關閉呢?也是調用API:
midiOutClose(
hMidiOut: HMIDIOUT {設備句柄}
)
詳情:http://hovertree.com/h/bjaf/gmn82vlo.htm

在C#中調用:
[DllImport("winmm.dll")]
private static extern UInt32 midiOutClose(UInt32 hMidiOut);
返回0表示成功

接著,使用HewenqiMidi 類,建立一個WinForm 窗體,測試播放功能。如下圖所示:

演示下載地址:http://hovertree.com/h/bjaf/xy6rbg5m.htm

源碼發布到這個網址:http://hovertree.net/
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved