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
- #ensure_attributes(name, key_signature, meter) ⇒ Object private
-
#initialize(name: nil, key_signature: nil, meter: nil) ⇒ Composition
constructor
A new instance of Composition.
- #key_signature_at(bar_number) ⇒ Object
- #last_key_signature_change(bar_number) ⇒ Object private
- #last_meter_change(bar_number) ⇒ Object private
- #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.
8 9 10 11 |
# File 'lib/head_music/content/composition.rb', line 8 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.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def key_signature @key_signature end |
#meter ⇒ Object (readonly)
Returns the value of attribute meter.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def meter @meter end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def name @name end |
#voices ⇒ Object (readonly)
Returns the value of attribute voices.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def voices @voices end |
Instance Method Details
#add_voice(role: nil) ⇒ Object
13 14 15 16 |
# File 'lib/head_music/content/composition.rb', line 13 def add_voice(role: nil) @voices << HeadMusic::Content::Voice.new(composition: self, role: role) @voices.last end |
#bars(last = latest_bar_number) ⇒ Object
28 29 30 31 32 33 34 |
# File 'lib/head_music/content/composition.rb', line 28 def (last = ) ||= [] (..last).each do || [] ||= HeadMusic::Content::Bar.new(self) end [..last] end |
#cantus_firmus_voice ⇒ Object
52 53 54 |
# File 'lib/head_music/content/composition.rb', line 52 def cantus_firmus_voice voices.detect(&:cantus_firmus?) end |
#change_key_signature(bar_number, key_signature) ⇒ Object
36 37 38 |
# File 'lib/head_music/content/composition.rb', line 36 def change_key_signature(, key_signature) ().last.key_signature = key_signature end |
#change_meter(bar_number, meter) ⇒ Object
40 41 42 |
# File 'lib/head_music/content/composition.rb', line 40 def change_meter(, meter) ().last.meter = meter end |
#counterpoint_voice ⇒ Object
56 57 58 |
# File 'lib/head_music/content/composition.rb', line 56 def counterpoint_voice voices.reject(&:cantus_firmus?).first end |
#earliest_bar_number ⇒ Object
44 45 46 |
# File 'lib/head_music/content/composition.rb', line 44 def [voices.map(&:earliest_bar_number), 1].flatten.min end |
#ensure_attributes(name, key_signature, meter) ⇒ Object (private)
66 67 68 69 70 71 |
# File 'lib/head_music/content/composition.rb', line 66 def ensure_attributes(name, key_signature, meter) @name = name || "Composition" @key_signature = HeadMusic::Rudiment::KeySignature.get(key_signature) if key_signature @key_signature ||= HeadMusic::Rudiment::KeySignature.default @meter = meter ? HeadMusic::Rudiment::Meter.get(meter) : HeadMusic::Rudiment::Meter.default end |
#key_signature_at(bar_number) ⇒ Object
23 24 25 26 |
# File 'lib/head_music/content/composition.rb', line 23 def key_signature_at() key_signature_change = last_key_signature_change() key_signature_change ? key_signature_change.key_signature : key_signature end |
#last_key_signature_change(bar_number) ⇒ Object (private)
78 79 80 |
# File 'lib/head_music/content/composition.rb', line 78 def last_key_signature_change() ()[..].reverse.detect(&:key_signature) end |
#last_meter_change(bar_number) ⇒ Object (private)
73 74 75 76 |
# File 'lib/head_music/content/composition.rb', line 73 def last_meter_change() = [, ].max ()[..].reverse.detect(&:meter) end |
#latest_bar_number ⇒ Object
48 49 50 |
# File 'lib/head_music/content/composition.rb', line 48 def [voices.map(&:latest_bar_number), 1].flatten.max end |
#meter_at(bar_number) ⇒ Object
18 19 20 21 |
# File 'lib/head_music/content/composition.rb', line 18 def meter_at() meter_change = last_meter_change() meter_change ? meter_change.meter : meter end |
#to_s ⇒ Object
60 61 62 |
# File 'lib/head_music/content/composition.rb', line 60 def to_s "#{name} — #{voices.count} #{(voices.count == 1) ? "voice" : "voices"}" end |