導入winmm.dll中的函數mciSendString
[DllImport("winmm.dll")] static extern Int32 mciSendString(String command, StringBuilder buffer, Int32 bufferSize, IntPtr hwndCallback);
需要注意的是,所有命令需要在同一個線程中,才可以對同一個midi實例進行控制。該函數通過字符串向聲卡發送指令,常見的用於播放midi文件的指令有以下:
1.打開文件
mciSendString($"open {file} type {device} alias {alias}", null, 0, new IntPtr());
{file}: 文件名,需要打開的midi文件路徑;
{device}: 設備名稱,一般填寫”sequencer”,不過筆者發現填寫”mpegvideo”會顯著提高加載midi的速度;
{alias}: 別名,用於后續對該midi的控制。
2.播放文件
mciSendString($"play {alias} [repeat]", null, 0, new IntPtr());
{alias}: 前文提到的別名;
[repeat]: 可選指令,可以循環播放。
3.獲取文件時長
mciSendString("set {alias} time format milliseconds", null, 0, new IntPtr()); mciSendString("status {alias} length", result, 100, new IntPtr());
首先將時間格式設置為毫秒,然后將時間讀取到result變量中。
4.停止播放
mciSendString($"stop {alias}", null, 0, new IntPtr());
5.關閉文件
mciSendString($"close {alias}", null, 0, new IntPtr());