MIDI信号を受信する


ExH nnH vvHってピッチベンドなんですけど
00 40って…。騙された感の漂うキャプチャです。

MIDIポートからの入力を取得するには、IMidiInPortを使います。

VB.net

Imports System
Imports System.Threading
Imports System.Windows.Forms
Imports Avenue
Imports NextMidi.DataElement
Imports NextMidi.MidiInPort

Public Class frmMain

    Public Sub New()

        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        EnumPorts()
    End Sub

    Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles MyBase.FormClosing

        If port IsNot Nothing Then

            ' ポートを閉じる
            port.Close()
        End If
    End Sub

    Dim port As MidiInPort = Nothing

    Private Sub EnumPorts()

        'ポートを列挙する
        Dim portList As New MidiInPortList()

        cmbPortList.Items.AddRange(portList.Items.ToArray())

    End Sub

    Private Sub cmbPortList_SelectedValueChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbPortList.SelectedValueChanged

        '使用しているポートがあれば、閉じる
        If port IsNot Nothing Then

            txtData.Text += port.Name + "を閉じました。" + vbCrLf
            port.Close()
        End If

        'ポートを設定する
        port = cmbPortList.SelectedItem

        '受信イベントを拾う
        AddHandler port.Received, AddressOf port_Received

        'ポートを開く
        port.Open()
        txtData.Text += port.Name + "を開きました。" + vbCrLf
    End Sub

    Private Sub port_Received(ByVal sender As Object, ByVal e As DataEventArgs(Of NextMidiData))

        Dim processMethod As New Action(Of NextMidiData)(AddressOf ShowData)
        Dim params() As NextMidiData = {e.Value}

        txtData.Invoke(processMethod, params)
    End Sub

    Private Sub ShowData(ByVal data As NextMidiData)

        'データの表示
        txtData.Text += BitConverter.ToString(data.ToMidiData()).Replace("-"c, " "c) + _
        " (" + data.GetType().Name + ")" + vbCrLf
    End Sub
End Class

C#

using System;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using Avenue;
using NextMidi.DataElement;
using NextMidi.MidiInPort;

namespace Receive
{
	public partial class frmMain : Form
	{
		public frmMain()
		{
			InitializeComponent();

			// ポートを列挙する
			MidiInPortList portList = new MidiInPortList();
			cmbPortList.Items.AddRange(portList.Items.ToArray());
		}

		private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
		{
			if (port != null)
			{
				// ポートを閉じる
				port.Close();
			}
		}

		IMidiInPort port = null;

		private void cmbPortList_SelectedIndexChanged(object sender, EventArgs e)
		{
			// 使用しているポートがあれば、閉じる
			if (port != null)
			{
				txtData.Text += port.Name + "を閉じました。\r\n";
				port.Close();
			}

			// ポートを設定する
			port = cmbPortList.SelectedItem as IMidiInPort;

			// 受信イベントを拾う
			port.Received += new EventHandler<DataEventArgs<NextMidiData>>(port_Received);

			// ポートを開く
			port.Open();
			txtData.Text += port.Name + "を開きました。\r\n";
		}

		void port_PreProcess(object sender, DataEventArgs<NextMidiData> e)
		{
			txtData.Invoke(new ThreadStart(delegate()
			{
				// データの表示
				txtData.Text += BitConverter.ToString(e.Value.ToMidiData()).Replace('-', ' ') +
				" (" + data.GetType().Name + ")" + "\r\n";
			}));
		}
	}
}