Browse Source

feature: hold clear and wiggle pot clears automation for only that pot

dev_cleartrackcc
heck 7 months ago
parent
commit
666cb86c0b
  1. 5
      src/globals.hh
  2. 104
      src/main_perkons.cc

5
src/globals.hh

@ -41,6 +41,11 @@ namespace Heck {
} }
} // namespace Constants } // namespace Constants
namespace State {
bool record_mode{false};
bool clear_mode{false};
}
// Types // Types
using u8 = uint8_t; using u8 = uint8_t;
using u16 = uint16_t; using u16 = uint16_t;

104
src/main_perkons.cc

@ -150,7 +150,7 @@ namespace Heck {
} }
} }
void tracks_midi_in(ld::MidiEvent msg) void midi_in_from_uart_polling(ld::MidiEvent msg)
{ {
switch (msg.type) { switch (msg.type) {
case ld::MidiMessageType::NoteOn: { case ld::MidiMessageType::NoteOn: {
@ -159,44 +159,49 @@ namespace Heck {
} }
} break; } break;
case ld::MidiMessageType::ControlChange: { case ld::MidiMessageType::ControlChange: {
sequencer.midi_in(msg); if (State::clear_mode) {
ld::ControlChangeEvent cc = msg.AsControlChange(); ld::ControlChangeEvent cc = msg.AsControlChange();
float val_normalized = cc.value / 127.; sequencer.clear_track_cc(cc.channel, cc.control_number);
switch (cc.control_number) { } else {
// Pots sequencer.midi_in(msg);
case Constants::MIDI_Mapping::TRACK_PITCH: ld::ControlChangeEvent cc = msg.AsControlChange();
tracks[cc.channel].instrument->ctl(0, val_normalized); float val_normalized = cc.value / 127.;
break; switch (cc.control_number) {
case Constants::MIDI_Mapping::TRACK_DECAY: // Pots
tracks[cc.channel].decay(val_normalized); case Constants::MIDI_Mapping::TRACK_PITCH:
break; tracks[cc.channel].instrument->ctl(0, val_normalized);
case Constants::MIDI_Mapping::TRACK_PARAM1: break;
tracks[cc.channel].instrument->ctl(2, val_normalized); case Constants::MIDI_Mapping::TRACK_DECAY:
break; tracks[cc.channel].decay(val_normalized);
case Constants::MIDI_Mapping::TRACK_PARAM2: break;
tracks[cc.channel].instrument->ctl(3, val_normalized); case Constants::MIDI_Mapping::TRACK_PARAM1:
break; tracks[cc.channel].instrument->ctl(2, val_normalized);
case Constants::MIDI_Mapping::TRACK_FILTER: break;
tracks[cc.channel].filter(val_normalized); case Constants::MIDI_Mapping::TRACK_PARAM2:
break; tracks[cc.channel].instrument->ctl(3, val_normalized);
case Constants::MIDI_Mapping::TRACK_DRIVE: break;
tracks[cc.channel].drive(val_normalized); case Constants::MIDI_Mapping::TRACK_FILTER:
break; tracks[cc.channel].filter(val_normalized);
case Constants::MIDI_Mapping::TRACK_VOLUME: break;
tracks[cc.channel].volume(val_normalized); case Constants::MIDI_Mapping::TRACK_DRIVE:
break; tracks[cc.channel].drive(val_normalized);
// Switches break;
case Constants::MIDI_Mapping::TRACK_MODE1: case Constants::MIDI_Mapping::TRACK_VOLUME:
tracks[cc.channel].instrument->switch_mode1(int(val_normalized * 2.)); tracks[cc.channel].volume(val_normalized);
break; break;
case Constants::MIDI_Mapping::TRACK_MODE2: // Switches
tracks[cc.channel].instrument->switch_mode2(int(val_normalized * 2.)); case Constants::MIDI_Mapping::TRACK_MODE1:
break; tracks[cc.channel].instrument->switch_mode1(int(val_normalized * 2.));
case Constants::MIDI_Mapping::TRACK_FILTERMODE: break;
tracks[cc.channel].filtermode(val_normalized); case Constants::MIDI_Mapping::TRACK_MODE2:
break; tracks[cc.channel].instrument->switch_mode2(int(val_normalized * 2.));
default: break;
break; case Constants::MIDI_Mapping::TRACK_FILTERMODE:
tracks[cc.channel].filtermode(val_normalized);
break;
default:
break;
}
} }
} break; } break;
default: { default: {
@ -205,20 +210,20 @@ namespace Heck {
} }
} }
void midi_async_handler() void midi_in_from_uart_interrupt()
{ {
while (midi.HasEvents()) { while (midi.HasEvents()) {
ld::MidiEvent msg = midi.PopEvent(); ld::MidiEvent msg = midi.PopEvent();
event_log.PushBack(msg); event_log.PushBack(msg);
tracks_midi_in(msg); midi_in_from_uart_polling(msg);
} }
} }
void sequencer_midi_handler() void midi_in_from_sequencer()
{ {
std::vector<ld::MidiEvent> queue = sequencer.midi_out(); std::vector<ld::MidiEvent> queue = sequencer.midi_out();
for (ld::MidiEvent msg : queue) { for (ld::MidiEvent msg : queue) {
tracks_midi_in(msg); midi_in_from_uart_polling(msg);
} }
} }
@ -276,8 +281,8 @@ namespace Heck {
sequencer.next_step(); sequencer.next_step();
} }
sequencer_midi_handler(); midi_in_from_sequencer();
midi_async_handler(); midi_in_from_uart_interrupt();
// REC // REC
but_rec.Debounce(); but_rec.Debounce();
@ -286,8 +291,10 @@ namespace Heck {
but_record_current = but_record_new; but_record_current = but_record_new;
if (but_record_current) { if (but_record_current) {
hw.PrintLine("BUTTON RECORD ON"); hw.PrintLine("BUTTON RECORD ON");
State::record_mode = true;
} else { } else {
hw.PrintLine("BUTTON RECORD OFF"); hw.PrintLine("BUTTON RECORD OFF");
State::record_mode = false;
} }
sequencer.recording = but_record_current; sequencer.recording = but_record_current;
} }
@ -299,12 +306,17 @@ namespace Heck {
but_clear_current = but_clear_new; but_clear_current = but_clear_new;
if (but_clear_current) { if (but_clear_current) {
hw.PrintLine("BUTTON CLEAR ON"); hw.PrintLine("BUTTON CLEAR ON");
State::clear_mode = true;
} else { } else {
hw.PrintLine("BUTTON CLEAR OFF"); hw.PrintLine("BUTTON CLEAR OFF");
sequencer.clear_sequence(); State::clear_mode = false;
} }
} }
if (State::record_mode && State::clear_mode) {
sequencer.clear_sequence();
}
if (systick_now - midi_log_systick_last > 5) { if (systick_now - midi_log_systick_last > 5) {
midi_log_systick_last = systick_now; midi_log_systick_last = systick_now;
if (!event_log.IsEmpty()) { if (!event_log.IsEmpty()) {

Loading…
Cancel
Save