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
@@ -72,14 +72,11 @@ class HeadMusic::Instruments::ScoreOrder
72
72
  # Return if already an Instrument instance
73
73
  return input if input.is_a?(HeadMusic::Instruments::Instrument)
74
74
 
75
- # Return InstrumentType instances as-is for backward compatibility (duck typing)
76
- return input.default_instrument if input.is_a?(HeadMusic::Instruments::InstrumentType)
77
-
78
75
  # Return other objects that respond to required methods (mock objects, etc.)
79
76
  return input if input.respond_to?(:name_key) && input.respond_to?(:family_key)
80
77
 
81
78
  # Create an Instrument instance for string inputs
82
- HeadMusic::Instruments::Instrument.get(input) || HeadMusic::Instruments::InstrumentType.get(input)
79
+ HeadMusic::Instruments::Instrument.get(input)
83
80
  end
84
81
 
85
82
  # Builds an index mapping instrument names to their position in the order
@@ -120,7 +117,7 @@ class HeadMusic::Instruments::ScoreOrder
120
117
  end
121
118
 
122
119
  # Try normalized name (lowercase, underscored)
123
- normalized = instrument.name.downcase.tr(" ", "_").tr("-", "_")
120
+ normalized = HeadMusic::Utilities::Case.to_snake_case(instrument.name)
124
121
  return ordering_index[normalized] if ordering_index.key?(normalized)
125
122
 
126
123
  nil
@@ -1,4 +1,3 @@
1
- # Namespace for instrument definitions, categorization, and configuration
2
1
  module HeadMusic::Instruments; end
3
2
 
4
3
  class HeadMusic::Instruments::Staff
@@ -30,4 +29,65 @@ class HeadMusic::Instruments::Staff
30
29
  def name
31
30
  name_key.to_s.tr("_", " ")
32
31
  end
32
+
33
+ # Get all staff mappings for composite instruments
34
+ #
35
+ # @return [Array<Notation::StaffMapping>] array of staff mappings
36
+ # @example
37
+ # drum_kit_staff.mappings #=> [#<Notation::StaffMapping...>, #<Notation::StaffMapping...>]
38
+ def mappings
39
+ @mappings ||= parse_mappings
40
+ end
41
+
42
+ # Find the staff mapping at a specific position
43
+ #
44
+ # @param position_index [Integer] the staff position index
45
+ # @return [Notation::StaffMapping, nil] the mapping at that position or nil
46
+ # @example
47
+ # staff.mapping_for_position(4) #=> #<Notation::StaffMapping instrument: snare_drum...>
48
+ def mapping_for_position(position_index)
49
+ mappings.find { |mapping| mapping.position_index == position_index }
50
+ end
51
+
52
+ # Get the instrument at a specific staff position
53
+ #
54
+ # @param position_index [Integer] the staff position index
55
+ # @return [Instrument, nil] the instrument at that position or nil
56
+ # @example
57
+ # staff.instrument_for_position(4) #=> #<Instrument name: "snare drum">
58
+ def instrument_for_position(position_index)
59
+ mapping = mapping_for_position(position_index)
60
+ mapping&.instrument
61
+ end
62
+
63
+ # Get all staff positions for a given instrument
64
+ #
65
+ # This is useful for instruments that appear at multiple positions
66
+ # (e.g., hi-hat with stick and pedal techniques)
67
+ #
68
+ # @param instrument_key [String, Symbol] the instrument key
69
+ # @return [Array<Integer>] array of position indices
70
+ # @example
71
+ # staff.positions_for_instrument("hi_hat") #=> [-1, 9]
72
+ def positions_for_instrument(instrument_key)
73
+ mappings.select { |mapping| mapping.instrument_key.to_s == instrument_key.to_s }
74
+ .map(&:position_index)
75
+ end
76
+
77
+ # Get all unique instruments used in this staff's mappings
78
+ #
79
+ # @return [Array<Instrument>] array of unique instruments
80
+ # @example
81
+ # drum_kit_staff.components #=> [#<Instrument: bass_drum>, #<Instrument: snare_drum>, ...]
82
+ def components
83
+ mappings.map(&:instrument).compact.uniq
84
+ end
85
+
86
+ private
87
+
88
+ def parse_mappings
89
+ mappings_data = attributes["mappings"] || []
90
+
91
+ mappings_data.map { |mapping_attrs| HeadMusic::Notation::StaffMapping.new(mapping_attrs) }
92
+ end
33
93
  end
