Class: HeadMusic::Composition

Inherits:
Object
  • Object
show all
Defined in:
lib/head_music/content/composition.rb

Overview

A composition is musical content.

Instance Attribute Summary collapse

Instance Method Summary collapse

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_signatureObject (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

#meterObject (readonly)

Returns the value of attribute meter.



5
6
7
# File 'lib/head_music/content/composition.rb', line 5

def meter
  @meter
end

#nameObject (readonly)

Returns the value of attribute name.



5
6
7
# File 'lib/head_music/content/composition.rb', line 5

def name
  @name
end

#voicesObject (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 bars(last = latest_bar_number)
  @bars ||= []
  (earliest_bar_number..last).each do |bar_number|
    @bars[bar_number] ||= HeadMusic::Bar.new(self)
  end
  @bars[earliest_bar_number..last]
end

#cantus_firmus_voiceObject



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(bar_number, key_signature)
  bars(bar_number).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(bar_number, meter)
  bars(bar_number).last.meter = meter
end

#counterpoint_voiceObject



55
56
57
# File 'lib/head_music/content/composition.rb', line 55

def counterpoint_voice
  voices.reject(&:cantus_firmus?).first
end

#earliest_bar_numberObject



43
44
45
# File 'lib/head_music/content/composition.rb', line 43

def earliest_bar_number
  [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(bar_number)
  key_signature_change = last_key_signature_change(bar_number)
  key_signature_change ? key_signature_change.key_signature : key_signature
end

#latest_bar_numberObject



47
48
49
# File 'lib/head_music/content/composition.rb', line 47

def latest_bar_number
  [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(bar_number)
  meter_change = last_meter_change(bar_number)
  meter_change ? meter_change.meter : meter
end

#to_sObject



59
60
61
# File 'lib/head_music/content/composition.rb', line 59

def to_s
  "#{name}#{voices.count} voice(s)"
end