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