@@ -1,13 +1,15 @@
1
1
  require_relative "staff"
2
2
 
3
- # Namespace for instrument definitions, categorization, and configuration
4
3
  module HeadMusic::Instruments; end
5
4
 
6
5
  class HeadMusic::Instruments::StaffScheme
7
- attr_reader :variant, :key, :list
6
+ attr_reader :instrument, :key, :list
8
7
 
9
- def initialize(variant:, key:, list:)
10
- @variant = variant
8
+ # For backward compatibility, also alias as variant
9
+ alias_method :variant, :instrument
10
+
11
+ def initialize(key:, list:, instrument: nil, variant: nil)
12
+ @instrument = instrument || variant
11
13
  @key = key || "default"
12
14
  @list = list
13
15
  end
@@ -0,0 +1,115 @@
1
+ module HeadMusic::Instruments; end
2
+
3
+ # The string configuration for a stringed instrument.
4
+ #
5
+ # A Stringing defines the courses (strings) of an instrument and their
6
+ # standard tuning pitches. Each course can have one or more strings.
7
+ #
8
+ # Examples:
9
+ # guitar = HeadMusic::Instruments::Instrument.get("guitar")
10
+ # stringing = HeadMusic::Instruments::Stringing.for_instrument(guitar)
11
+ # stringing.courses.map(&:standard_pitch) # => [E2, A2, D3, G3, B3, E4]
12
+ class HeadMusic::Instruments::Stringing
13
+ STRINGINGS = YAML.load_file(File.expand_path("stringings.yml", __dir__)).freeze
14
+
15
+ attr_reader :instrument_key, :courses
16
+
17
+ class << self
18
+ # Find the stringing for an instrument
19
+ # @param instrument [HeadMusic::Instruments::Instrument, String, Symbol] The instrument
20
+ # @return [Stringing, nil]
21
+ def for_instrument(instrument)
22
+ instrument_key = normalize_instrument_key(instrument)
23
+ return nil unless instrument_key
24
+
25
+ data = find_stringing_data(instrument_key, instrument)
26
+ return nil unless data
27
+
28
+ new(instrument_key: instrument_key, courses_data: data["courses"])
29
+ end
30
+
31
+ private
32
+
33
+ def normalize_instrument_key(instrument)
34
+ case instrument
35
+ when HeadMusic::Instruments::Instrument
36
+ instrument.name_key.to_s
37
+ else
38
+ instrument.to_s
39
+ end
40
+ end
41
+
42
+ def find_stringing_data(instrument_key, instrument)
43
+ # Direct match
44
+ return STRINGINGS[instrument_key] if STRINGINGS.key?(instrument_key)
45
+
46
+ # Try parent instrument if this is an Instrument object
47
+ if instrument.is_a?(HeadMusic::Instruments::Instrument) && instrument.parent
48
+ parent_key = instrument.parent.name_key.to_s
49
+ return STRINGINGS[parent_key] if STRINGINGS.key?(parent_key)
50
+ end
51
+
52
+ nil
53
+ end
54
+ end
55
+
56
+ def initialize(instrument_key:, courses_data:)
57
+ @instrument_key = instrument_key.to_sym
58
+ @courses = build_courses(courses_data)
59
+ end
60
+
61
+ # The instrument this stringing belongs to
62
+ # @return [HeadMusic::Instruments::Instrument]
63
+ def instrument
64
+ HeadMusic::Instruments::Instrument.get(instrument_key)
65
+ end
66
+
67
+ # Number of courses
68
+ # @return [Integer]
69
+ def course_count
70
+ courses.length
71
+ end
72
+
73
+ # Total number of physical strings across all courses
74
+ # @return [Integer]
75
+ def string_count
76
+ courses.sum(&:string_count)
77
+ end
78
+
79
+ # Standard pitches for each course (primary string only)
80
+ # @return [Array<HeadMusic::Rudiment::Pitch>]
81
+ def standard_pitches
82
+ courses.map(&:standard_pitch)
83
+ end
84
+
85
+ # Apply an alternate tuning to get adjusted pitches
86
+ # @param tuning [AlternateTuning] The alternate tuning to apply
87
+ # @return [Array<HeadMusic::Rudiment::Pitch>]
88
+ def pitches_with_tuning(tuning)
89
+ courses.each_with_index.map do |course, index|
90
+ semitone_adjustment = tuning.semitones[index] || 0
91
+ HeadMusic::Rudiment::Pitch.from_number(course.standard_pitch.to_i + semitone_adjustment)
92
+ end
93
+ end
94
+
95
+ def ==(other)
96
+ return false unless other.is_a?(self.class)
97
+
98
+ instrument_key == other.instrument_key && courses == other.courses
99
+ end
100
+
101
+ def to_s
102
+ "#{course_count}-course stringing for #{instrument_key}"
103
+ end
104
+
105
+ private
106
+
107
+ def build_courses(courses_data)
108
+ courses_data.map do |course_data|
109
+ HeadMusic::Instruments::StringingCourse.new(
110
+ standard_pitch: course_data["pitch"],
111
+ course_semitones: course_data["course_semitones"] || []
112
+ )
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,58 @@
1
+ module HeadMusic::Instruments; end
2
+
3
+ # A single course (string or set of strings) on a stringed instrument.
4
+ #
5
+ # A "course" is a set of strings that are played together. On most guitars,
6
+ # each course has a single string. On a 12-string guitar or mandolin,
7
+ # courses have multiple strings tuned in unison or octaves.
8
+ #
9
+ # Examples:
10
+ # - 6-string guitar: 6 courses, each with 1 string
11
+ # - 12-string guitar: 6 courses, each with 2 strings (octave or unison)
12
+ # - Mandolin: 4 courses, each with 2 strings in unison
13
+ class HeadMusic::Instruments::StringingCourse
14
+ attr_reader :standard_pitch, :course_semitones
15
+
16
+ # @param standard_pitch [HeadMusic::Rudiment::Pitch, String] The pitch of the primary string
17
+ # @param course_semitones [Array<Integer>] Semitone offsets for additional strings in the course
18
+ def initialize(standard_pitch:, course_semitones: [])
19
+ @standard_pitch = HeadMusic::Rudiment::Pitch.get(standard_pitch)
20
+ @course_semitones = Array(course_semitones)
21
+ end
22
+
23
+ # Returns all pitches in this course (primary + additional strings)
24
+ # @return [Array<HeadMusic::Rudiment::Pitch>]
25
+ def pitches
26
+ [standard_pitch] + additional_pitches
27
+ end
28
+
29
+ # Returns the number of physical strings in this course
30
+ # @return [Integer]
31
+ def string_count
32
+ 1 + course_semitones.length
33
+ end
34
+
35
+ # Whether this course has multiple strings
36
+ # @return [Boolean]
37
+ def doubled?
38
+ course_semitones.any?
39
+ end
40
+
41
+ def ==(other)
42
+ return false unless other.is_a?(self.class)
43
+
44
+ standard_pitch == other.standard_pitch && course_semitones == other.course_semitones
45
+ end
46
+
47
+ def to_s
48
+ standard_pitch.to_s
49
+ end
50
+
51
+ private
52
+
53
+ def additional_pitches
54
+ course_semitones.map do |semitones|
55
+ HeadMusic::Rudiment::Pitch.from_number(standard_pitch.to_i + semitones)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,168 @@
1
+ # Stringing configurations for stringed instruments.
2
+ #
3
+ # Each instrument has courses (strings played together).
4
+ # course_semitones defines additional strings in a course relative to the pitch.
5
+ #
6
+ # Examples:
7
+ # - [] = single string
8
+ # - [12] = doubled an octave higher
9
+ # - [0] = doubled in unison
10
+
11
+ guitar:
12
+ courses:
13
+ - pitch: E2
14
+ - pitch: A2
15
+ - pitch: D3
16
+ - pitch: G3
17
+ - pitch: B3
18
+ - pitch: E4
19
+
20
+ twelve_string_guitar:
21
+ courses:
22
+ - pitch: E2
23
+ course_semitones: [12]
24
+ - pitch: A2
25
+ course_semitones: [12]
26
+ - pitch: D3
27
+ course_semitones: [12]
28
+ - pitch: G3
29
+ course_semitones: [12]
30
+ - pitch: B3
31
+ course_semitones: [0]
32
+ - pitch: E4
33
+ course_semitones: [0]
34
+
35
+ bass_guitar:
36
+ courses:
37
+ - pitch: E1
38
+ - pitch: A1
39
+ - pitch: D2
40
+ - pitch: G2
41
+
42
+ five_string_bass:
43
+ courses:
44
+ - pitch: B0
45
+ - pitch: E1
46
+ - pitch: A1
47
+ - pitch: D2
48
+ - pitch: G2
49
+
50
+ six_string_bass:
51
+ courses:
52
+ - pitch: B0
53
+ - pitch: E1
54
+ - pitch: A1
55
+ - pitch: D2
56
+ - pitch: G2
57
+ - pitch: C3
58
+
59
+ ukulele:
60
+ courses:
61
+ - pitch: G4
62
+ - pitch: C4
63
+ - pitch: E4
64
+ - pitch: A4
65
+
66
+ baritone_ukulele:
67
+ courses:
68
+ - pitch: D3
69
+ - pitch: G3
70
+ - pitch: B3
71
+ - pitch: E4
72
+
73
+ mandolin:
74
+ courses:
75
+ - pitch: G3
76
+ course_semitones: [0]
77
+ - pitch: D4
78
+ course_semitones: [0]
79
+ - pitch: A4
80
+ course_semitones: [0]
81
+ - pitch: E5
82
+ course_semitones: [0]
83
+
84
+ banjo:
85
+ courses:
86
+ - pitch: G4
87
+ - pitch: D3
88
+ - pitch: G3
89
+ - pitch: B3
90
+ - pitch: D4
91
+
92
+ violin:
93
+ courses:
94
+ - pitch: G3
95
+ - pitch: D4
96
+ - pitch: A4
97
+ - pitch: E5
98
+
99
+ viola:
100
+ courses:
101
+ - pitch: C3
102
+ - pitch: G3
103
+ - pitch: D4
104
+ - pitch: A4
105
+
106
+ cello:
107
+ courses:
108
+ - pitch: C2
109
+ - pitch: G2
110
+ - pitch: D3
111
+ - pitch: A3
112
+
113
+ double_bass:
114
+ courses:
115
+ - pitch: E1
116
+ - pitch: A1
117
+ - pitch: D2
118
+ - pitch: G2
119
+
120
+ harp:
121
+ courses:
122
+ - pitch: C1
123
+ - pitch: D1
124
+ - pitch: E1
125
+ - pitch: F1
126
+ - pitch: G1
127
+ - pitch: A1
128
+ - pitch: B1
129
+ - pitch: C2
130
+ - pitch: D2
131
+ - pitch: E2
132
+ - pitch: F2
133
+ - pitch: G2
134
+ - pitch: A2
135
+ - pitch: B2
136
+ - pitch: C3
137
+ - pitch: D3
138
+ - pitch: E3
139
+ - pitch: F3
140
+ - pitch: G3
141
+ - pitch: A3
142
+ - pitch: B3
143
+ - pitch: C4
144
+ - pitch: D4
145
+ - pitch: E4
146
+ - pitch: F4
147
+ - pitch: G4
148
+ - pitch: A4
149
+ - pitch: B4
150
+ - pitch: C5
151
+ - pitch: D5
152
+ - pitch: E5
153
+ - pitch: F5
154
+ - pitch: G5
155
+ - pitch: A5
156
+ - pitch: B5
157
+ - pitch: C6
158
+ - pitch: D6
159
+ - pitch: E6
160
+ - pitch: F6
161
+ - pitch: G6
162
+ - pitch: A6
163
+ - pitch: B6
164
+ - pitch: C7
165
+ - pitch: D7
166
+ - pitch: E7
167
+ - pitch: F7
168
+ - pitch: G7
@@ -1,4 +1,3 @@
1
- # Namespace for instrument definitions, categorization, and configuration
2
1
  module HeadMusic::Instruments; end
