|
@ -117,9 +117,9 @@ namespace Heck::OSP { |
|
|
sig_osp += tracks[3].nextsample(); |
|
|
sig_osp += tracks[3].nextsample(); |
|
|
|
|
|
|
|
|
sig_bus = sig_osp + sig_in[i]; |
|
|
sig_bus = sig_osp + sig_in[i]; |
|
|
dly1.delayfb_ = delayfb; |
|
|
// dly1.delayfb_ = delayfb;
|
|
|
dly1.delaytime_ = delaytime; |
|
|
// dly1.delaytime_ = delaytime;
|
|
|
sig_bus += dly1.process(sig_bus); |
|
|
// sig_bus += dly1.process(sig_bus);
|
|
|
sig_out[i] = sig_bus; |
|
|
sig_out[i] = sig_bus; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -165,12 +165,19 @@ namespace Heck::OSP { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void midi_dispatch_note(ld::MidiEvent msg, bool from_seq) |
|
|
|
|
|
|
|
|
enum class MidiSource : u8 { |
|
|
|
|
|
UART = 0, |
|
|
|
|
|
SEQUENCER = 1 |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void midi_dispatch_note(ld::MidiEvent msg, MidiSource source) |
|
|
{ |
|
|
{ |
|
|
ld::DaisySeed::PrintLine( |
|
|
ld::DaisySeed::PrintLine( |
|
|
"[%i] MIDI from seq=%i : NOTE - ch: %i, nr: %i, val: %i", |
|
|
"[%i] MIDI from seq=%i : NOTE - ch: %i, nr: %i, val: %i", |
|
|
ld::System::GetNow(), |
|
|
ld::System::GetNow(), |
|
|
from_seq, |
|
|
source, |
|
|
msg.channel, |
|
|
msg.channel, |
|
|
msg.AsNoteOn().note, |
|
|
msg.AsNoteOn().note, |
|
|
msg.AsNoteOn().velocity); |
|
|
msg.AsNoteOn().velocity); |
|
@ -179,82 +186,84 @@ namespace Heck::OSP { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void midi_dispatch_cc(ld::MidiEvent msg, bool from_seq) |
|
|
void midi_dispatch_cc(ld::MidiEvent msg, MidiSource source) |
|
|
{ |
|
|
{ |
|
|
|
|
|
const ld::ControlChangeEvent msg_cc = msg.AsControlChange(); |
|
|
|
|
|
|
|
|
ld::DaisySeed::PrintLine( |
|
|
ld::DaisySeed::PrintLine( |
|
|
"[%i] MIDI from seq=%i : CC - ch: %i, nr: %i, val: %i", |
|
|
"[%i] MIDI from seq=%i : CC - ch: %i, nr: %i, val: %i", |
|
|
ld::System::GetNow(), |
|
|
ld::System::GetNow(), |
|
|
from_seq, |
|
|
source, |
|
|
msg.channel, |
|
|
msg_cc.channel, |
|
|
msg.AsControlChange().control_number, |
|
|
msg_cc.control_number, |
|
|
msg.AsControlChange().value); |
|
|
msg_cc.value); |
|
|
|
|
|
|
|
|
const ld::ControlChangeEvent cc = msg.AsControlChange(); |
|
|
if (source == MidiSource::UART) { |
|
|
if (State::clear_mode && !from_seq) { |
|
|
if (!State::clear_mode) { |
|
|
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); |
|
|
sequencer.midi_in(msg); |
|
|
|
|
|
} else { |
|
|
|
|
|
ld::DaisySeed::PrintLine("Clear: ch: %i, cc: %i", msg_cc.channel, msg_cc.control_number); |
|
|
|
|
|
sequencer.clear_track_cc(msg_cc.channel, msg_cc.control_number); |
|
|
} |
|
|
} |
|
|
const float val_normalized = cc.value / 127.; |
|
|
} |
|
|
switch (cc.control_number) { |
|
|
|
|
|
// Pots
|
|
|
const float cc_val_normalized = float(msg_cc.value) / 128.F; |
|
|
case Constants::MIDI_Mapping::TRACK_PITCH: |
|
|
switch (msg_cc.control_number) { |
|
|
tracks[cc.channel].instrument->ctl(0, val_normalized); |
|
|
// Pots
|
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_PITCH: |
|
|
case Constants::MIDI_Mapping::TRACK_DECAY: |
|
|
tracks[msg_cc.channel].instrument->ctl(0, cc_val_normalized); |
|
|
tracks[cc.channel].decay(val_normalized); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_DECAY: |
|
|
case Constants::MIDI_Mapping::TRACK_PARAM1: |
|
|
tracks[msg_cc.channel].decay(cc_val_normalized); |
|
|
tracks[cc.channel].instrument->ctl(2, val_normalized); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_PARAM1: |
|
|
case Constants::MIDI_Mapping::TRACK_PARAM2: |
|
|
tracks[msg_cc.channel].instrument->ctl(2, cc_val_normalized); |
|
|
tracks[cc.channel].instrument->ctl(3, val_normalized); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_PARAM2: |
|
|
case Constants::MIDI_Mapping::TRACK_FILTER: |
|
|
tracks[msg_cc.channel].instrument->ctl(3, cc_val_normalized); |
|
|
tracks[cc.channel].filter(val_normalized); |
|
|
break; |
|
|
delaytime = val_normalized; |
|
|
case Constants::MIDI_Mapping::TRACK_FILTER: |
|
|
break; |
|
|
tracks[msg_cc.channel].filter(cc_val_normalized); |
|
|
case Constants::MIDI_Mapping::TRACK_DRIVE: |
|
|
delaytime = cc_val_normalized; |
|
|
tracks[cc.channel].drive(val_normalized); |
|
|
break; |
|
|
delayfb = val_normalized; |
|
|
case Constants::MIDI_Mapping::TRACK_DRIVE: |
|
|
break; |
|
|
tracks[msg_cc.channel].drive(cc_val_normalized); |
|
|
case Constants::MIDI_Mapping::TRACK_VOLUME: |
|
|
delayfb = cc_val_normalized; |
|
|
tracks[cc.channel].volume(val_normalized); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_VOLUME: |
|
|
// Switches
|
|
|
tracks[msg_cc.channel].volume(cc_val_normalized); |
|
|
case Constants::MIDI_Mapping::TRACK_ALGO: |
|
|
break; |
|
|
tracks[cc.channel].instrument->switch_algo(int(val_normalized * 2.)); |
|
|
// Switches
|
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_ALGO: |
|
|
case Constants::MIDI_Mapping::TRACK_MODE: |
|
|
tracks[msg_cc.channel].instrument->switch_algo(int(cc_val_normalized * 2.)); |
|
|
tracks[cc.channel].instrument->switch_mode(int(val_normalized * 2.)); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_MODE: |
|
|
case Constants::MIDI_Mapping::TRACK_FILTERMODE: |
|
|
tracks[msg_cc.channel].instrument->switch_mode(int(cc_val_normalized * 2.)); |
|
|
tracks[cc.channel].filtermode(val_normalized); |
|
|
break; |
|
|
break; |
|
|
case Constants::MIDI_Mapping::TRACK_FILTERMODE: |
|
|
default: |
|
|
tracks[msg_cc.channel].filtermode(cc_val_normalized); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
default: |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void midi_dispatch(ld::MidiEvent msg, bool from_seq) |
|
|
void midi_dispatch(ld::MidiEvent msg, MidiSource source) |
|
|
{ |
|
|
{ |
|
|
switch (msg.type) { |
|
|
switch (msg.type) { |
|
|
case ld::MidiMessageType::NoteOn: |
|
|
case ld::MidiMessageType::NoteOn: |
|
|
midi_dispatch_note(msg, from_seq); |
|
|
midi_dispatch_note(msg, source); |
|
|
break; |
|
|
break; |
|
|
case ld::MidiMessageType::ControlChange: |
|
|
case ld::MidiMessageType::ControlChange: |
|
|
midi_dispatch_cc(msg, from_seq); |
|
|
midi_dispatch_cc(msg, source); |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
// Other MIDI message
|
|
|
// Other MIDI message
|
|
|
ld::DaisySeed::PrintLine( |
|
|
// ld::DaisySeed::PrintLine(
|
|
|
"[%i] UNHANDLED MIDI UNHANDLED MIDI from seq=%i : CC - ch: %i", |
|
|
// "[%i] UNHANDLED MIDI UNHANDLED MIDI from seq=%i : CC - ch: %i",
|
|
|
ld::System::GetNow(), |
|
|
// ld::System::GetNow(),
|
|
|
from_seq, |
|
|
// from_seq,
|
|
|
msg.channel); |
|
|
// msg.channel);
|
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -263,13 +272,13 @@ namespace Heck::OSP { |
|
|
{ |
|
|
{ |
|
|
while (midi.HasEvents()) { |
|
|
while (midi.HasEvents()) { |
|
|
ld::MidiEvent msg = midi.PopEvent(); |
|
|
ld::MidiEvent msg = midi.PopEvent(); |
|
|
midi_dispatch(msg, false); |
|
|
midi_dispatch(msg, MidiSource::UART); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void midi_from_sequencer() |
|
|
void midi_from_sequencer() |
|
|
{ |
|
|
{ |
|
|
sequencer.midi_out([](ld::MidiEvent msg) { midi_dispatch(msg, true); }); |
|
|
sequencer.midi_out([](ld::MidiEvent msg) { midi_dispatch(msg, MidiSource::SEQUENCER); }); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//-------------------------------------------------
|
|
|
//-------------------------------------------------
|
|
|