utoroのJS解説

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

ルート音を刻ませよう

前回は小節内でルート音を1回切り替えることができるようになりました。今回はルート音を16分音符単位で刻んで鳴らすことができるよう改良します。まずは下記のリンクを右クリックして別ウインドウで開いてください。

サンプル14(ルート音を刻ませる)

「Play」ボタンをクリックするとベースが小刻みにピッキングされているのがわかると思います。中ほどにある「Bass Pattern」という行のチェックボックスで示されたパターンで各小節中で発音させているというわけです。

ソースを見ていきましょう。htmlで追加したのはBass Patternの1行ですが、全体のレイアウトをパートごとにまとめて表示することで見やすくしました。

var mbnは次に消音すべきベースの音高が入ります。前回まではvar cbnのみでしたが、今回から「ある音が鳴ってる途中でcbnのみ切り替わる」という事態が起こりうるようになったので、cbnとmbnを分けて管理するようにしました。前回はルート切り替え時に必ず発音していましたが、今回からルートの切り替えと発音消音は無関係になっています。まあ通常は切り替えのタイミングで鳴らすとは思いますが。

メイン関数であるfunction tick()中では、bppにそのcountで弾くか否かをt/fで取得。bvelにベロシティを取得。弾くcountならばまず消音。その後、前回つくった記述で最新のcbnを確定し、鳴らすならばcbn+36を鳴らし、cbnをmbnに入れるという流れです。

演奏をStopしたときに最後の音を消す処理をfunction loopplay()とfunction play()に入れていましたので、こちらもcbnではなくmbn+36を消音するよう変更しています。

function bed()は、Bass Patternの行にあるチェックボックス等をいじったときにコールしていますが、自動保存を実装するときに中身をつくることにします。

これで小節内でルート音を刻むタイミングを指定することができるようになりました。

 

ルート音を小節内で替えよう

前回ルート音を鳴らすしくみを作りましたが、1小節=1ルートのシンプルなものでした。今回は1小節の中の任意の位置でルート音を切り替えられるように改良してみます。まずは下記のリンクを右クリックして別ウインドウで開いてください。

サンプル13(ルートを小節内でチェンジ)

上部の進行表の行数がさらに増えてますね。「Play」ボタンをクリックしてください。とりあえずてきとうなルート進行でループがスタートし、小節内のいろんなタイミングでルートが切り替わっているのがわかると思います。

ソースを見ていきましょう。htmlは表の行数を2つ増やし、formも2つ増えています。function ded()などの中でform番号の修正が必要になるので、formを増やすときは注意してください(今後は毎回同じ注意になるので割愛します)。

var chtは小節内のどのタイミングでルートが切り替わるかの数値が入ります。表最下段のナンバーから取得され、0でチェンジなし、8なら2拍目の頭で切り替えます。

function tick()内で、count==cht(0以外のとき)の時に発動し、有効なチェンジ指定があるならば、すでに鳴っているルートを消音し、あらたなルートをvar cbnに取得して鳴らします。

有効なチェンジ指定とは、タイミングが0以外でかつRoot Note2が「--」以外の指定がされている場合です。どちらかが満たされていない場合はルートチェンジは行われません。

最後のルート進行サンプルの部分は、16要素の配列に8個ずつのルート選択を仮に入れて読ませています。もうちょっといろんな要素が出揃った時点でリズムパターンと同様に自動保存のしくみを整備する予定です。

これで小節内でルート音を切り替えてベースを鳴らすことができるようになりました。