tags: jsfx 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; ```