Hatena::ブログ(Diary)

ひだちのいろの日記 RSSフィード

2009/07/09

[]JFilter を使って Sonar和音の発音タイミングをずらす

拙作 JFilter を使って Sonar和音の発音タイミングをずらすサンプルです。

こういうサンプル集みたいのを作ったほうがいろんな人に使ってもらえるのかなぁ…

// ノート毎にいくらずらすか
var d=10;
// 全体にかけるオフセット
var offset=0;
// 逆
var reverse=false;

// events を同じ time 値を持つもの毎に配列にまとめる
function parTime(events) {
	if(events.length==0) return [[]];
	result = [[events[0]]];
    for(var i=1; i<events.length; i++) {
    	if(result[result.length-1][0].time != events[i].time) {
        	result.push([events[i]]);
        } else {
        	result[result.length-1].push(events[i]);
        }
    }
    return result;
}

function onEvents(from, to, events) {
	// events をタイム毎に割る
    par = parTime(events);
    // tone で sort
    for(var i=0; i<par.length; i++) {
    	par[i].sort(function(a,b) {
        	if(!reverse)
            	return a.key - b.key;
            else 
            	return b.key - a.key;
        });
       	for(var j=0; j<par[i].length; j++) {
        	par[i][j].time += j*d+offset;
        }
    }
    // 配列を結合する
    result = [];
    for(var i=0; i<par.length; i++) {
    	result = result.concat(par[i]);
    }
	return result;
}

2009/02/13

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

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

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

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

guitar.js

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

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

f:id:mugaki:20090213121442j:image

3、JFilter でコードに変換

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

f:id:mugaki:20090213121443j:image

f:id:mugaki:20090213121444j:image

4、別のやりかた

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

f:id:mugaki:20090213121445j:image

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

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;
}

2009/02/08

[]JFilter 1.0.1

JFilter をバージョンアップしました。JFilter は MIDI イベントを JavaScript でごにょごにょできる MFX-Plugin(Sonarとかで使える)です。

http://simplepage.sakura.ne.jp/software/jfilter101.zip

今回のバージョンアップの変更点は以下のとおりです。

  • スクリプトファイルの再読み込みで落ちるバグを修正
  • onEvents の戻り値が Array ではないときに落ちるバグを修正
  • ソフト名を間違っていたのを修正

2009/01/20

[]JScripter 1.0.0

JScripter というものを作りました。MIDI ノートイベントを JavaScript でごにょごにょする Sonar 用のプラグインです。

http://www.vector.co.jp/soft/winnt/art/se470118.html

既存のプラグインSonarMIDI 操作コマンドでは実現できない細やかな加工を自作のスクリプトで行えます。コードのルート音をギターストロークに変換したり、ベロシティに味付けしたり、発音タイミングをずらして人間っぽい味を出したり、機械的な入力の補助につかったり、スクリプト次第でなんでもできちゃいます。

Sonar で打ち込みやっている方はぜひお試しください!

(といっても Sonar で打ち込みやってる人ってどれくらいいるんだろ…?