;;GlissP.CAL ;; (Glissand for Piano) ;; Written By 蛞蝓なめちゃん, 1997/09/10 ;; odasan@ma.catv.ne.jp ;; 機 能 : 読み込んだ 2 つの音を 半音ずつ発音しながらつなぎます。 ;; 使用法 : 対象範囲の音を選択して、本 program を実行します。 ;; 注 意 : 3 つ以上の音を選択した場合、 ;; 偶数個なら 2 つずつつなぎますが、 ;; 奇数個の場合は、正しく動作しません。 ;; 選択は 2 個ずつセットが原則であります。 ;; 動 作 : 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=15 ;; 4:1: 75 ch=1 note=G#4 vel=84 dur=15 ;; 4:1: 90 ch=1 note=G4 vel=88 dur=15 ;; 4:1:105 ch=1 note=F#4 vel=92 dur=15 ;; 4:2 0 ch=3 note=F4 vel=96 dur=90 ;; --- のように書換えます。2 つめの音はそのままです。 ;; UNDO : 編集メニューの「元に戻す」で、 ;; 「CAL(forEachEvent)」を取消せば、元に戻ります。 (do (int flag 0) (int ch) (long vel0) (long vel1) (long vel2) (long note0) (long note1) (long note2) (long divnum) (int divlen) (int loop) (long divvel) (int updown) (int dur1) (dword time0) (dword time1) (dword time2) (long length) (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 つめ (= vel1 Note.Vel) (= divnum (- Note.Key note0)) ;; (if (< divnum 0) (do (*= divnum -1) (= updown 0) ;; zero ... down ) (= updown 1) ;; 1 ... up ) (= length (- time1 time0)) ;; 全体の長さ (= divlen (/ length divnum)) ;; ひとつの音の長さ (= loop divnum) ;; Loop 回数 (= divvel (- vel1 vel0)) (= note2 note0) (insert time0 ch NOTE note0 vel0 divlen) (-= loop 1) (while (> loop 0) (do (= time2 (- time1 (/ (* length loop) divnum))) (switch updown 0 (-= note2 1) 1 (+= note2 1) ) (= vel2 (- vel1 (/ (* divvel loop) divnum))) (insert time2 ch NOTE note2 vel2 divlen) (-= loop 1) ) ) (= flag 0) ) ) ) ) ) )