我知道这是一个非常广泛的主题,但我一直在用演示和我自己的测试来挣扎,我不确定我是否正确地攻击了这个问题.所以,我应该开始的任何线索将不胜感激.
目标是让应用程序根据用户的设置生成一些合成声音.(这不是唯一的应用程序功能,我不是在这里重新创建Korg,但是synth是其中的一部分.)用户可以设置典型的合成器设置,如波形,混响等,然后在音符播放时选择,可能使用俯仰和速度修正器.
我用音频单元和RemoteIO玩了一下,但只是勉强理解我在做什么.在我走到那个兔子洞之前,我想知道我是否在正确的球场.我知道音频合成器将是低级别的,但我希望可能有一些我可以使用的更高级别的库.
如果您有任何关于从哪里开始的指示,以及我应该阅读的iOS技术,请告诉我.
谢谢!
编辑:让我更好地总结一下问题.
是否已经为iOS构建了任何合成库?(商业或开源 - 我没有找到任何搜索,但也许我错过了.)
是否有更高级别的API可以帮助生成缓冲区更容易?
假设我已经可以生成缓冲区了,是否有更好/更简单的方法将这些缓冲区提交到iOS音频设备而不是RemoteIO Audio Unit?
我找到了一些用Web Audio API进行仪器合成的库.
其中一人(Band.js)使用createOscillator(),结合振荡器型(正弦波,方波,...)看到源.
但它听起来太合成了(例如,听)我想要听起来更真实的东西,但我不想使用任何预编译的声音字体,所以它应该被合成.它也适用于移动设备.
所以我找到了另一个库(musical.js),它使用前32个谐波作为矩阵与createPeriodicWave see source结合使用.音色很棒,你可以听
正如它在源代码的注释中所写,谐波来自该钢琴样本文件.还有更多其他乐器的示例文件.我试图取代谐波,甚至整个2000年,但它听起来总是像钢琴.
还有一些值可以调整和插入谐波和ADSR值.也许他们只针对钢琴声音进行了优化?
然后我找到了另一个库(吉他合成器),它有一个非常好的吉他音色,听听它.但是这个库不使用任何createPeriodicWaveAPI.相反,它使用createScriptProcessor并getChannelData结合一些"简单"计算,但没有像其他库中的谐波那样,请参阅源代码
可以将吉他合成器移植到使用createPeriodicWaveAPI吗?我想在musicjs中使用吉他音色.这样我就可以在钢琴音色和吉他音色之间切换.
BTW:找到了另一个合成声音乐器的库.这是演示,这里是源代码.声音也很好听,但是music.js音乐库的音色更加美妙.但它看起来也像使用像getChannelDataWAVE 一样编码的东西.它也无法在我的Android移动设备上运行.
我想改变System.Speechc#中声音的性别和年龄.例如,一个10年的女孩却找不到任何简单的例子来帮助我调整参数.
我正在尝试编写一个软件合成器,重现经典合成器(如Moog和DX7)所发出的声音.有没有人知道这样的代码资源?谢谢.
我试图理解synthesize具有属性名称覆盖的指令的目的.假设我有一个接口定义如下:
@interface Dummy ... {
UILabel *_dummyLabel;
}
@property (retain, nonatomic) UILabel *dummyLabel;
Run Code Online (Sandbox Code Playgroud)
在实现文件中,我有:
@synthesize dummyLabel = _dummyLabel;
Run Code Online (Sandbox Code Playgroud)
据我所知,"dummyLabel"只是实例变量"_dummyLabel"的别名.self._dummyLabel和self.dummyLabel之间有什么区别吗?
我有一个Android的吉他图应用程序,我移植到iOS.Android有一个嵌入式midi合成器(sonivox),因此我可以生成midi文件并让Android处理播放.
有没有办法在iOS上这样做?或者iOS是否有非常轻量级的嵌入式合成器?
我正在编写软件合成器,需要以44.1 kHz采样率实时生成带限,无别名波形.Sawtooth波形现在可以做,因为我可以通过将两个锯齿波混合在一起产生脉冲波,一个是倒置的并且相移.
到目前为止,我尝试了以下方法:
在启动时以不同的频带限制频率预先计算一个周期完美的带限波形样本,然后播放混合在一起的两个最接近的波形样本.工作正常我猜,但感觉不是很优雅.需要大量样本或者听到它们之间的"间隙".插值和混合也是CPU密集型的.
整合一系列DC补偿sinc脉冲以获得锯齿波.听起来不错,除非你没有得到完全正确的DC补偿(我发现它非常棘手),波浪会从零偏离.通过向积分器添加一点泄漏可以减少DC问题,但随后会丢失低频.
所以,我的问题是:通常的做法是什么?对于CPU而言,任何建议的解决方案都必须是高效的,因为必须立即对许多声音进行实时完成.
以Tweakbench的VSTi Triforce为例.当加载到市场上的任何VST主机中时,它允许主机向VSTi发送(可能是MIDI)信号.然后,VSTi将处理该信号并输出由VSTi内的软件仪器创建的合成音频.
例如,向VSTi发送A4(我相信的MIDI音符)将使其合成中间C上方的A.它将音频数据发送回VST主机,然后VST主机可以在我的扬声器上播放或保存它.wav或其他一些音频文件格式.
假设我有Triforce,并且我试图用我选择的语言编写一个程序,可以通过发送要合成的A4音符与VSTi进行交互,并自动将其保存到系统上的文件中?
最后,我希望能够解析整个单轨MIDI文件(使用已经可用于此目的的已建立的稳定库)并将其发送到VSTi以"渲染"/合成为音频文件.
我将如何解决这个问题,我应该用什么语言来构建核心框架?
最终,它将用于基于Ruby的项目,因此任何指向特定Ruby资源的指针都会很好.
但是,我只是想了解一下VSTi的API是如何工作的.(我已经意识到这个问题与构建VST主机的问题非常相关,尽管只能将VST输出保存到文件中而不能播放它们,并且范围要小得多)
在此先感谢任何帮助=)
我正在阅读有关内存管理的所有文档,我对某些事情感到有些困惑.
使用@property时,它会为对象创建getter/setter:
.h:@property(retain,nonatomic)NSString*myString
.m:@synthesize myString
我理解这一点,但我感到困惑的是使用自我.我在不同的博客和书籍中看到了不同的语法.我见过:
myString = [NSString alloc] initWithString:@"Hi there"];
Run Code Online (Sandbox Code Playgroud)
要么
self.myString = [NSString alloc] initWithString:@"Hi there"];
Run Code Online (Sandbox Code Playgroud)
然后在dealloc我看到:
self.myString = nil;
Run Code Online (Sandbox Code Playgroud)
要么
[myString release];
Run Code Online (Sandbox Code Playgroud)
要么
self.myString = nil;
[myString release];
Run Code Online (Sandbox Code Playgroud)
在这个网站上,有人说使用self会为保留计数增加另一个增量?是真的,我没有在任何地方见过.
提供自动释放的自动吸气剂/定型器吗?
这是完成所有这些的正确方法吗?
谢谢!
我正在使用WebAudio构建Roland Juno-106合成器的仿真.实时WIP版本在这里.
如果截止频率或包络调制量在攻击或释放期间发生变化,同时滤波器同时被包络调制,我就会挂断如何更新滤波器.该代码位于此处.当前的实现并没有像模拟合成器那样响应,但我无法弄清楚如何计算它.
在真正的合成器上,滤波器立即由包络中的频率截止,包络调制量和当前级确定,但是上升或下降也可以平滑地继续.
我该如何模拟这种行为?
synthesizer ×10
audio ×5
c# ×2
iphone ×2
javascript ×2
midi ×2
objective-c ×2
c ×1
c++ ×1
ios ×1
properties ×1
ruby ×1
speech ×1
vst ×1