Class: Musicality::DrumMachine
- Defined in:
- lib/musicality/composition/sequencing/drum_machine/drum_machine.rb
Instance Attribute Summary
Attributes inherited from Sequencer
#part_names, #part_sequenceables
Instance Method Summary collapse
-
#initialize(drum_patterns) ⇒ DrumMachine
constructor
A new instance of DrumMachine.
- #make_empty_parts(drum_kit, part_dynamics = {}) ⇒ Object
Methods inherited from Sequencer
Constructor Details
#initialize(drum_patterns) ⇒ DrumMachine
Returns a new instance of DrumMachine.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_machine.rb', line 4 def initialize drum_patterns raise ArgumentError if drum_patterns.empty? prev_durations = [] existing_part_notes = {} drum_patterns.each do |drum_pattern| durations = drum_pattern.part_notes.values.map do |notes| notes.inject(0) {|sum, note| sum + note.duration } end if durations.uniq.size != 1 raise ArgumentError, "Drum pattern has part notes of differing total duration #{drum_pattern}" end duration = durations.first if duration <= 0 raise ArgumentError, "Drum pattern has non-positive part notes" end drum_pattern.part_notes.each do |part_name, notes| # Create part with rest notes from all the previous patterns durations unless existing_part_notes.has_key?(part_name) existing_part_notes[part_name] = prev_durations.map { |d| Note.new(d) } end existing_part_notes[part_name] += notes end # For parts that exist previously but not in the current drum pattern, add a rest note existing_part_notes.each do |part_name, notes| unless drum_pattern.part_notes.has_key?(part_name) existing_part_notes[part_name].push Note.new(duration) end end prev_durations.push duration end part_sequenceables = Hash[ existing_part_notes.map do |part_name, note_array| [ part_name, NoteArray.new(note_array) ] end] super(part_sequenceables) end |
Instance Method Details
#make_empty_parts(drum_kit, part_dynamics = {}) ⇒ Object
47 48 49 50 51 52 53 54 55 56 |
# File 'lib/musicality/composition/sequencing/drum_machine/drum_machine.rb', line 47 def make_empty_parts drum_kit, part_dynamics = {} Hash[ part_names.map do |part_name| unless drum_kit.part_settings.has_key?(part_name) raise ArgumentError, "Drum kit does not have settings for part: #{part_name}" end part_dynamic = part_dynamics.has_key?(part_name) ? part_dynamics[part_name] : Dynamics::MF part = Part.new(part_dynamic, settings: [drum_kit.part_settings[part_name]]) [ part_name, part ] end] end |