Class: HeadMusic::Content::Composition
- Inherits:
-
Object
- Object
- HeadMusic::Content::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.
10 11 12 13 |
# File 'lib/head_music/content/composition.rb', line 10 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.
8 9 10 |
# File 'lib/head_music/content/composition.rb', line 8 def key_signature @key_signature end |
#meter ⇒ Object (readonly)
Returns the value of attribute meter.
8 9 10 |
# File 'lib/head_music/content/composition.rb', line 8 def meter @meter end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
8 9 10 |
# File 'lib/head_music/content/composition.rb', line 8 def name @name end |
#voices ⇒ Object (readonly)
Returns the value of attribute voices.
8 9 10 |
# File 'lib/head_music/content/composition.rb', line 8 def voices @voices end |
Instance Method Details
#add_voice(role: nil) ⇒ Object
15 16 17 18 |
# File 'lib/head_music/content/composition.rb', line 15 def add_voice(role: nil) @voices << HeadMusic::Content::Voice.new(composition: self, role: role) @voices.last end |
#bars(last = latest_bar_number) ⇒ Object
30 31 32 33 34 35 36 |
# File 'lib/head_music/content/composition.rb', line 30 def (last = ) @bars ||= [] (..last).each do || @bars[] ||= HeadMusic::Content::Bar.new(self) end @bars[..last] end |
#cantus_firmus_voice ⇒ Object
54 55 56 |
# File 'lib/head_music/content/composition.rb', line 54 def cantus_firmus_voice voices.detect(&:cantus_firmus?) end |
#change_key_signature(bar_number, key_signature) ⇒ Object
38 39 40 |
# File 'lib/head_music/content/composition.rb', line 38 def change_key_signature(, key_signature) ().last.key_signature = key_signature end |
#change_meter(bar_number, meter) ⇒ Object
42 43 44 |
# File 'lib/head_music/content/composition.rb', line 42 def change_meter(, meter) ().last.meter = meter end |
#counterpoint_voice ⇒ Object
58 59 60 |
# File 'lib/head_music/content/composition.rb', line 58 def counterpoint_voice voices.reject(&:cantus_firmus?).first end |
#earliest_bar_number ⇒ Object
46 47 48 |
# File 'lib/head_music/content/composition.rb', line 46 def [voices.map(&:earliest_bar_number), 1].flatten.min end |
#key_signature_at(bar_number) ⇒ Object
25 26 27 28 |
# File 'lib/head_music/content/composition.rb', line 25 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
50 51 52 |
# File 'lib/head_music/content/composition.rb', line 50 def [voices.map(&:earliest_bar_number), 1].flatten.max end |
#meter_at(bar_number) ⇒ Object
20 21 22 23 |
# File 'lib/head_music/content/composition.rb', line 20 def meter_at() meter_change = last_meter_change() meter_change ? meter_change.meter : meter end |
#to_s ⇒ Object
62 63 64 |
# File 'lib/head_music/content/composition.rb', line 62 def to_s "#{name} — #{voices.count} voice(s)" end |