class SMF::Sequence::RSText

Public Class Methods

new(s, cb) click to toggle source
# File lib/smf/toy/text.rb, line 23
def initialize(s, cb) @s, @cb = s, cb end

Public Instance Methods

read() click to toggle source
# File lib/smf/toy/text.rb, line 174
def read
  rs = RSText::PO.new(@s)
  read_header(rs)
  until rs.eof?
    read_track(rs)
  end
  @cb.result
end

Private Instance Methods

get_name(s) click to toggle source
# File lib/smf/toy/text.rb, line 30
def get_name(s)
  s.sub!(/\A\s*(\S+)/, '')
  return $1
end
get_offset(s) click to toggle source
# File lib/smf/toy/text.rb, line 25
def get_offset(s)
  s.sub!(/\A\s*(\d+)/, '')
  return $1.to_i
end
get_params(s) click to toggle source
# File lib/smf/toy/text.rb, line 35
def get_params(s)
  s.scan(/\d+/).collect{|x| x.to_i}
end
get_text(s) click to toggle source
# File lib/smf/toy/text.rb, line 39
def get_text(s)
  eval(s)
end
read_header(rs) click to toggle source
# File lib/smf/toy/text.rb, line 45
def read_header(rs)
  ln = rs.gets
  name = get_name(ln)
  case name
  when /\AMThd/i
    f, n, d, s = get_params(ln)
    @cb.header(f, n, d, s)
  else
    @cb.error('not a text')
  end
end
read_track(rs) click to toggle source
# File lib/smf/toy/text.rb, line 57
def read_track(rs)
  ln = rs.gets
  case ln
  when /\AMTrk\z/i
    @cb.track_start
  else
    @cb.error('track not found')
  end
  loffset = 0
  until rs.eof?
    ln = rs.gets
    case ln
    when /\AMTrkEnd\z/i
      @cb.track_end
      return
    end
    offset = get_offset(ln)
    @cb.delta(offset - loffset)
    loffset = offset
    name = get_name(ln)
    case name
    when /\ANoteOff\z/i
      @cb.noteoff(*get_params(ln)[0,3])
    when /\ANoteOn\z/i
      @cb.noteon(*get_params(ln)[0,3])
    when /\APolyphonicKeyPressure\z/i
      @cb.polyphonickeypressure(*get_params(ln)[0,3])
    when /\AControlChange\z/i
      @cb.controlchange(*get_params(ln)[0,3])
    when /\AProgramChange\z/i
      @cb.programchange(*get_params(ln)[0,2])
    when /\AChannelPressure\z/i
      @cb.channelpressure(*get_params(ln)[0,2])
    when /\APitchBendChange\z/i
      @cb.pitchbendchange(*get_params(ln)[0,2])
    when /\AAllSoundOff\z/i
      ch, = get_params(ln)
      @cb.allsoundoff(ch)
    when /\AResetAllControllers\z/i
      ch, = get_params(ln)
      @cb.resetallcontrollers(ch)
    when /\ALocalControl\z/i
      ch, val, = get_params(ln)
      @cb.localcontrol(ch, val)
    when /\AAllNotesOff\z/i
      ch, = get_params(ln)
      @cb.allnotesoff(ch)
    when /\AOmniOff\z/i
      ch, = get_params(ln)
      @cb.omnioff(ch)
    when /\AOmniOn\z/i
      ch, = get_params(ln)
      @cb.omnion(ch)
    when /\AMonoMode\z/i
      ch, val, = get_params(ln)
      @cb.monomode(ch, val)
    when /\APolyMode\z/i
      ch, = get_params(ln)
      @cb.polymode(ch)
    when /\AExclusiveF0\z/i
      @cb.exclusivef0(get_text(ln))
    when /\AExclusiveF7\z/i
      @cb.exclusivef7(get_text(ln))
    when /\ASequenceNumber\z/i
      @cb.sequencenumber(*get_params(ln)[0,1])
    when /\A(GeneralPurposeText|Text01)\z/i
      @cb.generalpurposetext(get_text(ln))
    when /\A(CopyrightNotice|Text02)\z/i
      @cb.copyrightnotice(get_text(ln))
    when /\A(TrackName|SequenceName|Text03)\z/i
      @cb.trackname(get_text(ln))
    when /\A(InstrumentName|Text04)\z/i
      @cb.instrumentname(get_text(ln))
    when /\A(Lyric|Text05)\z/i
      @cb.lyric(get_text(ln))
    when /\A(Marker|Text06)\z/i
      @cb.marker(get_text(ln))
    when /\A(CuePoint|Text07)\z/i
      @cb.cuepoint(get_text(ln))
    when /\A(ProgramName|Text08)\z/i
      @cb.programname(get_text(ln))
    when /\A(DeviceName|Text09)\z/i
      @cb.devicename(get_text(ln))
    when /\AText0([A-F])\z/i
      case $1
      when 'A'; @cb.text0a(get_text(ln))
      when 'B'; @cb.text0b(get_text(ln))
      when 'C'; @cb.text0c(get_text(ln))
      when 'D'; @cb.text0d(get_text(ln))
      when 'E'; @cb.text0e(get_text(ln))
      when 'F'; @cb.text0f(get_text(ln))
      end
    when /\AChannelPrefix\z/i
      @cb.channelprefix(*get_params(ln)[0,1])
    when /\AMIDIPort\z/i
      @cb.midiport(*get_params(ln)[0,1])
    when /\AEndOfTrack\z/i
      @cb.endoftrack()
    when /\ASetTempo\z/i
      @cb.settempo(*get_params(ln)[0,1])
    when /\ASMPTEOffset\z/i
      @cb.smpteoffset(*get_params(ln)[0,6])
    when /\ATimeSignature\z/i
      @cb.timesignature(*get_params(ln)[0,4])
    when /\AKeySignature\z/i
      @cb.keysignature(*get_params(ln)[0,2])
    when /\ASequencerSpecific\z/i
      @cb.sequencerspecific(get_text(ln))
    else
      @cb.error('unknown event: ' + name)
    end
  end
  @cb.track_end
end