http://msdn.microsoft.com/en-us/library/dd757277(VS.85).aspxにリストされているすべての必要な関数をラップする必要があります
短いメッセージを使用している場合はそれほど難しくありません。SysExまたは出力ストリーミングを実行する場合は、状況が少し複雑になります。
基本的な入力ポートに必要なのは、有効な入力ID(InputCount -1)を取得し、有効なIDを開いて入力を開始し、デリゲートを介してメッセージを受信することです...入力を停止して最後に閉じます。これは、これを実現する方法の非常に大まかな例です。ポートが閉じられて閉じられたコールバックが発生する前に、ポートが収集されないように注意する必要があります。そうしないと、システムがフリーズします。
幸運を!
名前空間MIDI
{{
パブリッククラスInputPort
{{
private NativeMethods.MidiInProc midiInProc;
プライベートIntPtrハンドル。
public InputPort()
{{
midiInProc = new NativeMethods.MidiInProc(MidiProc);
ハンドル=IntPtr.Zero;
}
public static int InputCount
{{
get {return NativeMethods.midiInGetNumDevs(); }
}
public bool Close()
{{
bool result = NativeMethods.midiInClose(handle)
== NativeMethods.MMSYSERR_NOERROR;
ハンドル=IntPtr.Zero;
結果を返します。
}
public bool Open(int id)
{{
NativeMethods.midiInOpen(を返します
アウトハンドル、
id、
midiInProc、
IntPtr.Zero、
NativeMethods.CALLBACK_FUNCTION)
== NativeMethods.MMSYSERR_NOERROR;
}
public bool Start()
{{
NativeMethods.midiInStart(handle)を返します
== NativeMethods.MMSYSERR_NOERROR;
}
public bool Stop()
{{
NativeMethods.midiInStop(handle)を返します
== NativeMethods.MMSYSERR_NOERROR;
}
private void MidiProc(IntPtr hMidiIn、
int wMsg、
IntPtr dwInstance、
int dwParam1、
int dwParam2)
{{
//ここでメッセージを受信します
}
}
内部静的クラスNativeMethods
{{
internal const int MMSYSERR_NOERROR = 0;
internal const int CALLBACK_FUNCTION = 0x00030000;
内部デリゲートvoidMidiInProc(
IntPtr hMidiIn、
int wMsg、
IntPtr dwInstance、
int dwParam1、
int dwParam2);
[DllImport( "winmm.dll")]
internal static extern int midiInGetNumDevs();
[DllImport( "winmm.dll")]
internal static extern int midiInClose(
IntPtr hMidiIn);
[DllImport( "winmm.dll")]
internal static extern int midiInOpen(
IntPtr lphMidiIn、
int uDeviceID、
MidiInProc dwCallback、
IntPtr dwCallbackInstance、
int dwFlags);
[DllImport( "winmm.dll")]
internal static extern int midiInStart(
IntPtr hMidiIn);
[DllImport( "winmm.dll")]
internal static extern int midiInStop(
IntPtr hMidiIn);
}
}