Class: Deftones::Component::FeedbackCombFilter

Inherits:
Deftones::Core::AudioNode show all
Defined in:
lib/deftones/component/feedback_comb_filter.rb

Instance Attribute Summary collapse

Attributes inherited from Deftones::Core::AudioNode

#context, #input

Instance Method Summary collapse

Methods inherited from Deftones::Core::AudioNode

#>>, #attach_destination, #attach_source, #block_time, #chain, #channel_count, #channel_count_mode, #channel_interpretation, #connect, #connected?, #default_input_channels, #default_output_channels, #destination_for_connection, #detach_all_destinations, #detach_destination, #detach_source, #disconnect, #dispose, #disposed?, #fan, #get, #immediate, #input_for_index, #inputs, #mix_source_blocks, #name, #normalize_connection_index, #normalize_output_block, #now, #number_of_inputs, #number_of_outputs, #output, #output_for_connection, #output_for_index, #outputs, #raise_connection_index_error!, #reaches_node?, #render, #render_block, #sample_time, #set, #to_destination, #to_frequency, #to_master, #to_midi, #to_output, #to_s, #to_seconds, #to_ticks, #uses_legacy_render_for_block?, #validate_connectable!, #validate_connection_index!

Constructor Details

#initialize(delay_time: 0.1, resonance: 0.5, max_delay: 1.0, context: Deftones.context) ⇒ FeedbackCombFilter

Returns a new instance of FeedbackCombFilter.



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

def initialize(delay_time: 0.1, resonance: 0.5, max_delay: 1.0, context: Deftones.context)
  super(context: context)
  @delay_time = Core::Signal.new(value: delay_time, units: :time, context: context)
  @resonance = Core::Signal.new(value: resonance, units: :number, context: context)
  @max_delay_samples = [(max_delay.to_f * context.sample_rate).ceil, 2].max
  @delay_lines = []
end

Instance Attribute Details

#delay_timeObject

Returns the value of attribute delay_time.



6
7
8
# File 'lib/deftones/component/feedback_comb_filter.rb', line 6

def delay_time
  @delay_time
end

#resonanceObject

Returns the value of attribute resonance.



6
7
8
# File 'lib/deftones/component/feedback_comb_filter.rb', line 6

def resonance
  @resonance
end

Instance Method Details

#clamp_resonance(value) ⇒ Object (private)



59
60
61
# File 'lib/deftones/component/feedback_comb_filter.rb', line 59

def clamp_resonance(value)
  value.to_f.clamp(-0.999, 0.999)
end

#delay_samples(duration) ⇒ Object (private)



54
55
56
57
# File 'lib/deftones/component/feedback_comb_filter.rb', line 54

def delay_samples(duration)
  samples = duration.to_f * context.sample_rate
  [[samples, 1.0].max, @max_delay_samples].min
end

#ensure_delay_lines(channels) ⇒ Object (private)



67
68
69
70
71
72
# File 'lib/deftones/component/feedback_comb_filter.rb', line 67

def ensure_delay_lines(channels)
  required = [channels.to_i, 1].max
  while @delay_lines.length < required
    @delay_lines << DSP::DelayLine.new(@max_delay_samples)
  end
end

#filtered_feedback(sample, _index, _start_frame, _channel_index = 0) ⇒ Object (private)



63
64
65
# File 'lib/deftones/component/feedback_comb_filter.rb', line 63

def filtered_feedback(sample, _index, _start_frame, _channel_index = 0)
  sample
end

#multichannel_process?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/deftones/component/feedback_comb_filter.rb', line 24

def multichannel_process?
  true
end

#process(input_block, num_frames, start_frame, _cache) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/deftones/component/feedback_comb_filter.rb', line 28

def process(input_block, num_frames, start_frame, _cache)
  delay_times = @delay_time.process(num_frames, start_frame)
  resonances = @resonance.process(num_frames, start_frame)
  ensure_delay_lines(input_block.channels)

  Core::AudioBlock.from_channel_data(
    input_block.channel_data.each_with_index.map do |channel, channel_index|
      delay_line = @delay_lines[channel_index]

      Array.new(num_frames) do |index|
        delayed = delay_line.read(delay_samples(delay_times[index]))
        feedback = filtered_feedback(delayed, index, start_frame, channel_index)
        delay_line.write(channel[index] + (feedback * clamp_resonance(resonances[index])))
        delayed
      end
    end
  )
end

#reset!Object



47
48
49
50
# File 'lib/deftones/component/feedback_comb_filter.rb', line 47

def reset!
  @delay_lines = []
  self
end