3
2
 
4
3
  class HeadMusic::Instruments::Variant
@@ -159,6 +159,8 @@ de:
159
159
  descant: Diskant
160
160
  didgeridoo: Didgeridoo
161
161
  double_bass: Kontrabass
162
+ drum_kit: Schlagzeug
163
+ floor_tom: Floor-Tom
162
164
  double_contrabass_recorder: Doppelkontrabassblockflöte
163
165
  english_horn: Englischhorn
164
166
  euphonium: Euphonium
@@ -179,6 +181,7 @@ de:
179
181
  harpsichord: Cembalo
180
182
  hautbois_d_amour: Liebeshoboe
181
183
  hi-hat: Hi-Hat
184
+ high_tom: High-Tom
182
185
  horn: Horn
183
186
  kettledrum: Pauke
184
187
  kick_drum: Große Trommel
@@ -190,6 +193,7 @@ de:
190
193
  mezzo: Mezzo
191
194
  mezzo_soprano: Mezzosopran
192
195
  mezzo_soprano_voice: Mezzosopran
196
+ mid_tom: Mid-Tom
193
197
  military_drum: Militärtrommel
194
198
  mouth_organ: Mundharmonika
195
199
  natural_horn: Waldhorn
@@ -278,6 +282,25 @@ de:
278
282
  woodblock: Holzblock
