diff --git a/src/main_osp.cc b/src/main_osp.cc index 973a065..05599b5 100644 --- a/src/main_osp.cc +++ b/src/main_osp.cc @@ -165,84 +165,97 @@ namespace Heck::OSP { } } + void midi_dispatch_note(ld::MidiEvent msg, bool from_seq) + { + ld::DaisySeed::PrintLine( + "[%i] MIDI from seq=%i : NOTE - ch: %i, nr: %i, val: %i", + ld::System::GetNow(), + from_seq, + msg.channel, + msg.AsNoteOn().note, + msg.AsNoteOn().velocity); + if (msg.channel >= 0 && msg.channel < Constants::TRACK_COUNT) { + tracks[msg.channel].trigger(); + } + } + + void midi_dispatch_cc(ld::MidiEvent msg, bool from_seq) + { + ld::DaisySeed::PrintLine( + "[%i] MIDI from seq=%i : CC - ch: %i, nr: %i, val: %i", + ld::System::GetNow(), + from_seq, + msg.channel, + msg.AsControlChange().control_number, + msg.AsControlChange().value); + + const ld::ControlChangeEvent cc = msg.AsControlChange(); + if (State::clear_mode && !from_seq) { + ld::DaisySeed::PrintLine("Clear: ch: %i, cc: %i", cc.channel, cc.control_number); + sequencer.clear_track_cc(cc.channel, cc.control_number); + } else { + if (!from_seq) { + sequencer.midi_in(msg); + } + const float val_normalized = cc.value / 127.; + switch (cc.control_number) { + // Pots + case Constants::MIDI_Mapping::TRACK_PITCH: + tracks[cc.channel].instrument->ctl(0, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_DECAY: + tracks[cc.channel].decay(val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_PARAM1: + tracks[cc.channel].instrument->ctl(2, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_PARAM2: + tracks[cc.channel].instrument->ctl(3, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_FILTER: + tracks[cc.channel].filter(val_normalized); + delaytime = val_normalized; + break; + case Constants::MIDI_Mapping::TRACK_DRIVE: + tracks[cc.channel].drive(val_normalized); + delayfb = val_normalized; + break; + case Constants::MIDI_Mapping::TRACK_VOLUME: + tracks[cc.channel].volume(val_normalized); + break; + // Switches + case Constants::MIDI_Mapping::TRACK_ALGO: + tracks[cc.channel].instrument->switch_algo(int(val_normalized * 2.)); + break; + case Constants::MIDI_Mapping::TRACK_MODE: + tracks[cc.channel].instrument->switch_mode(int(val_normalized * 2.)); + break; + case Constants::MIDI_Mapping::TRACK_FILTERMODE: + tracks[cc.channel].filtermode(val_normalized); + break; + default: + break; + } + } + } + void midi_dispatch(ld::MidiEvent msg, bool from_seq) { switch (msg.type) { - case ld::MidiMessageType::NoteOn: { - ld::DaisySeed::PrintLine( - "MIDI from seq=%i : NOTE - ch: %i, nr: %i, val: %i", - from_seq, - msg.channel, - msg.AsNoteOn().note, - msg.AsNoteOn().velocity); - if (msg.channel >= 0 && msg.channel < Constants::TRACK_COUNT) { - tracks[msg.channel].trigger(); - } - } break; - case ld::MidiMessageType::ControlChange: { - ld::DaisySeed::PrintLine( - "MIDI from seq=%i : CC - ch: %i, nr: %i, val: %i", - from_seq, - msg.channel, - msg.AsControlChange().control_number, - msg.AsControlChange().value); - - const ld::ControlChangeEvent cc = msg.AsControlChange(); - if (State::clear_mode && !from_seq) { - ld::DaisySeed::PrintLine("Clear: ch: %i, cc: %i", cc.channel, cc.control_number); - sequencer.clear_track_cc(cc.channel, cc.control_number); - } else { - if (!from_seq) { - sequencer.midi_in(msg); - } - const float val_normalized = cc.value / 127.; - switch (cc.control_number) { - // Pots - case Constants::MIDI_Mapping::TRACK_PITCH: - tracks[cc.channel].instrument->ctl(0, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_DECAY: - tracks[cc.channel].decay(val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_PARAM1: - tracks[cc.channel].instrument->ctl(2, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_PARAM2: - tracks[cc.channel].instrument->ctl(3, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_FILTER: - tracks[cc.channel].filter(val_normalized); - delaytime = val_normalized; - break; - case Constants::MIDI_Mapping::TRACK_DRIVE: - tracks[cc.channel].drive(val_normalized); - delayfb = val_normalized; - break; - case Constants::MIDI_Mapping::TRACK_VOLUME: - tracks[cc.channel].volume(val_normalized); - break; - // Switches - case Constants::MIDI_Mapping::TRACK_ALGO: - tracks[cc.channel].instrument->switch_algo(int(val_normalized * 2.)); - break; - case Constants::MIDI_Mapping::TRACK_MODE: - tracks[cc.channel].instrument->switch_mode(int(val_normalized * 2.)); - break; - case Constants::MIDI_Mapping::TRACK_FILTERMODE: - tracks[cc.channel].filtermode(val_normalized); - break; - default: - break; - } - } - } break; - default: { + case ld::MidiMessageType::NoteOn: + midi_dispatch_note(msg, from_seq); + break; + case ld::MidiMessageType::ControlChange: + midi_dispatch_cc(msg, from_seq); + break; + default: + // Other MIDI message ld::DaisySeed::PrintLine( - "UNHANDLED MIDI UNHANDLED MIDI from seq=%i : CC - ch: %i", + "[%i] UNHANDLED MIDI UNHANDLED MIDI from seq=%i : CC - ch: %i", + ld::System::GetNow(), from_seq, msg.channel); - // Other MIDI message - } break; + break; } }