]> git.sesse.net Git - nageru/commitdiff
Add support for a master speed MIDI light.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 17 Jan 2019 23:47:37 +0000 (00:47 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Thu, 17 Jan 2019 23:47:37 +0000 (00:47 +0100)
futatabi/behringer_cmd_pl1.midimapping
futatabi/futatabi_midi_mapping.proto
futatabi/mainwindow.cpp
futatabi/midi_mapper.cpp
futatabi/midi_mapper.h

index 44e478aee6f39b8ce9430b697d0cf1f4d1319311..edd5a05e5a63dbbefe9cc673bcdc2e1cd67543d8 100644 (file)
@@ -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 }
index d29a23de76d30bf25d8c12801d2412c7cfba7c6d..9714d2d672d4289f15de86729974f8ac934eaf64 100644 (file)
@@ -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;
index 189102b88cdf63e8659e8c1fe7e75de5ab95510a..6c250187cde4f73f6b96cb50cdf8e231a607e26d 100644 (file)
@@ -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);
        });
 }
 
index 93e367a77aa1ad0987c1a0f40e38372f90c0f14f..c675820fb3a40ef3a3244818a0fdb249a5460858 100644 (file)
@@ -8,6 +8,7 @@
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/message.h>
 #include <google/protobuf/text_format.h>
+#include <math.h>
 #include <pthread.h>
 #include <poll.h>
 #include <stdint.h>
@@ -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);
index c1d6639858d1c697795692e05f16d6883a5263db..98ea6113ab6a7435f5c77c59c17b425bcbcb2de4 100644 (file)
@@ -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<LightState> play_enabled_light{Off};
        std::atomic<LightState> locked_light{On};
        std::atomic<int> current_highlighted_camera{-1};
+       std::atomic<float> current_speed{1.0f};
 
        MIDIDevice midi_device;
 };