FM音源プログラム (15) -- オペレータ (8)

ポルタメント処理

アナログシンセでは、キーボード回路のサンプル&ホールド (正確にはトラック&ホールド) 回路にポルタメント機能を持たせることが多いようです。
ホールド・コンデンサと、ポルタメント時間調整用の可変抵抗で1次 RC 回路を構成し、その過渡応答 1-\exp(-t/T) のカーブでピッチを変化させます。
FM音源プログラムでは、手持ちの XG 音源 MU90 でのポルタメントの仕様に合わせることにしました。 手持ちの GS 音源 SC-D70 についても調べましたが、同じような傾向でした。
MU90 でポルタメント・タイム (CC#05) を 8 から 96 まで 8 ずつ変化させながら、 C4 (130.81 Hz, ノート番号 48) から C6 (523.25 Hz, ノート番号 72) までポルタメントさせた結果を録音し、波形エディタでスペクトラム表示したものを下に示します。

この結果、および別の実験結果より、

  1. ポルタメントの変化の様子は音程ドメインでは直線状、周波数ドメインでは指数関数状。
  2. ポルタメント幅、つまり、ポルタメント開始ノートと終了ノートとの差の大小によらず、ピッチの変化速度は一定。
  3. ポルタメント・タイム (CC#05) の値が 16 増えると、ポルタメント時間が約 2 倍になる。
  4. 目的のピッチに達する前にノートオフした場合、実際に発音しているピッチはそこにとどまるが、次にノートオンすると、前回のポルタメントは完了して目的のピッチまで到達したかのように扱われる。

ということが分かりました。
2. の、「ポルタメント幅の大小によらず、ピッチの変化速度は一定」というのは、たとえば、1 オクターブの変化に 1 秒かかるとすると、2 オクターブの変化には 2 秒かかるということです。
これを、ピッチ変化速度が一定ということで、「定速方式」と呼ぶことにします。
アナログシンセでは、ポルタメント幅によらず、目的のピッチに到達するまでの時間が一定なのが普通で、これを「定時方式」と呼ぶことにします。
そのほかに、アナログシンセでは、ポルタメント途中でキーオフすると、単に中断として扱われ、再度キーオンすると前回停止したところからポルタメントが続行します。
MU90 でのポルタメントの変化速度は、ポルタメント・タイム (CC#05) で指定される値を V とすると、実験結果から近似的に
\qquad\qquad \frac{12 \times 16}{0.7} \cdot 2^{-V/16} \qquad \text{[semitone/s]}
と表されます。
FM音源プログラムでは、ポルタメント計算周期である 4 ms を上の式にかけて計算した値の表を使って、ポルタメント・アキュムレータの増分を求めています。
これは「定速方式」ですが、「定時方式」が必要なら、表から求めた値にポルタメント幅をかけたものをアキュムレータの増分として使うことで実現できます。
ポルタメント・アキュムレータと言いましたが、実際にはノートオン時に設定される note_f 変数をアキュムレータとして使っています。
ポルタメント・タイム 127 に対応するには、アキュムレータの小数部は、最低限 8 ビット必要です。
実際には、note_f は 32 ビット整数で、下位 16 ビットを小数部として使っています。
また、現在のプログラムは、ポルタメント・コントロール (CC#84) の意味を十分理解する前に作成したので、その扱い方が妥当でない部分があります。