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_maptokey < prev    next >
Text File  |  2007-02-12  |  1KB  |  66 lines

  1. desc:MIDI map to key
  2. slider1:0<0,11,1{C,C#,D,D#,E,F,F#,G,G#,A,A#,B}>key
  3. slider3:0<0,127,1>note range low (passthru other notes)
  4. slider4:127<0,127,1>note range high (passthru other notes)
  5. @init 
  6. // maps a note to its nearest in-Cmaj note
  7. tab2=16;
  8. tab2[0]=0;
  9. tab2[1]=2;
  10. tab2[2]=2;
  11. tab2[3]=4;
  12. tab2[4]=4;
  13. tab2[5]=5;
  14. tab2[6]=5;
  15. tab2[7]=7;
  16. tab2[8]=7;
  17. tab2[9]=9;
  18. tab2[10]=11;
  19. tab2[11]=11;
  20.  
  21. notetab=512;
  22. memset(notetab,0,128);
  23.  
  24. @slider
  25. key = slider1|0;
  26.  
  27. @block
  28. while (
  29. midirecv(ts,msg1,msg23) ? 
  30. (
  31.   m=msg1&240;
  32.   note=msg23&127;
  33.   (m == 8*16 || m==9*16) && note >= slider3 && note <= slider4 ? 
  34.   (
  35.     oldnote=note;
  36.     note += 12-key;
  37.  
  38.     noteidx=note%12;
  39.     octavebase=note-noteidx;
  40.     note=octavebase + tab2[noteidx];
  41.    
  42.     note-=12-key;
  43.     (m == 9*16 && msg23>=256) ? 
  44.     (
  45.       vel=(msg23/256)|0;
  46.       note >= 0 && note < 128 ? (
  47.         notetab[note]|=2^(12+ note-oldnote);
  48.         midisend(ts,9*16,note+vel*256); // send note on
  49.       );
  50.     ) : (m == 8*16 || m == 9*16) ? (
  51.       note >= 0 && note < 128 ? (
  52.         a=notetab[note];
  53.         mask = 2^(12+note-oldnote);
  54.         (a&mask) ? ( notetab[note] = (a-=mask));
  55.         !a ? midisend(ts,8*16,note); // send note off  
  56.       );
  57.     );
  58.   ) : 
  59.   (
  60.     midisend(ts,msg1,msg23);
  61.   );
  62.   bla=1;
  63. );
  64. );
  65. @sample
  66.