@sudobility/music_types 0.13.17 → 0.13.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CLAUDE.md +7 -3
  2. package/dist/domain/commands/clipboard-commands.d.ts +41 -0
  3. package/dist/domain/commands/clipboard-commands.d.ts.map +1 -0
  4. package/dist/domain/commands/clipboard-commands.js +246 -0
  5. package/dist/domain/commands/clipboard-commands.js.map +1 -0
  6. package/dist/domain/generation/replacement-region.d.ts.map +1 -1
  7. package/dist/domain/generation/replacement-region.js +3 -0
  8. package/dist/domain/generation/replacement-region.js.map +1 -1
  9. package/dist/domain/generation/style-presets.d.ts +34 -0
  10. package/dist/domain/generation/style-presets.d.ts.map +1 -0
  11. package/dist/domain/generation/style-presets.js +274 -0
  12. package/dist/domain/generation/style-presets.js.map +1 -0
  13. package/dist/domain/instruments/arrangement-order.d.ts +13 -0
  14. package/dist/domain/instruments/arrangement-order.d.ts.map +1 -1
  15. package/dist/domain/instruments/arrangement-order.js +51 -6
  16. package/dist/domain/instruments/arrangement-order.js.map +1 -1
  17. package/dist/domain/notation/music-vocabulary.d.ts +36 -0
  18. package/dist/domain/notation/music-vocabulary.d.ts.map +1 -1
  19. package/dist/domain/notation/music-vocabulary.js +41 -0
  20. package/dist/domain/notation/music-vocabulary.js.map +1 -1
  21. package/dist/domain/notation/notation-icon-art.d.ts +10 -10
  22. package/dist/domain/notation/notation-icon-art.d.ts.map +1 -1
  23. package/dist/domain/notation/notation-icon-art.js +850 -817
  24. package/dist/domain/notation/notation-icon-art.js.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/model/generation.d.ts +42 -1
  30. package/dist/model/generation.d.ts.map +1 -1
  31. package/dist/model/generation.js +34 -1
  32. package/dist/model/generation.js.map +1 -1
  33. package/package.json +1 -1
