@sudobility/music_types 0.13.13 → 0.13.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md CHANGED
@@ -68,6 +68,31 @@ Everything exports from a single sectioned `src/index.ts`:
68
68
  - No domain logic here: tick math, factories, commands, validation logic all live in `@sudobility/music_lib`. This package must never depend on music_lib (music_api depends on this package and must not pull in UI/audio code).
69
69
  - `noteEventSchema`/`restEventSchema` are `.strict()` on purpose (a stray `pitch` key must not pass as a rest); other schemas strip unknown keys for forward compatibility.
70
70
  - Ticks are integers at 480 PPQ by convention; `startTick` is absolute.
71
+ - **A picker's option list belongs beside the vocabulary it is built from**
72
+ (`picker-options.ts`). `ARTICULATION_OPTIONS` existed in music_app's
73
+ inspector, in music_app_rn's toolbar *and* in its Note tab, and the three
74
+ agreed only because nobody had added a fifth articulation yet — a hand-written
75
+ list goes on offering the old set in silence, which is the exact failure the
76
+ `Record<T, …>` rule next to this one exists to prevent. Each list is `map`ped
77
+ off the vocabulary, so a new member reaches every picker in both apps without
78
+ anybody remembering to. Two shapes are load-bearing. They carry an **i18n key,
79
+ never a translated string** — the words belong to the app, and a key is not
80
+ prose but the name of a fact. And "none" travels under the `NO_MARK`
81
+ sentinel, because a picker's value is a string and an empty one is
82
+ indistinguishable from "nothing chosen" (Radix refuses it outright; the native
83
+ `Select` behaves the same). The one thing that stays in each app is a
84
+ **drawing**: the toolbar attaches its own glyph to the shared value, since a
85
+ React component is the one thing a vocabulary cannot carry.
86
+
87
+ - **`commonValue` is here because a property panel acts on a *selection*.** A
88
+ field that showed the first object's value would say "Staccato" for a
89
+ selection that is mostly not, and setting it would look like a no-op on
90
+ everything that already agreed. It compares by **structure, not identity** —
91
+ pitches, time and key signatures are small objects rebuilt on every read, so
92
+ `===` reports every multi-note selection as mixed. Written once per app before
93
+ this, which is how the two came to disagree about whether an empty selection
94
+ was `null` or mixed.
95
+
71
96
  - **Saying a stored value the way a musician says it belongs here**
72
97
  (`music-vocabulary.ts`). A score stores ticks, fifths and zero-based voice
73
98
  indexes because those are the right things to compute with, and none of them
