ビブラートのお話

キノコさんのブログで、ヘクター'87のビブラート表現に関する話が盛り上がってるんですが、私も昔はPSGでビブラートを実現するのにえらい苦労したなぁ…というのをふと思い出したので、その頃の事をちょっと書いてみたいと思います。

(以下難しい話なので、わからない人は読み飛ばしてください^^;)

PSGなどで鳴らす音の音程(音階)は、数値で表されていました。 例えば、オクターブ4のラの音だと、MSXの場合は253という値でした。 また、(これはパソコンやゲーム機の処理能力が8ビットの時代の話なので今はあまり考えなくても良いんでしょうが)この頃は音程を表すデータが8ビットでは足りず、MSXの場合だと確か12ビット(上位4ビット+下位8ビット)といった形で表されていました。
で、どうやってビブラートを実現していたかといいますと、例えば音程を表すデータの現在値に1を加えてもう一度鳴らす→これを3回繰り返す→今度は現在値から1を引いてもう一度鳴らす→これを6回繰り返す→今度は現在値に1を加えてもう一度鳴らす→これを6回繰り返す…といった感じになります。

絵で表すとこんな感じ↓


+3    ┌┐          ┌┐
+2   ┌┘└┐        ┌┘└┐
+1  ┌┘  └┐      ┌┘  └┐
+0――┘    └┐    ┌┘    └┐
−1        └┐  ┌┘      └┐
−2         └┐┌┘        └┐
−3          └┘

ここで、問題なのが、値を加えた(もしくは引いた)結果が下位8ビットの値を超えてしまった場合なんですね。 例えば、MSXでオクターブ4のラの音は「上位4ビット=0、下位8ビット=253」となっています。 しかし、8ビットで表現できる値は0〜255なので、下位8ビットに3を加えると、値は256…しかし、この値は表現できないので、どうなるかといいますと…0になってしまうんですね。 つまり、全然見当違いの音になってしまうんです。 この場合どうすれば良いかというと、下位8ビットの値が256を超えた時点で、上位4ビットの値を1加えるわけです。 この場合、演算結果は「上位4ビット=1、下位8ビット=0(上位4ビットの値は256倍してから下位ビットに加えるので、実際の値は256)」となります。

しかし、更に問題となるのが、「上位4ビットと下位8ビットの値は一度には書き込めない」ということです。 つまり、253という値に3を加えるとして、下位ビット→上位ビットの順に書き込んだとすれば、値は「253→→256」の順に変わります。 問題は途中に挟まる「0」です。 これは意図した音と全く違う値なので、一瞬だけですが突拍子もない音が鳴ってしまうわけですよ。

というわけで、私が大昔にタイマー割り込みを使ってPSGのビブラートを実現させていた時は、突拍子もない音が鳴らないようにする為にどうしていたのでしょう?? 答えは…「ラの音だけ、鳴らすときにあらかじめ値を少なくしておく」でした。(^^;) つまり、253に3を加えると256となって上位ビットに影響が出るけど、252だったら3を加えても255となって上位ビットに影響が無いので大丈夫、というわけです。 しかし、元の値を変えるということは、音程が微妙に狂ってしまうわけで…耳のいい友人に聴かせたところ、「ラの音が気持ち悪い」と云われてしまいました。 流石ですね…(^^;)

ちなみに、昔のゲームミュージックを聴いていると、ビブラートを使っている曲はやはりこの問題を持っていたようで、特定の音だけビブラートが濁って聴こえたりします。 しかし、流石に市販のゲームではこのあたりも考えて作っているようで、音ができるだけ濁らないように工夫してあるようです。 今度昔のゲームミュージックを聴くときは、こういう部分に注目してみると面白い…かも。