Next MIDI Project

MIDIポートを列挙する

midiInGetDevNumsmidiInGetDevCapsを使います。

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

▲ページトップ | 次へ進む