2010-06-21 46 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