]> git.sesse.net Git - nageru/blobdiff - nageru/midi_mapping_dialog.cpp
Remove the unused frame_length parameter to AudioMixer::add_audio().
[nageru] / nageru / midi_mapping_dialog.cpp
index a3286b41dd3102d677661bc5efd465635181f8df..d27a0c2315e18c56f0c6005d0ef3d078d291fbf2 100644 (file)
 #include <limits>
 #include <string>
 
+#include "shared/controller_spin_box.h"
 #include "midi_mapper.h"
-#include "midi_mapping.pb.h"
+#include "nageru_midi_mapping.pb.h"
+#include "shared/midi_mapper_util.h"
 #include "shared/post_to_main_thread.h"
 #include "ui_midi_mapping.h"
 
@@ -103,16 +105,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<const MIDIControllerProto &>(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 +116,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<const MIDIButtonProto &>(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)
@@ -419,8 +406,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 +529,10 @@ pair<int, int> 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) {