我正试图直接从我的Android应用程序动态生成一个小的MP4音频+视频文件.
我最初的攻击计划:
用户输入一些基本的歌曲数据(和弦进行等),并且应用程序构建MIDI文件.
系统为每个和弦构建和弦图,并使用MIDI阅读器生成动画帧数组,该数组定时到MIDI
将MIDI转换为原始PCM音频数据< - 此问题特定于此点
将原始音频应用于动画帧 - 并将音频和视频帧编码为MP4
使用标准播放控件向用户提供生成的MP4视频.
该应用程序已根据用户输入(包括速度,乐器,音符等)构建MIDI文件.此部分很容易完成,MIDI文件正在生成.这款MIDI可以在Android的MediaPlayer中播放.(步骤1)
通过回读MIDI文件并交叉引用序列中每个和弦的静态位图列表,也可以正确创建动画帧.这些帧将成为视频......但最初将没有音频.(第2步)
正如你所看到的,Android MIDI延迟的问题对我来说并不是一个问题,因为我没有创建一个实时合成器应用程序...我只是想将MIDI转换为某种音频格式然后可以混合进入已定时原创MIDI的视频.(第3步)
我遇到的问题是第3步.
我知道我需要使用软件MIDI合成器来获得将从一系列MIDI事件产生的实际音频输出.然而,让它正常工作已成为一个主要障碍.我并不关心所产生音频的精确质量,只是它与人们所期望的相匹配,如果他们使用来自通用设备的通用MIDI样本(ala Gravis soundfonts或bulit-in Sovinox声音等).
所以...
我的第一次尝试是上述两个项目......将它们混合起来,以便将MIDI文件转换为原始PCM数据缓冲区....它还没有那么好.
midi库(1)使用实时监听器读取MIDI文件,并将事件发送到Midi Driver(2),Midi Driver(2)播放由板载合成器生成的原始PCM数据.
(注意:对驱动程序进行了一些调整,以便存储整个缓冲区,并且只有在MIDI读取器完成后才返回.这也意味着整个过程花费的时间等于歌曲的长度只是为了转换它因为我们实时"倾听".)
我还没有像我希望的那样开始工作.我希望保持尽可能简单,并且尽可能使用开源项目.如果它能够在不依赖于实时监听器的情况下做到这一点会更好.
我一直在考虑的其他一些库和工具(但可能有点过分):
更多的人(还没有做太多的研究):
jFugue /胆怯/大胆/ fluidSynth/CSound的/ jMusic/JSyn/Gervill/SOFTONIC /碱/ LibGDX/JetPlayer/OpenSL-ES
我的问题是:
我是否按照上述项目开辟了正确的道路?我对MIDI-> PCM转换比较陌生,所以我想确保我没有完全错过任何东西.
如果没有,我应该如何将MIDI文件转换为某种音频格式,然后可以用于创建MP4(或任何视频播放格式)?
是否有其他开源项目可能有助于使用Android转换MIDI 2原始音频波形的任务?
是否有任何已经编写过的用于Android的任务示例?(即已经移植用于Android JNI等)
我的希望是,我完全错过了一些会使这项工作变得微不足道的事情......我的假设是,这将需要一些严重的黑客攻击和JNI功夫.
如果这是必要的话,我愿意走艰难的道路.任何和所有的建议将不胜感激.
我在网上搜索过但没有发现任何有趣的东西.也许我做错了什么.
我正在寻找用C,C++甚至Objective-C编写的声音合成API,它可以合成不同类型的波,效果是可选的.
我无法导入fluidynth.[也许有更好的模块?]
我正在尝试从python或pygame合成midi.我可以从pygame发送midi事件.我正在使用mingus,似乎pyfluidsynth会很好/最简单.
我认为这意味着安装了pyfluidsynth,但是没有单独的fluidlyth.我不知道它是否需要'fluidynth'安装程序才能工作?
test.py:
import fluidsynth
print ":("
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import fluidsynth
File "C:\Users\jake\AppData\Roaming\Python\Python27\site-packages\fluidsynth.py", line 34, in <module>
raise ImportError, "Couldn't find the FluidSynth library."
ImportError: Couldn't find the FluidSynth library.
Run Code Online (Sandbox Code Playgroud)
使用:python 2.7-win32
我有一个Midi文件,我已经使用以下代码在Android中使用MediaPlayer播放了该Midi文件:
val mMediaPlayer = MediaPlayer.create(context, R.raw.test_ring_1)
mMediaPlayer?.start()
Run Code Online (Sandbox Code Playgroud)
它默认使用一种乐器(如钢琴)来演奏,现在我想添加soundfont(sf2 / sf3)文件来使用不同的乐器和混响效果来演奏Midi音符。
请指导达到预期结果的方法。
我正在研究用Java编写音频同步器,并且想知道是否有人有任何建议或良好的资源来编写这样的程序.我正在寻找有关生成原始声波的信息,如何将它们输出为可用的形式(在扬声器上播放),以及关于该主题的一般理论.多谢你们.
我喜欢用我的电脑制作音乐,尤其喜欢使用合成器.网上有很多合成器插件,非常棒.我已经下载了VST(虚拟演播室技术)SDK,这是我知道使用的大多数插件的平台.
我想知道你是否可以在.Net框架上使用SDK来编写插件; 我能找到的唯一文档和教程是针对C++的,我不是那么信任C++.我可以学习使用C++,我在一周内自学C#,但使用未知语言并学习其他新概念似乎不是一个好的组合.
任何人都可以给我指出如何开始的正确方向,即使可以使用.Net编程吗?
问候查尔
我想是相当奇怪的问题,但让我们把它放在正确的背景下.我不是在寻找模拟整个吉他声音范围或者编写我自己的合成器,而是要模拟整个吉他(请在此处查看此类问题的答案).如果可能的话,我"只是"想要一个幻灯片选择声音的想法,而不会刺激音乐家.如果声音类型不清楚请看这里:
http://youtu.be/y4_wjNRLe4M?t=1m39s http://youtu.be/VdrFTyUCGYs?t=2m57s
我想给用户一种感觉,即如果滑动杆向右移动,产生的滑动声音的长度与滑动条的相对运动成比例.相反,如果用户向左移动滑动条,则将使用相同的概念播放向下滑动的声音.
以供参考.我正在使用Cocos2D 2.0和iOS 5.1.
我在Cocos2d Cookbook的第6章"修改音频属性" (这里是第4章到第6章的演示示例中的免费应用程序的链接)之后找到了与我的效果类似的东西,其中作者修改了单声道合成器音调根据用户在屏幕上的手指位置改变音高和增益(参见此视频,了解我在谈论的例子中仍然不清楚).
//Play our sound with custom pitch and gain
CDSoundSource *sound = [[sae soundSourceForFile:@"synth_tone_mono.caf"] retain];
[sound play];
sound.looping = YES;
[notes setObject:sound forKey:key];
sound.pitch = point.x/240.0f;
sound.gain = point.y/320.0f;
Run Code Online (Sandbox Code Playgroud)
这不是最好的解决方案,而是一个不错的近似值.任何人都可以提出更好的建议吗?
编辑:我正在努力通过记录向上滑动和向下滑动声音等于最大长度来近似这个.然后一旦移动滑动拾取条就开始声音并且一旦移动完成就停止声音(在Cocos2d中,这将对应于触摸开始并且触摸结束于将代表滑动选择的特定精灵).然后滑动镐将在原始位置恢复,以避免必须处理滑动从不同位置开始的情况.当然是一个近似值,我会使用它,因为它在开发时间和计算性能方面都很便宜(我猜任何模拟声音的东西在计算上都会更"昂贵").我打开这个问题,看看是否有人提出了更好的想法或解决方案(库仍然很好,因为我仍在考虑完全模拟幻灯片拾音的可能性).
我正在使用 Gervill 的软件合成器加载 SF2 音库,并从 Midi 键盘播放音乐,我想知道是否可以通过 ASIO 播放输出,可能是通过JAsioHost。我一直在尝试查看 Gervill 源代码以查找原始音频数据何时实际传递给音频驱动程序,但我似乎无法找到它,即使那样,我也不确定这是否是正确的做法。
我使用的链是使用 SF2loader 将声音字体加载到默认合成器中,然后我使用通道 noteOn 方法播放音符。
我还是初学者,所以对我来说这将是一个非常先进的项目,但我想现在开始并把它作为持续的事情(我不打算在2周内制作成品,甚至也不是建立我将使用的东西,只是一种学习经验).
我想构建一个合成器,用作forton live 9的vst3插件.我认为第一步就是制作输出任意波形并响应midi输入的内容(频率随音符变化而变化) )和一个基本的GUI模板.然后我会尝试引入不同的波形,然后是更多的振荡器和失谐,接着是声音,接着是滤波器,接着是多个声音等.
我该怎么做呢?我知道基本的c ++,但我不知道如何创建波形并将其输出为声音.c ++是否适合用于此类应用程序?