@@ -0,0 +1,42 @@
1
+ import type { Accidental, Articulation, DurationName, Dynamic, Ornament } from "../../index.js";
2
+ /** "No marking here", distinct from a marking that happens to be quiet. */
3
+ export declare const NO_MARK = "none";
4
+ /** An entry in a picker: the value it sets, and the key naming it. */
5
+ export type PickerOption<T> = {
6
+ value: T;
7
+ labelKey: string;
8
+ };
9
+ /**
10
+ * Articulations, with "none" first.
11
+ *
12
+ * The keys are `articulation.<member>` and `articulation.none`, which both apps
13
+ * already carry — so this changes no copy, only where the list is stated.
14
+ */
15
+ export declare const ARTICULATION_OPTIONS: ReadonlyArray<PickerOption<Articulation | typeof NO_MARK>>;
16
+ /**
17
+ * Ornament signs, with "none" first.
18
+ *
19
+ * `inverted-mordent` is keyed `ornament.invertedMordent`: the vocabulary member
20
+ * is kebab-case because that is what MusicXML and the model use, and i18n keys
21
+ * across this family are camelCase. Mapping it here is what stops each app
22
+ * inventing its own spelling of the key — and one of them getting it wrong,
23
+ * which shows up as the untranslated key name printed in the picker.
24
+ */
25
+ export declare const ORNAMENT_OPTIONS: ReadonlyArray<PickerOption<Ornament | typeof NO_MARK>>;
26
+ /** Accidentals, keyed `accidental.<fifths>` — `accidental.-1` is Flat. */
27
+ export declare const ACCIDENTAL_OPTIONS: ReadonlyArray<PickerOption<Accidental>>;
28
+ /** Dynamics, with "no dynamic" first. A level is not a loudness of zero. */
29
+ export declare const DYNAMIC_OPTIONS: ReadonlyArray<PickerOption<Dynamic | typeof NO_MARK>>;
30
+ /**
31
+ * The grids a MIDI import may be quantized onto, coarsest first.
32
+ *
33
+ * `none` is a real answer and the right one for a performance already sitting
34
+ * on a grid the analyser could not confidently name: snapping such a file onto
35
+ * a straight grid is how a swung or triplet performance arrives mechanical.
36
+ *
37
+ * Written out rather than mapped off `DURATION_NAMES`, and deliberately: that
38
+ * list includes dotted and triplet values, which are not grids a performance is
39
+ * quantized *to*. A shorter list here is the decision, not an omission.
40
+ */
41
+ export declare const MIDI_GRID_OPTIONS: ReadonlyArray<PickerOption<DurationName | typeof NO_MARK>>;
42
+ //# sourceMappingURL=picker-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-options.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/picker-options.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAExB,2EAA2E;AAC3E,eAAO,MAAM,OAAO,SAAS,CAAC;AAE9B,sEAAsE;AACtE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAC9C,YAAY,CAAC,YAAY,GAAG,OAAO,OAAO,CAAC,CAO5C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAC1C,YAAY,CAAC,QAAQ,GAAG,OAAO,OAAO,CAAC,CASxC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CACG,CAAC;AAE3E,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,aAAa,CACzC,YAAY,CAAC,OAAO,GAAG,OAAO,OAAO,CAAC,CAIvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAC3C,YAAY,CAAC,YAAY,GAAG,OAAO,OAAO,CAAC,CAS5C,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The option lists a picker offers, derived from the vocabularies.
3
+ *
4
+ * **A list keyed by a closed vocabulary belongs beside the vocabulary**, not in
5
+ * whichever app happened to need a picker first. Every one of these was written
6
+ * out by hand in more than one place: the articulation list existed in
7
+ * `music_app`'s inspector, in `music_app_rn`'s toolbar and in its Note tab, and
8
+ * the three agreed only because nobody had added a fifth articulation yet. Each
9
+ * is now `map`ped off the vocabulary itself, so adding a member reaches every
10
+ * picker in both apps without anybody remembering to.
11
+ *
12
+ * **They carry an i18n *key*, never a translated string.** The words belong to
13
+ * the app — a Chinese reader must get Chinese — and a key is not prose: it is
14
+ * the name of a fact, which is exactly the kind of thing that may live here.
15
+ * `none` travels under a sentinel string rather than `undefined` because a
16
+ * picker's value is a string, and an empty one is indistinguishable from
17
+ * "nothing chosen" (Radix refuses it outright, and the native `Select` behaves
18
+ * the same way).
19
+ */
20
+ import { ACCIDENTALS, ARTICULATIONS, DYNAMICS, ORNAMENTS } from "../../index.js";
21
+ /** "No marking here", distinct from a marking that happens to be quiet. */
22
+ export const NO_MARK = "none";
23
+ /**
24
+ * Articulations, with "none" first.
25
+ *
26
+ * The keys are `articulation.<member>` and `articulation.none`, which both apps
27
+ * already carry — so this changes no copy, only where the list is stated.
28
+ */
29
+ export const ARTICULATION_OPTIONS = [
30
+ { value: NO_MARK, labelKey: "articulation.none" },
31
+ ...ARTICULATIONS.map((value) => ({
32
+ value,
33
+ labelKey: `articulation.${value}`,
34
+ })),
35
+ ];
36
+ /**
37
+ * Ornament signs, with "none" first.
38
+ *
39
+ * `inverted-mordent` is keyed `ornament.invertedMordent`: the vocabulary member
40
+ * is kebab-case because that is what MusicXML and the model use, and i18n keys
41
+ * across this family are camelCase. Mapping it here is what stops each app
42
+ * inventing its own spelling of the key — and one of them getting it wrong,
43
+ * which shows up as the untranslated key name printed in the picker.
44
+ */
45
+ export const ORNAMENT_OPTIONS = [
46
+ { value: NO_MARK, labelKey: "ornament.none" },
47
+ ...ORNAMENTS.map((value) => ({
48
+ value,
49
+ labelKey: `ornament.${value === "inverted-mordent" ? "invertedMordent" : value}`,
50
+ })),
51
+ ];
52
+ /** Accidentals, keyed `accidental.<fifths>` — `accidental.-1` is Flat. */
53
+ export const ACCIDENTAL_OPTIONS = ACCIDENTALS.map((value) => ({ value, labelKey: `accidental.${value}` }));
54
+ /** Dynamics, with "no dynamic" first. A level is not a loudness of zero. */
55
+ export const DYNAMIC_OPTIONS = [
56
+ { value: NO_MARK, labelKey: "inspector.noDynamic" },
57
+ ...DYNAMICS.map((value) => ({ value, labelKey: `dynamic.${value}` })),
58
+ ];
59
+ /**
60
+ * The grids a MIDI import may be quantized onto, coarsest first.
61
+ *
62
+ * `none` is a real answer and the right one for a performance already sitting
63
+ * on a grid the analyser could not confidently name: snapping such a file onto
64
+ * a straight grid is how a swung or triplet performance arrives mechanical.
65
+ *
66
+ * Written out rather than mapped off `DURATION_NAMES`, and deliberately: that
67
+ * list includes dotted and triplet values, which are not grids a performance is
68
+ * quantized *to*. A shorter list here is the decision, not an omission.
69
+ */
70
+ export const MIDI_GRID_OPTIONS = [
71
+ { value: NO_MARK, labelKey: "importMidi.gridNone" },
72
+ { value: "whole", labelKey: "importMidi.gridWhole" },
73
+ { value: "half", labelKey: "importMidi.gridHalf" },
74
+ { value: "quarter", labelKey: "importMidi.gridQuarter" },
75
+ { value: "eighth", labelKey: "importMidi.gridEighth" },
76
+ { value: "sixteenth", labelKey: "importMidi.gridSixteenth" },
77
+ { value: "thirtysecond", labelKey: "importMidi.gridThirtySecond" },
78
+ ];
79
+ //# sourceMappingURL=picker-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-options.js","sourceRoot":"","sources":["../../../src/domain/notation/picker-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AASjF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC;AAK9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAE7B;IACF,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACjD,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/B,KAAK;QACL,QAAQ,EAAE,gBAAgB,KAAK,EAAE;KAClC,CAAC,CAAC;CACJ,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAEzB;IACF,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC7C,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3B,KAAK;QACL,QAAQ,EAAE,YACR,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KACrD,EAAE;KACH,CAAC,CAAC;CACJ,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAC7B,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAExB;IACF,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IACnD,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,KAAK,EAAE,EAAE,CAAC,CAAC;CACtE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAE1B;IACF,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IACnD,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE;IACpD,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IAClD,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,EAAE;IACxD,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACtD,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,0BAA0B,EAAE;IAC5D,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,6BAA6B,EAAE;CACnE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The one value a set of objects agrees on, or `null` where they differ.
3
+ *
4
+ * This is what lets a property panel act on a *selection* rather than on one
5
+ * object. A field that showed the first item's value would say "Staccato" for a
6
+ * selection that is mostly not, and setting it would then look like a no-op on
7
+ * everything that already agreed.
8
+ *
9
+ * Compared by **structure, not identity**: pitches, time signatures and key
10
+ * signatures are all small objects rebuilt on every read, so `===` would report
11
+ * every multi-note selection as mixed. `JSON.stringify` is enough here because
12
+ * everything it is asked about is plain score data with a stable key order —
13
+ * these are model objects, not arbitrary user values.
14
+ *
15
+ * In music_types because both apps' inspectors need it and the rule is about
16
+ * *a selection of score objects*, not about a panel. It was written twice, once
17
+ * per app, which is how the two came to disagree about whether an empty
18
+ * selection was `null` or mixed.
19
+ */
20
+ export declare function commonValue<T>(values: readonly T[]): T | null;
21
+ //# sourceMappingURL=common-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-value.d.ts","sourceRoot":"","sources":["../../../src/domain/score/common-value.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAO7D"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The one value a set of objects agrees on, or `null` where they differ.
3
+ *
4
+ * This is what lets a property panel act on a *selection* rather than on one
5
+ * object. A field that showed the first item's value would say "Staccato" for a
6
+ * selection that is mostly not, and setting it would then look like a no-op on
7
+ * everything that already agreed.
8
+ *
9
+ * Compared by **structure, not identity**: pitches, time signatures and key
10
+ * signatures are all small objects rebuilt on every read, so `===` would report
11
+ * every multi-note selection as mixed. `JSON.stringify` is enough here because
12
+ * everything it is asked about is plain score data with a stable key order —
13
+ * these are model objects, not arbitrary user values.
14
+ *
15
+ * In music_types because both apps' inspectors need it and the rule is about
16
+ * *a selection of score objects*, not about a panel. It was written twice, once
17
+ * per app, which is how the two came to disagree about whether an empty
18
+ * selection was `null` or mixed.
19
+ */
20
+ export function commonValue(values) {
21
+ if (values.length === 0)
22
+ return null;
23
+ const first = values[0];
24
+ const firstKey = JSON.stringify(first);
25
+ return values.every((value) => JSON.stringify(value) === firstKey)
26
+ ? first
27
+ : null;
28
+ }
29
+ //# sourceMappingURL=common-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-value.js","sourceRoot":"","sources":["../../../src/domain/score/common-value.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,WAAW,CAAI,MAAoB;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;QAChE,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Filtering the community list by what somebody typed.
3
+ *
4
+ * **On the client, over the list already fetched.** That is honest at this
5
+ * size: the page shows what a single request returned, and filtering it is a
6
+ * reading aid rather than a query. Real server-side search belongs with a
7
+ * `music_api` route and a plan of its own, and pretending to have one — by
8
+ * paging on the client, say — would be worse than not having it.
9
+ *
10
+ * Matches the **title and the publisher**, which is what somebody scanning this
11
+ * list is actually reading. Case-insensitive and by substring, because a person
12
+ * typing three letters of a name means "find that", not "starts with".
13
+ *
14
+ * Here rather than in an app because both of them show this list, and a filter
15
+ * that differed between them would mean the same search found different music
16
+ * depending on which app you ran it in.
17
+ */
18
+ /** The fields a community row is searched on. Structural, so callers may pass more. */
19
+ export type CommunitySearchable = {
20
+ publicName: string;
21
+ publisherName: string;
22
+ };
23
+ export declare function filterCommunity<T extends CommunitySearchable>(items: readonly T[], query: string): readonly T[];
24
+ //# sourceMappingURL=community-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-search.d.ts","sourceRoot":"","sources":["../../../src/domain/score/community-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,uFAAuF;AACvF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,eAAe,CAAC,CAAC,SAAS,mBAAmB,EAC3D,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,GACZ,SAAS,CAAC,EAAE,CAQd"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Filtering the community list by what somebody typed.
3
+ *
4
+ * **On the client, over the list already fetched.** That is honest at this
5
+ * size: the page shows what a single request returned, and filtering it is a
6
+ * reading aid rather than a query. Real server-side search belongs with a
7
+ * `music_api` route and a plan of its own, and pretending to have one — by
8
+ * paging on the client, say — would be worse than not having it.
9
+ *
10
+ * Matches the **title and the publisher**, which is what somebody scanning this
11
+ * list is actually reading. Case-insensitive and by substring, because a person
12
+ * typing three letters of a name means "find that", not "starts with".
13
+ *
14
+ * Here rather than in an app because both of them show this list, and a filter
15
+ * that differed between them would mean the same search found different music
16
+ * depending on which app you ran it in.
17
+ */
18
+ export function filterCommunity(items, query) {
19
+ const needle = query.trim().toLowerCase();
20
+ if (!needle)
21
+ return items;
22
+ return items.filter((item) => item.publicName.toLowerCase().includes(needle) ||
23
+ item.publisherName.toLowerCase().includes(needle));
24
+ }
25
+ //# sourceMappingURL=community-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-search.js","sourceRoot":"","sources":["../../../src/domain/score/community-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,UAAU,eAAe,CAC7B,KAAmB,EACnB,KAAa;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CACpD,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -85,9 +85,12 @@ export * from "./domain/instruments/track-instrument.js";
85
85
  export * from "./domain/notation/chord-symbol.js";
