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

时间:2013-12-02 19:39:26

标签: android converter midi pcm synthesizer

我正在尝试直接从我的Android应用动态生成小型MP4音频+视频文件。

我最初的攻击计划:

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

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

  3. 将MIDI转换为原始PCM音频数据< - 此S.O.问题具体到这一点

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

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

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

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

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


    我遇到的问题是第3步。

    据我所知,我需要使用软件MIDI合成器来获取将从一系列MIDI事件中产生的实际音频输出。然而,让它正常工作已成为一个主要障碍。我不关心所产生音频的精确质量,只是它与人们在使用通用设备的通用MIDI样本(ala Gravis soundfonts或bulit-in Sovinox声音等)时的预期非常匹配。 p>

    因此...

    1. Android MIDI Lib

    2. Android Midi Driver using Sonivox EAS Library

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

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

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

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


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

      1. Pure Data Library for Android

      2. MidiSheetMusic App (with source)

      3. Synthesis ToolKit in C++ (STK)

      4. Music Synth for Android

      5. Crimson SoftSynth

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

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


        我的问题是:

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

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

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

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

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

        如果需要的话,我愿意走硬路。任何和所有的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不是Android用户,但我尝试了很多方法来从MIDI生成WAV文件,而且我对使用FluidSynth这个任务感到更高兴,因为FluidSynth似乎可以作为库使用Android,这是其他StackOverflow问题的重点:Using Fluidsynth to play notes from SoundFonts on Android

你只需要知道声音字体(搜索网络很容易告诉你)并选择一个不太大的好字体(否则,你可能没有内存问题)。

同时检查声音字体是否涵盖了您想要播放的所有乐器。