Fix MidiBuffer::merge_in_place and add aggressive correctness checking.
[ardour.git] / libs / ardour / event_type_map.cc
index 3b4fefdceacc8a3cf3a6c6b5913d151bd93899e0..dd5b1a9149118b2535a140e211745b7d446e7792 100644 (file)
 
 */
 
-#include <ardour/types.h>
-#include <ardour/event_type_map.h>
-#include <evoral/Parameter.hpp>
-#include <evoral/midi_events.h>
-#include <evoral/MIDIParameters.hpp>
-#include <pbd/error.h>
-#include <pbd/compose.h>
+#include <cstdio>
+#include "ardour/types.h"
+#include "ardour/event_type_map.h"
+#include "evoral/Parameter.hpp"
+#include "evoral/midi_events.h"
+#include "evoral/MIDIParameters.hpp"
+#include "pbd/error.h"
+#include "pbd/compose.h"
 
 using namespace std;
 
@@ -48,10 +49,11 @@ uint8_t
 EventTypeMap::parameter_midi_type(const Evoral::Parameter& param) const
 {
        switch (param.type()) {
-       case MidiCCAutomation:              return MIDI_CMD_CONTROL; break; 
-       case MidiPgmChangeAutomation:       return MIDI_CMD_PGM_CHANGE; break; 
-       case MidiChannelPressureAutomation: return MIDI_CMD_CHANNEL_PRESSURE; break; 
-       case MidiPitchBenderAutomation:     return MIDI_CMD_BENDER; break; 
+       case MidiCCAutomation:              return MIDI_CMD_CONTROL; break;
+       case MidiPgmChangeAutomation:       return MIDI_CMD_PGM_CHANGE; break;
+       case MidiChannelPressureAutomation: return MIDI_CMD_CHANNEL_PRESSURE; break;
+       case MidiPitchBenderAutomation:     return MIDI_CMD_BENDER; break;
+       case MidiSystemExclusiveAutomation: return MIDI_CMD_COMMON_SYSEX; break;
        default: return 0;
        }
 }
@@ -64,6 +66,7 @@ EventTypeMap::midi_event_type(uint8_t status) const
        case MIDI_CMD_PGM_CHANGE:       return MidiPgmChangeAutomation; break;
        case MIDI_CMD_CHANNEL_PRESSURE: return MidiChannelPressureAutomation; break;
        case MIDI_CMD_BENDER:           return MidiPitchBenderAutomation; break;
+       case MIDI_CMD_COMMON_SYSEX:     return MidiSystemExclusiveAutomation; break;
        default: return 0;
        }
 }
@@ -75,11 +78,11 @@ EventTypeMap::is_integer(const Evoral::Parameter& param) const
                        && param.type() <= MidiChannelPressureAutomation);
 }
 
-Evoral::ControlList::InterpolationStyle 
+Evoral::ControlList::InterpolationStyle
 EventTypeMap::interpolation_of(const Evoral::Parameter& param)
 {
        switch (param.type()) {
-       case MidiCCAutomation:              
+       case MidiCCAutomation:
                switch (param.id()) {
                case MIDI_CTL_LSB_BANK:
                case MIDI_CTL_MSB_BANK:
@@ -115,20 +118,17 @@ EventTypeMap::interpolation_of(const Evoral::Parameter& param)
                case MIDI_CTL_OMNI_ON:
                case MIDI_CTL_MONO:
                case MIDI_CTL_POLY:
-                       
                        return Evoral::ControlList::Discrete;
                        break;
-
                default: return Evoral::ControlList::Linear; break;
                }
-               
-               break; 
-               
-       case MidiPgmChangeAutomation:       return Evoral::ControlList::Discrete; break; 
-       case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break; 
-       case MidiPitchBenderAutomation:     return Evoral::ControlList::Linear; break; 
+               break;
+       case MidiPgmChangeAutomation:       return Evoral::ControlList::Discrete; break;
+       case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break;
+       case MidiPitchBenderAutomation:     return Evoral::ControlList::Linear; break;
        default: assert(false);
        }
+       return Evoral::ControlList::Linear; // Not reached, suppress warnings
 }
 
 
@@ -164,8 +164,10 @@ EventTypeMap::new_parameter(uint32_t type, uint8_t channel, uint32_t id) const
                Evoral::MIDI::controller_range(min, max, normal); break;
        case MidiPitchBenderAutomation:
                Evoral::MIDI::bender_range(min, max, normal); break;
+       case MidiSystemExclusiveAutomation:
+               return p;
        }
-       
+
        p.set_range(type, min, max, normal);
        return p;
 }