チュートリアル:MIDIを使用して環境を制御する

MIDI (Musical Instrument Digital Interface) は、デジタルツールと電子機器(仮想および物理)が相互に通信するためのプロトコル(電気コネクタとデジタルインターフェース)です。MIDIは通常、音楽シーケンサーとして使用されます。元々、このフォーマットは楽器同士が通信する方法として80年代に作られましたが、この30年の間に高度に組織化された仕様に進化し、多くの目的でテストされ採用されています。

私たちは、Vircadiaで環境を制御するために使用できるMIDIクラスを(コミュニティメンバーの一人であるBrainstormerの助けを借りて)作りました。例えば、音楽番組のドメイン内の照明を制御するためにMIDIを使いました。

Note

現在、MIDIクラスはWindowsでのみサポートされています。

MIDIクラスの基本

私たちのMIDIクラスは、Microsoft Windowsに固有のデータ型であるDWORD(ダブルワード)をメッセージとして渡すことによって機能します。これは符号なし32ビットのデータ単位であり、0 から``4,294,967,295`` の範囲の整数値を含めることができます。

レバーを動かしたり、ノブを回したり、キーを押したり離したり、パッドを押し下げたりするたびに、実行するチャンネル、ノート、ベロシティ、ステータス/コマンドを示すMIDIメッセージが作成されます。

このメッセージの各バイトは、異なるタイプの値を示しています。

00000000

0vvvvvvv

0nnnnnnn

1sss

cccc

どこ:

  • v=速度

  • n=メモ

  • s=ステータス

  • c=チャネル

上位ビットの数字(最初の数字)は、コマンド(1)かデータ(0)かを示します。残りの数値は、タイプの値を決定します。つまり、ベロシティとノートは128の一意の値(1 + 2 + 4 + 8 + 16 + 32 + 64)を表し、ステータスは8つの一意の値を表し、チャネルは16の値を表すことができます。

サポートされているさまざまなステータスタイプは次のとおりです。

状態

タイプ

08

書き留める

09

注意

10

ポリフォニックキープレッシャー

11

コントロールの変更

12

プログラムの変更

13

チャネルプレッシャー

14

ピッチベンド

15

システムメッセージ

コントローラデバイスを接続する

Vircadiaで環境を制御するために使用する実際のコントローラーデバイスを接続するか、他の仮想デバイスとの接続を補助する仮想のものを作成することができます。

Ableton Liveとインターフェイスを接続する

Ableton Live <https://help.ableton.com/hc/en-us/articles/209774225-Using-virtual-MIDI-buses> _をVircadiaのインターフェイスクライアントに直接接続するには、次の仮想ツールをお勧めします。

  • loopMIDI <https://www.tobias-erichsen.de/software/loopmidi.html> _:loopMIDI より、HiFiとの間で情報を送受信するための仮想入力/出力ポートが作成されます

  • VMP <http://vmpk.sourceforge.net> _:これを使用して、コントローラーがない場合に、押されているキーや操作されているスライダー/ノブをシミュレートできます。

iPadまたはiPhoneをインターフェースに接続する

iPadまたはiPhoneを、ボタン、ノブ、およびスライダーを備えたタッチスクリーンコントローラーとして使用できます。これらの手順を読む前に、 MIDIデバイスの構成 および 例:MIDIを使用してキューブの色を変更する のセクションをお読みください。

  • おすすめのアプリ`touchosc<https://hexler.net/software/touchosc>`_をダウンロードしてください。

  • Windowsブリッジをダウンロードします。

  • 設定メニューで、USBまたはローカルWIFIネットワークを介してセットアップします。

  • 着信メッセージをログに記録するように`onEventReceived`を設定すると、カスタム関数の呼び出しに使用できる情報を送信するノブを確認できます。

  • 加速度センサーのような面白い部品もあるので、それも使ってみてください!

MIDIデバイスを構成する

