Class: HeadMusic::Composition
- Inherits:
-
Object
- Object
- HeadMusic::Composition
- Defined in:
- lib/head_music/content/composition.rb
Overview
A composition is musical content.
Instance Attribute Summary collapse
-
#key_signature ⇒ Object
readonly
Returns the value of attribute key_signature.
-
#meter ⇒ Object
readonly
Returns the value of attribute meter.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#voices ⇒ Object
readonly
Returns the value of attribute voices.
Instance Method Summary collapse
- #add_voice(role: nil) ⇒ Object
- #bars(last = latest_bar_number) ⇒ Object
- #cantus_firmus_voice ⇒ Object
- #change_key_signature(bar_number, key_signature) ⇒ Object
- #change_meter(bar_number, meter) ⇒ Object
- #counterpoint_voice ⇒ Object
- #earliest_bar_number ⇒ Object
-
#initialize(name: nil, key_signature: nil, meter: nil) ⇒ Composition
constructor
A new instance of Composition.
- #key_signature_at(bar_number) ⇒ Object
- #latest_bar_number ⇒ Object
- #meter_at(bar_number) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(name: nil, key_signature: nil, meter: nil) ⇒ Composition
Returns a new instance of Composition.
7 8 9 10 |
# File 'lib/head_music/content/composition.rb', line 7 def initialize(name: nil, key_signature: nil, meter: nil) ensure_attributes(name, key_signature, meter) @voices = [] end |
Instance Attribute Details
#key_signature ⇒ Object (readonly)
Returns the value of attribute key_signature.
5 6 7 |
# File 'lib/head_music/content/composition.rb', line 5 def key_signature @key_signature end |
#meter ⇒ Object (readonly)
Returns the value of attribute meter.
5 6 7 |
# File 'lib/head_music/content/composition.rb', line 5 def meter @meter end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
5 6 7 |
# File 'lib/head_music/content/composition.rb', line 5 def name @name end |
#voices ⇒ Object (readonly)
Returns the value of attribute voices.
5 6 7 |
# File 'lib/head_music/content/composition.rb', line 5 def voices @voices end |
Instance Method Details
#add_voice(role: nil) ⇒ Object
12 13 14 15 |
# File 'lib/head_music/content/composition.rb', line 12 def add_voice(role: nil) @voices << HeadMusic::Voice.new(composition: self, role: role) @voices.last end |
#bars(last = latest_bar_number) ⇒ Object
27 28 29 30 31 32 33 |
# File 'lib/head_music/content/composition.rb', line 27 def (last = ) @bars ||= [] (..last).each do || @bars[] ||= HeadMusic::Bar.new(self) end @bars[..last] end |
#cantus_firmus_voice ⇒ Object
51 52 53 |
# File 'lib/head_music/content/composition.rb', line 51 def cantus_firmus_voice voices.detect(&:cantus_firmus?) end |
#change_key_signature(bar_number, key_signature) ⇒ Object
35 36 37 |
# File 'lib/head_music/content/composition.rb', line 35 def change_key_signature(, key_signature) ().last.key_signature = key_signature end |
#change_meter(bar_number, meter) ⇒ Object
39 40 41 |
# File 'lib/head_music/content/composition.rb', line 39 def change_meter(, meter) ().last.meter = meter end |
#counterpoint_voice ⇒ Object
55 56 57 |
# File 'lib/head_music/content/composition.rb', line 55 def counterpoint_voice voices.reject(&:cantus_firmus?).first end |
#earliest_bar_number ⇒ Object
43 44 45 |
# File 'lib/head_music/content/composition.rb', line 43 def [voices.map(&:earliest_bar_number), 1].flatten.min end |
#key_signature_at(bar_number) ⇒ Object
22 23 24 25 |
# File 'lib/head_music/content/composition.rb', line 22 def key_signature_at() key_signature_change = last_key_signature_change() key_signature_change ? key_signature_change.key_signature : key_signature end |
#latest_bar_number ⇒ Object
47 48 49 |
# File 'lib/head_music/content/composition.rb', line 47 def [voices.map(&:earliest_bar_number), 1].flatten.max end |
#meter_at(bar_number) ⇒ Object
17 18 19 20 |
# File 'lib/head_music/content/composition.rb', line 17 def meter_at() meter_change = last_meter_change() meter_change ? meter_change.meter : meter end |
#to_s ⇒ Object
59 60 61 |
# File 'lib/head_music/content/composition.rb', line 59 def to_s "#{name} — #{voices.count} voice(s)" end |