@sudobility/music_types 0.13.6 → 0.13.8

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.
package/CLAUDE.md CHANGED
@@ -39,6 +39,8 @@ Everything exports from a single sectioned `src/index.ts`:
39
39
 
40
40
  ## Gotchas
41
41
 
42
+ - **One row per General MIDI program, and every row says where its numbers came from** (`gm-catalogue.ts`). Range, polyphony and transposition used to be three tables of family defaults plus a handful of per-program overrides — which looked like deduplication and was not: 90 of the 128 programs inherited a compass nobody had chosen for them, and an inherited value was indistinguishable from a researched one. It hid a real bug (**Muted Trumpet** had no transposition entry, so a B-flat trumpet with a mute in the bell was treated as non-transposing and its part displayed a whole tone wrong), gave the **Clavinet** an 88-key piano compass where it has 60 keys F1-E6, and handed the flute's exact range to five instruments that share none of it. The repetition where eight guitars genuinely share a compass is the point: writing it eight times is a decision somebody made, where inheriting it eight times is a question nobody was asked. **`basis` is the field to read before trusting a number** — `measured` (checked against a source), `synthetic` (an electronic patch has no acoustic compass, so it gets the whole keyboard rather than an invented limit), `unpitched` (a sound effect), and `assumed` (**not verified**, carried over from the old default, left deliberately wide). No row is left `assumed`: the 31 that were have each been settled, most by looking the instrument up and ten by finding that the honest answer is `tunable` — a shamisen is tuned to the singer, a koto to the piece, an mbira to notes that are not on the tempered scale at all, and a pan flute or hammered dulcimer is built in many sizes; refusing a note against those would be refusing against the sampler rather than the instrument. Section patches (`String Ensemble`, `Brass Section`) take the **union of the instruments in them, computed rather than typed**, so a string section cannot end up narrower than the cello inside it. Where General MIDI names a family rather than an instrument the row covers the common members: "Recorder" is soprano and alto together, "Bagpipe" is the Highland chanter's nine notes and the uilleann's two octaves together — the Highland compass alone is fifteen semitones and rejected honest music. The split is now 75 measured, 30 synthetic, 13 unpitched, 10 tunable. `gmRangeIsBinding` answers `true` only for `measured`, and the generation inspector consults it before reporting an out-of-range note: refusing a note against a compass nobody checked rejects music that was fine, and since that finding drives a retry it would spend real money arguing about a limit we invented.
43
+
42
44
  - **A regeneration request says who is playing, and a kit gets told how a kit is written.** A `ScoreFragment` is measures and nothing else — no name, no clef, no program — so "Replace Track" used to hand the model anonymous bars and let it infer the instrument from the notes in front of it. On a drum track there is nothing to infer from: the pitches are drum numbers, not notes. Measured on a real Power Kit regeneration, the result was the kick on every eighth of all 118 bars at a constant velocity 100, the snare on all four beats instead of the backbeat, and five of the 47 drums used — a metronome, not a groove. `RegenerateRegionRequest.tracks` now carries a `GenerateScoreRequestTrack` per fragment track, built by `describeTrackForGeneration` in music_types so whole-score generation and regeneration describe a track the *same* way; the range and polyphony come from `trackKeyboardRange`/`trackMaxPolyphony`, which answer about the **kit** on a percussion track rather than about whatever melodic program shares its number. The roster is matched to the fragment **by position**, so `buildRegeneratePrompt` emits it only when the lengths agree — a roster of a different length is not partial information but wrong information, naming the kit as the cello. And `percussionRules()` — previously generate-only, and previously just the GM map — now travels on both paths and states the two Expression rules that **invert** for percussion: an accent is the rule rather than the exception (velocity variation between accented and ghost notes *is* the groove), and a kit does play continuously even though each individual drum still rests. The map alone is not enough, which is the thing that had to be measured to be believed.
43
45
 
44
46
  - **One fact, one declaration — and `src/__single-source.test.ts` enforces it.** A constant restated in a second package agrees with the first right up until one of them is edited, and nothing fails when they part: the build is clean, the types match, and the only symptom is a wrong sound or a picker quietly missing an entry. Measured across the family, 23 UPPER_CASE constants were declared in more than one repo — `CC_VOLUME` three times, `DYNAMICS` four, `C_MAJOR` five, and `DEFAULT_TIME_SIGNATURE` in four places under two names. The guard reads the list of names **from music_types at runtime** rather than restating it, because a check against duplication that duplicates what it checks would drift like everything else; its `ALLOWED` list is empty on purpose, so an exemption is a decision somebody writes down. Two shapes matter beyond the constants themselves. **A closed vocabulary is declared as an array and the type read off it** (`export const DYNAMICS = [...] as const; export type Dynamic = (typeof DYNAMICS)[number];`) — a TypeScript union has no runtime form, so anything that must *validate* a value has to write the list out again, which is exactly how music_api's decoder came to check generated music against its own private copy. **A label or option list keyed by the vocabulary is a `Record<T, ...>`, never a parallel array** — a record fails to compile when a member is added, an array silently goes on offering the old set; that is why the inspector's picker lists are `ACCIDENTAL_OPTIONS`/`ARTICULATION_OPTIONS` built from the vocabulary rather than `ACCIDENTALS`/`ARTICULATIONS` retyped. Test fixtures follow the same rule: the score fixtures live once, in `@sudobility/music_types/test`, and a package that needs a rendering fixture of its own re-exports them and adds to them.
