Class: Deftones::Component::FeedbackCombFilter
Instance Attribute Summary collapse
#context, #input
Instance Method Summary
collapse
#>>, #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_time ⇒ Object
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
|
#resonance ⇒ Object
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
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
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
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
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
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
|