head_music 9.0.1 → 11.0.0

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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +9 -3
  3. data/CHANGELOG.md +18 -0
  4. data/CLAUDE.md +35 -15
  5. data/Gemfile +7 -1
  6. data/Gemfile.lock +91 -3
  7. data/README.md +18 -0
  8. data/Rakefile +7 -2
  9. data/head_music.gemspec +1 -1
  10. data/lib/head_music/analysis/dyad.rb +229 -0
  11. data/lib/head_music/analysis/melodic_interval.rb +1 -1
  12. data/lib/head_music/analysis/pitch_class_set.rb +111 -14
  13. data/lib/head_music/analysis/{pitch_set.rb → pitch_collection.rb} +11 -5
  14. data/lib/head_music/analysis/sonority.rb +50 -12
  15. data/lib/head_music/content/staff.rb +1 -1
  16. data/lib/head_music/content/voice.rb +1 -1
  17. data/lib/head_music/instruments/alternate_tuning.rb +102 -0
  18. data/lib/head_music/instruments/alternate_tunings.yml +78 -0
  19. data/lib/head_music/instruments/instrument.rb +251 -82
  20. data/lib/head_music/instruments/instrument_configuration.rb +66 -0
  21. data/lib/head_music/instruments/instrument_configuration_option.rb +38 -0
  22. data/lib/head_music/instruments/instrument_configurations.yml +288 -0
  23. data/lib/head_music/instruments/instrument_families.yml +77 -0
  24. data/lib/head_music/instruments/instrument_family.rb +3 -4
  25. data/lib/head_music/instruments/instruments.yml +795 -965
  26. data/lib/head_music/instruments/playing_technique.rb +75 -0
  27. data/lib/head_music/instruments/playing_techniques.yml +826 -0
  28. data/lib/head_music/instruments/score_order.rb +2 -5
  29. data/lib/head_music/instruments/staff.rb +61 -1
  30. data/lib/head_music/instruments/staff_scheme.rb +6 -4
  31. data/lib/head_music/instruments/stringing.rb +115 -0
  32. data/lib/head_music/instruments/stringing_course.rb +58 -0
  33. data/lib/head_music/instruments/stringings.yml +168 -0
  34. data/lib/head_music/instruments/variant.rb +0 -1
  35. data/lib/head_music/locales/de.yml +23 -0
  36. data/lib/head_music/locales/en.yml +100 -0
  37. data/lib/head_music/locales/es.yml +23 -0
  38. data/lib/head_music/locales/fr.yml +23 -0
  39. data/lib/head_music/locales/it.yml +23 -0
  40. data/lib/head_music/locales/ru.yml +23 -0
  41. data/lib/head_music/{rudiment → notation}/musical_symbol.rb +3 -3
  42. data/lib/head_music/notation/staff_mapping.rb +70 -0
  43. data/lib/head_music/notation/staff_position.rb +62 -0
  44. data/lib/head_music/notation.rb +7 -0
  45. data/lib/head_music/rudiment/alteration.rb +17 -47
  46. data/lib/head_music/rudiment/alterations.yml +32 -0
  47. data/lib/head_music/rudiment/chromatic_interval.rb +1 -1
  48. data/lib/head_music/rudiment/clef.rb +1 -1
  49. data/lib/head_music/rudiment/consonance.rb +14 -13
  50. data/lib/head_music/rudiment/key_signature.rb +0 -26
  51. data/lib/head_music/rudiment/rhythmic_unit/parser.rb +2 -2
  52. data/lib/head_music/rudiment/rhythmic_value/parser.rb +1 -1
  53. data/lib/head_music/rudiment/rhythmic_value.rb +1 -1
  54. data/lib/head_music/rudiment/spelling.rb +3 -0
  55. data/lib/head_music/rudiment/tempo.rb +1 -1
  56. data/lib/head_music/rudiment/tuning/just_intonation.rb +0 -39
  57. data/lib/head_music/rudiment/tuning/meantone.rb +0 -39
  58. data/lib/head_music/rudiment/tuning/pythagorean.rb +0 -39
  59. data/lib/head_music/rudiment/tuning.rb +20 -0
  60. data/lib/head_music/style/guidelines/consonant_climax.rb +2 -2
  61. data/lib/head_music/style/modern_tradition.rb +8 -11
  62. data/lib/head_music/style/tradition.rb +1 -1
  63. data/lib/head_music/time/clock_position.rb +84 -0
  64. data/lib/head_music/time/conductor.rb +264 -0
  65. data/lib/head_music/time/meter_event.rb +37 -0
  66. data/lib/head_music/time/meter_map.rb +173 -0
  67. data/lib/head_music/time/musical_position.rb +188 -0
  68. data/lib/head_music/time/smpte_timecode.rb +164 -0
  69. data/lib/head_music/time/tempo_event.rb +40 -0
  70. data/lib/head_music/time/tempo_map.rb +187 -0
  71. data/lib/head_music/time.rb +32 -0
  72. data/lib/head_music/utilities/case.rb +27 -0
  73. data/lib/head_music/utilities/hash_key.rb +1 -1
  74. data/lib/head_music/version.rb +1 -1
  75. data/lib/head_music.rb +41 -13
  76. data/user_stories/active/string-pitches.md +41 -0
  77. data/user_stories/backlog/notation-style.md +183 -0
  78. data/user_stories/{todo → backlog}/organizing-content.md +9 -1
  79. data/user_stories/done/consonance-dissonance-classification.md +117 -0
  80. data/user_stories/{todo → done}/dyad-analysis.md +4 -6
  81. data/user_stories/done/expand-playing-techniques.md +38 -0
  82. data/user_stories/{active → done}/handle-time.rb +5 -19
  83. data/user_stories/done/instrument-architecture.md +238 -0
  84. data/user_stories/done/move-musical-symbol-to-notation.md +161 -0
  85. data/user_stories/done/move-staff-mapping-to-notation.md +158 -0
  86. data/user_stories/done/move-staff-position-to-notation.md +141 -0
  87. data/user_stories/done/notation-module-foundation.md +102 -0
  88. data/user_stories/done/percussion_set.md +260 -0
  89. data/user_stories/{todo → done}/pitch-class-set-analysis.md +0 -40
  90. data/user_stories/done/sonority-identification.md +37 -0
  91. data/user_stories/epics/notation-module.md +135 -0
  92. data/user_stories/{todo → visioning}/agentic-daw.md +0 -1
  93. metadata +55 -20
  94. data/check_instrument_consistency.rb +0 -0
  95. data/lib/head_music/instruments/instrument_type.rb +0 -188
  96. data/test_translations.rb +0 -15
  97. data/user_stories/todo/consonance-dissonance-classification.md +0 -57
  98. data/user_stories/todo/material-and-scores.md +0 -10
  99. data/user_stories/todo/percussion_set.md +0 -1
  100. data/user_stories/todo/pitch-set-classification.md +0 -72
  101. data/user_stories/todo/sonority-identification.md +0 -67
  102. /data/user_stories/{active → done}/handle-time.md +0 -0
