class MorseCode::Sample

Constants

CHAR_SPACE
DAH_LENGTH
DIT_LENGTH
DIT_SPACE
WORD_SPACE

Attributes

frequency[R]
message[R]
sample_rate[R]

Public Class Methods

new(message, frequency = 600, sample_rate = 8000) click to toggle source
# File lib/morse_code/sample.rb, line 11
def initialize(message, frequency = 600, sample_rate = 8000)
  @message = message
  @frequency = frequency
  @sample_rate = sample_rate
end

Public Instance Methods

pcm_samples() click to toggle source

8-bit unsigned PCM format

# File lib/morse_code/sample.rb, line 18
def pcm_samples
  @pcm_samples ||= [].tap do |pcm_samples|
    samples.each { |sample| pcm_samples.push(128 + (127 * sample).round) }
  end
end

Private Instance Methods

samples() click to toggle source
# File lib/morse_code/sample.rb, line 26
def samples
  @samples ||= [].tap do |samples|
    counter = 2 * Math::PI * frequency / sample_rate
    return samples if timings.empty?

    flag = timings.first > 0 ? 1 : 0
    timings.each do |time|
      duration = sample_rate * time.abs / 1000
      0.upto(duration).each do |i|
        samples.push(flag * Math.sin(i * counter))
      end
      flag = 1 - flag
    end
  end
end
timings() click to toggle source
# File lib/morse_code/sample.rb, line 42
def timings
  @timings ||= [].tap do |timings|
    message.each_char do |char|
      case char
      when '.' then timings.push(DIT_LENGTH); timings.push(-DIT_SPACE)
      when '-' then timings.push(DAH_LENGTH); timings.push(-DIT_SPACE)
      when ' ' then timings.pop; timings.push(-CHAR_SPACE)
      when '/' then timings.pop; timings.push(-WORD_SPACE)
      end
    end
    timings.pop if timings.last == -DIT_SPACE
  end
end