使用软件合成器将MIDI文件转换为原始音频

RjK*_*RjK 9 midi android synthesizer converter pcm

我正试图直接从我的Android应用程序动态生成一个小的MP4音频+视频文件.

我最初的攻击计划:

  1. 用户输入一些基本的歌曲数据(和弦进行等),并且应用程序构建MIDI文件.

  2. 系统为每个和弦构建和弦图,并使用MIDI阅读器生成动画帧数组,该数组定时到MIDI

  3. 将MIDI转换为原始PCM音频数据< - 此问题特定于此点

  4. 将原始音频应用于动画帧 - 并将音频和视频帧编码为MP4

  5. 使用标准播放控件向用户提供生成的MP4视频.

该应用程序已根据用户输入(包括速度,乐器,音符等)构建MIDI文件.此部分很容易完成,MIDI文件正在生成.这款MIDI可以在Android的MediaPlayer中播放.(步骤1)

通过回读MIDI文件并交叉引用序列中每个和弦的静态位图列表,也可以正确创建动画帧.这些帧将成为视频......但最初将没有音频.(第2步)

正如你所看到的,Android MIDI延迟的问题对我来说并不是一个问题,因为我没有创建一个实时合成器应用程序...我只是想将MIDI转换为某种音频格式然后可以混合进入已定时原创MIDI的视频.(第3步)


我遇到的问题是第3步.

我知道我需要使用软件MIDI合成器来获得将从一系列MIDI事件产生的实际音频输出.然而,让它正常工作已成为一个主要障碍.我并不关心所产生音频的精确质量,只是它与人们所期望的相匹配,如果他们使用来自通用设备的通用MIDI样本(ala Gravis soundfonts或bulit-in Sovinox声音等).

所以...

  1. Android MIDI Lib

  2. 使用Sonivox EAS库的Android Midi驱动程序

我的第一次尝试是上述两个项目......将它们混合起来,以便将MIDI文件转换为原始PCM数据缓冲区....它还没有那么好.

midi库(1)使用实时监听器读取MIDI文件,并将事件发送到Midi Driver(2),Midi Driver(2)播放由板载合成器生成的原始PCM数据.

(注意:对驱动程序进行了一些调整,以便存储整个缓冲区,并且只有在MIDI读取器完成后才返回.这也意味着整个过程花费的时间等于歌曲的长度只是为了转换它因为我们实时"倾听".)

我还没有像我希望的那样开始工作.我希望保持尽可能简单,并且尽可能使用开源项目.如果它能够在不依赖于实时监听器的情况下做到这一点会更好.


我一直在考虑的其他一些库和工具(但可能有点过分):

  1. 适用于Android的纯数据库

  2. MidiSheetMusic应用程序(带源代码)

  3. C++中的综合工具包(STK)

  4. 适用于Android的Music Synth

  5. Crimson SoftSynth

更多的人(还没有做太多的研究):

jFugue /胆怯/大胆/ fluidSynth/CSound的/ jMusic/JSyn/Gervill/SOFTONIC /碱/ LibGDX/JetPlayer/OpenSL-ES


我的问题是:

  • 我是否按照上述项目开辟了正确的道路?我对MIDI-> PCM转换比较陌生,所以我想确保我没有完全错过任何东西.

  • 如果没有,我应该如何将MIDI文件转换为某种音频格式,然后可以用于创建MP4(或任何视频播放格式)?

  • 是否有其他开源项目可能有助于使用Android转换MIDI 2原始音频波形的任务?

  • 是否有任何已经编写过的用于Android的任务示例?(即已经移植用于Android JNI等)

我的希望是,我完全错过了一些会使这项工作变得微不足道的事情......我的假设是,这将需要一些严重的黑客攻击和JNI功夫.

如果这是必要的话,我愿意走艰难的道路.任何和所有的建议将不胜感激.

Hib*_*u57 1

我不是 Android 用户,但我尝试了很多方法从 MIDI 生成 WAV 文件,而且我对这个任务更满意,使用 FluidSynth,它似​​乎可以作为 Android 的库使用,并且是其他 StackOverflow 问题的要点:Using Fluidsynth to play Notes from SoundFonts on Android

\n\n

你只需要了解sound\xe2\x80\x91fonts(网上搜索一下就可以很容易地告诉你)并选择一个不太大的好字体(否则,你可能会出现内存不足的问题)。

\n\n

另请检查 sound\xe2\x80\x91font 是否涵盖您想要播放的所有乐器。

\n