Sonar でギターのコード入力を簡単にするサンプル

拙作 Sonarプラグイン JFilter を使ってギターのコード入力を簡単にやるサンプルです。前準備としてJFilter をインストールしておいてください。

1、スクリプトファイルをダウンロード

まず、JFilter で使用するスクリプトファイルをダウンロードします。(下のリンクを右クリック→対象をファイルに保存)
guitar.js

2、コードのルート音を単音で入力

C なら ド、D ならレ、という風に入力します。マイナーの時はルート音+ひとつ上の音を重ねて入力します。Cm ならドド#みたいなかんじ。セブンスには未対応…だけど、スクリプトをちょっといじれば対応できます。興味のあるひとは挑戦してみてください。

3、JFilter でコードに変換

入力したノートを選択したあと、「プロセス」→「MIDI FX」→「JFilter」とメニューをたどり JFilter の画面を出します。さっきダウンロードしたスクリプトファイルを指定して、OK を押すと単音がギターコードに変換されます。



4、別のやりかた

トラックにプラグインとして挿入しておけば、そのトラックの単音がすべてコードでなるようになります。

このままだと「じゃーん」「じゃーん」ってなるだけなのであまり使えませんが、後にアルペジエーターをはさんだりすると応用の幅が広がります。

5、スクリプトファイル

今回使ったスクリプトファイルは以下のようになっています。腕に覚えのある人は、発音のタイミングをばらけさせたり、低音のベロシティを下げ目にできるように、改造すると楽しいですよ!

//
// ギターパターン
//

var code = [];
for(var i=0; i<12; i++) code[i] = [[],[]];

code[0][0] = [40,48,52,55,60,64];   // C
code[0][1] = [43,48,55,60,63,67];   // Cm
code[1][0] = [44,49,56,61,65,68];   // C#
code[1][1] = [44,49,56,61,64,68];   // C#m
code[2][0] = [45,50,57,62,66];      // D
code[2][1] = [45,50,57,62,65];      // Dm
code[3][0] = [55,58,63,67];         // D#
code[3][1] = [54,58,63,66];         // D#m
code[4][0] = [40,47,52,56,59,64];   // E
code[4][1] = [40,47,52,55,59,64];   // Em
code[5][0] = [41,48,53,57,60,65];   // F
code[5][1] = [41,48,53,56,60,65];   // Fm
code[6][0] = [42,49,54,58,61,66];   // F#
code[6][1] = [42,49,54,57,61,66];   // F#m
code[7][0] = [43,47,50,55,59,67];   // G
code[7][1] = [43,50,55,58,62,67];   // Gm
code[8][0] = [44,51,56,60,63,68];   // G#
code[8][1] = [44,51,56,59,63,68];   // G#m
code[9][0] = [40,45,52,57,61,64];   // A
code[9][1] = [40,45,52,57,60,64];   // Am
code[10][0] = [41,46,53,58,62,65];  // A#
code[10][1] = [41,46,53,58,61,65];  // A#m
code[11][0] = [42,47,54,59,63,66];  // B
code[11][1] = [42,47,54,59,62,66];  // Bm

function clone(obj) {
    var newobj = [];
    for(var name in obj) newobj[name] = obj[name];
    return newobj;
}

function onEvents(from, to, list) {
    var list2 = [];
    var last = null;
    for(var i=0; i<list.length; i++) {
        if(last==null || last.time!=list[i].time) {
            list2.push(list[i]);
            last = list[i];
            last.count = 0;
        } else {
            last.key = Math.min(last.key, list[i].key);
            last.count++;
        }
    }
    var list3 = [];
    for(var i=0; i<list2.length; i++) {
        var c = code[list2[i].key%12][Math.min(list2[i].count,1)];
        if(c==null) continue;
        var event;      
        // チャ
        for(var j=0; j<c.length; j++) {
            event = clone(list2[i]);
            event.key = c[j];
            list3.push(event);
        }
    }
    return list3;
}