跳转到内容

ZynAddSubFX/PADsynth/输入和输出

来自维基教科书,开放的书籍,开放的世界

基本算法步骤

[编辑 | 编辑源代码]
输入
N - wavetable size. It's recomanded to be a power of 2.
    This is, usually,  a big number (like 262144)
samplerate - the samplerate (e.g. 44100)
f - frequency of the fundamental note (e.g. 440)
bw - bandwidth of first harmonic in cents (e.g. 50 cents)
     must be greater than zero
number_harmonics - the number of harmonics.
     Of course, number_harmonics<(samplerate/f)
A[1..number_harmonics] - amplitude of the harmonics

输出

smp[0..N-1]- the generated wavetable


内部变量

freq_amp[0..N/2-1] = {0,0,0,0,...,0}
freq_phase[0..N/2-1]
etc...  

函数

RND() returns a random value between 0 and 1
IFFT() is the inverse fourier transform
normalize_sample() normalizes samples
profile(fi,bwi){
   x=fi/bwi;
   return exp(-x*x)/bwi;
};


步骤

FOR nh = 1 to number_harmonics         
     bw_Hz=(pow(2,bw/1200)-1.0)*f*nh;
     bwi=bw_Hz/(2.0*samplerate);
     fi=f*nh/samplerate;
     FOR i=0 to N/2-1
        hprofile=profile((i/N)-fi,bwi);
        freq_amp[i]=freq_amp[i]+hprofile*A[nh];
     ENDFOR
ENDFOR
FOR i=0 to N/2-1
     freq_phase[i]=RND()*2*PI;
ENDFOR       
smp=IFFT(N,freq_amp,freq_phase);
normalize_sample(N,smp);
OUTPUT smp

扩展算法

[编辑 | 编辑源代码]

扩展算法与基本算法之间的差异很小:有一个额外的参数

  • bwscale: 指定谐波带宽根据其频率增加的程度。
  • 此外,还定义了一个名为 relF(N) 的函数,它返回第 N 个泛音的相对频率。它允许生成失谐的谐波,甚至金属声音(如钟声)。

基本算法的差异在于 bw_Hzfi 的计算

bw_Hz=(pow(2.0,bw/1200.0)-1.0)*f*pow(relF(nh),bwscale);
fi=f*relF(nh)/samplerate;

如果 relF(N) 函数返回 N 且 bwscale 等于 1,则此算法将等效于基本算法。

freq_amp 数组示例图表

[编辑 | 编辑源代码]

(基本算法) freq_amp 数组的图表,用于 N=262144、f=500 Hz、bw=100 厘、采样率=44.1 kHz 和 A[],其中 A[n]=1.0/sqrt(n)

整个数组 数组特写

此算法输出的音频示例

[编辑 | 编辑源代码]
华夏公益教科书