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 クロックとし、重み 2^{({\rm DR div\,} 4) -1} のビットだけが立っているビットパターンで 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% での値と異なっています。