@@ -0,0 +1,274 @@
1
+ import { measuresForSeconds, SONG_SECONDS, } from "../notation/music-vocabulary.js";
2
+ /**
3
+ * The keyword values the generation prompt parser branches on.
4
+ *
5
+ * These are shared product data: the app offers them, and the backend needs to
6
+ * know that every offered prompt phrase has genre mechanics.
7
+ */
8
+ const GENERATE_SCORE_STYLE_KEYS = [
9
+ "waltz",
10
+ "jazz",
11
+ "pop",
12
+ "cinematic",
13
+ "ambient",
14
+ "battle",
15
+ "rock",
16
+ "punk",
17
+ "heavyMetal",
18
+ "blues",
19
+ "country",
20
+ "bluegrass",
21
+ "funk",
22
+ "soul",
23
+ "ragtime",
24
+ "swing",
25
+ "bossaNova",
26
+ "samba",
27
+ "salsa",
28
+ "tango",
29
+ "reggae",
30
+ "hipHop",
31
+ "trap",
32
+ "lofi",
33
+ "house",
34
+ "techno",
35
+ "trance",
36
+ "edm",
37
+ "electroSwing",
38
+ "disco",
39
+ "classical",
40
+ "baroque",
41
+ "march",
42
+ ];
43
+ export const GENERATE_SCORE_STYLE_OPTIONS = GENERATE_SCORE_STYLE_KEYS;
44
+ const KIT = "kit:0";
45
+ const STYLE_PRESET_SOURCE = {
46
+ waltz: {
47
+ prompt: 'waltz — a lilting three-four with the weight on beat one and a light "oom-pah-pah" accompaniment',
48
+ instruments: ["0", "48", "43"],
49
+ tempo: 160,
50
+ timeSignature: "3/4",
51
+ },
52
+ jazz: {
53
+ prompt: "jazz — swung eighth notes, walking bass, extended chords, and a melody that phrases across the barline rather than sitting on the beat",
54
+ instruments: ["66", "0", "32", KIT],
55
+ tempo: 132,
56
+ timeSignature: "4/4",
57
+ },
58
+ pop: {
59
+ prompt: "pop — a clear singable hook, four-bar phrases, a backbeat on two and four, and space between the phrases",
60
+ instruments: ["0", "27", "33", KIT],
61
+ tempo: 120,
62
+ timeSignature: "4/4",
63
+ },
64
+ cinematic: {
65
+ prompt: "cinematic orchestral — long sustained lines that build, a rising dynamic arc, and rhythm that serves the swell rather than a groove",
66
+ instruments: ["48", "40", "42", "60", "47"],
67
+ tempo: 90,
68
+ timeSignature: "4/4",
69
+ mode: "minor",
70
+ },
71
+ ambient: {
72
+ prompt: "ambient — slow evolving pads, very long note values, no strong pulse, and silence used as a voice",
73
+ instruments: ["89", "0", "48"],
74
+ tempo: 70,
75
+ timeSignature: "4/4",
76
+ },
77
+ battle: {
78
+ prompt: "driving battle music — insistent ostinato, hard accents, brass stabs against a relentless low pulse",
79
+ instruments: ["61", "48", "47", KIT],
80
+ tempo: 150,
81
+ timeSignature: "4/4",
82
+ mode: "minor",
83
+ },
84
+ rock: {
85
+ prompt: "rock — a hard backbeat on two and four, power-chord riffing, and a bass locked to the kick",
86
+ instruments: ["29", "27", "33", KIT],
87
+ tempo: 128,
88
+ timeSignature: "4/4",
89
+ },
90
+ punk: {
91
+ prompt: "punk — fast straight eighths on downstrokes, three chords, no ornament, and a snare driving every backbeat. The guitar figure repeats unchanged through a section; the energy comes from the tempo and the drive, never from varying the part.",
92
+ instruments: ["30", "29", "34", KIT],
93
+ tempo: 180,
94
+ timeSignature: "4/4",
95
+ },
96
+ heavyMetal: {
97
+ prompt: "heavy metal — built on ONE palm-muted galloping low riff, repeated bar after bar through a section rather than rewritten each bar; minor and modal, double-kick drive underneath, and long held high notes over the top. The riff is the song: keep it the same and let the drums and the held lead supply the variation. ONE riff means one FIGURE, not one note - the riff moves between several pitches (root, flat-7, flat-6 and back is the classic shape), and a bar of the same pitch struck eight times is a pedal, not a riff.",
98
+ instruments: ["30", "29", "34", KIT],
99
+ tempo: 152,
100
+ timeSignature: "4/4",
101
+ mode: "minor",
102
+ },
103
+ blues: {
104
+ formBars: 12,
105
+ prompt: "twelve-bar blues — shuffle feel, blue notes and bends, call-and-response between a voice-like melody and answering fills, dominant seventh chords",
106
+ instruments: ["27", "22", "33", KIT],
107
+ tempo: 88,
108
+ timeSignature: "4/4",
109
+ },
110
+ country: {
111
+ prompt: 'country — a two-beat "boom-chick" bass and guitar, bright major harmony, fiddle and steel fills answering the melody',
112
+ instruments: ["25", "110", "27", "32", KIT],
113
+ tempo: 118,
114
+ timeSignature: "4/4",
115
+ },
116
+ bluegrass: {
117
+ prompt: "bluegrass — fast acoustic picking, banjo rolls in constant eighths under a syncopated fiddle melody, driving upright bass on one and three",
118
+ instruments: ["105", "110", "25", "32"],
119
+ tempo: 160,
120
+ timeSignature: "4/4",
121
+ },
122
+ funk: {
123
+ prompt: "funk — heavily syncopated sixteenth-note groove, everything locked to a hard downbeat on the one, staccato stabs and plenty of rests",
124
+ instruments: ["36", "28", "61", "4", KIT],
125
+ tempo: 104,
126
+ timeSignature: "4/4",
127
+ },
128
+ soul: {
129
+ prompt: "soul — a laid-back backbeat sitting slightly behind the beat, gospel-tinged chords, horn stabs answering a vocal-style melody",
130
+ instruments: ["16", "4", "33", "61", KIT],
131
+ tempo: 96,
132
+ timeSignature: "4/4",
133
+ },
134
+ ragtime: {
135
+ formBars: 16,
136
+ prompt: "ragtime — a syncopated right-hand melody against a steady striding left-hand bass in two, cheerful and precise",
137
+ instruments: ["0"],
138
+ tempo: 96,
139
+ timeSignature: "2/4",
140
+ },
141
+ swing: {
142
+ prompt: "big-band swing — swung eighth notes, brass and reed sections trading riffs, walking bass, ride-cymbal pulse with accents on two and four",
143
+ instruments: ["56", "66", "57", "0", "32", KIT],
144
+ tempo: 168,
145
+ timeSignature: "4/4",
146
+ },
147
+ bossaNova: {
148
+ prompt: "bossa nova — a gentle syncopated guitar pattern, soft brushed drums, a lyrical melody sitting behind the beat, rich seventh and ninth chords",
149
+ instruments: ["24", "0", "32", KIT],
150
+ tempo: 132,
151
+ timeSignature: "4/4",
152
+ },
153
+ samba: {
154
+ prompt: "samba — fast two-beat percussion-driven groove, heavy syncopation on the offbeats, surdo pulse landing on beat two",
155
+ instruments: ["24", "61", "32", KIT],
156
+ tempo: 100,
157
+ timeSignature: "2/4",
158
+ },
159
+ salsa: {
160
+ prompt: "salsa — clave-driven, a montuno piano ostinato, syncopated brass hits, busy percussion, bass playing the tumbao rather than the downbeat",
161
+ instruments: ["0", "56", "57", "32", KIT],
162
+ tempo: 190,
163
+ timeSignature: "4/4",
164
+ },
165
+ tango: {
166
+ prompt: "tango — sharp dotted rhythms and dramatic accents, minor key, sudden stops and rubato pulls against a strict pulse",
167
+ instruments: ["23", "40", "0", "43"],
168
+ tempo: 120,
169
+ timeSignature: "4/4",
170
+ mode: "minor",
171
+ },
172
+ reggae: {
173
+ prompt: "reggae — one-drop: the kick lands on beat three, not one; guitar and organ chop the offbeat eighths; bass plays a heavy melodic line, low and sparse",
174
+ instruments: ["28", "18", "33", KIT],
175
+ tempo: 78,
176
+ timeSignature: "4/4",
177
+ },
178
+ hipHop: {
179
+ prompt: "hip-hop — a hard boom-bap drum pattern with swung sixteenths, a deep sustained sub bass, sparse looping keys, and space left for a vocal",
180
+ instruments: ["39", "4", "48", KIT],
181
+ tempo: 90,
182
+ timeSignature: "4/4",
183
+ mode: "minor",
184
+ },
185
+ trap: {
186
+ prompt: "trap — half-time: the snare lands on beat three alone, an 808 sub bass slides between long tuned notes, and hi-hats roll in fast subdivisions over large gaps",
187
+ instruments: ["38", "11", "89", KIT],
188
+ tempo: 140,
189
+ timeSignature: "4/4",
190
+ mode: "minor",
191
+ },
192
+ lofi: {
193
+ prompt: "lo-fi hip-hop — slow swung drums slightly off the grid, warm jazzy minor seventh chords, a sparse melody, unhurried and repetitive",
194
+ instruments: ["4", "33", "89", KIT],
195
+ tempo: 74,
196
+ timeSignature: "4/4",
197
+ mode: "minor",
198
+ },
199
+ house: {
200
+ prompt: "house — four-on-the-floor kick, offbeat open hats, a repetitive synth riff, and a bassline locked to the eighths between the kicks",
201
+ instruments: ["81", "38", "89", KIT],
202
+ tempo: 126,
203
+ timeSignature: "4/4",
204
+ },
205
+ techno: {
206
+ prompt: "techno — machine-like and loop-based: four-on-the-floor kick, sixteenth-note hats, one short synth-bass cell repeated, and timbre rather than chord changes carrying the track",
207
+ instruments: ["38", "81", "89", KIT],
208
+ tempo: 132,
209
+ timeSignature: "4/4",
210
+ mode: "minor",
211
+ },
212
+ trance: {
213
+ prompt: "trance — four-on-the-floor with an offbeat synth bass after every kick, supersaw arpeggios, and long builds and releases in sixteen-bar blocks",
214
+ instruments: ["81", "38", "89", KIT],
215
+ tempo: 138,
216
+ timeSignature: "4/4",
217
+ mode: "minor",
218
+ },
219
+ edm: {
220
+ prompt: "edm — electronic dance built on a clear build, drop and breakdown in eight-bar blocks, four-on-the-floor underneath and a big repeated lead hook through the drop",
221
+ instruments: ["81", "38", "89", KIT],
222
+ tempo: 128,
223
+ timeSignature: "4/4",
224
+ mode: "minor",
225
+ },
226
+ electroSwing: {
227
+ prompt: "electro swing — vintage swing horns over a modern four-on-the-floor electronic beat, minor and bluesy in a gypsy-jazz vein; hard-swung eighths, syncopated and playful, with clarinet and trumpet riffs answering each other",
228
+ instruments: ["56", "71", "38", KIT],
229
+ tempo: 122,
230
+ timeSignature: "4/4",
231
+ mode: "minor",
232
+ },
233
+ disco: {
234
+ prompt: "disco — four-on-the-floor kick, offbeat hi-hats, an octave-jumping bassline, and string and guitar figures on the sixteenths",
235
+ instruments: ["48", "28", "33", KIT],
236
+ tempo: 120,
237
+ timeSignature: "4/4",
238
+ },
239
+ classical: {
240
+ prompt: "classical — balanced four-bar phrases answering each other, an Alberti or broken-chord accompaniment under a clear diatonic melody, and a cadence every four or eight bars",
241
+ instruments: ["0", "40", "42"],
242
+ tempo: 108,
243
+ timeSignature: "4/4",
244
+ },
245
+ baroque: {
246
+ prompt: "baroque — a steady walking bass, contrapuntal interweaving voices, sequences and ornamented melodic lines, terraced dynamics",
247
+ instruments: ["6", "40", "42"],
248
+ tempo: 100,
249
+ timeSignature: "4/4",
250
+ },
251
+ march: {
252
+ prompt: "march — a firm two-beat pulse, dotted fanfare rhythms, a brass melody over a low oom-pah, crisp snare figures",
253
+ instruments: ["56", "57", "58", KIT],
254
+ tempo: 116,
255
+ timeSignature: "2/4",
256
+ },
257
+ };
258
+ /**
259
+ * The styles, each with the bars its own tempo and meter need for a song.
260
+ */
261
+ export const GENERATE_SCORE_STYLE_PRESETS = Object.fromEntries(Object.entries(STYLE_PRESET_SOURCE).map(([style, preset]) => [
262
+ style,
263
+ {
264
+ ...preset,
265
+ measures: measuresForSeconds(preset.seconds ?? SONG_SECONDS.typical, preset.tempo, beatsPerBarOf(preset.timeSignature), preset.formBars),
266
+ },
267
+ ]));
268
+ /** Beats in a bar, from a picker value like "6/8". */
269
+ function beatsPerBarOf(timeSignature) {
270
+ const [numerator] = timeSignature.split("/");
271
+ const beats = Number(numerator);
272
+ return Number.isFinite(beats) && beats > 0 ? beats : 4;
273
+ }
274
+ //# sourceMappingURL=style-presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-presets.js","sourceRoot":"","sources":["../../../src/domain/generation/style-presets.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,19 @@ export type RankableTrack = {
5
5
  midiProgram: number;
