; Rem_Bridges.cal
;
; Copyright 2002 by Walter Tenten
;
; First all notes are extended by 6.
; Thus they will overlap in places where bridging is present.
;
; The second section will remove any overlapping notes
; and merge them into single events.
;
;
(do
(do
(word CurrentKey 13) ; Ampico starts at Note 16!
(word ExtendedNotes 0) ; Maximum of 2**16
(word DeletedNotes 0)
(word wNoteNumber 0)
(word wChan 0)
(word wKey 0)
(word wVel 0)
(long lDur 0)
(dword dTime 0)
(dword dNoteEnde 0)
(while (< CurrentKey 115) ; Ampico ends with 113
(do
(message "CurrentNote: " CurrentKey " Extended Notes: " ExtendedNotes)
(forEachEvent
(if (&& (== Event.Kind NOTE) (== Note.Key CurrentKey))
(do
(= Note.Dur (+ Note.Dur 6))
(++ ExtendedNotes)
)
NIL
)
)
(++ CurrentKey)
)
)
(pause ExtendedNotes " Notes Extended.")
)
; Ab hier Unlap/Merge
(do
(= CurrentKey 13)
(= wNoteNumber 0)
(while (< CurrentKey 115)
(do
(= wNoteNumber 0)
(message "Working on Note: " CurrentKey)
(forEachEvent
(if (&& (== Event.Kind NOTE) (== Note.Key CurrentKey))
(do
(++ wNoteNumber)
;; (pause "Working on Note: " wNoteNumber)
(if (!= wNoteNumber 1) ; First Note ?
(do ; No
;;; (pause wNoteNumber ".. EventTime =" Event.Time "dNoteEnde =" dNoteEnde)
(if (< Event.Time dNoteEnde) ; Overlap ?
(do ; Yes
(= lDur (+ Note.Dur (- Event.Time dTime))) ; adjust length
(= dNoteEnde (+ dTime lDur)) ; adjust too
;;; (pause wNoteNumber "New length =" lDur)
(delete)
(++ DeletedNotes)
) ; end do
(do ; Else No Overlap
(insert dTime wChan NOTE Note.Key wVel lDur) ; restore prev Note
(-- DeletedNotes)
;;; (pause wNoteNumber ".. Note " Event.Time Note.Dur)
(= dTime Event.Time) ; New set of Note properties
(= wChan Event.Chan)
(= wKey Note.Key)
(= wVel Note.Vel)
(= lDur Note.Dur)
(= dNoteEnde (+ dTime lDur))
(delete)
(++ DeletedNotes)
) ; end do
) ; end if
;;; (pause DeletedNotes "Notes Deleted")
) ; end do
(do ; else if (!= wNoteNumber 1)
;;; (pause wNoteNumber ". Note " Event.Time Note.Dur)
(= dTime Event.Time) ; Save Note properties for first Note
(= wChan Event.Chan)
(= wKey Note.Key)
(= wVel Note.Vel)
(= lDur Note.Dur)
(= dNoteEnde (+ dTime lDur))
(delete)
(++ DeletedNotes)
) ; end do
) ; end if (!= wNoteNumber 1)
) ; end do
NIL ; Not a Note or note this Key
) ; end if (&& (== Event.Kind NOTE)...)
) ; end forEachEvent
;; (pause wNoteNumber " in Track " CurrentKey)
(if (!= wNoteNumber 0)
(do
(insert dTime wChan NOTE CurrentKey wVel lDur) ; restore prev Note
(-- DeletedNotes)
)
)
(++ CurrentKey)
) ; end do
) ; end while
(pause DeletedNotes " doubled/overlapping notes (net) deleted.")
)
)