@@ -0,0 +1,288 @@
1
+ # Instrument configurations define optional equipment or settings
2
+ # that modify an instrument's characteristics.
3
+ #
4
+ # Structure:
5
+ # instrument_key:
6
+ # configuration_name:
7
+ # options:
8
+ # option_name:
9
+ # default: true/false
10
+ # transposition_semitones: integer (optional)
11
+ # lowest_pitch_semitones: integer (optional)
12
+
13
+ piccolo_trumpet:
14
+ leadpipe:
15
+ options:
16
+ b_flat:
17
+ default: true
18
+ a:
19
+ transposition_semitones: -1
20
+
21
+ trumpet:
22
+ mute:
23
+ options:
24
+ open:
25
+ default: true
26
+ straight:
27
+ cup:
28
+ harmon:
29
+ bucket:
30
+ plunger:
31
+
32
+ trombone:
33
+ mute:
34
+ options:
35
+ open:
36
+ default: true
37
+ straight:
38
+ cup:
39
+ harmon:
40
+ bucket:
41
+ plunger:
42
+
43
+ bass_trombone:
44
+ f_attachment:
45
+ options:
46
+ disengaged:
47
+ default: true
48
+ engaged:
49
+ lowest_pitch_semitones: -6
50
+ mute:
51
+ options:
52
+ open:
53
+ default: true
54
+ straight:
55
+ bucket:
56
+
57
+ cornet:
58
+ mute:
59
+ options:
60
+ open:
61
+ default: true
62
+ straight:
63
+ cup:
64
+ harmon:
65
+ bucket:
66
+ plunger:
67
+
68
+ flugelhorn:
69
+ mute:
70
+ options:
71
+ open:
72
+ default: true
73
+ straight:
74
+ cup:
75
+ bucket:
76
+
77
+ french_horn:
78
+ mute:
79
+ options:
80
+ open:
81
+ default: true
82
+ straight:
83
+ stopping:
84
+
85
+ euphonium:
86
+ mute:
87
+ options:
88
+ open:
89
+ default: true
90
+ straight:
91
+
92
+ baritone_horn:
93
+ mute:
94
+ options:
95
+ open:
96
+ default: true
97
+ straight:
98
+
99
+ tuba:
100
+ mute:
101
+ options:
102
+ open:
103
+ default: true
104
+ straight:
105
+
106
+ sousaphone:
107
+ mute:
108
+ options:
109
+ open:
110
+ default: true
111
+ straight:
112
+
113
+ violin:
114
+ mute:
115
+ options:
116
+ open:
117
+ default: true
118
+ orchestral:
119
+
120
+ viola:
121
+ mute:
122
+ options:
123
+ open:
124
+ default: true
125
+ orchestral:
126
+
127
+ cello:
128
+ mute:
129
+ options:
130
+ open:
131
+ default: true
132
+ orchestral:
133
+
134
+ double_bass:
135
+ c_extension:
136
+ options:
137
+ without:
138
+ default: true
139
+ with:
140
+ lowest_pitch_semitones: -4
141
+ mute:
142
+ options:
143
+ open:
144
+ default: true
145
+ orchestral:
146
+
147
+ natural_horn:
148
+ crook:
149
+ options:
150
+ f:
151
+ default: true
152
+ e_flat:
153
+ transposition_semitones: -1
154
+ e:
155
+ transposition_semitones: -2
156
+ d:
157
+ transposition_semitones: -3
158
+ c:
159
+ transposition_semitones: -5
160
+ b_flat_basso:
161
+ transposition_semitones: -7
162
+
163
+ guitar:
164
+ capo:
165
+ options:
166
+ none:
167
+ default: true
168
+ fret_1:
169
+ transposition_semitones: 1
170
+ fret_2:
171
+ transposition_semitones: 2
172
+ fret_3:
173
+ transposition_semitones: 3
174
+ fret_4:
175
+ transposition_semitones: 4
176
+ fret_5:
177
+ transposition_semitones: 5
178
+ fret_6:
179
+ transposition_semitones: 6
180
+ fret_7:
181
+ transposition_semitones: 7
182
+ fret_8:
183
+ transposition_semitones: 8
184
+ fret_9:
185
+ transposition_semitones: 9
186
+
187
+ banjo:
188
+ capo:
189
+ options:
190
+ none:
191
+ default: true
192
+ fret_1:
193
+ transposition_semitones: 1
194
+ fret_2:
195
+ transposition_semitones: 2
196
+ fret_3:
197
+ transposition_semitones: 3
198
+ fret_4:
199
+ transposition_semitones: 4
200
+ fret_5:
201
+ transposition_semitones: 5
202
+ fret_6:
203
+ transposition_semitones: 6
204
+ fret_7:
205
+ transposition_semitones: 7
206
+ fret_8:
207
+ transposition_semitones: 8
208
+ fret_9:
209
+ transposition_semitones: 9
210
+
211
+ ukulele:
212
+ capo:
213
+ options:
214
+ none:
215
+ default: true
216
+ fret_1:
217
+ transposition_semitones: 1
218
+ fret_2:
219
+ transposition_semitones: 2
220
+ fret_3:
221
+ transposition_semitones: 3
222
+ fret_4:
223
+ transposition_semitones: 4
224
+ fret_5:
225
+ transposition_semitones: 5
226
+ fret_6:
227
+ transposition_semitones: 6
228
+ fret_7:
229
+ transposition_semitones: 7
230
+ fret_8:
231
+ transposition_semitones: 8
232
+ fret_9:
233
+ transposition_semitones: 9
234
+ fret_10:
235
+ transposition_semitones: 10
236
+ fret_11:
237
+ transposition_semitones: 11
238
+ fret_12:
239
+ transposition_semitones: 12
240
+
241
+ mandolin:
242
+ capo:
243
+ options:
244
+ none:
245
+ default: true
246
+ fret_1:
247
+ transposition_semitones: 1
248
+ fret_2:
249
+ transposition_semitones: 2
250
+ fret_3:
251
+ transposition_semitones: 3
252
+ fret_4:
253
+ transposition_semitones: 4
254
+ fret_5:
255
+ transposition_semitones: 5
256
+ fret_6:
257
+ transposition_semitones: 6
258
+ fret_7:
259
+ transposition_semitones: 7
260
+ fret_8:
261
+ transposition_semitones: 8
262
+ fret_9:
263
+ transposition_semitones: 9
264
+
265
+
266
+ lute:
267
+ tied_fret:
268
+ options:
269
+ none:
270
+ default: true
271
+ fret_1:
272
+ transposition_semitones: 1
273
+ fret_2:
274
+ transposition_semitones: 2
275
+ fret_3:
276
+ transposition_semitones: 3
277
+ fret_4:
278
+ transposition_semitones: 4
279
+ fret_5:
280
+ transposition_semitones: 5
281
+ fret_6:
282
+ transposition_semitones: 6
283
+ fret_7:
284
+ transposition_semitones: 7
285
+ fret_8:
286
+ transposition_semitones: 8
287
+ fret_9:
288
+ transposition_semitones: 9
@@ -7,6 +7,12 @@ accordion:
7
7
  - keyboard
