head_music 0.19.0 → 0.19.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|