2

我正在尝试制作一个可以直接将 ORG 文件转换为 WAV 文件的程序。ORG 格式类似于 MIDI,从某种意义上说,它是关于何时以及如何演奏特定乐器的“指令”列表,并且程序会播放这些乐器以创建歌曲。

但是,正如我所说,我想直接生成 WAV,而不仅仅是播放 ORG。所以,从某种意义上说,我想将声音“播放”成 WAV。我确实知道 WAV 格式,并从原始 PCM 样本创建了一些文件,但这并不那么简单。

ORG 生成的声音来自我拥有的一堆包含 WAV 样本的文件。它们是单声道的,应以 22050Hz 播放 8 位样本。它们都不到一秒长,最大的不超过 11KB。我会假设要一个接一个地播放它们,我只需将样本一个接一个地放入 WAV 中。但这并不是那么简单,因为 ORG 最多可以同时演奏 16 种不同的乐器,并且每种乐器的每个音符也有一个声像(即平衡,允许立体声)。更重要的是,每个ORG都有自己的节奏(即每个点之间可以播放一个声音的毫秒数),有些声音可能会比这个节奏长,这意味着同一乐器上的两个声音可以重叠。例如,一个音符在乐器上演奏,

我只是想解释所有这些以确保情况清楚。无论如何,我基本上想知道我将如何将 ORG(或者如果你喜欢,一个 MIDI(因为它们本质上是相同的))转换或“播放”为 WAV。正如我提到的,每个音符都有声相/平衡,所以 WAV 也需要是立体声的。

如果这很重要,我将在 FlashDevelop 的 ActionScript 3.0 中执行此操作。我不需要任何代码(因为那会要求有人为我做这项工作),但我只想知道我将如何正确地做到这一点。一两个算法也可能很方便。

4

1 回答 1

0

首先让我说 AS3 不是做这类事情的最佳语言。超级对撞机将是一个更好、更容易的选择。

但是,如果您想在 AS3 中执行此操作,这是一种通用方法。我没有测试过,这是纯理论。

首先,将所有声音放入一个数组中,然后找到一种方法将您的 midi 文件中的音符与数组中的某个位置相匹配。

我不深入了解midi的格式,但我知道最小值是一个tick,一个tick的长度取决于BPM。这是计算 midi 滴答声的公式:Midi 滴答声到实际播放秒数!!!(迷笛音乐)

假设您的滴答声长度为 2 毫秒。所以现在你有了一个基础值。您可以用每次滴答时发生的事情填写Vector(类似但更快)。Array如果在特定滴答处没有发生任何事情,则插入一个空值。

现在最大的问题是阅读Vector。这是一个问题,因为Timer该类不能在像 2ms 这样的小值下工作。但是您可以做的是检查自应用程序开始使用以来经过的时间(以毫秒为单位)getTimer()。你可以有一些循环来检查经过的时间,只要你有 2ms 以上的时间,你就可以读取Vector. 如果该索引上有音符,则播放声音。如果没有,你等待下一个滴答声。

这样做的问题是,如果循环持续超过 15 秒(我不确定该值),Flash 会认为程序没有响应并将杀死它。所以你也必须注意这一点,在 Flash 杀死你的程序之前结束循环并打开一个新循环。

好的,现在您可以播放声音了。您可以使用名为 Standing Wave 3 的库来录制 flash 发出的声音(wavs、mp3、mic)。

https://github.com/maxl0rd/standingwave3

这是非常理论上的......我很确定根据你想要播放的声音数量,你可以冻结你的程序......但我希望它会帮助你继续前进。

于 2013-06-27T04:23:57.163 回答