;;BendAN2.CAL ;; (Bend After Note) ;; Written By 蛞蝓なめちゃん, 1997/09/10 ;; odasan@ma.catv.ne.jp ;; 機 能 : ・読込んだ 2 つの音をスラーでつなぎます。 ;; 要するに pitch bend します。 ;; ・始めの音の duration を伸ばして、 ;; 次の音を pitch bend に書換えます。 ;; ・初期設定では、2番めの音の gate off 位置に ;; bend 0 を書込みます。 ;; 使用法 : 対象範囲を選択して、本 program を実行するだけ。 ;; 注 意 : ・3 つ以上の音を選択した場合、 ;; 偶数個なら 2 つずつつなぎますが、 ;; 奇数個の場合は、最後の音が削除されてしまいます。 ;; 選択は 2 個ずつセットが原則であります。 ;; ・pitch bend sensibility は初期設定で 12 半音です。 ;; 他の値を使うときは、下記 program 中の ;; "range" の値を書き換えてください。 ;; ・また bend 値が -8192 〜 +8191 の範囲外になるような指定 ;; をすると、ERROR になります。 ;; 計算結果が +8192 になった場合は +8191 に書換えます。 ;; ・bend 値は ±1 程度の計算誤差があります。 ;; ・2 つめの音の (duration + pos) tick の位置に ;; bend 0 を 書き込みます。 ;; bend値を 0 に戻す位置は、"pos" を書換えることで変更可能です。 ;; 初期設定で pos=0 です。 ;; 動 作 : time base = 120 のとき、pos= -2 を指定すると、 ;; 4:1:60 ch=1 note=A3 vel=96 dur=20 と ;; 4:1:90 ch=3 note=B3 vel=80 dur=90 の音が選択されている場合、 ;; 4:1:60 ch=1 note=A3 vel=96 dur=120 ;; 4:1:90 ch=1 pitch bend +1365 ;; 4:2:58 ch=1 pitch bend 0 ;; --- のように書き換えます。 ;; UNDO : 編集メニューの「元に戻す」で、 ;; 「CAL(forEachEvent)」を取消せば、元に戻ります。 ;; ;; ※2つ以上のノートに対応しました。by 椎太 (do (int flag 0) (int ch) (int velo) (long note0) (long note1) (int dur0) (int dur1) (dword time0) (dword time1) (dword time2) (int pos 0) ;; bend 0 を書き込む位置 (long length) (int range 12) ;; pitch bend sensibility = 12 (forEachEvent (if (== Event.Kind NOTE) (do (if (== flag 0) (do (= time0 Event.Time) ;; 1 つめ (= note0 Note.Key) (= velo Note.Vel) (= dur0 Note.Dur) (= ch Event.Chan) (delete) (= flag 1) ) (do (= time1 Event.Time) ;; 2 つめ (= note1 (- Note.Key note0)) (*= note1 8192) (/= note1 range) (if (== note1 8192) (= note1 8191) ) (= time2 time1) (+= time2 Note.Dur) (= length (- time2 time0)) (+= time2 pos) (delete) (insert time1 ch WHEEL note1) ) ) ) ) ) (do (insert time0 ch NOTE note0 velo length) (insert time2 ch WHEEL 0) ) )