Quartz Composer日記#5

今までMIDIノートに応じた字幕を表示するときは一つ一つif文の中に書いていたが、それをJavaScriptを使って自動化するということを今日はやっていた。
動画としては従来と特に変りないのだが↓
http://vimeo.com/17601144
パッチ全体像としてこんな感じになっている。

【追記開始】このJavaScriptの部分はString ComponentsとStructure Index Memberの組み合わせを使った方がいいことに後で気がついた。

この場合Separatorには半角スペースは使えないのでTextEditで置換することになる。
【追記終了】
MIDI Note Numberと題されたマクロの中身は以下のような酷い有様である。酷いから隠した。そしてLibraryに追加してみた。

この縦に長いJavaScriptの中身は以下のようになっている。昨日#4.5で書いた、MIDI Notes Receiverのバラバラな出力を一つに束ねるものを少し改良し、入力がない時に-1を返すようにしている。

function (__number noteNumber) main (__number velocity[48])
{
	var result = new Object();
	for ( i=0; i < 48; i++){
		if ( velocity[i] != 0 ){
			result.noteNumber = i;
			return result;
		}
	}
	result.noteNumber = -1;
	return result;
}

このマクロから、中央のCの下の下のCを0として半音上がるごとに1増える数値が出力される。それを更にJavaScriptに突っ込んでいる。それは結果的には以下のようなシンプルなものだが、JavaScriptのStringの扱い方を学びながら作ったので作る過程としては有意義な勉強になった。

function (__string currentSentence) main (__string lyrics, __number noteNumber)
{
	var result = new Object();
	sentences = lyrics.split(" ");
	result.currentSentence = sentences[noteNumber];
	return result;
}

Root Macro Patchの左上の"String Splitter"という名前のInput Splitterに歌詞がひとつながりのテキストで全部入っている。ピアプロに置いてある俺の曲の歌詞をやや整形してコピペしたものだ。整形と言っても、上記のJavaScriptにおいてStringを分割するのに半角スペースを使っているのであまりいじる必要がない。半角スペースによって分割された各文字列が配列Sentencesに格納され、今押している鍵盤に相当する部分がその都度出力される。
右の青いマクロにはImage With StringとInterpolationとBillboardが入っている。このマクロのTimebaseをローカルにしてあって、MIDIノートオンでマクロをEnableするようにしているので、歌詞を出す度にアニメーションが毎回最初から開始するようになっている。
本当は分割された文字列ごとに表示する場所やフォントや色や動きを変えるところまでやりたかったのだが、夜も更けたのでまた今度。とはいえ次回は図形を描くパッチを調べてみたいなあ。