Class: HeadMusic::Style::Guidelines::FloridDissonanceTreatment
- Inherits:
-
Annotation
- Object
- Annotation
- HeadMusic::Style::Guidelines::FloridDissonanceTreatment
- Includes:
- DissonanceFigureDetection
- Defined in:
- lib/head_music/style/guidelines/florid_dissonance_treatment.rb
Overview
Unified dissonance handling for mixed-species (florid) contexts. - Strong beat dissonances must be properly prepared suspensions from a tie. - Weak beat dissonances must be passing tones, neighbor tones, nota cambiata, or double neighbor figures. - Tied notes dissonant at the new CF note must resolve by step to a consonance.
Constant Summary collapse
- MESSAGE =
"Treat dissonances appropriately: passing tones, cambiata, or double neighbor " \ "on weak beats; proper suspension treatment for tied notes."
Instance Method Summary collapse
-
#all_consonant_with_cantus?(*checked_notes) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#cambiata_as_note_2?(index) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#cambiata_dissonance?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
Nota cambiata: a five-note figure where note 2 is dissonant, approached by step from note 1, leaps a third in the same direction to note 3, then notes 3-4-5 proceed stepwise in the opposite direction.
-
#cambiata_shape?(n1, n2, n3, n4, n5) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#cantus_firmus_positions ⇒ Object
included
from DissonanceFigureDetection
private
Positions where the cantus firmus sounds a note (the strong beats).
-
#consonant_with_cantus?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#current_cf_note_at(position) ⇒ Object
private
-
#dissonant_with_cantus?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
A note whose pitch clashes with the cantus firmus in two-part harmony.
-
#double_neighbor_figure?(index, offset:) ⇒ Boolean
included
from DissonanceFigureDetection
private
Double neighbor: a four-note figure within one bar.
-
#double_neighbor_member?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#double_neighbor_shape?(n1, n2, n3, n4) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#improperly_treated_notes ⇒ Object
private
-
#marks ⇒ Object
-
#melodic_interval_between(note1, note2) ⇒ Object
included
from DissonanceFigureDetection
private
-
#neighbor_tone?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#on_strong_beat?(note) ⇒ Boolean
private
-
#passing_tone?(note) ⇒ Boolean
included
from DissonanceFigureDetection
private
-
#properly_treated?(note) ⇒ Boolean
private
-
#properly_treated_suspension?(note) ⇒ Boolean
private
A note on a strong beat that is dissonant must be a tied suspension (its position is before the CF note position, meaning it was held over).
-
#resolved_by_step?(note) ⇒ Boolean
private
-
#steps_back_from?(leap, step_back_1, step_back_2) ⇒ Boolean
included
from DissonanceFigureDetection
private
Notes 3-4-5 must both step in the direction opposite the leap.
-
#stepwise_figure?(note, same_direction:) ⇒ Boolean
included
from DissonanceFigureDetection
private
Constructor Details
This class inherits a constructor from HeadMusic::Style::Annotation
Instance Method Details
#all_consonant_with_cantus?(*checked_notes) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#cambiata_as_note_2?(index) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#cambiata_dissonance?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
Nota cambiata: a five-note figure where note 2 is dissonant, approached by step from note 1, leaps a third in the same direction to note 3, then notes 3-4-5 proceed stepwise in the opposite direction. Notes 1, 3, and 5 must be consonant with the CF.
#cambiata_shape?(n1, n2, n3, n4, n5) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#cantus_firmus_positions ⇒ Object (private) Originally defined in module DissonanceFigureDetection
Positions where the cantus firmus sounds a note (the strong beats).
#consonant_with_cantus?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#current_cf_note_at(position) ⇒ Object (private)
59 60 61 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 59 def current_cf_note_at(position) cantus_firmus.note_at(position) end |
#dissonant_with_cantus?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
A note whose pitch clashes with the cantus firmus in two-part harmony.
#double_neighbor_figure?(index, offset:) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
Double neighbor: a four-note figure within one bar. Beats 1 and 4 are the same pitch (consonant), beats 2 and 3 are upper and lower neighbors connected by a leap of a third.
#double_neighbor_member?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#double_neighbor_shape?(n1, n2, n3, n4) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#improperly_treated_notes ⇒ Object (private)
22 23 24 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 22 def improperly_treated_notes notes.select { |note| dissonant_with_cantus?(note) && !properly_treated?(note) } end |
#marks ⇒ Object
14 15 16 17 18 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 14 def marks return [] unless cantus_firmus&.notes&.any? improperly_treated_notes.map { |note| HeadMusic::Style::Mark.for(note) } end |
#melodic_interval_between(note1, note2) ⇒ Object (private) Originally defined in module DissonanceFigureDetection
#neighbor_tone?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#on_strong_beat?(note) ⇒ Boolean (private)
55 56 57 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 55 def on_strong_beat?(note) cantus_firmus_positions.include?(note.position.to_s) end |
#passing_tone?(note) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
#properly_treated?(note) ⇒ Boolean (private)
26 27 28 29 30 31 32 33 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 26 def properly_treated?(note) if on_strong_beat?(note) properly_treated_suspension?(note) else passing_tone?(note) || neighbor_tone?(note) || cambiata_dissonance?(note) || double_neighbor_member?(note) end end |
#properly_treated_suspension?(note) ⇒ Boolean (private)
A note on a strong beat that is dissonant must be a tied suspension (its position is before the CF note position, meaning it was held over).
37 38 39 40 41 42 43 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 37 def properly_treated_suspension?(note) cf_note = current_cf_note_at(note.position) return false unless cf_note # The CP note must have started before the CF note (tied over) note.position < cf_note.position && resolved_by_step?(note) end |
#resolved_by_step?(note) ⇒ Boolean (private)
45 46 47 48 49 50 51 52 53 |
# File 'lib/head_music/style/guidelines/florid_dissonance_treatment.rb', line 45 def resolved_by_step?(note) next_cp = following_note(note) return false unless next_cp melodic = melodic_interval_between(note, next_cp) return false unless melodic.step? consonant_with_cantus?(next_cp) end |
#steps_back_from?(leap, step_back_1, step_back_2) ⇒ Boolean (private) Originally defined in module DissonanceFigureDetection
Notes 3-4-5 must both step in the direction opposite the leap.