是否有一种众所周知的合成弯曲弦乐器(如小提琴)的算法?
我知道弹拨字符串(例如吉他)有karplus-强算法,这是我在过去成功实现的。
理想情况下,我想要一个算法来描述一个用于生成/合成数字信号的计算机程序。
例如,karplus-强算法可以概括如下:
我想知道类似的东西是否存在于鞠躬琴弦。
脚注:
现在,我对弦是如何产生声音的物理一无所知,所以我不知道如何推导出这样的算法。对于karplus-强算法,我只是在原始论文中阅读并“盲目地”应用它。我从来没有想过,从一段时间的噪音和不断的阻尼开始,它会产生一个非常类似于弹拨线的声音。
编辑
和往常一样,近距离游行也开始了。
在表决结束此问题之前,请考虑以下几点:
发布于 2021-11-29 00:24:07
奇怪的是,我在史丹福查克网站上找到了一些东西。
代码是用一种叫做ChucK的语言编写的,它显然是音频编程的专用语言。您必须运行才能使用此代码段。但它在查克中的实施情况如下:
// patch
Bowed bow => dac;
// scale
[0, 2, 4, 7, 8, 11] @=> int scale[];
// infinite time loop
while( true )
{
// set
Math.random2f( 0, 1 ) => bow.bowPressure;
Math.random2f( 0, 1 ) => bow.bowPosition;
Math.random2f( 0, 12 ) => bow.vibratoFreq;
Math.random2f( 0, 1 ) => bow.vibratoGain;
Math.random2f( 0, 1 ) => bow.volume;
// print
<<< "---", "" >>>;
<<< "bow pressure:", bow.bowPressure() >>>;
<<< "bow position:", bow.bowPosition() >>>;
<<< "vibrato freq:", bow.vibratoFreq() >>>;
<<< "vibrato gain:", bow.vibratoGain() >>>;
<<< "volume:", bow.volume() >>>;
// set freq
scale[Math.random2(0,scale.size()-1)] + 57 => Std.mtof => bow.freq;
// go
.8 => bow.noteOn;
// advance time
Math.random2f(.8, 2)::second => now;
}编辑:上面的只是实现,它的源文件是这里。
发布于 2021-12-08 15:21:54
不是一个算法,但是有一个开源库(在一个非常自由执照下),它在C++中为包括弯曲字符串在内的几个工具实现合成算法。
合成ToolKit (STK)
官方主页:https://ccrma.stanford.edu/software/stk/
Github链接:https://github.com/thestk/stk
包含与弓弦乐器合成相关代码的文件:
守则中的评论提到了两篇论文:
朱利叶斯·史密斯( Julius Smith )也在他的(斯坦福)网站上找到了关于弓弦合成的信息:
https://stackoverflow.com/questions/70142713
复制相似问题