8
8
  - wind
9
9
  orchestra_section_key: keyboard
10
+ arpeggione:
11
+ classification_keys:
12
+ - bowed
13
+ - chordophone
14
+ - string
15
+ orchestra_section_key: string
10
16
  bagpipe:
11
17
  classification_keys:
12
18
  - aerophone
@@ -14,6 +20,12 @@ bagpipe:
14
20
  - wind
15
21
  - woodwind
16
22
  orchestra_section_key: woodwind
23
+ banjo:
24
+ classification_keys:
25
+ - plucked
26
+ - chordophone
27
+ - string
28
+ orchestra_section_key: string
17
29
  bass_drum:
18
30
  classification_keys:
19
31
  - percussion
@@ -28,6 +40,11 @@ bassoon:
28
40
  - wind
29
41
  - woodwind
30
42
  orchestra_section_key: woodwind
43
+ castanets:
44
+ classification_keys:
45
+ - percussion
46
+ - idiophone
47
+ orchestra_section_key: percussion
31
48
  celesta:
32
49
  classification_keys:
33
50
  - idiophone
@@ -51,6 +68,11 @@ clavichord:
51
68
  - keyboard
52
69
  - string
53
70
  orchestra_section_key: keyboard
71
+ chimes:
72
+ classification_keys:
73
+ - percussion
74
+ - idiophone
75
+ orchestra_section_key: percussion
54
76
  cornet:
