diff --git a/lib/abc/tune_body.rb b/lib/abc/tune_body.rb index a41caf0..6cf38b5 100644 --- a/lib/abc/tune_body.rb +++ b/lib/abc/tune_body.rb @@ -1,7 +1,54 @@ module ABC - class TuneBody + class Note + attr_reader :name, :raw + def initialize(note) + @raw = note + @name = note + end + end + class Measure + attr_reader :notes, :raw + def initialize(measure = "") + @raw = measure + @notes = [] + measure.each_char do |char| + @notes << Note.new(char) if char =~ /[A-G]/i + end + end + end + class TuneBody + attr_reader :notes, :measures, :raw def initialize(body) + @raw = body + @notes = [] + @measures = [] + body.each_line do |line| + #binding.pry + unless line.match(/^[A-Z]:/i) + line.chomp.split(/\|+/).each do |measure| + @measures << Measure.new(measure) + end + if line.match(/:\|$/) + line.chomp.split(/\|+/).each do |measure| + @measures << Measure.new(measure) + end + end + end + #repeat = (line.match(/:\|$/)) ? 2 : 1 + #repeat.times do + # unless line.match(/^[A-Z]:/i) + # line.each_char do |char| + # repeat_line = false + # @measures << Measure.new if char =~ /\|/ + # @notes << Note.new(char) if char =~ /[A-G]/i + # end + # end + #end + end + @measures.each do |measure| + @notes += measure.notes + end end end end diff --git a/lib/abc/tune_header.rb b/lib/abc/tune_header.rb index d9e254b..2a1f2a0 100644 --- a/lib/abc/tune_header.rb +++ b/lib/abc/tune_header.rb @@ -1,20 +1,26 @@ module ABC class TuneHeader - attr_reader :reference, :titles, :meter, :key + attr_reader :reference, :titles, :meter, :key, :source, :notes, :rhythm def initialize(header) header.each_line do |line| #binding.pry case line + #when /^[A-Za-z]:/ + # @fields ||= [] + # @fields << InformationField.new(line) when /^X:(?\d+)/ then @reference = $~[:reference].to_i - when /^T:(?.*?)(?=\s*%.*)/ + when /^T:(?<title>[^%]*)(%.*)?/ @titles ||= [] - @titles << $~[:title] + @titles << $~[:title].strip when /^C:/ - when /^S:/ + when /^S:(?<source>[^%]*)(%.*)?/ then @source = $~[:source].strip when /^M:(?<meter>\S+)/ then @meter = $~[:meter] - when /^R:/ - when /^N:/ + when /^R:(?<rhythm>[^%]*)(%.*)?/ + @rhythm = $~[:rhythm].strip + when /^N:(?<note>[^%]*)(%.*)?/ + @notes ||= [] + @notes << $~[:note].strip when /^K:(?<key>\S+)/ then @key = $~[:key] end end diff --git a/spec/abc/tune_body_spec.rb b/spec/abc/tune_body_spec.rb new file mode 100644 index 0000000..3735f09 --- /dev/null +++ b/spec/abc/tune_body_spec.rb @@ -0,0 +1,12 @@ +require 'spec_helper' + +describe ABC::TuneBody do + let(:body) {ABC::File.new("spec/fixtures/english.abc").tunes[0].body} + it "should start with a B" do + expect(body.notes[0].name).to eq "B" + end + it "should have 24 measures" do + expect(body.measures.size).to eq 24 + end + it "should repeat the first 4 measures twice" +end