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
-
#comments ⇒ Object
readonly
Returns the value of attribute comments.
-
#composer ⇒ Object
readonly
Returns the value of attribute composer.
-
#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.
-
#origin ⇒ Object
readonly
Returns the value of attribute origin.
-
#voices ⇒ Object
readonly
Returns the value of attribute voices.
Instance Method Summary collapse
-
#add_comment(text, position = nil) ⇒ Object
-
#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, composer: nil, origin: nil, comments: 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, composer: nil, origin: nil, comments: nil) ⇒ Composition
Returns a new instance of Composition.
8 9 10 11 12 13 14 |
# File 'lib/head_music/content/composition.rb', line 8 def initialize(name: nil, key_signature: nil, meter: nil, composer: nil, origin: nil, comments: nil) ensure_attributes(name, key_signature, meter) @composer = composer @origin = origin @voices = [] @comments = Array(comments).map { |text| HeadMusic::Content::Comment.new(self, text) } end |
Instance Attribute Details
#comments ⇒ Object (readonly)
Returns the value of attribute comments.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def comments @comments end |
#composer ⇒ Object (readonly)
Returns the value of attribute composer.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def composer @composer end |
#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 |
#origin ⇒ Object (readonly)
Returns the value of attribute origin.
6 7 8 |
# File 'lib/head_music/content/composition.rb', line 6 def origin @origin 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_comment(text, position = nil) ⇒ Object
21 22 23 24 |
# File 'lib/head_music/content/composition.rb', line 21 def add_comment(text, position = nil) @comments << HeadMusic::Content::Comment.new(self, text, position) @comments.last end |
#add_voice(role: nil) ⇒ Object
16 17 18 19 |
# File 'lib/head_music/content/composition.rb', line 16 def add_voice(role: nil) @voices << HeadMusic::Content::Voice.new(composition: self, role: role) @voices.last end |
#bars(last = latest_bar_number) ⇒ Object
36 37 38 39 40 41 42 |
# File 'lib/head_music/content/composition.rb', line 36 def (last = ) @bars ||= [] (..last).each do || @bars[] ||= HeadMusic::Content::Bar.new(self) end @bars[..last] end |
#cantus_firmus_voice ⇒ Object
60 61 62 |
# File 'lib/head_music/content/composition.rb', line 60 def cantus_firmus_voice voices.detect(&:cantus_firmus?) end |
#change_key_signature(bar_number, key_signature) ⇒ Object
44 45 46 |
# File 'lib/head_music/content/composition.rb', line 44 def change_key_signature(, key_signature) ().last.key_signature = key_signature end |
#change_meter(bar_number, meter) ⇒ Object
48 49 50 |
# File 'lib/head_music/content/composition.rb', line 48 def change_meter(, meter) ().last.meter = meter end |
#counterpoint_voice ⇒ Object
64 65 66 |
# File 'lib/head_music/content/composition.rb', line 64 def counterpoint_voice voices.reject(&:cantus_firmus?).first end |
#earliest_bar_number ⇒ Object
52 53 54 |
# File 'lib/head_music/content/composition.rb', line 52 def [voices.map(&:earliest_bar_number), 1].flatten.min end |
#ensure_attributes(name, key_signature, meter) ⇒ Object (private)
74 75 76 77 78 79 |
# File 'lib/head_music/content/composition.rb', line 74 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
31 32 33 34 |
# File 'lib/head_music/content/composition.rb', line 31 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)
86 87 88 |
# File 'lib/head_music/content/composition.rb', line 86 def last_key_signature_change() ()[..].reverse.detect(&:key_signature) end |
#last_meter_change(bar_number) ⇒ Object (private)
81 82 83 84 |
# File 'lib/head_music/content/composition.rb', line 81 def last_meter_change() = [, ].max ()[..].reverse.detect(&:meter) end |
#latest_bar_number ⇒ Object
56 57 58 |
# File 'lib/head_music/content/composition.rb', line 56 def [voices.map(&:latest_bar_number), 1].flatten.max end |
#meter_at(bar_number) ⇒ Object
26 27 28 29 |
# File 'lib/head_music/content/composition.rb', line 26 def meter_at() meter_change = last_meter_change() meter_change ? meter_change.meter : meter end |
#to_s ⇒ Object
68 69 70 |
# File 'lib/head_music/content/composition.rb', line 68 def to_s "#{name} — #{voices.count} #{(voices.count == 1) ? "voice" : "voices"}" end |