2010-06-21 33 views
3

我讀了this後,它解釋瞭如何播放MIDI。 我需要製作一個網絡應用程序,根據用戶需求播放MIDI片段。 如何做到這一點?我應該簡單地製作一個播放MIDI文件的Silverlight播放器嗎?那麼如何將文件傳輸到播放器?否則,也許有一種方法可以與客戶端的MIDI系統進行交互。在客戶端通過網絡播放MIDI?

注:我需要創建MIDI序列,它沒有從我的服務器準備好文件(或者應該先創建它們)。

任何方法將welcommed。

回答

2

首先,應該清楚地知道,MIDI文件本身並不像MP3那樣「播放」。 MIDI文件中沒有實際的音樂;相反,它們只包含應由合成樂器演奏的音符。

我不確定silverlight是否有內置的MIDI合成器(就像QuickTime一樣,如果您將MIDI文件拖放到它上面),還有一點點快速搜索seems to confirm this hypothesis

因此,如果您要對任意MIDI數據進行排序,並且無法首先將其反彈到MP3,那麼您應該在服務器端生成聲音。如果您可以訪問.NET後端服務器,則可以使用VST.NET framework創建VST主機,通過樂器發送MIDI,並將生成的音頻輸出壓縮爲MP3。如果您正在使用Java,那麼您可以使用類似的庫the jVSTwRapper

在最壞的情況下,你可以用C/C++粘貼一些東西來加載VST插件來處理你的聲音。這可以通過您使用的任何服務器技術作爲外部進程啓動。

但在所有這些方法,策略基本相同:

  1. 從用戶獲取的MIDI文件,並將其發送到服務器。
  2. 打開一個VST plugin它將處理聲音。
  3. 解析MIDI文件中的事件,通過適當的MIDI信息將浮點數據塊發送到插件。
  4. 從插件獲取輸出並將其保存到磁盤的某處。
  5. 完成所有這些工作後,取出輸出並通過LAME或其他一些編碼框架將其從原始PCM轉換爲MP3(或其他)。
  6. 將此文件發回給用戶。

請注意,第3步可能是此過程中最難的一個。網上有很多關於how to make your own VST host的指南,其中包括我寫的那篇。 ;)

+0

不要誤解我的意思,用戶不應該提交任何midi,他只會告訴(通過用戶界面)他想玩什麼,服務器的引擎應該生成midi。 換句話說,用戶甚至不應該知道它是MIDI,也不必是同步的,即用戶進行選擇然後點擊「播放」,然後我必須生成中間,錄製到mp3並上傳回到客戶端。 – Shimmy 2010-06-21 17:15:37

+0

最好的想法看起來像在服務器上生成可播放的波形(或mp3或其他)並在客戶端上播放它。通過這種方式,我還可以確保聲音始終像服務器中配置的一樣,即使用戶有蹩腳的MIDI設備。問題是:1)轉換需要多長時間? 2)我該怎麼做,你知道任何轉換工具;如下所示:數據(音符,速度等) - >服務器上的MIDI播放器 - > MIDI <>波引擎 - >在客戶端播放生成的波形文件。我想要選擇下載一箇中檔文件。 – Shimmy 2010-06-21 17:16:21

+0

我並不是說用戶直接上傳MIDI文件,據推測你的用戶界面正在記錄並從中產生MIDI事件。無論哪種方式,如果你正在進行服務器端的MIDI-> MP3轉換,你將不得不在某個時候處理MIDI文件。 ;) – 2010-06-22 11:24:13