Max for Live 体験記 3 (コードトリガー)
前回 https://note.com/t_ikenuma/n/n03c80444e850 紹介したハーモナイザーを進化させてコードトリガーを作成してみました。大きな違いは音程ごとにハーモニーを設定出来ることです。以下の3つのモードを持ち
1 Single(ハーモナイザーと同じ)
2 Octave(オクターブ内で個別に音程を設定)
3 Multi(88鍵全て個別に音程を設定)
入力した音に4声のハーモニーを足し、Velocityは声部ごとに設定でき、発音タイミングもずらすことができるようにしてみました。
まずは左端の切替ボタンでモードを選択した後にMidi鍵盤を弾くか上部のksliderをクリックして入力する音程を設定します。中央に並んでいるdialを動かすと入力した音に対するハーモニー声部の音程とベロシティーの変化量を自動的にメモリーされます。音程の可変範囲は左二つは-12〜12 、右二つは-24〜24。Velocityは0にするとミュートされるようにしてあります。
順番にプログラムを見ていくと、最初の入出力部分は(図 2)
midiparseでmidi信号からnote on/offを抽出し、unpackでnoteとvelocityに分解。ksliderで音程を視覚的に表示した後にnoteとvelocityをsendで必要な箇所に送ります。加工されたnoteはreciveで受け取りnote以外のmidi信号と組み合わせて出力します。途中にあるmidiflushは鳴っている音にノートオフを送ることができます。
ksliderは単音しか入力できないので(図1)の下部のoutput用の表示ではインスペクターでカラーを透明にしたものを重ねて使用してます。
次は入力した音に対する変化量を記録する為に必要な配列データの作成ですが今回はcollオブジェクトを使用してます。インデックス値は
マルチモードの場合はノートナンバーそのままで21〜108
オクターブモードの場合はノートナンバーを12で割った余りの0〜11
シングルモードの場合は12と別々に格納することにしました。
インデックス値生成用のサブパッチ(図3)では左インレットに入力したスイッチ(single=0,octave=1,multi=2)でgateとswitchを切り替え、
右インレットに入力したノートナンバーからインデックス値を生成します。
配列に保存するデータはインデックス値、原音のvelocity(0〜100%)、ハーモニー声部の音程オフセット(声部1,2は-12〜12、声部3,4は-24〜24)とvelocity x4で要素10個となります。配列の初期値を生成する部分が(図4)です。
起動時のlive.thisdeviceとリセットボタンからのbangを受けて
uziオブジェクトでインデックス値を生成し(シングルモードとオクターブモード用に0から13個、マルチモード用に21から88個)zl.joinオブジェクトで初期値のリストと組み合わせます。collオブジェクトの左インレットにリストを送ると、引数で指定したchord_memoryに格納されます。
ノートが入力された際には(図3)のサブパッチでインデックス値を生成してcollオブジェクトの左インレットに入力すると対応するデータを読み出せます。(図5)これをdialに入力するとnumber、ksliderオブジェクトでも設定値を表示します、dialで値を変更するとtoriggerでbangをunpackに送りリストを作成してcollの左インレットに送りメモリーします。
”理由がはっきりわかりませんがこの部分でインディックス値のmessageオブジェクトをpackオブジェクトに対してある程度右にずらさないと上手くデータが同期しませんでした・・・”
ハーモニーデータを生成する部分(図6)は基本的には前回のハーモナイザーと同じですが、今回は音程ごとに配列を読み出してオフセット値を適用していくので全てのタイミングを揃えるのに苦労しました。buddyオブジェクトでノート、ベロシティーとそれぞれのオフセット値が全て揃ってから次に送る様にしていますが、入力された音のところにベロシティーが0の際に閉めてnote off信号を送らない様にするgswitchが入れてないのはノート送信と開閉のタイミングがどうしても合わせられなかった為です。(buddyの位置も先ほどと同様にunpackオブジェクトに対して右に寄せないとタイミングがうまく合いませんでした。同期の検証が楽な様に敢えてサブパッチも使わずに書いてあります。)
新しく追加したflam機能はpipeオブジェクトを使用してdialで設定した時間ずつ声部の発音を遅らせています。
プログラム全体は(図7)となります。
興味を持った方はダウンロードしてお試しください。
不具合があった場合教えていただけると幸いです。
Max for Live体験記 1(トランスポーズ)
https://note.com/t_ikenuma/n/na4515862cd4e
Max for Live体験記 1(ハーモナイザー)
https://note.com/t_ikenuma/n/n03c80444e850