55
77
  classification_keys:
56
78
  - aerophone
@@ -58,6 +80,16 @@ cornet:
58
80
  - valve
59
81
  - wind
60
82
  orchestra_section_key: brass
83
+ cowbell:
84
+ classification_keys:
85
+ - percussion
86
+ - idiophone
87
+ orchestra_section_key: percussion
88
+ crotales:
89
+ classification_keys:
90
+ - percussion
91
+ - idiophone
92
+ orchestra_section_key: percussion
61
93
  cymbal:
62
94
  classification_keys:
63
95
  - percussion
@@ -75,6 +107,13 @@ double_bass:
75
107
  - unfretted
76
108
  - string
77
109
  orchestra_section_key: string
110
+ drum_kit:
111
+ classification_keys:
112
+ - percussion
113
+ - membranophone
114
+ - idiophone
115
+ - unpitched
116
+ orchestra_section_key: percussion
78
117
  flute:
79
118
  classification_keys:
80
119
  - aerophone
@@ -105,6 +144,13 @@ guitar:
105
144
  - fretted
106
145
  - string
107
146
  orchestra_section_key: string
147
+ hammered_dulcimer:
148
+ classification_keys:
149
+ - percussion
150
+ - chordophone
151
+ - string
152
+ - struck
153
+ orchestra_section_key: percussion
108
154
  harmonica:
