# 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
# File lib/bio/shell/plugin/midi.rb, line 277 def c2s(code) ans = "" code.each do |c| ans += c.chr end ans end
# 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
# 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
# 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
# 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
Generated with the Darkfish Rdoc Generator 2.