class Beats::Transforms::SongSwinger
Public Class Methods
transform(song, swing_rate)
click to toggle source
# File lib/beats/transforms/song_swinger.rb, line 6 def self.transform(song, swing_rate) validate_swing_rate(swing_rate) song.patterns.each do |pattern_name, pattern| swung_tracks = pattern.tracks.map do |track_name, track| if swing_rate == 8 Track.new(track.name, swing_8(track.rhythm)) elsif swing_rate == 16 Track.new(track.name, swing_16(track.rhythm)) end end song.patterns[pattern_name] = Pattern.new(pattern_name, swung_tracks) end song.tempo *= 1.5 song end
Private Class Methods
swing_16(original_rhythm)
click to toggle source
# File lib/beats/transforms/song_swinger.rb, line 46 def self.swing_16(original_rhythm) original_rhythm.chars.each_slice(2).inject("") do |new_rhythm, slice| new_rhythm << "#{slice[0]}.#{slice[1]}" new_rhythm end end
swing_8(original_rhythm)
click to toggle source
# File lib/beats/transforms/song_swinger.rb, line 34 def self.swing_8(original_rhythm) original_rhythm.chars.each_slice(4).inject("") do |new_rhythm, slice| if slice.length == 1 new_rhythm << "#{slice[0]}." else new_rhythm << "#{slice[0]}.#{slice[1]}.#{slice[2]}#{slice[3]}" end new_rhythm end end
validate_swing_rate(swing_rate)
click to toggle source
# File lib/beats/transforms/song_swinger.rb, line 28 def self.validate_swing_rate(swing_rate) if swing_rate != 8 && swing_rate != 16 raise InvalidSwingRateError, "Invalid swing rate: '#{swing_rate}'. Swing rate must be 8 or 16." end end