Class: Deftones::Core::Delay
Instance Attribute Summary collapse
-
#delay_time ⇒ Object
readonly
Returns the value of attribute delay_time.
-
#max_delay ⇒ Object
readonly
Returns the value of attribute max_delay.
Instance Method Summary collapse
- #ensure_delay_line(channel_index) ⇒ Object private
-
#initialize(delay_time: 0.0, max_delay: 1.0, context: Deftones.context) ⇒ Delay
constructor
A new instance of Delay.
- #multichannel_process? ⇒ Boolean
- #process(input_block, num_frames, start_frame, _cache) ⇒ Object
Constructor Details
#initialize(delay_time: 0.0, max_delay: 1.0, context: Deftones.context) ⇒ Delay
Returns a new instance of Delay.
8 9 10 11 12 13 |
# File 'lib/deftones/core/delay.rb', line 8 def initialize(delay_time: 0.0, max_delay: 1.0, context: Deftones.context) super(context: context) @delay_time = Signal.new(value: delay_time, units: :time, context: context) @max_delay = [max_delay.to_f, @delay_time.value].max @delay_lines = [] end |
Instance Attribute Details
#delay_time ⇒ Object (readonly)
Returns the value of attribute delay_time.
6 7 8 |
# File 'lib/deftones/core/delay.rb', line 6 def delay_time @delay_time end |
#max_delay ⇒ Object (readonly)
Returns the value of attribute max_delay.
6 7 8 |
# File 'lib/deftones/core/delay.rb', line 6 def max_delay @max_delay end |
Instance Method Details
#ensure_delay_line(channel_index) ⇒ Object (private)
35 36 37 38 39 40 41 |
# File 'lib/deftones/core/delay.rb', line 35 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 * context.sample_rate).ceil) end @delay_lines[required] end |
#multichannel_process? ⇒ Boolean
15 16 17 |
# File 'lib/deftones/core/delay.rb', line 15 def multichannel_process? true end |
#process(input_block, num_frames, start_frame, _cache) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/deftones/core/delay.rb', line 19 def process(input_block, num_frames, start_frame, _cache) delay_values = @delay_time.process(num_frames, start_frame) AudioBlock.from_channel_data( input_block.channel_data.each_with_index.map do |channel, channel_index| delay_line = ensure_delay_line(channel_index) Array.new(num_frames) do |index| delay_seconds = [delay_values[index], 0.0].max delay_samples = [delay_seconds * context.sample_rate, @max_delay * context.sample_rate].min delay_line.tap(delay_samples, input_sample: channel[index], feedback: 0.0) end end ) end |