MIDIコントローラーデバイスをセットアップしたら、設定を行う必要があります。

  1. スクリプトで実行できる一般的に推奨されるMIDI構成関数は次のとおりです。これを使用すると、現在接続されているMIDIデバイスのリストを表示できます。

    // Some helpful constants
    const INPUT = false;
    const OUTPUT = true;
    const ENABLE = true;
    const DISABLE = false;
    function midiConfig(){
        Midi.thruModeEnable(DISABLE );
        Midi.broadcastEnable(DISABLE );
        Midi.typeNoteOffEnable(ENABLE );
        Midi.typeNoteOnEnable(ENABLE );
        Midi.typePolyKeyPressureEnable(DISABLE);
        Midi.typeControlChangeEnable(ENABLE);
        Midi.typeProgramChangeEnable(ENABLE);
        Midi.typeChanPressureEnable(DISABLE);
        Midi.typePitchBendEnable(ENABLE );
        Midi.typeSystemMessageEnable(DISABLE);
    
        // get a list of the available  in and  out device IDs
        midiInDeviceList = Midi.listDevices(INPUT);
        midiOutDeviceList = Midi.listDevices(OUTPUT);
        print(JSON.stringify(midiInDeviceList));
        print(JSON.stringify(midiOutDeviceList));
    
  2. 設定関数を実行した後、midiMessages に接続します。

    Midi.midiMessage.connect(onEventReceived);
    // Your message handler will look like the following:
    /// @param {int} device: device number
    /// @param {int} channel: channel number
    /// @param {int} type: 0x8 is noteoff, 0x9 is noteon (if velocity=0, noteoff), etc
    /// @param {int} note: MIDI note number
    /// @param {int} velocity: note velocity (0 means noteoff)
    
    function onEventReceived(eventData){
        // functions you run in response to different MIDI events
    }
    

例:MIDIを使用して立方体の色を変更する

MIDIを使用して、Vircadiaの立方体エンティティの色を変更してみましょう。

  1. この方法を使用して、0 ら``127`` までのMIDI範囲を、線形補間を使用して必要な他の出力範囲に設定します。

    function lerp(InputLow, InputHigh, OutputLow, OutputHigh, Input) {
        return ((Input - InputLow) / (InputHigh - InputLow)) * (OutputHigh - OutputLow) + OutputLow;
    }
    lerp (0,127,0,360,eventData.velocity); // the 0 would be 0, and the 127 would be 360.
    
  2. 色は``0``から``255``になるので、次のことができます。

    var red = 0;
    function  changeCubeColor(redValue){
        var entityColorProps = Entities.getEntityProps(cubeID, ["color"]).color;
        entityColorProps.red = redValue;
        Entities.editEntity(cubeID, entityColorProps);
    }
    
  3. 次に、onEventReceived を使用して、立方体の色を変更します。

    // eventData.device, eventData.channel, eventData.type, eventData.note, eventData.velocity
    
    function onEventReceived(eventData){
        changeCubeColor( lerp(0,127,0,255,eventData.velocity) );
    }
    

各コントローラとその出力を見るために、 onEventReceived 関数で eventData を出力してください。これにより、正しいキー、スライダー、ノブ、ボタンを目的のJavaScript関数にルーティングするための必要な情報を得ることができます。

Vircadiaの外部で何かを制御するために使用する場合、またはVircadiaで何かを制御するためにMIDIイベントを直接呼び出すために使用する場合は、次の関数を使用できます。

// event similar to the above
Midi.playNote(Status, Note, Velocity);

VircadiaでMIDIを使用する他の方法

  • Abletonを使用して、ドメインのアニメーション全体をシーケンス処理します。

  • Vircadiaでの動きで現実世界の機器を制御し、逆にVircadiaでの動きで現実世界の機器を制御します(更新ループを考えてください)

  • iPadをボタン群として設定し、いつでも押せるようにすることで、ドメイン内のイベントを自在に発火させることができます。

関連項目