From 5a41e823cf8c443fa2037d7d6cd41ce1a6d9ca07 Mon Sep 17 00:00:00 2001 From: Michael Schnell Date: Sat, 25 Jan 2025 10:29:26 +0100 Subject: [PATCH] Release Note On Delay Tool v1.0 initial release --- ...mschnellbschnellde_Note On Delay Tool.jsfx | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 MIDI/michaelschnellmschnellbschnellde_Note On Delay Tool.jsfx diff --git a/MIDI/michaelschnellmschnellbschnellde_Note On Delay Tool.jsfx b/MIDI/michaelschnellmschnellbschnellde_Note On Delay Tool.jsfx new file mode 100644 index 0000000..7444e6f --- /dev/null +++ b/MIDI/michaelschnellmschnellbschnellde_Note On Delay Tool.jsfx @@ -0,0 +1,154 @@ +desc: Note On Delay Tool +author: Michael Schnell (mschnell@bschnell.de) +version: 1.0 +changelog: initial release +about: + # Note On Delay + Tool modulates the Note-On and Note-Off time of the notes passing through, according to two parameters and a random amount. One of the two parameters can be controlled by Midi CC messages. + + It can be used to humanize recorded loops. E.g. feeding the first parameter by an envelope, the second by a random-walk fluctuation plugin (such as MIDI CC fluctuation), and adding some individual randomness to any note. Randomness for chords results in a melody-alike feeling. + + Parameters: + + "Input Channel" selects the Midi channel for the notes and the CC messages (or "Any" for all channels) + + "Controller for Delay 2" selects the (low resolution) CC message that is used to modulate the second delay (or "-" for no modulation by CC) + + "Controller Factor" sets the factor to be used when modulating Delay2 by CC messages + + "Delay Headroom (ms)" "Plugin Delay Compensation" (i.e. negative delay) imposed to allow for negative amount of delay modulation. The resulting negative delay is limited to this value. + + "Delay 1 (ms)" delay imposed on Note-On and related Note-Off events + + "Delay 2 (ms)" delay imposed on Note-On and related Note-Off events + + "Random (ms)" amount of random delay imposed on Note-On and related Note-Off events + + "Delay (ms)" displays the resulting delay + +slider1:0<0,16,1{Any,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Input Channel +slider2:0<0,128,1{-,0 Bank Sel M,1 Mod Wheel M,2 Breath M,3,4 Foot P M,5 Porta M,6 Data Entry M,7 Vol M,8 Balance M,9,10 Pan M,11 Expression M,12 Ctrl 1 M,13 Ctrl 2 M,14,15,16 GP Slider 1,17 GP Slider 2,18 GP Slider 3,19 GP Slider 4,20,21,22,23,24,25,26,27,28,29,30,31,32 Bank Sel L,33 Mod Wheel L,34 Breath L,35,36 Foot P L,37 Porta L,38 Data Entry L,39 Vol L,40 Balance L,41,42 Pan L,43 Expression L,44 Ctrl 1 L,45 Ctrl 2 L,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 Hold P sw,65 Porta sw,66 Sustenuto sw,67 Soft P sw,68 Legato P sw,69 Hold 2 P sw,70 S.Variation,71 S.Timbre,72 S.Release,73 S.Attack,74 S.Brightness,75 S.Ctrl 6,76 S.Ctrl 7,77 S.Ctrl 8,78 S.Ctrl 9,79 S.Ctrl 10,80 GP B.1 sw,81 GP B.2 sw,82 GP B.3 sw,83 GP B.4 sw,84,85,86,87,88,89,90,91 Effects Lv,92 Trem Lv,93 Chorus Lv,94 Celeste Lv,95 Phaser Lv,96 Data B. Inc,97 Data B. Dec,98 NRP L,99 NRP M,100 RP L,101 RP M,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127}>Controller for Delay 2 +slider3:1<0,8,0,0.1>Controller Factor +slider4:0<-250,0,1>Delay Headroom (ms) +slider5:0<-250,250,1>Delay 1 (ms) +slider6:0<-250,250,1>Delay 2 (ms) +slider7:0<0,100,1>Random (ms) + +slider10:0<-100,100,1>=> Delay (ms) + +in_pin:none +out_pin:none + + + +@init + statNoteOn = $x90; + statNoteOff = $x80; + statCC = 0xB0; + + + pdc_midi = 1; + pdc_bot_ch=0; + pdc_top_ch=0; + + note_buf = 0; + buf_start = 256; + buf_l=buf_r=buf_start; +// _compact = 0; + +@slider + inChannel = slider1-1; + modCC = slider2-1; + pdc = -floor(slider3 / 1000 * srate); + pdc_delay = pdc; + +@block +/* + __o0 = buf_start[0]; + __m0 = (buf_start[1] >> 4) & 0xF; + __n0 = (buf_start[1] >> 8) & 0xFF; + __v0 = (buf_start[1] >> 16) & 0xFF; + __o1 = buf_start[2]; + __m1 = (buf_start[3] >> 4) & 0xF; + __n1 = (buf_start[3] >> 8) & 0xFF; + __v1 = (buf_start[3] >> 16) & 0xFF; + __o2 = buf_start[4]; + __m2 = (buf_start[5] >> 4) & 0xF; + __n2 = (buf_start[5] >> 8) & 0xFF; + __v3 = (buf_start[5] >> 16) & 0xFF; + __o3 = buf_start[6]; + __m3 = (buf_start[7] >> 4) & 0xF; + __n3 = (buf_start[7] >> 8) & 0xFF; + __v3 = (buf_start[7] >> 16) & 0xFF; + __l = buf_r - buf_l; +*/ + + while (midirecv(offset, msg1, note, vel)) ( + status = msg1 & $xF0; + channel = msg1 & $x0F; + // Is it on our channel? + channel == inChannel || inChannel == -1 ? ( + // Is it a note event? + (status == statNoteOn) && (vel > 0) ? ( + r = slider7 * (rand(2)-1); + d = r + slider5 + slider6; + s10 = (d*10 | 0) / 10; + s10 < slider4 ? s10 = slider4; + slider10 = s10; + d = floor(d / 1000 * srate + 0.5); + delay_samples = d + pdc; + delay_samples < 0 ? delay_samples = 0; + + note_buf[note] = delay_samples; + buf_r[0] = delay_samples+offset; + buf_r[1] = (((vel << 8) + note) << 8) + msg1; + buf_r += 2; + msg1 = -1; + ) : status == statCC ? ( + note == modCC ? ( + slider6 = (vel - 63.5) * slider3; + ); + ) : (status == statNoteOff) || ((status == statNoteOn) && (vel == 0)) ? ( + del = note_buf[note]; + buf_r[0] = del+offset; + buf_r[1] = (((vel << 8) + note) << 8) + msg1; + buf_r += 2; + msg1 = -1; +// msg1 = statNoteON; vel = 0; // ???? for testing + ); + ); + msg1 >= 0 ? ( + midisend(offset, msg1, note, vel); + ); + ); + + +// process outgoing events + rd = buf_l; + while (rd> 8; + note = midi & 0xFF; + midi = midi >> 8; + vel = midi & 0xFF; + midisend(offs, msg, note, vel); + buf_l = (rd += 2); + ) : ( + rd[0] -= samplesblock; + rd += 2; + ); + ); + +// compact buf if needed + buf_l >= buf_r ? ( + buf_l=buf_r=buf_start; + ) : ( + buf_l > max(1024,buf_r*.5) ? ( +// _compact += 1; + (buf_r-=buf_l) > 0 ? memcpy(0,buf_l,buf_r) : buf_r=buf_start; + buf_l=buf_start; + ); + );