109
155
  classification_keys:
110
156
  - reed
@@ -124,6 +170,12 @@ harpsichord:
124
170
  - keyboard
125
171
  - string
126
172
  orchestra_section_key: keyboard
173
+ hi_hat:
174
+ classification_keys:
175
+ - percussion
176
+ - idiophone
177
+ - unpitched
178
+ orchestra_section_key: percussion
127
179
  horn:
128
180
  classification_keys:
129
181
  - aerophone
@@ -151,6 +203,12 @@ mandolin:
151
203
  - fretted
152
204
  - string
153
205
  orchestra_section_key: string
206
+ maracas:
207
+ classification_keys:
208
+ - percussion
209
+ - shaken
210
+ - idiophone
211
+ orchestra_section_key: percussion
154
212
  marimba:
155
213
  classification_keys:
156
214
  - idiophone
@@ -243,9 +301,28 @@ tambourine:
243
301
  - idiophone
244
302
  - unpitched
245
303
  orchestra_section_key: percussion
304
+ tenor_drum:
305
+ classification_keys:
306
+ - percussion
307
+ - struck
308
+ - membranophone
309
+ orchestra_section_key: percussion
246
310
  theremin:
247
311
  classification_keys:
248
312
  - electronic
313
+ tom_tom:
314
+ classification_keys:
315
+ - percussion
316
+ - membranophone
317
+ - struck
318
+ - unpitched
319
+ orchestra_section_key: percussion
320
+ triangle:
321
+ classification_keys:
322
+ - percussion
323
+ - struck
324
+ - idiophone
325
+ orchestra_section_key: percussion
249
326
  trombone:
250
327
  classification_keys:
251
328
  - aerophone
@@ -1,4 +1,3 @@
1
- # Namespace for instrument definitions, categorization, and configuration
2
1
  module HeadMusic::Instruments; end
3
2
 
4
3
  # An *InstrumentFamily* is a species of instrument
@@ -15,7 +14,7 @@ module HeadMusic::Instruments; end
15
14
  #
16
15
  # Instrument families are defined in `lib/head_music/instruments/instrument_families.yml`.
17
16
  #
18
- # @see HeadMusic::Instruments::InstrumentType
17
+ # @see HeadMusic::Instruments::Instrument
19
18
  class HeadMusic::Instruments::InstrumentFamily
20
19
  include HeadMusic::Named
21
20
 
@@ -31,8 +30,8 @@ class HeadMusic::Instruments::InstrumentFamily
31
30
  end
32
31
 
33
32
  def self.all
34
- @all ||=
35
- INSTRUMENT_FAMILIES.map { |key, _data| get(key) }.sort_by(&:name)
33
+ INSTRUMENT_FAMILIES.map { |key, _data| get(key) }
34
+ @all ||= @instances.values.compact.sort_by(&:name)
36
35
  end
37
36
 
38
37
  private_class_method :new