279
283
  xylophone: Xylophon
280
284
  zither: Zither
285
+ instrument_families:
286
+ drum_kit: Schlagzeug
287
+ hi_hat: Hi-Hat
288
+ tom_tom: Tom-Tom
289
+ playing_techniques:
290
+ bell: Glocke
291
+ bow: Bogen
292
+ brush: Bürste
293
+ choked: Erstickt
294
+ closed: Geschlossen
295
+ cross_stick: Querstöckchen
296
+ damped: Gedämpft
297
+ hand: Hand
298
+ let_ring: Ausklingen lassen
299
+ mallet: Schläger
300
+ open: Offen
301
+ pedal: Pedal
302
+ rim_shot: Rimshot
303
+ stick: Stick
281
304
  locales:
282
305
  de: Deutsch
283
306
  en: Englisch
@@ -276,6 +276,7 @@ en:
276
276
  cymbal: cymbal
277
277
  descant: descant
278
278
  didgeridoo: didgeridoo
279
+ drum_kit: drum kit
279
280
  double_bass: double bass
280
281
  double_contrabass_recorder: double-contrabass recorder
281
282
  electronic_keyboard: electronic keyboard
@@ -283,6 +284,7 @@ en:
283
284
  euphonium: euphonium
284
285
  fiddle: fiddle
