Class: Musicality::DrumPattern
- Inherits:
-
Object
- Object
- Musicality::DrumPattern
- Defined in:
- lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb
Constant Summary collapse
- DRUM_PART_PITCHES =
{ DrumParts::BASS_DRUM => Pitches::G1, DrumParts::SNARE_DRUM => Pitches::G3, DrumParts::HI_TOM => Pitches::D3, DrumParts::MED_TOM => Pitches::B2, DrumParts::LOW_TOM => Pitches::G2, }
- DUMMY_PITCH =
Pitches::C4
Instance Attribute Summary collapse
-
#duration ⇒ Object
readonly
Returns the value of attribute duration.
-
#part_notes ⇒ Object
readonly
Returns the value of attribute part_notes.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(duration, part_portions) ⇒ DrumPattern
constructor
A new instance of DrumPattern.
Constructor Details
#initialize(duration, part_portions) ⇒ DrumPattern
Returns a new instance of DrumPattern.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb', line 15 def initialize duration, part_portions @duration = duration non_drumpart_names = part_portions.select do |part_name| !DRUM_PARTS.include?(part_name) end if non_drumpart_names.any? raise ArgumentError, "Part names used that are not drum parts: #{non_drumpart_names.inspect}" end accent_offsets = if part_portions.has_key?(DrumParts::ACCENT) DrumPattern.determine_accent_offsets( part_portions.delete(DrumParts::ACCENT).to_rhythm_class.to_rhythm(duration)) else [] end @part_notes = Hash[ part_portions.map do |part_name, portions| pitch = DRUM_PART_PITCHES[part_name] || DUMMY_PITCH notes = portions.to_rhythm_class.to_rhythm(duration).to_notes(pitch) DrumPattern.apply_accents(notes, accent_offsets) [ part_name, notes ] end ] end |
Instance Attribute Details
#duration ⇒ Object (readonly)
Returns the value of attribute duration.
4 5 6 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb', line 4 def duration @duration end |
#part_notes ⇒ Object (readonly)
Returns the value of attribute part_notes.
4 5 6 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb', line 4 def part_notes @part_notes end |
Class Method Details
.apply_accents(notes, accent_offsets) ⇒ Object
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb', line 54 def self.apply_accents notes, accent_offsets cum_dur = 0 notes.each do |note| if note.pitches.any? && accent_offsets.include?(cum_dur) note.mark_accented! end cum_dur += note.duration end end |
.determine_accent_offsets(accent_rhythm) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_pattern.rb', line 40 def self.determine_accent_offsets accent_rhythm accent_offsets = [] cum_dur = 0 accent_rhythm.durations.each do |dur| if dur > 0 accent_offsets.push cum_dur end cum_dur += dur end return accent_offsets end |