プログラムで音階(ドレミ…)を演奏する
Windows APIを使用すると
MIDIデバイスを使用して
C#や
VBから自由に音階を演奏することができます。
やり方はMIDIデバイスをオープンして、音を鳴らして、MIDIデバイスを開放するという方法になります。
プログラムするにはまず該当するWindows APIを定義します。C#/VBのお作法によりWindows APIを定義するクラスの名前はNativeMethodsにすることが推奨されているので、次のようになります。
usingに using System.Runtime.InteropServices; の指定も必要です。
public class NativeMethods
{
[DllImport("winmm.dll")]
public static extern uint midiOutOpen(out IntPtr lphMidiOut, int uDeviceID, IntPtr dwCallback, IntPtr dwInstance, uint dwFlags);
[DllImport("winmm.dll")]
public static extern uint midiOutShortMsg(IntPtr hMidiOut, uint dwMsg);
[DllImport("winmm.dll")]
public static extern uint midiOutClose(IntPtr hMidiOut);
[DllImport("winmm.dll")]
public static extern uint midiOutReset(IntPtr hMidiOut);
}
■リスト1:以上で準備完了、下記の例ではアコーディオンの音色でドレミを鳴らします。
IntPtr hMidiOut;
const int MIDI_MAPPER = -1;
NativeMethods.midiOutOpen(out hMidiOut, MIDI_MAPPER, IntPtr.Zero, IntPtr.Zero, uint.MinValue);
NativeMethods.midiOutShortMsg(hMidiOut, 0x0016C0);
NativeMethods.midiOutShortMsg(hMidiOut, 0x7F3C90);
Task.Delay(800).Wait();
NativeMethods.midiOutShortMsg(hMidiOut, 0x003C90);
NativeMethods.midiOutShortMsg(hMidiOut, 0x7F3E90);
Task.Delay(800).Wait();
NativeMethods.midiOutShortMsg(hMidiOut, 0x003E90);
NativeMethods.midiOutShortMsg(hMidiOut, 0x7F4090);
Task.Delay(800).Wait();
NativeMethods.midiOutShortMsg(hMidiOut, 0x004090);
NativeMethods.midiOutReset(hMidiOut);
NativeMethods.midiOutClose(hMidiOut);
■リスト2:昔ながらのWindows APIなので昨今のC#/VBからするとかなり奇妙なプログラムに見えるかもしれません。これをオブジェクト指向で呼び出せるようにラップするのも面白いでしょう。
しかし、このプログラムはほんのお遊びレベルです。複数のパートを同時に演奏することもできません。本格的にWindows APIを操ればふた昔前のパソコンのMIDIシンセサイザーくらいのことはできるはずです。