简单的android音频音序器实现

问题描述

我想为 Android(如 FL、GarageBand 等)创建一个简单的音频音序器应用程序。但是,我一直在处理音频。特别是,我应该如何实现音频播放(即播放录制的音频),有没有可以使用的库,还是只使用认的 Java 方法更好?最近我找到了双簧管,但我不确定它是否适合这个目的。

我使用原始文件作为音频源(如钢琴音符)并使用 AudioTrack 访问它们。

解决方法

如果音频输出的 android 环境类似于 Java,那么获得准确计时的最佳方法是计算 PCM 帧数并使用它来保持所有元素对齐。我没有对 Android 做过很多事情,但我认为用于输出的类是 AudioTrack,因为它允许您流式传输 PCM。我会考虑确保您的所有声音都可以转换为 PCM 并使用该数据形式进行混音和效果处理,然后通过 AudioTrack 输出。

我没看过双簧管。也许它已经构建了所需的一切。我是老派——我最近才学会寻找图书馆而不是重新发明轮子。

这里有一个 previous question,它谈到了一些关于输出 PCM 的内容。

,

在 Android 上,对于原生音频应用,我建议使用双簧管。 打开单个输出流,然后将所有音轨混合到一个单个流中。正如另一个 Phil 建议的那样,使用帧数作为计时参考。

您可以使用 DrumThumper 应用作为起点,因为它将多个 WAV 样本混合到一个输出中。

,

您也可以看看我正在开发的这个库:https://github.com/WaveBeans/wavebeans

它允许您混合不同的样本文件,但播放部分您需要作为自定义输出自行完成。它在 Kotlin 上运行,目前不确定它是否可以与 Java 无缝协作。

代码看起来像这样(对于预定义的混合):

val silence = input { ZeroSample }
val sample1 = wav("file://sample1.wav")
val sample2 = wav("file://sample1.wav")

val track1 = sample1..silence.trim(100,MILLISECONDS)..sample1
val track2 = sample2..silence.trim(10,MILLISECONDS)..sample2..silence.trim(10,MILLISECONDS)..sample2

val mix = track1 + track2

mix.out { 
/**
 * here is the output code to perform the playback
 * follow https://wavebeans.io/docs/api/outputs/output-as-a-function.html
 */
}

// and evaluate the output as by https://wavebeans.io/docs/exe/