MIDIポートを列挙する
・midiInGetDevNums、midiInGetDevCapsを使います。
MIDI出力ポートの場合と同じなので、解説は省略します。
・MidiInApi
/**** Source Code (C#) ****/ /// <summary> /// MIDI入力APIの宣言です。 /// </summary> public static class MidiInApi { /// <summary> /// MIDI入力ポートの数を取得します。 /// </summary> [DllImport("winmm.dll", EntryPoint = "midiInGetNumDevs")] [return: MarshalAs(UnmanagedType.U4)] public static extern uint midiInGetNumDevs(); /// <summary> /// MIDI入力ポートの情報を取得します。 /// </summary> [DllImport("winmm.dll", EntryPoint = "midiInGetDevCaps", CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.U4)] public static extern MMResult midiInGetDevCaps([MarshalAs(UnmanagedType.U4)]uint uDeviceID, ref MidiInCapsA lpMidiInCaps, [MarshalAs(UnmanagedType.U4)]uint cbMidiInCaps); }
・MidiInCapsA
/**** Source Code (C#) ****/ /// <summary> /// MIDI入力ポートの情報を表します。 /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct MidiInCapsA { /// <summary> /// MIDIハードウェアのメーカーIDです。 /// </summary> [MarshalAs(UnmanagedType.U2)] public ushort wMid; /// <summary> /// Product IDです。 /// </summary> [MarshalAs(UnmanagedType.U2)] public ushort wPid; /// <summary> /// ドライバーのバージョンです。 /// </summary> [MarshalAs(UnmanagedType.U4)] public uint vDriverVersion; /// <summary> /// ポートの名前です。 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MidiPortConst.MaxPNameLen)] public string szPname; /// <summary> /// デバイスドライバのメジャーバージョンを取得します。 /// </summary> public byte MajorVersion { get { return (byte)(vDriverVersion >> 8); } } /// <summary> /// デバイスドライバのマイナーバージョンを取得します。 /// </summary> public byte MinorVersion { get { return (byte)(vDriverVersion & 0xFF); } } }
・MidiInPortHandle
/**** Source Code (C#) ****/ /// <summary> /// MIDI入力ポートを抽象化するクラスです。 /// </summary> public class MidiInPortHandle : IDisposable { /// <summary> /// MIDI入力ポートの数を取得します。 /// </summary> public static int GetPortCount() { return (int)MidiInApi.midiInGetNumDevs(); } /// <summary> /// MIDI入力ポートの情報を取得します。 /// </summary> public static MidiInCapsA GetPortInformation(int portNum) { var caps = new MidiInCapsA(); MidiInApi.midiInGetDevCaps((uint)portNum, ref caps, (uint)Marshal.SizeOf(typeof(MidiInCapsA))).Throw(); return caps; } }
これらのコードを使って、ポートの一覧を書き出してみます。
/**** Source Code (C#) ****/ static void Main(string[] args) { int count = MidiInPortHandle.GetPortCount(); for (int i = 0; i < count; i++) { var caps = MidiInPortHandle.GetPortInformation(i); Debug.Print(caps.szPname); } }
実行結果:
MIDI Yoke NT: 1
MIDI Yoke NT: 2
MIDI Yoke NT: 3
MIDI Yoke NT: 4
MIDI Yoke NT: 5
MIDI Yoke NT: 6
MIDI Yoke NT: 7
MIDI Yoke NT: 8
Yamaha UX16-1
Yamaha MOTIF-R XS-1
Yamaha MOTIF-R XS-2
Yamaha MOTIF-R XS-3
Yamaha MOTIF-R XS-4
E-DSP MIDI Port [1040]
1:EDIROL PC-50
1:EDIROL SD-80 PART A
1:EDIROL SD-80 PART B
1:EDIROL SD-80 MIDI IN 1
1:EDIROL SD-80 MIDI IN 2