USB接続したMIDI機器をUnityから操作する

UnitySampleProject

GitHub - hikatech/UnityUsbMidiOutSample

目的

  • USB接続したMIDI機器(Rorand V-1HD)をUnityから操作したい

環境

  • OS: Windows 10 Pro
  • Unity: 2018.1.1f1
  • MIDI機器: Roland V-1HD(映像スイッチャ)

参考にさせてもらったサイト

MIDI OutをUnityで使う

  1. MIDI機器の適切なドライバをインストールしておく(RolandのV-1HDはここからDL
  2. unity-midi-bridgeをダウンロードする
  3. MIDI機器をPCとつなぐ
  4. ダウンロードしたmidi-bridgeの中にある[midi-bridge-windows/MidiBridge.exe]を起動
  5. UnityのプロジェクトにMidiBridge.cs、MidiInput.cs、MidiOut.csをドラッグ&ドロップ
  6. MidiOut.csにSendProgramChangeを追記
public static class MidiOut
{
    // <中略>

    public static void SendProgramChange(MidiChannel channel, int controlNumber, float value)
    {
        int cn = Mathf.Clamp((int)channel, 0, 15);
        controlNumber = Mathf.Clamp(controlNumber, 0, 127);
        value = Mathf.Clamp(127.0f * value, 0.0f, 127.0f);
        MidiBridge.instance.Send(0xc0 + cn, controlNumber, (int)value);
    }
}
  1. 適当なスクリプトを新規に作成(今回はV1HDController.cs)
using UnityEngine;

public class V1HDController : MonoBehaviour {

    void Start () {
        MidiBridge.instance.Warmup();
        Debug.Log("*** input selecttion:  'A'=A-1  |  'S'=A-2***");
    }

    void Update () {
        if (Input.GetKeyDown(KeyCode.A))
        {
            // source select A-1
            MidiOut.SendControlChange(MidiChannel.Ch1, 0, 0);
            MidiOut.SendControlChange(MidiChannel.Ch1, 32, 0);
            MidiOut.SendProgramChange(MidiChannel.Ch1, 0, 0);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            // source select A-2
            MidiOut.SendControlChange(MidiChannel.Ch1, 0, 0);
            MidiOut.SendControlChange(MidiChannel.Ch1, 32, 0);
            MidiOut.SendProgramChange(MidiChannel.Ch1, 1, 0);
        }
    }
}
  1. 空のGameObjectを作成して、上記スクリプトをアタッチ
  2. 実行して、'A'キー押下でV1HDの入力A-1、'S'キー押下でV1HDの入力A-2が選択されればMIDI送信成功!(サンプルプロジェクト

任意のMIDI機器を自在にコントロールしたい

  • keijiroさんのMidiBridge.exeを起動して、MIDI機器を操作してみることで、どんなMIDIメッセージが飛んでいるかわかる(便利がすぎる)
  • それと同じメッセージをMidiOutで飛ばせばOK(なはず)
  • ↑これはV-1HDのA-1パッドを押したときのメッセージ
-----+----------+----+-----------
 I/O | Event    | Ch | Data
-----+----------+----+-----------
  IN | CC       | 01 | 0, 0
  IN | CC       | 01 | 32, 0
  IN | Program  | 01 | 0
  • これと同じメッセージが、'A'キーを押したときに生成されている

おわりに

ヒカテクにコーヒーをおごってみませんか!(投げ銭|Donation

投稿者: hikatech