mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-24 14:17:21 +01:00
do not apply global transport declick to MIDI
git-svn-id: svn://localhost/ardour2/branches/3.0@7491 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
fce685b2e7
commit
6fa58df791
3 changed files with 57 additions and 3 deletions
|
|
@ -160,7 +160,6 @@ Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t targ
|
|||
|
||||
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) {
|
||||
|
|
@ -198,6 +197,59 @@ Amp::apply_gain (BufferSet& bufs, nframes_t nframes, gain_t initial, gain_t targ
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
Amp::declick (BufferSet& bufs, nframes_t nframes, int dir)
|
||||
{
|
||||
/* Almost exactly like ::apply_gain() but skips MIDI buffers and has fixed initial+target
|
||||
values.
|
||||
*/
|
||||
|
||||
if (nframes == 0 || bufs.count().n_total() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const nframes_t declick = std::min ((nframes_t)128, nframes);
|
||||
gain_t delta, initial, target;
|
||||
double fractional_shift = -1.0/declick;
|
||||
double fractional_pos;
|
||||
|
||||
if (dir < 0) {
|
||||
/* fade out: remove more and more of delta from initial */
|
||||
delta = -1.0;
|
||||
initial = 1.0;
|
||||
target = 0.0;
|
||||
} else {
|
||||
/* fade in: add more and more of delta from initial */
|
||||
delta = 1.0;
|
||||
initial = 0.0;
|
||||
target = 1.0;
|
||||
}
|
||||
|
||||
/* Audio Gain */
|
||||
|
||||
for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
|
||||
Sample* const buffer = i->data();
|
||||
|
||||
fractional_pos = 1.0;
|
||||
|
||||
for (nframes_t nx = 0; nx < declick; ++nx) {
|
||||
buffer[nx] *= (initial + (delta * (0.5 + 0.5 * cos (M_PI * fractional_pos))));
|
||||
fractional_pos += fractional_shift;
|
||||
}
|
||||
|
||||
/* now ensure the rest of the buffer has the target value applied, if necessary. */
|
||||
|
||||
if (declick != nframes) {
|
||||
|
||||
if (target == 0.0) {
|
||||
memset (&buffer[declick], 0, sizeof (Sample) * (nframes - declick));
|
||||
} else if (target != 1.0) {
|
||||
apply_gain_to_buffer (&buffer[declick], nframes - declick, target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Amp::apply_gain (AudioBuffer& buf, nframes_t nframes, gain_t initial, gain_t target)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ public:
|
|||
static void apply_gain (AudioBuffer& buf, nframes_t nframes, gain_t initial, gain_t target);
|
||||
static void apply_simple_gain(AudioBuffer& buf, nframes_t nframes, gain_t target);
|
||||
|
||||
static void declick (BufferSet& bufs, nframes_t nframes, int dir);
|
||||
|
||||
gain_t gain () const { return _gain_control->user_float(); }
|
||||
|
||||
virtual void set_gain (gain_t g, void *src);
|
||||
|
|
|
|||
|
|
@ -413,9 +413,9 @@ Route::process_output_buffers (BufferSet& bufs,
|
|||
----------------------------------------------------------------------------------------- */
|
||||
|
||||
if (declick > 0) {
|
||||
Amp::apply_gain (bufs, nframes, 0.0, 1.0);
|
||||
Amp::declick (bufs, nframes, 1);
|
||||
} else if (declick < 0) {
|
||||
Amp::apply_gain (bufs, nframes, 1.0, 0.0);
|
||||
Amp::declick (bufs, nframes, -1);
|
||||
}
|
||||
|
||||
_pending_declick = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue