2

Unity3D Standard Edition で作業しています。ご存じない方のために説明すると、これは C#/.NET スクリプトをサポートする 3D ゲーム エンジンです (したがって、.NET 2.0 API にアクセスできます)。

独自のシンセサイザーを作成しました。(現在、MIDI ファイルをむさぼり食う MIDI シーケンサーによって生成されるノートオン イベントに応答しています。)

ここで、MIDI キーボードからノートオン イベントをキャッチしたいと考えています。

私は自分のアプリを少なくとも iOS に展開するつもりです。他のオペレーティング システムが従うことを願っています。したがって、ターゲット シナリオは次のとおりです。

  • iPhone で私のアプリを実行している誰かが、MIDI キーボードを Windows マシンに接続しています。
  • Android タブレットで私のアプリを実行している誰かが、Linux マシンに MIDI キーボードを接続しています。
  • OS X で私のアプリを実行している誰かが、OS X に接続する MIDI キーボードを持っている

最後の 1 つは私が置かれている状況です。拡張されない解決策を誰かが持っている場合、私はまだそれに非常に興味があります。少なくとも機能するプロトタイプをまとめることはできます。

MIDI デバイスに接続するMIDI Unifiedという 1 つのアセットが存在します。ただし、PRO版が必要です。これは、PRO バージョンがネイティブ プラグインを許可するためです。

ネイティブ プラグインを使用せずに、代わりにネットワーク接続を介して MIDI を Unity に取り込むことができるはずです。

(インターネット接続、イーサネット接続、TCP/IP、UDP、HTTP などと言っているわけではないことに注意してください。どの用語を使用するのが適切か完全にはわかりません。)

ネットワーク経由で MIDI 信号を送信するためのユーティリティがあるようです。ipMIDIは、Windows と OS X でこれを行います。おそらく、Linux で行うための何かがあります。

OSX には " Audio MIDI setup " ユーティリティがあり、デバイスから localhost に MIDI 信号を送信できるようになっています。(これが、OS X 用の ipMIDI が無料である理由でしょうか?)

編集: Audio MIDI セットアップがRTP MIDIを実装していることを発見しました。これは、ネットワーク経由で MIDI を送信するための最良の標準であると思われます (損失の多いネットワークに対処します)。

C#/.NET で RTP MIDI を実装する方法は?

しかし、より簡単な (ただし強力ではない) ソリューションがあるかもしれません。たとえば、OSX 上の localhost からの Note-ON MIDI メッセージに対してのみ機能し、受信するソリューションなどです。

私のアプリの第 1 世代の基本的なソリューションを入手し、その後、手段があれば、これを堅牢なコンポーネントに置き換えることができれば、非常に嬉しく思います。

それは私が得た限りですが、誰かがこれを片付けてすべてを前進させることができますか?

π

編集: http://u3d.as/content/sta-blockhead/websocket-sharp-for-unity/4X4これは役に立ちますか?

4

2 に答える 2

0

Pythonは本当に素晴らしいです!

このスクリプトは、MIDI ノートのオン/オフが発生するたびに UDP パケットを送信します。Unity3D で UDP パケットをキャッチできます。

#!/usr/bin/python

# https://github.com/superquadratic/rtmidi-python/
import rtmidi_python as rtmidi

import time

import socket

def callback( data, time_stamp ):
    event, note, vel = data

    if event == 144: # note on/off
        endpoint = ( "127.0.0.1", 6500 )

        MESSAGE = "%d, %f" % ( note, float(vel) / 127.0 )

        print MESSAGE

        udp_socket = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )

        udp_socket.sendto( 
            MESSAGE, 
            endpoint
            )

def main( ):
    midi_in = rtmidi.MidiIn( )

    midi_in.callback = callback

    midi_in.open_port( 0 )

    # do something else here (but don't quit)
    while True: 
        time.sleep( 0.001 )

if __name__ == '__main__': 
    main()
于 2014-02-21T11:45:57.007 に答える