在Android/Java中如何合成钢琴声音

6

我已经在安卓上制作了几个简单的应用程序,觉得是时候尝试一些更复杂的东西了。所以,我想尝试一些已经存在的东西,但从头开始构建。

这个想法是创建一个应用程序,允许用户通过在显示屏上按虚拟键来弹奏钢琴。但我不确定如何合成每个音符的声音,是最好将每个音符的副本存储在文件中,还是有一种更动态的方法来即时合成音符和和弦。

我已经使用过C ++,所以NDK的内容也可以。 感谢任何帮助。


问题标题与问题实际上没有太大关系。你真正想问的是如何在Java中合成声音。此外,你几乎肯定不想使用ndk来完成这个任务。 - Falmarri
我正在查看https://ccrma.stanford.edu/software/stk/。我想把我需要的部分放入NDK中,然后从那里开始。或者类似的东西。 - Abid Ullah
2个回答

2

声音播放(缓冲区处理)基本上必须使用Android Java API来完成。

合成可以在本地或Java中完成,取决于首选项。

短(未压缩的)样本可以重复播放,但您可能还需要攻击瞬态。也许您可以有一个攻击、一个维持和释放,只要按键按下,就会重复维持。理想情况下,每个样本应该是其基本成分长度的整数倍,这样当您在攻击到维持或维持到衰减之间切换时,就不会出现瞬态。

我相信你可以在某个地方找到FM或其他合成器的代码...这可能是你希望在本地库中实现的,该库将缓冲区移交给Java代码以传递给音频API。

很遗憾的是,Android已经拥有内部MIDI合成器,但显然缺乏动态接口,因此它只能播放MIDI文件。


我也沿着同样的思路考虑过(初始声音,持续,淡出),但我认为尝试在代码中实现它可能比仅仅记录所有音符更有趣。谢谢信息。 - Abid Ullah

1

到目前为止,最简单的解决方案是在按下键时记录钢琴每个音符的声音并进行回放。许多专业的虚拟钢琴乐器都是这样工作的,记录了钢琴上每个音符以多种速度演奏的声音。显然,这可能需要大量的磁盘空间,但对于手机应用程序来说,你可以只使用每个八度音阶的一个MP3录音。

实际上,通过算法合成钢琴的声音非常困难,直到最近,很少有人能够令人信服地做到(pianoteq 是目前最好的实现之一)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接