diff options
author | David Robillard <d@drobilla.net> | 2016-11-06 22:04:35 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-12-03 15:18:21 -0500 |
commit | 08fffeffec10beb708610fd35eb9e7c35365d446 (patch) | |
tree | ce9c8c77e6a926b4d8be90052c32945b7718bb4b /libs/ardour/amp.cc | |
parent | 875b1367b2c4750ecd861424c57ed4bcc9c642d2 (diff) |
Remove Evoral::MIDIEvent
It is slightly questionable whether type specific methods like
velocity() belong on Event at all, these may be better off as free
functions. However the code currently uses them as methods in many
places, and it seems like a step in the right direction, since, for
example, we might some day have events that have a velocity but aren't
stored as MIDI messages (e.g. if Ardour uses an internal musical model
that is more expressive).
In any case, the former inheritance and plethora of sloppy casts is
definitely not the right thing.
Diffstat (limited to 'libs/ardour/amp.cc')
-rw-r--r-- | libs/ardour/amp.cc | 25 |
1 files changed, 16 insertions, 9 deletions
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<MidiBuffer::TimeType>& 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<MidiBuffer::TimeType> ev = *m; + Evoral::Event<MidiBuffer::TimeType> 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<MidiBuffer::TimeType> ev = *m; + Evoral::Event<MidiBuffer::TimeType> 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<MidiBuffer::TimeType> ev = *m; + Evoral::Event<MidiBuffer::TimeType> 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<MidiBuffer::TimeType> ev = *m; + Evoral::Event<MidiBuffer::TimeType> 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<MidiBuffer::TimeType> ev = *m; + Evoral::Event<MidiBuffer::TimeType> ev = *m; if (ev.is_note_on()) { - ev.scale_velocity (fabsf (target)); + scale_midi_velocity(ev, fabsf (target)); } } } |