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_maptokey
< prev
next >
Wrap
Text File
|
2007-12-03
|
1KB
|
66 lines
desc:MIDI map to key
slider1:0<0,11,1{C,C#,D,D#,E,F,F#,G,G#,A,A#,B}>key
slider3:0<0,127,1>note range low (passthru other notes)
slider4:127<0,127,1>note range high (passthru other notes)
@init
// maps a note to its nearest in-Cmaj note
tab2=16;
tab2[0]=0;
tab2[1]=2;
tab2[2]=2;
tab2[3]=4;
tab2[4]=4;
tab2[5]=5;
tab2[6]=5;
tab2[7]=7;
tab2[8]=7;
tab2[9]=9;
tab2[10]=11;
tab2[11]=11;
notetab=512;
memset(notetab,0,128);
@slider
key = slider1|0;
@block
while (
midirecv(ts,msg1,msg23) ?
(
m=msg1&240;
note=msg23&127;
(m == 8*16 || m==9*16) && note >= slider3 && note <= slider4 ?
(
oldnote=note;
note += 12-key;
noteidx=note%12;
octavebase=note-noteidx;
note=octavebase + tab2[noteidx];
note-=12-key;
(m == 9*16 && msg23>=256) ?
(
vel=(msg23/256)|0;
note >= 0 && note < 128 ? (
notetab[note]|=2^(12+ note-oldnote);
midisend(ts,9*16,note+vel*256); // send note on
);
) : (m == 8*16 || m == 9*16) ? (
note >= 0 && note < 128 ? (
a=notetab[note];
mask = 2^(12+note-oldnote);
(a&mask) ? ( notetab[note] = (a-=mask));
!a ? midisend(ts,8*16,note); // send note off
);
);
) :
(
midisend(ts,msg1,msg23);
);
bla=1;
);
);
@sample