Class: Wavify::DSP::Effects::Flanger

Inherits:
EffectBase show all
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

EffectBase::TAIL_CHUNK_FRAMES

Instance Method Summary collapse

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.

Parameters:

  • rate: (Numeric) (defaults to: 0.5)
  • depth: (Numeric) (defaults to: 0.7)
  • feedback: (Numeric) (defaults to: 0.35)
  • mix: (Numeric) (defaults to: 0.5)
  • delay: (Numeric)


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

#latencyObject



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_durationObject



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