首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用软件synth将MIDI文件转换为原始音频

使用软件synth将MIDI文件转换为原始音频
EN

Stack Overflow用户
提问于 2013-12-02 19:39:25
回答 2查看 2.6K关注 0票数 9

我正试图直接从我的安卓应用程序中动态生成一个小的MP4 audio+video文件。

我最初的攻击计划是:

  1. 用户输入一些基本的歌曲数据(和弦推进等),然后应用程序构建一个MIDI文件。
  2. 系统为每个和弦建立和弦图,并使用MIDI读取器生成与MIDI计时的动画帧数组。
  3. 将MIDI转换为原始PCM音频数据<--这个S.O.问题就是针对这一点的
  4. 将原始音频应用于动画帧,并将音频和视频帧编码到MP4中。
  5. 向用户提供标准的播放控件,以获得MP4视频。

该应用程序已经建立了基于用户输入的MIDI文件,包括节奏、乐器、注释等。这部分工作很容易完成,MIDI文件正在正确生成。这个MIDI从安卓的MediaPlayer上弹得很好。(第1步)

动画帧也是通过读取MIDI文件并交叉引用序列中每个和弦的静态位图来正确创建的。这些画面将成为视频..。但一开始是没有声音的。(第2步)

如您所见,Android延迟的问题对我来说并不是什么问题,因为我没有创建一个实时的合成器应用程序.我只想把MIDI转换成一些音频格式,然后可以混合到一个视频中,这个视频已经被设定为MIDI的原版。(第3步)

我遇到的问题是第三步。

我知道,我需要使用软件MIDI合成器,以获得实际的音频输出,将产生的一系列MIDI事件。然而,让它正确运作已经成为一个主要的障碍。我不关心产生的音频的精确质量,只是它与某人在使用通用设备(ala Gravis声音字体或bulit在Sovinox中的声音等)的通用MIDI样本时所期望的非常接近。

所以..。

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

我第一次尝试的是以上两个项目..。将它们混合在一起,这样就可以将MIDI文件转换为原始PCM数据缓冲区.进展得还不太好。

midi库(1)使用实时侦听器读取MIDI文件,并将事件发送给Midi驱动器(2),Midi驱动程序(2)播放由车载合成器生成的原始PCM数据。

(注意:对驱动程序做了一些调整,以便存储整个缓冲区,并且只在MIDI读取器完成后返回。这也意味着整个过程需要相当于歌曲长度的时间来转换它,因为我们正在实时地“聆听”。)

我还没有如我所希望的那样使它发挥作用。我希望保持这一点尽可能简单,如果可能的话,我更愿意使用开源项目。如果它不依赖实时侦听器就能做到这一点,那就更好了。

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

  1. 用于Android的纯数据库
  2. MidiSheetMusic应用程序(有源代码)
  3. 合成ToolKit in C++ (STK)
  4. Android音乐合成器
  5. 深红色SoftSynth

更多的竞争者(还没有做多少研究):

jFugue/timidity/audacity/fluidSynth/cSound/jMusic/JSyn/Gervill/Softonic/Caustic/LibGDX/JetPlayer/OpenSL-ES

我的问题是:

  • 我是否按照上述计划走上正确的道路?我对MIDI->PCM转换相对较新,所以我想确保我没有完全遗漏一些东西。
  • 如果不是,我应该如何将MIDI文件转换成某种音频格式,然后可以用于创建MP4 (或任何视频播放格式)?
  • 在使用Android转换MIDI 2原始音频波形这一任务中,还有其他开源项目可能会有所帮助吗?
  • 有没有这样一个任务的例子已经写在Android上使用?(即已经移植用于Android等)

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

如果需要的话,我愿意走一条艰难的道路。如有任何建议,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2015-06-08 04:46:51

我不是安卓用户,但我尝试了很多方法从MIDI生成WAV文件,我对这个任务更满意,使用FluidSynth,它似乎可以作为安卓的一个库,也是另一个StackOverflow问题的重点:使用Fluidsynth在Android上播放SoundFonts的音符

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

还要检查声音字体覆盖所有你想要播放的乐器.

票数 1
EN

Stack Overflow用户

发布于 2022-02-20 11:14:34

如果您在JS或Node环境中运行,您应该能够使用mudcube的MIDI.js (或我的ES6端口作为midicube)使用Player对象将MIDI转换为web音频输出并轻松播放。或者,如果您想保存它,可以捕获流并将其转换成任意数量的格式(可能包括mp3,但我从未尝试过)。如果时间不是转换中的本质,那么第二部分应该很容易,但是它需要MIDI的运行时间来转换。应该可以加快回放速度和样品的回放,使转换在2或4倍的速度,然后放慢文件,但我还没有尝试过。

如果您对库有较低级别的访问权限,那么@hibou57使用FluidSynth的建议是最好的。

无论哪种方式,你都需要一些声音字体。流体-GM良好的工作质量较低,但可接受的声音。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20336447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档