イベントフィルタの使い方と、CALから使う場合の違い

メニューからイベントフィルタと置換を使う

イベントフィルタは、Dominoでいうところの「選択範囲の絞り込み」と同じ機能。条件を決めてMIDIイベントの選択ができる。これを利用すれば、4分音符だけを選択したり、1拍目のノートだけを選択したり、特定範囲のベロシティをもったノートを選択することが出来る。置換を利用すれば、選択フィルタで絞り込む設定を決めて、書き換えフィルタで変更を加えられる。どちらもわかりにくい画面が出るせいか、使っていない人が多い気がする。
イベントフィルタはメニューの 「編集」-「選択」-「フィルタで選択」、置換は「プロセス」-「置換」で利用できる。イベントフィルタは奥まったところにあって不便なので、メニューエディタでひとつ上の階層に引っ張り出すか、キーバインド設定からショートカットに登録すると便利。同時に置換の登録も。

プリセットのちょっとした問題

設定はプリセットに登録しておけるが、プリセットを作ったときに設定した最大の拍子よりも小さい拍子に設定されているプロジェクトの場合、プリセットが反映されない。例えば、4拍子でフィルタのプリセットを作ったとき、そのプリセットは3拍子に設定したプロジェクトでは使えない。
なぜこんなことが起こるのか。4拍子の場合、フィルターの設定項目であるBeatの最大値が4なので、ほとんどのプリセットではBeatの範囲設定を1〜4に設定してプリセットを保存する。しかし、3拍子に設定されているプロジェクトでは、Beatの最大値が3なので、このプリセットはオーバーレンジということになり受け付けてくれなくなるようだ。逆に、3拍子のプリセットは4拍子のプロジェクトでも読み込めるが、Beatの範囲が1〜3で保存されているので、手入力で直さずに使うと4拍目は検索・置換に反映されなくなる。
拍子が混在しているプロジェクトでは、最大の拍数がフィルタにおけるBeatの最大値となる。

CALからイベントフィルタと置換を使う

CALでイベントフィルタを利用する場合にはSetFilterKind、SetFilterRange、ResetFilter、置換をしたい場合にはさらにEditInterpolateを利用する。しかし、いくつかバグがあるので、素直にSONARから入力ダイアログを出して使ったほうがいいかもしれない。
CALでイベントフィルタの範囲設定をリセットするにはResetFilter関数を使う。ところがこの関数を実行すると、複数トラックを選択していても、なぜかカレントトラックのみの選択に変更されてしまう。つまり、ResetFilter関数を含むCALファイルは意図しない選択範囲で実行される可能性がある。古いままの仕様なのだろうか。CAL実行時に選択するトラックを入力する作りにすれば回避できるが、ショートカット一発の恩恵は無くなる。
また、SetFilterKind関数にもバグがある。まず、イベントフィルタのShape(オートメーションのノード)をチェックするための定数がたぶん無い。あるのかもしれないが、調べた限りで見つけられなかった。次に、イベントフィルタの入力ダイアログからは、デュレーションの数値を2147483647まで入力できるのに、CALから設定しようとすると最大値が65535。符号無し16bitのまま放置されているらしい。最大にならなくて気持ち悪いけど、65535tick(=68:255)よりも大きいノートはたぶん使わないだろう。そして、致命的なのは、SetFilterRange関数を置換のための検索フィルタで使うと、Beatの範囲設定を4より大きくできない。4より大きい値に設定しても4として処理される。例えば、6拍子に設定しているプロジェクトでCALから置換を行おうとしても、5拍目と6拍目は選べない。この拍子の問題は、SetFilterRange関数をイベントフィルタとして使う場合は起きない。また、EditInterpolate関数のダイアログオプションをオミットして、入力ダイアログを出す設定にした場合も起こらない。ダイアログが出る場合、SetFilterRange関数で設定したBeatの最大値はダイアログに反映されず、自動的にプロジェクトの最大の拍数がセットされる。

参考

バグがあるので利用する可能性は薄いが、SetFilterKind関数のマニュアルにない定数と適用値の参考に。イベントフィルタとして使いたい場合、nFilterは0。置換をするときは1で検索フィルタ、2で書き換えフィルタ。

	; nFilter =	0:"Use Event Filter"
	;		1:the Interpolate Search Filter
	;		2:the Interpolate Replace Filter
	(SetFilterKind nFilter NOTE TRUE)
	(SetFilterKind nFilter KEYAFT TRUE)
	(SetFilterKind nFilter CONTROL TRUE)
	(SetFilterKind nFilter RPN TRUE)
	(SetFilterKind nFilter NRPN TRUE)
	(SetFilterKind nFilter PATCH TRUE)
	(SetFilterKind nFilter CHANAFT TRUE)
	(SetFilterKind nFilter WHEEL TRUE)
	(SetFilterKind nFilter WAVE TRUE)	; Audio
	(SetFilterKind nFilter SYSX TRUE)	; Sysxbank
	(SetFilterKind nFilter SYSXDATA TRUE)
	(SetFilterKind nFilter TEXT TRUE)
	(SetFilterKind nFilter EXPRESSION TRUE)
	(SetFilterKind nFilter CHORD TRUE)
	(SetFilterKind nFilter HAIRPIN TRUE)
	(SetFilterKind nFilter LYRIC TRUE)
	(SetFilterKind nFilter MCI TRUE)

	(SetFilterRange nFilter 0 TRUE 0 127)	; Note Key
	(SetFilterRange nFilter 1 TRUE 0 127)	; Note Velocity
	(SetFilterRange nFilter 2 TRUE 0 65535)	; Note Duration 
	(SetFilterRange nFilter 3 TRUE 0 127)	; Key Aftertouch Key
	(SetFilterRange nFilter 4 TRUE 0 127)	; Key Aftertouch Value
	(SetFilterRange nFilter 5 TRUE 0 127)	; Controller Number
	(SetFilterRange nFilter 6 TRUE 0 127)	; Controller Value
	(SetFilterRange nFilter 7 TRUE 0 127)	; Patch Change Patch Number
	(SetFilterRange nFilter 8 TRUE 0 127)	; Channel Aftertouch Value
	(SetFilterRange nFilter 9 TRUE 0 16383)	; Pitch Wheel Amount -8192...8191
	(SetFilterRange nFilter 10 TRUE 0 15)	; MIDI Channel Number 1...16
	(SetFilterRange nFilter 11 TRUE 1 4)	; Beat Count
	(SetFilterRange nFilter 12 TRUE 0 3839)	; Tick Count
	(SetFilterRange nFilter 13 TRUE 0 16384)	; Patch Change Bank Number -1...16383
	(SetFilterRange nFilter 14 TRUE 0 16383)	; RPN Number
	(SetFilterRange nFilter 15 TRUE 0 16383)	; RPN Value
	(SetFilterRange nFilter 16 TRUE 0 16383)	; NRPN Number
	(SetFilterRange nFilter 17 TRUE 0 16383)	; NRPN Value