PDA

View Full Version : Midi Note Off ausfiltern


webGandalf
06-20-2010, 01:26 AM
Hallo zusammen

Ich suche nach einem Weg innerhalb eines Midi-Tracks das "Note Off" Event auszufiltern. Mir ist bewusst, dass das bei bspw. bei Syntis gefährlich sein kann. Wenn aber Sampels von einer Drum abgefeuert werden sollen, kann dies notwendig werden weil die Drum gleich nach dem "Note On" Event den "Note Off" hinterher schickt.

Im Moment mache ich das, indem ich MIDI-OX vorschalte und dort das "Note Off" Event ausfiltere und auf einen Virtuellen Midi-Port route. Ich würde das aber gerne direkt mittels einem FX im entsprechenden Track innerhalb von Reaper machen.

Gibt es da eine Möglichkeit? Alle Midi-Filter die ich finde sind nur auf reine Tonhöhen anwendbar und nicht auf Events.

Grüsse Dieter

gofer
06-20-2010, 04:04 AM
Man könnte sicherlich ein JS plugin stricken das Note-Offs (und Note-On velocity=0) rausfiltert, aber üblicherweise würde man dem Sampler sagen dass er das betreffende Sample im sogenannten "One Shot" Modus abspielen soll. Das heisst, dass das Sample nicht von einem Note-Off abgebrochen wird, sondern bis zum bittren Ende durchgespielt wird.
Das ist wesentlich ungefährlicher als Note-Offs komplett rauszufiltern. Ich kenne keinen Sampler der das nicht kann. Normalerweise ist es ein Abspielparameter auf Sample-Basis.
In Cockos' ReaSamplomatic heisst es "Obey note-off messages".

Mich
06-20-2010, 04:09 AM
Diese JesuSonic Script File sollte tun was du willst:

desc:No note off

@block

while(
midirecv(offset,msg1,msg23) ?
(
(msg1&$xF0) != $x80 ?
midisend(offset, msg1, msg23) : 1;
);
);

webGandalf
06-20-2010, 04:18 AM
Herzlichen Dank Ihr beide.

Ich verwende DigiDrum Pro welches leider keinen "On Shot" Modus kennt. Habe mich deshalb vorhin selber an ein JS Script gewagt - Mein erstes :)

Herausgekommen ist jetzt das folgende:

desc:"Note Off" Events will filter out for the Track

slider1:0<0,2,1{-,All Notes Off}>PANIC: All Notes Off

@init

@slider
slider1 == 1 ? (
panic = 1;
);

@block
while (
panic == 1 ? (
midisend(ts,$xB0,123|(0*256));
midisend(ts,$xB1,123|(0*256));
midisend(ts,$xB2,123|(0*256));
midisend(ts,$xB3,123|(0*256));
midisend(ts,$xB4,123|(0*256));
midisend(ts,$xB5,123|(0*256));
midisend(ts,$xB6,123|(0*256));
midisend(ts,$xB7,123|(0*256));
midisend(ts,$xB8,123|(0*256));
midisend(ts,$xB9,123|(0*256));
midisend(ts,$xBA,123|(0*256));
midisend(ts,$xBB,123|(0*256));
midisend(ts,$xBC,123|(0*256));
midisend(ts,$xBD,123|(0*256));
midisend(ts,$xBE,123|(0*256));
midisend(ts,$xBF,123|(0*256));
slider1 = 0;
panic = 0;
);
);

while (
midirecv(ts,msg1,msg23) ? (

statusHi = (msg1 / 16) | 0;
statusLo = msg1 - (statusHi * 16);

data2 = (msg23 / 256) | 0;
data1 = msg23 - (data2 * 256);

statusHi != 8 ? (
data2 != 0 ? (
midisend(ts,msg1,msg23)
);
);
);
);

@sample


Scheint zu funktionieren...
Und sollte es doch einmal passieren, dass dieses Script am falschen Ort eingesetzt wird und es zu Endlostönen kommt habe ich gleich noch versucht eine Panic-Funktion einzubauen. Bei mir scheint sie zu funktionieren. Ich hoffe das trifft auf alle Situationen zu, die ich mit diesem Script verursachen könnte.

Wenn da jemand noch einen Fehler findet bin ich natürlich für hilfe Dankbar.
Andernfalls ist jeder dem das dient herzlich eingeladen es selber zu verwenden.