@sudobility/music_types 0.13.19 → 0.13.21
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 +9 -0
- package/dist/domain/generation/option-order.d.ts +20 -0
- package/dist/domain/generation/option-order.d.ts.map +1 -0
- package/dist/domain/generation/option-order.js +24 -0
- package/dist/domain/generation/option-order.js.map +1 -0
- package/dist/domain/generation/score-presets.d.ts +83 -0
- package/dist/domain/generation/score-presets.d.ts.map +1 -0
- package/dist/domain/generation/score-presets.js +89 -0
- package/dist/domain/generation/score-presets.js.map +1 -0
- package/dist/domain/instruments/arrangement-order.d.ts +17 -0
- package/dist/domain/instruments/arrangement-order.d.ts.map +1 -1
- package/dist/domain/instruments/arrangement-order.js +19 -3
- package/dist/domain/instruments/arrangement-order.js.map +1 -1
- package/dist/domain/instruments/instrument-options.d.ts +42 -1
- package/dist/domain/instruments/instrument-options.d.ts.map +1 -1
- package/dist/domain/instruments/instrument-options.js +54 -2
- package/dist/domain/instruments/instrument-options.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/generation.d.ts +22 -1
- package/dist/model/generation.d.ts.map +1 -1
- package/dist/model/generation.js +10 -8
- package/dist/model/generation.js.map +1 -1
- package/package.json +1 -1
package/CLAUDE.md
CHANGED
|
@@ -116,6 +116,15 @@ Everything exports from a single sectioned `src/index.ts`:
|
|
|
116
116
|
|
|
117
117
|
- **A guard test enforces that this package runs on React Native** (`src/platform-free.test.ts`): no web-only global and no `import.meta`. This matters more here than anywhere else — these are the platform *interfaces* every other repo implements, so one DOM type in a signature spreads to all of them. That is why `FileExporter.save` takes `Uint8Array | string` rather than a `Blob`, and the codecs take `ArrayBuffer`. `tsconfig.json` still sets `lib: [..., "DOM"]` (for `AbortSignal`) and `eslint.config.js` still spreads `globals.browser`, so nothing else would object.
|
|
118
118
|
|
|
119
|
+
- **A singer is a picker group, not a hunt through Ensemble.** General MIDI files the three voice programs (52 Choir Aahs, 53 Voice Oohs, 54 Synth Voice) under *ensemble*, between String Ensemble and Orchestra Hit — so in practice no generated score ever had one in it, while the backend carries several hundred lines of lyric and vocal-support rules for a part nobody could ask for. `VOICE_OPTIONS` lifts them into a group of their own at the top of the generation pickers, **derived from `VOICE_PROGRAMS`** in `arrangement-order.ts` rather than restating three numbers: a picker offering a voice the arranger does not recognise as one is exactly the drift that costs a vocal-led arrangement. They leave `FAMILY_GROUPS` in the same move, because a program in two groups of one menu is a selection the control cannot show unambiguously — but `INSTRUMENT_OPTIONS` keeps all 128, since that one is the catalogue and not a menu. `isVocalInstrumentValue` answers on the picker *value*, so `kit:52` is a drum kit rather than a choir.
|
|
120
|
+
- **The singer is written first, ahead of the genre order.** In `rankTracksForGeneration`, `voiceFirst` used to be a tiebreak among equally ranked parts, so it only did anything where `lead` already came first. `GROOVE_FIRST` writes the lead **last** — in reggae the bassline is the material and the melody decorates it, which is true of an instrumental and inverts the moment somebody is singing over it — so in eleven genres every backing part was composed before the voice existed, `vocalSupportRule` in music_api had no singer to point at, and the vocal was bent to fit a finished arrangement instead of the other way round. It is now the primary sort key, and `roleOrderForStyle` is untouched, so a roster with no voice is arranged exactly as it was. A percussion track is never promoted, whatever its program addresses: on the drum channel, program 53 is a kit.
|
|
121
|
+
- **A closed vocabulary is offered in the order it is read, not the order it was declared.** `sortOptionsByLabel` sorts on the **translated** label under the active language. Both halves matter: the value is `electroSwing` while the reader sees "Electro Swing", so sorting the keys puts entries wherever their camel-case identifier happens to fall; and collating Chinese labels by the English they were translated from produces an order with no visible logic at all. The 33 styles and 6 moods go through it in both apps — an ordering rule written twice is one that eventually disagrees with itself.
|
|
122
|
+
|
|
123
|
+
- **The preset briefs are the server's list and the hosts' words.** `SCORE_PRESET_KEYS` is the closed vocabulary; which of them suit which genre lives in `music_api` and is served by `GET /public/presets?style=`, so it can be retuned without shipping an app and two apps cannot offer different starting points for the same style. The *text* stays in each app's locale files, because the brief a reader picks is also the prompt sent to the model and a Chinese reader should be prompting in Chinese — the same division `MusicXmlWarnings` uses. The vocabulary is here rather than only on the server because **both ends need it**: the server must not serve a brief no app can name, and each app must be able to prove offline, in a test, that it has words for every brief it could be sent. A list only the server had would make the second impossible, which is exactly how a menu comes to print `openingTitle` at a reader. A brief names a subject and a shape and never a genre, since `style` already travels as its own expanded phrase — which is what lets one brief serve several genres instead of 33 sets of bespoke copy.
|
|
124
|
+
- **`weak` is gone and `default` is called "Open AI".** The label said only that it was the default, which is a fact about the picker rather than about which company's model writes the music. The wire value is still `default`, and the default is still expressed by sending **no field at all**, so an ordinary request is byte-for-byte what it was.
|
|
125
|
+
|
|
126
|
+
- **The lyric's subject is its own field, and it replaces rather than adds.** `lyricsTheme` was once deliberately absent, on the grounds that `prompt` already says what the piece is and a second subject line is a place for the two to disagree. What that missed is that they are different questions: "a slow waltz in D minor" describes the music, and the words over it can be about coming home. The disagreement is avoided by there being exactly **one** "the words are about" clause on the server, which this fills when present and `prompt` fills otherwise — so a request that says nothing about it produces the lyric it always did, and `prompt` still reaches the model in its own right. Never sent without `lyrics`: `buildGenerateScoreRequest` drops both on the same rule.
|
|
127
|
+
|
|
119
128
|
## Related Projects
|
|
120
129
|
|
|
121
130
|
- `music_api` — backend (Hono/Drizzle/OpenAI proxy), consumes schemas for validation
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The order a closed vocabulary is *offered* in, which is not the order it is
|
|
3
|
+
* declared in.
|
|
4
|
+
*
|
|
5
|
+
* A vocabulary is declared in whatever order it grew — the styles run waltz,
|
|
6
|
+
* jazz, pop, cinematic, ambient, battle — and that is the right order for the
|
|
7
|
+
* source and no order for a reader hunting through thirty-three of them.
|
|
8
|
+
*
|
|
9
|
+
* Sorted on the **label**, not the value: the value is `electroSwing` and the
|
|
10
|
+
* reader sees "Electro Swing", so sorting the keys puts entries wherever their
|
|
11
|
+
* camel-case identifier happens to fall. And sorted with `localeCompare` under
|
|
12
|
+
* the language actually on screen, because the label a Chinese reader is
|
|
13
|
+
* scanning is Chinese — collating those by the English they were translated
|
|
14
|
+
* from produces an order with no visible logic at all.
|
|
15
|
+
*
|
|
16
|
+
* Here rather than in either app because both apps draw these pickers, and an
|
|
17
|
+
* ordering rule written twice is one that eventually disagrees with itself.
|
|
18
|
+
*/
|
|
19
|
+
export declare function sortOptionsByLabel<T extends string>(values: readonly T[], labelOf: (value: T) => string, locale?: string): T[];
|
|
20
|
+
//# sourceMappingURL=option-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-order.d.ts","sourceRoot":"","sources":["../../../src/domain/generation/option-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,EAAE,CAML"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The order a closed vocabulary is *offered* in, which is not the order it is
|
|
3
|
+
* declared in.
|
|
4
|
+
*
|
|
5
|
+
* A vocabulary is declared in whatever order it grew — the styles run waltz,
|
|
6
|
+
* jazz, pop, cinematic, ambient, battle — and that is the right order for the
|
|
7
|
+
* source and no order for a reader hunting through thirty-three of them.
|
|
8
|
+
*
|
|
9
|
+
* Sorted on the **label**, not the value: the value is `electroSwing` and the
|
|
10
|
+
* reader sees "Electro Swing", so sorting the keys puts entries wherever their
|
|
11
|
+
* camel-case identifier happens to fall. And sorted with `localeCompare` under
|
|
12
|
+
* the language actually on screen, because the label a Chinese reader is
|
|
13
|
+
* scanning is Chinese — collating those by the English they were translated
|
|
14
|
+
* from produces an order with no visible logic at all.
|
|
15
|
+
*
|
|
16
|
+
* Here rather than in either app because both apps draw these pickers, and an
|
|
17
|
+
* ordering rule written twice is one that eventually disagrees with itself.
|
|
18
|
+
*/
|
|
19
|
+
export function sortOptionsByLabel(values, labelOf, locale) {
|
|
20
|
+
// A copy: the vocabularies are module-level constants shared by every caller,
|
|
21
|
+
// and `sort` is in place.
|
|
22
|
+
return [...values].sort((a, b) => labelOf(a).localeCompare(labelOf(b), locale));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=option-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-order.js","sourceRoot":"","sources":["../../../src/domain/generation/option-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAoB,EACpB,OAA6B,EAC7B,MAAe;IAEf,8EAA8E;IAC9E,0BAA0B;IAC1B,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The briefs a reader can start a generation from, as ids rather than as text.
|
|
4
|
+
*
|
|
5
|
+
* Which briefs suit which genre is **product data the server owns** — it is
|
|
6
|
+
* served by `GET /public/presets` so it can be retuned without shipping an app,
|
|
7
|
+
* and so two apps offering "the presets for reggae" cannot offer different
|
|
8
|
+
* ones. The *words* stay with the hosts, which is the same division
|
|
9
|
+
* `MusicXmlWarnings` uses and the reason a Chinese reader gets Chinese: a
|
|
10
|
+
* library that held the copy would hold it in one language.
|
|
11
|
+
*
|
|
12
|
+
* The vocabulary itself lives here rather than on the server because both ends
|
|
13
|
+
* need it. The server must not serve a brief no app can name, and each app must
|
|
14
|
+
* be able to prove — offline, in a test — that it has words for every brief it
|
|
15
|
+
* could ever be sent. A list only the server had would make the second
|
|
16
|
+
* impossible, which is exactly how a menu comes to print `openingTitle` at a
|
|
17
|
+
* reader.
|
|
18
|
+
*
|
|
19
|
+
* A brief names a subject and a shape, never a genre: `style` already travels
|
|
20
|
+
* as its own expanded phrase, so a preset that said "reggae" would say it twice
|
|
21
|
+
* and would be wrong the moment it were served under another style. That is
|
|
22
|
+
* what lets one brief be assigned to several genres.
|
|
23
|
+
*/
|
|
24
|
+
export declare const SCORE_PRESET_KEYS: readonly ["gentleMelody", "simpleBeginner", "openingTitle", "slowBuild", "loopableLoop", "callAndResponse", "quietEnding", "singleHook", "verseChorus", "loveSong", "leavingHome", "lateNightDrive", "breakupSong", "crowdSinger", "rainyWindow", "summerDay", "walkingBass", "lockedGroove", "handclapBackbeat", "halfTimeDrop", "drivingEighths", "syncopatedRiff", "triumphant", "menacing", "bittersweet", "playfulDance", "lullaby", "restless", "lonely", "celebration", "chaseScene", "battleTheme", "creditsRoll", "marketScene", "sunriseScene", "ceremonyProcession", "twelveBarShuffle", "improvisedSolo", "fiddleAnswers", "organStabs", "brassStabs", "pedalDrone", "palmMutedRiff", "threeChordRush"];
|
|
25
|
+
export type ScorePresetKey = (typeof SCORE_PRESET_KEYS)[number];
|
|
26
|
+
/** Whether a string is a brief this vocabulary knows. */
|
|
27
|
+
export declare function isScorePresetKey(value: string): value is ScorePresetKey;
|
|
28
|
+
/**
|
|
29
|
+
* What `GET /public/presets` answers.
|
|
30
|
+
*
|
|
31
|
+
* An object rather than a bare array, so the response can gain a field without
|
|
32
|
+
* every client having to be changed on the same day.
|
|
33
|
+
*/
|
|
34
|
+
export declare const scorePresetsResponseSchema: z.ZodObject<{
|
|
35
|
+
presets: z.ZodArray<z.ZodEnum<{
|
|
36
|
+
gentleMelody: "gentleMelody";
|
|
37
|
+
simpleBeginner: "simpleBeginner";
|
|
38
|
+
openingTitle: "openingTitle";
|
|
39
|
+
slowBuild: "slowBuild";
|
|
40
|
+
loopableLoop: "loopableLoop";
|
|
41
|
+
callAndResponse: "callAndResponse";
|
|
42
|
+
quietEnding: "quietEnding";
|
|
43
|
+
singleHook: "singleHook";
|
|
44
|
+
verseChorus: "verseChorus";
|
|
45
|
+
loveSong: "loveSong";
|
|
46
|
+
leavingHome: "leavingHome";
|
|
47
|
+
lateNightDrive: "lateNightDrive";
|
|
48
|
+
breakupSong: "breakupSong";
|
|
49
|
+
crowdSinger: "crowdSinger";
|
|
50
|
+
rainyWindow: "rainyWindow";
|
|
51
|
+
summerDay: "summerDay";
|
|
52
|
+
walkingBass: "walkingBass";
|
|
53
|
+
lockedGroove: "lockedGroove";
|
|
54
|
+
handclapBackbeat: "handclapBackbeat";
|
|
55
|
+
halfTimeDrop: "halfTimeDrop";
|
|
56
|
+
drivingEighths: "drivingEighths";
|
|
57
|
+
syncopatedRiff: "syncopatedRiff";
|
|
58
|
+
triumphant: "triumphant";
|
|
59
|
+
menacing: "menacing";
|
|
60
|
+
bittersweet: "bittersweet";
|
|
61
|
+
playfulDance: "playfulDance";
|
|
62
|
+
lullaby: "lullaby";
|
|
63
|
+
restless: "restless";
|
|
64
|
+
lonely: "lonely";
|
|
65
|
+
celebration: "celebration";
|
|
66
|
+
chaseScene: "chaseScene";
|
|
67
|
+
battleTheme: "battleTheme";
|
|
68
|
+
creditsRoll: "creditsRoll";
|
|
69
|
+
marketScene: "marketScene";
|
|
70
|
+
sunriseScene: "sunriseScene";
|
|
71
|
+
ceremonyProcession: "ceremonyProcession";
|
|
72
|
+
twelveBarShuffle: "twelveBarShuffle";
|
|
73
|
+
improvisedSolo: "improvisedSolo";
|
|
74
|
+
fiddleAnswers: "fiddleAnswers";
|
|
75
|
+
organStabs: "organStabs";
|
|
76
|
+
brassStabs: "brassStabs";
|
|
77
|
+
pedalDrone: "pedalDrone";
|
|
78
|
+
palmMutedRiff: "palmMutedRiff";
|
|
79
|
+
threeChordRush: "threeChordRush";
|
|
80
|
+
}>>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
export type ScorePresetsResponse = z.infer<typeof scorePresetsResponseSchema>;
|
|
83
|
+
//# sourceMappingURL=score-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-presets.d.ts","sourceRoot":"","sources":["../../../src/domain/generation/score-presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB,qrBAmDpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAED;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAErC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The briefs a reader can start a generation from, as ids rather than as text.
|
|
4
|
+
*
|
|
5
|
+
* Which briefs suit which genre is **product data the server owns** — it is
|
|
6
|
+
* served by `GET /public/presets` so it can be retuned without shipping an app,
|
|
7
|
+
* and so two apps offering "the presets for reggae" cannot offer different
|
|
8
|
+
* ones. The *words* stay with the hosts, which is the same division
|
|
9
|
+
* `MusicXmlWarnings` uses and the reason a Chinese reader gets Chinese: a
|
|
10
|
+
* library that held the copy would hold it in one language.
|
|
11
|
+
*
|
|
12
|
+
* The vocabulary itself lives here rather than on the server because both ends
|
|
13
|
+
* need it. The server must not serve a brief no app can name, and each app must
|
|
14
|
+
* be able to prove — offline, in a test — that it has words for every brief it
|
|
15
|
+
* could ever be sent. A list only the server had would make the second
|
|
16
|
+
* impossible, which is exactly how a menu comes to print `openingTitle` at a
|
|
17
|
+
* reader.
|
|
18
|
+
*
|
|
19
|
+
* A brief names a subject and a shape, never a genre: `style` already travels
|
|
20
|
+
* as its own expanded phrase, so a preset that said "reggae" would say it twice
|
|
21
|
+
* and would be wrong the moment it were served under another style. That is
|
|
22
|
+
* what lets one brief be assigned to several genres.
|
|
23
|
+
*/
|
|
24
|
+
export const SCORE_PRESET_KEYS = [
|
|
25
|
+
// Shape and craft
|
|
26
|
+
"gentleMelody",
|
|
27
|
+
"simpleBeginner",
|
|
28
|
+
"openingTitle",
|
|
29
|
+
"slowBuild",
|
|
30
|
+
"loopableLoop",
|
|
31
|
+
"callAndResponse",
|
|
32
|
+
"quietEnding",
|
|
33
|
+
"singleHook",
|
|
34
|
+
// Songs
|
|
35
|
+
"verseChorus",
|
|
36
|
+
"loveSong",
|
|
37
|
+
"leavingHome",
|
|
38
|
+
"lateNightDrive",
|
|
39
|
+
"breakupSong",
|
|
40
|
+
"crowdSinger",
|
|
41
|
+
"rainyWindow",
|
|
42
|
+
"summerDay",
|
|
43
|
+
// Groove
|
|
44
|
+
"walkingBass",
|
|
45
|
+
"lockedGroove",
|
|
46
|
+
"handclapBackbeat",
|
|
47
|
+
"halfTimeDrop",
|
|
48
|
+
"drivingEighths",
|
|
49
|
+
"syncopatedRiff",
|
|
50
|
+
// Character
|
|
51
|
+
"triumphant",
|
|
52
|
+
"menacing",
|
|
53
|
+
"bittersweet",
|
|
54
|
+
"playfulDance",
|
|
55
|
+
"lullaby",
|
|
56
|
+
"restless",
|
|
57
|
+
"lonely",
|
|
58
|
+
"celebration",
|
|
59
|
+
// Scenes
|
|
60
|
+
"chaseScene",
|
|
61
|
+
"battleTheme",
|
|
62
|
+
"creditsRoll",
|
|
63
|
+
"marketScene",
|
|
64
|
+
"sunriseScene",
|
|
65
|
+
"ceremonyProcession",
|
|
66
|
+
// Idioms a genre owns
|
|
67
|
+
"twelveBarShuffle",
|
|
68
|
+
"improvisedSolo",
|
|
69
|
+
"fiddleAnswers",
|
|
70
|
+
"organStabs",
|
|
71
|
+
"brassStabs",
|
|
72
|
+
"pedalDrone",
|
|
73
|
+
"palmMutedRiff",
|
|
74
|
+
"threeChordRush",
|
|
75
|
+
];
|
|
76
|
+
/** Whether a string is a brief this vocabulary knows. */
|
|
77
|
+
export function isScorePresetKey(value) {
|
|
78
|
+
return SCORE_PRESET_KEYS.includes(value);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* What `GET /public/presets` answers.
|
|
82
|
+
*
|
|
83
|
+
* An object rather than a bare array, so the response can gain a field without
|
|
84
|
+
* every client having to be changed on the same day.
|
|
85
|
+
*/
|
|
86
|
+
export const scorePresetsResponseSchema = z.object({
|
|
87
|
+
presets: z.array(z.enum(SCORE_PRESET_KEYS)),
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=score-presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"score-presets.js","sourceRoot":"","sources":["../../../src/domain/generation/score-presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,WAAW;IACX,cAAc;IACd,iBAAiB;IACjB,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,aAAa;IACb,UAAU;IACV,aAAa;IACb,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,aAAa;IACb,WAAW;IACX,SAAS;IACT,aAAa;IACb,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,aAAa;IACb,cAAc;IACd,SAAS;IACT,UAAU;IACV,QAAQ;IACR,aAAa;IACb,SAAS;IACT,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,gBAAgB;IAChB,eAAe;IACf,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,gBAAgB;CACR,CAAC;AAIX,yDAAyD;AACzD,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAC5C,CAAC,CAAC"}
|
|
@@ -5,6 +5,23 @@ export type RankableTrack = {
|
|
|
5
5
|
midiProgram: number;
|
|
6
6
|
clef?: string | undefined;
|
|
7
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* The three General MIDI programs that are a human voice.
|
|
10
|
+
*
|
|
11
|
+
* GM files them under `ensemble`, beside String Ensemble and Orchestra Hit --
|
|
12
|
+
* which is a fair description of Choir Aahs used as a wash, and the wrong one
|
|
13
|
+
* for the part carrying the song. Named here rather than moved to another
|
|
14
|
+
* family because the family is GM's and is right about everything else in it.
|
|
15
|
+
*
|
|
16
|
+
* Exported because the instrument picker offers these three as a group of
|
|
17
|
+
* their own, and a picker that restated the numbers would be a second list to
|
|
18
|
+
* keep in step with this one.
|
|
19
|
+
*
|
|
20
|
+
* `Pad 4 (choir)` (91) is deliberately absent: it says pad in its name and is
|
|
21
|
+
* one. `Lead 6 (voice)` (85) is absent too, already reaching `lead` through
|
|
22
|
+
* `synth-lead`.
|
|
23
|
+
*/
|
|
24
|
+
export declare const VOICE_PROGRAMS: ReadonlySet<number>;
|
|
8
25
|
/** Whether this program is a sung part rather than an instrument. */
|
|
9
26
|
export declare function isVocalProgram(midiProgram: number): boolean;
|
|
10
27
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrangement-order.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/arrangement-order.ts"],"names":[],"mappings":"AA2BA,oFAAoF;AACpF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"arrangement-order.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/arrangement-order.ts"],"names":[],"mappings":"AA2BA,oFAAoF;AACpF,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpE,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAeF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAI7C,CAAC;AAEH,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CAO5D;AAqDD,gDAAgD;AAChD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,SAAS,eAAe,EAAE,CAO5B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAoCV"}
|
|
@@ -43,11 +43,15 @@ const HARMONY_FAMILIES = new Set([
|
|
|
43
43
|
* for the part carrying the song. Named here rather than moved to another
|
|
44
44
|
* family because the family is GM's and is right about everything else in it.
|
|
45
45
|
*
|
|
46
|
+
* Exported because the instrument picker offers these three as a group of
|
|
47
|
+
* their own, and a picker that restated the numbers would be a second list to
|
|
48
|
+
* keep in step with this one.
|
|
49
|
+
*
|
|
46
50
|
* `Pad 4 (choir)` (91) is deliberately absent: it says pad in its name and is
|
|
47
51
|
* one. `Lead 6 (voice)` (85) is absent too, already reaching `lead` through
|
|
48
52
|
* `synth-lead`.
|
|
49
53
|
*/
|
|
50
|
-
const VOICE_PROGRAMS = new Set([
|
|
54
|
+
export const VOICE_PROGRAMS = new Set([
|
|
51
55
|
52, // Choir Aahs
|
|
52
56
|
53, // Voice Oohs
|
|
53
57
|
54, // Synth Voice
|
|
@@ -153,7 +157,7 @@ export function rankTracksForGeneration(tracks, style) {
|
|
|
153
157
|
return index === -1 ? order.length : index;
|
|
154
158
|
};
|
|
155
159
|
/*
|
|
156
|
-
|
|
160
|
+
The singer goes first, ahead of the role order rather than inside it.
|
|
157
161
|
|
|
158
162
|
Two parts can both be leads — a vocal and a guitar — and then role alone
|
|
159
163
|
leaves the order to however the roster happened to be typed. In a song the
|
|
@@ -161,11 +165,23 @@ export function rankTracksForGeneration(tracks, style) {
|
|
|
161
165
|
behind them are written to fit. Ranked by index instead, a guitar listed
|
|
162
166
|
first got composed with no melody to sit under, and the singer then had to
|
|
163
167
|
bend around it.
|
|
168
|
+
|
|
169
|
+
This outranks the genre order, and that is the correction rather than an
|
|
170
|
+
oversight. `GROOVE_FIRST` writes the lead LAST — in reggae the bassline is
|
|
171
|
+
the material and the melody decorates it, which is true of an instrumental
|
|
172
|
+
and inverts the moment somebody is singing over it. In those eleven genres
|
|
173
|
+
every backing part was composed before the voice existed, so the rule that
|
|
174
|
+
tells a part to accompany the singer (`vocalSupportRule` in music_api) had
|
|
175
|
+
no singer to point at and never fired: the arrangement was finished and the
|
|
176
|
+
vocal was bent to fit it, which is exactly backwards.
|
|
177
|
+
|
|
178
|
+
A percussion track is never promoted, whatever its program addresses: on
|
|
179
|
+
the drum channel program 53 is a kit, not a voice.
|
|
164
180
|
*/
|
|
165
181
|
const voiceFirst = (track) => isVocalProgram(track.midiProgram) && track.clef !== "percussion" ? 0 : 1;
|
|
166
182
|
return tracks
|
|
167
183
|
.map((track, index) => ({ index, rank: rankOf(track), voice: voiceFirst(track) }))
|
|
168
|
-
.sort((a, b) => a.
|
|
184
|
+
.sort((a, b) => a.voice - b.voice || a.rank - b.rank || a.index - b.index)
|
|
169
185
|
.map((entry) => entry.index);
|
|
170
186
|
}
|
|
171
187
|
//# sourceMappingURL=arrangement-order.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrangement-order.js","sourceRoot":"","sources":["../../../src/domain/instruments/arrangement-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAYrC;;;;;;GAMG;AACH,MAAM,gBAAgB,GAA0B,IAAI,GAAG,CAAW;IAChE,WAAW;IACX,UAAU;IACV,OAAO;CACR,CAAC,CAAC;AAEH
|
|
1
|
+
{"version":3,"file":"arrangement-order.js","sourceRoot":"","sources":["../../../src/domain/instruments/arrangement-order.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,15 @@ export type InstrumentOption = {
|
|
|
33
33
|
};
|
|
34
34
|
/** The default selection: Piano, which is also the melody-carrying lead. */
|
|
35
35
|
export declare const DEFAULT_INSTRUMENT_VALUE = "0";
|
|
36
|
+
/**
|
|
37
|
+
* The voice a song is carried by, when one is added for the reader.
|
|
38
|
+
*
|
|
39
|
+
* `Voice Oohs` rather than `Choir Aahs`: a lead vocal is one person, and the
|
|
40
|
+
* choir patch is what a *backing* line sounds like. This is the only place the
|
|
41
|
+
* distinction between the three voice programs is stated — everywhere else
|
|
42
|
+
* they are simply "a voice" — so it is stated once, here.
|
|
43
|
+
*/
|
|
44
|
+
export declare const DEFAULT_VOCAL_INSTRUMENT_VALUE = "53";
|
|
36
45
|
/**
|
|
37
46
|
* The `KIT_OPTIONS` value for a program.
|
|
38
47
|
*
|
|
@@ -42,6 +51,29 @@ export declare const DEFAULT_INSTRUMENT_VALUE = "0";
|
|
|
42
51
|
export declare function kitOptionValue(program: number): string;
|
|
43
52
|
/** The eight GM drum kits, for a percussion track. */
|
|
44
53
|
export declare const KIT_OPTIONS: InstrumentOption[];
|
|
54
|
+
/**
|
|
55
|
+
* The three programs that are a human voice, as a group of their own.
|
|
56
|
+
*
|
|
57
|
+
* GM files them under `ensemble`, between String Ensemble and Orchestra Hit,
|
|
58
|
+
* which is where nobody setting out to write a song looks for a singer — so in
|
|
59
|
+
* practice a generated score never had one. The group is *derived* from the set
|
|
60
|
+
* the arranger reads (`VOICE_PROGRAMS`) rather than restating three numbers,
|
|
61
|
+
* because a picker offering a voice the arranger does not recognise as one is
|
|
62
|
+
* exactly the drift that costs a vocal-led arrangement.
|
|
63
|
+
*
|
|
64
|
+
* The default lead goes first and the rest follow in catalogue order: the first
|
|
65
|
+
* entry of a group is the one a reader takes as its ordinary answer, and here
|
|
66
|
+
* that answer is the solo voice.
|
|
67
|
+
*/
|
|
68
|
+
export declare const VOICE_OPTIONS: InstrumentOption[];
|
|
69
|
+
/**
|
|
70
|
+
* Whether a picker value is a sung part.
|
|
71
|
+
*
|
|
72
|
+
* Through the value rather than the program, because `kit:52` addresses a drum
|
|
73
|
+
* kit and a bare number check would read it as a choir — the same confusion
|
|
74
|
+
* `KIT_PREFIX` exists to prevent everywhere else.
|
|
75
|
+
*/
|
|
76
|
+
export declare function isVocalInstrumentValue(value: string): boolean;
|
|
45
77
|
/**
|
|
46
78
|
* Every melodic program, grouped by GM family.
|
|
47
79
|
*
|
|
@@ -50,10 +82,19 @@ export declare const KIT_OPTIONS: InstrumentOption[];
|
|
|
50
82
|
*/
|
|
51
83
|
export declare const INSTRUMENT_OPTIONS: InstrumentOption[];
|
|
52
84
|
/** The same catalogue as nested groups, for a picker that draws its own headings. */
|
|
85
|
+
/**
|
|
86
|
+
* The same catalogue as nested groups, for a picker that draws its own headings.
|
|
87
|
+
*
|
|
88
|
+
* **The voices are not in it**: they are offered as `VOICE_OPTIONS` above, and
|
|
89
|
+
* a program appearing in two groups of one menu is an entry whose selection is
|
|
90
|
+
* ambiguous — the control shows whichever heading it matched first and the
|
|
91
|
+
* reader cannot tell the two apart. `INSTRUMENT_OPTIONS` keeps all 128, because
|
|
92
|
+
* that one is the catalogue rather than a menu.
|
|
93
|
+
*/
|
|
53
94
|
export declare const FAMILY_GROUPS: {
|
|
54
95
|
key: "bass" | "pipe" | "piano" | "chromatic-percussion" | "organ" | "guitar" | "strings" | "ensemble" | "brass" | "reed" | "synth-lead" | "synth-pad" | "synth-effects" | "ethnic" | "percussive" | "sound-effects";
|
|
55
96
|
label: string;
|
|
56
|
-
instruments:
|
|
97
|
+
instruments: import("./gm.js").GmInstrument[];
|
|
57
98
|
}[];
|
|
58
99
|
/** Turns a picker value — from either list — back into track fields. */
|
|
59
100
|
export declare function instrumentChoiceFor(value: string): InstrumentChoice;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-options.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/instrument-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument-options.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/instrument-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAU3C,+EAA+E;AAC/E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,sDAAsD;AACtD,eAAO,MAAM,WAAW,EAAE,gBAAgB,EAGvC,CAAC;AAEJ;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,EAAE,gBAAgB,EAQzC,CAAC;AAEJ;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAOhD,CAAC;AAEF,qFAAqF;AACrF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa;;;;GAMyB,CAAC;AAYpD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAiBnE;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { GM_FAMILIES, GM_FAMILY_LABELS, gmInstrument, gmInstrumentsByFamily, } from "./gm.js";
|
|
2
2
|
import { GM_KITS, gmKit, gmKitAt } from "./gm-kit.js";
|
|
3
|
+
import { VOICE_PROGRAMS, isVocalProgram } from "./arrangement-order.js";
|
|
3
4
|
const KIT_PREFIX = "kit:";
|
|
4
5
|
/** The default selection: Piano, which is also the melody-carrying lead. */
|
|
5
6
|
export const DEFAULT_INSTRUMENT_VALUE = "0";
|
|
7
|
+
/**
|
|
8
|
+
* The voice a song is carried by, when one is added for the reader.
|
|
9
|
+
*
|
|
10
|
+
* `Voice Oohs` rather than `Choir Aahs`: a lead vocal is one person, and the
|
|
11
|
+
* choir patch is what a *backing* line sounds like. This is the only place the
|
|
12
|
+
* distinction between the three voice programs is stated — everywhere else
|
|
13
|
+
* they are simply "a voice" — so it is stated once, here.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_VOCAL_INSTRUMENT_VALUE = "53";
|
|
6
16
|
/**
|
|
7
17
|
* The `KIT_OPTIONS` value for a program.
|
|
8
18
|
*
|
|
@@ -17,6 +27,39 @@ export const KIT_OPTIONS = GM_KITS.map((kit) => ({
|
|
|
17
27
|
value: `${KIT_PREFIX}${kit.program}`,
|
|
18
28
|
label: kit.name,
|
|
19
29
|
}));
|
|
30
|
+
/**
|
|
31
|
+
* The three programs that are a human voice, as a group of their own.
|
|
32
|
+
*
|
|
33
|
+
* GM files them under `ensemble`, between String Ensemble and Orchestra Hit,
|
|
34
|
+
* which is where nobody setting out to write a song looks for a singer — so in
|
|
35
|
+
* practice a generated score never had one. The group is *derived* from the set
|
|
36
|
+
* the arranger reads (`VOICE_PROGRAMS`) rather than restating three numbers,
|
|
37
|
+
* because a picker offering a voice the arranger does not recognise as one is
|
|
38
|
+
* exactly the drift that costs a vocal-led arrangement.
|
|
39
|
+
*
|
|
40
|
+
* The default lead goes first and the rest follow in catalogue order: the first
|
|
41
|
+
* entry of a group is the one a reader takes as its ordinary answer, and here
|
|
42
|
+
* that answer is the solo voice.
|
|
43
|
+
*/
|
|
44
|
+
export const VOICE_OPTIONS = [
|
|
45
|
+
Number(DEFAULT_VOCAL_INSTRUMENT_VALUE),
|
|
46
|
+
...[...VOICE_PROGRAMS].filter((program) => program !== Number(DEFAULT_VOCAL_INSTRUMENT_VALUE)),
|
|
47
|
+
].map((program) => ({
|
|
48
|
+
value: String(program),
|
|
49
|
+
label: gmInstrument(program)?.name ?? "Voice",
|
|
50
|
+
}));
|
|
51
|
+
/**
|
|
52
|
+
* Whether a picker value is a sung part.
|
|
53
|
+
*
|
|
54
|
+
* Through the value rather than the program, because `kit:52` addresses a drum
|
|
55
|
+
* kit and a bare number check would read it as a choir — the same confusion
|
|
56
|
+
* `KIT_PREFIX` exists to prevent everywhere else.
|
|
57
|
+
*/
|
|
58
|
+
export function isVocalInstrumentValue(value) {
|
|
59
|
+
if (value.startsWith(KIT_PREFIX))
|
|
60
|
+
return false;
|
|
61
|
+
return isVocalProgram(Number(value));
|
|
62
|
+
}
|
|
20
63
|
/**
|
|
21
64
|
* Every melodic program, grouped by GM family.
|
|
22
65
|
*
|
|
@@ -29,11 +72,20 @@ export const INSTRUMENT_OPTIONS = GM_FAMILIES.flatMap((family) => gmInstrumentsB
|
|
|
29
72
|
group: GM_FAMILY_LABELS[family],
|
|
30
73
|
})));
|
|
31
74
|
/** The same catalogue as nested groups, for a picker that draws its own headings. */
|
|
75
|
+
/**
|
|
76
|
+
* The same catalogue as nested groups, for a picker that draws its own headings.
|
|
77
|
+
*
|
|
78
|
+
* **The voices are not in it**: they are offered as `VOICE_OPTIONS` above, and
|
|
79
|
+
* a program appearing in two groups of one menu is an entry whose selection is
|
|
80
|
+
* ambiguous — the control shows whichever heading it matched first and the
|
|
81
|
+
* reader cannot tell the two apart. `INSTRUMENT_OPTIONS` keeps all 128, because
|
|
82
|
+
* that one is the catalogue rather than a menu.
|
|
83
|
+
*/
|
|
32
84
|
export const FAMILY_GROUPS = GM_FAMILIES.map((family) => ({
|
|
33
85
|
key: family,
|
|
34
86
|
label: GM_FAMILY_LABELS[family],
|
|
35
|
-
instruments: gmInstrumentsByFamily(family),
|
|
36
|
-
}));
|
|
87
|
+
instruments: gmInstrumentsByFamily(family).filter((instrument) => !isVocalProgram(instrument.program)),
|
|
88
|
+
})).filter((group) => group.instruments.length > 0);
|
|
37
89
|
/**
|
|
38
90
|
* The clef a melodic program is written on.
|
|
39
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-options.js","sourceRoot":"","sources":["../../../src/domain/instruments/instrument-options.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,GACtB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"instrument-options.js","sourceRoot":"","sources":["../../../src/domain/instruments/instrument-options.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -76,6 +76,8 @@ export * from "./domain/instruments/gm-polyphony.js";
|
|
|
76
76
|
export * from "./domain/instruments/gm-transposition.js";
|
|
77
77
|
export * from "./domain/instruments/gm-percussion.js";
|
|
78
78
|
export * from "./domain/generation/style-presets.js";
|
|
79
|
+
export * from "./domain/generation/option-order.js";
|
|
80
|
+
export * from "./domain/generation/score-presets.js";
|
|
79
81
|
export * from "./domain/selection/selection.js";
|
|
80
82
|
export * from "./services/regeneration/controller.js";
|
|
81
83
|
export * from "./domain/commands/history.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -98,6 +98,8 @@ export * from "./domain/instruments/gm-polyphony.js";
|
|
|
98
98
|
export * from "./domain/instruments/gm-transposition.js";
|
|
99
99
|
export * from "./domain/instruments/gm-percussion.js";
|
|
100
100
|
export * from "./domain/generation/style-presets.js";
|
|
101
|
+
export * from "./domain/generation/option-order.js";
|
|
102
|
+
export * from "./domain/generation/score-presets.js";
|
|
101
103
|
export * from "./domain/selection/selection.js";
|
|
102
104
|
export * from "./services/regeneration/controller.js";
|
|
103
105
|
// Absorbed from music_lib: pure, synchronous, dependency-free model code
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,8EAA8E;AAC9E,sEAAsE;AACtE,iEAAiE;AACjE,8EAA8E;AAC9E,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAE5C,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,oBAAoB,CAAC;AAEnC,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAC9E,cAAc,qBAAqB,CAAC;AAEpC,8EAA8E;AAC9E,8DAA8D;AAC9D,8EAA8E;AAE9E,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,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;AAE9C,8EAA8E;AAC9E,iFAAiF;AACjF,8EAA8E;AAE9E,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,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,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,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,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AAEtD,yEAAyE;AACzE,yCAAyC;AACzC,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,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,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,iCAAiC,CAAC;AAChD,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;AACzC;;;GAGG;AACH,cAAc,wCAAwC,CAAC"}
|
|
@@ -31,7 +31,7 @@ export type GenerateScoreRequestTrack = {
|
|
|
31
31
|
* brief can be run through two backends and compared by ear, which became worth
|
|
32
32
|
* doing once the provider was a configuration change rather than a code change.
|
|
33
33
|
*/
|
|
34
|
-
export declare const GENERATION_VARIANTS: readonly ["default", "deepseek", "
|
|
34
|
+
export declare const GENERATION_VARIANTS: readonly ["default", "deepseek", "local"];
|
|
35
35
|
export type GenerationVariant = (typeof GENERATION_VARIANTS)[number];
|
|
36
36
|
/**
|
|
37
37
|
* What to call each one in a picker.
|
|
@@ -93,6 +93,26 @@ export type GenerateScoreRequest = {
|
|
|
93
93
|
* for the two to disagree.
|
|
94
94
|
*/
|
|
95
95
|
lyrics?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* What the words are about, when that is not simply what the piece is about.
|
|
98
|
+
*
|
|
99
|
+
* This field once did not exist on the grounds that `prompt` already says
|
|
100
|
+
* what the piece is, and a second subject line is a place for the two to
|
|
101
|
+
* disagree. What it missed is that they are genuinely different questions:
|
|
102
|
+
* "a slow waltz in D minor" describes the music, and the words over it can be
|
|
103
|
+
* about coming home without the music brief being about coming home.
|
|
104
|
+
*
|
|
105
|
+
* The disagreement is avoided by **replacing rather than adding**: the server
|
|
106
|
+
* has exactly one "the words are about" clause, and this fills it when it is
|
|
107
|
+
* present. Absent or blank, that clause falls back to `prompt` and the lyric
|
|
108
|
+
* is what it always was. `prompt` still reaches the model in its own right, so
|
|
109
|
+
* narrowing the words' subject never hides the piece's brief.
|
|
110
|
+
*
|
|
111
|
+
* Never sent without `lyrics`: `buildGenerateScoreRequest` drops it in the
|
|
112
|
+
* same breath it drops `lyrics` for a roster with nobody to sing, so a theme
|
|
113
|
+
* for a lyric that was not asked for cannot reach the wire.
|
|
114
|
+
*/
|
|
115
|
+
lyricsTheme?: string;
|
|
96
116
|
};
|
|
97
117
|
/** Never a rendered/notation payload and never raw MIDI: always a structured `Score`. */
|
|
98
118
|
export type GenerateScoreResult = {
|
|
@@ -526,6 +546,7 @@ export declare const generateScoreRequestSchema: z.ZodObject<{
|
|
|
526
546
|
}>>;
|
|
527
547
|
variant: z.ZodOptional<z.ZodString>;
|
|
528
548
|
lyrics: z.ZodOptional<z.ZodBoolean>;
|
|
549
|
+
lyricsTheme: z.ZodOptional<z.ZodString>;
|
|
529
550
|
}, z.core.$strip>;
|
|
530
551
|
export declare const generateScoreResultSchema: z.ZodObject<{
|
|
531
552
|
score: z.ZodObject<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/model/generation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,OAAO,KAAK,EACV,KAAK,EACL,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,KAAK,EACL,IAAI,EACL,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../../src/model/generation.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAGpC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;iBAUxC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
package/dist/model/generation.js
CHANGED
|
@@ -20,12 +20,7 @@ import { clefSchema, keySignatureSchema, measureSchema, scoreSchema, timeSignatu
|
|
|
20
20
|
* brief can be run through two backends and compared by ear, which became worth
|
|
21
21
|
* doing once the provider was a configuration change rather than a code change.
|
|
22
22
|
*/
|
|
23
|
-
export const GENERATION_VARIANTS = [
|
|
24
|
-
"default",
|
|
25
|
-
"deepseek",
|
|
26
|
-
"weak",
|
|
27
|
-
"local",
|
|
28
|
-
];
|
|
23
|
+
export const GENERATION_VARIANTS = ["default", "deepseek", "local"];
|
|
29
24
|
/**
|
|
30
25
|
* What to call each one in a picker.
|
|
31
26
|
*
|
|
@@ -34,9 +29,15 @@ export const GENERATION_VARIANTS = [
|
|
|
34
29
|
* the old set.
|
|
35
30
|
*/
|
|
36
31
|
export const GENERATION_VARIANT_LABELS = {
|
|
37
|
-
|
|
32
|
+
/*
|
|
33
|
+
Named after the provider it reaches, not after its position in the list.
|
|
34
|
+
|
|
35
|
+
"Default" told a reader only that it was the one already selected, which is
|
|
36
|
+
a fact about the picker; what they are choosing between is which company's
|
|
37
|
+
model writes the music.
|
|
38
|
+
*/
|
|
39
|
+
default: "Open AI",
|
|
38
40
|
deepseek: "DeepSeek",
|
|
39
|
-
weak: "Cheap model",
|
|
40
41
|
/*
|
|
41
42
|
A model running on the machine, served by LM Studio through ShapeShyft.
|
|
42
43
|
|
|
@@ -102,6 +103,7 @@ export const generateScoreRequestSchema = z.object({
|
|
|
102
103
|
// than trusted: see `GenerateScoreRequest.variant`.
|
|
103
104
|
variant: z.string().optional(),
|
|
104
105
|
lyrics: z.boolean().optional(),
|
|
106
|
+
lyricsTheme: z.string().optional(),
|
|
105
107
|
});
|
|
106
108
|
export const generateScoreResultSchema = z.object({
|
|
107
109
|
score: scoreSchema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/model/generation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAuBtB;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/model/generation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED