;;GlissV.CAL ;; (Glissand for Violin) ;; Written By 蛞蝓なめちゃん, 1997/09/10 ;; 1998/12/04 ;; odasan@ma.catv.ne.jp ;; 機 能 : 読み込んだ 2 つの音を 指定した分割数で ;; pitch bend しながらつなぎます。 ;; 使用法 : 対象範囲の音を選択して、本 program を実行します。 ;; 注 意 : ・3 つ以上の音を選択した場合、 ;; 偶数個なら 2 つずつつなぎますが、 ;; 奇数個の場合は、最後の音が削除されてしまいます。 ;; 選択は 2 個ずつセットが原則であります。 ;; ・pitch bend sensibility は、初期設定で 8192 = 12 半音。 ;; 変更する場合は、 program 中の "range" を書換えてください。 ;; ・bend 値が -8192 〜 +8191 の範囲外になった場合は、 ;; その部分の bend 値を 0 にします。 ;; ・計算結果が +8192 になった場合は +8191 に書換えます。 ;; ・ただし、計算誤差があるので、bend 値は多少変わることがあります。 ;; ・2 つめの音は書換えません。 ;; ・2 つめの音の 1 tick 手前に pitch bend 0 を加えます。 ;; 動 作 : time base = 120 のとき、 ;; 4:1:60 ch=1 note=A4 vel=80 dur=20 と ;; 4:2:00 ch=3 note=F4 vel=96 dur=90 の音が選択されている場合、 ;; 分割数を 4 とすると、 ;; 4:1: 60 ch=1 note=A4 vel=80 dur=60 ;; 4:1: 75 ch=1 pitch bend -683 ;; 4:1: 90 ch=1 pitch bend -1365 ;; 4:1:105 ch=1 pitch bend -2048 ;; 4:1:119 ch=1 pitch bend 0 ;; 4:2 0 ch=3 note=F4 vel=96 dur=90 ;; --- のように、最初の音の duration を伸ばし、 ;; 間に pitch bend を挿入します。 ;; UNDO : 編集メニューの「元に戻す」で、 ;; 「CAL(forEachEvent)」を取消せば、元に戻ります。 (do (int range 12) ;; 初期設定 8192 = 12 半音 (int flag 0) (int ch) (int vel0) (int note0) (long notedif) (int divnum 16) ;; 初期設定 16 分割 (int loop) (dword time0) (dword time1) (dword divtime) (int divbend) (int length) (getInt divnum "分割数" 2 32767) (forEachEvent (if (== Event.Kind NOTE) (do (if (== flag 0) (do (= time0 Event.Time) ;; 1 つめ (= note0 Note.Key) (= vel0 Note.Vel) (= ch Event.Chan) (delete) (= flag 1) ) (do (= time1 Event.Time) ;; 2 つめ (= length (- time1 time0)) (= notedif (- Note.Key note0)) (= notedif (/ (* notedif 8192) range)) (= loop divnum) (-= loop 1) (insert time0 ch NOTE note0 vel0 length) (while (> loop 0) (do (= divtime (- Event.Time (/ (* length loop) divnum))) (= divbend (* (/ notedif divnum) (- divnum loop))) (if (== divbend 8192) (= divbend 8191) ) (if (> divbend 8191) (= divbend 0) ) (if (< divbend -8192) (= divbend 0) ) (insert divtime ch WHEEL divbend) (-= loop 1) ) ) (insert (- time1 1) ch WHEEL 0) (= flag 0) ) ) ) ) ) )