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;