@@ -0,0 +1,41 @@
1
+ import type { GmFamily } from "./gm.js";
2
+ import { FULL_KEYBOARD, type MidiRange } from "./gm-range.js";
3
+ import { UNLIMITED_POLYPHONY } from "./gm-polyphony.js";
4
+ /** How much to trust a row's numbers. See the module doc. */
5
+ export declare const INSTRUMENT_BASES: readonly ["measured", "tunable", "synthetic", "unpitched", "assumed"];
6
+ export type InstrumentBasis = (typeof INSTRUMENT_BASES)[number];
7
+ export type GmInstrumentSpec = {
8
+ program: number;
9
+ name: string;
10
+ family: GmFamily;
11
+ /** Sounding compass, inclusive. */
12
+ range: MidiRange;
13
+ /** Notes that can sound at once; `UNLIMITED_POLYPHONY` for anything chordal. */
14
+ maxPolyphony: number;
15
+ /** Semitones to ADD to a sounding pitch to get the written one. */
16
+ writtenTransposition: number;
17
+ basis: InstrumentBasis;
18
+ /** Why these numbers, in one line. */
19
+ note: string;
20
+ };
21
+ /** The catalogue, in program order. */
22
+ export declare const GM_CATALOGUE: readonly GmInstrumentSpec[];
23
+ /**
24
+ * The row for `program`, or `null` outside 0-127.
25
+ *
26
+ * Every other instrument accessor reads this, so there is one lookup to get
27
+ * wrong rather than four.
28
+ */
29
+ export declare function gmSpec(program: number): GmInstrumentSpec | null;
30
+ /**
31
+ * Whether a note outside this instrument's range is worth refusing.
32
+ *
33
+ * False for a synthetic patch, a sound effect, and — importantly — anything
34
+ * whose compass was never verified: refusing a note against a number nobody
35
+ * checked is worse than not checking, because it rejects music that was fine.
36
+ */
37
+ export declare function gmRangeIsBinding(program: number): boolean;
38
+ /** Guard: the families in program order, so a row cannot claim the wrong one. */
39
+ export declare function gmFamilyForProgram(program: number): GmFamily;
40
+ export { FULL_KEYBOARD, UNLIMITED_POLYPHONY };
41
+ //# sourceMappingURL=gm-catalogue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gm-catalogue.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-catalogue.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,uEAMnB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,mCAAmC;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,eAAe,CAAC;IACvB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AA6JF,uCAAuC;AACvC,eAAO,MAAM,YAAY,EAAE,SAAS,gBAAgB,EAWjD,CAAC;AAEJ;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAgBD,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAI5D;AAED,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Every General MIDI program, one row each, stating its own numbers.
3
+ *
4
+ * This replaced four tables that each held a family default plus a handful of
5
+ * per-program overrides. That shape looked like deduplication and was not: 90
6
+ * of the 128 programs inherited a range nobody had chosen for them, and an
7
+ * inherited value was indistinguishable from a researched one. It hid a real
8
+ * bug — Muted Trumpet had no transposition entry, so a B-flat trumpet with a
9
+ * mute in the bell was treated as non-transposing and its part displayed a
10
+ * whole tone wrong — and it quietly gave the Clavinet an 88-key piano compass,
11
+ * and gave the flute's exact range to five instruments that share none of it.
12
+ *
13
+ * One row per program costs some repetition where eight guitars really do
14
+ * share a compass. That repetition is the point: writing it eight times is a
15
+ * decision somebody made, where inheriting it eight times is a question nobody
16
+ * was asked.
17
+ *
18
+ * `basis` is what makes this honest, and it is the field to read before
19
+ * trusting a number:
20
+ *
21
+ * - `measured` — checked against a source for that instrument.
22
+ * - `tunable` — the instrument has no fixed absolute pitch. A shamisen is
23
+ * tuned to the singer, a koto to the piece, an mbira to
24
+ * notes that are not on the tempered scale at all, and a pan
25
+ * flute or hammered dulcimer is built in many sizes. The
26
+ * range is a typical span, and refusing a note against it
27
+ * would be refusing against the sampler rather than the
28
+ * instrument.
29
+ * - `synthetic` — an electronic patch with no acoustic compass. The range is
30
+ * the full keyboard because narrowing it would be a fiction.
31
+ * - `unpitched` — a sound effect. There is no pitch to be outside of.
32
+ * - `assumed` — NOT verified. Carried over from the old family default and
33
+ * left deliberately wide. Anything reading these numbers to
34
+ * refuse a note must not refuse on an `assumed` row.
35
+ */
36
+ import { GM_FAMILIES } from "./gm.js";
37
+ import { FULL_KEYBOARD } from "./gm-range.js";
38
+ import { UNLIMITED_POLYPHONY } from "./gm-polyphony.js";
39
+ /** How much to trust a row's numbers. See the module doc. */
40
+ export const INSTRUMENT_BASES = [
41
+ "measured",
42
+ "tunable",
43
+ "synthetic",
44
+ "unpitched",
45
+ "assumed",
46
+ ];
47
+ const ROWS = [
48
+ { program: 0, name: "Acoustic Grand Piano", family: "piano", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "A0-C8, the 88-key piano" },
49
+ { program: 1, name: "Bright Acoustic Piano", family: "piano", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "an acoustic piano" },
50
+ { program: 2, name: "Electric Grand Piano", family: "piano", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "an electric grand is a full-size piano action" },
51
+ { program: 3, name: "Honky-tonk Piano", family: "piano", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "a tack piano is a piano" },
52
+ { program: 4, name: "Electric Piano 1", family: "piano", min: 28, max: 100, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "Rhodes 73: 73 keys from E1, so E1-E7" },
53
+ { program: 5, name: "Electric Piano 2", family: "piano", min: 29, max: 88, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "Wurlitzer 200A: 64 keys, A1-C7 is often cited; the 60-key F1-E6 span is the conservative overlap" },
54
+ { program: 6, name: "Harpsichord", family: "piano", min: 29, max: 89, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "F1-F6, the standard two-manual compass" },
55
+ { program: 7, name: "Clavinet", family: "piano", min: 29, max: 88, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "Clavinet D6: 60 keys, F1-E6 (Wikipedia)" },
56
+ { program: 8, name: "Celesta", family: "chromatic-percussion", min: 60, max: 108, poly: UNLIMITED_POLYPHONY, transpose: -12, basis: "measured", note: "C4-C8 sounding; written an octave lower" },
57
+ { program: 9, name: "Glockenspiel", family: "chromatic-percussion", min: 79, max: 108, poly: UNLIMITED_POLYPHONY, transpose: -24, basis: "measured", note: "G5-C8 sounding; written two octaves lower" },
58
+ { program: 10, name: "Music Box", family: "chromatic-percussion", min: 48, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a movement is built for one tune and spans about two and a half octaves" },
59
+ { program: 11, name: "Vibraphone", family: "chromatic-percussion", min: 53, max: 89, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "F3-F6, three octaves" },
60
+ { program: 12, name: "Marimba", family: "chromatic-percussion", min: 36, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "C2-C7, the five-octave concert marimba" },
61
+ { program: 13, name: "Xylophone", family: "chromatic-percussion", min: 65, max: 108, poly: UNLIMITED_POLYPHONY, transpose: -12, basis: "measured", note: "F4-C8 sounding; written an octave lower" },
62
+ { program: 14, name: "Tubular Bells", family: "chromatic-percussion", min: 60, max: 79, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "orchestral chimes are written C4-F5, though professional models reach G5" },
63
+ { program: 15, name: "Dulcimer", family: "chromatic-percussion", min: 48, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "hammered dulcimers are built 15/14, 16/15 and larger, spanning about three octaves" },
64
+ { program: 16, name: "Drawbar Organ", family: "organ", min: 36, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "Hammond drawbar manual: 61 keys, C2-C7" },
65
+ { program: 17, name: "Percussive Organ", family: "organ", min: 36, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "same manual" },
66
+ { program: 18, name: "Rock Organ", family: "organ", min: 36, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "same manual" },
67
+ { program: 19, name: "Church Organ", family: "organ", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "C1-C7 manuals; the 32' pedal reaches lower but is a separate part" },
68
+ { program: 20, name: "Reed Organ", family: "organ", min: 36, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "a reed organ is commonly 39-49 keys, about four octaves" },
69
+ { program: 21, name: "Accordion", family: "organ", min: 41, max: 81, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "piano-accordion right hand, F2-A5 on a 41-key model" },
70
+ { program: 22, name: "Harmonica", family: "organ", min: 60, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "12-hole chromatic, C4-C7" },
71
+ { program: 23, name: "Tango Accordion", family: "organ", min: 41, max: 81, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "as the accordion above" },
72
+ { program: 24, name: "Acoustic Guitar (nylon)", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
73
+ { program: 25, name: "Acoustic Guitar (steel)", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
74
+ { program: 26, name: "Electric Guitar (jazz)", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
75
+ { program: 27, name: "Electric Guitar (clean)", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
76
+ { program: 28, name: "Electric Guitar (muted)", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
77
+ { program: 29, name: "Overdriven Guitar", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
78
+ { program: 30, name: "Distortion Guitar", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
79
+ { program: 31, name: "Guitar Harmonics", family: "guitar", min: 40, max: 88, poly: 6, transpose: 12, basis: "measured", note: "six strings, low E2 up to E6 at the top fret" },
80
+ { program: 32, name: "Acoustic Bass", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
81
+ { program: 33, name: "Electric Bass (finger)", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
82
+ { program: 34, name: "Electric Bass (pick)", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
83
+ { program: 35, name: "Fretless Bass", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
84
+ { program: 36, name: "Slap Bass 1", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
85
+ { program: 37, name: "Slap Bass 2", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
86
+ { program: 38, name: "Synth Bass 1", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
87
+ { program: 39, name: "Synth Bass 2", family: "bass", min: 28, max: 67, poly: 4, transpose: 12, basis: "measured", note: "four strings, low E1 up to G4 at the top fret" },
88
+ { program: 40, name: "Violin", family: "strings", min: 55, max: 100, poly: 2, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
89
+ { program: 41, name: "Viola", family: "strings", min: 48, max: 88, poly: 2, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
90
+ { program: 42, name: "Cello", family: "strings", min: 36, max: 84, poly: 2, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
91
+ { program: 43, name: "Contrabass", family: "strings", min: 28, max: 67, poly: 2, transpose: 12, basis: "measured", note: "checked against an orchestration range chart" },
92
+ { program: 44, name: "Tremolo Strings", family: "strings", min: 28, max: 100, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "a tremolo STRING SECTION: the union of its instruments, and it plays chords" },
93
+ { program: 45, name: "Pizzicato Strings", family: "strings", min: 28, max: 100, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "a pizzicato STRING SECTION: the union of its instruments, and it plays chords" },
94
+ { program: 46, name: "Orchestral Harp", family: "strings", min: 24, max: 103, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
95
+ { program: 47, name: "Timpani", family: "strings", min: 38, max: 57, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "D2-A3 across a set; a timpanist plays several drums and can sound them together" },
96
+ { program: 48, name: "String Ensemble 1", family: "ensemble", min: 28, max: 100, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "the string section: contrabass floor to violin ceiling" },
97
+ { program: 49, name: "String Ensemble 2", family: "ensemble", min: 28, max: 100, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "the string section: contrabass floor to violin ceiling" },
98
+ { program: 50, name: "Synth Strings 1", family: "ensemble", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "a synth pad in the shape of strings" },
99
+ { program: 51, name: "Synth Strings 2", family: "ensemble", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "a synth pad in the shape of strings" },
100
+ { program: 52, name: "Choir Aahs", family: "ensemble", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
101
+ { program: 53, name: "Voice Oohs", family: "ensemble", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
102
+ { program: 54, name: "Synth Voice", family: "ensemble", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "a synthesised voice, not a singer" },
103
+ { program: 55, name: "Orchestra Hit", family: "ensemble", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "a sampled orchestral stab, not an instrument with a compass" },
104
+ { program: 56, name: "Trumpet", family: "brass", min: 52, max: 86, poly: 1, transpose: 2, basis: "measured", note: "checked against an orchestration range chart" },
105
+ { program: 57, name: "Trombone", family: "brass", min: 40, max: 77, poly: 1, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
106
+ { program: 58, name: "Tuba", family: "brass", min: 26, max: 65, poly: 1, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
107
+ { program: 59, name: "Muted Trumpet", family: "brass", min: 52, max: 86, poly: 1, transpose: 2, basis: "measured", note: "a muted trumpet is a B-flat trumpet with a mute in the bell" },
108
+ { program: 60, name: "French Horn", family: "brass", min: 35, max: 77, poly: 1, transpose: 7, basis: "measured", note: "checked against an orchestration range chart" },
109
+ { program: 61, name: "Brass Section", family: "brass", min: 26, max: 86, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "the brass section: tuba floor to trumpet ceiling" },
110
+ { program: 62, name: "Synth Brass 1", family: "brass", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "a synth patch in the shape of brass" },
111
+ { program: 63, name: "Synth Brass 2", family: "brass", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "a synth patch in the shape of brass" },
112
+ { program: 64, name: "Soprano Sax", family: "reed", min: 56, max: 88, poly: 1, transpose: 2, basis: "measured", note: "checked against an orchestration range chart" },
113
+ { program: 65, name: "Alto Sax", family: "reed", min: 49, max: 81, poly: 1, transpose: 9, basis: "measured", note: "checked against an orchestration range chart" },
114
+ { program: 66, name: "Tenor Sax", family: "reed", min: 44, max: 76, poly: 1, transpose: 14, basis: "measured", note: "checked against an orchestration range chart" },
115
+ { program: 67, name: "Baritone Sax", family: "reed", min: 36, max: 69, poly: 1, transpose: 21, basis: "measured", note: "checked against an orchestration range chart" },
116
+ { program: 68, name: "Oboe", family: "reed", min: 58, max: 91, poly: 1, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
117
+ { program: 69, name: "English Horn", family: "reed", min: 52, max: 81, poly: 1, transpose: 7, basis: "measured", note: "checked against an orchestration range chart" },
118
+ { program: 70, name: "Bassoon", family: "reed", min: 34, max: 75, poly: 1, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
119
+ { program: 71, name: "Clarinet", family: "reed", min: 50, max: 94, poly: 1, transpose: 2, basis: "measured", note: "checked against an orchestration range chart" },
120
+ { program: 72, name: "Piccolo", family: "pipe", min: 74, max: 108, poly: 1, transpose: -12, basis: "measured", note: "checked against an orchestration range chart" },
121
+ { program: 73, name: "Flute", family: "pipe", min: 60, max: 98, poly: 1, transpose: 0, basis: "measured", note: "checked against an orchestration range chart" },
122
+ { program: 74, name: "Recorder", family: "pipe", min: 65, max: 98, poly: 1, transpose: 0, basis: "measured", note: "alto F4-G6 and soprano C5-D7 together; GM does not say which" },
123
+ { program: 75, name: "Pan Flute", family: "pipe", min: 55, max: 91, poly: 1, transpose: 0, basis: "tunable", note: "a Romanian nai is built in 20, 22, 25, 28 and 30 pipes, in G or in C; 22 tubes in G spans about three octaves" },
124
+ { program: 76, name: "Blown Bottle", family: "pipe", min: 48, max: 96, poly: 1, transpose: 0, basis: "tunable", note: "the pitch of a blown bottle is the bottle" },
125
+ { program: 77, name: "Shakuhachi", family: "pipe", min: 62, max: 91, poly: 1, transpose: 0, basis: "measured", note: "1.8 shakuhachi: D4 fundamental, two octaves and a partial third" },
126
+ { program: 78, name: "Whistle", family: "pipe", min: 74, max: 98, poly: 1, transpose: 0, basis: "measured", note: "a D tin whistle: D5-D7, two octaves" },
127
+ { program: 79, name: "Ocarina", family: "pipe", min: 69, max: 89, poly: 1, transpose: 0, basis: "measured", note: "a 12-hole alto C ocarina: A4-F6, the octave and a sixth Wikipedia gives" },
128
+ { program: 80, name: "Lead 1 (square)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
129
+ { program: 81, name: "Lead 2 (sawtooth)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
130
+ { program: 82, name: "Lead 3 (calliope)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
131
+ { program: 83, name: "Lead 4 (chiff)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
132
+ { program: 84, name: "Lead 5 (charang)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
133
+ { program: 85, name: "Lead 6 (voice)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
134
+ { program: 86, name: "Lead 7 (fifths)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
135
+ { program: 87, name: "Lead 8 (bass + lead)", family: "synth-lead", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
136
+ { program: 88, name: "Pad 1 (new age)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
137
+ { program: 89, name: "Pad 2 (warm)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
138
+ { program: 90, name: "Pad 3 (polysynth)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
139
+ { program: 91, name: "Pad 4 (choir)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
140
+ { program: 92, name: "Pad 5 (bowed)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
141
+ { program: 93, name: "Pad 6 (metallic)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
142
+ { program: 94, name: "Pad 7 (halo)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
143
+ { program: 95, name: "Pad 8 (sweep)", family: "synth-pad", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
144
+ { program: 96, name: "FX 1 (rain)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
145
+ { program: 97, name: "FX 2 (soundtrack)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
146
+ { program: 98, name: "FX 3 (crystal)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
147
+ { program: 99, name: "FX 4 (atmosphere)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
148
+ { program: 100, name: "FX 5 (brightness)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
149
+ { program: 101, name: "FX 6 (goblins)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
150
+ { program: 102, name: "FX 7 (echoes)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
151
+ { program: 103, name: "FX 8 (sci-fi)", family: "synth-effects", min: 24, max: 96, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic patch has no acoustic compass" },
152
+ { program: 104, name: "Sitar", family: "ethnic", min: 40, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a sitar is tuned to the singer, not to concert pitch" },
153
+ { program: 105, name: "Banjo", family: "ethnic", min: 48, max: 84, poly: 5, transpose: 0, basis: "measured", note: "5-string banjo open G reaches D3; tenor banjo down to C3; up to about C6" },
154
+ { program: 106, name: "Shamisen", family: "ethnic", min: 48, max: 79, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a shamisen is tuned to whatever register the singer wants" },
155
+ { program: 107, name: "Koto", family: "ethnic", min: 43, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a koto is tuned to the piece before it is played" },
156
+ { program: 108, name: "Kalimba", family: "ethnic", min: 53, max: 89, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "mbira and kalimba tunings vary by maker and are often not on the tempered scale" },
157
+ { program: 109, name: "Bagpipe", family: "ethnic", min: 62, max: 86, poly: 1, transpose: 0, basis: "measured", note: "General MIDI says only \"Bagpipe\": the Highland chanter is nine notes G4-A5, the uilleann chanter two octaves from D4, so this is the pair" },
158
+ { program: 110, name: "Fiddle", family: "ethnic", min: 55, max: 100, poly: 2, transpose: 0, basis: "measured", note: "a fiddle is a violin: G3-E7" },
159
+ { program: 111, name: "Shanai", family: "ethnic", min: 57, max: 81, poly: 1, transpose: 0, basis: "measured", note: "the shehnai: A3-A5, two octaves" },
160
+ { program: 112, name: "Tinkle Bell", family: "percussive", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "a tinkle bell has a sound, not a scale" },
161
+ { program: 113, name: "Agogo", family: "percussive", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "an agogo is two or three bells, not a scale" },
162
+ { program: 114, name: "Steel Drums", family: "percussive", min: 33, max: 91, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "measured", note: "steelpan family A1-G6" },
163
+ { program: 115, name: "Woodblock", family: "percussive", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "a woodblock has a sound, not a scale" },
164
+ { program: 116, name: "Taiko Drum", family: "percussive", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a taiko is tuned by its head tension; a set has no standard compass" },
165
+ { program: 117, name: "Melodic Tom", family: "percussive", min: 48, max: 84, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "tunable", note: "a melodic tom set is tuned by the player" },
166
+ { program: 118, name: "Synth Drum", family: "percussive", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "synthetic", note: "an electronic drum voice" },
167
+ { program: 119, name: "Reverse Cymbal", family: "percussive", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "reverse cymbal is an effect, not a pitch" },
168
+ { program: 120, name: "Guitar Fret Noise", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
169
+ { program: 121, name: "Breath Noise", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
170
+ { program: 122, name: "Seashore", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
171
+ { program: 123, name: "Bird Tweet", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
172
+ { program: 124, name: "Telephone Ring", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
173
+ { program: 125, name: "Helicopter", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
174
+ { program: 126, name: "Applause", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
175
+ { program: 127, name: "Gunshot", family: "sound-effects", min: 21, max: 108, poly: UNLIMITED_POLYPHONY, transpose: 0, basis: "unpitched", note: "sound effect" },
176
+ ];
177
+ /**
178
+ * Section patches take the union of the instruments in them, computed rather
179
+ * than typed, so a string section cannot end up narrower than the cello
180
+ * sitting inside it when the cello's own row is corrected.
181
+ */
182
+ const SECTION_MEMBERS = {
183
+ 44: [40, 41, 42, 43], // Tremolo Strings
184
+ 45: [40, 41, 42, 43], // Pizzicato Strings
185
+ 48: [40, 41, 42, 43], // String Ensemble 1
186
+ 49: [40, 41, 42, 43], // String Ensemble 2
187
+ 61: [56, 57, 58, 60], // Brass Section: trumpet, trombone, tuba, horn
188
+ };
189
+ /** The catalogue, in program order. */
190
+ export const GM_CATALOGUE = ROWS.map((r) => ({
191
+ program: r.program,
192
+ name: r.name,
193
+ family: r.family,
194
+ range: SECTION_MEMBERS[r.program]
195
+ ? sectionRange(...SECTION_MEMBERS[r.program])
196
+ : { min: r.min, max: r.max },
197
+ maxPolyphony: r.poly,
198
+ writtenTransposition: r.transpose,
199
+ basis: r.basis,
200
+ note: r.note,
201
+ }));
202
+ /**
203
+ * The row for `program`, or `null` outside 0-127.
204
+ *
205
+ * Every other instrument accessor reads this, so there is one lookup to get
206
+ * wrong rather than four.
207
+ */
208
+ export function gmSpec(program) {
209
+ return GM_CATALOGUE[program] ?? null;
210
+ }
211
+ /**
212
+ * Whether a note outside this instrument's range is worth refusing.
213
+ *
214
+ * False for a synthetic patch, a sound effect, and — importantly — anything
215
+ * whose compass was never verified: refusing a note against a number nobody
216
+ * checked is worse than not checking, because it rejects music that was fine.
217
+ */
218
+ export function gmRangeIsBinding(program) {
219
+ return gmSpec(program)?.basis === "measured";
220
+ }
221
+ /**
222
+ * The compass of a section patch: the union of the instruments in it.
223
+ *
224
+ * Derived rather than looked up, so a string section cannot end up narrower
225
+ * than the cello sitting inside it.
226
+ */
227
+ function sectionRange(...programs) {
228
+ const specs = programs.map((p) => ROWS[p]);
229
+ return {
230
+ min: Math.min(...specs.map((r) => r.min)),
231
+ max: Math.max(...specs.map((r) => r.max)),
232
+ };
233
+ }
234
+ /** Guard: the families in program order, so a row cannot claim the wrong one. */
235
+ export function gmFamilyForProgram(program) {
236
+ const family = GM_FAMILIES[Math.floor(program / 8)];
237
+ if (!family)
238
+ throw new RangeError(`no General MIDI family for ${program}`);
239
+ return family;
240
+ }
241
+ export { FULL_KEYBOARD, UNLIMITED_POLYPHONY };
242
+ //# sourceMappingURL=gm-catalogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gm-catalogue.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-catalogue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,SAAS;IACT,WAAW;IACX,WAAW;IACX,SAAS;CACD,CAAC;AA8BX,MAAM,IAAI,GAAmB;IAC3B,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IAC7K,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACxK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACnM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACzK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,sCAAsC,EAAE;IACtL,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,kGAAkG,EAAE;IACjP,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAClL,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yCAAyC,EAAE;IAChL,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yCAAyC,EAAE;IACjM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,2CAA2C,EAAE;IACxM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,yEAAyE,EAAC;IAC/N,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wCAAwC,EAAE;IAC9L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yCAAyC,EAAE;IACpM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,0EAA0E,EAAE;IACtO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oFAAoF,EAAE;IAC1O,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wCAAwC,EAAE;IACrL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE;IAC7J,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE;IACvJ,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,mEAAmE,EAAE;IAC/M,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yDAAyD,EAAE;IACnM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,qDAAqD,EAAE;IAC9L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,0BAA0B,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACvK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACpL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC/K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC/K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC9K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IAC1K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACnL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACjL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IAC1K,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACxK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACxK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACzK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+CAA+C,EAAE;IACzK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACzK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,6EAA6E,EAAE;IAC/N,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,+EAA+E,EAAE;IACnO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAChM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iFAAiF,EAAE;IAC1N,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wDAAwD,EAAE;IAC7M,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,wDAAwD,EAAE;IAC7M,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACzL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACzL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC3L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC3L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,mCAAmC,EAAE;IACnL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6DAA6D,EAAE;IAC/M,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACpK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAChK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,6DAA6D,EAAE;IACxL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACvK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,kDAAkD,EAAE;IAC/L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACpL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACpL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACtK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACxK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC/J,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACvK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAClK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IACrK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAChK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,8DAA8D,EAAE;IACnL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,+GAA+G,EAAE;IACpO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2CAA2C,EAAE;IACnK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iEAAiE,EAAE;IACxL,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,qCAAqC,EAAE;IACzJ,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,yEAAyE,EAAE;IAC7L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAClM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACpM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACpM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACjM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACnM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACjM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAClM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACvM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACjM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAC9L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACnM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAC/L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAC/L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAClM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAC9L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IAC/L,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACjM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACvM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACpM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACvM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACxM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACrM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACpM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACpM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,sDAAsD,EAAC;IAC3L,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,0EAA0E,EAAE;IAC/L,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,2DAA2D,EAAE;IACpM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,kDAAkD,EAAE;IACvL,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,iFAAiF,EAAE;IACzN,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,6IAA6I,EAAE;IACpQ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,6BAA6B,EAAE;IACpJ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,iCAAiC,EAAE;IACvJ,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,wCAAwC,EAAC;IACzL,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,6CAA6C,EAAE;IACzL,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAC;IACvK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,sCAAsC,EAAC;IACrL,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,qEAAqE,EAAE;IACpN,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAC1L,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;IAC5K,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,0CAA0C,EAAE;IAChM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IAC1K,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACrK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACjK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACnK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACvK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACnK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IACjK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;CAAE,CAAC;AAErK;;;;GAIG;AACH,MAAM,eAAe,GAA6B;IAChD,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,kBAAkB;IACxC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,oBAAoB;IAC1C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,oBAAoB;IAC1C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,oBAAoB;IAC1C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,+CAA+C;CACtE,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,YAAY,GAAgC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,OAAO;IAClB,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC;QAC9C,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;IAC9B,YAAY,EAAE,CAAC,CAAC,IAAI;IACpB,oBAAoB,EAAE,CAAC,CAAC,SAAS;IACjC,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,IAAI,EAAE,CAAC,CAAC,IAAI;CACb,CAAC,CAAC,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,UAAU,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,GAAG,QAAkB;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;IAC5C,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC"}
@@ -3,9 +3,9 @@ export declare const UNLIMITED_POLYPHONY: number;
3
3
  /**
4
4
  * The most notes `program` can sound simultaneously.
5
5
  *
6
- * Returns `UNLIMITED_POLYPHONY` for anything chordal, and for any program
7
- * outside 0-127 an unknown instrument gets the benefit of the doubt rather
8
- * than having edits blocked against a guess.
6
+ * `UNLIMITED_POLYPHONY` for anything chordal and for any program outside
7
+ * 0-127: an unknown instrument gets the benefit of the doubt rather than
8
+ * having edits blocked against a guess.
9
9
  */
10
10
  export declare function gmMaxPolyphony(program: number): number;
11
11
  /** Whether `program` can sound `count` notes at once. */
@@ -1 +1 @@
1
- {"version":3,"file":"gm-polyphony.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAgBA,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AA4C5D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvE"}
1
+ {"version":3,"file":"gm-polyphony.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAkBA,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvE"}
@@ -1,73 +1,31 @@
1
1
  /**
2
2
  * How many notes a General MIDI program can sound at once.
3
3
  *
4
- * General MIDI says nothing about this, so like `gm-range.ts` it is a
5
- * curated table: a default per family, with overrides where the family default
6
- * would be wrong. The numbers are physical facts about the instruments, not
7
- * preferences: a trumpet player has one airstream, a guitar has six strings, a
8
- * violinist can bow two strings at once (and briefly break three).
4
+ * General MIDI says nothing about this, so the numbers are ours. They are
5
+ * physical facts about the instruments rather than preferences: a trumpet
6
+ * player has one airstream, a guitar has six strings, a banjo five, a violinist
7
+ * can bow two at once (and briefly break three).
8
+ *
9
+ * They live in `gm-catalogue.ts`, one row per program, alongside that
10
+ * program's range and transposition — see that module for why a family default
11
+ * plus overrides turned out to be the wrong shape for this.
9
12
  *
10
13
  * This exists so the editor can refuse to write a chord nobody could play. It
11
14
  * deliberately does NOT describe what a synthesizer patch can do — polyphony
12
15
  * there is a setting, not a limit — so every synth family is unlimited.
13
16
  */
14
- import { gmFamilyOf, gmInstrument } from "./gm.js";
17
+ import { gmSpec } from "./gm-catalogue.js";
15
18
  /** No physical limit: keyboards, plucked strings, sections, synths, drums. */
16
19
  export const UNLIMITED_POLYPHONY = Number.POSITIVE_INFINITY;
17
- /**
18
- * Family defaults.
19
- *
20
- * Wind and brass are 1 because one player has one airstream. Bowed strings are
21
- * 2 for double stops. Everything else is unlimited — including the synth
22
- * families, where polyphony is a patch setting rather than a property of the
23
- * instrument, and blocking a chord there would be an invented restriction.
24
- */
25
- const FAMILY_POLYPHONY = {
26
- piano: UNLIMITED_POLYPHONY,
27
- "chromatic-percussion": UNLIMITED_POLYPHONY,
28
- organ: UNLIMITED_POLYPHONY,
29
- guitar: 6,
30
- bass: 4,
31
- strings: 2,
32
- ensemble: UNLIMITED_POLYPHONY,
33
- brass: 1,
34
- reed: 1,
35
- pipe: 1,
36
- "synth-lead": UNLIMITED_POLYPHONY,
37
- "synth-pad": UNLIMITED_POLYPHONY,
38
- "synth-effects": UNLIMITED_POLYPHONY,
39
- ethnic: UNLIMITED_POLYPHONY,
40
- percussive: UNLIMITED_POLYPHONY,
41
- "sound-effects": UNLIMITED_POLYPHONY,
42
- };
43
- /** Programs whose own limit differs from their family's. */
44
- const PROGRAM_POLYPHONY = {
45
- // In the strings family but not bowed: both are chordal instruments.
46
- 46: UNLIMITED_POLYPHONY, // Orchestral Harp
47
- 47: UNLIMITED_POLYPHONY, // Timpani — a set of drums, not one
48
- // Sections, not soloists, despite sitting in the brass family.
49
- 61: UNLIMITED_POLYPHONY, // Brass Section
50
- 62: UNLIMITED_POLYPHONY, // Synth Brass 1
51
- 63: UNLIMITED_POLYPHONY, // Synth Brass 2
52
- // Single-line players inside the otherwise-chordal ethnic family.
53
- 109: 1, // Bagpipe
54
- 110: 2, // Fiddle — bowed, so double stops
55
- 111: 1, // Shanai
56
- };
57
20
  /**
58
21
  * The most notes `program` can sound simultaneously.
59
22
  *
60
- * Returns `UNLIMITED_POLYPHONY` for anything chordal, and for any program
61
- * outside 0-127 an unknown instrument gets the benefit of the doubt rather
62
- * than having edits blocked against a guess.
23
+ * `UNLIMITED_POLYPHONY` for anything chordal and for any program outside
24
+ * 0-127: an unknown instrument gets the benefit of the doubt rather than
25
+ * having edits blocked against a guess.
63
26
  */
64
27
  export function gmMaxPolyphony(program) {
65
- const override = PROGRAM_POLYPHONY[program];
66
- if (override !== undefined)
67
- return override;
68
- return gmInstrument(program)
69
- ? FAMILY_POLYPHONY[gmFamilyOf(program)]
70
- : UNLIMITED_POLYPHONY;
28
+ return gmSpec(program)?.maxPolyphony ?? UNLIMITED_POLYPHONY;
71
29
  }
72
30
  /** Whether `program` can sound `count` notes at once. */
73
31
  export function gmSupportsChord(program, count) {
@@ -1 +1 @@
1
- {"version":3,"file":"gm-polyphony.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGnD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAA6B;IACjD,KAAK,EAAE,mBAAmB;IAC1B,sBAAsB,EAAE,mBAAmB;IAC3C,KAAK,EAAE,mBAAmB;IAC1B,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,mBAAmB;IAChC,eAAe,EAAE,mBAAmB;IACpC,MAAM,EAAE,mBAAmB;IAC3B,UAAU,EAAE,mBAAmB;IAC/B,eAAe,EAAE,mBAAmB;CACrC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,iBAAiB,GAA2B;IAChD,qEAAqE;IACrE,EAAE,EAAE,mBAAmB,EAAE,kBAAkB;IAC3C,EAAE,EAAE,mBAAmB,EAAE,oCAAoC;IAC7D,+DAA+D;IAC/D,EAAE,EAAE,mBAAmB,EAAE,gBAAgB;IACzC,EAAE,EAAE,mBAAmB,EAAE,gBAAgB;IACzC,EAAE,EAAE,mBAAmB,EAAE,gBAAgB;IACzC,kEAAkE;IAClE,GAAG,EAAE,CAAC,EAAE,UAAU;IAClB,GAAG,EAAE,CAAC,EAAE,kCAAkC;IAC1C,GAAG,EAAE,CAAC,EAAE,SAAS;CAClB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,YAAY,CAAC,OAAO,CAAC;QAC1B,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,mBAAmB,CAAC;AAC1B,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,OAAO,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"gm-polyphony.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,IAAI,mBAAmB,CAAC;AAC9D,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,OAAO,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,4 +1,11 @@
1
- /** Inclusive MIDI note numbers. */
1
+ /**
2
+ * An instrument's compass.
3
+ *
4
+ * The numbers themselves live in `gm-catalogue.ts`, one row per program. They
5
+ * used to live here as a family default plus 38 overrides, which meant 90
6
+ * programs inherited a compass nobody had chosen for them — see that module's
7
+ * doc for what that hid.
8
+ */
2
9
  export type MidiRange = {
3
10
  min: number;
4
11
  max: number;
@@ -6,10 +13,8 @@ export type MidiRange = {
6
13
  /** A0 to C8 — the 88-key piano, and the widest range anything here returns. */
7
14
  export declare const FULL_KEYBOARD: MidiRange;
8
15
  /**
9
- * The practical range for `program`: its own if it has one, else its family's.
10
- *
11
- * An out-of-range program has no family, so it falls back to the full keyboard
12
- * rather than guessing.
16
+ * The practical range for `program`, or the full keyboard for an unknown one
17
+ * benefit of the doubt rather than edits blocked against a guess.
13
18
  */
14
19
  export declare function gmInstrumentRange(program: number): MidiRange;
15
20
  //# sourceMappingURL=gm-range.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gm-range.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAmBA,mCAAmC;AACnC,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,SAAiC,CAAC;AAmE9D;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAM5D"}
1
+ {"version":3,"file":"gm-range.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,+EAA+E;AAC/E,eAAO,MAAM,aAAa,EAAE,SAAiC,CAAC;AAI9D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAE5D"}
@@ -1,97 +1,11 @@
1
- /**
2
- * A playable pitch range per General MIDI program.
3
- *
4
- * General MIDI defines names and programs but says nothing about compass, so
5
- * this is a curated table: a default per family, with overrides for the
6
- * instruments where the family default would be badly wrong. A piccolo and a
7
- * tuba are both "wind", and showing either one an 88-key piano tells the player
8
- * nothing about what will actually sound.
9
- *
10
- * The values are the conventional written-to-sounding ranges of the real
11
- * instruments, expressed as MIDI note numbers (60 = middle C). They are
12
- * intentionally the *practical* range rather than the extreme one — the point
13
- * is to show a keyboard whose keys are worth pressing, not to police input.
14
- * Nothing here restricts what can be written; it only decides which keys are
15
- * worth showing.
16
- */
17
- import { gmFamilyOf, gmInstrument } from "./gm.js";
18
1
  /** A0 to C8 — the 88-key piano, and the widest range anything here returns. */
19
2
  export const FULL_KEYBOARD = { min: 21, max: 108 };
3
+ import { gmSpec } from "./gm-catalogue.js";
20
4
  /**
21
- * Family defaults. Synth and effects families get a wide range on purpose:
22
- * they have no acoustic compass to respect, so narrowing them would be a
23
- * fiction.
24
- */
25
- const FAMILY_RANGE = {
26
- piano: { min: 21, max: 108 },
27
- "chromatic-percussion": { min: 48, max: 96 },
28
- organ: { min: 36, max: 96 },
29
- guitar: { min: 40, max: 88 },
30
- bass: { min: 28, max: 67 },
31
- strings: { min: 36, max: 96 },
32
- ensemble: { min: 36, max: 96 },
33
- brass: { min: 34, max: 82 },
34
- reed: { min: 44, max: 88 },
35
- pipe: { min: 60, max: 98 },
36
- "synth-lead": { min: 24, max: 96 },
37
- "synth-pad": { min: 24, max: 96 },
38
- "synth-effects": { min: 24, max: 96 },
39
- ethnic: { min: 40, max: 84 },
40
- percussive: { min: 48, max: 84 },
41
- "sound-effects": { min: 21, max: 108 },
42
- };
43
- /** Instruments whose own compass differs enough from their family to matter. */
44
- const PROGRAM_RANGE = {
45
- 6: { min: 29, max: 89 }, // Harpsichord
46
- 8: { min: 60, max: 108 }, // Celesta
47
- 9: { min: 79, max: 108 }, // Glockenspiel
48
- 11: { min: 53, max: 89 }, // Vibraphone
49
- 12: { min: 36, max: 96 }, // Marimba
50
- 13: { min: 65, max: 108 }, // Xylophone
51
- 14: { min: 65, max: 89 }, // Tubular Bells
52
- 19: { min: 24, max: 96 }, // Church Organ
53
- 21: { min: 41, max: 81 }, // Accordion
54
- 22: { min: 60, max: 96 }, // Harmonica
55
- 40: { min: 55, max: 100 }, // Violin
56
- 41: { min: 48, max: 88 }, // Viola
57
- 42: { min: 36, max: 84 }, // Cello
58
- 43: { min: 28, max: 67 }, // Contrabass
59
- 46: { min: 24, max: 103 }, // Orchestral Harp
60
- 47: { min: 38, max: 57 }, // Timpani
61
- 52: { min: 48, max: 84 }, // Choir Aahs
62
- 53: { min: 48, max: 84 }, // Voice Oohs
63
- 56: { min: 52, max: 86 }, // Trumpet
64
- 57: { min: 40, max: 77 }, // Trombone
65
- 58: { min: 26, max: 65 }, // Tuba
66
- 60: { min: 35, max: 77 }, // French Horn
67
- 64: { min: 56, max: 88 }, // Soprano Sax
68
- 65: { min: 49, max: 81 }, // Alto Sax
69
- 66: { min: 44, max: 76 }, // Tenor Sax
70
- 67: { min: 36, max: 69 }, // Baritone Sax
71
- 68: { min: 58, max: 91 }, // Oboe
72
- 69: { min: 52, max: 81 }, // English Horn
73
- 70: { min: 34, max: 75 }, // Bassoon
74
- 71: { min: 50, max: 94 }, // Clarinet
75
- 72: { min: 74, max: 108 }, // Piccolo
76
- 73: { min: 60, max: 98 }, // Flute
77
- 74: { min: 65, max: 91 }, // Recorder
78
- 105: { min: 48, max: 81 }, // Banjo
79
- 106: { min: 48, max: 79 }, // Shamisen
80
- 107: { min: 43, max: 84 }, // Koto
81
- 108: { min: 53, max: 89 }, // Kalimba
82
- };
83
- /**
84
- * The practical range for `program`: its own if it has one, else its family's.
85
- *
86
- * An out-of-range program has no family, so it falls back to the full keyboard
87
- * rather than guessing.
5
+ * The practical range for `program`, or the full keyboard for an unknown one —
6
+ * benefit of the doubt rather than edits blocked against a guess.
88
7
  */
89
8
  export function gmInstrumentRange(program) {
90
- const override = PROGRAM_RANGE[program];
91
- if (override)
92
- return override;
93
- return gmInstrument(program)
94
- ? FAMILY_RANGE[gmFamilyOf(program)]
95
- : FULL_KEYBOARD;
9
+ return gmSpec(program)?.range ?? FULL_KEYBOARD;
96
10
  }
97
11
  //# sourceMappingURL=gm-range.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gm-range.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gm-range.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAUA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAc,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,aAAa,CAAC;AACjD,CAAC"}
@@ -1,3 +1,15 @@
1
+ /**
2
+ * How far a General MIDI program's written pitch sits from its sounding pitch.
3
+ *
4
+ * A transposing instrument is written in a key other than the one it sounds: a
5
+ * B♭ trumpet reads a tone above what comes out, so concert C is written D.
6
+ * This is a property of the instrument, not a preference — hand a clarinettist
7
+ * a part at concert pitch and every note is wrong.
8
+ *
9
+ * Curated like `gm-range.ts` and `gm-polyphony.ts`: a default with overrides
10
+ * for the programs that actually transpose. Most do not, so the table below is
11
+ * only the exceptions.
12
+ */
1
13
  /**
2
14
  * Semitones to add to `program`'s sounding pitch to get its written pitch.
3
15
  *
@@ -1 +1 @@
1
- {"version":3,"file":"gm-transposition.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-transposition.ts"],"names":[],"mappings":"AA0DA;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD"}
1
+ {"version":3,"file":"gm-transposition.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-transposition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD"}
@@ -10,46 +10,8 @@
10
10
  * for the programs that actually transpose. Most do not, so the table below is
11
11
  * only the exceptions.
12
12
  */
13
- import { gmInstrument } from "./gm.js";
14
13
  /** Semitones to ADD to sounding pitch to get written pitch. */
15
- const PROGRAM_TRANSPOSITION = {
16
- // Octave-transposing tuned percussion: written an octave (or two) below
17
- // where they sound, so the reader is not chasing ledger lines.
18
- 8: -12, // Celesta
19
- 9: -24, // Glockenspiel
20
- 13: -12, // Xylophone
21
- // Guitars and basses are written an octave above where they sound.
22
- 24: 12, // Acoustic Guitar (nylon)
23
- 25: 12, // Acoustic Guitar (steel)
24
- 26: 12, // Electric Guitar (jazz)
25
- 27: 12, // Electric Guitar (clean)
26
- 28: 12, // Electric Guitar (muted)
27
- 29: 12, // Overdriven Guitar
28
- 30: 12, // Distortion Guitar
29
- 31: 12, // Guitar Harmonics
30
- 32: 12, // Acoustic Bass
31
- 33: 12, // Electric Bass (finger)
32
- 34: 12, // Electric Bass (pick)
33
- 35: 12, // Fretless Bass
34
- 36: 12, // Slap Bass 1
35
- 37: 12, // Slap Bass 2
36
- 38: 12, // Synth Bass 1
37
- 39: 12, // Synth Bass 2
38
- 43: 12, // Contrabass
39
- // Brass.
40
- 56: 2, // Trumpet — B♭
41
- 60: 7, // French Horn — F
42
- // Reeds. The saxophone family transposes by four different intervals, which
43
- // is why they cannot share a family default.
44
- 64: 2, // Soprano Sax — B♭
45
- 65: 9, // Alto Sax — E♭
46
- 66: 14, // Tenor Sax — B♭, a ninth below
47
- 67: 21, // Baritone Sax — E♭, an octave and a sixth below
48
- 69: 7, // English Horn — F
49
- 71: 2, // Clarinet — B♭
50
- // Pipes.
51
- 72: -12, // Piccolo — sounds an octave above where it is written
52
- };
14
+ import { gmSpec } from "./gm-catalogue.js";
53
15
  /**
54
16
  * Semitones to add to `program`'s sounding pitch to get its written pitch.
55
17
  *
@@ -58,9 +20,7 @@ const PROGRAM_TRANSPOSITION = {
58
20
  * which would be a silently wrong part.
59
21
  */
60
22
  export function gmWrittenTransposition(program) {
61
- if (!gmInstrument(program))
62
- return 0;
63
- return PROGRAM_TRANSPOSITION[program] ?? 0;
23
+ return gmSpec(program)?.writtenTransposition ?? 0;
64
24
  }
65
25
  /** Whether `program` is written anywhere other than where it sounds. */
66
26
  export function gmIsTransposing(program) {
@@ -1 +1 @@
1
- {"version":3,"file":"gm-transposition.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-transposition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,+DAA+D;AAC/D,MAAM,qBAAqB,GAA2B;IACpD,wEAAwE;IACxE,+DAA+D;IAC/D,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU;IAClB,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe;IACvB,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY;IAErB,mEAAmE;IACnE,EAAE,EAAE,EAAE,EAAE,0BAA0B;IAClC,EAAE,EAAE,EAAE,EAAE,0BAA0B;IAClC,EAAE,EAAE,EAAE,EAAE,yBAAyB;IACjC,EAAE,EAAE,EAAE,EAAE,0BAA0B;IAClC,EAAE,EAAE,EAAE,EAAE,0BAA0B;IAClC,EAAE,EAAE,EAAE,EAAE,oBAAoB;IAC5B,EAAE,EAAE,EAAE,EAAE,oBAAoB;IAC5B,EAAE,EAAE,EAAE,EAAE,mBAAmB;IAC3B,EAAE,EAAE,EAAE,EAAE,gBAAgB;IACxB,EAAE,EAAE,EAAE,EAAE,yBAAyB;IACjC,EAAE,EAAE,EAAE,EAAE,uBAAuB;IAC/B,EAAE,EAAE,EAAE,EAAE,gBAAgB;IACxB,EAAE,EAAE,EAAE,EAAE,cAAc;IACtB,EAAE,EAAE,EAAE,EAAE,cAAc;IACtB,EAAE,EAAE,EAAE,EAAE,eAAe;IACvB,EAAE,EAAE,EAAE,EAAE,eAAe;IACvB,EAAE,EAAE,EAAE,EAAE,aAAa;IAErB,SAAS;IACT,EAAE,EAAE,CAAC,EAAE,eAAe;IACtB,EAAE,EAAE,CAAC,EAAE,kBAAkB;IAEzB,4EAA4E;IAC5E,6CAA6C;IAC7C,EAAE,EAAE,CAAC,EAAE,mBAAmB;IAC1B,EAAE,EAAE,CAAC,EAAE,gBAAgB;IACvB,EAAE,EAAE,EAAE,EAAE,gCAAgC;IACxC,EAAE,EAAE,EAAE,EAAE,iDAAiD;IACzD,EAAE,EAAE,CAAC,EAAE,mBAAmB;IAC1B,EAAE,EAAE,CAAC,EAAE,gBAAgB;IAEvB,SAAS;IACT,EAAE,EAAE,CAAC,EAAE,EAAE,uDAAuD;CACjE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"gm-transposition.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-transposition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,+DAA+D;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC"}
package/dist/index.d.ts CHANGED
@@ -65,6 +65,7 @@ export * from "./domain/commands/edit-commands.js";
65
65
  export * from "./domain/commands/relocate-commands.js";
66
66
  export * from "./domain/commands/ripple-commands.js";
67
67
  export * from "./domain/instruments/gm.js";
68
+ export * from "./domain/instruments/gm-catalogue.js";
68
69
  export * from "./domain/instruments/midi-protocol.js";
69
70
  export * from "./domain/instruments/gm-kit.js";
70
71
  export * from "./domain/instruments/gm-range.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AASH,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAQ5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,oBAAoB,CAAC;AAKnC,cAAc,qBAAqB,CAAC;AAMpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAM9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AAItD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wCAAwC,CAAC;AACvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -87,6 +87,7 @@ export * from "./domain/commands/edit-commands.js";
87
87
  export * from "./domain/commands/relocate-commands.js";
88
88
  export * from "./domain/commands/ripple-commands.js";
89
89
  export * from "./domain/instruments/gm.js";
90
+ export * from "./domain/instruments/gm-catalogue.js";
90
91
  export * from "./domain/instruments/midi-protocol.js";
91
92
  export * from "./domain/instruments/gm-kit.js";
92
93
  export * from "./domain/instruments/gm-range.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/music_types",
3
- "version": "0.13.6",
3
+ "version": "0.13.8",
4
4
  "description": "TypeScript types and Zod schemas for the ScoreSmith music API - scores, generation contracts, project payloads",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",