summaryrefslogtreecommitdiff
path: root/libs/ardour/amp.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-09-09 05:01:26 +0200
committerRobin Gareus <robin@gareus.org>2019-09-09 05:01:26 +0200
commitcd6e074e92fffab59dca4d0b3f5a01cc6454cde4 (patch)
tree4f132cb42697f4bf66d1c2e2b752cf11312f0393 /libs/ardour/amp.cc
parent65268bae5bacd7a1e9c04e70948f57d68d2fba9f (diff)
Fix MIDI velocity scale for muted sends and manual faders
Do not send continuous stream of note-evens with zero velocity after muting a MIDI track or after a fade to silence completed (and all-notes-off has been sent). NB. Automated Faders are left untouched (no panic is sent for -infdB gain), Note-on events with zero velocity are sent.
Diffstat (limited to 'libs/ardour/amp.cc')
-rw-r--r--libs/ardour/amp.cc33
1 files changed, 11 insertions, 22 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index 75a18cbf98..b27805c883 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -148,25 +148,8 @@ Amp::run (BufferSet& bufs, samplepos_t /*start_sample*/, samplepos_t /*end_sampl
} else if (target_gain != GAIN_COEFF_UNITY) {
_current_gain = target_gain;
+ apply_simple_gain (bufs, nframes, _current_gain, _midi_amp);
- if (_midi_amp) {
- /* don't Trim midi velocity -- only relevant for Midi on Audio tracks */
- 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::Event<MidiBuffer::TimeType> ev = *m;
- if (ev.is_note_on()) {
- scale_midi_velocity (ev, fabsf (_current_gain));
- }
- }
- }
- }
-
- for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
- apply_gain_to_buffer (i->data(), nframes, _current_gain);
- }
} else {
/* unity target gain */
_current_gain = target_gain;
@@ -232,13 +215,19 @@ Amp::apply_gain (BufferSet& bufs, samplecnt_t sample_rate, samplecnt_t nframes,
MidiBuffer& mb (*i);
- for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) {
+ for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ) {
Evoral::Event<MidiBuffer::TimeType> ev = *m;
- if (ev.is_note_on()) {
- const gain_t scale = delta * (ev.time() / (double) nframes);
- scale_midi_velocity (ev, fabsf (initial + scale));
+ if (ev.is_note_on() || ev.is_note_off()) {
+ const gain_t scale = fabsf (initial + delta * (ev.time() / (double) nframes));
+ if (scale < GAIN_COEFF_SMALL) {
+ m = mb.erase (m);
+ continue;
+ } else if (ev.is_note_on()) {
+ scale_midi_velocity (ev, scale);
+ }
}
+ ++m;
}
/* queue MIDI all-note-off when going silent */