class SMF::Sequence::WS

Public Class Methods

new(o, cb) click to toggle source
# File lib/smf/io.rb, line 349
def initialize(o, cb) @o, @cb = o, cb end

Public Instance Methods

read() click to toggle source
# File lib/smf/io.rb, line 448
def read
  @cb.header(@o.format, @o.ntrks, @o.division, @o.tc)
  @o.each do |ck|
    case ck
    when Track
      read_track(ck)
    else
      @cb.unknownchunk(ck.ckid, ck.body)
    end
  end
  @cb.result
end

Private Instance Methods

read_meta(ev) click to toggle source
# File lib/smf/io.rb, line 351
def read_meta(ev)
  case ev
  when SequenceNumber
    @cb.sequencenumber(ev.num)
  when Text
    case ev
    when GeneralPurposeText; @cb.generalpurposetext(ev.text)
    when CopyrightNotice;    @cb.copyrightnotice(ev.text)
    when TrackName;          @cb.trackname(ev.text)
    when InstrumentName;     @cb.instrumentname(ev.text)
    when Lyric;              @cb.lyric(ev.text)
    when Marker;             @cb.marker(ev.text)
    when CuePoint;           @cb.cuepoint(ev.text)
    when ProgramName;        @cb.programname(ev.text)
    when DeviceName;         @cb.devicename(ev.text)
    when Text0A;             @cb.text0a(ev.text)
    when Text0B;             @cb.text0b(ev.text)
    when Text0C;             @cb.text0c(ev.text)
    when Text0D;             @cb.text0d(ev.text)
    when Text0E;             @cb.text0e(ev.text)
    when Text0F;             @cb.text0f(ev.text)
    end
  when ChannelPrefix
    @cb.channelprefix(ev.ch)
  when MIDIPort
    @cb.midiport(ev.num)
  when EndOfTrack
    @cb.endoftrack
  when SetTempo
    @cb.settempo(ev.tempo)
  when SMPTEOffset
    @cb.smpteoffset(ev.hr, ev.mn, ev.se, ev.fr, ev.ff, ev.tc)
  when TimeSignature
    @cb.timesignature(ev.nn, ev.dd, ev.cc, ev.bb)
  when KeySignature
    @cb.keysignature(ev.sf, ev.mi)
  when SequencerSpecific
    @cb.sequencerspecific(ev.data)
  else
    @cb.unknownmeta(ev.type, ev.data)
  end
end
read_track(tr) click to toggle source
# File lib/smf/io.rb, line 394
def read_track(tr)
  @cb.track_start
  offset = 0
  tr.each do |ev|
    @cb.delta(ev.offset - offset)
    case ev
    when NoteOff
      if ev.fake?
        @cb.noteon(ev.ch, ev.note, 0)
      else
        @cb.noteoff(ev.ch, ev.note, ev.vel)
      end
    when NoteOn
      @cb.noteon(ev.ch, ev.note, ev.vel)
    when PolyphonicKeyPressure
      @cb.polyphonickeypressure(ev.ch, ev.note, ev.val)
    when ControlChange
      @cb.controlchange(ev.ch, ev.num, ev.val)
    when ProgramChange
      @cb.programchange(ev.ch, ev.num)
    when ChannelPressure
      @cb.channelpressure(ev.ch, ev.val)
    when PitchBendChange
      @cb.pitchbendchange(ev.ch, ev.val)
    when AllSoundOff
      @cb.allsoundoff(ev.ch)
    when ResetAllControllers
      @cb.resetallcontrollers(ev.ch)
    when LocalControl
      @cb.localcontrol(ev.ch, ev.val)
    when AllNotesOff
      @cb.allnotesoff(ev.ch)
    when OmniOff
      @cb.omnioff(ev.ch)
    when OmniOn
      @cb.omnion(ev.ch)
    when MonoMode
      @cb.monomode(ev.ch, ev.val)
    when PolyMode
      @cb.polymode(ev.ch)
    when ExclusiveF0
      @cb.exclusivef0(ev.data)
    when ExclusiveF7
      @cb.exclusivef7(ev.data)
    when Meta
      read_meta(ev)
    end
    offset = ev.offset
  end
  @cb.track_end
end