効果音について

BRELG/3tvでもGARUDA同様にMIDIを使った効果音を入れています。
表現力重視で、ノートオフを自前で制御するようにしました。
正確には、BRELG/3tvの元になったBRELG/IIの開発中に一時期しっかり効果音をいれており、
GARUDAでサイズ制限クリアのためにノートオフ不要の音色のみに簡易化していたわけですが、
今回は爆発音以外はノートオフが必要な音色も使用します。
該当する効果音は、レーザー照射(自機、敵機)、ダメージ(自機、敵機)、シールド回復。
爆発音は例の音で十分なので、ノートオフ不要。
素のMIDI音色では厚みが不足するので、たとえばレーザー照射中は毎フレームでノートオンを
送信し、音に震えを持たせます。


照射中→照射停止のときだけノートオフを出しますので、直前にノートオンを出して
いたかどうかも覚えておく必要があります。
また、自機は1つですが、敵機は複数。
全敵機についてレーザー照射音やダメージ音を出すと、Midiメッセージが大量になりますし、
非常にうるさくなります。
しかも、ノートオフが必要な音色ですからダメージなしならノートオフが必要ですが、
毎回無条件にノートオフを出すのも無作法です。


ここでビット演算の出番です。
たとえばマイタンクのレーザーが当たったときのダメージ音は、こんな式でチェック。

dmgsnd|=(ダメージあったら1、なかったら0の式)

全敵機についてのダメージチェックでこの式を評価すると、dmgsndの最下位ビットは、
1機でもダメージがあれば1となり、どの敵機もダメージがなければ0です。
そして、Midiメッセージを出すところでは、以下のようにしています。

    if dmgsnd{
        dmgsnd&=1:dmgsnd*=16
        midiOutShortMsg hmidi, $7f2a82+dmgsnd
    }

dmgsndが0でなければifの中身が処理されます。
中身の処理では、dmgsndを最下位ビット(1か0)を取り出して16倍しています。
これによってdmgsndを最下位ビットが1なら$7f2a82には16が足されて$7f2a92となり、
ノートオンのMidiメッセージになります。


なお、16倍されたdmgsndはそのままクリアせずに、上のダメージチェックで再利用します。
そうすると、dmgsndは16か17になるわけですがこれが重要です。
0,1のときは、前フレームでノートオンがなかったことを示し、16、17は前フレームで
ノートオンがあった事を示します。(つまり前フレームの状態がわかる)
上のMidiメッセージを出す処理の動作は以下のように場合分けされます。
・dmgsndが0のときは何もしません。
・dmgsndが1か17のときはノートオンが送信されます。
・dmgsndが16のときはノートオフが送信されます。
dmgsndのクリアも不要なうえ、ノートオフも必要なときだけ送信されます。