utoroのJS解説

JavaScriptプログラムの解説。動作条件の説明があるので先頭から読んでください。

ピアノをハモらせよう!

前回まででドラムとベースの機能がそろってきましたが、ピアノのパートはまだ普通に演奏するだけですね。今回はピアノパートにハーモナイザーをかけて、キーに合わせて自動的にハモった演奏ができるように改造します。下記のリンクを右クリックして別ウインドウで開いてください。

サンプル18(ピアノをハモらせる)

ピアノパートの鍵盤を弾いてみてください。初期状態ではハ長調で3度下の音が自動的に付加されます。この仕組みはJazz-Pluginのサイトのサンプルから拝借したもので、音楽的に多用される3度、4度、5度、8度のハーモニーを調に合わせて作ってくれるなかなか便利な機構です。

ソースを見ていきましょう。html部分はふつうにパーツを記述しているだけで、すべての追加パーツを変更するとfunction changeHm()をコールしてハーモナイザーの設定を一括で処理します。

function transpose(x)が心臓部分で、xにはピアノの元の音高が入ります。var shiftにより度数ごとに場合分けされ、var curkeyにより選ばれている調ごとの値を取得します。それをxに加算して鳴らすハーモニーの音高を決めます。

ピアノパートが鳴るのは、鍵盤をマウスクリックしたときとPCキーボードの上段を弾いたときで、それぞれ発音と消音の命令を記述しています。その命令の直後に、ハーモナイザーが「OFF」でないときはハーモニー音高に対して同じ命令を書いてやればよいだけです。例としてPCキーボード発音時の命令を示しています。

これでピアノパートの演奏を調に合わせて自動的にハモらせることができるようになりました。

音量やパンを調整しよう

かなり機能がそろってきたので、今回は各パートの音量、パン、リバーブ、オクターブを調整できるようにして、アプリケーションとしての体裁をととのえていこうと思います。まずは下記のリンクを右クリックして別ウインドウで開いてください。

サンプル17(音量やパンを調整する)

各パートの右側の枠の中に、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チャンネル)の音は必ず減衰して消えるので消音してやる必要はありません。

最後の部分は、ページ起動時に画面上の表示どおりに音量などを更新させるために記述しています。ゆくゆくはすべての画面状態を配列化して自動保存・自動読み込みさせる予定ですが、それまではとりあえずこの形で処理しておきます。

これで音量、パン、リバーブ、オクターブをパートごとに調節できるようになり、かなりアプリケーションらしく出来上がってきました。