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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +1 -1
  3. data/.rubocop.yml +11 -37
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +1 -1
  6. data/Gemfile +8 -6
  7. data/Rakefile +5 -4
  8. data/bin/console +3 -3
  9. data/head_music.gemspec +21 -22
  10. data/lib/head_music/chromatic_interval.rb +3 -3
  11. data/lib/head_music/circle.rb +18 -14
  12. data/lib/head_music/clef.rb +3 -3
  13. data/lib/head_music/content/bar.rb +1 -1
  14. data/lib/head_music/content/composition.rb +1 -1
  15. data/lib/head_music/content/note.rb +1 -1
  16. data/lib/head_music/content/placement.rb +5 -5
  17. data/lib/head_music/content/position.rb +3 -3
  18. data/lib/head_music/content/rhythmic_value.rb +8 -8
  19. data/lib/head_music/content/voice.rb +1 -1
  20. data/lib/head_music/diatonic_interval.rb +41 -43
  21. data/lib/head_music/grand_staff.rb +8 -8
  22. data/lib/head_music/instrument.rb +8 -8
  23. data/lib/head_music/interval_cycle.rb +10 -12
  24. data/lib/head_music/key_signature.rb +12 -13
  25. data/lib/head_music/letter_name.rb +7 -7
  26. data/lib/head_music/melodic_interval.rb +1 -1
  27. data/lib/head_music/meter.rb +17 -12
  28. data/lib/head_music/named.rb +3 -3
  29. data/lib/head_music/pitch/enharmonic_equivalence.rb +2 -2
  30. data/lib/head_music/pitch/octave_equivalence.rb +1 -1
  31. data/lib/head_music/pitch.rb +9 -8
  32. data/lib/head_music/pitch_class.rb +18 -4
  33. data/lib/head_music/pitch_class_set.rb +5 -5
  34. data/lib/head_music/pitch_set.rb +9 -6
  35. data/lib/head_music/quality.rb +15 -14
  36. data/lib/head_music/reference_pitch.rb +23 -23
  37. data/lib/head_music/register.rb +2 -2
  38. data/lib/head_music/rhythmic_unit.rb +9 -9
  39. data/lib/head_music/scale.rb +4 -4
  40. data/lib/head_music/scale_degree.rb +2 -2
  41. data/lib/head_music/scale_type.rb +13 -13
  42. data/lib/head_music/sign.rb +12 -11
  43. data/lib/head_music/solmization.rb +3 -3
  44. data/lib/head_music/sonority.rb +2 -2
  45. data/lib/head_music/spelling.rb +4 -6
  46. data/lib/head_music/staff.rb +1 -1
  47. data/lib/head_music/style/analysis.rb +1 -1
  48. data/lib/head_music/style/annotation.rb +7 -7
  49. data/lib/head_music/style/guidelines/always_move.rb +4 -4
  50. data/lib/head_music/style/guidelines/approach_perfection_contrarily.rb +1 -1
  51. data/lib/head_music/style/guidelines/at_least_eight_notes.rb +3 -3
  52. data/lib/head_music/style/guidelines/avoid_crossing_voices.rb +6 -6
  53. data/lib/head_music/style/guidelines/avoid_overlapping_voices.rb +1 -1
  54. data/lib/head_music/style/guidelines/consonant_climax.rb +1 -1
  55. data/lib/head_music/style/guidelines/consonant_downbeats.rb +1 -1
  56. data/lib/head_music/style/guidelines/diatonic.rb +2 -2
  57. data/lib/head_music/style/guidelines/end_on_perfect_consonance.rb +1 -1
  58. data/lib/head_music/style/guidelines/end_on_tonic.rb +1 -1
  59. data/lib/head_music/style/guidelines/frequent_direction_changes.rb +1 -1
  60. data/lib/head_music/style/guidelines/limit_octave_leaps.rb +1 -1
  61. data/lib/head_music/style/guidelines/moderate_direction_changes.rb +1 -1
  62. data/lib/head_music/style/guidelines/mostly_conjunct.rb +4 -4
  63. data/lib/head_music/style/guidelines/no_rests.rb +1 -1
  64. data/lib/head_music/style/guidelines/no_unisons_in_middle.rb +1 -1
  65. data/lib/head_music/style/guidelines/notes_same_length.rb +4 -4
  66. data/lib/head_music/style/guidelines/one_to_one.rb +1 -1
  67. data/lib/head_music/style/guidelines/prefer_contrary_motion.rb +1 -1
  68. data/lib/head_music/style/guidelines/prefer_imperfect.rb +1 -1
  69. data/lib/head_music/style/guidelines/prepare_octave_leaps.rb +1 -1
  70. data/lib/head_music/style/guidelines/recover_large_leaps.rb +1 -1
  71. data/lib/head_music/style/guidelines/singable_intervals.rb +1 -1
  72. data/lib/head_music/style/guidelines/singable_range.rb +1 -1
  73. data/lib/head_music/style/guidelines/single_large_leaps.rb +1 -1
  74. data/lib/head_music/style/guidelines/start_on_perfect_consonance.rb +1 -1
  75. data/lib/head_music/style/guidelines/start_on_tonic.rb +1 -1
  76. data/lib/head_music/style/guidelines/step_down_to_final_note.rb +2 -2
  77. data/lib/head_music/style/guidelines/step_out_of_unison.rb +1 -1
  78. data/lib/head_music/style/guidelines/step_to_final_note.rb +2 -2
  79. data/lib/head_music/style/guidelines/step_up_to_final_note.rb +2 -2
  80. data/lib/head_music/style/guidelines/up_to_fourteen_notes.rb +2 -2
  81. data/lib/head_music/style/guides/first_species_harmony.rb +9 -1
  82. data/lib/head_music/style/guides/first_species_melody.rb +1 -1
  83. data/lib/head_music/style/guides/fux_cantus_firmus.rb +1 -1
  84. data/lib/head_music/style/guides/modern_cantus_firmus.rb +1 -1
  85. data/lib/head_music/style/mark.rb +1 -1
  86. data/lib/head_music/utilities/hash_key.rb +1 -1
  87. data/lib/head_music/version.rb +1 -1
  88. data/lib/head_music.rb +91 -91
  89. 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 = 'Prefer imperfect harmonic intervals.'
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 = 'Enter and exit an octave leap from within.'
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 = 'Recover large leaps by step in the opposite direction.'
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 = 'Use only PU, m2, M2, m3, M3, P4, P5, m6 (ascending), P8 in the melodic line.'
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 = 'Limit melodic range to a 10th.'
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 = 'Recover leaps by step, repetition, opposite direction, or spelling triad.'
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 = 'Start on the tonic or a perfect consonance above the tonic (unless bass voice).'
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 = 'Start on the first scale degree.'
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 = 'Step down to the final note.'
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..-1], fitness: fitness) if fitness < 1
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 = 'Exit a unison by step.'
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 = 'Step to the final note.'
8
+ MESSAGE = "Step to the final note."
9
9
 