285
286
  field_drum: field drum
287
+ floor_tom: floor tom
286
288
  flugelhorn: flugelhorn
287
289
  flute: flute
288
290
  fortepiano: fortepiano
@@ -299,6 +301,7 @@ en:
299
301
  harpsichord: harpsichord
300
302
  hautbois_d_amour: hautbois d'amour
301
303
  hi-hat: hi-hat
304
+ high_tom: high tom
302
305
  horn: horn
303
306
  kettledrum: kettledrum
304
307
  kick_drum: kick drum
@@ -310,6 +313,7 @@ en:
310
313
  mezzo: mezzo
311
314
  mezzo_soprano: mezzo-soprano
312
315
  mezzo_soprano_voice: mezzo-soprano
316
+ mid_tom: mid tom
313
317
  military_drum: military drum
314
318
  mouth_organ: mouth_organ
315
319
  natural_horn: natural horn
@@ -397,6 +401,102 @@ en:
397
401
  woodblock: woodblock
398
402
  xylophone: xylophone
399
403
  zither: zither
404
+ instrument_families:
405
+ drum_kit: drum kit
406
+ hi_hat: hi-hat
407
+ tom_tom: tom-tom
408
+ playing_techniques:
409
+ aeolian: aeolian
410
+ air: air
411
+ alla_chitarra: alla chitarra
412
+ arco: arco
413
+ artificial_harmonic: artificial harmonic
414
+ au_talon: au talon
415
+ barre: barré
416
+ bell: bell
417
+ bisbigliando: bisbigliando
418
+ bow: bow
419
+ brush: brush
420
+ bucket_mute: bucket mute
421
+ center: center
422
+ choked: choked
423
+ closed: closed
424
+ col_legno: col legno
425
+ col_legno_battuto: col legno battuto
426
+ col_legno_tratto: col legno tratto
427
+ con_bocca_chiusa: con bocca chiusa
428
+ con_sordino: con sordino
429
+ cross_stick: cross stick
430
+ cuivre: cuivré
431
+ cup_mute: cup mute
432
+ damped: damped
433
+ dead_stroke: dead stroke
434
+ detache: détaché
435
+ edge: edge
436
+ flautando: flautando
437
+ flutter_tongue: flutter tongue
438
+ frullato: frullato
439
+ half_barre: half barré
440
+ hand: hand
441
+ harmonic: harmonic
442
+ jete: jeté
443
+ harmon_mute: harmon mute
444
+ harmon_mute_stem_in: harmon mute stem in
445
+ harmon_mute_stem_out: harmon mute stem out
446
+ key_clicks: key clicks
447
+ laissez_vibrer: laissez vibrer
448
+ left_hand: left hand
449
+ legato: legato
450
+ let_ring: let ring
451
+ mallet: mallet
452
+ marcato: marcato
453
+ martele: martelé
454
+ martellato: martellato
455
+ modo_ordinario: modo ordinario
456
+ motor_off: motor off
457
+ motor_on: motor on
458
+ muffled: muffled
459
+ multiphonic: multiphonic
460
+ natural_harmonic: natural harmonic
461
+ naturale: naturale
462
+ non_laissez_vibrer: non laissez vibrer
463
+ non_vibrato: non vibrato
464
+ open: open
465
+ open_percussion: open
466
+ ordinario: ordinario
467
+ half_pedal: half pedal
468
+ mano_destra: mano destra
469
+ mano_sinistra: mano sinistra
470
+ palm_mute: palm mute
471
+ pedal: pedal
472
+ pizzicato: pizzicato
473
+ plunger_mute: plunger mute
474
+ poco_vibrato: poco vibrato
475
+ punta_d_arco: punta d'arco
476
+ quarter_pedal: quarter pedal
477
+ pres_de_la_table: près de la table
478
+ right_hand: right hand
479
+ rim_shot: rim shot
480
+ saltando: saltando
481
+ senza_sordino: senza sordino
482
+ senza_vibrato: senza vibrato
483
+ slap_tongue: slap tongue
484
+ snares_off: snares off
485
+ snares_on: snares on
486
+ sopra: sopra
487
+ sostenuto_pedal: sostenuto pedal
488
+ sotto: sotto
489
+ spiccato: spiccato
490
+ stick: stick
491
+ stopped: stopped
492
+ straight_mute: straight mute
493
+ sul_ponticello: sul ponticello
494
+ sul_tasto: sul tasto
495
+ three_quarter_pedal: three quarter pedal
496
+ tre_corde: tre corde
497
+ una_corda: una corda
498
+ vibrato: vibrato
499
+ whistle_tone: whistle tone
400
500
  locales:
