desc:midi flipper

in_pin:none
out_pin:none

@init
    ext_noinit = 1;
    ext_midi_bus = 1;
    NOTE_ON = 9;
    NOTE_OFF = 8;
    
    msg_count = 0;

@slider

@block
    play_state > 0 ? transport_was_running = 1;

    while (
        midirecv(mpos, msg1, msg23) ? (
            msg = (msg1 / 16) | 0;
            channel = 1 + msg1 - (msg * 16);
            msg_num = msg23 & 127;
            msg_value = (msg23 / 256) | 0;
            msg_count +=1;
        
            msg == NOTE_ON && msg_value > 0 ? (
                msg1 = NOTE_OFF * 16 + stored_channel -1;
                msg23 = 0 * 256 + stored_num;
                msg_count > 1 ? midisend(mpos, msg1, msg23);

                stored_channel = channel;
                stored_num = msg_num;
                stored_vel = msg_value;
            ):(  
            msg == NOTE_OFF || (msg == NOTE_ON && msg_value == 0) ? (
                msg1 = NOTE_ON * 16 + stored_channel -1;
                msg23 = stored_vel * 256 + stored_num;
                msg_count > 1 ? midisend(mpos, msg1, msg23);
            ); );
        );
    );

// 
    transport_was_running && play_state == 0 ? (
        msg1 = NOTE_OFF * 16 + stored_channel -1;
        msg23 = 0 * 256 + stored_num;
        midisend(mpos, msg1, msg23);
        transport_was_running = 0;
    );
    
@sample
