class Bio::Sequence::NA::MidiTrack

Constants

MidiProg
Styles

Public Class Methods

new(channel = 0, program = nil, base = nil, range = nil, scale = nil) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 207
def initialize(channel = 0, program = nil, base = nil, range = nil, scale = nil)
  @channel = channel & 0xff
  @program = program || 0
  @base    = base    || 60
  @range   = range   || 2
  @scale   = scale   || [0, 2, 4, 5, 7, 9, 11]

  @tunes   = []
  @tune    = 0
  @code    = []
  @time    = 0

  @range.times do |i|
    @scale.each do |c|
      @tunes.push c + i * 12
    end
  end

  @ttype = {
    'aa' =>  1, 'at' =>  0, 'ac' => 3, 'ag' => -1,
    'ta' =>  0, 'tt' => -1, 'tc' => 1, 'tg' => -2,
    'ca' =>  2, 'ct' =>  1, 'cc' => 2, 'cg' =>  6,
    'ga' => -1, 'gt' => -3, 'gc' => 0, 'gg' => -2,
  }
  @dtype = [
    { 'aa' => 2, 'at' => 4, 'ac' => 4, 'ag' => 2,
      'ta' => 2, 'tt' => 4, 'tc' => 4, 'tg' => 2,
      'ca' => 2, 'ct' => 3, 'cc' => 1, 'cg' => 2,
      'ga' => 1, 'gt' => 2, 'gc' => 2, 'gg' => 3,
    },
    { 'aa' => 3, 'at' => 3, 'ac' => 2, 'ag' => 3,
      'ta' => 3, 'tt' => 3, 'tc' => 2, 'tg' => 2,
      'ca' => 3, 'ct' => 2, 'cc' => 1, 'cg' => 1,
      'ga' => 1, 'gt' => 1, 'gc' => 1, 'gg' => 1,
    },
    { 'aa' => 2, 'at' => 2, 'ac' => 2, 'ag' => 2,
      'ta' => 1, 'tt' => 1, 'tc' => 2, 'tg' => 2,
      'ca' => 2, 'ct' => 2, 'cc' => 2, 'cg' => 3,
      'ga' => 2, 'gt' => 2, 'gc' => 3, 'gg' => 1,
    },
    { 'aa' => 1, 'at' => 1, 'ac' => 1, 'ag' => 1,
      'ta' => 1, 'tt' => 1, 'tc' => 1, 'tg' => 1,
      'ca' => 1, 'ct' => 1, 'cc' => 1, 'cg' => 3,
      'ga' => 1, 'gt' => 1, 'gc' => 1, 'gg' => 1,
    },
  ]

  @code.concat [0x00, 0xc0 | (@channel & 0xff)]
  @code.concat icode(@program & 0xff, 1)
end

Public Instance Methods

c2s(code) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 277
def c2s(code)
  ans = ""
  code.each do |c|
    ans += c.chr
  end
  ans
end
encode() click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 317
def encode
  ans ="MTrk"
  ans += c2s(icode(@code.length + 4, 4))
  ans += c2s(@code)
  ans += c2s([0x00, 0xff, 0x2f, 0x00])
  ans
end
header(num, tempo = 120) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 325
def header(num, tempo = 120)
  ans = "MThd"
  ans += c2s(icode(6, 4))
  ans += c2s(icode(1, 2))
  ans += c2s(icode(num + 1, 2))
  ans += c2s(icode(480, 2))
  ans += "MTrk"
  ans += c2s(icode(11, 4))
  ans += c2s([0x00, 0xff, 0x51, 0x03])
  ans += c2s(icode(60000000 / tempo, 3))
  ans += c2s([0x00, 0xff, 0x2f, 0x00])
  ans
end
icode(num, n) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 258
def icode(num, n)
  code = []
  n.times do |i|
    code.push num & 0xff
    num >>= 8
  end
  code.reverse
end
push(s) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 285
def push(s)
  tt = @time % 4
  t = @ttype[s[0, 2]]
  d = @dtype[tt][s[2, 2]]
  if !t.nil? && !d.nil?
    @tune += t
    @tune = @tunes.length
    if tt == 0
      vel = 90
    elsif tt == 1 && d > 1
      vel = 100
    elsif tt == 2
      vel = 60
    else
      vel = 50
    end
    @code.concat rcode(1)
    @code.concat [0x90 | @channel, @tunes[@tune] + @base, vel]
    @code.concat rcode(240 * d)
    @code.concat [0x80 | @channel, @tunes[@tune] + @base, 0]
    @time += d
  end
end
push_silent(d) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 309
def push_silent(d)
  @code.concat rcode(1)
  @code.concat [0x90 | @channel, 0, 0]
  @code.concat rcode(240 * d)
  @code.concat [0x80 | @channel, 0, 0]
  @time += d;
end
rcode(num) click to toggle source
# File lib/bio/shell/plugin/midi.rb, line 267
def rcode(num)
  code = []
  code.push num & 0x7f
  while num > 0x7f
    num >>= 7
    code.push num & 0x7f | 0x80
  end
  code.reverse
end