Class: Deftones::Core::Delay

Inherits:
AudioNode
  • Object
show all
Defined in:
lib/deftones/core/delay.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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_timeObject (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_delayObject (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

Returns:

  • (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