head_music 8.0.0 → 8.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1693c61699c2fdcf64441f532c205b8be2e3b6b2be47e772c2471d671b7712b3
4
- data.tar.gz: 1c819eee801f19b38cfbb6bdc51177c2e885aced316ea55034bb6c99a75183c5
3
+ metadata.gz: 59fd761fa9c441ada6674ebabb1e83c81991f21b20d2b29812160cf7d1bfd1f6
4
+ data.tar.gz: 6d7edeb8c3c8fbcd2abf3069860c7a31bc2c40cc95e38ef718d94ce2821a655d
5
5
  SHA512:
6
- metadata.gz: ced29a767bab571ee4c77a14d6c108510465c8424ee66249cd3343efbceb3bec2dec8e94664a2b260a4a0716ae51948c3b796ff088d0b3aab07d40ac762ec111
7
- data.tar.gz: 6e7bf970c65500799fa0788f468885207f531c7a8de5c6f1f6be27952435994616f7dc1f10bf1ad51a233244a47d43eca553d9d73add30e8ca89afafac300d9b
6
+ metadata.gz: 605e82fb95ba7e5c91ca2f861bafbf9dd54e94ab02404382a2ae3293a943a85455dd26c40a46d6725fd26c0caeb89c898220d9b572c5a0b22c0bac0a172e31ce
7
+ data.tar.gz: 9a920c87fad466335f8b02cff76cd1a202c3a20d9d6e0bc53e91a93648406587e652f0dc47296063d40a26c2fa385a7250f3b6e955c9e99820c513ce97788540
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
  /tmp/
10
10
  /spec/examples.txt
11
11
  *.gem
12
+
13
+ **/.claude/settings.local.json
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  require:
2
2
  - standard
3
+
4
+ plugins:
3
5
  - rubocop-rspec
4
6
  - rubocop-rake
5
7
 
@@ -1,10 +1,10 @@
1
- require "head_music/rudiment/interval_cycle"
1
+ require "head_music/analysis/interval_cycle"
2
2
 
3
- # A module for music rudiments
4
- module HeadMusic::Rudiment; end
3
+ # A module for musical analysis
4
+ module HeadMusic::Analysis; end
5
5
 
6
6
  # A Circle of Fifths or Fourths shows relationships between pitch classes
7
- class HeadMusic::Rudiment::Circle < HeadMusic::Rudiment::IntervalCycle
7
+ class HeadMusic::Analysis::Circle < HeadMusic::Analysis::IntervalCycle
8
8
  def self.of_fifths
9
9
  get(:perfect_fifth)
10
10
  end
@@ -1,8 +1,8 @@
1
- # A module for music rudiments
2
- module HeadMusic::Rudiment; end
1
+ # A module for musical analysis
2
+ module HeadMusic::Analysis; end
3
3
 
4
4
  # An Interval Cycle is a collection of pitch classes created from a sequence of the same interval class.
5
- class HeadMusic::Rudiment::IntervalCycle
5
+ class HeadMusic::Analysis::IntervalCycle
6
6
  attr_reader :interval, :starting_pitch
7
7
 
8
8
  def self.get(interval = 7)
@@ -29,7 +29,7 @@ class HeadMusic::Rudiment::IntervalCycle
29
29
  end
30
30
 
31
31
  def pitch_class_set
32
- @pitch_class_set ||= HeadMusic::Rudiment::PitchClassSet.new(pitches)
32
+ @pitch_class_set ||= HeadMusic::Analysis::PitchClassSet.new(pitches)
33
33
  end
34
34
 
35
35
  def spellings
@@ -59,7 +59,7 @@ class HeadMusic::Analysis::MelodicInterval
59
59
  end
60
60
 
61
61
  def spans?(pitch)
62
- pitch >= low_pitch && pitch <= high_pitch
62
+ pitch.between?(low_pitch, high_pitch)
63
63
  end
64
64
 
65
65
  def high_pitch
@@ -87,7 +87,7 @@ class HeadMusic::Analysis::MelodicInterval
87
87
  combined_pitches = (pitches + other_interval.pitches).uniq
88
88
  return false if combined_pitches.length < 3
89
89
 
90
- HeadMusic::Rudiment::PitchSet.new(combined_pitches).consonant_triad?
90
+ HeadMusic::Analysis::PitchSet.new(combined_pitches).consonant_triad?
91
91
  end
92
92
 
93
93
  def method_missing(method_name, *args, &block)
@@ -1,9 +1,9 @@
1
- # A module for music rudiments
2
- module HeadMusic::Rudiment; end
1
+ # A module for musical analysis
2
+ module HeadMusic::Analysis; end
3
3
 
4
4
  # A PitchClassSet represents a pitch-class set or pitch collection.
5
5
  # See also: PitchSet, PitchClass
6
- class HeadMusic::Rudiment::PitchClassSet
6
+ class HeadMusic::Analysis::PitchClassSet
7
7
  attr_reader :pitch_classes
8
8
 
9
9
  delegate :empty?, to: :pitch_classes
@@ -1,9 +1,9 @@
1
- # A module for music rudiments
2
- module HeadMusic::Rudiment; end
1
+ # A module for musical analysis
2
+ module HeadMusic::Analysis; end
3
3
 
