2013-10-24 58 views
2

我正在Unity3D標準版中工作。對於那些不知道的,它是一個支持C#/ .NET腳本的3D遊戲引擎(因此它可以訪問.NET 2.0 API)。使用C#/ .NET在Unity3D中接收的TCP/IP/UDP上的MIDI

我已經創建了我自己的合成器。 (目前它響應MIDI音序器咀嚼MIDI文件時產生的音符開啓事件。)

現在我希望從MIDI鍵盤捕捉音符開啓事件。

我打算至少將我的應用部署到iOS,希望其他操作系統可以遵循。因此,目標場景是:

  • 有人跑我的應用程序在iPhone上,他們有一個MIDI鍵盤連接到他們的Windows機器
  • 有人在Android平板電腦上運行我的應用程序,他們有一個MIDI鍵盤連接到他們的Linux機
  • 有人跑我的OS X應用程序,他們有一個MIDI鍵盤連接到OS X

最後一個是我的,所以如果任何人有一個那並不是一個解決方案的情況不過,我仍然對它很感興趣 - 至少可以說所有這些都是讓我一起得到一個功能原型。

存在一個資產,MIDI Unified,它將連接一個MIDI設備。但是,它需要PRO版本。這是因爲PRO版本允許本機插件。

我相信應該可以在不使用本機插件的情況下將MIDI導入到Unity中,而是通過網絡連接。

(請注意,我不是說互聯網連接,以太網連接,TCP/IP,UDP,HTTP,因爲我完全不知道什麼是正確的長期使用會。)

這似乎在說明是通過網絡發送MIDI信號的實用程序:ipMIDI將爲Windows和OS X執行此操作。在Linux中可能需要執行此操作。

OSX有一個「Audio MIDI setup」實用程序,我被告知允許將MIDI信號從設備傳送到本地主機。 (也許這就是爲什麼IPMIDI的OS X是免費的?)

編輯:我剛剛發現,音頻MIDI設置實現RTP MIDI,這似乎是在網絡上傳送MIDI的最佳標準(它對付有損網絡)。

所以我很確定這個任務變成了:如何在C#/ .NET中實現RTP MIDI?

但也許有一些更容易(但功能更弱)的解決方案,例如,某些解決方案只適用於OSX上的本地主機,並接收來自本地主機的音符開MIDI消息。

如果我可以爲我的第一代應用程序獲得一個基本的解決方案,並且隨後在我有辦法時用一個強大的組件替換它,我將非常高興。

所以,就我所知,任何人都可以整理這一切,推動它前進?

π

編輯:http://u3d.as/content/sta-blockhead/websocket-sharp-for-unity/4X4莫非這幫助?

+0

我的第一個問題是 - 爲什麼不能使用Pro版本的Unity3D?您現在可以每月以75美元的價格購買Unity3D,而不必花費您以前必須支付的大筆資金。我認爲這是值得的,基於你想要做的事情。 –

回答

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() 
0

我在過去做過類似的事情。你可以做的是:

在你的計算機上安裝Midi環回設備(驅動程序)。例如:http://www.tobias-erichsen.de/software/loopmidi.html

然後設計一個簡單的應用程序,它可以從Loopback設備監聽Virtual midi端口,並將從虛擬MIDI端口接收的任何內容轉換爲通過TCP/IP連接發送的數據包。 TCP/IP連接將終止在您的Unity Script或其他支持TCP/IP並能夠播放MIDI的其他設備上。協議非常簡單3個字節 - 注意,註釋編號,音量。 (通常音量0意味着音符關閉)。這是關於如何實現這一點。

希望這會有所幫助...