diff options
author | David Robillard <d@drobilla.net> | 2016-11-07 05:14:55 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-12-03 15:28:19 -0500 |
commit | 398a318934769dae51efe972f7ffdefc52ea2963 (patch) | |
tree | 5b68a8fac44f0c154e7e00fd45d9e7f2c16e35fb | |
parent | bfbc4566ad82573a57e1ec84d583f308ee35eef0 (diff) |
Fix event type and parameter type confusion
I'm not sure if this is really the best way to do event types (should it
just be a completely static enum in evoral, or completely dynamic and
provided by the type map, or a mix like currently?), but previously the
event type was frequently set to either total garbage, or parameter
types, which are a different thing.
This fixes all those cases, and makes Evoral::EventType an enum so the
compiler will warn about implicit conversions from int.
-rw-r--r-- | libs/ardour/ardour/event_type_map.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_buffer.h | 7 | ||||
-rw-r--r-- | libs/ardour/async_midi_port.cc | 2 | ||||
-rw-r--r-- | libs/ardour/event_type_map.cc | 6 | ||||
-rw-r--r-- | libs/ardour/import.cc | 2 | ||||
-rw-r--r-- | libs/ardour/midi_buffer.cc | 2 | ||||
-rw-r--r-- | libs/ardour/midi_diskstream.cc | 2 | ||||
-rw-r--r-- | libs/ardour/midi_state_tracker.cc | 6 | ||||
-rw-r--r-- | libs/ardour/midi_track.cc | 5 | ||||
-rw-r--r-- | libs/ardour/smf_source.cc | 18 | ||||
-rw-r--r-- | libs/evoral/evoral/Event.hpp | 4 | ||||
-rw-r--r-- | libs/evoral/evoral/Parameter.hpp | 15 | ||||
-rw-r--r-- | libs/evoral/evoral/PatchChange.hpp | 6 | ||||
-rw-r--r-- | libs/evoral/evoral/TypeMap.hpp | 6 | ||||
-rw-r--r-- | libs/evoral/evoral/types.hpp | 21 | ||||
-rw-r--r-- | libs/evoral/src/Note.cpp | 5 | ||||
-rw-r--r-- | libs/evoral/src/Sequence.cpp | 33 | ||||
-rw-r--r-- | libs/evoral/test/SMFTest.cpp | 2 | ||||
-rw-r--r-- | libs/evoral/test/SequenceTest.cpp | 6 | ||||
-rw-r--r-- | libs/evoral/test/SequenceTest.hpp | 15 |
20 files changed, 91 insertions, 76 deletions
diff --git a/libs/ardour/ardour/event_type_map.h b/libs/ardour/ardour/event_type_map.h index d7adfa8f62..b3aa05ee78 100644 --- a/libs/ardour/ardour/event_type_map.h +++ b/libs/ardour/ardour/event_type_map.h @@ -43,7 +43,9 @@ public: bool type_is_midi(uint32_t type) const; uint8_t parameter_midi_type(const Evoral::Parameter& param) const; - uint32_t midi_event_type(uint8_t status) const; + + Evoral::ParameterType midi_parameter_type(const uint8_t* buf, uint32_t len) const; + Evoral::ControlList::InterpolationStyle interpolation_of(const Evoral::Parameter& param); Evoral::Parameter from_symbol(const std::string& str) const; diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h index 1b0bf2a151..cc48e28d61 100644 --- a/libs/ardour/ardour/midi_buffer.h +++ b/libs/ardour/ardour/midi_buffer.h @@ -20,8 +20,9 @@ #ifndef __ardour_midi_buffer_h__ #define __ardour_midi_buffer_h__ -#include "evoral/midi_util.h" #include "evoral/EventSink.hpp" +#include "evoral/midi_util.h" +#include "evoral/types.hpp" #include "midi++/event.h" @@ -93,7 +94,7 @@ public: uint8_t* ev_start = buffer->_data + offset + sizeof(TimeType); int event_size = Evoral::midi_event_size(ev_start); assert(event_size >= 0); - return EventType(midi_parameter_type(*ev_start), + return EventType(Evoral::MIDI_EVENT, *(reinterpret_cast<TimeType*>((uintptr_t)(buffer->_data + offset))), event_size, ev_start); } @@ -166,8 +167,6 @@ public: return iterator (*this, i.offset); } - uint8_t* data() const { return _data; } - /** * returns true if the message with the second argument as its MIDI * status byte should preceed the message with the first argument as diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc index ce8ab40a01..f7147676b0 100644 --- a/libs/ardour/async_midi_port.cc +++ b/libs/ardour/async_midi_port.cc @@ -143,7 +143,7 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes) if (!have_timer) { when += (*b).time(); } - input_fifo.write (when, (Evoral::EventType) 0, (*b).size(), (*b).buffer()); + input_fifo.write (when, Evoral::NO_EVENT, (*b).size(), (*b).buffer()); } if (!mb.empty()) { diff --git a/libs/ardour/event_type_map.cc b/libs/ardour/event_type_map.cc index 87fe4bc6e1..ca7b51eb27 100644 --- a/libs/ardour/event_type_map.cc +++ b/libs/ardour/event_type_map.cc @@ -62,10 +62,10 @@ EventTypeMap::parameter_midi_type(const Evoral::Parameter& param) const return ARDOUR::parameter_midi_type((AutomationType)param.type()); } -uint32_t -EventTypeMap::midi_event_type(uint8_t status) const +Evoral::ParameterType +EventTypeMap::midi_parameter_type(const uint8_t* buf, uint32_t len) const { - return (uint32_t)ARDOUR::midi_parameter_type(status); + return (uint32_t)ARDOUR::midi_parameter_type(buf[0]); } Evoral::ControlList::InterpolationStyle diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 36dc48e651..d441494ad7 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -418,7 +418,7 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, smfs->append_event_beats( source_lock, Evoral::Event<Evoral::Beats>( - 0, + Evoral::MIDI_EVENT, Evoral::Beats::ticks_at_rate(t, source->ppqn()), size, buf)); diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc index 652be5290c..adad9c35dc 100644 --- a/libs/ardour/midi_buffer.cc +++ b/libs/ardour/midi_buffer.cc @@ -85,7 +85,7 @@ MidiBuffer::copy(MidiBuffer const * const copy) { assert(_capacity >= copy->size ()); _size = copy->size (); - memcpy(_data, copy->data(), _size); + memcpy(_data, copy->_data, _size); } diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 22a3df1145..675d1db0bf 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -445,7 +445,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t } if (!filter || !filter->filter(ev.buffer(), ev.size())) { - _capture_buf->write(event_time, ev.type(), ev.size(), ev.buffer()); + _capture_buf->write(event_time, ev.event_type(), ev.size(), ev.buffer()); } } g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes); diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc index 17ecd10e94..4374c06463 100644 --- a/libs/ardour/midi_state_tracker.cc +++ b/libs/ardour/midi_state_tracker.cc @@ -123,7 +123,7 @@ MidiStateTracker::resolve_notes (MidiBuffer &dst, framepos_t time) while (_active_notes[note + 128 * channel]) { uint8_t buffer[3] = { ((uint8_t) (MIDI_CMD_NOTE_OFF | channel)), uint8_t (note), 0 }; Evoral::Event<MidiBuffer::TimeType> noteoff - (MIDI_CMD_NOTE_OFF, time, 3, buffer, false); + (Evoral::MIDI_EVENT, time, 3, buffer, false); /* note that we do not care about failure from push_back() ... should we warn someone ? */ @@ -157,7 +157,7 @@ MidiStateTracker::resolve_notes (Evoral::EventSink<framepos_t> &dst, framepos_t /* note that we do not care about failure from write() ... should we warn someone ? */ - dst.write (time, midi_parameter_type (buf[0]), 3, buf); + dst.write (time, Evoral::MIDI_EVENT, 3, buf); _active_notes[note + 128 * channel]--; DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1: EVS-resolved note %2/%3 at %4\n", this, (int) note, (int) channel, time)); @@ -181,7 +181,7 @@ MidiStateTracker::resolve_notes (MidiSource& src, const MidiSource::Lock& lock, for (int channel = 0; channel < 16; ++channel) { for (int note = 0; note < 128; ++note) { while (_active_notes[note + 128 * channel]) { - Evoral::Event<Evoral::Beats> ev ((MIDI_CMD_NOTE_OFF|channel), time, 3, 0, true); + Evoral::Event<Evoral::Beats> ev (Evoral::MIDI_EVENT, time, 3, 0, true); ev.set_type (MIDI_CMD_NOTE_OFF); ev.set_channel (channel); ev.set_note (note); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 69291f1cce..c17bc916d9 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -557,7 +557,7 @@ MidiTrack::push_midi_input_to_step_edit_ringbuffer (framecnt_t nframes) if (ev.is_note_on()) { /* we don't care about the time for this purpose */ - _step_edit_ring_buffer.write (0, ev.type(), ev.size(), ev.buffer()); + _step_edit_ring_buffer.write (0, ev.event_type(), ev.size(), ev.buffer()); } } } @@ -689,8 +689,7 @@ MidiTrack::write_immediate_event(size_t size, const uint8_t* buf) cerr << "WARNING: Ignoring illegal immediate MIDI event" << endl; return false; } - const uint32_t type = midi_parameter_type(buf[0]); - return (_immediate_events.write (0, type, size, buf) == size); + return (_immediate_events.write (0, Evoral::MIDI_EVENT, size, buf) == size); } void diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index bcd3e43749..6a05ab706d 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -231,7 +231,6 @@ SMFSource::read_unlocked (const Lock& lock, // Output parameters for read_event (which will allocate scratch in buffer as needed) uint32_t ev_delta_t = 0; - uint32_t ev_type = 0; uint32_t ev_size = 0; uint8_t* ev_buffer = 0; @@ -277,10 +276,8 @@ SMFSource::read_unlocked (const Lock& lock, continue; } - ev_type = midi_parameter_type(ev_buffer[0]); - - DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF read_unlocked delta %1, time %2, buf[0] %3, type %4\n", - ev_delta_t, time, ev_buffer[0], ev_type)); + DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF read_unlocked delta %1, time %2, buf[0] %3\n", + ev_delta_t, time, ev_buffer[0])); assert(time >= start_ticks); @@ -295,7 +292,7 @@ SMFSource::read_unlocked (const Lock& lock, if (ev_frame_time < start + duration) { if (!filter || !filter->filter(ev_buffer, ev_size)) { - destination.write (ev_frame_time, ev_type, ev_size, ev_buffer); + destination.write (ev_frame_time, Evoral::MIDI_EVENT, ev_size, ev_buffer); if (tracker) { tracker->track(ev_buffer); } @@ -377,7 +374,7 @@ SMFSource::write_unlocked (const Lock& lock, time -= position; ev.set(buf, size, time); - ev.set_event_type(midi_parameter_type(ev.buffer()[0])); + ev.set_event_type(Evoral::MIDI_EVENT); ev.set_id(Evoral::next_event_id()); if (!(ev.is_channel_event() || ev.is_smf_meta_event() || ev.is_sysex())) { @@ -674,7 +671,6 @@ SMFSource::load_model (const Glib::Threads::Mutex::Lock& lock, bool force_reload if (!have_event_id) { event_id = Evoral::next_event_id(); } - const uint32_t event_type = midi_parameter_type(buf[0]); const Evoral::Beats event_time = Evoral::Beats::ticks_at_rate(time, ppqn()); #ifndef NDEBUG std::string ss; @@ -685,13 +681,13 @@ SMFSource::load_model (const Glib::Threads::Mutex::Lock& lock, bool force_reload ss += b; } - DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF %7 load model delta %1, time %2, size %3 buf %4, type %5 id %6\n", - delta_t, time, size, ss , event_type, event_id, name())); + DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF %7 load model delta %1, time %2, size %3 buf %4, id %6\n", + delta_t, time, size, ss, event_id, name())); #endif eventlist.push_back(make_pair ( new Evoral::Event<Evoral::Beats> ( - event_type, event_time, + Evoral::MIDI_EVENT, event_time, size, buf, true) , event_id)); diff --git a/libs/evoral/evoral/Event.hpp b/libs/evoral/evoral/Event.hpp index 526513b3fe..696fb995ab 100644 --- a/libs/evoral/evoral/Event.hpp +++ b/libs/evoral/evoral/Event.hpp @@ -48,7 +48,7 @@ template<typename Time> class LIBEVORAL_API Event { public: #ifdef EVORAL_EVENT_ALLOC - Event(EventType type=0, Time time=Time(), uint32_t size=0, uint8_t* buf=NULL, bool alloc=false); + Event(EventType type=NO_EVENT, Time time=Time(), uint32_t size=0, uint8_t* buf=NULL, bool alloc=false); Event(EventType type, Time time, uint32_t size, const uint8_t* buf); @@ -108,7 +108,7 @@ public: } inline void clear() { - _type = 0; + _type = NO_EVENT; _original_time = Time(); _nominal_time = Time(); _size = 0; diff --git a/libs/evoral/evoral/Parameter.hpp b/libs/evoral/evoral/Parameter.hpp index 1412699b4d..2614a03d86 100644 --- a/libs/evoral/evoral/Parameter.hpp +++ b/libs/evoral/evoral/Parameter.hpp @@ -25,6 +25,7 @@ #include <boost/shared_ptr.hpp> #include "evoral/visibility.h" +#include "evoral/types.hpp" namespace Evoral { @@ -40,13 +41,13 @@ namespace Evoral { class LIBEVORAL_API Parameter { public: - inline Parameter(uint32_t type, uint8_t channel=0, uint32_t id=0) + inline Parameter(ParameterType type, uint8_t channel=0, uint32_t id=0) : _type(type), _id(id), _channel(channel) {} - inline uint32_t type() const { return _type; } - inline uint8_t channel() const { return _channel; } - inline uint32_t id() const { return _id; } + inline ParameterType type() const { return _type; } + inline uint8_t channel() const { return _channel; } + inline uint32_t id() const { return _id; } /** Equivalence operator * It is obvious from the definition that this operator @@ -80,9 +81,9 @@ public: inline operator bool() const { return (_type != 0); } private: - uint32_t _type; - uint32_t _id; - uint8_t _channel; + ParameterType _type; + uint32_t _id; + uint8_t _channel; }; } // namespace Evoral diff --git a/libs/evoral/evoral/PatchChange.hpp b/libs/evoral/evoral/PatchChange.hpp index a775a72cc3..90d3dba732 100644 --- a/libs/evoral/evoral/PatchChange.hpp +++ b/libs/evoral/evoral/PatchChange.hpp @@ -39,9 +39,9 @@ public: * @param b Bank number (counted from 0, 14-bit). */ PatchChange (Time t, uint8_t c, uint8_t p, int b) - : _bank_change_msb (0, t, 3, 0, true) - , _bank_change_lsb (0, t, 3, 0, true) - , _program_change (0, t, 2, 0, true) + : _bank_change_msb (MIDI_EVENT, t, 3, 0, true) + , _bank_change_lsb (MIDI_EVENT, t, 3, 0, true) + , _program_change (MIDI_EVENT, t, 2, 0, true) { _bank_change_msb.buffer()[0] = MIDI_CMD_CONTROL | c; _bank_change_msb.buffer()[1] = MIDI_CTL_MSB_BANK; diff --git a/libs/evoral/evoral/TypeMap.hpp b/libs/evoral/evoral/TypeMap.hpp index d09439daa6..0ebc81370b 100644 --- a/libs/evoral/evoral/TypeMap.hpp +++ b/libs/evoral/evoral/TypeMap.hpp @@ -24,6 +24,7 @@ #include <string> #include "evoral/visibility.h" +#include "evoral/types.hpp" namespace Evoral { @@ -47,9 +48,8 @@ public: */ virtual uint8_t parameter_midi_type(const Parameter& param) const = 0; - /** The type ID for a MIDI event with the given status byte - */ - virtual uint32_t midi_event_type(uint8_t status) const = 0; + /** The parameter type for the given MIDI event. */ + virtual ParameterType midi_parameter_type(const uint8_t* buf, uint32_t len) const = 0; /** Return the description of a parameter. */ virtual ParameterDescriptor descriptor(const Parameter& param) const = 0; diff --git a/libs/evoral/evoral/types.hpp b/libs/evoral/evoral/types.hpp index a5d4a8ca1e..72b95f8460 100644 --- a/libs/evoral/evoral/types.hpp +++ b/libs/evoral/evoral/types.hpp @@ -1,5 +1,5 @@ /* This file is part of Evoral. - * Copyright (C) 2008 David Robillard <http://drobilla.net> + * Copyright (C) 2008-2016 David Robillard <http://drobilla.net> * Copyright (C) 2000-2008 Paul Davis * * Evoral is free software; you can redistribute it and/or modify it under the @@ -37,8 +37,23 @@ namespace Evoral { */ typedef int32_t event_id_t; -/** Type of an event (opaque, mapped by application) */ -typedef uint32_t EventType; +/** Type of an event (opaque, mapped by application, e.g. MIDI). + * + * Event types are really an arbitrary integer provided by the type map, and it + * is safe to use values not in this enum, but this enum exists so the compiler + * can catch mistakes like setting the event type to a MIDI status byte. Event + * types come from the type map and describe a format/protocol like MIDI, and + * must not be confused with the payload (such as a note on or CC change). + * There is a static value for MIDI as this type is handled specially by + * various parts of Evoral. + */ +enum EventType { + NO_EVENT, + MIDI_EVENT +}; + +/** Type of a parameter (opaque, mapped by application, e.g. gain) */ +typedef uint32_t ParameterType; class Beats; diff --git a/libs/evoral/src/Note.cpp b/libs/evoral/src/Note.cpp index 3b56a33241..52a4d6335b 100644 --- a/libs/evoral/src/Note.cpp +++ b/libs/evoral/src/Note.cpp @@ -30,9 +30,8 @@ namespace Evoral { template<typename Time> Note<Time>::Note(uint8_t chan, Time t, Time l, uint8_t n, uint8_t v) - // FIXME: types? - : _on_event (0xDE, t, 3, NULL, true) - , _off_event (0xAD, t + l, 3, NULL, true) + : _on_event (MIDI_EVENT, t, 3, NULL, true) + , _off_event (MIDI_EVENT, t + l, 3, NULL, true) { assert(chan < 16); diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp index 3098d0339d..14e3b65f37 100644 --- a/libs/evoral/src/Sequence.cpp +++ b/libs/evoral/src/Sequence.cpp @@ -63,7 +63,7 @@ template<typename Time> Sequence<Time>::const_iterator::const_iterator() : _seq(NULL) , _event(boost::shared_ptr< Event<Time> >(new Event<Time>())) - , _active_patch_change_message (0) + , _active_patch_change_message (NO_EVENT) , _type(NIL) , _is_end(true) , _control_iter(_control_iters.end()) @@ -191,7 +191,7 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& // Allocate a new event for storing the current event in MIDI format _event = boost::shared_ptr< Event<Time> >( - new Event<Time>(0, Time(), 4, NULL, true)); + new Event<Time>(NO_EVENT, Time(), 4, NULL, true)); // Set event from chosen sub-iterator set_event(); @@ -515,9 +515,8 @@ Sequence<Time>::Sequence(const Sequence<Time>& other) assert(! _end_iter._lock); } -/** Write the controller event pointed to by \a iter to \a ev. - * The buffer of \a ev will be allocated or resized as necessary. - * The event_type of \a ev should be set to the expected output type. +/** Write the controller event pointed to by `iter` to `ev`. + * The buffer of `ev` will be allocated or resized as necessary. * \return true on success */ template<typename Time> @@ -527,15 +526,14 @@ Sequence<Time>::control_to_midi_event( const ControlIterator& iter) const { assert(iter.list.get()); - const uint32_t event_type = iter.list->parameter().type(); // initialize the event pointer with a new event, if necessary if (!ev) { - ev = boost::shared_ptr< Event<Time> >(new Event<Time>(event_type, Time(), 3, NULL, true)); + ev = boost::shared_ptr< Event<Time> >(new Event<Time>(NO_EVENT, Time(), 3, NULL, true)); } - uint8_t midi_type = _type_map.parameter_midi_type(iter.list->parameter()); - ev->set_event_type(_type_map.midi_event_type(midi_type)); + const uint8_t midi_type = _type_map.parameter_midi_type(iter.list->parameter()); + ev->set_event_type(MIDI_EVENT); ev->set_id(-1); switch (midi_type) { case MIDI_CMD_CONTROL: @@ -933,23 +931,28 @@ Sequence<Time>::append(const Event<Time>& ev, event_id_t evid) _bank[ev.channel()] |= ev.cc_value(); } } else if (ev.is_cc()) { + const ParameterType ptype = _type_map.midi_parameter_type(ev.buffer(), ev.size()); append_control_unlocked( - Parameter(ev.event_type(), ev.channel(), ev.cc_number()), + Parameter(ptype, ev.channel(), ev.cc_number()), ev.time(), ev.cc_value(), evid); } else if (ev.is_pgm_change()) { /* write a patch change with this program change and any previously set-up bank number */ - append_patch_change_unlocked (PatchChange<Time> (ev.time(), ev.channel(), ev.pgm_number(), _bank[ev.channel()]), evid); + append_patch_change_unlocked ( + PatchChange<Time> (ev.time(), ev.channel(), + ev.pgm_number(), _bank[ev.channel()]), evid); } else if (ev.is_pitch_bender()) { + const ParameterType ptype = _type_map.midi_parameter_type(ev.buffer(), ev.size()); append_control_unlocked( - Parameter(ev.event_type(), ev.channel()), + Parameter(ptype, ev.channel()), ev.time(), double ((0x7F & ev.pitch_bender_msb()) << 7 | (0x7F & ev.pitch_bender_lsb())), evid); } else if (ev.is_poly_pressure()) { append_control_unlocked (Parameter (ev.event_type(), ev.channel(), ev.poly_note()), ev.time(), ev.poly_pressure(), evid); } else if (ev.is_channel_pressure()) { + const ParameterType ptype = _type_map.midi_parameter_type(ev.buffer(), ev.size()); append_control_unlocked( - Parameter(ev.event_type(), ev.channel()), + Parameter(ptype, ev.channel()), ev.time(), ev.channel_pressure(), evid); } else if (!_type_map.type_is_midi(ev.event_type())) { printf("WARNING: Sequence: Unknown event type %X: ", ev.event_type()); @@ -1215,7 +1218,7 @@ template<typename Time> typename Sequence<Time>::SysExes::const_iterator Sequence<Time>::sysex_lower_bound (Time t) const { - SysExPtr search (new Event<Time> (0, t)); + SysExPtr search (new Event<Time> (NO_EVENT, t)); typename Sequence<Time>::SysExes::const_iterator i = _sysexes.lower_bound (search); assert (i == _sysexes.end() || (*i)->time() >= t); return i; @@ -1250,7 +1253,7 @@ template<typename Time> typename Sequence<Time>::SysExes::iterator Sequence<Time>::sysex_lower_bound (Time t) { - SysExPtr search (new Event<Time> (0, t)); + SysExPtr search (new Event<Time> (NO_EVENT, t)); typename Sequence<Time>::SysExes::iterator i = _sysexes.lower_bound (search); assert (i == _sysexes.end() || (*i)->time() >= t); return i; diff --git a/libs/evoral/test/SMFTest.cpp b/libs/evoral/test/SMFTest.cpp index 0907cdc2f5..108052c98f 100644 --- a/libs/evoral/test/SMFTest.cpp +++ b/libs/evoral/test/SMFTest.cpp @@ -59,7 +59,7 @@ SMFTest::takeFiveTest () if (ret > 0) { // didn't skip (meta) event //cerr << "read smf event type " << hex << int(buf[0]) << endl; ev.set_time(Evoral::Beats::ticks_at_rate(time, smf.ppqn())); - ev.set_event_type(type_map->midi_event_type(buf[0])); + ev.set_event_type(Evoral::MIDI_EVENT); seq->append(ev, next_event_id ()); } } diff --git a/libs/evoral/test/SequenceTest.cpp b/libs/evoral/test/SequenceTest.cpp index a3dfabe139..16e93b37d2 100644 --- a/libs/evoral/test/SequenceTest.cpp +++ b/libs/evoral/test/SequenceTest.cpp @@ -25,7 +25,7 @@ SequenceTest::preserveEventOrderingTest () for (Notes::const_iterator i = test_notes.begin(); i != test_notes.end(); ++i) { uint8_t buffer[3]; Event<Time>* event = new Event<Time>( - DummyTypeMap::CONTROL, (*i)->on_event().time(), 3, buffer, true + (Evoral::EventType)DummyTypeMap::CONTROL, (*i)->on_event().time(), 3, buffer, true ); event->buffer()[0] = MIDI_CMD_CONTROL; @@ -77,12 +77,12 @@ SequenceTest::iteratorSeekTest () bool on = true; for (Sequence<Time>::const_iterator i = seq->begin(Evoral::Beats(600)); i != seq->end(); ++i) { if (on) { - CPPUNIT_ASSERT((*i)->is_note_on()); + CPPUNIT_ASSERT(i->is_note_on()); CPPUNIT_ASSERT_EQUAL(i->time(), Time((num_notes + 6) * 100)); ++num_notes; on = false; } else { - CPPUNIT_ASSERT((*i)->is_note_off()); + CPPUNIT_ASSERT(i->is_note_off()); on = true; } } diff --git a/libs/evoral/test/SequenceTest.hpp b/libs/evoral/test/SequenceTest.hpp index de51f714a1..48dff308b6 100644 --- a/libs/evoral/test/SequenceTest.hpp +++ b/libs/evoral/test/SequenceTest.hpp @@ -31,13 +31,14 @@ public: }; } - uint32_t midi_event_type(uint8_t status) const { - status &= 0xf0; - switch (status) { - case MIDI_CMD_CONTROL: return CONTROL; - case MIDI_CMD_COMMON_SYSEX: return SYSEX; - default: return 0; - }; + virtual ParameterType midi_parameter_type(const uint8_t* buf, uint32_t len) const { + switch (buf[0] & 0xF0) { + case MIDI_CMD_CONTROL: return CONTROL; + case MIDI_CMD_COMMON_SYSEX: return SYSEX; + case MIDI_CMD_NOTE_ON: return NOTE; + case MIDI_CMD_NOTE_OFF: return NOTE; + default: return 0; + } } ParameterDescriptor descriptor(const Parameter& param) const { |