音量やパンを調整しよう
かなり機能がそろってきたので、今回は各パートの音量、パン、リバーブ、オクターブを調整できるようにして、アプリケーションとしての体裁をととのえていこうと思います。まずは下記のリンクを右クリックして別ウインドウで開いてください。
各パートの右側の枠の中に、Vol, Pan, Rev, Octというナンバーがつくられています。Playボタンで演奏を開始してそれぞれの数値を変えると、リアルタイムで音量やステレオ定位などが変わります。リバーブは内蔵音源によっては効かないかもしれません。Macの内蔵音源ではしっかりリバーブがかかってくれますが。
ソースを見ていきましょう。右上の枠に「All Notes Off」というボタンを追加しています。これは何らかのトラブルで音が鳴りっぱなしになったときに消音するためのものです。まあ、ブラウザをリフレッシュしても音は消えますが。
各パートのナンバーを更新すると、共通の「function change何某(n)」という関数を呼び出します。nにMIDIチャンネルが入り、共通の処理を実行するというわけです。
function changeVol(n)では、「Jazz.MidiOut(0xb0+ch,7,valn)」で、ch+1のチャンネルのボリュームをvalnにします。ボリュームは0〜127の範囲で、発音時の音個別の強さであるベロシティとは別に、チャンネル全体の音量を調節します。
function changePan(n)では、「Jazz.MidiOut(0xb0+ch,10,valn)」で、ch+1のチャンネルのパンポットをvalnにします。パンポットは0〜127の範囲で、64が中央定位、小さい数値が左寄り、大きい数値が右寄りになります。
function changeRev(n)では、「Jazz.MidiOut(0xb0+ch,91,valn)」で、ch+1のチャンネルのリバーブ量をvalnにします。リバーブ量は0〜127の範囲で設定できます。リバーブ0だと耳元すぐで鳴ってる感じですが、リバーブ量を上げると部屋で鳴ってるような臨場感がでてきますね。
function changeOct(n)ではJazz-Pluginの命令は使用しておらず、var oct1, var oct2に上げ下げの数値を格納して、発音・消音時に12倍(オクターブなので)したものを加算しています(その部分のソース引用は割愛)。
function allNotesOff()では、MIDIチャンネル1と2のすべての音高に対して消音命令を実行することで、鳴りっぱなしの音があれば消音します。ドラムパート(10チャンネル)の音は必ず減衰して消えるので消音してやる必要はありません。
最後の部分は、ページ起動時に画面上の表示どおりに音量などを更新させるために記述しています。ゆくゆくはすべての画面状態を配列化して自動保存・自動読み込みさせる予定ですが、それまではとりあえずこの形で処理しておきます。
これで音量、パン、リバーブ、オクターブをパートごとに調節できるようになり、かなりアプリケーションらしく出来上がってきました。