class SMF::TempoMap

Public Class Methods

new(sq) click to toggle source
# File lib/smf/toy/tempomap.rb, line 23
def initialize(sq)
  @div = sq.division
  @map = [[0, 120, 0]] # [[offset, bpm, elapse]]
  sq.each do |tr|
    tr.each do |ev|
      case ev
      when SetTempo; @map << [ev.offset, 60000000.to_r / ev.tempo, 0]
      end
    end
  end
  i = 0
  @map = @map.sort_by{|x| [x[0], i += 1]}
  lx = nil
  @map.each do |x|
    if lx
      s = o2e(@div, x[0] - lx[0], lx[1])
      x[2] = lx[2] + s
    end
    lx = x
  end
end

Public Instance Methods

elapse2frame(elapse, tc=30) click to toggle source
# File lib/smf/toy/tempomap.rb, line 59
def elapse2frame(elapse, tc=30)
  hr, mod = elapse.divmod(3600.to_r)
  mn, mod = mod.divmod(60.to_r)
  se, mod = mod.divmod(1.to_r)
  fr, mod = mod.divmod(1.to_r/tc)
  ff, mod = mod.divmod(1.to_r/tc/100)
  [hr, mn, se, fr, ff]
end
elapse2offset(elapse) click to toggle source
# File lib/smf/toy/tempomap.rb, line 52
def elapse2offset(elapse)
  i = search_segment(@map){|x| x[2] <=> elapse}
  lx = @map[i]
  offset = lx[0] + e2o(@div, elapse - lx[2], lx[1])
  offset.round
end
frame2elapse(frame, tc=30) click to toggle source
# File lib/smf/toy/tempomap.rb, line 68
def frame2elapse(frame, tc=30)
  frame[0] * 3600 + frame[1] * 60 + frame[2] +
    frame[3].to_r / tc + frame[4].to_r / (100 * tc)
end
offset2elapse(offset) click to toggle source
# File lib/smf/toy/tempomap.rb, line 45
def offset2elapse(offset)
  i = search_segment(@map){|x| x[0] <=> offset}
  lx = @map[i]
  elapse = lx[2] + o2e(@div, offset - lx[0], lx[1])
  elapse
end

Private Instance Methods

e2o(div, elapse, tempo) click to toggle source
# File lib/smf/toy/tempomap.rb, line 17
def e2o(div, elapse, tempo)
  elapse * div / (60.to_r/tempo)
end
o2e(div, offset, tempo) click to toggle source
# File lib/smf/toy/tempomap.rb, line 13
def o2e(div, offset, tempo)
  offset * (60.to_r/tempo) / div
end