class GTP::GP4
Constants
- FIELDS
- INTEGER_SIZE
Attributes
file[RW]
file_path[R]
key[RW]
lyrics[RW]
measures[RW]
num_measures[RW]
num_tracks[RW]
octave[RW]
offset[RW]
tempo[RW]
version[RW]
Public Class Methods
new(tab_path)
click to toggle source
# File lib/GTP/gp4.rb, line 15 def initialize(tab_path) @reader = Reader.new tab_path @file = File.open(tab_path, "r") end
Public Instance Methods
call()
click to toggle source
# File lib/GTP/gp4.rb, line 20 def call parse_version parse_info parse_lyrics parse_tempo parse_key parse_octave parse_midi_channels # <----- PARSE ME PLEASE!!! parse_number_of_measures parse_number_of_tracks parse_measures end
fix_header(header)
click to toggle source
# File lib/GTP/gp4.rb, line 33 def fix_header header counter = 0 new_header = header.reverse while 8 > new_header.size new_header << "0" end return new_header end
parse_info()
click to toggle source
# File lib/GTP/gp4.rb, line 50 def parse_info FIELDS.each do |field| self.public_send "parse_#{field}" end end
parse_key()
click to toggle source
# File lib/GTP/gp4.rb, line 98 def parse_key self.key = @reader.read_integer end
parse_lyrics()
click to toggle source
# File lib/GTP/gp4.rb, line 78 def parse_lyrics track = @reader.read_integer self.lyrics = [] 5.times do bar = @reader.read_integer content = @reader.read_int_string tuple = {} tuple.store(bar, content.gsub("\r\n", "\n")) self.lyrics.push(tuple) end end
parse_measures()
click to toggle source
# File lib/GTP/gp4.rb, line 118 def parse_measures self.measures = [] for n in 1..self.num_measures do header = fix_header @reader.read_byte.to_s(2) numerator = nil denominator = nil begin_repeat = nil end_repeat = nil marker_name = nil marker_color = nil tonality = nil double_bar = nil if header[0] == "1" numerator = @reader.read_byte end if header[1] == "1" denominator = @reader.read_byte end if header[2] == "1" begin_repeat = true end if header[3] == "1" end_repeat = @reader.read_byte end if header[4] == "1" num_alt_ending = @reader.read_byte end if header[5] == "1" marker_name = @reader.read_string marker_color = @reader.read_integer end if header[6] == "1" tonality = @reader.read_byte @reader.increment_offset 1 end if header[7] == "1" double_bar = true end measure = Measure.new measure.numerator = numerator measure.denominator = denominator measure.begin_repeat = begin_repeat measure.end_repeat = end_repeat measure.num_alt_ending = num_alt_ending measure.marker_name = marker_name measure.marker_color = marker_color measure.tonality = tonality measure.double_bar = double_bar self.measures.push(measure) end end
parse_midi_channels()
click to toggle source
# File lib/GTP/gp4.rb, line 106 def parse_midi_channels @reader.increment_offset (12 * 16 * 4) # TODO end
parse_notice()
click to toggle source
# File lib/GTP/gp4.rb, line 62 def parse_notice linesCount = @reader.read_integer notice = "" linesCount.times do notice << @reader.read_default_string << "\n" end self.notice = notice end
parse_number_of_measures()
click to toggle source
# File lib/GTP/gp4.rb, line 110 def parse_number_of_measures self.num_measures = @reader.read_integer.to_i end
parse_number_of_tracks()
click to toggle source
# File lib/GTP/gp4.rb, line 114 def parse_number_of_tracks self.num_tracks = @reader.read_integer end
parse_octave()
click to toggle source
# File lib/GTP/gp4.rb, line 102 def parse_octave self.octave = @reader.read_byte end
parse_tempo()
click to toggle source
# File lib/GTP/gp4.rb, line 94 def parse_tempo self.tempo = @reader.read_integer.to_i end
parse_triplet_feel()
click to toggle source
# File lib/GTP/gp4.rb, line 74 def parse_triplet_feel self.triplet_feel = @reader.read_byte.to_s end
parse_version()
click to toggle source
# File lib/GTP/gp4.rb, line 46 def parse_version self.version = @reader.read_string end
to_json()
click to toggle source
# File lib/GTP/gp4.rb, line 183 def to_json { "score" => { "info" => { "version" => self.version, "title" => self.title, "subtitle" => self.subtitle, "artist" => self.artist, "album" => self.album, "author" => self.author, "copyright" => self.copyright }, "tempo" => self.tempo, "key" => self.key, "num_track" => self.num_tracks, "num_measures" => self.num_measures } }.to_json end