86
86
  export * from "./domain/notation/lyric-syllables.js";
87
87
  export * from "./domain/notation/music-vocabulary.js";
88
+ export * from "./domain/notation/picker-options.js";
88
89
  export * from "./domain/score/articulation.js";
89
90
  export * from "./domain/score/bar-numbers.js";
90
91
  export * from "./domain/score/collapse-rests.js";
92
+ export * from "./domain/score/common-value.js";
93
+ export * from "./domain/score/community-search.js";
91
94
  export * from "./domain/score/cue-notes.js";
92
95
  export * from "./domain/score/dynamics.js";
93
96
  export * from "./domain/score/effective-clef.js";
@@ -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
@@ -109,9 +109,12 @@ export * from "./domain/instruments/track-instrument.js";
109
109
  export * from "./domain/notation/chord-symbol.js";
110
110
  export * from "./domain/notation/lyric-syllables.js";
111
111
  export * from "./domain/notation/music-vocabulary.js";
112
+ export * from "./domain/notation/picker-options.js";
112
113
  export * from "./domain/score/articulation.js";
113
114
  export * from "./domain/score/bar-numbers.js";
114
115
  export * from "./domain/score/collapse-rests.js";
116
+ export * from "./domain/score/common-value.js";
117
+ export * from "./domain/score/community-search.js";
115
118
  export * from "./domain/score/cue-notes.js";
116
119
  export * from "./domain/score/dynamics.js";
117
120
  export * from "./domain/score/effective-clef.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/music_types",
3
- "version": "0.13.13",
3
+ "version": "0.13.14",
4
4
  "description": "TypeScript types and Zod schemas for the ScoreSmith music API - scores, generation contracts, project payloads",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",