使用 Karplus Strong 合成泛音

信息处理 沥青 信号合成 音调产生
2022-02-02 22:17:17

我正在构建自己的 MIDI 合成器。

我必须为钢琴键盘上的每个音符(A-1 到 C7,或 MIDI 21 到 21+88=109)创建一个体面的音色

我一直在使用一个基本的环形谐振器,在那里我创建了一个大小合适的环形(例如,以 44.1 kHz 采样,A440 又名音乐会音高的环形将是 44100/440 即 100.25 ~ 100 个样本),用静态填充它(-1 和 +1 之间的值)然后遍历它,平均连续值。

问题是 A-1 的隆隆声持续了 30 秒,而 C7 几乎立即死亡。

我以前从未注意到这个问题,因为我使用的范围要小得多。<两个八度。

试图通过乘以一个合适的衰减常数来平衡衰减,比如 X[n] = .995*(X[n-1] + X[n-2])/2,我为每个音符仔细选择常数,也失败了。

这里的问题是即使衰减=1.0,高音仍然几乎立即消失。考虑它是有道理的;如果环只有 10 个样本,即使在 1/100 秒内,我们也已经覆盖了 440 个样本,即 44 转,这将使一切都变得非常接近 0。

我尝试过的一种方法是将能量输入环中;创建一个由指数衰减包围的静态缓冲区,并将此缓冲区馈送到环中。它工作得不是很好。

我发现效果更好的是线性插值,所以我不做 ( X[n-1] + X[n-2] ) / 2,我可能会这样做:

0.98 * X[n-1]  +  0.02 * X[n-2] for a high note,  and 
0.6 * X[n-1]  +  0.4 * X[n-2]  for a note lower down

等等

但现在的问题是:如何根据音符选择插值因子?

我需要一个更好的模型来使用。

我想我还需要实现分数延迟;

Samp[ N ] += k *  Samp[ N - L ], 

如果 L = 10.2 说,我将不得不这样做:

Samp[ N ] += k * ( 0.8 * Samp[10]  +  0.2 * Samp[ 11 ] )

所以这是一个完全不同的线性插值。

所以我的主要问题是:如何在数学上确定给定音符的必要插值因子,以便所有音符都具有相等的衰减?

补充问题是:
- 除了调整插值之外,我还需要使用衰减常数吗?- 我对分数延迟的理解是否足以获得工作结果?

如果有人知道任何可以合理访问的用于模拟和声的资源,请务必将其作为答案。我浏览了 JOS 的资源,但他的写作水平非常高,我很难理解材料。

π

PS我找不到合适的标签;pitch、note、gen*、tone、synth*,这些都不可用。

3个回答

首先,请注意,在许多乐器中都发现高音音符比低音音符消失得更快的行为。你最好不要完全补偿。

我从 Karplus-Strong 中获得我想要的行为的一种方法是:

  • 我为最低音符添加了一个额外的指数衰减 - 一个“损失”因子,以便 x[n] = loss * (x[n] + x[n - 1]) / 2
  • 对于最高音符,我随机决定是否进行缓冲区更新;随着音调的增加,“无更新”事件的概率越来越高。

为了避免处理分数延迟 - 并获得我想要的任何类型的音高调制(但也为了简化代码),我使用最接近 2 的幂的环形缓冲区(例如,A4 的 128 个样本)然后执行线性插值从中读取。可以将其视为一种波表振荡器,其查找表随着相位增量计数器的移动而动态修改/刷新。

https://ccrma.stanford.edu/realsimple/faust_strings/faust_strings.pdf

这看起来是一个非常好的资源;我猜这需要我几个星期才能完成...

使用损耗滤波器 G(w),每个谐波(实际上,泛音几乎是谐波)将在每次通过时衰减 G(w)。因此,当您使用低通滤波器(例如,0.995*(X[n-1] + X[n-2])/2)时,高次谐波比低次谐波衰减得更多。此外,由于较高的音符使用较短的延迟线(或响铃),这些损失将在每个时间单位更频繁地发生。因此,较高的音符衰减得特别快。因此,如果您想坚持使用移动平均损耗滤波器,则需要设计该损耗滤波器的幅度响应,以便在给定延迟(环)长度的情况下为每个谐波获得所需的衰减时间。

因此,如果您在频率 w1 处有一些谐波,并且您希望它随包络 A1(t) = exp(-alpha*t) 衰减,其中 t = 0,1,2...,您需要求解 G (w1) 其中 exp(-alpha*t) = [G(w1)]^(t/L) 其中 L 是音符的延迟长度。请注意 -1 < G(w1) < 1 以保持稳定性。

出于您的目的,我建议将基础设置为一些所需的衰减,并从那里进行调整。使用两抽头过滤器不会给您太多控制。

对于您想要做的事情,我建议您从扩展 KS 论文开始:http: //www.music.mcgill.ca/~gary/courses/papers/Jaffe-Extensions-CMJ-1983.pdf 如果你只是想做一些简单的 KS 东西,它有你需要的一切。