home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 July & August / PCWorld_2007-07-08_cd.bin / audio-video / reaper / reaper1861-install.exe / Effects / MIDI / midi_chordkey < prev    next >
Text File  |  2007-02-12  |  2KB  |  95 lines

  1. desc:MIDI chord-in-key (sort of)
  2. slider1:2<-24,24,1>notes in key advance for note 1
  3. slider2:4<-24,24,1>notes in key advance for note 2
  4. slider3:0<0,11,1{C,C#,D,D#,E,F,F#,G,G#,A,A#,B}>key
  5. slider4:1<0,1>velocity scale for additional notes
  6. slider5:0<0,127,1>note range low (passthru other notes)
  7. slider6:127<0,127,1>note range high (passthru other notes)
  8.  
  9. @init 
  10.  
  11. // maps a in-key note to a semitone note
  12. tab=0;
  13. tab[0]=0;
  14. tab[1]=2;
  15. tab[2]=4;
  16. tab[3]=5;
  17. tab[4]=7;
  18. tab[5]=9;
  19. tab[6]=11;
  20.  
  21. // maps a note to its nearest in-Cmaj note
  22. tab2=16;
  23. tab2[0]=0;
  24. tab2[1]=0;
  25. tab2[2]=2;
  26. tab2[3]=2;
  27. tab2[4]=4;
  28. tab2[5]=5;
  29. tab2[6]=5;
  30. tab2[7]=7;
  31. tab2[8]=7;
  32. tab2[9]=9;
  33. tab2[10]=9;
  34. tab2[11]=11;
  35.  
  36. @slider
  37. slider1|=0;
  38. slider2|=0;
  39. key = slider3|0;
  40.  
  41. @block
  42.  
  43. while (
  44. midirecv(ts,msg1,msg23) ? 
  45. (
  46.   m=msg1&240;
  47.   note=msg23&127;
  48.  
  49.   (m == 8*16 || m==9*16) && note >= slider5 && note <= slider6 ? 
  50.   (
  51.     note += 12-key;
  52.     noteidx=note%12;
  53.     octavebase=note-noteidx;
  54.  
  55.     n2=noteidx+tab[slider1%7];
  56.     note2 = octavebase + tab2[n2%12] + ((n2/12)|0)*12;
  57.  
  58.     n2=noteidx+tab[slider2%7];
  59.     note3 = octavebase + tab2[n2%12] + ((n2/12)|0)*12;
  60.  
  61.     note-=12-key;
  62.     note2-=12-key;
  63.     note3-=12-key;
  64.  
  65.  
  66.     (m == 9*16 && msg23>=256) ? 
  67.     (
  68.       vel=(msg23/256)|0;
  69.       vel<0?vel=0:vel>=127?vel=127:vel|=0;
  70.       vel2=vel*slider4;
  71.       vel2<0?vel2=0:vel2>=127?vel2=127:vel2|=0;
  72.       vel2 *= 256.0;
  73.       vel *= 256.0;
  74.       note >= 0 && note < 128 ? midisend(ts,9*16,note+vel); // send note on
  75.       note2 >= 0 && note2 < 128 ? midisend(ts,9*16,note2+vel2); // send note on
  76.       note3 >= 0 && note3 < 128 ? midisend(ts,9*16,note3+vel2); // send note on
  77.     ) : (m == 8*16 || m == 9*16) ? (
  78.       note >= 0 && note < 128 ? midisend(ts,8*16,note); // send note off
  79.       note2 >= 0 && note2 < 128 ?  midisend(ts,8*16,note2); // send note off
  80.       note3 >= 0 && note3 < 128 ? midisend(ts,8*16,note3); // send note off
  81.     );
  82.   ) : 
  83.   (
  84.     midisend(ts,msg1,msg23);
  85.   );
  86.   bla=1;
  87. );
  88. );
  89.  
  90.  
  91. @sample
  92.  
  93.  
  94.  
  95.