10
10
  def marks
11
- HeadMusic::Style::Mark.for_all(notes[-2..-1]) unless step_to_final_note?
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 = 'Step up to final note.'
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..-1], fitness: fitness) if fitness < 1
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 = 'Write up to fourteen notes.'
10
+ MESSAGE = "Write up to fourteen notes."
11
11
 
12
12
  def marks
13
- HeadMusic::Style::Mark.for_each(notes[MAXIMUM_NOTES..-1]) if overage.positive?
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)
@@ -33,7 +33,7 @@ class HeadMusic::Style::Mark
33
33
  end
34
34
 
35
35
  def code
36
- [start_position, end_position].join(' to ')
36
+ [start_position, end_position].join(" to ")
37
37
  end
38
38
 
39
39
  def to_s
@@ -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+/, '_').to_sym
9
+ I18n.transliterate(identifier.to_s).downcase.gsub(/\W+/, "_").to_sym
10
10
  end
11
11
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HeadMusic
4
- VERSION = '0.27.0'
4
+ VERSION = "0.28.0"
5
5
  end
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 'head_music/version'
10
+ require "head_music/version"
11
11
 
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'
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__), 'lib', 'head_music', 'locales', '*.yml')]
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 'head_music/utilities/hash_key'
31
+ require "head_music/utilities/hash_key"
32
32
 
33
33
  # modules
34
- require 'head_music/named'
34
+ require "head_music/named"
35
35
 
36
36
  # rudiments
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'
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 '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'
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 'head_music/style/analysis'
84
- require 'head_music/style/annotation'
85
- require 'head_music/style/mark'
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 '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'
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 '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'
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.27.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: 2021-05-23 00:00:00.000000000 Z
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.0.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: []