X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fmidi_mapping_dialog.cpp;h=76776d2205ad454a92fb65dc7e53d1697d6eceb6;hb=f81ae3be1aae619fe4ad022f55d95a4a83ace076;hp=a3286b41dd3102d677661bc5efd465635181f8df;hpb=b563b8903fa84bb7fd62d7d0b84b70cb26843dbf;p=nageru diff --git a/nageru/midi_mapping_dialog.cpp b/nageru/midi_mapping_dialog.cpp index a3286b4..76776d2 100644 --- a/nageru/midi_mapping_dialog.cpp +++ b/nageru/midi_mapping_dialog.cpp @@ -6,20 +6,28 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include #include #include #include +#include +#include #include "midi_mapper.h" #include "midi_mapping.pb.h" +#include "nageru_midi_mapping.pb.h" +#include "shared/controller_spin_box.h" +#include "shared/midi_device.h" +#include "shared/midi_mapper_util.h" #include "shared/post_to_main_thread.h" #include "ui_midi_mapping.h" @@ -86,6 +94,18 @@ vector global_lights = { { "Auto makeup gain is on", MIDIMappingBusProto::kAutoMakeupGainIsOnFieldNumber, 0 }, }; +vector global_video = { + { "Switch video channel", MIDIMappingBusProto::kSwitchVideoChannelFieldNumber, MIDIMappingProto::kSwitchVideoChannelBankFieldNumber }, + { "Apply transition", MIDIMappingBusProto::kApplyTransitionFieldNumber, MIDIMappingProto::kApplyTransitionBankFieldNumber }, +}; + +vector main_ui = { + { "Previous audio view", MIDIMappingBusProto::kPrevAudioViewFieldNumber, MIDIMappingProto::kPrevAudioViewBankFieldNumber }, + { "Next audio view", MIDIMappingBusProto::kNextAudioViewFieldNumber, MIDIMappingProto::kNextAudioViewBankFieldNumber }, + { "Begin new video segment", MIDIMappingBusProto::kBeginNewVideoSegmentFieldNumber, MIDIMappingProto::kBeginNewVideoSegmentBankFieldNumber }, + { "Exit Nageru", MIDIMappingBusProto::kExitFieldNumber, MIDIMappingProto::kExitBankFieldNumber }, +}; + namespace { int get_bank(const MIDIMappingProto &mapping_proto, int bank_field_number, int default_value) @@ -103,16 +123,8 @@ int get_controller_mapping(const MIDIMappingProto &mapping_proto, size_t bus_idx if (bus_idx >= size_t(mapping_proto.bus_mapping_size())) { return default_value; } - const MIDIMappingBusProto &bus_mapping = mapping_proto.bus_mapping(bus_idx); - const FieldDescriptor *descriptor = bus_mapping.GetDescriptor()->FindFieldByNumber(field_number); - const Reflection *bus_reflection = bus_mapping.GetReflection(); - if (!bus_reflection->HasField(bus_mapping, descriptor)) { - return default_value; - } - const MIDIControllerProto &controller_proto = - static_cast(bus_reflection->GetMessage(bus_mapping, descriptor)); - return controller_proto.controller_number(); + return get_controller_mapping_helper(bus_mapping, field_number, default_value); } int get_button_mapping(const MIDIMappingProto &mapping_proto, size_t bus_idx, int field_number, int default_value) @@ -122,14 +134,7 @@ int get_button_mapping(const MIDIMappingProto &mapping_proto, size_t bus_idx, in } const MIDIMappingBusProto &bus_mapping = mapping_proto.bus_mapping(bus_idx); - const FieldDescriptor *descriptor = bus_mapping.GetDescriptor()->FindFieldByNumber(field_number); - const Reflection *bus_reflection = bus_mapping.GetReflection(); - if (!bus_reflection->HasField(bus_mapping, descriptor)) { - return default_value; - } - const MIDIButtonProto &bus_proto = - static_cast(bus_reflection->GetMessage(bus_mapping, descriptor)); - return bus_proto.note_number(); + return get_button_mapping_helper(bus_mapping, field_number, default_value); } int get_light_mapping(const MIDIMappingProto &mapping_proto, size_t bus_idx, int field_number, int default_value) @@ -175,8 +180,10 @@ MIDIMappingDialog::MIDIMappingDialog(MIDIMapper *mapper) add_controls("Per-bus controllers", ControlType::CONTROLLER, SpinnerGroup::PER_BUS_CONTROLLERS, mapping_proto, per_bus_controllers); add_controls("Per-bus buttons", ControlType::BUTTON, SpinnerGroup::PER_BUS_BUTTONS, mapping_proto, per_bus_buttons); add_controls("Per-bus lights", ControlType::LIGHT, SpinnerGroup::PER_BUS_LIGHTS, mapping_proto, per_bus_lights); + add_controls("Video mixing", ControlType::BUTTON, SpinnerGroup::GLOBAL_BUTTONS, mapping_proto, global_video); add_controls("Global controllers", ControlType::CONTROLLER, SpinnerGroup::GLOBAL_CONTROLLERS, mapping_proto, global_controllers); add_controls("Global buttons", ControlType::BUTTON, SpinnerGroup::GLOBAL_BUTTONS, mapping_proto, global_buttons); + add_controls("Main UI", ControlType::BUTTON, SpinnerGroup::GLOBAL_BUTTONS, mapping_proto, main_ui); add_controls("Global lights", ControlType::LIGHT, SpinnerGroup::GLOBAL_LIGHTS, mapping_proto, global_lights); fill_controls_from_mapping(mapping_proto); @@ -419,8 +426,14 @@ void MIDIMappingDialog::add_controls(const string &heading, item->setText(0, QString::fromStdString(control.label + " ")); for (unsigned bus_idx = 0; bus_idx < num_buses; ++bus_idx) { - QSpinBox *spinner = new QSpinBox(this); - spinner->setRange(-1, 127); + QSpinBox *spinner; + if (control_type == ControlType::CONTROLLER) { + spinner = new ControllerSpinBox(this); + spinner->setRange(-1, 128); // 128 for pitch bend. + } else { + spinner = new QSpinBox(this); + spinner->setRange(-1, 127); + } spinner->setAutoFillBackground(true); spinner->setSpecialValueText("\u200d"); // Zero-width joiner (ie., empty). spinner->installEventFilter(this); // So we know when the focus changes. @@ -536,6 +549,10 @@ pair MIDIMappingDialog::guess_offset(unsigned bus_idx, MIDIMappingDial // The bus has a controller set that the source bus doesn't set. return not_found; } + if (source_spinner->value() == MIDIReceiver::PITCH_BEND_CONTROLLER) { + // It's impossible to interpolate across the pitch bend. + return not_found; + } int candidate_offset = spinner->value() - source_spinner->value(); if (!found_offset) {