Class: Deftones::DSP::DelayLine

Inherits:
Object
  • Object
show all
Defined in:
lib/deftones/dsp/delay_line.rb

Instance Method Summary collapse

Constructor Details

#initialize(max_delay_samples) ⇒ DelayLine

Returns a new instance of DelayLine.



6
7
8
9
# File 'lib/deftones/dsp/delay_line.rb', line 6

def initialize(max_delay_samples)
  @buffer = Array.new([max_delay_samples.to_i + 2, 2].max, 0.0)
  @write_index = 0
end

Instance Method Details

#fractional_read(delay_samples) ⇒ Object (private)



29
30
31
32
33
34
35
36
37
38
# File 'lib/deftones/dsp/delay_line.rb', line 29

def fractional_read(delay_samples)
  read_position = @write_index - delay_samples
  read_position += @buffer.length while read_position.negative?

  base_index = read_position.floor % @buffer.length
  next_index = (base_index + 1) % @buffer.length
  fraction = read_position - read_position.floor

  Helpers.flush_denormal(Helpers.lerp(@buffer[base_index], @buffer[next_index], fraction))
end

#read(delay_samples) ⇒ Object



11
12
13
# File 'lib/deftones/dsp/delay_line.rb', line 11

def read(delay_samples)
  fractional_read(delay_samples.to_f)
end

#tap(delay_samples, input_sample: 0.0, feedback: 0.0) ⇒ Object



21
22
23
24
25
# File 'lib/deftones/dsp/delay_line.rb', line 21

def tap(delay_samples, input_sample: 0.0, feedback: 0.0)
  delayed_sample = read(delay_samples)
  write(input_sample + (delayed_sample * feedback))
  delayed_sample
end

#write(sample) ⇒ Object



15
16
17
18
19
# File 'lib/deftones/dsp/delay_line.rb', line 15

def write(sample)
  @buffer[@write_index] = Helpers.flush_denormal(sample)
  @write_index = (@write_index + 1) % @buffer.length
  sample
end