home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / MIDI / midi_arp < prev    next >
Text File  |  2007-12-03  |  3KB  |  154 lines

  1. desc: MIDI arpeggiator
  2. slider1:1<0.0,16,0.25>rate (x BPM)
  3. slider2:1<0.01,1,0.1>note length (0..1)
  4. slider3:0<0,3,1{DOWN,UP,DOWNALT,UPALT}>mode
  5. slider4:0<0,3,1>number of variants
  6. slider5:0<-64,64,1>variant 1
  7. slider6:0<-64,64,1>variant 2
  8. slider7:0<-64,64,1>variant 3
  9. slider8:127<0,127,1>velocity (0=use played velocity)
  10.  
  11. @init 
  12. notelist=0;
  13. notecnt=0;
  14. lastnote=-1;
  15.  
  16. pbincpos=0;
  17. pbnotepos=0;
  18. pbvarpos=0;
  19.  
  20. @slider 
  21. rate=slider1;
  22. notelen=slider2;
  23. notelen<0?notelen=0:notelen>1?notelen=1;
  24. notedir= (slider3&1)?1:-1;
  25. diralt=slider3&2;
  26. nvar=slider4;
  27. var1=slider5;
  28. var2=slider6;
  29. var3=slider7;
  30. velmode=slider8|0;
  31.  
  32. @block
  33.  
  34. lastnotecnt=notecnt;
  35.  
  36.  
  37. while (
  38. midirecv(ts,msg1,msg23) ? 
  39. (
  40.   m=msg1&240;
  41.   note=msg23&127;
  42.   (m == 9*16 && msg23>=256) ? 
  43.   (
  44.     notelist[note] < 0.001 ? (
  45.       notelist[note]=velmode ? velmode : ((msg23/256.0)|0);
  46.       notecnt+=1;
  47.     );
  48.   ) : (m == 8*16 || m == 9*16) ? (
  49.     notelist[note] > 0.001 ? (
  50.       lastnote==note ? (
  51.         midisend(ts,8*16,note); // send note off
  52.         lastnote=-1;
  53.       );
  54.           
  55.       notecnt-=1;
  56.       notelist[note]=0.0; 
  57.     );
  58.   ) : (
  59.     midisend(ts,msg1,msg23); 
  60.   );
  61.   bla=1;
  62. );
  63. );
  64. notecnt < 1 && lastnote>=0 ? 
  65. (
  66.   midisend(0,8*16,lastnote); // send note off
  67.   lastnote=-1;
  68. );   
  69.  
  70. spos=0;
  71. dinc=1/srate*(tempo/60)*rate;
  72.  
  73. notecnt > 0 && !lastnotecnt ? 
  74.   (
  75.     pbincpos=1;
  76.     pbnotepos=0;
  77.     pbvarpos=1000;
  78.   );
  79.  
  80. @sample
  81. pbincpos+=dinc;
  82. notecnt > 0 && pbincpos >= notelen ? (
  83.   lastnote>=0 ? 
  84.   (
  85.     midisend(spos,8*16,lastnote); // send note off
  86.     lastnote=-1;
  87.   );   
  88. );
  89. notecnt > 0 &&   pbincpos >= 1.0 ?
  90. (
  91.   pbincpos-=1;
  92.   // calc new lastnote
  93.   !diralt ? 
  94.   ( 
  95.     pbvarpos+=1;
  96.     pbvarpos > nvar || !notelist[pbnotepos] ? 
  97.     (
  98.       pbvarpos=0;
  99.       // next note
  100.       cnt=0;
  101.       while
  102.       (
  103.         cnt+=1;
  104.         pbnotepos += notedir;
  105.         pbnotepos > 127? pbnotepos=0 : pbnotepos<0 ? pbnotepos=127;
  106.         notelist[pbnotepos] > 0.001 ? 
  107.         (
  108.           pbnotepos >= 0 && pbnotepos < 128 ? (
  109.             lastnote=pbnotepos;
  110.             midisend(spos,9*16,lastnote+notelist[pbnotepos]*256); // send note on
  111.           );
  112.           tmp=0;
  113.         )     
  114.         : cnt < 128;
  115.       );
  116.     ) 
  117.     : 
  118.     ( 
  119.       lastnote=pbnotepos;
  120.       pbvarpos == 1? lastnote+=var1 : pbvarpos==2?lastnote+=var2:pbvarpos==3?lastnote+=var3;
  121.       lastnote >= 0 && lastnote < 128 ? (
  122.         midisend(spos,9*16,lastnote+notelist[pbnotepos]*256); // send note on
  123.       ) : lastnote=-1;
  124.     );
  125.   )
  126.   :
  127.   ( // alternate (notes first, then variants)
  128.     cnt=0;
  129.     while
  130.     (
  131.       cnt+=1;
  132.       pbnotepos += notedir;
  133.       turd=0;
  134.       pbnotepos > 127? pbnotepos=0 : pbnotepos<0 ? pbnotepos=127 : turd=1;
  135.       !turd ? (
  136.         pbvarpos+=1;
  137.         pbvarpos>nvar ? pbvarpos=0;
  138.       );
  139.       notelist[pbnotepos] > 0.001 ? 
  140.       (
  141.         lastnote=pbnotepos;
  142.         pbvarpos == 1? lastnote+=var1 : pbvarpos==2?lastnote+=var2:pbvarpos==3?lastnote+=var3;
  143.         midisend(spos,9*16,lastnote+notelist[pbnotepos]*256); // send note on
  144.         tmp=0;
  145.       )     
  146.       : cnt < 128;
  147.     );
  148.   );
  149. );
  150.  
  151. //spos+=1;
  152.  
  153.  
  154.