FPGA 版 FM 音源 (19) -- YMF262 測定 (11)

AR が 13 以上の速いレートでのアタック・カーブを検討してみたところ、

  • 13 未満のレートの計算では EG アキュムレータを常に 3 ビットシフト (1/8) して 1 の補数で減算しているのに対し、
  • AR = 13 では、3 ビットシフト (1/8) と 2 ビットシフト (1/4) の組み合わせ
  • AR = 14 では、2 ビットシフト (1/4) と 1 ビットシフト (1/2) の組み合わせ


で実現されていることが分かりました。
この計算は、サンプリング周波数のレートで行われいて、たとえば、「2 倍速」クロックで 1/8 の計算を 2 回繰り返して 1/4 の結果を得ているのではないことが確認できました。
このシフト量の切り替えは、13 未満のレートで使われる「レート・マルチプライア」を利用して発生させているものと思われます。
後で示すように、レート・マルチプライアの初期カウントによって、アタックの「波形」が変わってきますが、初期位相を一定としたプログラムで出力した表を下に示します。

AR = 13
Rof = 0 Rof = 1 Rof = 2 Rof = 3
i Lin
out
EG
acc
s Lin
out
EG
acc
s Lin
out
EG
acc
s Lin
out
EG
acc
s
0 0 511 3 0 511 3 0 511 2 0 511 2
1 0 447 3 0 447 3 1 383 2 1 383 2
2 0 391 3 0 391 3 8 287 3 8 287 3
3 2 342 3 2 342 3 17 251 3 17 251 3
4 6 299 3 6 299 3 35 219 2 35 219 2
5 14 261 3 14 261 3 117 164 2 117 164 2
6 29 228 3 29 228 2 290 122 3 290 122 2
7 54 199 3 102 170 2 411 106 3 569 91 2
8 94 174 3 261 127 3 557 92 2 936 68 2
9 151 152 3 369 111 3 936 68 2 1383 50 2
10 234 132 3 499 97 3 1383 50 3 1833 37 3
11 338 115 3 662 84 3 1609 43 3 2042 32 3
12 468 100 3 840 73 3 1833 37 2 2276 27 2
13 620 87 3 1044 63 3 2276 27 2 2648 20 2
14 787 76 3 1241 55 2 2648 20 3 3016 14 2
15 978 66 3 1681 41 2 2826 17 3 3290 10 2
16 1188 57 3 2132 30 3 3016 14 2 3510 7 2
17 1413 49 3 2326 26 3 3290 10 2 3666 5 2
18 1645 42 3 2536 22 3 3510 7 3 3828 3 3
19 1873 36 3 2706 19 3 3588 6 3 3912 2 3
20 2088 31 3 2888 16 3 3666 5 2 3998 1 2
21 2276 27 3 3082 13 3 3828 3 2 4084 0 2
22 2482 23 3 3218 11 2 3912 2 3 - - -
23 2648 20 3 3434 8 2 3998 1 3 - - -
24 2826 17 3 3666 5 3 4084 0 2 - - -
25 3016 14 3 3746 4 3 - - - - - -
26 3150 12 3 3828 3 3 - - - - - -
27 3290 10 3 3912 2 3 - - - - - -
28 3434 8 3 3998 1 3 - - - - - -
29 3588 6 3 4084 0 3 - - - - - -
30 3666 5 3 - - - - - - - - -
31 3746 4 3 - - - - - - - - -
32 3828 3 3 - - - - - - - - -
33 3912 2 3 - - - - - - - - -
34 3998 1 3 - - - - - - - - -
35 4084 0 3 - - - - - - - - -

上の表は AR = 13 の場合で、左端の「i」となっているカラムがアタック開始 (初期値 511 のロード) からのサンプル・インデクスを表しています。


アタックの発生方法が判明したので、以前とは変えて、初期値ロードの時点を「0」としています。
Rof = 0、1。2。3 のそれぞれについて、

  • 「Lin out」のカラムは 1 オペレータ当たりのリニア出力値、
  • 「EG acc」は EG アキュムレータの値、
  • 「s」は、表示されているビット数だけ右シフトして EG 更新の計算をすること

を表しています。


Rof = 0 ではシフト量は 3 ビット (1/8) に固定で、Rof = 1 では 3 ビット (1/8) が 6 回続いたあとに、 2 ビット (1/4) が 2 回続き、その合計の 8 を周期として繰り返しています。
同様に、

  • Rof = 2 では 3 ビット (1/8) 2 回、2 ビット (1/4) 2 回の周期 4
  • Rof = 3 では 3 ビット (1/8) 2 回、2 ビット (1/4) 6 回の周期 8

となっています。


次に AR = 14 の場合の表を示します。

AR = 14
Rof = 0 Rof = 1 Rof = 2 Rof = 3
i Lin
out
EG
acc
s Lin
out
EG
acc
s Lin
out
EG
acc
s Lin
out
EG
acc
s
0 0 511 2 0 511 2 0 511 1 0 511 1
1 1 383 2 1 383 2 16 255 1 16 255 1
2 8 287 2 8 287 2 261 127 2 261 127 2
3 38 215 2 38 215 2 522 95 2 522 95 2
4 124 161 2 124 161 2 877 71 1 877 71 1
5 303 120 2 303 120 2 1914 35 1 1914 35 1
6 594 89 2 594 89 1 2826 17 2 2826 17 1
7 978 66 2 1575 44 1 3150 12 2 3434 8 1
8 1413 49 2 2592 21 2 3434 8 1 3828 3 1
9 1873 36 2 2952 15 2 3828 3 1 3998 1 1
10 2326 26 2 3218 11 2 3998 1 2 4084 0 2
11 2706 19 2 3434 8 2 4084 0 2 - - -
12 3016 14 2 3666 5 2 - - - - - -
13 3290 10 2 3828 3 2 - - - - - -
14 3510 7 2 3912 2 1 - - - - - -
15 3666 5 2 4084 0 1 - - - - - -
16 3828 3 2 - - - - - - - - -
17 3912 2 2 - - - - - - - - -
18 3998 1 2 - - - - - - - - -
19 4084 0 2 - - - - - - - - -

今度は、シフト量が 2 ビット (1/4) と 1 ビット (1/2) になっていますが、Rof による変化のしかたは AR = 13 の場合と同様になっています。


長くなってきたので、続きは次回以降に回します。