head_music 0.27.0 → 0.28.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +1 -1
- data/.rubocop.yml +11 -37
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile +8 -6
- data/Rakefile +5 -4
- data/bin/console +3 -3
- data/head_music.gemspec +21 -22
- data/lib/head_music/chromatic_interval.rb +3 -3
- data/lib/head_music/circle.rb +18 -14
- data/lib/head_music/clef.rb +3 -3
- data/lib/head_music/content/bar.rb +1 -1
- data/lib/head_music/content/composition.rb +1 -1
- data/lib/head_music/content/note.rb +1 -1
- data/lib/head_music/content/placement.rb +5 -5
- data/lib/head_music/content/position.rb +3 -3
- data/lib/head_music/content/rhythmic_value.rb +8 -8
- data/lib/head_music/content/voice.rb +1 -1
- data/lib/head_music/diatonic_interval.rb +41 -43
- data/lib/head_music/grand_staff.rb +8 -8
- data/lib/head_music/instrument.rb +8 -8
- data/lib/head_music/interval_cycle.rb +10 -12
- data/lib/head_music/key_signature.rb +12 -13
- data/lib/head_music/letter_name.rb +7 -7
- data/lib/head_music/melodic_interval.rb +1 -1
- data/lib/head_music/meter.rb +17 -12
- data/lib/head_music/named.rb +3 -3
- data/lib/head_music/pitch/enharmonic_equivalence.rb +2 -2
- data/lib/head_music/pitch/octave_equivalence.rb +1 -1
- data/lib/head_music/pitch.rb +9 -8
- data/lib/head_music/pitch_class.rb +18 -4
- data/lib/head_music/pitch_class_set.rb +5 -5
- data/lib/head_music/pitch_set.rb +9 -6
- data/lib/head_music/quality.rb +15 -14
- data/lib/head_music/reference_pitch.rb +23 -23
- data/lib/head_music/register.rb +2 -2
- data/lib/head_music/rhythmic_unit.rb +9 -9
- data/lib/head_music/scale.rb +4 -4
- data/lib/head_music/scale_degree.rb +2 -2
- data/lib/head_music/scale_type.rb +13 -13
- data/lib/head_music/sign.rb +12 -11
- data/lib/head_music/solmization.rb +3 -3
- data/lib/head_music/sonority.rb +2 -2
- data/lib/head_music/spelling.rb +4 -6
- data/lib/head_music/staff.rb +1 -1
- data/lib/head_music/style/analysis.rb +1 -1
- data/lib/head_music/style/annotation.rb +7 -7
- data/lib/head_music/style/guidelines/always_move.rb +4 -4
- data/lib/head_music/style/guidelines/approach_perfection_contrarily.rb +1 -1
- data/lib/head_music/style/guidelines/at_least_eight_notes.rb +3 -3
- data/lib/head_music/style/guidelines/avoid_crossing_voices.rb +6 -6
- data/lib/head_music/style/guidelines/avoid_overlapping_voices.rb +1 -1
- data/lib/head_music/style/guidelines/consonant_climax.rb +1 -1
- data/lib/head_music/style/guidelines/consonant_downbeats.rb +1 -1
- data/lib/head_music/style/guidelines/diatonic.rb +2 -2
- data/lib/head_music/style/guidelines/end_on_perfect_consonance.rb +1 -1
- data/lib/head_music/style/guidelines/end_on_tonic.rb +1 -1
- data/lib/head_music/style/guidelines/frequent_direction_changes.rb +1 -1
- data/lib/head_music/style/guidelines/limit_octave_leaps.rb +1 -1
- data/lib/head_music/style/guidelines/moderate_direction_changes.rb +1 -1
- data/lib/head_music/style/guidelines/mostly_conjunct.rb +4 -4
- data/lib/head_music/style/guidelines/no_rests.rb +1 -1
- data/lib/head_music/style/guidelines/no_unisons_in_middle.rb +1 -1
- data/lib/head_music/style/guidelines/notes_same_length.rb +4 -4
- data/lib/head_music/style/guidelines/one_to_one.rb +1 -1
- data/lib/head_music/style/guidelines/prefer_contrary_motion.rb +1 -1
- data/lib/head_music/style/guidelines/prefer_imperfect.rb +1 -1
- data/lib/head_music/style/guidelines/prepare_octave_leaps.rb +1 -1
- data/lib/head_music/style/guidelines/recover_large_leaps.rb +1 -1
- data/lib/head_music/style/guidelines/singable_intervals.rb +1 -1
- data/lib/head_music/style/guidelines/singable_range.rb +1 -1
- data/lib/head_music/style/guidelines/single_large_leaps.rb +1 -1
- data/lib/head_music/style/guidelines/start_on_perfect_consonance.rb +1 -1
- data/lib/head_music/style/guidelines/start_on_tonic.rb +1 -1
- data/lib/head_music/style/guidelines/step_down_to_final_note.rb +2 -2
- data/lib/head_music/style/guidelines/step_out_of_unison.rb +1 -1
- data/lib/head_music/style/guidelines/step_to_final_note.rb +2 -2
- data/lib/head_music/style/guidelines/step_up_to_final_note.rb +2 -2
- data/lib/head_music/style/guidelines/up_to_fourteen_notes.rb +2 -2
- data/lib/head_music/style/guides/first_species_harmony.rb +9 -1
- data/lib/head_music/style/guides/first_species_melody.rb +1 -1
- data/lib/head_music/style/guides/fux_cantus_firmus.rb +1 -1
- data/lib/head_music/style/guides/modern_cantus_firmus.rb +1 -1
- data/lib/head_music/style/mark.rb +1 -1
- data/lib/head_music/utilities/hash_key.rb +1 -1
- data/lib/head_music/version.rb +1 -1
- data/lib/head_music.rb +91 -91
- metadata +6 -20
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::PreferImperfect < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Prefer imperfect harmonic intervals."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
HeadMusic::Style::Mark.for_all(perfect_intervals.map(&:notes).flatten) if ratio_of_perfect_intervals >= 0.5
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::PrepareOctaveLeaps < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Enter and exit an octave leap from within."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
(external_entries + external_exits + octave_ending).map do |trouble_spot|
|
@@ -8,7 +8,7 @@ module HeadMusic::Style::Guidelines; end
|
|
8
8
|
# unless another leap (in either direction) creates a consonant triad.
|
9
9
|
# - Brian
|
10
10
|
class HeadMusic::Style::Guidelines::RecoverLargeLeaps < HeadMusic::Style::Annotation
|
11
|
-
MESSAGE =
|
11
|
+
MESSAGE = "Recover large leaps by step in the opposite direction."
|
12
12
|
|
13
13
|
def marks
|
14
14
|
melodic_intervals.each_cons(3).map do |intervals|
|
@@ -8,7 +8,7 @@ class HeadMusic::Style::Guidelines::SingableIntervals < HeadMusic::Style::Annota
|
|
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
|
|
11
|
-
MESSAGE =
|
11
|
+
MESSAGE = "Use only PU, m2, M2, m3, M3, P4, P5, m6 (ascending), P8 in the melodic line."
|
12
12
|
|
13
13
|
def marks
|
14
14
|
melodic_intervals.reject { |interval| permitted?(interval) }.map do |unpermitted_interval|
|
@@ -7,7 +7,7 @@ module HeadMusic::Style::Guidelines; end
|
|
7
7
|
class HeadMusic::Style::Guidelines::SingableRange < HeadMusic::Style::Annotation
|
8
8
|
MAXIMUM_RANGE = 10
|
9
9
|
|
10
|
-
MESSAGE =
|
10
|
+
MESSAGE = "Limit melodic range to a 10th."
|
11
11
|
|
12
12
|
def marks
|
13
13
|
HeadMusic::Style::Mark.for_each(extremes, fitness: HeadMusic::PENALTY_FACTOR**overage) if overage.positive?
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::SingleLargeLeaps < HeadMusic::Style::Guidelines::RecoverLargeLeaps
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Recover leaps by step, repetition, opposite direction, or spelling triad."
|
9
9
|
|
10
10
|
private
|
11
11
|
|
@@ -5,7 +5,7 @@ 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
7
|
class HeadMusic::Style::Guidelines::StartOnPerfectConsonance < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Start on the tonic or a perfect consonance above the tonic (unless bass voice)."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
return unless first_note && ((bass_voice? && !starts_on_tonic?) || !starts_on_perfect_consonance?)
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::StartOnTonic < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Start on the first scale degree."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
HeadMusic::Style::Mark.for(first_note) if first_note && !starts_on_tonic?
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::StepDownToFinalNote < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Step down to the final note."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
return if last_melodic_interval.nil?
|
@@ -13,7 +13,7 @@ class HeadMusic::Style::Guidelines::StepDownToFinalNote < HeadMusic::Style::Anno
|
|
13
13
|
fitness = 1
|
14
14
|
fitness *= HeadMusic::PENALTY_FACTOR unless step?
|
15
15
|
fitness *= HeadMusic::PENALTY_FACTOR unless descending?
|
16
|
-
HeadMusic::Style::Mark.for_all(notes[-2
|
16
|
+
HeadMusic::Style::Mark.for_all(notes[-2..], fitness: fitness) if fitness < 1
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::StepOutOfUnison < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Exit a unison by step."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
leaps_following_unisons.map do |skip|
|
@@ -5,10 +5,10 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::StepToFinalNote < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Step to the final note."
|
9
9
|
|
10
10
|
def marks
|
11
|
-
HeadMusic::Style::Mark.for_all(notes[-2
|
11
|
+
HeadMusic::Style::Mark.for_all(notes[-2..]) unless step_to_final_note?
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
@@ -5,7 +5,7 @@ module HeadMusic::Style::Guidelines; end
|
|
5
5
|
|
6
6
|
# A counterpoint guideline
|
7
7
|
class HeadMusic::Style::Guidelines::StepUpToFinalNote < HeadMusic::Style::Annotation
|
8
|
-
MESSAGE =
|
8
|
+
MESSAGE = "Step up to final note."
|
9
9
|
|
10
10
|
def marks
|
11
11
|
return if last_melodic_interval.nil?
|
@@ -13,7 +13,7 @@ class HeadMusic::Style::Guidelines::StepUpToFinalNote < HeadMusic::Style::Annota
|
|
13
13
|
fitness = 1
|
14
14
|
fitness *= HeadMusic::PENALTY_FACTOR unless step?
|
15
15
|
fitness *= HeadMusic::PENALTY_FACTOR unless ascending?
|
16
|
-
HeadMusic::Style::Mark.for_all(notes[-2
|
16
|
+
HeadMusic::Style::Mark.for_all(notes[-2..], fitness: fitness) if fitness < 1
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -7,10 +7,10 @@ module HeadMusic::Style::Guidelines; end
|
|
7
7
|
class HeadMusic::Style::Guidelines::UpToFourteenNotes < HeadMusic::Style::Annotation
|
8
8
|
MAXIMUM_NOTES = 14
|
9
9
|
|
10
|
-
MESSAGE =
|
10
|
+
MESSAGE = "Write up to fourteen notes."
|
11
11
|
|
12
12
|
def marks
|
13
|
-
HeadMusic::Style::Mark.for_each(notes[MAXIMUM_NOTES
|
13
|
+
HeadMusic::Style::Mark.for_each(notes[MAXIMUM_NOTES..]) if overage.positive?
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -13,10 +13,18 @@ class HeadMusic::Style::Guides::FirstSpeciesHarmony
|
|
13
13
|
HeadMusic::Style::Guidelines::NoUnisonsInMiddle,
|
14
14
|
HeadMusic::Style::Guidelines::OneToOne,
|
15
15
|
HeadMusic::Style::Guidelines::PreferContraryMotion,
|
16
|
-
HeadMusic::Style::Guidelines::PreferImperfect
|
16
|
+
HeadMusic::Style::Guidelines::PreferImperfect
|
17
17
|
].freeze
|
18
18
|
|
19
19
|
def self.analyze(voice)
|
20
20
|
RULESET.map { |rule| rule.new(voice) }
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
# TODO: Guideline against leaping into P8 even by contrary motion.
|
25
|
+
# TODO: Guideline allowing oblique motion < ~15% of the time.
|
26
|
+
# TODO: Guideline against battuta (10-8 not at cadence, unless 10-8-6 voice exchange)
|
27
|
+
# TODO: 16th C: No M6 leaps. m6 leaps ascending only.
|
28
|
+
# TODO: 16th C (?): Avoid perfect consonances on consecutive downbeats
|
29
|
+
# TODO: 16th C: No 5-7-1 ending
|
30
|
+
# TODO: 16th C Cantus Firmus: Raise the 7 in the cadence, except in Phrygian
|
@@ -19,7 +19,7 @@ class HeadMusic::Style::Guides::FirstSpeciesMelody
|
|
19
19
|
HeadMusic::Style::Guidelines::SingableRange,
|
20
20
|
HeadMusic::Style::Guidelines::StartOnPerfectConsonance,
|
21
21
|
HeadMusic::Style::Guidelines::StepOutOfUnison,
|
22
|
-
HeadMusic::Style::Guidelines::StepUpToFinalNote
|
22
|
+
HeadMusic::Style::Guidelines::StepUpToFinalNote
|
23
23
|
].freeze
|
24
24
|
|
25
25
|
def self.analyze(voice)
|
@@ -21,7 +21,7 @@ class HeadMusic::Style::Guides::FuxCantusFirmus
|
|
21
21
|
HeadMusic::Style::Guidelines::SingableRange,
|
22
22
|
HeadMusic::Style::Guidelines::StartOnTonic,
|
23
23
|
HeadMusic::Style::Guidelines::StepDownToFinalNote,
|
24
|
-
HeadMusic::Style::Guidelines::UpToFourteenNotes
|
24
|
+
HeadMusic::Style::Guidelines::UpToFourteenNotes
|
25
25
|
].freeze
|
26
26
|
|
27
27
|
def self.analyze(voice)
|
@@ -22,7 +22,7 @@ class HeadMusic::Style::Guides::ModernCantusFirmus
|
|
22
22
|
HeadMusic::Style::Guidelines::SingleLargeLeaps,
|
23
23
|
HeadMusic::Style::Guidelines::StartOnTonic,
|
24
24
|
HeadMusic::Style::Guidelines::StepToFinalNote,
|
25
|
-
HeadMusic::Style::Guidelines::UpToFourteenNotes
|
25
|
+
HeadMusic::Style::Guidelines::UpToFourteenNotes
|
26
26
|
].freeze
|
27
27
|
|
28
28
|
def self.analyze(voice)
|
@@ -6,6 +6,6 @@ module HeadMusic::Utilities; end
|
|
6
6
|
# Util for converting an object to a consistent hash key
|
7
7
|
module HeadMusic::Utilities::HashKey
|
8
8
|
def self.for(identifier)
|
9
|
-
I18n.transliterate(identifier.to_s).downcase.gsub(/\W+/,
|
9
|
+
I18n.transliterate(identifier.to_s).downcase.gsub(/\W+/, "_").to_sym
|
10
10
|
end
|
11
11
|
end
|
data/lib/head_music/version.rb
CHANGED
data/lib/head_music.rb
CHANGED
@@ -7,16 +7,16 @@ module HeadMusic
|
|
7
7
|
SMALL_PENALTY_FACTOR = GOLDEN_RATIO_INVERSE**0.5
|
8
8
|
end
|
9
9
|
|
10
|
-
require
|
10
|
+
require "head_music/version"
|
11
11
|
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
12
|
+
require "active_support/core_ext/module/delegation"
|
13
|
+
require "active_support/core_ext/string/access"
|
14
|
+
require "humanize"
|
15
|
+
require "i18n"
|
16
|
+
require "i18n/backend/fallbacks"
|
17
17
|
|
18
18
|
I18n::Backend::Simple.include I18n::Backend::Fallbacks
|
19
|
-
I18n.load_path << Dir[File.join(File.dirname(__dir__),
|
19
|
+
I18n.load_path << Dir[File.join(File.dirname(__dir__), "lib", "head_music", "locales", "*.yml")]
|
20
20
|
I18n.config.available_locales = %i[en fr de it ru es en_US en_GB]
|
21
21
|
I18n.default_locale = :en
|
22
22
|
I18n.fallbacks[:de] = %i[de en_GB en]
|
@@ -28,99 +28,99 @@ I18n.fallbacks[:it] = %i[it en_GB en]
|
|
28
28
|
I18n.fallbacks[:ru] = %i[ru en_GB en]
|
29
29
|
|
30
30
|
# utilities
|
31
|
-
require
|
31
|
+
require "head_music/utilities/hash_key"
|
32
32
|
|
33
33
|
# modules
|
34
|
-
require
|
34
|
+
require "head_music/named"
|
35
35
|
|
36
36
|
# rudiments
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require
|
41
|
-
require
|
42
|
-
require
|
43
|
-
require
|
44
|
-
require
|
45
|
-
require
|
46
|
-
require
|
47
|
-
require
|
48
|
-
require
|
49
|
-
require
|
50
|
-
require
|
51
|
-
require
|
52
|
-
require
|
53
|
-
require
|
54
|
-
require
|
55
|
-
require
|
56
|
-
require
|
57
|
-
require
|
58
|
-
require
|
59
|
-
require
|
60
|
-
require
|
61
|
-
require
|
62
|
-
require
|
63
|
-
require
|
64
|
-
require
|
65
|
-
require
|
66
|
-
require
|
67
|
-
require
|
68
|
-
require
|
69
|
-
require
|
70
|
-
require
|
71
|
-
require
|
37
|
+
require "head_music/chromatic_interval"
|
38
|
+
require "head_music/circle"
|
39
|
+
require "head_music/clef"
|
40
|
+
require "head_music/consonance"
|
41
|
+
require "head_music/diatonic_interval"
|
42
|
+
require "head_music/grand_staff"
|
43
|
+
require "head_music/harmonic_interval"
|
44
|
+
require "head_music/instrument"
|
45
|
+
require "head_music/interval_cycle"
|
46
|
+
require "head_music/key_signature"
|
47
|
+
require "head_music/letter_name"
|
48
|
+
require "head_music/melodic_interval"
|
49
|
+
require "head_music/meter"
|
50
|
+
require "head_music/motion"
|
51
|
+
require "head_music/musical_symbol"
|
52
|
+
require "head_music/pitch"
|
53
|
+
require "head_music/pitch/enharmonic_equivalence"
|
54
|
+
require "head_music/pitch/octave_equivalence"
|
55
|
+
require "head_music/pitch_class"
|
56
|
+
require "head_music/pitch_class_set"
|
57
|
+
require "head_music/pitch_set"
|
58
|
+
require "head_music/quality"
|
59
|
+
require "head_music/reference_pitch"
|
60
|
+
require "head_music/register"
|
61
|
+
require "head_music/rhythm"
|
62
|
+
require "head_music/rhythmic_unit"
|
63
|
+
require "head_music/scale"
|
64
|
+
require "head_music/scale_degree"
|
65
|
+
require "head_music/scale_type"
|
66
|
+
require "head_music/sign"
|
67
|
+
require "head_music/solmization"
|
68
|
+
require "head_music/sonority"
|
69
|
+
require "head_music/spelling"
|
70
|
+
require "head_music/staff"
|
71
|
+
require "head_music/tuning"
|
72
72
|
|
73
73
|
# content
|
74
|
-
require
|
75
|
-
require
|
76
|
-
require
|
77
|
-
require
|
78
|
-
require
|
79
|
-
require
|
80
|
-
require
|
74
|
+
require "head_music/content/bar"
|
75
|
+
require "head_music/content/composition"
|
76
|
+
require "head_music/content/note"
|
77
|
+
require "head_music/content/placement"
|
78
|
+
require "head_music/content/position"
|
79
|
+
require "head_music/content/rhythmic_value"
|
80
|
+
require "head_music/content/voice"
|
81
81
|
|
82
82
|
# analysis
|
83
|
-
require
|
84
|
-
require
|
85
|
-
require
|
83
|
+
require "head_music/style/analysis"
|
84
|
+
require "head_music/style/annotation"
|
85
|
+
require "head_music/style/mark"
|
86
86
|
|
87
87
|
# guidelines
|
88
|
-
require
|
89
|
-
require
|
90
|
-
require
|
91
|
-
require
|
92
|
-
require
|
93
|
-
require
|
94
|
-
require
|
95
|
-
require
|
96
|
-
require
|
97
|
-
require
|
98
|
-
require
|
99
|
-
require
|
100
|
-
require
|
101
|
-
require
|
102
|
-
require
|
103
|
-
require
|
104
|
-
require
|
105
|
-
require
|
106
|
-
require
|
107
|
-
require
|
108
|
-
require
|
109
|
-
require
|
110
|
-
require
|
111
|
-
require
|
112
|
-
require
|
113
|
-
require
|
114
|
-
require
|
115
|
-
require
|
116
|
-
require
|
117
|
-
require
|
118
|
-
require
|
119
|
-
require
|
120
|
-
require
|
88
|
+
require "head_music/style/guidelines/always_move"
|
89
|
+
require "head_music/style/guidelines/approach_perfection_contrarily"
|
90
|
+
require "head_music/style/guidelines/at_least_eight_notes"
|
91
|
+
require "head_music/style/guidelines/avoid_crossing_voices"
|
92
|
+
require "head_music/style/guidelines/avoid_overlapping_voices"
|
93
|
+
require "head_music/style/guidelines/consonant_climax"
|
94
|
+
require "head_music/style/guidelines/consonant_downbeats"
|
95
|
+
require "head_music/style/guidelines/diatonic"
|
96
|
+
require "head_music/style/guidelines/direction_changes"
|
97
|
+
require "head_music/style/guidelines/end_on_perfect_consonance"
|
98
|
+
require "head_music/style/guidelines/end_on_tonic"
|
99
|
+
require "head_music/style/guidelines/frequent_direction_changes"
|
100
|
+
require "head_music/style/guidelines/limit_octave_leaps"
|
101
|
+
require "head_music/style/guidelines/moderate_direction_changes"
|
102
|
+
require "head_music/style/guidelines/mostly_conjunct"
|
103
|
+
require "head_music/style/guidelines/notes_same_length"
|
104
|
+
require "head_music/style/guidelines/no_rests"
|
105
|
+
require "head_music/style/guidelines/no_unisons_in_middle"
|
106
|
+
require "head_music/style/guidelines/one_to_one"
|
107
|
+
require "head_music/style/guidelines/prefer_contrary_motion"
|
108
|
+
require "head_music/style/guidelines/prefer_imperfect"
|
109
|
+
require "head_music/style/guidelines/prepare_octave_leaps"
|
110
|
+
require "head_music/style/guidelines/recover_large_leaps"
|
111
|
+
require "head_music/style/guidelines/singable_intervals"
|
112
|
+
require "head_music/style/guidelines/singable_range"
|
113
|
+
require "head_music/style/guidelines/single_large_leaps"
|
114
|
+
require "head_music/style/guidelines/start_on_perfect_consonance"
|
115
|
+
require "head_music/style/guidelines/start_on_tonic"
|
116
|
+
require "head_music/style/guidelines/step_down_to_final_note"
|
117
|
+
require "head_music/style/guidelines/step_out_of_unison"
|
118
|
+
require "head_music/style/guidelines/step_to_final_note"
|
119
|
+
require "head_music/style/guidelines/step_up_to_final_note"
|
120
|
+
require "head_music/style/guidelines/up_to_fourteen_notes"
|
121
121
|
|
122
122
|
# guides
|
123
|
-
require
|
124
|
-
require
|
125
|
-
require
|
126
|
-
require
|
123
|
+
require "head_music/style/guides/fux_cantus_firmus"
|
124
|
+
require "head_music/style/guides/modern_cantus_firmus"
|
125
|
+
require "head_music/style/guides/first_species_melody"
|
126
|
+
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.
|
4
|
+
version: 0.28.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Head
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.8'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.13'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.13'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rake
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -233,7 +219,7 @@ homepage: https://github.com/roberthead/head_music
|
|
233
219
|
licenses:
|
234
220
|
- MIT
|
235
221
|
metadata: {}
|
236
|
-
post_install_message:
|
222
|
+
post_install_message:
|
237
223
|
rdoc_options: []
|
238
224
|
require_paths:
|
239
225
|
- lib
|
@@ -248,8 +234,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
248
234
|
- !ruby/object:Gem::Version
|
249
235
|
version: '0'
|
250
236
|
requirements: []
|
251
|
-
rubygems_version: 3.
|
252
|
-
signing_key:
|
237
|
+
rubygems_version: 3.3.26
|
238
|
+
signing_key:
|
253
239
|
specification_version: 4
|
254
240
|
summary: The rudiments of western music theory.
|
255
241
|
test_files: []
|