lib/midi_lyrics.rb in midi_lyrics-0.0.3 vs lib/midi_lyrics.rb in midi_lyrics-0.0.4
- old
+ new
@@ -26,10 +26,14 @@
def duration
format_time(duration_in_pulses)
end
+ def blank?
+ text.strip == ""
+ end
+
def similar_to?(another)
self.duration_in_pulses == another.duration_in_pulses && self.text == another.text
end
def as_json
@@ -71,14 +75,11 @@
def load_tracks
@lyrics_track = ::MIDI::Track.new(@sequence)
@noteon_track = ::MIDI::Track.new(@sequence)
@sequence.tracks[1].each do | event |
if event.kind_of?(::MIDI::MetaEvent) && event.meta_type == ::MIDI::META_LYRIC
- text = event.data.collect{|x| x.chr(Encoding::UTF_8)}.join
- if text.gsub(" ", "") != ""
- @lyrics_track.events << event
- end
+ @lyrics_track.events << event
end
if event.kind_of?(::MIDI::NoteOn)
@noteon_track.events << event
end
end
@@ -90,33 +91,49 @@
@durations[event.time_from_start] = event.off.time_from_start - event.time_from_start
end
end
def load_lyrics
- @lyrics = @lyrics_track.collect do |event|
- LyricSyllable.new(
- sequence: @sequence,
- start_in_pulses: event.time_from_start,
- duration_in_pulses: @durations[event.time_from_start],
- text: event.data.collect{|x| x.chr(Encoding::UTF_8)}.join,
- )
+ @lyrics = []
+ @lyrics_track.each do |event|
+ parts = event.data.collect{|x| x.chr(Encoding::UTF_8)}.join.match(/([^\s]*)(\s*)/)
+ if parts[1] != ""
+ @lyrics << LyricSyllable.new(
+ sequence: @sequence,
+ start_in_pulses: event.time_from_start,
+ duration_in_pulses: @durations[event.time_from_start],
+ text: parts[1]
+ )
+ end
+ if parts[2] != ""
+ @lyrics << LyricSyllable.new(
+ sequence: @sequence,
+ start_in_pulses: event.time_from_start,
+ duration_in_pulses: 0,
+ text: parts[2]
+ )
+ end
end
end
def remove_heading_blank_lines
while @lyrics.first.text.strip == ""
@lyrics.shift
end
end
- def consolidate_carriage_returns
+ def consolidate_empty_syllables
new_lyrics = []
@lyrics.each do |l|
- if ["\r", "\n"].include?(l.text)
- l.start_in_pulses = new_lyrics.last.start_in_pulses + new_lyrics.last.duration_in_pulses
- l.duration_in_pulses = 0
- new_lyrics << l
+ if l.blank?
+ if new_lyrics.last.blank?
+ new_lyrics.last.text += l.text
+ else
+ l.start_in_pulses = new_lyrics.last.start_in_pulses + new_lyrics.last.duration_in_pulses
+ l.duration_in_pulses = 0.0
+ new_lyrics << l
+ end
else
new_lyrics << l
end
end
@lyrics = new_lyrics
@@ -149,10 +166,10 @@
read_sequence_from_file
load_tracks
calculate_durations
load_lyrics
remove_heading_blank_lines
- consolidate_carriage_returns
+ consolidate_empty_syllables
remove_repeating unless repeating
@lyrics
end
end
end