head_music 0.19.0 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/lib/head_music/chord.rb +29 -3
- data/lib/head_music/functional_interval.rb +175 -94
- data/lib/head_music/octave.rb +8 -0
- data/lib/head_music/style/analysis.rb +7 -7
- data/lib/head_music/style/{annotations → guidelines}/always_move.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/approach_perfection_contrarily.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/at_least_eight_notes.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/avoid_crossing_voices.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/avoid_overlapping_voices.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/consonant_climax.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/consonant_downbeats.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/diatonic.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/direction_changes.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/end_on_perfect_consonance.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/end_on_tonic.rb +3 -3
- data/lib/head_music/style/guidelines/frequent_direction_changes.rb +13 -0
- data/lib/head_music/style/{annotations → guidelines}/limit_octave_leaps.rb +3 -3
- data/lib/head_music/style/guidelines/moderate_direction_changes.rb +13 -0
- data/lib/head_music/style/{annotations → guidelines}/mostly_conjunct.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/no_rests.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/no_unisons_in_middle.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/notes_same_length.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/one_to_one.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/prefer_contrary_motion.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/prefer_imperfect.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/prepare_octave_leaps.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/recover_large_leaps.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/singable_intervals.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/singable_range.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/single_large_leaps.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/start_on_perfect_consonance.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/start_on_tonic.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/step_down_to_final_note.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/step_out_of_unison.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/step_to_final_note.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/step_up_to_final_note.rb +3 -3
- data/lib/head_music/style/{annotations → guidelines}/up_to_fourteen_notes.rb +3 -3
- data/lib/head_music/style/guides/first_species_harmony.rb +22 -0
- data/lib/head_music/style/guides/first_species_melody.rb +28 -0
- data/lib/head_music/style/guides/fux_cantus_firmus.rb +30 -0
- data/lib/head_music/style/guides/modern_cantus_firmus.rb +31 -0
- data/lib/head_music/style/mark.rb +1 -1
- data/lib/head_music/version.rb +1 -1
- data/lib/head_music.rb +39 -39
- metadata +39 -39
- data/lib/head_music/style/annotations/frequent_direction_changes.rb +0 -13
- data/lib/head_music/style/annotations/moderate_direction_changes.rb +0 -13
- data/lib/head_music/style/rulesets/first_species_harmony.rb +0 -22
- data/lib/head_music/style/rulesets/first_species_melody.rb +0 -28
- data/lib/head_music/style/rulesets/fux_cantus_firmus.rb +0 -30
- data/lib/head_music/style/rulesets/modern_cantus_firmus.rb +0 -31
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::MostlyConjunct < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Use mostly conjunct motion.'
|
9
9
|
|
10
10
|
MINIMUM_CONJUNCT_PORTION = HeadMusic::GOLDEN_RATIO_INVERSE**2
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::NoRests < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Place a note in each measure.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::NoUnisonsInMiddle < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Unisons may only be used in the first and last note.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::NotesSameLength < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Use consistent rhythmic unit.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::OneToOne < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Place a note for each note in the other voice.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::PreferContraryMotion < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Prefer contrary motion. Move voices in different melodic directions.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::PreferImperfect < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Prefer imperfect harmonic intervals.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::PrepareOctaveLeaps < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Enter and exit an octave leap from within.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# Ok, so a rule might be that after the first leap (after previous steps)
|
7
7
|
# one should normally move by step in the opposite direction
|
8
8
|
# unless another leap (in either direction) creates a consonant triad.
|
9
9
|
# - Brian
|
10
|
-
class HeadMusic::Style::
|
10
|
+
class HeadMusic::Style::Guidelines::RecoverLargeLeaps < HeadMusic::Style::Annotation
|
11
11
|
MESSAGE = 'Recover large leaps by step in the opposite direction.'
|
12
12
|
|
13
13
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::SingableIntervals < HeadMusic::Style::Annotation
|
8
8
|
PERMITTED_ASCENDING = %w[PU m2 M2 m3 M3 P4 P5 m6 P8].freeze
|
9
9
|
PERMITTED_DESCENDING = %w[PU m2 M2 m3 M3 P4 P5 P8].freeze
|
10
10
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A voice shouldn't expend the range of a 10th.
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::SingableRange < HeadMusic::Style::Annotation
|
8
8
|
MAXIMUM_RANGE = 10
|
9
9
|
|
10
10
|
MESSAGE = 'Limit melodic range to a 10th.'
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::SingleLargeLeaps < HeadMusic::Style::Guidelines::RecoverLargeLeaps
|
8
8
|
MESSAGE = 'Recover leaps by step, repetition, opposite direction, or spelling triad.'
|
9
9
|
|
10
10
|
private
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# marks the voice if the first note is not the first or fifth scale degree of the key.
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StartOnPerfectConsonance < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Start on the tonic or a perfect consonance above the tonic (unless bass voice).'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StartOnTonic < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Start on the first scale degree.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StepDownToFinalNote < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Step down to the final note.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StepOutOfUnison < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Exit a unison by step.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StepToFinalNote < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Step to the final note.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::StepUpToFinalNote < HeadMusic::Style::Annotation
|
8
8
|
MESSAGE = 'Step up to final note.'
|
9
9
|
|
10
10
|
def marks
|
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Module for
|
4
|
-
module HeadMusic::Style::
|
3
|
+
# Module for style guidelines.
|
4
|
+
module HeadMusic::Style::Guidelines; end
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::
|
7
|
+
class HeadMusic::Style::Guidelines::UpToFourteenNotes < HeadMusic::Style::Annotation
|
8
8
|
MAXIMUM_NOTES = 14
|
9
9
|
|
10
10
|
MESSAGE = 'Write up to fourteen notes.'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Module for guides
|
4
|
+
module HeadMusic::Style::Guides; end
|
5
|
+
|
6
|
+
# Rules for first species harmony
|
7
|
+
class HeadMusic::Style::Guides::FirstSpeciesHarmony
|
8
|
+
RULESET = [
|
9
|
+
HeadMusic::Style::Guidelines::ApproachPerfectionContrarily,
|
10
|
+
HeadMusic::Style::Guidelines::AvoidCrossingVoices,
|
11
|
+
HeadMusic::Style::Guidelines::AvoidOverlappingVoices,
|
12
|
+
HeadMusic::Style::Guidelines::ConsonantDownbeats,
|
13
|
+
HeadMusic::Style::Guidelines::NoUnisonsInMiddle,
|
14
|
+
HeadMusic::Style::Guidelines::OneToOne,
|
15
|
+
HeadMusic::Style::Guidelines::PreferContraryMotion,
|
16
|
+
HeadMusic::Style::Guidelines::PreferImperfect,
|
17
|
+
].freeze
|
18
|
+
|
19
|
+
def self.analyze(voice)
|
20
|
+
RULESET.map { |rule| rule.new(voice) }
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Module for guides
|
4
|
+
module HeadMusic::Style::Guides; end
|
5
|
+
|
6
|
+
# Rules for first species melodies
|
7
|
+
class HeadMusic::Style::Guides::FirstSpeciesMelody
|
8
|
+
RULESET = [
|
9
|
+
HeadMusic::Style::Guidelines::ConsonantClimax,
|
10
|
+
HeadMusic::Style::Guidelines::Diatonic,
|
11
|
+
HeadMusic::Style::Guidelines::EndOnTonic,
|
12
|
+
HeadMusic::Style::Guidelines::FrequentDirectionChanges,
|
13
|
+
HeadMusic::Style::Guidelines::LimitOctaveLeaps,
|
14
|
+
HeadMusic::Style::Guidelines::MostlyConjunct,
|
15
|
+
HeadMusic::Style::Guidelines::NoRests,
|
16
|
+
HeadMusic::Style::Guidelines::NotesSameLength,
|
17
|
+
HeadMusic::Style::Guidelines::PrepareOctaveLeaps,
|
18
|
+
HeadMusic::Style::Guidelines::SingableIntervals,
|
19
|
+
HeadMusic::Style::Guidelines::SingableRange,
|
20
|
+
HeadMusic::Style::Guidelines::StartOnPerfectConsonance,
|
21
|
+
HeadMusic::Style::Guidelines::StepOutOfUnison,
|
22
|
+
HeadMusic::Style::Guidelines::StepUpToFinalNote,
|
23
|
+
].freeze
|
24
|
+
|
25
|
+
def self.analyze(voice)
|
26
|
+
RULESET.map { |rule| rule.new(voice) }
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Module for guides
|
4
|
+
module HeadMusic::Style::Guides; end
|
5
|
+
|
6
|
+
# Rules for the cantus firmus according to Fux.
|
7
|
+
class HeadMusic::Style::Guides::FuxCantusFirmus
|
8
|
+
RULESET = [
|
9
|
+
HeadMusic::Style::Guidelines::AlwaysMove,
|
10
|
+
HeadMusic::Style::Guidelines::AtLeastEightNotes,
|
11
|
+
HeadMusic::Style::Guidelines::ConsonantClimax,
|
12
|
+
HeadMusic::Style::Guidelines::Diatonic,
|
13
|
+
HeadMusic::Style::Guidelines::EndOnTonic,
|
14
|
+
HeadMusic::Style::Guidelines::FrequentDirectionChanges,
|
15
|
+
HeadMusic::Style::Guidelines::LimitOctaveLeaps,
|
16
|
+
HeadMusic::Style::Guidelines::MostlyConjunct,
|
17
|
+
HeadMusic::Style::Guidelines::NoRests,
|
18
|
+
HeadMusic::Style::Guidelines::NotesSameLength,
|
19
|
+
HeadMusic::Style::Guidelines::RecoverLargeLeaps,
|
20
|
+
HeadMusic::Style::Guidelines::SingableIntervals,
|
21
|
+
HeadMusic::Style::Guidelines::SingableRange,
|
22
|
+
HeadMusic::Style::Guidelines::StartOnTonic,
|
23
|
+
HeadMusic::Style::Guidelines::StepDownToFinalNote,
|
24
|
+
HeadMusic::Style::Guidelines::UpToFourteenNotes,
|
25
|
+
].freeze
|
26
|
+
|
27
|
+
def self.analyze(voice)
|
28
|
+
RULESET.map { |rule| rule.new(voice) }
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Module for guides
|
4
|
+
module HeadMusic::Style::Guides; end
|
5
|
+
|
6
|
+
# Modern rules for the cantus firmus
|
7
|
+
class HeadMusic::Style::Guides::ModernCantusFirmus
|
8
|
+
RULESET = [
|
9
|
+
HeadMusic::Style::Guidelines::AlwaysMove,
|
10
|
+
HeadMusic::Style::Guidelines::AtLeastEightNotes,
|
11
|
+
HeadMusic::Style::Guidelines::ConsonantClimax,
|
12
|
+
HeadMusic::Style::Guidelines::Diatonic,
|
13
|
+
HeadMusic::Style::Guidelines::EndOnTonic,
|
14
|
+
HeadMusic::Style::Guidelines::LimitOctaveLeaps,
|
15
|
+
HeadMusic::Style::Guidelines::ModerateDirectionChanges,
|
16
|
+
HeadMusic::Style::Guidelines::MostlyConjunct,
|
17
|
+
HeadMusic::Style::Guidelines::NoRests,
|
18
|
+
HeadMusic::Style::Guidelines::NotesSameLength,
|
19
|
+
HeadMusic::Style::Guidelines::PrepareOctaveLeaps,
|
20
|
+
HeadMusic::Style::Guidelines::SingableIntervals,
|
21
|
+
HeadMusic::Style::Guidelines::SingableRange,
|
22
|
+
HeadMusic::Style::Guidelines::SingleLargeLeaps,
|
23
|
+
HeadMusic::Style::Guidelines::StartOnTonic,
|
24
|
+
HeadMusic::Style::Guidelines::StepToFinalNote,
|
25
|
+
HeadMusic::Style::Guidelines::UpToFourteenNotes,
|
26
|
+
].freeze
|
27
|
+
|
28
|
+
def self.analyze(voice)
|
29
|
+
RULESET.map { |rule| rule.new(voice) }
|
30
|
+
end
|
31
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# A mark is a fragment of music with an optional fitness score assigned.
|
4
|
-
# Marks are collected into annotations which comment on
|
4
|
+
# Marks are collected into annotations which comment on a voice.
|
5
5
|
class HeadMusic::Style::Mark
|
6
6
|
attr_reader :start_position, :end_position, :placements, :fitness
|
7
7
|
|
data/lib/head_music/version.rb
CHANGED
data/lib/head_music.rb
CHANGED
@@ -61,43 +61,43 @@ require 'head_music/style/analysis'
|
|
61
61
|
require 'head_music/style/annotation'
|
62
62
|
require 'head_music/style/mark'
|
63
63
|
|
64
|
-
#
|
65
|
-
require 'head_music/style/
|
66
|
-
require 'head_music/style/
|
67
|
-
require 'head_music/style/
|
68
|
-
require 'head_music/style/
|
69
|
-
require 'head_music/style/
|
70
|
-
require 'head_music/style/
|
71
|
-
require 'head_music/style/
|
72
|
-
require 'head_music/style/
|
73
|
-
require 'head_music/style/
|
74
|
-
require 'head_music/style/
|
75
|
-
require 'head_music/style/
|
76
|
-
require 'head_music/style/
|
77
|
-
require 'head_music/style/
|
78
|
-
require 'head_music/style/
|
79
|
-
require 'head_music/style/
|
80
|
-
require 'head_music/style/
|
81
|
-
require 'head_music/style/
|
82
|
-
require 'head_music/style/
|
83
|
-
require 'head_music/style/
|
84
|
-
require 'head_music/style/
|
85
|
-
require 'head_music/style/
|
86
|
-
require 'head_music/style/
|
87
|
-
require 'head_music/style/
|
88
|
-
require 'head_music/style/
|
89
|
-
require 'head_music/style/
|
90
|
-
require 'head_music/style/
|
91
|
-
require 'head_music/style/
|
92
|
-
require 'head_music/style/
|
93
|
-
require 'head_music/style/
|
94
|
-
require 'head_music/style/
|
95
|
-
require 'head_music/style/
|
96
|
-
require 'head_music/style/
|
97
|
-
require 'head_music/style/
|
64
|
+
# guidelines
|
65
|
+
require 'head_music/style/guidelines/always_move'
|
66
|
+
require 'head_music/style/guidelines/approach_perfection_contrarily'
|
67
|
+
require 'head_music/style/guidelines/at_least_eight_notes'
|
68
|
+
require 'head_music/style/guidelines/avoid_crossing_voices'
|
69
|
+
require 'head_music/style/guidelines/avoid_overlapping_voices'
|
70
|
+
require 'head_music/style/guidelines/consonant_climax'
|
71
|
+
require 'head_music/style/guidelines/consonant_downbeats'
|
72
|
+
require 'head_music/style/guidelines/diatonic'
|
73
|
+
require 'head_music/style/guidelines/direction_changes'
|
74
|
+
require 'head_music/style/guidelines/end_on_perfect_consonance'
|
75
|
+
require 'head_music/style/guidelines/end_on_tonic'
|
76
|
+
require 'head_music/style/guidelines/frequent_direction_changes'
|
77
|
+
require 'head_music/style/guidelines/limit_octave_leaps'
|
78
|
+
require 'head_music/style/guidelines/moderate_direction_changes'
|
79
|
+
require 'head_music/style/guidelines/mostly_conjunct'
|
80
|
+
require 'head_music/style/guidelines/notes_same_length'
|
81
|
+
require 'head_music/style/guidelines/no_rests'
|
82
|
+
require 'head_music/style/guidelines/no_unisons_in_middle'
|
83
|
+
require 'head_music/style/guidelines/one_to_one'
|
84
|
+
require 'head_music/style/guidelines/prefer_contrary_motion'
|
85
|
+
require 'head_music/style/guidelines/prefer_imperfect'
|
86
|
+
require 'head_music/style/guidelines/prepare_octave_leaps'
|
87
|
+
require 'head_music/style/guidelines/recover_large_leaps'
|
88
|
+
require 'head_music/style/guidelines/singable_intervals'
|
89
|
+
require 'head_music/style/guidelines/singable_range'
|
90
|
+
require 'head_music/style/guidelines/single_large_leaps'
|
91
|
+
require 'head_music/style/guidelines/start_on_perfect_consonance'
|
92
|
+
require 'head_music/style/guidelines/start_on_tonic'
|
93
|
+
require 'head_music/style/guidelines/step_down_to_final_note'
|
94
|
+
require 'head_music/style/guidelines/step_out_of_unison'
|
95
|
+
require 'head_music/style/guidelines/step_to_final_note'
|
96
|
+
require 'head_music/style/guidelines/step_up_to_final_note'
|
97
|
+
require 'head_music/style/guidelines/up_to_fourteen_notes'
|
98
98
|
|
99
|
-
#
|
100
|
-
require 'head_music/style/
|
101
|
-
require 'head_music/style/
|
102
|
-
require 'head_music/style/
|
103
|
-
require 'head_music/style/
|
99
|
+
# guides
|
100
|
+
require 'head_music/style/guides/fux_cantus_firmus'
|
101
|
+
require 'head_music/style/guides/modern_cantus_firmus'
|
102
|
+
require 'head_music/style/guides/first_species_melody'
|
103
|
+
require 'head_music/style/guides/first_species_harmony'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: head_music
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.19.
|
4
|
+
version: 0.19.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Head
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -152,44 +152,44 @@ files:
|
|
152
152
|
- lib/head_music/staff.rb
|
153
153
|
- lib/head_music/style/analysis.rb
|
154
154
|
- lib/head_music/style/annotation.rb
|
155
|
-
- lib/head_music/style/
|
156
|
-
- lib/head_music/style/
|
157
|
-
- lib/head_music/style/
|
158
|
-
- lib/head_music/style/
|
159
|
-
- lib/head_music/style/
|
160
|
-
- lib/head_music/style/
|
161
|
-
- lib/head_music/style/
|
162
|
-
- lib/head_music/style/
|
163
|
-
- lib/head_music/style/
|
164
|
-
- lib/head_music/style/
|
165
|
-
- lib/head_music/style/
|
166
|
-
- lib/head_music/style/
|
167
|
-
- lib/head_music/style/
|
168
|
-
- lib/head_music/style/
|
169
|
-
- lib/head_music/style/
|
170
|
-
- lib/head_music/style/
|
171
|
-
- lib/head_music/style/
|
172
|
-
- lib/head_music/style/
|
173
|
-
- lib/head_music/style/
|
174
|
-
- lib/head_music/style/
|
175
|
-
- lib/head_music/style/
|
176
|
-
- lib/head_music/style/
|
177
|
-
- lib/head_music/style/
|
178
|
-
- lib/head_music/style/
|
179
|
-
- lib/head_music/style/
|
180
|
-
- lib/head_music/style/
|
181
|
-
- lib/head_music/style/
|
182
|
-
- lib/head_music/style/
|
183
|
-
- lib/head_music/style/
|
184
|
-
- lib/head_music/style/
|
185
|
-
- lib/head_music/style/
|
186
|
-
- lib/head_music/style/
|
187
|
-
- lib/head_music/style/
|
155
|
+
- lib/head_music/style/guidelines/always_move.rb
|
156
|
+
- lib/head_music/style/guidelines/approach_perfection_contrarily.rb
|
157
|
+
- lib/head_music/style/guidelines/at_least_eight_notes.rb
|
158
|
+
- lib/head_music/style/guidelines/avoid_crossing_voices.rb
|
159
|
+
- lib/head_music/style/guidelines/avoid_overlapping_voices.rb
|
160
|
+
- lib/head_music/style/guidelines/consonant_climax.rb
|
161
|
+
- lib/head_music/style/guidelines/consonant_downbeats.rb
|
162
|
+
- lib/head_music/style/guidelines/diatonic.rb
|
163
|
+
- lib/head_music/style/guidelines/direction_changes.rb
|
164
|
+
- lib/head_music/style/guidelines/end_on_perfect_consonance.rb
|
165
|
+
- lib/head_music/style/guidelines/end_on_tonic.rb
|
166
|
+
- lib/head_music/style/guidelines/frequent_direction_changes.rb
|
167
|
+
- lib/head_music/style/guidelines/limit_octave_leaps.rb
|
168
|
+
- lib/head_music/style/guidelines/moderate_direction_changes.rb
|
169
|
+
- lib/head_music/style/guidelines/mostly_conjunct.rb
|
170
|
+
- lib/head_music/style/guidelines/no_rests.rb
|
171
|
+
- lib/head_music/style/guidelines/no_unisons_in_middle.rb
|
172
|
+
- lib/head_music/style/guidelines/notes_same_length.rb
|
173
|
+
- lib/head_music/style/guidelines/one_to_one.rb
|
174
|
+
- lib/head_music/style/guidelines/prefer_contrary_motion.rb
|
175
|
+
- lib/head_music/style/guidelines/prefer_imperfect.rb
|
176
|
+
- lib/head_music/style/guidelines/prepare_octave_leaps.rb
|
177
|
+
- lib/head_music/style/guidelines/recover_large_leaps.rb
|
178
|
+
- lib/head_music/style/guidelines/singable_intervals.rb
|
179
|
+
- lib/head_music/style/guidelines/singable_range.rb
|
180
|
+
- lib/head_music/style/guidelines/single_large_leaps.rb
|
181
|
+
- lib/head_music/style/guidelines/start_on_perfect_consonance.rb
|
182
|
+
- lib/head_music/style/guidelines/start_on_tonic.rb
|
183
|
+
- lib/head_music/style/guidelines/step_down_to_final_note.rb
|
184
|
+
- lib/head_music/style/guidelines/step_out_of_unison.rb
|
185
|
+
- lib/head_music/style/guidelines/step_to_final_note.rb
|
186
|
+
- lib/head_music/style/guidelines/step_up_to_final_note.rb
|
187
|
+
- lib/head_music/style/guidelines/up_to_fourteen_notes.rb
|
188
|
+
- lib/head_music/style/guides/first_species_harmony.rb
|
189
|
+
- lib/head_music/style/guides/first_species_melody.rb
|
190
|
+
- lib/head_music/style/guides/fux_cantus_firmus.rb
|
191
|
+
- lib/head_music/style/guides/modern_cantus_firmus.rb
|
188
192
|
- lib/head_music/style/mark.rb
|
189
|
-
- lib/head_music/style/rulesets/first_species_harmony.rb
|
190
|
-
- lib/head_music/style/rulesets/first_species_melody.rb
|
191
|
-
- lib/head_music/style/rulesets/fux_cantus_firmus.rb
|
192
|
-
- lib/head_music/style/rulesets/modern_cantus_firmus.rb
|
193
193
|
- lib/head_music/utilities/hash_key.rb
|
194
194
|
- lib/head_music/version.rb
|
195
195
|
homepage: https://github.com/roberthead/head_music
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Module for Annotations.
|
4
|
-
module HeadMusic::Style::Annotations; end
|
5
|
-
|
6
|
-
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::Annotations::FrequentDirectionChanges < HeadMusic::Style::Annotations::DirectionChanges
|
8
|
-
MESSAGE = 'Change melodic direction frequently.'
|
9
|
-
|
10
|
-
def self.maximum_notes_per_direction
|
11
|
-
3
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Module for Annotations.
|
4
|
-
module HeadMusic::Style::Annotations; end
|
5
|
-
|
6
|
-
# A counterpoint guideline
|
7
|
-
class HeadMusic::Style::Annotations::ModerateDirectionChanges < HeadMusic::Style::Annotations::DirectionChanges
|
8
|
-
MESSAGE = 'Change melodic direction occasionally.'
|
9
|
-
|
10
|
-
def self.maximum_notes_per_direction
|
11
|
-
5
|
12
|
-
end
|
13
|
-
end
|