“播放”声音变为.wav

时间:2013-06-14 23:48:30

标签: actionscript-3 audio wav midi

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

但是如果你想在AS3中这样做,这是一个通用的方法。我没有测试任何一个,这是纯粹的理论。

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

我不知道midi的格式是深入的,但我知道最小值是一个tick,而tick的长度取决于BPM。这是计算midi tick的公式:Midi Ticks to Actual PlayBack Seconds !!! ( Midi Music)

假设您的刻度线长度为2毫秒。所以现在你有一个基础值。你可以填写Vector(比如Array但更快),每次打勾时会发生什么。如果在特定刻度处没有任何反应,则插入空值。

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

问题在于,如果循环持续时间超过15秒(我不确定该值)Flash会认为程序没有响应并将其终止。所以你必须要照顾好这一点,在Flash杀死你的程序之前结束循环并打开一个新的循环。

好的,现在你有声音在播放。您可以使用名为Standing Wave 3的库录制闪光灯发出的声音(wavs,mp3,mic)。

https://github.com/maxl0rd/standingwave3

这是理论上的......我非常肯定,根据您想要播放的声音数量,您可以冻结您的节目......但我希望它能帮助您前进。