From 6da5e74d3e13c307de29bd540ff4ce8371000efd Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 18 Jan 2019 00:47:37 +0100 Subject: [PATCH] Add support for a master speed MIDI light. --- futatabi/behringer_cmd_pl1.midimapping | 3 +++ futatabi/futatabi_midi_mapping.proto | 3 +++ futatabi/mainwindow.cpp | 2 ++ futatabi/midi_mapper.cpp | 10 ++++++++++ futatabi/midi_mapper.h | 5 +++++ 5 files changed, 23 insertions(+) diff --git a/futatabi/behringer_cmd_pl1.midimapping b/futatabi/behringer_cmd_pl1.midimapping index 44e478a..edd5a05 100644 --- a/futatabi/behringer_cmd_pl1.midimapping +++ b/futatabi/behringer_cmd_pl1.midimapping @@ -41,6 +41,9 @@ preview_ready: { note_number: 27 velocity: 2 } # The slider (pitch bend) is mapped to master speed. master_speed: { controller_number: 128 } +master_speed_light: { controller_number: 10 } +master_speed_light_min: 1 +master_speed_light_max: 16 # Master speed lock is mapped to lock. toggle_lock: { note_number: 25 } diff --git a/futatabi/futatabi_midi_mapping.proto b/futatabi/futatabi_midi_mapping.proto index d29a23d..9714d2d 100644 --- a/futatabi/futatabi_midi_mapping.proto +++ b/futatabi/futatabi_midi_mapping.proto @@ -31,6 +31,9 @@ message MIDIMappingProto { optional MIDIControllerProto master_speed = 34; optional int32 master_speed_bank = 35; + optional MIDIControllerProto master_speed_light = 42; // NOTE: Controller, not light. + optional int32 master_speed_light_min = 43; + optional int32 master_speed_light_max = 44 [default=128]; // Exclusive. // Buttons. optional MIDIButtonProto preview = 18; diff --git a/futatabi/mainwindow.cpp b/futatabi/mainwindow.cpp index 189102b..6c25018 100644 --- a/futatabi/mainwindow.cpp +++ b/futatabi/mainwindow.cpp @@ -648,6 +648,7 @@ void MainWindow::speed_slider_changed(int percent) float speed = percent / 100.0f; ui->speed_lock_btn->setText(QString::fromStdString(" " + to_string(percent) + "%")); live_player->set_master_speed(speed); + midi_mapper.set_speed_light(speed); } void MainWindow::speed_lock_clicked() @@ -1302,6 +1303,7 @@ void MainWindow::set_master_speed(float speed) ui->speed_lock_btn->setText(QString::fromStdString(" " + to_string(percent) + "%")); live_player->set_master_speed(speed); + midi_mapper.set_speed_light(speed); }); } diff --git a/futatabi/midi_mapper.cpp b/futatabi/midi_mapper.cpp index 93e367a..c675820 100644 --- a/futatabi/midi_mapper.cpp +++ b/futatabi/midi_mapper.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -245,6 +246,15 @@ void MIDIMapper::update_lights_lock_held() activate_mapped_light(camera, CameraMIDIMappingProto::kIsCurrentFieldNumber, &active_lights); } + // Master speed light. + if (mapping_proto->has_master_speed_light()) { + unsigned controller = mapping_proto->master_speed_light().controller_number(); + unsigned min = mapping_proto->master_speed_light_min(); + unsigned max = mapping_proto->master_speed_light_max(); + int speed_light_value = lrintf((max - min - 1) * current_speed / 2.0f) + min; + active_lights[MIDIDevice::LightKey{MIDIDevice::LightKey::CONTROLLER, controller}] = speed_light_value; + } + // These are always enabled right now. activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueInEnabledFieldNumber, &active_lights); activate_mapped_light(*mapping_proto, MIDIMappingProto::kCueOutEnabledFieldNumber, &active_lights); diff --git a/futatabi/midi_mapper.h b/futatabi/midi_mapper.h index c1d6639..98ea611 100644 --- a/futatabi/midi_mapper.h +++ b/futatabi/midi_mapper.h @@ -83,6 +83,10 @@ public: current_highlighted_camera = stream_idx; refresh_lights(); } + void set_speed_light(float speed) { // Goes from 0.0 to 2.0. + current_speed = speed; + refresh_lights(); + } // MIDIReceiver. void controller_received(int controller, int value) override; @@ -111,6 +115,7 @@ private: std::atomic play_enabled_light{Off}; std::atomic locked_light{On}; std::atomic current_highlighted_camera{-1}; + std::atomic current_speed{1.0f}; MIDIDevice midi_device; }; -- 2.39.2