diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index f4373e2c0e..72446952cf 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -41,7 +41,7 @@ #include "ardour/session.h" #include "evoral/Parameter.hpp" -#include "evoral/MIDIEvent.hpp" +#include "evoral/Event.hpp" #include "evoral/Control.hpp" #include "evoral/midi_util.h" @@ -1298,14 +1298,9 @@ MidiRegionView::display_sysexes() if (!UIConfiguration::instance().get_never_display_periodic_midi()) { for (MidiModel::SysExes::const_iterator i = _model->sysexes().begin(); i != _model->sysexes().end(); ++i) { - const boost::shared_ptr > mev = - boost::static_pointer_cast > (*i); - - if (mev) { - if (mev->is_spp() || mev->is_mtc_quarter() || mev->is_mtc_full()) { - have_periodic_system_messages = true; - break; - } + if ((*i)->is_spp() || (*i)->is_mtc_quarter() || (*i)->is_mtc_full()) { + have_periodic_system_messages = true; + break; } } @@ -1330,17 +1325,11 @@ MidiRegionView::display_sysexes() } for (MidiModel::SysExes::const_iterator i = _model->sysexes().begin(); i != _model->sysexes().end(); ++i) { - - const boost::shared_ptr > mev = - boost::static_pointer_cast > (*i); - Evoral::Beats time = (*i)->time(); - if (mev) { - if (mev->is_spp() || mev->is_mtc_quarter() || mev->is_mtc_full()) { - if (!display_periodic_messages) { - continue; - } + if ((*i)->is_spp() || (*i)->is_mtc_quarter() || (*i)->is_mtc_full()) { + if (!display_periodic_messages) { + continue; } } @@ -3957,7 +3946,7 @@ MidiRegionView::data_recorded (boost::weak_ptr w) framepos_t back = max_framepos; for (MidiBuffer::iterator i = buf->begin(); i != buf->end(); ++i) { - Evoral::MIDIEvent const ev (*i, false); + const Evoral::Event& ev = *i; if (ev.is_channel_event()) { if (get_channel_mode() == FilterChannels) { diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index d86362aa0d..21c79df684 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -70,6 +70,13 @@ Amp::configure_io (ChanCount in, ChanCount out) return Processor::configure_io (in, out); } +static void +scale_midi_velocity(Evoral::Event& ev, float factor) +{ + factor = std::max(factor, 0.0f); + ev.set_velocity(std::min(127L, lrintf(ev.velocity() * factor))); +} + void Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool) { @@ -88,10 +95,10 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, for (BufferSet::midi_iterator i = bufs.midi_begin(); i != bufs.midi_end(); ++i) { MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { assert(ev.time() >= 0 && ev.time() < nframes); - ev.scale_velocity (fabsf (gab[ev.time()])); + scale_midi_velocity (ev, fabsf (gab[ev.time()])); } } } @@ -135,9 +142,9 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { - ev.scale_velocity (fabsf (_current_gain)); + scale_midi_velocity (ev, fabsf (_current_gain)); } } } @@ -186,11 +193,11 @@ Amp::apply_gain (BufferSet& bufs, framecnt_t sample_rate, framecnt_t nframes, ga MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { const gain_t scale = delta * (ev.time()/(double) nframes); - ev.scale_velocity (fabsf (initial+scale)); + scale_midi_velocity (ev, fabsf (initial + scale)); } } } @@ -304,7 +311,7 @@ Amp::apply_simple_gain (BufferSet& bufs, framecnt_t nframes, gain_t target, bool MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { ev.set_velocity (0); } @@ -324,9 +331,9 @@ Amp::apply_simple_gain (BufferSet& bufs, framecnt_t nframes, gain_t target, bool MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { - ev.scale_velocity (fabsf (target)); + scale_midi_velocity(ev, fabsf (target)); } } } diff --git a/libs/ardour/ardour/buffer_set.h b/libs/ardour/ardour/buffer_set.h index 9ea6ab7d6a..371387dd93 100644 --- a/libs/ardour/ardour/buffer_set.h +++ b/libs/ardour/ardour/buffer_set.h @@ -31,7 +31,7 @@ #include "ardour/types.h" #if defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT -#include "evoral/MIDIEvent.hpp" +#include "evoral/Event.hpp" struct _VstEvents; typedef struct _VstEvents VstEvents; struct _VstMidiEvent; @@ -196,7 +196,7 @@ private: ~VSTBuffer (); void clear (); - void push_back (Evoral::MIDIEvent const &); + void push_back (Evoral::Event const &); VstEvents* events () const { return _events; } diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h index e4a1a3f02c..1b0bf2a151 100644 --- a/libs/ardour/ardour/midi_buffer.h +++ b/libs/ardour/ardour/midi_buffer.h @@ -47,7 +47,7 @@ public: void copy(const MidiBuffer& copy); void copy(MidiBuffer const * const); - bool push_back(const Evoral::MIDIEvent& event); + bool push_back(const Evoral::Event& event); bool push_back(TimeType time, size_t size, const uint8_t* data); uint8_t* reserve(TimeType time, size_t size); @@ -56,7 +56,7 @@ public: size_t size() const { return _size; } bool empty() const { return _size == 0; } - bool insert_event(const Evoral::MIDIEvent& event); + bool insert_event(const Evoral::Event& event); bool merge_in_place(const MidiBuffer &other); /** EventSink interface for non-RT use (export, bounce). */ @@ -122,8 +122,8 @@ public: size_t offset; }; - typedef iterator_base< MidiBuffer, Evoral::MIDIEvent > iterator; - typedef iterator_base< const MidiBuffer, const Evoral::MIDIEvent > const_iterator; + typedef iterator_base< MidiBuffer, Evoral::Event > iterator; + typedef iterator_base< const MidiBuffer, const Evoral::Event > const_iterator; iterator begin() { return iterator(*this, 0); } iterator end() { return iterator(*this, _size); } @@ -176,8 +176,8 @@ public: static bool second_simultaneous_midi_byte_is_first (uint8_t, uint8_t); private: - friend class iterator_base< MidiBuffer, Evoral::MIDIEvent >; - friend class iterator_base< const MidiBuffer, const Evoral::MIDIEvent >; + friend class iterator_base< MidiBuffer, Evoral::Event >; + friend class iterator_base< const MidiBuffer, const Evoral::Event >; uint8_t* _data; ///< timestamp, event, timestamp, event, ... pframes_t _size; diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc index 388aaf1935..ce8ab40a01 100644 --- a/libs/ardour/async_midi_port.cc +++ b/libs/ardour/async_midi_port.cc @@ -241,14 +241,14 @@ AsyncMIDIPort::write (const MIDI::byte * msg, size_t msglen, MIDI::timestamp_t t necessary. */ if (!vec.buf[0]->owns_buffer()) { - vec.buf[0]->set_buffer (0, 0, true); - } + vec.buf[0]->set_buffer (0, 0, true); + } vec.buf[0]->set (msg, msglen, timestamp); } else { /* see comment in previous branch of if() statement */ if (!vec.buf[1]->owns_buffer()) { - vec.buf[1]->set_buffer (0, 0, true); - } + vec.buf[1]->set_buffer (0, 0, true); + } vec.buf[1]->set (msg, msglen, timestamp); } diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 13bc579731..55226c4f67 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -1686,7 +1686,7 @@ AUPlugin::connect_and_run (BufferSet& bufs, /* one MIDI port/buffer only */ MidiBuffer& m = bufs.get_midi (i); for (MidiBuffer::iterator i = m.begin(); i != m.end(); ++i) { - Evoral::MIDIEvent ev (*i); + Evoral::Event ev (*i); if (ev.is_channel_event()) { const uint8_t* b = ev.buffer(); DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("%1: MIDI event %2\n", name(), ev)); diff --git a/libs/ardour/buffer_set.cc b/libs/ardour/buffer_set.cc index 92f5272b3b..7a108192ce 100644 --- a/libs/ardour/buffer_set.cc +++ b/libs/ardour/buffer_set.cc @@ -389,7 +389,7 @@ BufferSet::VSTBuffer::clear () } void -BufferSet::VSTBuffer::push_back (Evoral::MIDIEvent const & ev) +BufferSet::VSTBuffer::push_back (Evoral::Event const & ev) { if (ev.size() > 3) { /* XXX: this will silently drop MIDI messages longer than 3 bytes, so diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc index eda85f0dfd..77b59b540c 100644 --- a/libs/ardour/delayline.cc +++ b/libs/ardour/delayline.cc @@ -234,7 +234,7 @@ DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end // move events from dly-buffer into current-buffer until nsamples // and remove them from the dly-buffer for (MidiBuffer::iterator m = dly->begin(); m != dly->end();) { - const Evoral::MIDIEvent ev (*m, false); + const Evoral::Event ev (*m, false); if (ev.time() >= nsamples) { break; } @@ -250,7 +250,7 @@ DelayLine::run (BufferSet& bufs, framepos_t /* start_frame */, framepos_t /* end // move events after nsamples from current-buffer into dly-buffer // and trim current-buffer after nsamples for (MidiBuffer::iterator m = mb.begin(); m != mb.end();) { - const Evoral::MIDIEvent ev (*m, false); + const Evoral::Event ev (*m, false); if (ev.time() < nsamples) { ++m; continue; diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 034c6ee73b..e20a2ecdff 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -442,7 +442,7 @@ LuaBindings::common (lua_State* L) .addFunction ("size", &Evoral::Event::size) .addFunction ("set_buffer", &Evoral::Event::set_buffer) .addFunction ("buffer", (uint8_t*(Evoral::Event::*)())&Evoral::Event::buffer) - .addFunction ("time", (framepos_t (Evoral::Event::*)())&Evoral::MIDIEvent::time) + .addFunction ("time", (framepos_t (Evoral::Event::*)())&Evoral::Event::time) .endClass () .beginClass ("Beats") @@ -1801,10 +1801,10 @@ LuaBindings::dsp (lua_State* L) .addFunction ("empty", &MidiBuffer::empty) .addFunction ("resize", &MidiBuffer::resize) .addFunction ("copy", (void (MidiBuffer::*)(MidiBuffer const * const))&MidiBuffer::copy) - .addFunction ("push_event", (bool (MidiBuffer::*)(const Evoral::MIDIEvent&))&MidiBuffer::push_back) + .addFunction ("push_event", (bool (MidiBuffer::*)(const Evoral::Event&))&MidiBuffer::push_back) .addFunction ("push_back", (bool (MidiBuffer::*)(framepos_t, size_t, const uint8_t*))&MidiBuffer::push_back) // TODO iterators.. - .addExtCFunction ("table", &luabridge::CFunc::listToTable, MidiBuffer>) + .addExtCFunction ("table", &luabridge::CFunc::listToTable, MidiBuffer>) .endClass() .beginClass ("BufferSet") @@ -1817,12 +1817,12 @@ LuaBindings::dsp (lua_State* L) luabridge::getGlobalNamespace (L) .beginNamespace ("Evoral") - .deriveClass , Evoral::Event > ("MidiEvent") + .deriveClass , Evoral::Event > ("MidiEvent") // add Ctor? - .addFunction ("type", &Evoral::MIDIEvent::type) - .addFunction ("channel", &Evoral::MIDIEvent::channel) - .addFunction ("set_type", &Evoral::MIDIEvent::set_type) - .addFunction ("set_channel", &Evoral::MIDIEvent::set_channel) + .addFunction ("type", &Evoral::Event::type) + .addFunction ("channel", &Evoral::Event::channel) + .addFunction ("set_type", &Evoral::Event::set_type) + .addFunction ("set_channel", &Evoral::Event::set_channel) .endClass () .endNamespace (); diff --git a/libs/ardour/luaproc.cc b/libs/ardour/luaproc.cc index 0a17b70f4f..436f60bfc4 100644 --- a/libs/ardour/luaproc.cc +++ b/libs/ardour/luaproc.cc @@ -667,7 +667,7 @@ LuaProc::connect_and_run (BufferSet& bufs, if (valid) { for (MidiBuffer::iterator m = bufs.get_midi(idx).begin(); m != bufs.get_midi(idx).end(); ++m, ++e) { - const Evoral::MIDIEvent ev(*m, false); + const Evoral::Event ev(*m, false); luabridge::LuaRef lua_midi_data (luabridge::newTable (L)); const uint8_t* data = ev.buffer(); for (uint32_t i = 0; i < ev.size(); ++i) { diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index a7f8bfb209..fe226704bb 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -2551,7 +2551,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs, MetricSection* metric = (metric_i != tmap.metrics_end()) ? *metric_i : NULL; if (m != m_end && (!metric || metric->frame() > (*m).time())) { - const Evoral::MIDIEvent ev(*m, false); + const Evoral::Event ev(*m, false); if (ev.time() < nframes) { LV2_Evbuf_Iterator eend = lv2_evbuf_end(_ev_buffers[port_index]); lv2_evbuf_write(&eend, ev.time(), 0, type, ev.size(), ev.buffer()); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 430306c91a..289ce579db 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -106,7 +106,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr const MidiBuffer& buf (bufs.get_midi(i)); for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) { - const Evoral::MIDIEvent ev(*e, false); + const Evoral::Event ev(*e, false); if (ev.is_note_on()) { const float this_vel = ev.buffer()[2] / 127.0; if (this_vel > val) { diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc index 516d5a98c7..652be5290c 100644 --- a/libs/ardour/midi_buffer.cc +++ b/libs/ardour/midi_buffer.cc @@ -110,7 +110,7 @@ MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, frameoffset_t dst_ } for (MidiBuffer::const_iterator i = msrc.begin(); i != msrc.end(); ++i) { - const Evoral::MIDIEvent ev(*i, false); + const Evoral::Event ev(*i, false); if (dst_offset >= 0) { /* Positive offset: shifting events from internal @@ -168,7 +168,7 @@ MidiBuffer::merge_from (const Buffer& src, framecnt_t /*nframes*/, frameoffset_t * @return false if operation failed (not enough room) */ bool -MidiBuffer::push_back(const Evoral::MIDIEvent& ev) +MidiBuffer::push_back(const Evoral::Event& ev) { return push_back (ev.time(), ev.size(), ev.buffer()); } @@ -220,7 +220,7 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data) } bool -MidiBuffer::insert_event(const Evoral::MIDIEvent& ev) +MidiBuffer::insert_event(const Evoral::Event& ev) { if (size() == 0) { return push_back(ev); @@ -273,7 +273,7 @@ MidiBuffer::insert_event(const Evoral::MIDIEvent& ev) uint32_t MidiBuffer::write(TimeType time, Evoral::EventType type, uint32_t size, const uint8_t* buf) { - insert_event(Evoral::MIDIEvent(type, time, size, const_cast(buf))); + insert_event(Evoral::Event(type, time, size, const_cast(buf))); return size; } diff --git a/libs/ardour/midi_channel_filter.cc b/libs/ardour/midi_channel_filter.cc index 40658802e5..f81c57fef7 100644 --- a/libs/ardour/midi_channel_filter.cc +++ b/libs/ardour/midi_channel_filter.cc @@ -42,7 +42,7 @@ MidiChannelFilter::filter(BufferSet& bufs) MidiBuffer& buf = bufs.get_midi(0); for (MidiBuffer::iterator e = buf.begin(); e != buf.end(); ) { - Evoral::MIDIEvent ev(*e, false); + Evoral::Event ev(*e, false); if (ev.is_channel_event()) { switch (mode) { diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 359dd573cf..22a3df1145 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -409,7 +409,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t MidiChannelFilter* filter = mt ? &mt->capture_filter() : NULL; for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { - Evoral::MIDIEvent ev(*i, false); + Evoral::Event ev(*i, false); if (ev.time() + rec_offset > rec_nframes) { break; } diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index c94fb5ec17..3f7348f747 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -1498,7 +1498,7 @@ MidiModel::write_section_to (boost::shared_ptr source, for (Evoral::Sequence::const_iterator i = begin(TimeType(), true); i != end(); ++i) { if (i->time() >= begin_time && i->time() < end_time) { - Evoral::MIDIEvent mev (*i, true); /* copy the event */ + Evoral::Event mev (*i, true); /* copy the event */ if (offset_events) { mev.set_time(mev.time() - begin_time); diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc index f3f5378f5b..05d9da5971 100644 --- a/libs/ardour/midi_port.cc +++ b/libs/ardour/midi_port.cc @@ -230,7 +230,7 @@ MidiPort::flush_buffers (pframes_t nframes) for (MidiBuffer::iterator i = _buffer->begin(); i != _buffer->end(); ++i) { - const Evoral::MIDIEvent ev (*i, false); + const Evoral::Event ev (*i, false); if (sends_output() && _trace_on) { diff --git a/libs/ardour/midi_scene_changer.cc b/libs/ardour/midi_scene_changer.cc index 07eb549e66..0c2880dcaf 100644 --- a/libs/ardour/midi_scene_changer.cc +++ b/libs/ardour/midi_scene_changer.cc @@ -17,7 +17,7 @@ */ -#include "evoral/MIDIEvent.hpp" +#include "evoral/Event.hpp" #include "midi++/channel.h" #include "midi++/parser.h" #include "midi++/port.h" diff --git a/libs/ardour/midi_state_tracker.cc b/libs/ardour/midi_state_tracker.cc index 3e81a064c8..17ecd10e94 100644 --- a/libs/ardour/midi_state_tracker.cc +++ b/libs/ardour/midi_state_tracker.cc @@ -122,7 +122,7 @@ MidiStateTracker::resolve_notes (MidiBuffer &dst, framepos_t time) for (int note = 0; note < 128; ++note) { while (_active_notes[note + 128 * channel]) { uint8_t buffer[3] = { ((uint8_t) (MIDI_CMD_NOTE_OFF | channel)), uint8_t (note), 0 }; - Evoral::MIDIEvent noteoff + Evoral::Event noteoff (MIDI_CMD_NOTE_OFF, time, 3, buffer, false); /* note that we do not care about failure from push_back() ... should we warn someone ? @@ -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::MIDIEvent ev ((MIDI_CMD_NOTE_OFF|channel), time, 3, 0, true); + Evoral::Event ev ((MIDI_CMD_NOTE_OFF|channel), 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 f1344e7697..69291f1cce 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -339,7 +339,7 @@ MidiTrack::update_controls(const BufferSet& bufs) { const MidiBuffer& buf = bufs.get_midi(0); for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) { - const Evoral::MIDIEvent& ev = *e; + const Evoral::Event& ev = *e; const Evoral::Parameter param = midi_parameter(ev.buffer(), ev.size()); const boost::shared_ptr control = this->control(param); if (control) { @@ -549,7 +549,7 @@ MidiTrack::push_midi_input_to_step_edit_ringbuffer (framecnt_t nframes) for (MidiBuffer::const_iterator e = mb->begin(); e != mb->end(); ++e) { - const Evoral::MIDIEvent ev(*e, false); + const Evoral::Event ev(*e, false); /* note on, since for step edit, note length is determined elsewhere diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 0ddc14f78d..bcd3e43749 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -334,7 +334,7 @@ SMFSource::write_unlocked (const Lock& lock, _model->start_write(); } - Evoral::MIDIEvent ev; + Evoral::Event ev; while (true) { /* Get the event time, in frames since session start but ignoring looping. */ bool ret; diff --git a/libs/evoral/MSVCevoral/evoral.vcproj b/libs/evoral/MSVCevoral/evoral.vcproj index 1f0c00f341..512438000d 100644 --- a/libs/evoral/MSVCevoral/evoral.vcproj +++ b/libs/evoral/MSVCevoral/evoral.vcproj @@ -284,7 +284,7 @@ > + * Copyright (C) 2008-2016 David Robillard * Copyright (C) 2000-2008 Paul Davis * * Evoral is free software; you can redistribute it and/or modify it under the @@ -24,8 +24,9 @@ #include #include -#include "evoral/visibility.h" +#include "evoral/midi_events.h" #include "evoral/types.hpp" +#include "evoral/visibility.h" /** If this is not defined, all methods of MidiEvent are RT safe * but MidiEvent will never deep copy and (depending on the scenario) @@ -37,7 +38,7 @@ namespace Evoral { LIBEVORAL_API event_id_t event_id_counter(); LIBEVORAL_API event_id_t next_event_id(); -LIBEVORAL_API void init_event_id_counter(event_id_t n); +LIBEVORAL_API void init_event_id_counter(event_id_t n); /** An event (much like a type generic jack_midi_event_t) * @@ -47,9 +48,9 @@ template 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=0, 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); + Event(EventType type, Time time, uint32_t size, const uint8_t* buf); /** Copy \a copy. * @@ -59,33 +60,20 @@ public: */ Event(const Event& copy, bool alloc); - ~Event(); + ~Event(); - void assign (const Event& other); + void assign(const Event& other); void set(const uint8_t* buf, uint32_t size, Time t); inline bool operator==(const Event& other) const { - if (_type != other._type) + if (_type != other._type || + _nominal_time != other._nominal_time || + _original_time != other._original_time || + _size != other._size) { return false; - - if (_nominal_time != other._nominal_time) - return false; - - if (_original_time != other._original_time) - return false; - - if (_size != other._size) - return false; - - if (_buf == other._buf) - return true; - - for (uint32_t i=0; i < _size; ++i) - if (_buf[i] != other._buf[i]) - return false; - - return true; + } + return !memcmp(_buf, other._buf, _size); } inline bool operator!=(const Event& other) const { return ! operator==(other); } @@ -127,10 +115,6 @@ public: _buf = NULL; } -#else - - inline void set_buffer(uint8_t* buf) { _buf = buf; } - #endif // EVORAL_EVENT_ALLOC inline EventType event_type() const { return _type; } @@ -148,15 +132,76 @@ public: inline event_id_t id() const { return _id; } inline void set_id(event_id_t n) { _id = n; } + /* The following methods are type specific and only make sense for the + correct event type. It is the caller's responsibility to only call + methods which make sense for the given event type. Currently this means + they all only make sense for MIDI, but built-in support may be added for + other protocols in the future, or the internal representation may change + to be protocol agnostic. */ + + uint8_t type() const { return _buf[0] & 0xF0; } + uint8_t channel() const { return _buf[0] & 0x0F; } + bool is_note_on() const { return type() == MIDI_CMD_NOTE_ON; } + bool is_note_off() const { return type() == MIDI_CMD_NOTE_OFF; } + bool is_note() const { return is_note_on() || is_note_off(); } + bool is_poly_pressure() const { return type() == MIDI_CMD_NOTE_PRESSURE; } + bool is_channel_pressure() const { return type() == MIDI_CMD_CHANNEL_PRESSURE; } + bool is_cc() const { return type() == MIDI_CMD_CONTROL; } + bool is_pgm_change() const { return type() == MIDI_CMD_PGM_CHANGE; } + bool is_pitch_bender() const { return type() == MIDI_CMD_BENDER; } + bool is_channel_event() const { return (0x80 <= type()) && (type() <= 0xE0); } + bool is_smf_meta_event() const { return _buf[0] == 0xFF; } + bool is_sysex() const { return _buf[0] == 0xF0 || _buf[0] == 0xF7; } + bool is_spp() const { return _buf[0] == 0xF2 && size() == 1; } + bool is_mtc_quarter() const { return _buf[0] == 0xF1 && size() == 1; } + bool is_mtc_full() const { return (size() == 10 && + _buf[0] == 0xF0 && _buf[1] == 0x7F && + _buf[3] == 0x01 && _buf[4] == 0x01); } + + uint8_t note() const { return _buf[1]; } + uint8_t velocity() const { return _buf[2]; } + uint8_t poly_note() const { return _buf[1]; } + uint8_t poly_pressure() const { return _buf[2]; } + uint8_t channel_pressure() const { return _buf[1]; } + uint8_t cc_number() const { return _buf[1]; } + uint8_t cc_value() const { return _buf[2]; } + uint8_t pgm_number() const { return _buf[1]; } + uint8_t pitch_bender_lsb() const { return _buf[1]; } + uint8_t pitch_bender_msb() const { return _buf[2]; } + uint16_t pitch_bender_value() const { return ((0x7F & _buf[2]) << 7 | (0x7F & _buf[1])); } + + void set_channel(uint8_t channel) { _buf[0] = (0xF0 & _buf[0]) | (0x0F & channel); } + void set_type(uint8_t type) { _buf[0] = (0x0F & _buf[0]) | (0xF0 & type); } + void set_note(uint8_t num) { _buf[1] = num; } + void set_velocity(uint8_t val) { _buf[2] = val; } + void set_cc_number(uint8_t num) { _buf[1] = num; } + void set_cc_value(uint8_t val) { _buf[2] = val; } + void set_pgm_number(uint8_t num) { _buf[1] = num; } + + uint16_t value() const { + switch (type()) { + case MIDI_CMD_CONTROL: + return cc_value(); + case MIDI_CMD_BENDER: + return pitch_bender_value(); + case MIDI_CMD_NOTE_PRESSURE: + return poly_pressure(); + case MIDI_CMD_CHANNEL_PRESSURE: + return channel_pressure(); + default: + return 0; + } + } + protected: - EventType _type; /**< Type of event (application relative, NOT MIDI 'type') */ - Time _original_time; /**< Sample index (or beat time) at which event is valid */ - Time _nominal_time; /**< Quantized version of _time, used in preference */ - uint32_t _size; /**< Number of uint8_ts of data in \a buffer */ - uint8_t* _buf; /**< Raw MIDI data */ - event_id_t _id; /** UUID for each event, should probably be 64bit or at least unsigned */ + EventType _type; ///< Type of event (application relative, NOT MIDI 'type') + Time _original_time; ///< Time stamp of event + Time _nominal_time; ///< Quantized version of _time, used in preference + uint32_t _size; ///< Size of buffer in bytes + uint8_t* _buf; ///< Event contents (e.g. raw MIDI data) + event_id_t _id; ///< Unique event ID #ifdef EVORAL_EVENT_ALLOC - bool _owns_buf; /**< Whether buffer is locally allocated */ + bool _owns_buf; ///< Whether buffer is locally allocated #endif }; diff --git a/libs/evoral/evoral/MIDIEvent.hpp b/libs/evoral/evoral/MIDIEvent.hpp deleted file mode 100644 index e8320c3e35..0000000000 --- a/libs/evoral/evoral/MIDIEvent.hpp +++ /dev/null @@ -1,115 +0,0 @@ -/* This file is part of Evoral. - * Copyright (C) 2008 David Robillard - * Copyright (C) 2000-2008 Paul Davis - * - * Evoral is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Evoral is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef EVORAL_MIDI_EVENT_HPP -#define EVORAL_MIDI_EVENT_HPP - -#include -#include - -#include "evoral/visibility.h" -#include "evoral/Event.hpp" -#include "evoral/midi_events.h" - -namespace Evoral { - -/** MIDI helper functions for an Event. - * - * This class contains no data, an Evoral::Event can be cast to a MIDIEvent - * but the application must make sure the Event actually contains - * valid MIDI data for these functions to make sense. - */ -template -class /*LIBEVORAL_API*/ MIDIEvent : public Event