Dup Ver Goto 📝

MidiPulse0

PT2/music/reaper-jsfx jsfx does not exist
To
70 lines, 224 words, 1781 chars Page 'MidiPulse0' does not exist.

This generates a sequence of noteon/noteoff for a given pitch.

desc:MIDI Pulse 0 JDA

slider1:0.75<0.01,0.99,0.01>Gate Length (%)
slider2:48<36,84,1>MIDI Pitch
slider3:2<0,6,1{1/1,1/2,1/4,1/8,1/16,1/32,1/64}>Base value
slider4:1<1,16,1>Value multiplier

in_pin:none
out_pin:none

@init
playing_note = -1;
current_note = -1;
is_playing = 0;
note_period = floor(srate/2);
gate = slider1;
p = slider3;
pp = pow(2,p);
base_value = 1/pow(2,slider3);
note_value = base_value * slider4;
// tempo = bpm
// tempo/60 = bps
// 60/tempo = spb
// 4*60/tempo = secs per 4beats
// 4*60/tempo * note_value = secs per note
note_period = floor(srate*4*60*note_value/tempo);
note_length = floor(note_period*gate);
next_note_on = 0;
next_note_off = next_note_on + note_length;

@slider
p = slider3;
pp = pow(2,p);
gate = slider1;
base_value = 1/pp;
note_value = base_value * slider4;
note_period = floor(srate*4*60*note_value/tempo);
note_length = floor(note_period*gate);
current_note = slider2;
// Fixed tempo 120bpm = 2bps = 0.5spb, so start note every samplesblock/2

@block
note_period = floor(srate*4*60*note_value/tempo);
note_length = floor(note_period*gate);
(next_note_on < 0) ? (next_note_on = 0);
(next_note_off < 0) ? (next_note_off = next_note_on + note_length);

while(next_note_on < samplesblock || next_note_off < samplesblock)
(
  (next_note_on < next_note_off) ? (
    ts = next_note_on;
    msg1 = 0x90;
    msg23 = current_note | (0x70 << 8);
    midisend(ts,msg1,msg23);
    next_note_on += note_period;
    playing_note = current_note;
  ) : (
    ts = next_note_off;
    msg1 = 0x80;
    msg23 = playing_note | (0x70 << 8);
    midisend(ts,msg1,msg23);
    next_note_off = next_note_on + note_length;
  )
);
next_note_on -= samplesblock;
next_note_off -= samplesblock;