新版FM音源プログラム (11)

2016 年 1 月 1 日付けの記事 (→こちら) の 8 K (8192) エントリの「ウェーブテーブル」を用いる方式で、波形の一部を共有するすることによりテーブル容量を 6 K (6144) エントリまで減らすことができました。
サンプルごとの処理では、8 K エントリ方式と同様にインデクス 0 から 1023 までの 1024 エントリをアクセスします。 ただし、アクセス範囲の先頭が「位相ゼロ」とは限らなくなるので、ノート ON によるアタック開始時の「初期位相」として、ゼロではない値をロードする必要が生じます。
これはアタック開始時のみ必要であり、サンプルごとの処理には影響を及ぼしません。
ウェーブテーブルをインデクス順に読みだして、「波形」としてプロットしたものを下に示します。

WS = 6 (方形波) と WS = 7 (パルス波) とは、他の波形と共通部分を持たないので、それぞれ 1024 エントリずつを消費しています。
WS = 0, 1, 2, 3 の間で相互に波形の一部を共有し、WS = 4, 5 の間で相互に共有しています。
共有の様子の全体を示すと見にくくなってしまうので、まず、WS = 0, 1, 2 の部分を下に示します。

青色の「バー」がアクセスする 1024 エントリの範囲を示しています。
黒色の三角印が「位相ゼロ」の位置を示しています。
WS = 0 の (普通の) サイン波の正の振幅の部分と、WS = 2 の「全波整流波形」の正の振幅の部分とを共有しています。
また、WS = 2 の正の振幅の部分と、WS = 1 の「半波整流波形」の正の振幅の部分とを共有しています。
WS = 3 と、WS = 4, 5 のグラフを下に示します。

WS = 3 の振幅ゼロの部分 (256 エントリ) を WS = 1 の振幅ゼロの部分と共有しています。
WS = 4 の「2 倍波の 1 波バースト波形」と、WS = 5 の「2 倍波の 1 波バーストの全波整流波形」との間で、正の振幅の部分 (256 エントリ) と振幅ゼロの部分 (512 エントリ) を共有しています。