;;CDown4.CAL ;; (Guitar Rhythm Cutting for under 4 notes) ;; Written By 蛞蝓なめちゃん, 1997/09/10 ;; odasan@ma.catv.ne.jp ;; 機 能 : ・同じ time の音(和音)を note pitch の順に ;; 並べ替え、少しずつ発音 time を後ろにずらします。 ;; ・実際には、処理前の音を削除して、新たな位置に挿入します。 ;; 使用法 : ・対象範囲を選択したあと、本 program を実行。 ;; 各 note をずらす時間は、表示される入力パネルで ;; tick 単位に指定します。(初期値は 2) ;; ・down stroke (音の低い順に発音)でおます。 ;; ・負の値を指示すると ERROR になります。 ;; 制 限 : ・和音は 4 つまでしか対応していません。 ;; 5 つ以上の音を含む和音の場合、 ;; 処理されなかった音がそのまま残ります。 ;; ・いち度に複数の track あるいは 複数の channel を指定すると、 ;; 不思議なことに、音が別の track に移動してしまうことがあります。 ;; 応 用 : ずらす時間を長くすると、アルペジオになります。 ;; UNDO : 編集メニューの「元に戻す」で、 ;; 最後に処理した和音の音の数だけ「イベント挿入」を取消し、 ;; 「CAL(forEachEvent)」を取消せば、元に戻ります。 (do ;; --- 比較用作業エリア (long time0 -1) ;; --- 和音の音数 (int num 0) ;; --- 並べ替え作業用 (int note0) (int vel0) (int dur0) (int cha0) ;; --- 各音の読み込み場所 (int note1 999) (int vel1) (int dur1) (int cha1) (int note2 999) (int vel2) (int dur2) (int cha2) (int note3 999) (int vel3) (int dur3) (int cha3) (int note4 999) (int vel4) (int dur4) (int cha4) ;; --- 書き込み用 mesure / beat / tick (int time1) ;; --- 各音をずらす時間 (tick 値) の設定 (int timeshift 2) (getInt timeshift "How Long Shift (Tick) ?" 0 32757) ;; --- main (forEachEvent (if (== Event.Kind NOTE) (if (== Event.Time time0) (switch num 1 (do (= note2 Note.Key) (= vel2 Note.Vel) (= dur2 Note.Dur) (= cha2 Event.Chan) (= num 2) (delete) ) 2 (do (= note3 Note.Key) (= vel3 Note.Vel) (= dur3 Note.Dur) (= cha3 Event.Chan) (= num 3) (delete) ) 3 (do (= note4 Note.Key) (= vel4 Note.Vel) (= dur4 Note.Dur) (= cha4 Event.Chan) (= num 4) (delete) ) ) ;; In case : Time Changed (do (if (>= time0 0) ;; Loop 1 of Sorting --- (do (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 2 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 3 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 4 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Insert --- (if (!= note1 999) (insert time0 cha1 NOTE note1 vel1 dur1) ) (if (!= note2 999) (do (+= time0 timeshift) (insert time0 cha2 NOTE note2 vel2 dur2) ) ) (if (!= note3 999) (do (+= time0 timeshift) (insert time0 cha3 NOTE note3 vel3 dur3) ) ) (if (!= note4 999) (do (+= time0 timeshift) (insert time0 cha4 NOTE note4 vel4 dur4) ) ) ) ) ;; --- Read ---> Buffer (= time0 Event.Time) (= num 1) (= cha1 Event.Chan) (= note1 Note.Key) (= vel1 Note.Vel) (= dur1 Note.Dur) (delete) (= note2 999) (= note3 999) (= note4 999) ) ) ) ) ;; Finish : for Remain Data in Buffer ;; Loop 1 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 2 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 3 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Loop 4 --- (if (> note1 note2) (do (= note0 note1) (= vel0 vel1) (= dur0 dur1) (= cha0 cha1) (= note1 note2) (= vel1 vel2) (= dur1 dur2) (= cha1 cha2) (= note2 note0) (= vel2 vel0) (= dur2 dur0) (= cha2 cha0) ) ) (if (> note2 note3) (do (= note0 note2) (= vel0 vel2) (= dur0 dur2) (= cha0 cha2) (= note2 note3) (= vel2 vel3) (= dur2 dur3) (= cha2 cha3) (= note3 note0) (= vel3 vel0) (= dur3 dur0) (= cha3 cha0) ) ) (if (> note3 note4) (do (= note0 note3) (= vel0 vel3) (= dur0 dur3) (= cha0 cha3) (= note3 note4) (= vel3 vel4) (= dur3 dur4) (= cha3 cha4) (= note4 note0) (= vel4 vel0) (= dur4 dur0) (= cha4 cha0) ) ) ;; Insert --- (if (!= note1 999) (insert time0 cha1 NOTE note1 vel1 dur1) ) (if (!= note2 999) (do (+= time0 timeshift) (insert time0 cha2 NOTE note2 vel2 dur2) ) ) (if (!= note3 999) (do (+= time0 timeshift) (insert time0 cha3 NOTE note3 vel3 dur3) ) ) (if (!= note4 999) (do (+= time0 timeshift) (insert time0 cha4 NOTE note4 vel4 dur4) ) ) )