[MID-Play Sound Mixer の仕組み]

加算合成
8bit の PCM 波形では -128〜127 の振幅をとれますが、この幅を最大発声数で分割します。
32音の同時発声であれば、1音あたり 3bit = -4〜3 程度の分解能になります。
16bit の場合は -32768〜32767 の振幅を同様に分割して 1音あたり 11bit = -1024〜1023 程度
の分解能になります。
この分解能は、最大発声数を決めた段階で計算を済ませてしまい、最大振幅として覚えておき
ます。音量計算の際に、この最大振幅を最大音量とするようにレンジ変換することにより、許容外
へはみ出して音割れしてしまうのを防止します。この方法は、音量設定のタイミングしか再計算
が発生しないので、計算量を抑えることができます。
このイメージを図示したのが Fig.1 になります。



Sound1〜Sound32 の出力は楽器音ですので、時々刻々と変化します。それに掛け合わせるレンジ
変換係数は、上記の最大振幅ですので、音量設定が変更されたタイミングでのみ変化します。

レンジ変換係数が全ての Sound1〜Sound32 で共通であれば、加算合成後に1度だけ掛け合わせた
方がかけ算の回数を減らせるわけですが、実際には音ごとに音量設定が異なるために、レンジ変換
係数も Sound1〜Sound32 で個別にもっており、掛け合わせ処理も Sound1〜Sound32 の内部で処理
してから出力して、Sound Mixer モジュールでは加算の一部とフィルタ処理のみを受け持っていま
す。

「加算の一部」という微妙な表現をしたのは、Sound Mixer は加算結果を格納するメモリを用意し
て最初に1度だけゼロクリアします。そして、Sound1〜Sound32 を順に呼び出して、その際にその
メモリアドレスを渡してしまいます。Sound1〜Sound32 の波形生成ルーチンは、受け取ったメモリ
に対して生成した波形を加算していきます。この段階では、1sample=32bit(2の補数) の構造で保持
しています。Sound32 の呼び出しを終えた後、Sound Mixer は内部のフィルタ処理へメモリを渡し
ます。フィルタは、必要なフィルタを掛けつつ、再生可能な構造(128増し8bit符号、2の補数表現
16bit符号)へ変換していきます。
フィルタから戻ると、得られた波形データを Sound Device へ渡して、1回の波形生成処理を終え
ます。

[前へ][▲上へ][次へ]
Copyright (C)2004 t.hara, 無断転載禁止