;;DurCut.cal ;; Written By 蛞蝓なめちゃん, 1998/12/24 ;; odasan@ma.catv.ne.jp ;; 機 能 : ・Multiple note にならないよう、duration を調整します。 ;; ・duration が伸びている間に、同じ高さの音が次に現れると、 ;; duration を短く書換えます。 ;; ・同じタイミングに同じ高さの音が複数ある場合は、そのうちの ;; 最後に読込まれたものだけを残して、他は削除します。 ;; 使用法 : ・対象範囲を選択して、本 program を実行。 ;; ・書換える際、初期設定では次の同じ高さの音が出現する ;; 位置に note off がきます。この位置は下記プログラム中の ;; 変数 dif を書換えれば変更できます。 ;; 注 意 : ・必ずトラックごとに実行してください。 ;; ・duration が dif より小さな音は削除されます。 ;; ・実行完了まで、多少時間がかかります。現在どこを処理中か、 ;; ウィンドウ下の ステータスバーに表示されます。 ;; ・トラックがクリップに分割されていると、うまくいかないことがあり ;; ます。クリップごとに実行するか、トラック毎にクリップを結合する ;; とうまくいくようです。 ;; UNDO : 手間を惜しまなければできますが、Loop の中で forEachEvent を ;; 使っているため、事実上不可能です。 ;; まず保存した上で、実行しましょう。 ;; 実行後も、安心せずにしっかり確認することをお薦めします。 (do (long dif 0) ;; note off を次の同じ高さの音からどれだけ離すか。 (long interval) (long sep) (int key) (int low 128) (int high -1) (int hi) (int flag) (dword time0) (int ch) (int vel) (int dur) (forEachEvent (if (== Event.Kind NOTE) (do (if (< Note.Key low) (= low Note.Key) ) (if (> Note.Key high) (= high Note.Key) ) ) ) ) (= key low) (= hi high) (+= high 1) (while (< key high) (do (= flag 0) (message "Now Checking Note #" key low "-" hi) (forEachEvent (do (if (&& (== Event.Kind NOTE) (== key Note.Key)) (if (== flag 0) (do (= time0 Event.Time) (= ch Event.Chan) (= vel Note.Vel) (= dur Note.Dur) (delete) (= flag 1) ) (do (= interval (- Event.Time time0)) (= sep (- interval dif)) (if (&& (< sep dur) (> sep 0)) (insert time0 ch NOTE key vel sep) (if (!= interval 0) (insert time0 ch NOTE key vel dur) ) ) (= time0 Event.Time) (= ch Event.Chan) (= vel Note.Vel) (= dur Note.Dur) (delete) ) ) ) ) ) (if (!= flag 0) (insert time0 ch NOTE key vel dur) ) (+= key 1) ) ) )