@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 +2 -0
- package/dist/domain/instruments/gm-catalogue.d.ts +41 -0
- package/dist/domain/instruments/gm-catalogue.d.ts.map +1 -0
- package/dist/domain/instruments/gm-catalogue.js +242 -0
- package/dist/domain/instruments/gm-catalogue.js.map +1 -0
- package/dist/domain/instruments/gm-polyphony.d.ts +3 -3
- package/dist/domain/instruments/gm-polyphony.d.ts.map +1 -1
- package/dist/domain/instruments/gm-polyphony.js +13 -55
- package/dist/domain/instruments/gm-polyphony.js.map +1 -1
- package/dist/domain/instruments/gm-range.d.ts +10 -5
- package/dist/domain/instruments/gm-range.d.ts.map +1 -1
- package/dist/domain/instruments/gm-range.js +4 -90
- package/dist/domain/instruments/gm-range.js.map +1 -1
- package/dist/domain/instruments/gm-transposition.d.ts +12 -0
- package/dist/domain/instruments/gm-transposition.d.ts.map +1 -1
- package/dist/domain/instruments/gm-transposition.js +2 -42
- package/dist/domain/instruments/gm-transposition.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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":"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"}
|
|
@@ -3,9 +3,9 @@ export declare const UNLIMITED_POLYPHONY: number;
|
|
|
3
3
|
/**
|
|
4
4
|
* The most notes `program` can sound simultaneously.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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":"
|
|
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
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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 {
|
|
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
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
-
/**
|
|
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
|
|
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":"
|
|
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
|
-
*
|
|
22
|
-
*
|
|
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
|
-
|
|
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":"
|
|
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":"
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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