在C#中调用 winmm.dll(Windows Multimedia Library)来播放 MIDI 文件通常涉及使用mciSendString 函数,该函数是 winmm.dll 中提供的一个函数,用于发送 MCI(Media Control Interface)命令给MCI设备。
但是,需要注意的是,直接通过 mciSendString 播放 MIDI 文件可能需要一些特定的设置和配置,因为MIDI通常是通过MIDI输出设备(如声卡上的MIDI端口或MIDI合成器)来播放的,而不是通过默认的音频输出设备。
以下是一个简单的示例 play_mid.cs,说明如何在C#中使用 P/Invoke 调用 mciSendString 函数来尝试播放 MIDI 文件:
using System; 
using System.Text; 
using System.Runtime.InteropServices;  class MidiPlayer  
{  // 导入 mciSendString 函数  [DllImport("winmm.dll")]  private static extern int mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);  // 播放MIDI文件的函数  public static void PlayMidi(string midiFileName)  {  const int bufferSize = 128;  StringBuilder returnBuffer = new StringBuilder(bufferSize);  // 构建MCI命令来打开并播放MIDI文件  string command = "open \"" + midiFileName + "\" type sequencer alias myMid";  if (mciSendString(command, returnBuffer, bufferSize, IntPtr.Zero) != 0)  {  Console.WriteLine("Error open MIDI file: " + returnBuffer.ToString());  return;  }  // 构建MCI命令来播放MIDI文件  command = "play myMid";  if (mciSendString(command, returnBuffer, bufferSize, IntPtr.Zero) != 0)  {  Console.WriteLine("Error play MIDI file: " + returnBuffer.ToString());  return;  }  // 如果你想要等待MIDI播放完成,你可能需要轮询状态或使用其他同步机制 }  static void Main(string[] args)  {  if (args.Length <1){Console.WriteLine(" usage: play_mid.exe file1.mid ");return;}  string midiFilePath = args[0];Console.WriteLine("play: " + midiFilePath);PlayMidi(midiFilePath); Console.ReadLine();}  
}where csc
 C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
编译 csc play_mid.cs
运行 play_mid.exe test1.mid
C# 直接调用 OpenFileDialog,打开文件夹,选择*.mid文件,并播放。
编写 open_mid.cs 如下
// open a midi file
using System;
using System.Diagnostics;
using System.Windows.Forms;public class OpenMidFile
{[STAThread]public static void Main(){OpenFileDialog ofd = new OpenFileDialog();// 设置对话框属性ofd.Title = "请选择.mid文件";// 设置初始目录ofd.InitialDirectory = "D:\\Music";// 设置文件过滤器ofd.Filter = "mid files (*.mid)|*.mid";ofd.FilterIndex = 1; // 设置默认的文件过滤器索引ofd.RestoreDirectory = true; // 设置在关闭对话框前还原目录if (ofd.ShowDialog() == DialogResult.OK) // 显示对话框{// 获取选中的文件路径string filePath = ofd.FileName;//Console.WriteLine("playing: " +filePath);ProcessStartInfo startInfo = new ProcessStartInfo("play_mid.exe");startInfo.Arguments = " " +filePath;startInfo.UseShellExecute = false;Process process = Process.Start(startInfo);process.WaitForExit();} else {Console.WriteLine("Select null");}}
}编译 csc /r:System.Windows.Forms.dll /target:winexe open_mid.cs
运行 open_mid.exe