N106やFDS, HES, SCC等の波形メモリ音源の波形テーブルを、基本的な波形の組み合わせにより算出します。
説明は少しごまかして書いてあるところがあります。
Wavedata lengthフィールド: 時間軸長さ(FDSは64、HES・SCCは32)
Wavedata max valueフィールド: 値の最大値(N106は15、FDSは63、HESは31。また、SCCのときは255を入れてください)
Functionフィールド: 引数をpとするような関数を書きます。出力する配列はおおよそ次のようにして計算されます。
for (t = 0 ; t < wavetable_length; t++) {
p = (t + 0.5)/wavetable_length; //tとt+1の平均値なので0.5を足している
data[t] = function(p);
}
例:Wavedata length=32とすると、p=0.5/32, p=1.5/32, p=2.5/32, ... p=31.5/32と動きます。 これらのpに対して、値域が-1<y<1となるような関数を書いてください。
角度の単位に注意。このスクリプトの中でsin, squ, tri, sawを定義してありますが、 引数にはradで表現した角度を2πで割った値を入れるようになっています(90°が0.25になり、180°が0.5になり、360°が1になり、という具合)。
数字などを少しずつ変えて実験してみてください。
sin(p) | 正弦波 | |
---|---|---|
squ(p) | 方形波 | |
tri(p) | 三角波 | |
saw(p) | 鋸歯状波 | |
squ(p, 0.25) | squ, triの第2引数は非対称率になります。0以上1以下の値を指定します。 0.5以上だと中心が右に、0.5以下だと中心が左によります。 この例は25%矩形波 | |
squ(p, 0.125) | ||
tri(p, 0.25) | ||
tri(p, 0.125) | ||
sin(p + 0.25) | 正弦波(ただし90度から始めているので実質cos) | |
sin(2*p) | 基本周波数の2倍 | |
sin(2*p - 0.25) | 基本周波数の2倍(ただし-90度から) | |
sin(0.7*p - 0.25) | ||
0.5*sin(p) + 0.5*sin(2.0*p) | 加算合成 | |
0.5*saw(p) + 0.3*squ(4.0*p) | 加算合成 | |
0.5*squ(2.0*p) | 振幅を小さくすると真ん中によります。0に張り付くわけではないので注意。 | |
saw(1.3*p) | オシレータシンクが掛かったような鋸歯状波 | |
sin(1.0*p + 0.14*sin(1.0*p)) | Frequency Modulation | |
sin(2*p+0.09*sin(7*p)) | これもFM。ベルっぽい | |
8*(p - 0.5)*(p - 0.5) - 1 | 放物線 | |
(p < 1/2.5 ? sin(2.5*p) : 0) | GM音源のベースっぽい | |
tri(Math.pow(p,4)) | ? | |
saw(Math.pow(p,4)) | ? | |
(p = (p < 0.5 ? p:1-p)*2)*0 + saw(Math.pow(p,3.7)) | ? | |
2.0*Math.abs(sin(0.5*p)) - 1.0 | 全波整流 |