// TouchOSC // Author: zacki // Date: 2018-08-13 // Version: 0.3 //@input MIDI_IN_1 MIDI "loopMIDI Port 1" //@input MIDI_IN_1 MIDI "Komplete Audio 6 MIDI" //@input MIDI_IN_1 MIDI "E-MU XMidi1X1" @input MIDI_IN_1 MIDI "Yamaha 01V96-1" //@output MIDI_OUT_1 MIDI "loopMIDI Port 1" //@output MIDI_OUT_1 MIDI "Komplete Audio 6 MIDI" //@output MIDI_OUT_1 MIDI "E-MU XMidi1X1" @output MIDI_OUT_1 MIDI "Yamaha 01V96-1" @input localhost_in OSC "localhost:8000" //@output localhost_out OSC "localhost:9000" // send to REAPER listen monitor or PureData @output localhost_out OSC "55.55.5.142:9000" // send to MotoG on WRT54 //@output localhost_out OSC "192.168.178.24:9000" // send to MotoG on FritzBox @init printf("Yamaha 01V96 OSC-Gateway v0.3\n\n"); // init variables active_in_faders = 12; meter_input_channel = 0; meter_input_comp_out = 0; meter_input_comp_gr = 4096; OSCSelectedChannel = 0; // Graphic init //gfx_init("Info", 320, 200); gfx_a = 1; function requestEQLowValue() ( sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x01\%c\xF7", OSCSelectedChannel); // request EQLowQ state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x02\%c\xF7", OSCSelectedChannel); // request EQLowF state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x03\%c\xF7", OSCSelectedChannel); // request EQLowG state midisend_str(MIDI_OUT_1, #dest); ); function requestEQLowMidValue() ( sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x05\%c\xF7", OSCSelectedChannel); // request EQLowMidQ state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x06\%c\xF7", OSCSelectedChannel); // request EQLowMidF state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x07\%c\xF7", OSCSelectedChannel); // request EQLowMidG state midisend_str(MIDI_OUT_1, #dest); ); function requestEQHighMidValue() ( sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x08\%c\xF7", OSCSelectedChannel); // request EQHighMidQ state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x09\%c\xF7", OSCSelectedChannel); // request EQHighMidF state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x0A\%c\xF7", OSCSelectedChannel); // request EQHighMidG state midisend_str(MIDI_OUT_1, #dest); ); function requestEQHighValue() ( sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x0B\%c\xF7", OSCSelectedChannel); // request EQHighQ state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x0C\%c\xF7", OSCSelectedChannel); // request EQHighF state midisend_str(MIDI_OUT_1, #dest); sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x0D\%c\xF7", OSCSelectedChannel); // request EQHighG state midisend_str(MIDI_OUT_1, #dest); ); function requestEQOnOffState() ( sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x20\x0F\%c\xF7", OSCSelectedChannel); // request EQ On/Off state midisend_str(MIDI_OUT_1, #dest); ); @timer // request input channel name timer_flag == 1 ? ( //sprintf(#dest, "\xF0\x43\x30\x3E\x0D\x02\x04\%c\%c\xF7", digit, sel_ch); // selected channel from console sprintf(#dest, "\xF0\x43\x30\x3E\x0D\x02\x04\%c\%c\xF7", digit, OSCSelectedChannel); // selected channel from phone midisend_str(MIDI_OUT_1, #dest); digit += 1; digit == 0x14 ? ( timer_flag = 0; digit = 4; oscsend(localhost_out, "s/EQ/ChannelName", #channel_name); ) ); // meter request counter01 += 1; counter01 == 400 ? ( counter01 = 0; // input - channel //sprintf(#dest, "\xF0\x43\x30\x3E\x0D\x21\x00\x00\%c\x00\x01\xF7", sel_ch); //midisend_str(MIDI_OUT_1, #dest); // input - comp out //sprintf(#dest, "\xF0\x43\x30\x3E\x0D\x21\x00\x02\%c\x00\x01\xF7", sel_ch); //midisend_str(MIDI_OUT_1, #dest); // input - comp GR //sprintf(#dest, "\xF0\x43\x30\x3E\x0D\x21\x00\x03\%c\x00\x01\xF7", sel_ch); //midisend_str(MIDI_OUT_1, #dest); ); // request 01V96 input fader values on keystroke 'r' gfx_getchar('r') ? ( printf("request 01V96 input fader values\n"); channel_number = 0; loop(active_in_faders, sprintf(#dest, "\xF0\x43\x30\x3E\x7F\x01\x1C\x00\%c\xF7", channel_number); midisend_str(MIDI_OUT_1, #dest); channel_number += 1; ); ); @midimsg /* receive SysEx messages from 01V96 */ str_getchar(oscstr, 5, 'cu') == 0x01 ? ( // get input fader values and send OSC messages str_getchar(oscstr, 6, 'cu') == 0x1c ? ( channel_number = str_getchar(oscstr, 8, 'cu'); faderval = (str_getchar(oscstr, 11, 'cu') << 7) + str_getchar(oscstr, 12, 'cu'); printf("01V96 Fader %02d: 0x%X\n", channel_number, faderval); oscsend(localhost_out, "f/Fader/fader%02d", faderval / 1023, channel_number + 1); ) : // get EQ values and send OSC messages str_getchar(oscstr, 6, 'cu') == 0x20 ? ( str_getchar(oscstr, 8, 'cu') == OSCSelectedChannel ? ( EQEncoderNumber = str_getchar(oscstr, 7, 'cu'); EQEncoderNumber == 0x01 ? ( EQLowQ = str_getchar(oscstr, 12, 'cu'); EQEncoderQ == 0x01 ? oscsend(localhost_out, "i/EQ/Q", EQLowQ); printf("Channel %02d EQLowQ value: %d\n", OSCSelectedChannel, EQLowQ); ) : EQEncoderNumber == 0x02 ? ( EQLowF = str_getchar(oscstr, 12, 'cu'); EQEncoderF == 0x02 ? oscsend(localhost_out, "i/EQ/F", EQLowF); printf("Channel %02d EQLowF value: %d\n", OSCSelectedChannel, EQLowF); ) : EQEncoderNumber == 0x03 ? ( EQLowG = (str_getchar(oscstr, 11, 'cu') << 7) + str_getchar(oscstr, 12, 'cu'); EQLowG > 8191 ? EQLowG -= 16384; // calculate 14bit twos-complement value EQEncoderG == 0x03 ? oscsend(localhost_out, "i/EQ/G", EQLowG); printf("Channel %02d EQLowG value: %d\n", OSCSelectedChannel, EQLowG); ) : EQEncoderNumber == 0x05 ? ( EQLowMidQ = str_getchar(oscstr, 12, 'cu'); EQEncoderQ == 0x05 ? oscsend(localhost_out, "i/EQ/Q", EQLowMidQ); printf("Channel %02d EQLowMidQ value: %d\n", OSCSelectedChannel, EQLowMidQ); ) : EQEncoderNumber == 0x06 ? ( EQLowMidF = str_getchar(oscstr, 12, 'cu'); EQEncoderF == 0x06 ? oscsend(localhost_out, "i/EQ/F", EQLowMidF); printf("Channel %02d EQLowMidF value: %d\n", OSCSelectedChannel, EQLowMidF); ) : EQEncoderNumber == 0x07 ? ( EQLowMidG = (str_getchar(oscstr, 11, 'cu') << 7) + str_getchar(oscstr, 12, 'cu'); EQLowMidG > 8191 ? EQLowMidG -= 16384; // calculate 14bit twos-complement value EQEncoderG == 0x07 ? oscsend(localhost_out, "i/EQ/G", EQLowMidG); printf("Channel %02d EQLowMidG value: %d\n", OSCSelectedChannel, EQLowMidG); ) : EQEncoderNumber == 0x08 ? ( EQHighMidQ = str_getchar(oscstr, 12, 'cu'); EQEncoderQ == 0x08 ? oscsend(localhost_out, "i/EQ/Q", EQHighMidQ); printf("Channel %02d EQHighMidQ value: %d\n", OSCSelectedChannel, EQHighMidQ); ) : EQEncoderNumber == 0x09 ? ( EQHighMidF = str_getchar(oscstr, 12, 'cu'); EQEncoderF == 0x09 ? oscsend(localhost_out, "i/EQ/F", EQHighMidF); printf("Channel %02d EQHighMidF value: %d\n", OSCSelectedChannel, EQHighMidF); ) : EQEncoderNumber == 0x0A ? ( EQHighMidG = (str_getchar(oscstr, 11, 'cu') << 7) + str_getchar(oscstr, 12, 'cu'); EQHighMidG > 8191 ? EQHighMidG -= 16384; // calculate 14bit twos-complement value EQEncoderG == 0x0A ? oscsend(localhost_out, "i/EQ/G", EQHighMidG); printf("Channel %02d EQHighMidG value: %d\n", OSCSelectedChannel, EQHighMidG); ) : EQEncoderNumber == 0x0B ? ( EQHighQ = str_getchar(oscstr, 12, 'cu'); EQEncoderQ == 0x0B ? oscsend(localhost_out, "i/EQ/Q", EQHighQ); printf("Channel %02d EQHighQ value: %d\n", OSCSelectedChannel, EQHighQ); ) : EQEncoderNumber == 0x0C ? ( EQHighF = str_getchar(oscstr, 12, 'cu'); EQEncoderF == 0x0C ? oscsend(localhost_out, "i/EQ/F", EQHighF); printf("Channel %02d EQHighF value: %d\n", OSCSelectedChannel, EQHighF); ) : EQEncoderNumber == 0x0D ? ( EQHighG = (str_getchar(oscstr, 11, 'cu') << 7) + str_getchar(oscstr, 12, 'cu'); EQHighG > 8191 ? EQHighG -= 16384; // Umrechnung Zweierkomplement 14bit Wert EQEncoderG == 0x0D ? oscsend(localhost_out, "i/EQ/G", EQHighG); printf("Channel %02d EQHighG value: %d\n", OSCSelectedChannel, EQHighG); ) : EQEncoderNumber == 0x0F ? ( EQOnOffState = str_getchar(oscstr, 12, 'cu'); oscsend(localhost_out, "b/EQ/OnOff", EQOnOffState); // TouchOSC button glow printf("Channel %02d EQ On/Off state: %d\n", OSCSelectedChannel, EQOnOffState); ); ); ); ) : // get channel name characters str_getchar(oscstr, 5, 'cu') == 0x02 ? ( str_getchar(oscstr, 6, 'cu') == 0x04 ? ( //printf("digit: 0x%02X / char: %c\n", str_getchar(oscstr, 7, 'cu'), str_getchar(oscstr, 12, 'cu')); sprintf(#name_char, "%c", str_getchar(oscstr, 12, 'cu')); #channel_name += #name_char; /*str_getchar(oscstr, 7, 'cu') == 0x13 ? ( printf("Channel Name: %s\n", #channel_name); #channel_name = ""; );*/ ); ) : // get meter data and send OSC messages str_getchar(oscstr, 5, 'cu') == 0x21 ? ( str_getchar(oscstr, 6, 'cu') == 0x00 ? ( str_getchar(oscstr, 8, 'cu') == sel_ch ? ( str_getchar(oscstr, 7, 'cu') == 0x00 ? ( meter_input_channel = (str_getchar(oscstr, 9, 'cu') * 128) + str_getchar(oscstr, 10, 'cu'); //printf("Meter - input channel: %0004d / hi: 0x%02X / lo: 0x%02X\n", meter_input_channel, str_getchar(oscstr, 9, 'cu'), str_getchar(oscstr, 10, 'cu')); oscsend(localhost_out, "f/Fader/meter%02d", meter_input_channel / 4096, sel_ch + 1); ) : str_getchar(oscstr, 7, 'cu') == 0x02 ? ( meter_input_comp_out = (str_getchar(oscstr, 9, 'cu') * 128) + str_getchar(oscstr, 10, 'cu'); //printf("Meter - input comp out: %0004d / hi: 0x%02X / lo: 0x%02X\n", meter_input_comp_out, str_getchar(oscstr, 9, 'cu'), str_getchar(oscstr, 10, 'cu')); ) : str_getchar(oscstr, 7, 'cu') == 0x03 ? ( meter_input_comp_gr = (str_getchar(oscstr, 9, 'cu') * 128) + str_getchar(oscstr, 10, 'cu'); //printf("Meter - input comp GR: %0004d / hi: 0x%02X / lo: 0x%02X\n", meter_input_comp_gr, str_getchar(oscstr, 9, 'cu'), str_getchar(oscstr, 10, 'cu')); ); ); ); ); @oscmsg /* receive OSC messages from OSC-Device (e.g. mobile phone) and send SysEx messages to 01V96 */ // receive Fader Tab oscmatch("/Fader", oscstr) ? ( printf("Fader Tab\n"); ); // receive fader from Fader Tab oscmatch("/Fader/fader*", oscstr) ? ( match("*%02d*", oscstr, fader_number); printf("Fader %02d %f\n", fader_number, oscparm()); fader_raw = (oscparm() * 1023) >> 0; // shift right 0 is used for conversion to int hi_byte = fader_raw >> 7; lo_byte = fader_raw - hi_byte * 128; //printf("OSC Fader: %02d / lo: 0x%02X / hi: 0x%02X\n", channel_number, lo_byte, hi_byte); sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x1C\x00\%c\x00\x00\%c\%c\xF7", fader_number - 1, hi_byte, lo_byte); midisend_str(MIDI_OUT_1, #dest); ); // receive select buttons from Fader Tab oscmatch("/Fader/select*", oscstr) ? ( match("*%02d*", oscstr, OSCSelectedChannel); OSCSelectedChannel -= 1; //oscsend(localhost_out, "s/EQ/ChannelName", #channel_name); printf("OSCSelectedChannel: %02d\n", OSCSelectedChannel); ); // receive EQ Tab oscmatch("/EQ", oscstr) ? ( EQEncoderQ = 0x01; EQEncoderF = 0x02; EQEncoderG = 0x03; requestEQLowValue(); requestEQLowMidValue(); requestEQHighMidValue(); requestEQHighValue(); requestEQOnOffState(); printf("EQ Tab\n"); ); // receive EQ previous button from EQ Tab oscmatch("/EQ/prev", oscstr) ? ( OSCSelectedChannel -= 1; OSCSelectedChannel < 0 ? (OSCSelectedChannel = 0); #channel_name = ""; digit = 4; timer_flag = 1; EQEncoderQ = 0x01; EQEncoderF = 0x02; EQEncoderG = 0x03; requestEQLowValue(); requestEQLowMidValue(); requestEQHighMidValue(); requestEQHighValue(); requestEQOnOffState(); printf("prev OSCSelectedChannel: %02d\n", OSCSelectedChannel); ); // receive EQ next button from EQ Tab oscmatch("/EQ/next", oscstr) ? ( OSCSelectedChannel += 1; OSCSelectedChannel > active_in_faders - 1 ? (OSCSelectedChannel = active_in_faders - 1); #channel_name = ""; digit = 4; timer_flag = 1; EQEncoderQ = 0x01; EQEncoderF = 0x02; EQEncoderG = 0x03; requestEQLowValue(); requestEQLowMidValue(); requestEQHighMidValue(); requestEQHighValue(); requestEQOnOffState(); printf("next OSCSelectedChannel: %02d\n", OSCSelectedChannel); ); // receive EQ low button oscmatch("/EQ/low", oscstr) ? ( requestEQLowValue(); EQEncoderQ = 0x01; EQEncoderF = 0x02; EQEncoderG = 0x03; printf("EQ Low button\n"); ); // receive EQ low-mid button oscmatch("/EQ/low-mid", oscstr) ? ( requestEQLowMidValue(); EQEncoderQ = 0x05; EQEncoderF = 0x06; EQEncoderG = 0x07; printf("EQ Low-Mid button\n"); ); // receive EQ high-mid button oscmatch("/EQ/high-mid", oscstr) ? ( requestEQHighMidValue(); EQEncoderQ = 0x08; EQEncoderF = 0x09; EQEncoderG = 0x0A; printf("EQ High-Mid button\n"); ); // receive EQ high button oscmatch("/EQ/high", oscstr) ? ( requestEQHighValue(); EQEncoderQ = 0x0B; EQEncoderF = 0x0C; EQEncoderG = 0x0D; printf("EQ High button\n"); ); // receive EQ Q Encoder value oscmatch("/EQ/Q", oscstr) ? ( sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x20\%c\%c\x00\x00\x00\%c\xF7", EQEncoderQ, OSCSelectedChannel, oscparm()); midisend_str(MIDI_OUT_1, #dest); printf("EQEncoderQ 0x%02X value: %d\n", EQEncoderQ, oscparm()); ); // receive EQ F Encoder value oscmatch("/EQ/F", oscstr) ? ( sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x20\%c\%c\x00\x00\x00\%c\xF7", EQEncoderF, OSCSelectedChannel, oscparm()); midisend_str(MIDI_OUT_1, #dest); printf("EQEncoderF 0x%02X value: %d\n", EQEncoderF, oscparm()); ); // receive EQ G Encoder value oscmatch("/EQ/G", oscstr) ? ( sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x20\%c\%c\x00\x00\x00\%c\xF7", EQEncoderG, OSCSelectedChannel, oscparm()); midisend_str(MIDI_OUT_1, #dest); printf("EQEncoderG 0x%02X value: %d\n", EQEncoderG, oscparm()); ); // receive EQ On/Off button oscmatch("/EQ/OnOff", oscstr) ? ( EQOnOffState ? ( sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x20\x0F\%c\x00\x00\x00\x00\xF7", OSCSelectedChannel); // EQ turn Off midisend_str(MIDI_OUT_1, #dest); EQOnOffState = 0; printf("EQ turn Off\n"); ) : ( sprintf(#dest, "\xF0\x43\x10\x3E\x7F\x01\x20\x0F\%c\x00\x00\x00\x01\xF7", OSCSelectedChannel); // EQ turn On midisend_str(MIDI_OUT_1, #dest); EQOnOffState = 1; printf("EQ turn On\n"); ); oscsend(localhost_out, "b/EQ/OnOff", EQOnOffState); // TouchOSC button glow );