4
4
  # A PitchSet is a collection of one or more pitches.
5
5
  # See also: PitchClassSet
6
- class HeadMusic::Rudiment::PitchSet
6
+ class HeadMusic::Analysis::PitchSet
7
7
  TERTIAN_SONORITIES = {
8
8
  implied_triad: [3],
9
9
  triad: [3, 5],
@@ -31,11 +31,11 @@ class HeadMusic::Rudiment::PitchSet
31
31
  end
32
32
 
33
33
  def pitch_class_set
34
- @pitch_class_set ||= HeadMusic::Rudiment::PitchClassSet.new(pitch_classes)
34
+ @pitch_class_set ||= HeadMusic::Analysis::PitchClassSet.new(pitch_classes)
35
35
  end
36
36
 
37
37
  def reduction
38
- @reduction ||= HeadMusic::Rudiment::PitchSet.new(reduction_pitches)
38
+ @reduction ||= HeadMusic::Analysis::PitchSet.new(reduction_pitches)
39
39
  end
40
40
 
41
41
  def diatonic_intervals
@@ -67,13 +67,13 @@ class HeadMusic::Rudiment::PitchSet
67
67
  def invert
68
68
  inverted_pitch = pitches[0] + HeadMusic::Analysis::DiatonicInterval.get("perfect octave")
69
69
  new_pitches = pitches.drop(1) + [inverted_pitch]
70
- HeadMusic::Rudiment::PitchSet.new(new_pitches)
70
+ HeadMusic::Analysis::PitchSet.new(new_pitches)
71
71
  end
72
72
 
73
73
  def uninvert
74
74
  inverted_pitch = pitches[-1] - HeadMusic::Analysis::DiatonicInterval.get("perfect octave")
75
75
  new_pitches = [inverted_pitch] + pitches[0..-2]
76
- HeadMusic::Rudiment::PitchSet.new(new_pitches)
76
+ HeadMusic::Analysis::PitchSet.new(new_pitches)
77
77
  end
78
78
 
79
79
  def bass_pitch
@@ -1,10 +1,10 @@
1
- # A module for music rudiments
2
- module HeadMusic::Rudiment; end
1
+ # A module for musical analysis
2
+ module HeadMusic::Analysis; end
3
3
 
4
4
  # A Sonority describes a set of pitch class intervalic relationships.
5
5
  # For example, a minor triad, or a major-minor seventh chord.
6
6
  # The Sonority class is a factory for returning one of its subclasses.
7
- class HeadMusic::Rudiment::Sonority
7
+ class HeadMusic::Analysis::Sonority
8
8
  SONORITIES = {
9
9
  major_triad: %w[M3 P5],
10
10
  minor_triad: %w[m3 P5],
@@ -117,8 +117,8 @@ class HeadMusic::Rudiment::Sonority
117
117
  end
118
118
 
119
119
  def ==(other)
120
- other = HeadMusic::Rudiment::PitchSet.new(other) if other.is_a?(Array)
121
- other = self.class.new(other) if other.is_a?(HeadMusic::Rudiment::PitchSet)
120
+ other = HeadMusic::Analysis::PitchSet.new(other) if other.is_a?(Array)
121
+ other = self.class.new(other) if other.is_a?(HeadMusic::Analysis::PitchSet)
122
122
  identifier == other.identifier
123
123
  end
124
124
  end
@@ -6,9 +6,15 @@ class HeadMusic::Style::Guidelines::StartOnPerfectConsonance < HeadMusic::Style:
6
6
  MESSAGE = "Start on the tonic or a perfect consonance above the tonic (unless bass voice)."
7
7
 
8
8
  def marks
9
- return unless first_note && ((bass_voice? && !starts_on_tonic?) || !starts_on_perfect_consonance?)
9
+ return unless first_note
10
10
 
11
- HeadMusic::Style::Mark.for(first_note)
11
+ needs_marking = if bass_voice?
12
+ !starts_on_tonic?
13
+ else
14
+ !starts_on_perfect_consonance?
15
+ end
16
+
17
+ HeadMusic::Style::Mark.for(first_note) if needs_marking
12
18
  end
13
19
 
14
20
  private
@@ -1,3 +1,3 @@
1
1
  module HeadMusic
2
- VERSION = "8.0.0"
2
+ VERSION = "8.0.2"
3
3
  end
data/lib/head_music.rb CHANGED
@@ -34,10 +34,8 @@ require "head_music/named"
34
34
  # rudiments
35
35
  require "head_music/rudiment/alteration"
36
36
  require "head_music/rudiment/chromatic_interval"
37
- require "head_music/rudiment/circle"
38
37
  require "head_music/rudiment/clef"
39
38
  require "head_music/rudiment/consonance"
40
- require "head_music/rudiment/interval_cycle"
41
39
  require "head_music/rudiment/key_signature"
42
40
  require "head_music/rudiment/key_signature/enharmonic_equivalence"
43
41
  require "head_music/rudiment/letter_name"
@@ -47,8 +45,6 @@ require "head_music/rudiment/pitch"
47
45
  require "head_music/rudiment/pitch/enharmonic_equivalence"
48
46
  require "head_music/rudiment/pitch/octave_equivalence"
49
47
  require "head_music/rudiment/pitch_class"
50
- require "head_music/rudiment/pitch_class_set"
51
- require "head_music/rudiment/pitch_set"
52
48
  require "head_music/rudiment/quality"
53
49
  require "head_music/rudiment/reference_pitch"
54
50
  require "head_music/rudiment/register"
@@ -58,7 +54,6 @@ require "head_music/rudiment/scale"
58
54
  require "head_music/rudiment/scale_degree"
59
55
  require "head_music/rudiment/scale_type"
60
56
  require "head_music/rudiment/solmization"
61
- require "head_music/rudiment/sonority"
62
57
  require "head_music/rudiment/spelling"
63
58
  require "head_music/rudiment/tuning"
64
59
 
@@ -80,6 +75,7 @@ require "head_music/content/staff"
80
75
  require "head_music/content/voice"
81
76
 
82
77
  # analysis
78
+ require "head_music/analysis/circle"
83
79
  require "head_music/analysis/diatonic_interval"
84
80
  require "head_music/analysis/diatonic_interval/category"
85
81
  require "head_music/analysis/diatonic_interval/naming"
@@ -87,8 +83,12 @@ require "head_music/analysis/diatonic_interval/parser"
87
83
  require "head_music/analysis/diatonic_interval/semitones"
88
84
  require "head_music/analysis/diatonic_interval/size"
89
85
  require "head_music/analysis/harmonic_interval"
86
+ require "head_music/analysis/interval_cycle"
90
87
  require "head_music/analysis/melodic_interval"
91
88
  require "head_music/analysis/motion"
89
+ require "head_music/analysis/pitch_class_set"
90
+ require "head_music/analysis/pitch_set"
91
+ require "head_music/analysis/sonority"
92
92
 
93
93
  # style analysis
94
94
  require "head_music/style/analysis"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: head_music
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0
4
+ version: 8.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Head
@@ -120,6 +120,7 @@ files:
120
120
  - bin/setup
121
121
  - head_music.gemspec
122
122
  - lib/head_music.rb
123
+ - lib/head_music/analysis/circle.rb
123
124
  - lib/head_music/analysis/diatonic_interval.rb
124
125
  - lib/head_music/analysis/diatonic_interval/category.rb
125
126
  - lib/head_music/analysis/diatonic_interval/naming.rb
@@ -127,8 +128,12 @@ files:
127
128
  - lib/head_music/analysis/diatonic_interval/semitones.rb
128
129
  - lib/head_music/analysis/diatonic_interval/size.rb
129
130
  - lib/head_music/analysis/harmonic_interval.rb
131
+ - lib/head_music/analysis/interval_cycle.rb
130
132
  - lib/head_music/analysis/melodic_interval.rb
131
133
  - lib/head_music/analysis/motion.rb
134
+ - lib/head_music/analysis/pitch_class_set.rb
135
+ - lib/head_music/analysis/pitch_set.rb
136
+ - lib/head_music/analysis/sonority.rb
132
137
  - lib/head_music/content/bar.rb
133
138
  - lib/head_music/content/composition.rb
134
139
  - lib/head_music/content/note.rb
@@ -154,11 +159,9 @@ files:
154
159
  - lib/head_music/named.rb
155
160
  - lib/head_music/rudiment/alteration.rb
156
161
  - lib/head_music/rudiment/chromatic_interval.rb
157
- - lib/head_music/rudiment/circle.rb
158
162
  - lib/head_music/rudiment/clef.rb
159
163
  - lib/head_music/rudiment/clefs.yml
160
164
  - lib/head_music/rudiment/consonance.rb
161
- - lib/head_music/rudiment/interval_cycle.rb
162
165
  - lib/head_music/rudiment/key_signature.rb
163
166
  - lib/head_music/rudiment/key_signature/enharmonic_equivalence.rb
164
167
  - lib/head_music/rudiment/letter_name.rb
@@ -168,8 +171,6 @@ files:
168
171
  - lib/head_music/rudiment/pitch/enharmonic_equivalence.rb
169
172
  - lib/head_music/rudiment/pitch/octave_equivalence.rb
170
173
  - lib/head_music/rudiment/pitch_class.rb
171
- - lib/head_music/rudiment/pitch_class_set.rb
172
- - lib/head_music/rudiment/pitch_set.rb
173
174
  - lib/head_music/rudiment/quality.rb
174
175
  - lib/head_music/rudiment/reference_pitch.rb
175
176
  - lib/head_music/rudiment/register.rb
@@ -180,7 +181,6 @@ files:
180
181
  - lib/head_music/rudiment/scale_type.rb
181
182
  - lib/head_music/rudiment/solmization.rb
182
183
  - lib/head_music/rudiment/solmizations.yml
183
- - lib/head_music/rudiment/sonority.rb
184
184
  - lib/head_music/rudiment/spelling.rb
185
185
  - lib/head_music/rudiment/tuning.rb
186
186
  - lib/head_music/style/analysis.rb