Class: Deftones::Effects::FeedbackDelay

Inherits:
Core::Effect show all
Defined in:
lib/deftones/effect/feedback_delay.rb

Direct Known Subclasses

PingPongDelay

Instance Attribute Summary collapse

Attributes inherited from Core::Effect

#wet

Instance Method Summary collapse

Methods inherited from Core::Effect

#multichannel_process?, #normalize_channel_output, #process, #process_effect_block

Constructor Details

#initialize(delay_time: "8n", feedback: 0.3, max_delay: 2.0, context: Deftones.context, **options) ⇒ FeedbackDelay

Returns a new instance of FeedbackDelay.



8
9
10
11
12
13
14
# File 'lib/deftones/effect/feedback_delay.rb', line 8

def initialize(delay_time: "8n", feedback: 0.3, max_delay: 2.0, context: Deftones.context, **options)
  super(context: context, **options)
  @delay_time = Core::Signal.new(value: delay_time, units: :time, context: context)
  @feedback = Core::Signal.new(value: feedback, units: :number, context: context)
  @max_delay_samples = (max_delay * context.sample_rate).ceil
  @delay_lines = []
end

Instance Attribute Details

#delay_timeObject (readonly)

Returns the value of attribute delay_time.



6
7
8
# File 'lib/deftones/effect/feedback_delay.rb', line 6

def delay_time
  @delay_time
end

#feedbackObject (readonly)

Returns the value of attribute feedback.



6
7
8
# File 'lib/deftones/effect/feedback_delay.rb', line 6

def feedback
  @feedback
end

Instance Method Details

#ensure_delay_line(channel_index) ⇒ Object (private)



30
31
32
33
34
35
36
# File 'lib/deftones/effect/feedback_delay.rb', line 30

def ensure_delay_line(channel_index)
  required = [channel_index.to_i, 0].max
  while @delay_lines.length <= required
    @delay_lines << DSP::DelayLine.new(@max_delay_samples)
  end
  @delay_lines[required]
end

#process_effect(input_buffer, num_frames, start_frame, _cache, channel_index: 0) ⇒ Object (private)



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/deftones/effect/feedback_delay.rb', line 18

def process_effect(input_buffer, num_frames, start_frame, _cache, channel_index: 0)
  delays = @delay_time.process(num_frames, start_frame)
  feedbacks = @feedback.process(num_frames, start_frame)
  delay_line = ensure_delay_line(channel_index)

  Array.new(num_frames) do |index|
    delay_samples = delays[index] * context.sample_rate
    feedback = feedbacks[index].to_f.clamp(-0.999, 0.999)
    delay_line.tap(delay_samples, input_sample: input_buffer[index], feedback: feedback)
  end
end