For your consideration... </rod serling>
Here is a script I wrote some years ago for this type of function.
Select the TRACK in which you want the durations changed. Run the script. You will be prompted for various values. They are:
Start and End Level
These are linear changes to the new note velocities over the length of the original note. For example, you could have it go from 0 velocity for the first note to 127 for the last 1/8th note. Or vice versa or set both to 100(?) if you don't want any velocity change.
Ramp Grain (Duration)
This is the length of the new notes. For 1/8ths it would be 120 @ 240ppqn.
Shortest Affected Note
This allows you to specify the length of the notes to be affected - like 960 for a whole note in a 240ppqn environ. Note that anything less than 960, in this instance, will be ignored. If your timing is a little off you may want to try 950 or something.
Overlay
This will allow multiple events to overlap at the end of the notes.
FYI, the ; are reminders and I left them in here for debugging and some documentation. No, I don't rem as I should... who does? ;)
;
(do
(int tbase 120)
(= tbase TIMEBASE)
(int len 0)
(int islvl 127)
(int ielvl 0)
(int slvl 12700)
(int elvl 0)
(int itrk 0)
(int ndur 1)
(int shrtdur 120)
(int ndurmod 1)
(int chgdur 20)
(= chgdur (/ tbase 4))
(int chglvl 1)
(int deltalvl 0)
(int dursteps 0)
(int thislvl 0)
(int overly 1)
(int ochgdur 0)
(dword timestep 0)
(int cdur 0)
(int theta 1)
(getInt islvl "Start Level" 0 127)
(getInt ielvl "End Level" 0 127)
(getInt chgdur "Ramp Grain (Duration) (Default = tbase/4)" 0 960)
(getInt shrtdur "Shortest Affected Note (Duration (in Ticks))" 0 960)
(getInt overly "Overlay Long to Short (0 False)" 0 1)
;(getInt itrk "Target Track" 1 255)
(forEachEvent
(if (== Event.Kind NOTE)
(do
(if (>= Note.Dur shrtdur)
(do
;(pause "islvl:" islvl " ielvl: " ielvl)
(= slvl (* islvl 100))
(= elvl (* ielvl 100))
(= thislvl slvl)
;(pause "slvl:" slvl " elvl: " elvl)
(= chglvl (- slvl elvl))
(= ndur Note.Dur)
(= dursteps (/ ndur chgdur))
;(pause "chglvl:" chglvl " Steps: " dursteps)
(= theta (/ chglvl dursteps))
;(= theta (/ chglvl dursteps))
;(= deltalvl (/ theta 100))
;(= deltalvl theta)
(= timestep Event.Time)
;(pause "Note Dur-" ndur " Steps-" dursteps " Theta-" theta " Timestep:" timestep)
(delete)
(while (> ndur 0)
(do
(= deltalvl (/ thislvl 100))
(insert timestep itrk NOTE Note.Key deltalvl ndur)
;(= thislvl (- thislvl deltalvl))
(= thislvl (- thislvl theta))
;(pause "Cur Lvl" thislvl " NoteDur-" ndur)
(= timestep (+ timestep chgdur))
(if (== overly 1)
(do
(= ndur (- ndur chgdur))
)
)
(if (== overly 0)
(do
(= ndur chgdur)
)
)
)
)
)
)
)
)
)
)
)
I would suggest you tinker with it a bit on a scratch project. That way you will know what to expect before you turn it loose on a composition.
Then again, maybe I misunderstood the OP as well.