【问题标题】:bowed string (e.g. violin) synthesis algorithm弓弦(例如小提琴)合成算法
【发布时间】:2022-01-05 14:17:24
【问题描述】:

是否有一种众所周知的合成弓弦乐器(例如小提琴)的算法?

我知道对于弹拨弦(例如吉他)有 karplus-strong 算法,我过去已经成功实施过。

理想情况下,我想要一个描述用于生成/合成数字信号的计算机程序的算法。

例如,karplus-strong算法可以总结如下:

  • 确定您要合成的频率的周期长度并创建一个恰好大小的缓冲区

  • 用随机数(白噪声)填充缓冲区

  • 遍历缓冲区,每次平均每个点与下一个点,然后将其输出到输出流。

  • 在施加一些阻尼的同时重复所需的时间

我想知道弓弦是否存在类似的东西。

脚注:

现在,我对弦如何产生声音的物理学一无所知,所以我不知道如何推导出这样的算法。对于karplus-strong算法,我只是简单的在原论文中阅读并“盲目”应用。我永远不会想到,从一阵阵的噪音开始,然后不断地对其进行阻尼,会产生如此类似于拨弦的声音。

编辑

像往常一样,近距离阅兵开始了。

在投票结束此问题之前,请考虑以下事项:

  • 这个问题与物理无关。这与琴弦振动或与弓和空气相互作用产生声音的机制无关。

  • 这个问题是关于是否存在一种特定的众所周知的算法来合成声音。这完全是一个关于编程的问题。

【问题讨论】:

  • physics.stackexchange.comphysics.stackexchange.com 上的这个问题你可能会遇到更好的运气
  • @RBarryYoung 这不是关于物理的问题。这是一个关于如何编程的问题。不是关于产生声音的弦/空气/波机制。
  • 获取样本,做波形图和频谱图...拟合/参数化多项式或测角...大量研究和数据编译...
  • karplus-strong 算法......我想知道弓弦是否存在类似的东西”。这是phyiscs.stackexchange.com 的人更可能知道的问题。他们也有更多的人在将 ODE 和 PDE 转化为数值和模拟程序方面拥有丰富的经验。为了记录在案,我没有投票结束你的问题。如果你想在这里,我很好,我只是想指出那里有更多的数值和模拟程序员。
  • @RBarryYoung 注意。感谢您的建议。

标签: algorithm audio sound-synthesis


【解决方案1】:

奇怪的是,我能在 Stanfordchuck 网站上找到一些关于此的东西。

代码是用一种名为 ChuckK 的语言编写的,这种语言显然是专门针对音频编程的。您必须运行才能使用此代码 sn-p。但这里是它在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;
}

编辑:以上只是实现,源文件为here.

【讨论】:

【解决方案2】:

不是算法,但有一个开源库(在 liberal license 下),它在 C++ 中为多种乐器(包括弓弦)实现合成算法。

综合工具包 (STK)

官方主页:https://ccrma.stanford.edu/software/stk/

Github 链接:https://github.com/thestk/stk

包含与弓弦乐器合成相关的代码的文件:

代码中的cmets引用了两篇论文:

朱利叶斯·史密斯 (Julius Smith) 的(斯坦福)网站上还提供了有关弓弦合成的信息:

Bowed Strings section of the "Physical Audio Signal Processing" book

MUS420 Lecture Digital Waveguide Modeling of Bowed Strings

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 1970-01-01
    • 2018-01-15
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多