Class: Wavify::DSP::Effects::Flanger
- Inherits:
-
EffectBase
- Object
- EffectBase
- Wavify::DSP::Effects::Flanger
- Defined in:
- lib/wavify/dsp/effects/flanger.rb,
sig/effects.rbs
Overview
Short modulated comb delay effect.
Constant Summary collapse
- MAX_DELAY_SECONDS =
0.006- TAIL_AMPLITUDE =
1.0e-6
Constants inherited from EffectBase
Instance Method Summary collapse
-
#initialize(rate: 0.5, depth: 0.7, feedback: 0.35, mix: 0.5) ⇒ Flanger
constructor
A new instance of Flanger.
- #latency ⇒ Object
- #process_sample(sample, channel:, sample_rate:) ⇒ Object
- #tail_duration ⇒ Object
Methods inherited from EffectBase
#apply, #build_runtime, #flush, #lookahead, #process, #reset
Constructor Details
#initialize(rate: 0.5, depth: 0.7, feedback: 0.35, mix: 0.5) ⇒ Flanger
Returns a new instance of Flanger.
11 12 13 14 15 16 17 18 |
# File 'lib/wavify/dsp/effects/flanger.rb', line 11 def initialize(rate: 0.5, depth: 0.7, feedback: 0.35, mix: 0.5) super() @rate = validate_positive!(rate, :rate) @depth = validate_unit!(depth, :depth) @feedback = validate_feedback!(feedback) @mix = validate_unit!(mix, :mix) reset end |
Instance Method Details
#latency ⇒ Object
47 48 49 |
# File 'lib/wavify/dsp/effects/flanger.rb', line 47 def latency @mix >= 1.0 ? MAX_DELAY_SECONDS : 0.0 end |
#process_sample(sample, channel:, sample_rate:) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/wavify/dsp/effects/flanger.rb', line 20 def process_sample(sample, channel:, sample_rate:) dry = sample.to_f line = @delay_lines.fetch(channel) write_index = @write_indices.fetch(channel) mod = @lfo.value_at(channel_phase_offset(channel)) delay_samples = @base_delay_samples + (@depth_delay_samples * ((mod + 1.0) / 2.0)) wet = read_fractional_delay(line, write_index, delay_samples) line[write_index] = dry + (wet * @feedback) @write_indices[channel] = (write_index + 1) % line.length @lfo.next_value if channel == (@runtime_channels - 1) (dry * (1.0 - @mix)) + (wet * @mix) end |
#tail_duration ⇒ Object
36 37 38 39 40 41 42 43 44 45 |
# File 'lib/wavify/dsp/effects/flanger.rb', line 36 def tail_duration return 0.0 if @mix.zero? repetitions = if @feedback.zero? 1 else (Math.log(TAIL_AMPLITUDE) / Math.log(@feedback.abs)).ceil end MAX_DELAY_SECONDS * [repetitions, 1].max end |