401
501
  de: German
402
502
  en: English
@@ -155,6 +155,8 @@ es:
155
155
  descant: flauta dulce soprano
156
156
  didgeridoo: didgeridoo
157
157
  double_bass: contrabajo
158
+ drum_kit: batería
159
+ floor_tom: tom de piso
158
160
  double_contrabass_recorder: flauta dulce subcontrabajo
159
161
  english_horn: corno inglés
160
162
  euphonium: euphonium
@@ -176,6 +178,7 @@ es:
176
178
  harpsichord: clavecín
177
179
  hautbois_d_amour: oboe de amor
178
180
  hi-hat: charles
181
+ high_tom: tom agudo
179
182
  horn: corno
180
183
  kettledrum: timbal
181
184
  kick_drum: bombo
@@ -187,6 +190,7 @@ es:
187
190
  mezzo: mezzosoprano
188
191
  mezzo_soprano: mezzosoprano
189
192
  mezzo_soprano_voice: voz de mezzosoprano
193
+ mid_tom: tom grave
190
194
  military_drum: tambor militar
191
195
  mouth_organ: armónica
192
196
  natural_horn: trompa natural
@@ -275,6 +279,25 @@ es:
275
279
  woodblock: bloque de madera
276
280
  xylophone: xilofón
277
281
  zither: cítara
282
+ instrument_families:
283
+ drum_kit: batería
284
+ hi_hat: charles
285
+ tom_tom: tom-tom
286
+ playing_techniques:
287
+ bell: campana
288
+ bow: arco
289
+ brush: cepillo
290
+ choked: apagado
291
+ closed: cerrado
292
+ cross_stick: baqueta inversa
293
+ damped: amortiguado
294
+ hand: mano
295
+ let_ring: dejar sonar
296
+ mallet: baqueta
297
+ open: abierto
298
+ pedal: pedal
299
+ rim_shot: golpe de borde
300
+ stick: baqueta
278
301
  locales:
279
302
  de: alemán
280
303
  en: inglés