FM音源プログラム (7) -- EG (7)
次はディケイ/リリース・レートについて検討します。
アタックの時と同様に、まず 0-100% の時間について調べます。
DR | 時間 | (DR-1)の値との比 | DR=4の値との比 |
---|---|---|---|
4 | 39280.64 | --- | 1.00000= 959/959 |
5 | 31416.32 | 0.79979= 767/959 | 0.79979= 767/959 |
6 | 26173.44 | 0.83312= 639/767 | 0.66632= 639/959 |
7 | 22446.08 | 0.85759= 548/639 | 0.57143= 548/959 |
8 | 19640.32 | 0.87500= 959/1096 | 0.50000= 959/1918 |
今度は、
- (AR mod 4) = 0 のとき 959 分周
- (AR mod 4) = 1 のとき 767 分周
- (AR mod 4) = 2 のとき 639 分周
- (AR mod 4) = 3 のとき 548 分周
となります。
プログラムは、
#include <stdio.h> #define fs (400e3) #define EGACC_MAX (0x4000L) int drdiv[] = { 959, 767, 639, 548 }; double calc_decaytime(int rate) { double fclk; if (60 < rate) rate = 60; fclk = fs / drdiv[(rate & 0x03)]; return((EGACC_MAX >> ((rate>>2) - 1))/ fclk); } void main() { int i; double t; printf("Rate Time [ms]\n"); for (i = 4; i < 64; i++) { t = 1e3 * calc_decaytime(i); printf("%3d %9.2f\n", i, t); } // for (i }
となります。
AR=0〜3 はエンベロープ変化なしとなる特別な場合なので、上のプログラムでは除外しています。
AR=61〜63 は AR=60 の値と同じになります。
このプログラムでは、400 kHz のメインクロックを 1/959, 1/767, 1/639, あるいは 1/548 の周波数に分周して、約 417 〜 730 Hz の EG クロックとし、重み のビットだけが立っているビットパターンで 14 ビット・アキュムレータに加算するというイメージです。
このプログラムの出力と「rege」の表を比べると、表に下のような誤りがありました。
DR | 誤 | 正 |
---|---|---|
21 | 1936.52 | 1963.52 |
30 | 488.96 | 408.96 |
多分、これは、表のデータを人手で入力した時の誤りだと思います。
「rege」の同じ表の 10-90% の立ち上がり時間については、
DR | 時間 | (DR-1)の値との比 | DR=4の値との比 |
---|---|---|---|
4 | 8212.48 | --- | 1.00000 = 401/401 |
5 | 6574.08 | 0.80050 = 321/401 | 0.80050 = 321/401 |
6 | 5509.12 | 0.83801 = 269/321 | 0.67082 = 269/401 |
7 | 4730.88 | 0.85874 = 231/269 | 0.57606 = 231/401 |
8 | 4106.24 | 0.86796 = 401/462 | 0.50000 = 401/802 |
となり、アタックの場合と同様に、 0-100% での値と異なっています。