class AudioStream::Fx::Delay

Public Class Methods

new(soundinfo, time:, level:, feedback:) click to toggle source

@param soundinfo [AudioStream::SoundInfo] @param time [AudioStream::Rate] delay time @param level [AudioStream::Decibel] wet gain @param feedback [AudioStream::Decibel] feedback level

# File lib/audio_stream/fx/delay.rb, line 8
def initialize(soundinfo, time:, level:, feedback:)
  @level = Decibel.create(level).mag
  @feedback = Decibel.create(feedback).mag

  @delaysample = time.sample(soundinfo).round
  @delaybuf0 = Array.new(@delaysample, 0.0)
  @delaybuf1 = Array.new(@delaysample, 0.0)
  @seek = 0
end

Public Instance Methods

process(input) click to toggle source
# File lib/audio_stream/fx/delay.rb, line 18
def process(input)
  window_size = input.window_size
  channels = input.channels

  src0 = input.streams[0]
  src1 = input.streams[1]

  case channels
  when 1
    output = Buffer.create_mono(window_size)
    dst0 = output.streams[0]

    src0.each_with_index {|f, i|
      tmp0 = f + @level * @delaybuf0[@seek]
      @delaybuf0[@seek] = f + @feedback * @delaybuf0[@seek]
      dst0[i] = tmp0
      @seek = (@seek + 1) % @delaysample
    }
    output
  when 2
    output = Buffer.create_stereo(window_size)
    dst0 = output.streams[0]
    dst1 = output.streams[1]

    window_size.times {|i|
      tmp0 = src0[i] + @level * @delaybuf0[@seek]
      tmp1 = src1[i] + @level * @delaybuf1[@seek]

      @delaybuf0[@seek] = src0[i] + @feedback * @delaybuf0[@seek]
      @delaybuf1[@seek] = src1[i] + @feedback * @delaybuf1[@seek]

      dst0[i] = tmp0
      dst1[i] = tmp1

      @seek = (@seek + 1) % @delaysample
    }
    output
  end
end