3MHz
3MHz
3MHz
MSX BASIC version 4.0
Copyright 1990 by Microsoft
25277 Bytes free
Disk BASIC version 2.01
主にMSX関係のコンテンツが置いてあります。

SCCインターリーブ波形切り換え

SCCは32バイトの波形データを自在に定義できますが、その定義した波形を単独でただ使うだけでは、少し表現の幅が狭くなってしまいます。

FM音源では波形はアタックからどんどん形を変えていきますが、SCCの場合は判で押したように同じ波形を延々と繰り返すのでどうしても規則性が強くなって、狭い意味での電子音的な音に聞こえがちになります。

そこで、1音を発声中に次から次へと波形データを切り換えると、波形の変化をある程度真似ることになるので、聞こえる音もかなり違ってきます。

なので良く波形切り換えは使うのですが、一つ欠点がありました。ノイズです。以下の画像を御覧下さい。実機で波形切り換えの音を再生し、PCに取り込み波形表示したものです。

波形にヒゲが出ているように見えると思います。もう少し拡大します。

ヒゲが確認できます。更に拡大します。

波形の形が見えるまで拡大すると、ヒゲが何処なのか分かりにくくなったので、わかりやすいように線を入れてみます。

緑の線は、1波形の区切りで入れました。実際は何処が始まりで終わりかは不明ですが、緑線の区間が1波形分の長さになっています。

で、赤丸のところを見比べると、右の方が下に切れ込みが鋭く入っているのが分かるかと思います。実はこれがヒゲのように見えた正体です。本来は左の赤丸に近い波形を描くはずが、その瞬間だけかなり異なる波形になっています。

この時、波形書き込み処理が行われていて、現象の理由としてはMSXが波形メモリにデータを書き込んだ瞬間と、SCCが波形メモリからデータを読んで再生しようとした瞬間が合わされば、SCCが正しいデータを読み取れなくなり、間違ったデータを再生するためこのようなことになるというのが一般的な解釈のようです(メモリアクセスの競合)。

この波形は毎回約1/60秒ごとに波形書き換えを行っているので、それでは毎回ヒゲが出るのかと言うとそうではありません。推測ですが波形メモリの読み書きが合わさるタイミングの問題や、もし間違ったデータを再生したとしても、正しいデータに近い値を再生した場合はヒゲの発生は無いということかも知れません。波形データによっては目立つもの、目立たないものもあります。

この音を再生してみるとどのように聞こえるか、wavファイルにしたので聞いてみて下さい。

まるで、レコードのノイズのように聞こえたかと思います。これはこれで表現として使えるなとも思ったり(PS1のサイレントヒルOPみたいな)、曲全体として聞くと目立たないこともあったりしてそのまま波形切り換えを使っていましたが、何とかできないかとはずっと思っていました。(※余談ですが、メタルギア2サントラのライナーノーツでノイズとの戦いと書かれていたのはこの現象のことじゃないかと想像します。)

ドライバの新機能

SCMDver.2.2.0で漸くその対策ができ、実装しました。それが、SCCインターリーブ波形切り換えです。名称は勝手にそう呼んでいるだけなのでこういう物をインターリーブとは言わないのかも知れませんが…。以下の画像が、その機能を使って同じように約1/60秒ごとに波形切り換えを行ったものです。

波形を見てもヒゲは見当たりません。この状態の音のwavファイルです。上のwavファイルと全然違うことが分かると思います。

原理

波形書き換えで再生音にノイズが入るとはいえ、音色を書き換えた時に、他のチャンネルにノイズが入ったことがあるかと考えるとそのような記憶は無く、もしかするとメモリアクセスの競合はチャンネル単位で独立しているのでは無いかと考えました。つまり、ch1を書き換えた時ノイズが発生するのは同じch1ということです。更にノイズは音の出力を0にすることで聞こえなくすることができることも実験で確認しました。

それが分かれば波形をABCDEF…と書き換えていく場合、2ch使うことでノイズを消すことが理屈的にはできるはずです。

上図のように、ABCDEF…と1クロックずつ波形切り換えする波形切り換え定義から、ACEG…,BDF…と2つに分け、A以外2クロックごとに切り換えるように定義を作成します(ループ使用時の場合等、実際の使用に於いてはもう少し細かいルールが必要ですが、ここでは省きます)。

2ch同時に波形切り換えを再生し、上段の出力をON、次に下段の出力をONというように交互に出力を切り換えていくと、A'B'C'D'E'F'が聞こえます。

波形の書き換えは、A'BCDEFGで行うので、A'以外は出力がOFFになった時に書き換えていることになり、波形切り換えに伴うノイズは出力されません。A'は本来なら、1音前の最後のクロックにAが来るのですが、音の発音開始時のノイズは目立ち難いこと、開始時のみだけなのでノイズ発生確率も低いこと等を鑑みて、このくらいは許容の範疇としました。

欠点

長いこと上手く行かなくて、試行錯誤の末やっと実現できたこの機能ですが欠点もあります。

  • 1つの音にデチューンのような効果を付けること無く、2ch使ってしまう。
  • そもそも曲になった時点でノイズはある程度目立ち難くなるので、2chも消費して使う必要性が少し低い。

ということなので、実際使用するかと言えば微妙なところではあります。

他には謎の挙動があり、blueMSX上ではそもそも波形書き換えでノイズが出ずに、何の苦もなくキレイな波形切り換えができるのですが、このインターリーブ波形切り換え機能を使うと何故か逆にプチプチノイズが乗ってしまいます。実機でノイズが減り、エミュレータでノイズが増える原理は全く分かりません。