MIDIプログラミングをする際に遭遇した、C#「Windows.Device.Midi」アセンブリのMidiNoteOnMessageメソッドでMIDI音源を再生させる方法について備忘録的に投稿しています。
Windows.Device.Midiアセンブリ
Windows.Device.Midiアセンブリを利用することで、C#でビルドするアプリにMidi音源の再生する機能を簡単に追加できます。
また、このアセンブリはUWP(Universal Windows Platform)向けに作られているようなので、追加するプロジェクトに注意が必要になります。
具体的には、次の手順で追加を行います。
1.[ソリューション エクスプローラー]画面で、プロジェクトをマウスの右ボタンでクリックして表示されたポップアップメニューから[NuGetパッケージの管理]を選択します。
2. 表示された画面で[Microsoft.Windows.SDK.Contracts]を検索して表示された一覧から選択します。
3. 画面右側の[インストール]をクリックします。
4.[変更のプレビュー]画面で[適用]をクリックします。
4.[ライセンスへの同意]画面で[同意する]をクリックします。
4.[出力]画面にインストールの経過が表示されます。
MidiNoteOnMessageで音源再生
追加したアセンブリ内の、MidiNoteOnMessageメソッドを利用することで、C#でビルドするアプリにMidi音源の再生する機能を追加してみます。
具体的には、次の手順で追加を行います。
1. UWPプロジェクトを作成して[MainPage.xaml.cs]ファイルの先頭に次のコードを追加します。
using Windows.Devices.Enumeration;
using Windows.Devices.Midi;
2.[MainPage]クラス内に次の変数と関数を追加します。
public sealed partial class MainPage : Page
{
private IMidiOutPort midioutPort;
private async Task SetMidiOutPort()
{
string selector = MidiOutPort.GetDeviceSelector();
DeviceInformationCollection deviceInformationCollection = await DeviceInformation.FindAllAsync(selector);
for (int nLoop = 0; nLoop < deviceInformationCollection.Count; nLoop++)
{
string id = deviceInformationCollection[nLoop].Id;
midioutPort = await MidiOutPort.FromIdAsync(id);
if (midioutPort != null)
{
break;
}
}
if (midioutPort == null)
{
throw new InvalidOperationException("デバイスが見つかりません");
}
}
3. MainPageのコンストラクター部分にコードを追加して[SetMidiOutPort]を呼び出します。
Task _ = SetMidiOutPort();
4. Xaml編集画面で、ボタンとテキストボックスを1つずつ追加します。
5. XAMLで追加したボタンのイベントハンドラーに次のコードを追加します。テキストボックスの名前(note_text)は実際の名前に変更してください。
private void Button_Click(object sender, RoutedEventArgs e)
{
if(midioutPort == null)
{
return;
}
byte note = Convert.ToByte(note_text.Text);
IMidiMessage midimessage = new MidiNoteOnMessage(0, note, 80);
midioutPort.SendMessage(midimessage);
}
6. すべてを保存してデバッグ実行します。
表示されたウィンドウ内の[Button]をクリックすると、スピーカーから[ド]の音が生成されます。
まとめ
今回は短い記事ですが、Visual StudioのC#でMIDI音源を再生するコードについて書きました。
NuGetからインストールできる[Microsoft.Windows.SDK.Contracts]内のWindows.Device.MidiアセンブリでMIDI音源を簡単にコントロールが可能です。
C#でMidi機器をコントロールしたり、音源を再生したい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。