class SMF::Morse

Constants

CODE
PLAIN

Public Class Methods

new(sq, te=120) click to toggle source
# File lib/smf/toy/morse.rb, line 74
def initialize(sq, te=120)
  @sq = sq << Track.new
  @te = te
  @mesg = []
end

Public Instance Methods

<<(s) click to toggle source
# File lib/smf/toy/morse.rb, line 80
def << (s) @mesg << s end
generate() click to toggle source
# File lib/smf/toy/morse.rb, line 98
def generate
  of = 0
  @sq[0] << SetTempo.new(of, 60000000 / 240)
  @sq[0] << GMSystemOn.new(of)
  of += @sq.division / 2
  @sq[0] << ProgramChange.new(of, 0, 81)
  of += @sq.division / 2
  @sq[0] << SetTempo.new(of, 60000000 / @te)
  @mesg.each do |s|
    @sq[0] << Marker.new(of, s)
    encode(plain(s)).each_byte do |c|
      case c
      when ?.; le = (@sq.division / 8) * 1
      when ?-; le = (@sq.division / 8) * 3
      else;    le = (@sq.division / 8) * 1
      end
      if c == ?. || c == ?-
        @sq[0] << NoteOn .new(of,      0, 69, 96)
        @sq[0] << NoteOff.new(of + le, 0, 69, 64)
      end
      of += le
    end
  end
  @sq[0] << EndOfTrack.new(of)
end

Private Instance Methods

encode(s) click to toggle source
# File lib/smf/toy/morse.rb, line 88
def encode(s)
  s.downcase.scan(/\S+/).collect {|w|
    w.scan(/./).collect{|c|
      (CODE[c[0]] || '').scan(/./).join("\s")
    }.join("\s"*3)
  }.join("\s"*7) + "\s"*15
end
plain(s) click to toggle source
# File lib/smf/toy/morse.rb, line 82
def plain(s)
  s = s.dup
  PLAIN.each_pair{|k, v| s.gsub!(k, ' %s ' % v)}
  s
end