6
6
  clef?: string | undefined;
7
7
  };
8
+ /** Whether this program is a sung part rather than an instrument. */
9
+ export declare function isVocalProgram(midiProgram: number): boolean;
10
+ /**
11
+ * A voice carries the tune, and the ambiguity is resolved in its favour.
12
+ *
13
+ * Choir Aahs held under a chorus is genuinely harmony, and nothing in a program
14
+ * number can tell that from a sung melody -- so this is a judgement about which
15
+ * mistake costs more. Read as harmony, a vocal part is written as filler around
16
+ * a tune chosen without it, and -- worse -- `mustBreathe` covers `lead` alone,
17
+ * so the one part that physically CANNOT run sixteen unbroken bars was the one
18
+ * part never asked to rest. Read as lead, a choir pad collects a finding asking
19
+ * it to breathe, which costs one retry and is not even wrong.
20
+ */
8
21
  export declare function roleOf(track: RankableTrack): ArrangementRole;
9
22
  /** The role order this style is arranged in. */
10
23
  export declare function roleOrderForStyle(style: string | undefined): readonly ArrangementRole[];
@@ -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;AAeF,wBAAgB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CAM5D;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,CAYV"}
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;AAiCF,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,CAwBV"}
@@ -35,9 +35,43 @@ const HARMONY_FAMILIES = new Set([
35
35
  "ensemble",
36
36
  "organ",
37
37
  ]);
