ファミコン音源 三角波の鳴らし方・止め方について その1
ファミコン音源と言えば、三角波。 その16段階のギザギザした三角波は、ファミコン音源を象徴する音です。
しかし、その三角波をちゃんといじるには、ファミコン音源の仕様を熟知している必要があり、当時のサウンドドライバ制作者も頭を悩ませていたのか、お粗末な止め方をしているドライバもいくつかあります。
三角波のキーオン/キーオフについて
(ここでは、16進数を「$80」のように表記します。)
三角波には、パルス・ノイズchにもあるキーオフカウンタ($4003とかの上位5bitで指定するやつ)の他に、$4008で指定する三角波専用のカウンタがあり、どちらかのカウンタが0になると三角波は止まります。この三角波にしかないカウンタの仕様がやたらとくせ者なのです。
三角波カウンタは240Hz($4017の7bitが1の場合は192Hz)くらいの間隔で更新されます。VSyncやキーオフカウンタよりも細かく指定できます。そのカウント値は下位7bit(0-127)で指定します。カウンタを無効にする場合は7bit目を立たせます。ずっと鳴らしたい場合は$81以上の値を書きます。$80では音は鳴りません。$81以上を指定してキーオンさせた場合は、$80か$00を書くことで音を止められます。
・・・と、ここまでは普通のよくある一般的な解説です。ここからドライバ制作者とエミュレータ制作者が頭を抱える内容になってきますよー…
こっからは図を使います。上から下へと時間が流れていく感じ。キーオフカウンタは考えないものとします。
各部分の意味は、
EVENT: ハード・ソフトウェアによるイベント
FREQ : 周波数レジスタの値
$4008: $4008に書かれた値
COUNT: 三角波カウンタ。「--」はカウントが始まってないことを示す。00でキーオフ。
UPDATE FLAG: $400Bが書かれ、次のカウンタ更新周期に$4008の値をロードするフラグ。
TRI-WAVE PLAYING: 三角波が実際に発声されてるか。

まず、$400Bライトによってキーオンした後、実際に三角波が発声されるのは、240Hz/192Hz位で回っているハードウェアのカウンタ更新処理直後です。もちろん、$4008だけ更新して音を鳴らす場合も同じです。

カウンタ無効フラグを立たせてキーオンした後は、カウンタ部分はまだロード待ちの状態となっており、$00-$7Fの値を今か今かと待っている状態です。そして、$00-$7Fを書いて周期が来た瞬間からその値でカウントが始まります。なお、カウンタが有効の間は、これ以降どんな値を$4008に書いても、キーオンするまで一切無視されます。もちろん、$80や$81以上を書いても無駄です。

ちなみに、三角波がキーオフするとき、波形はこんな感じになります。周波数0Hzのような状態となり、現在の波形値をずーっと維持する形で音を止めるのです。確かにこれなら、簡単な実装でノイズを出すことなく音を止められますね。
さーて、ここまで分かったかな? 理解できたら、次はいよいよ各ドライバでの音の鳴らし方・止め方を見てみます。
次:「ファミコン音源 三角波の鳴らし方・止め方について その2」
しかし、その三角波をちゃんといじるには、ファミコン音源の仕様を熟知している必要があり、当時のサウンドドライバ制作者も頭を悩ませていたのか、お粗末な止め方をしているドライバもいくつかあります。
三角波のキーオン/キーオフについて
(ここでは、16進数を「$80」のように表記します。)
三角波には、パルス・ノイズchにもあるキーオフカウンタ($4003とかの上位5bitで指定するやつ)の他に、$4008で指定する三角波専用のカウンタがあり、どちらかのカウンタが0になると三角波は止まります。この三角波にしかないカウンタの仕様がやたらとくせ者なのです。
三角波カウンタは240Hz($4017の7bitが1の場合は192Hz)くらいの間隔で更新されます。VSyncやキーオフカウンタよりも細かく指定できます。そのカウント値は下位7bit(0-127)で指定します。カウンタを無効にする場合は7bit目を立たせます。ずっと鳴らしたい場合は$81以上の値を書きます。$80では音は鳴りません。$81以上を指定してキーオンさせた場合は、$80か$00を書くことで音を止められます。
・・・と、ここまでは普通のよくある一般的な解説です。ここからドライバ制作者とエミュレータ制作者が頭を抱える内容になってきますよー…
こっからは図を使います。上から下へと時間が流れていく感じ。キーオフカウンタは考えないものとします。
各部分の意味は、
EVENT: ハード・ソフトウェアによるイベント
FREQ : 周波数レジスタの値
$4008: $4008に書かれた値
COUNT: 三角波カウンタ。「--」はカウントが始まってないことを示す。00でキーオフ。
UPDATE FLAG: $400Bが書かれ、次のカウンタ更新周期に$4008の値をロードするフラグ。
TRI-WAVE PLAYING: 三角波が実際に発声されてるか。

まず、$400Bライトによってキーオンした後、実際に三角波が発声されるのは、240Hz/192Hz位で回っているハードウェアのカウンタ更新処理直後です。もちろん、$4008だけ更新して音を鳴らす場合も同じです。

カウンタ無効フラグを立たせてキーオンした後は、カウンタ部分はまだロード待ちの状態となっており、$00-$7Fの値を今か今かと待っている状態です。そして、$00-$7Fを書いて周期が来た瞬間からその値でカウントが始まります。なお、カウンタが有効の間は、これ以降どんな値を$4008に書いても、キーオンするまで一切無視されます。もちろん、$80や$81以上を書いても無駄です。

ちなみに、三角波がキーオフするとき、波形はこんな感じになります。周波数0Hzのような状態となり、現在の波形値をずーっと維持する形で音を止めるのです。確かにこれなら、簡単な実装でノイズを出すことなく音を止められますね。
さーて、ここまで分かったかな? 理解できたら、次はいよいよ各ドライバでの音の鳴らし方・止め方を見てみます。
次:「ファミコン音源 三角波の鳴らし方・止め方について その2」
スポンサーサイト