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