home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Sound / Misc / MUSICX21.DMS / in.adf / rexx / TimeStretcher.mxe < prev    next >
Encoding:
Text File  |  1993-10-15  |  2.3 KB  |  105 lines

  1. /* time expander/compresser over selected events    */
  2. /* written by Joe Pearce (3-14-91)                    */
  3.  
  4. Options results
  5.  
  6. MXLABEL  "Percentage"
  7. MXSLIDER " of Original:,1,200,100"
  8. MXREQUEST "Expand/Compress Time,DO IT"
  9. if result = 0 then exit
  10.  
  11. MXVALUE 2
  12. timeadj = Result / 100
  13.  
  14. GETBARDATA
  15.  
  16. if BARDATA.SELECT == 'NONE' then do
  17.     MXREPORT "No events selected or marked!"
  18.     exit
  19.     end
  20.  
  21. MXPOINTER "sleepy"
  22.  
  23. if BARDATA.SELECT == 'SELECT' then do
  24.  
  25.     i = 0
  26.  
  27.     BEGINSCAN 'selected'
  28.     if result ~=0 then do forever
  29.         NEXTEVENT
  30.         if result == 0 then break
  31.  
  32.         EvtT.1 = EVENT.START.ticks
  33.         if i = 0 then EvtT.0 = EVENT.START.ticks
  34.         i = i + 1
  35.         end
  36.     ENDSCAN
  37.  
  38.     if i < 2 then do
  39.         MXREPORT "Need at least two events selected!"
  40.         MXPOINTER "normal"
  41.         exit
  42.         end
  43.     end
  44. else do            /* 'MARK' */
  45.     EvtT.0 = BARDATA.START.BARS * BARDATA.MEASURE + BARDATA.START.CLOCKS
  46.     EvtT.1 = BARDATA.STOP.BARS * BARDATA.MEASURE + BARDATA.STOP.CLOCKS
  47.     end
  48.  
  49. mode = 0
  50. delta = EvtT.1 - EvtT.0
  51.  
  52. if delta = 0 then do
  53.     MXREPORT "Time interval is zero."
  54.     MXPOINTER "normal"
  55.     exit
  56.     end
  57.  
  58. /* MXREPORT "Time delta:" delta */
  59.  
  60. BEGINSCAN 'all'
  61. if result ~=0 then do forever
  62.     NEXTEVENT
  63.     if result == 0 then break
  64.  
  65.     gotstop = 0
  66.     if EVENT.TYPE == 'NOTE' then gotstop = 1
  67.     if EVENT.TYPE == 'TEMP' then gotstop = 1
  68.     if EVENT.TYPE == 'MSEQ' then gotstop = 1
  69.     if EVENT.TYPE == 'PSEQ' then gotstop = 1
  70.     if EVENT.TYPE == 'SSEQ' then gotstop = 1
  71.     if EVENT.TYPE == 'MTRK' then gotstop = 1
  72.     if EVENT.TYPE == 'STRK' then gotstop = 1
  73.  
  74.     if mode = 0 then do
  75.         if EvtT.0 <= EVENT.START.ticks then mode = 1
  76.         end
  77.  
  78.     if mode = 1 then do
  79.         if EvtT.1 <= EVENT.START.ticks then mode = 2
  80.         c = (EVENT.START.ticks - EvtT.0) * timeadj + EvtT.0
  81.         EVENT.START.CLOCKS = c // BARDATA.MEASURE
  82.         EVENT.START.BARS = c % BARDATA.MEASURE
  83.         if gotstop = 1 then do
  84.             b = EVENT.STOP.ticks + c - EVENT.START.ticks
  85.             EVENT.STOP.CLOCKS = b // BARDATA.MEASURE
  86.             EVENT.STOP.BARS = b % BARDATA.MEASURE
  87.             end
  88.         REPLEVENT
  89.         end
  90.     else if mode = 2 then do
  91.         c = (EVENT.START.ticks - delta) + (delta * timeadj);
  92.         EVENT.START.CLOCKS = c // BARDATA.MEASURE
  93.         EVENT.START.BARS = c % BARDATA.MEASURE
  94.         if gotstop = 1 then do
  95.             b = EVENT.STOP.ticks + c - EVENT.START.ticks
  96.             EVENT.STOP.CLOCKS = b // BARDATA.MEASURE
  97.             EVENT.STOP.BARS = b % BARDATA.MEASURE
  98.             end
  99.         REPLEVENT
  100.         end
  101.     end
  102. ENDSCAN
  103.  
  104. MXPOINTER "normal"
  105.