“播放”声音变成 .wav

Posted

技术标签:

【中文标题】“播放”声音变成 .wav【英文标题】:"Play" sounds into a .wav 【发布时间】:2013-06-14 23:48:29 【问题描述】:

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

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

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

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

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

【问题讨论】:

那么,你要做的本质上是一个采样器并将输出转换为一个 wav 文件,对吧? 【参考方案1】:

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

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

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

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

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

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

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

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

https://github.com/maxl0rd/standingwave3

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

【讨论】:

感谢您的帖子。问题是,我实际上只想直接写入 WAV。我确实知道播放和录音可以解决问题,但我宁愿不必播放整首歌曲。已经有一个可以播放 ORG 的程序,我可以用 Audacity 录制歌曲,但直接转换为 WAV 会“更纯”,而且可能更快。还是一样,谢谢你的建议。

以上是关于“播放”声音变成 .wav的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 应用中播放多种声音(mp3、wav 等)

使用 javascript 播放以 base64 编码的 .wav 声音文件

如何从内存中播放 Wav 声音样本

无法在事件中播放声音 (wav)

Android SoundPool 不播放 wav 格式的声音

QT 简单应用之播放WAV声音