diff --git a/config/forge.cfg b/config/forge.cfg index 70bec76..858233f 100644 --- a/config/forge.cfg +++ b/config/forge.cfg @@ -10,6 +10,7 @@ UNIFORM_IN_FPS_PREFIX=iInputFPS UNIFORM_SEED_PREFIX=seed UNIFORM_STATE_PREFIX=state UNIFORM_TEX_PREFIX=tex +UNIFORM_SRC_PREFIX=midi TEX_COUNT=10 @@ -31,13 +32,112 @@ FRAG_6_OUT=8 FRAG_7_OUT=9 FRAG_8_OUT=0 +# TODO not like that SUB_TYPE_COUNT=3 SUB_1_PREFIX=src_ SUB_2_PREFIX=fx_ SUB_3_PREFIX=mix_ -SUB_VARIANT_COUNT=16 +SUB_VARIANT_COUNT=15 + +# MIDI MIDI_HW=hw:CARD=nanoKONTROL2 SELECT_PAGE_COUNT=3 -SELECT_PAGE1= \ No newline at end of file +SELECT_PAGE_1=60 +SELECT_PAGE_2=61 +SELECT_PAGE_3=62 + +SELECT_ITEM_COUNT=5 +SELECT_ITEM_1=43 +SELECT_ITEM_2=44 +SELECT_ITEM_3=42 +SELECT_ITEM_4=41 +SELECT_ITEM_5=45 + +SELECT_TARGET_COUNT=5 +SELECT_TARGET_1=32 +SELECT_TARGET_2=64 +SELECT_TARGET_3=36 +SELECT_TARGET_4=68 +SELECT_TARGET_5=52 + +SRC_COUNT=3 + +SRC_1_ACTIVE_COUNT=2 +SRC_1_ACTIVE_1=32 +SRC_1_ACTIVE_2=64 +SRC_1_COUNT=7 +SRC_1_1_X=33 +SRC_1_1_Y=49 +SRC_1_1_Z=65 +SRC_1_2_X=1 +SRC_1_2_Y=17 +SRC_1_2_Z= +SRC_1_3_X=34 +SRC_1_3_Y=50 +SRC_1_3_Z=66 +SRC_1_4_X=2 +SRC_1_4_Y=18 +SRC_1_4_Z= +SRC_1_5_X=35 +SRC_1_5_Y=51 +SRC_1_5_Z=67 +SRC_1_6_X=3 +SRC_1_6_Y=19 +SRC_1_6_Z= + +SRC_2_ACTIVE_COUNT=3 +SRC_2_ACTIVE_1=36 +SRC_2_ACTIVE_2=68 +SRC_2_ACTIVE_3=52 +SRC_2_COUNT=7 +SRC_2_1_X=37 +SRC_2_1_Y=53 +SRC_2_1_Z=69 +SRC_2_2_X=5 +SRC_2_2_Y=21 +SRC_2_2_Z= +SRC_2_3_X=38 +SRC_2_3_Y=54 +SRC_2_3_Z=70 +SRC_2_4_X=6 +SRC_2_4_Y=22 +SRC_2_4_Z= +SRC_2_5_X=39 +SRC_2_5_Y=55 +SRC_2_5_Z=71 +SRC_2_6_X=7 +SRC_2_6_Y=23 +SRC_2_6_Z= +SRC_2_7_X=4 +SRC_2_7_Y=20 +SRC_2_7_Z= + +SRC_3_COUNT=2 +SRC_3_1_X=48 +SRC_3_1_Y=58 +SRC_3_1_Z=59 +SRC_3_2_X=0 +SRC_3_2_Y=16 +SRC_3_2_Z= + +FADER_COUNT=16 +FADER_1=0 +FADER_2=1 +FADER_3=2 +FADER_4=3 +FADER_5=4 +FADER_6=5 +FADER_7=6 +FADER_8=7 +FADER_9=16 +FADER_10=17 +FADER_11=18 +FADER_12=19 +FADER_13=20 +FADER_14=21 +FADER_15=22 +FADER_16=23 + +TAP_TEMPO=46 \ No newline at end of file diff --git a/src/forge.c b/src/forge.c index 1633c8b..6d28da5 100644 --- a/src/forge.c +++ b/src/forge.c @@ -212,6 +212,11 @@ static void key_callback(Window *window, int key, } } +static void midi_callback(unsigned char code, float value) { + log_debug("midi: %d %.2f", code, value); + midi_write(midi, code, value); +} + static void loop(bool hr) { if (hr) { hot_reload(); @@ -264,7 +269,7 @@ void forge_run(Parameters params) { if (midi.error) { params.demo = true; } else { - if (!midi_background_listen(midi, context)) { + if (!midi_background_listen(midi, context, midi_callback)) { return; } } diff --git a/src/midi.c b/src/midi.c index dd613ee..3265a26 100644 --- a/src/midi.c +++ b/src/midi.c @@ -20,7 +20,19 @@ MidiDevice midi_open(char *name) { return device; } -bool midi_background_listen(MidiDevice device, SharedContext *context) { +void midi_write(MidiDevice device, unsigned char code, float value) { + unsigned char buffer[3]; + + buffer[0] = 0xB0; + buffer[1] = code; + buffer[2] = (unsigned char)(256 * value); + + snd_rawmidi_write(device.output, buffer, 3); +} + +bool midi_background_listen(MidiDevice device, SharedContext *context, + void (*event_callback)(unsigned char code, + float value)) { pid_t pid; int bytes_read; unsigned char buffer[3]; @@ -38,7 +50,9 @@ bool midi_background_listen(MidiDevice device, SharedContext *context) { while (!context->stop) { bytes_read = snd_rawmidi_read(device.input, buffer, 3); if (bytes_read == 3) { - log_debug("midi: %d %.2f", buffer[1], (float)buffer[2] / 256); + event_callback(buffer[1], (float)buffer[2] / 256.0); + log_debug("midi: %02x %d %.2f", buffer[0], buffer[1], + (float)buffer[2] / 256); } } diff --git a/src/midi.h b/src/midi.h index 27ab570..3fda3a5 100644 --- a/src/midi.h +++ b/src/midi.h @@ -4,6 +4,9 @@ #define MIDI_H MidiDevice midi_open(char *name); -bool midi_background_listen(MidiDevice device, SharedContext *context); +void midi_write(MidiDevice device, unsigned char code, float value); +bool midi_background_listen(MidiDevice device, SharedContext *context, + void (*event_callback)(unsigned char code, + float value)); #endif /* MIDI_H */ \ No newline at end of file