38
+ /**
39
+ * The three General MIDI programs that are a human voice.
40
+ *
41
+ * GM files them under `ensemble`, beside String Ensemble and Orchestra Hit --
42
+ * which is a fair description of Choir Aahs used as a wash, and the wrong one
43
+ * for the part carrying the song. Named here rather than moved to another
44
+ * family because the family is GM's and is right about everything else in it.
45
+ *
46
+ * `Pad 4 (choir)` (91) is deliberately absent: it says pad in its name and is
47
+ * one. `Lead 6 (voice)` (85) is absent too, already reaching `lead` through
48
+ * `synth-lead`.
49
+ */
50
+ const VOICE_PROGRAMS = new Set([
51
+ 52, // Choir Aahs
52
+ 53, // Voice Oohs
53
+ 54, // Synth Voice
54
+ ]);
55
+ /** Whether this program is a sung part rather than an instrument. */
56
+ export function isVocalProgram(midiProgram) {
57
+ return VOICE_PROGRAMS.has(midiProgram);
58
+ }
59
+ /**
60
+ * A voice carries the tune, and the ambiguity is resolved in its favour.
61
+ *
62
+ * Choir Aahs held under a chorus is genuinely harmony, and nothing in a program
63
+ * number can tell that from a sung melody -- so this is a judgement about which
64
+ * mistake costs more. Read as harmony, a vocal part is written as filler around
65
+ * a tune chosen without it, and -- worse -- `mustBreathe` covers `lead` alone,
66
+ * so the one part that physically CANNOT run sixteen unbroken bars was the one
67
+ * part never asked to rest. Read as lead, a choir pad collects a finding asking
68
+ * it to breathe, which costs one retry and is not even wrong.
69
+ */
38
70
  export function roleOf(track) {
39
71
  if (track.clef === "percussion")
40
72
  return "drums";
73
+ if (isVocalProgram(track.midiProgram))
74
+ return "lead";
41
75
  const family = gmFamilyOf(track.midiProgram);
42
76
  if (family === "bass")
43
77
  return "bass";
@@ -67,9 +101,9 @@ const DEFAULT_ORDER = [
67
101
  *
68
102
  * In reggae the bassline *is* the tune — the "riddim" is named and reused
69
103
  * across songs while melodies come and go — and the same is true of funk, hip
70
- * hop, house and disco, where the groove is the material and the melody
71
- * decorates it. Writing a melody first in those styles produces a bass that is
72
- * following a tune instead of stating the hook.
104
+ * hop, trap, house, techno, trance, EDM and disco, where the groove is the
105
+ * material and the melody decorates it. Writing a melody first in those styles
106
+ * produces a bass that is following a tune instead of stating the hook.
73
107
  */
74
108
  const GROOVE_FIRST = [
75
109
  "bass",
@@ -77,7 +111,7 @@ const GROOVE_FIRST = [
77
111
  "harmony",
78
112
  "lead",
79
113
  ];
80
- const GROOVE_LED = /\b(reggae|ska|dub|funk|disco|house|hip hop|hip-hop|lofi|lo-fi|soul|samba|salsa|bossa|tango|afrobeat)\b/i;
114
+ const GROOVE_LED = /\b(reggae|ska|dub|funk|disco|house|techno|trance|edm|electronic dance|hip hop|hip-hop|trap|lofi|lo-fi|soul|samba|salsa|bossa|tango|afrobeat)\b/i;
81
115
  /**
82
116
  * Genres built on a riff, where the riff is a lead part and goes first anyway —
83
117
  * but the kit is promoted above the harmony, because in these styles the drums
@@ -118,9 +152,20 @@ export function rankTracksForGeneration(tracks, style) {
118
152
  // answers -1, and -1 in front of "lead" would silently promote it.
119
153
  return index === -1 ? order.length : index;
120
154
  };
155
+ /*
156
+ Among leads, the singer goes first.
157
+
158
+ Two parts can both be leads — a vocal and a guitar — and then role alone
159
+ leaves the order to however the roster happened to be typed. In a song the
160
+ answer is not arbitrary: the words and the tune ARE the song, and the parts
161
+ behind them are written to fit. Ranked by index instead, a guitar listed
162
+ first got composed with no melody to sit under, and the singer then had to
163
+ bend around it.
164
+ */
165
+ const voiceFirst = (track) => isVocalProgram(track.midiProgram) && track.clef !== "percussion" ? 0 : 1;
121
166
  return tracks
122
- .map((track, index) => ({ index, rank: rankOf(track) }))
123
- .sort((a, b) => a.rank - b.rank || a.index - b.index)
167
+ .map((track, index) => ({ index, rank: rankOf(track), voice: voiceFirst(track) }))
168
+ .sort((a, b) => a.rank - b.rank || a.voice - b.voice || a.index - b.index)
124
169
  .map((entry) => entry.index);
125
170
  }
126
171
  //# 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,MAAM,UAAU,MAAM,CAAC,KAAoB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,OAAO,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,aAAa,GAA+B;IAChD,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;CACR,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,YAAY,GAA+B;IAC/C,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,GACd,yGAAyG,CAAC;AAE5G;;;;GAIG;AACH,MAAM,QAAQ,GAAG,sDAAsD,CAAC;AAExE,MAAM,UAAU,GAA+B;IAC7C,MAAM;IACN,MAAM;IACN,OAAO;IACP,SAAS;CACV,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,iBAAiB,CAC/B,KAAyB;IAEzB,IAAI,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IACjC,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IAChD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAgC,EAChC,KAAc;IAEd,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAU,EAAE;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,wEAAwE;QACxE,mEAAmE;QACnE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC;IACF,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"arrangement-order.js","sourceRoot":"","sources":["../../../src/domain/instruments/arrangement-order.ts"],"names":[],"mappings":"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"}
@@ -102,4 +102,40 @@ export declare function pitchAtStavePosition(clef: Clef, positionsBelowTopLine:
102
102
  * moment to stop transcribing.
103
103
  */
104
104
  export declare function panReadout(value: number): string;
105
+ /**
106
+ * How long a song should be, in seconds.
107
+ *
108
+ * A generated piece was 16 bars — about thirty seconds at an ordinary tempo,
109
+ * and a fragment rather than a song. These are the lengths a listener expects
110
+ * of one: under three minutes reads as a demo, over five outstays a verse-chorus
111
+ * form unless something else is happening.
112
+ *
113
+ * Stated in SECONDS rather than bars because a bar is not a unit of time: 16
114
+ * bars is 31 seconds of metal at 152bpm and 46 seconds of ballad at 84, so a
115
+ * bar count fixed across styles produces a different piece of music every time
116
+ * the tempo changes. The bar count is derived — see `measuresForSeconds`.
117
+ */
118
+ export declare const SONG_SECONDS: {
119
+ readonly min: 180;
120
+ readonly typical: 210;
121
+ readonly max: 300;
122
+ };
123
+ /**
124
+ * Bars needed to fill `seconds` at this tempo and meter.
125
+ *
126
+ * The inverse of the arithmetic that made a 32-bar "song" last 1:31 — 32 bars
127
+ * of 4 beats at 84bpm. Rounded to a whole number of FOUR-bar groups, because
128
+ * musical form is built in fours and a 63-bar song has a bar of nowhere in it;
129
+ * and never less than one group, so a very slow piece still gets a phrase.
130
+ */
131
+ export declare function measuresForSeconds(seconds: number, bpm: number, beatsPerBar: number,
132
+ /**
133
+ * The genre's form, in bars, that the length must be a whole number of.
134
+ *
135
+ * Four by default, because musical form is built in fours and a 63-bar song
136
+ * has a bar of nowhere in it. Some genres ARE a length: a blues is twelve
137
+ * bars and a rag sixteen, so a blues rounded to fours comes out at 76 — six
138
+ * choruses and a third of one, which is not a blues.
139
+ */
140
+ groupBars?: number): number;
105
141
  //# sourceMappingURL=music-vocabulary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"music-vocabulary.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAOxB,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAA6B,YAAY,EAAE,CAAC;AAuBvE,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAyCD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAI1D;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CASD;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CA2BzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAef;AAuBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,qBAAqB,EAAE,MAAM,GAC5B,KAAK,CAEP;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD"}
1
+ {"version":3,"file":"music-vocabulary.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAOxB,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAA6B,YAAY,EAAE,CAAC;AAuBvE,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAyCD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAI1D;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CASD;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CA2BzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAef;AAuBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,qBAAqB,EAAE,MAAM,GAC5B,KAAK,CAEP;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM;AACnB;;;;;;;GAOG;AACH,SAAS,SAAI,GACZ,MAAM,CAKR"}
@@ -218,4 +218,45 @@ export function panReadout(value) {
218
218
  return "C";
219
219
  return `${value < 0 ? "L" : "R"}${amount}`;
220
220
  }
221
+ /**
222
+ * How long a song should be, in seconds.
223
+ *
224
+ * A generated piece was 16 bars — about thirty seconds at an ordinary tempo,
225
+ * and a fragment rather than a song. These are the lengths a listener expects
226
+ * of one: under three minutes reads as a demo, over five outstays a verse-chorus
227
+ * form unless something else is happening.
228
+ *
229
+ * Stated in SECONDS rather than bars because a bar is not a unit of time: 16
230
+ * bars is 31 seconds of metal at 152bpm and 46 seconds of ballad at 84, so a
231
+ * bar count fixed across styles produces a different piece of music every time
232
+ * the tempo changes. The bar count is derived — see `measuresForSeconds`.
233
+ */
234
+ export const SONG_SECONDS = {
235
+ min: 180,
236
+ typical: 210,
237
+ max: 300,
238
+ };
239
+ /**
240
+ * Bars needed to fill `seconds` at this tempo and meter.
241
+ *
242
+ * The inverse of the arithmetic that made a 32-bar "song" last 1:31 — 32 bars
243
+ * of 4 beats at 84bpm. Rounded to a whole number of FOUR-bar groups, because
244
+ * musical form is built in fours and a 63-bar song has a bar of nowhere in it;
245
+ * and never less than one group, so a very slow piece still gets a phrase.
246
+ */
247
+ export function measuresForSeconds(seconds, bpm, beatsPerBar,
248
+ /**
249
+ * The genre's form, in bars, that the length must be a whole number of.
250
+ *
251
+ * Four by default, because musical form is built in fours and a 63-bar song
252
+ * has a bar of nowhere in it. Some genres ARE a length: a blues is twelve
253
+ * bars and a rag sixteen, so a blues rounded to fours comes out at 76 — six
254
+ * choruses and a third of one, which is not a blues.
255
+ */
256
+ groupBars = 4) {
257
+ const group = Math.max(1, Math.floor(groupBars));
258
+ const beats = (seconds * bpm) / 60;
259
+ const bars = beats / Math.max(1, beatsPerBar);
260
+ return Math.max(group, Math.round(bars / group) * group);
261
+ }
221
262
  //# sourceMappingURL=music-vocabulary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"music-vocabulary.js","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"music-vocabulary.js","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,8 @@
19
19
  /** Every glyph is authored in a 24×24 box. */
20
20
  export declare const NOTATION_ICON_VIEWBOX = 24;
21
21
  /** A stroke cap/join, spelled as SVG spells it. */
22
- export type NotationLineCap = "butt" | "round" | "square";
23
- export type NotationLineJoin = "miter" | "round" | "bevel";
22
+ export type NotationLineCap = 'butt' | 'round' | 'square';
23
+ export type NotationLineJoin = 'miter' | 'round' | 'bevel';
24
24
  type Paint = {
25
25
  readonly fill?: string;
26
26
  readonly stroke?: string;
@@ -32,29 +32,29 @@ type Paint = {
32
32
  readonly transform?: string;
33
33
  };
34
34
  export type NotationIconShape = (Paint & {
35
- readonly kind: "path";
35
+ readonly kind: 'path';
36
36
  readonly d: string;
37
- readonly fillRule?: "evenodd" | "nonzero";
37
+ readonly fillRule?: 'evenodd' | 'nonzero';
38
38
  }) | (Paint & {
39
- readonly kind: "rect";
39
+ readonly kind: 'rect';
40
40
  readonly x: number;
41
41
  readonly y: number;
42
42
  readonly width: number;
43
43
  readonly height: number;
44
44
  readonly rx?: number;
45
45
  }) | (Paint & {
46
- readonly kind: "ellipse";
46
+ readonly kind: 'ellipse';
47
47
  readonly cx: number;
48
48
  readonly cy: number;
49
49
  readonly rx: number;
50
50
  readonly ry: number;
51
51
  }) | (Paint & {
52
- readonly kind: "circle";
52
+ readonly kind: 'circle';
53
53
  readonly cx: number;
54
54
  readonly cy: number;
55
55
  readonly r: number;
56
56
  }) | (Paint & {
57
- readonly kind: "text";
57
+ readonly kind: 'text';
58
58
  readonly x: number;
59
59
  readonly y: number;
60
60
  readonly content: string;
@@ -62,7 +62,7 @@ export type NotationIconShape = (Paint & {
62
62
  readonly fontStyle?: string;
63
63
  readonly textAnchor?: string;
64
64
  }) | (Paint & {
65
- readonly kind: "group";
65
+ readonly kind: 'group';
66
66
  readonly shapes: readonly NotationIconShape[];
67
67
  });
68
68
  /**
@@ -71,7 +71,7 @@ export type NotationIconShape = (Paint & {
71
71
  * A union has no runtime form, so anything that must *validate* a name would
72
72
  * otherwise write the list out again.
73
73
  */
74
- export declare const NOTATION_ICON_NAMES: readonly ["AddMeasureIcon", "ArpeggioIcon", "ArticulationIcon", "BeamBreakIcon", "BeamNoneIcon", "ChordIcon", "ContinuousLayoutIcon", "CrescendoIcon", "DeleteMeasureIcon", "DiminuendoIcon", "DottedIcon", "DoubleFlatIcon", "DoubleSharpIcon", "EighthNoteIcon", "FermataIcon", "FlatIcon", "GoToStartIcon", "HalfNoteIcon", "InsertModeIcon", "InsertNoteIcon", "InsertRestIcon", "MetronomeIcon", "NaturalIcon", "NextMeasureIcon", "OrnamentIcon", "PageLayoutIcon", "PreviousMeasureIcon", "QuantizeIcon", "QuarterNoteIcon", "ReplaceModeIcon", "SelectAllIcon", "SharpIcon", "SixteenthNoteIcon", "SlurIcon", "SoloIcon", "SunMoonIcon", "ThirtySecondNoteIcon", "TieIcon", "TripletIcon", "WholeNoteIcon"];
74
+ export declare const NOTATION_ICON_NAMES: readonly ["AddMeasureIcon", "ArpeggioIcon", "ArticulationIcon", "BeamBreakIcon", "BeamNoneIcon", "ChordIcon", "ContinuousLayoutIcon", "CrescendoIcon", "DeleteMeasureIcon", "DiminuendoIcon", "DottedIcon", "DoubleFlatIcon", "DoubleSharpIcon", "EighthNoteIcon", "FermataIcon", "FlatIcon", "GoToStartIcon", "HalfNoteIcon", "InsertModeIcon", "InsertNoteIcon", "InsertRestIcon", "MetronomeIcon", "NaturalIcon", "NextMeasureIcon", "OrnamentIcon", "PageLayoutIcon", "PianoKeysIcon", "PreviousMeasureIcon", "QuantizeIcon", "QuarterNoteIcon", "ReplaceModeIcon", "SelectAllIcon", "SharpIcon", "SixteenthNoteIcon", "SlurIcon", "SoloIcon", "SunMoonIcon", "ThirtySecondNoteIcon", "TieIcon", "TripletIcon", "WholeNoteIcon"];
75
75
  export type NotationIconName = (typeof NOTATION_ICON_NAMES)[number];
76
76
  /**
77
77
  * A record, never a parallel array: adding a name above fails to compile until
@@ -1 +1 @@
1
- {"version":3,"file":"notation-icon-art.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/notation-icon-art.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,mDAAmD;AACnD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3D,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC3C,CAAC,GACF,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC,GACF,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC,GACF,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,GACF,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC,GACF,CAAC,KAAK,GAAG;IACP,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC/C,CAAC,CAAC;AAEP;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qrBAyCtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CACjC,gBAAgB,EAChB,SAAS,iBAAiB,EAAE,CAg9BpB,CAAC"}
1
+ {"version":3,"file":"notation-icon-art.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/notation-icon-art.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,mDAAmD;AACnD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3D,KAAK,KAAK,GAAG;IACX,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC,GAClG,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAClJ,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1H,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACnG,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC5L,CAAC,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,ssBA0CtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,SAAS,iBAAiB,EAAE,CA++BxE,CAAC"}