我正在构建自己的 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*,这些都不可用。