1
0
Fork 0

Add dry mixing back in Buffr Glitch

This commit is contained in:
Robbert van der Helm 2023-01-17 02:20:02 +01:00
parent 17a89bcee6
commit 0bb224050e

View file

@ -283,14 +283,14 @@ impl Plugin for BuffrGlitch {
input[0][..block_len].copy_from_slice(&output[0][block_start..block_end]); input[0][..block_len].copy_from_slice(&output[0][block_start..block_end]);
input[1][..block_len].copy_from_slice(&output[1][block_start..block_end]); input[1][..block_len].copy_from_slice(&output[1][block_start..block_end]);
// These are buffers for per- per-voice smoothed values // The dry signal is mixed back in depending on th maximum voice amplitude envelope
let mut voice_amp_envelope = [0.0; MAX_BLOCK_SIZE]; let mut max_voice_amp_envelope = [0.0f32; MAX_BLOCK_SIZE];
// We'll empty the buffer, and then add the dry signal back in as needed // We'll empty the buffer, and then add the dry signal back in as needed
// TODO: Dry mixing
output[0][block_start..block_end].fill(0.0); output[0][block_start..block_end].fill(0.0);
output[1][block_start..block_end].fill(0.0); output[1][block_start..block_end].fill(0.0);
for voice in self.voices.iter_mut().filter(|v| v.is_active()) { for voice in self.voices.iter_mut().filter(|v| v.is_active()) {
let mut voice_amp_envelope = [0.0; MAX_BLOCK_SIZE];
voice voice
.amp_envelope .amp_envelope
.set_attack_time(self.sample_rate, self.params.attack_ms.value()); .set_attack_time(self.sample_rate, self.params.attack_ms.value());
@ -302,6 +302,8 @@ impl Plugin for BuffrGlitch {
.next_block(&mut voice_amp_envelope, block_len); .next_block(&mut voice_amp_envelope, block_len);
for (value_idx, sample_idx) in (block_start..block_end).enumerate() { for (value_idx, sample_idx) in (block_start..block_end).enumerate() {
max_voice_amp_envelope[value_idx] =
max_voice_amp_envelope[value_idx].max(voice_amp_envelope[value_idx]);
let amp = voice.velocity_gain let amp = voice.velocity_gain
* voice.gain_expression_gain * voice.gain_expression_gain
* voice_amp_envelope[value_idx]; * voice_amp_envelope[value_idx];
@ -313,6 +315,19 @@ impl Plugin for BuffrGlitch {
} }
} }
// The dry signal is mixed back in depending on the amplitude of the currently playing
// voices
let mut dry_level = [0.0; MAX_BLOCK_SIZE];
self.params
.dry_level
.smoothed
.next_block(&mut dry_level, block_len);
for (value_idx, sample_idx) in (block_start..block_end).enumerate() {
let gain = (1.0 - max_voice_amp_envelope[value_idx]) * dry_level[value_idx];
output[0][sample_idx] += input[0][value_idx] * gain;
output[1][sample_idx] += input[1][value_idx] * gain;
}
// And then just keep processing blocks until we've run out of buffer to fill // And then just keep processing blocks until we've run out of buffer to fill
block_start = block_end; block_start = block_end;
block_end = (block_start + MAX_BLOCK_SIZE).min(num_samples); block_end = (block_start + MAX_BLOCK_SIZE).min(num_samples);