我在 android 上做了一些简单的应用程序,并认为是时候做一些更复杂的事情了。所以,我想我会尝试一些已经存在的东西,但是从头开始构建它。
这个想法是创建一个应用程序,允许用户通过按下显示屏上的虚拟键来弹奏钢琴。但是我不确定如何合成每个音符的声音,最好将每个音符的副本存储在文件中,或者是否有更动态的方式来动态合成音符和和弦。
我使用过 C++,所以 NDK 的东西也可以。谢谢你的帮助。
问问题
4546 次
2 回答
2
声音播放(移交缓冲区)几乎必须从 Android java api 完成
合成可以在本机或 java 中完成,无论它喜欢哪个。
短的(未压缩的)样本可以重复播放,但您可能还需要起音瞬态。也许你可以有一个起音、延音和释音,只要琴键按下就重复延音。理想情况下,每个样本应该是其基本分量的整数周期长,这样当您在起音到维持或维持到衰减之间切换时,您不会得到瞬态。
我敢肯定,您可以在某处找到 FM 或其他合成器的代码……您可能希望在将缓冲区移交给 java 代码以传递给音频 api 的本机库中实现。
可惜的是android已经有一个内部的midi合成器,但显然缺少一个动态接口,所以它只能播放midi文件。
于 2010-12-03T19:22:07.047 回答
1
到目前为止,最简单的解决方案是记录钢琴上每个音符的声音,并在按下琴键时播放。许多专业的虚拟钢琴乐器都以这种方式工作,以多种速度录制钢琴上的每个音符。显然,这可能会占用数 GB 的磁盘空间,但对于手机应用程序,您可能会在一个八度音阶中对每个音符进行一次 MP3 录音。
实际上,用算法合成钢琴的声音非常困难,直到最近,很少有人能令人信服地做到这一点(pianteq是当前最好的实现之一)。
于 2010-12-03T18:44:17.397 回答