Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions MIDI/nait_MIDI Keytracked Velocity.jsfx
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
desc: MIDI Keytracked Velocity
author: Nait
version: 1.0
changelog: First release for Reapack
about:
Allows setting of the MIDI velocity based on keytracking (ex. high notes play give higher velocities, lower notes lower velocities).

Parameters
Keytracked Velocity Limit (Min/Max): Keytracking velocity will stay within this min/max range and scale accordingly. Does not affect played velocity (which is important to know for the "Keytrack Mode" parameter).

Note Range (Min/Max): Only played notes falling within this range will potentially have their velocity keytracked. Next parameter describes how they're handled if outside range.

How to Handle Notes (Below/Above) Note Range: If notes played are outside the note range, do you want hem to snap to the min/max limit, or have velocity as played?

Velocity Inversion:
- Normal: Higher notes have higher velocities.
- Invert: Lower notes have higher velocities.

Keytrack Mode:
- Never Keytrack: Essentially disables this plugin. This allows another easy way to toggle keytracking on/off. Only played velocity is used.
- Always Keytrack: Keytracking velocity is always used.
- Keytrack If Stronger: Will use keytracking velocity, unless played velocity is higher than what keytrack velocity would be.
- Keytrack If Softer: Will use keytracking velocity, unless played velocity is lower than what keytrack velocity would be.

slider1:0<0,127,1>Keytracked Velocity Limit (Min)
slider2:127<0,127,1>Keytracked Velocity Limit (Max)
slider3:0<0,127,1>Note Range (Min)
slider4:127<0,127,1>Note Range (Max)
slider5:0<0,1,1{Set to Min/Max Vel,Keep Original Velocity}>How to Handle Notes Below Note Range
slider6:0<0,1,1{Set to Min/Max Vel,Keep Original Velocity}>How to Handle Notes Above Note Range
slider7:0<0,1,1{Normal (High Notes = High Velocity),Invert (High Notes = Low Velocity)}>Velocity Inversion
slider8:1<0,3,1{Never Keytrack, Always Keytrack, Keytrack If Stronger, Keytrack If Softer}>Keytrack Mode

@init
NOTE_OFF = 0x80;
NOTE_ON = 0x90;

@slider
lowvel = min(slider1, slider2);
highvel = max(slider1, slider2);
lownote = min(slider3, slider4);
highnote = max(slider3, slider4);

// this will update how they display
slider1 = lowvel;
slider2 = highvel;
slider3 = lownote;
slider4 = highnote;

lowmode = slider5;
highmode = slider6;
invert = slider7;
keytrackmode = slider8;

@block
while (
midirecv(offset, msg1, msg23)
)
(
status = msg1 & 0xF0;
notenumber = msg23 & 0xFF; // note number
playedvel = (msg23 >> 8) & 0xFF; // velocity

// Check for Note On with velocity > 0, and within the note range
status == NOTE_ON && playedvel > 0 ? (
// Calculate Keytracking Velocity
notenumber >= lownote && notenumber <= highnote?(
// note values are in the set range
// Set velocity based on note number
range = max(1, highnote - lownote);
pos = (notenumber - lownote) / range;
invert ? pos = 1 - pos : pos = pos; // invert if invert is 1
keytrackedvel = floor(pos * (highvel - lowvel)) + lowvel;
) :
notenumber < lownote && lowmode == 0 ? (
// note value is below range
invert ? keytrackedvel = highvel : keytrackedvel = lowvel;
) :
notenumber > highnote && highmode == 0 ? (
// note value is above range
invert ? keytrackedvel = lowvel : keytrackedvel = highvel;
) : (
// else, keep the velocity as whatever it originally played at
keytrackedvel = playedvel;
);

// Apply Keytrack Mode
keytrackmode == 0 ? (
// Never Keytrack
finalvel = playedvel;
) :
keytrackmode == 1 ? (
// Always Keytrack
finalvel = keytrackedvel;
) :
keytrackmode == 2 ? (
// Keytrack if stronger than played
finalvel = max(keytrackedvel, playedvel);
) :
(
// Keytrack if softer than played
finalvel = min(keytrackedvel, playedvel);
);

msg23 = notenumber | (finalvel << 8);
);
midisend(offset, msg1, msg23);
);

@gfx 360 60
// For displaying of Note Value & Velocity, mainly for debugging.
gfx_a = 1;
gfx_r = gfx_g = gfx_b = 1;
gfx_x = 5;
gfx_y = 10;
gfx_drawstr("Midi Info: ");

gfx_x = 5;
gfx_y = 30;
gfx_drawstr("Note: ");
gfx_drawnumber(notenumber,0);
gfx_drawstr(" Velocity [Played/Keytracked/Final]: [");
gfx_drawnumber(playedvel,0);
gfx_drawstr("/");
gfx_drawnumber(keytrackedvel,0);
gfx_drawstr("/");
gfx_drawnumber(finalvel,0);
gfx_drawstr("]");