@sudobility/music_types 0.13.2 → 0.13.4

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.
@@ -14,6 +14,7 @@
14
14
  * discovered afterwards.
15
15
  */
16
16
  import type { Score, ScoreRange, ScoreSelection } from "../../index.js";
17
+ import type { GenerateScoreRequest } from "../../index.js";
17
18
  export type ReplaceScope = "notes" | "measures" | "track";
18
19
  export type ReplacementRegion = {
19
20
  range: ScoreRange;
@@ -29,4 +30,13 @@ export type ReplacementRegion = {
29
30
  * nothing to work on — which is what disables its button.
30
31
  */
31
32
  export declare function replacementRegion(score: Score, selection: ScoreSelection, activeTrackId: string | null, scope: ReplaceScope): ReplacementRegion | null;
33
+ /**
34
+ * The placeholder score a generation request implies.
35
+ *
36
+ * Created up front rather than on completion so a generating project appears
37
+ * in the list with its badge from the first second, instead of materialising
38
+ * minutes later out of nowhere — and shaped like what was asked for, so the
39
+ * editor can open it meaningfully mid-generation.
40
+ */
41
+ export declare function emptyScoreForRequest(request: GenerateScoreRequest): Score;
32
42
  //# sourceMappingURL=replacement-region.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replacement-region.d.ts","sourceRoot":"","sources":["../../../src/domain/generation/replacement-region.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIxE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAoCF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,KAAK,EAAE,YAAY,GAClB,iBAAiB,GAAG,IAAI,CAkE1B"}
1
+ {"version":3,"file":"replacement-region.d.ts","sourceRoot":"","sources":["../../../src/domain/generation/replacement-region.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI3D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC;AAoCF;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,KAAK,EAAE,YAAY,GAClB,iBAAiB,GAAG,IAAI,CAkE1B;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,KAAK,CAYzE"}
@@ -1,3 +1,4 @@
1
+ import { createEmptyScore } from "../score/factory.js";
1
2
  import { isNoteEvent } from "../../index.js";
2
3
  import { findEvent, findMeasure, findTrack } from "../score/queries.js";
3
4
  /** Ids of every note overlapping `range` on its tracks. Overlap, not containment: a note straddling the boundary is replaced too. */
@@ -76,4 +77,25 @@ export function replacementRegion(score, selection, activeTrackId, scope) {
76
77
  trackIds: [...new Set(notes.map((n) => n.trackId))],
77
78
  }, false, new Set(notes.map((n) => n.id)));
78
79
  }
80
+ /**
81
+ * The placeholder score a generation request implies.
82
+ *
83
+ * Created up front rather than on completion so a generating project appears
84
+ * in the list with its badge from the first second, instead of materialising
85
+ * minutes later out of nowhere — and shaped like what was asked for, so the
86
+ * editor can open it meaningfully mid-generation.
87
+ */
88
+ export function emptyScoreForRequest(request) {
89
+ return createEmptyScore({
90
+ title: request.title?.trim() || "Untitled",
91
+ measures: request.durationMeasures,
92
+ tracks: request.tracks.map((t) => ({
93
+ name: t.name,
94
+ instrumentName: t.instrumentName,
95
+ clef: t.clef,
96
+ })),
97
+ ...(request.timeSignature ? { timeSignature: request.timeSignature } : {}),
98
+ ...(request.keySignature ? { keySignature: request.keySignature } : {}),
99
+ });
100
+ }
79
101
  //# sourceMappingURL=replacement-region.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"replacement-region.js","sourceRoot":"","sources":["../../../src/domain/generation/replacement-region.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replacement-region.js","sourceRoot":"","sources":["../../../src/domain/generation/replacement-region.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Undoing the display lenses, so what is stored is what will sound.
3
+ *
4
+ * Pure model work despite being reached from a pointer: it takes a pitch and
5
+ * answers a pitch, and knows nothing about coordinates. It lived beside the
6
+ * hit-testing in the app for that reason alone, which made it a rule a second
7
+ * app would have had to rediscover — and getting it wrong is invisible, since
8
+ * the note then draws exactly where it was clicked and only sounds wrong.
9
+ */
10
+ import type { Pitch, Score, UUID } from "../../index.js";
11
+ /**
12
+ * Turns a pitch read off the *drawn* staff into the pitch to store.
13
+ *
14
+ * `pitchAtStavePoint` answers in the coordinate space the notation is drawn
15
+ * in, and that space has been through up to two display lenses:
16
+ * `ottavaScore` moves bracketed noteheads to where they are written, and
17
+ * `writtenScore` transposes a transposing instrument into its written key.
18
+ * The model stores **sounding** pitch, so writing a clicked position straight
19
+ * back in stores whatever was on screen as though it were the sound.
20
+ *
21
+ * That was silently wrong in two ways. A click inside an `8va` stored the note
22
+ * an octave from where it will sound — in *every* mode, since a bracket is
23
+ * part of the notation rather than a way of reading it — and a click on a
24
+ * transposing part in written mode stored it by that instrument's interval
25
+ * (a whole tone on a B-flat clarinet).
26
+ *
27
+ * The lenses are undone in the reverse of the order they were applied:
28
+ * `displayScore` is `writtenScore(ottavaScore(score))`, so the transposition
29
+ * comes off first and the bracket second.
30
+ */
31
+ export declare function soundingPitchForDrawn(score: Score, trackId: UUID, tick: number, drawn: Pitch, pitchDisplay: "concert" | "written"): Pitch;
32
+ //# sourceMappingURL=display-lens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-lens.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/display-lens.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAIzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,SAAS,GAAG,SAAS,GAClC,KAAK,CAkBP"}
@@ -0,0 +1,37 @@
1
+ import { soundingPitchForTrack } from "../../index.js";
2
+ import { ottavaShiftAt } from "../../index.js";
3
+ /**
4
+ * Turns a pitch read off the *drawn* staff into the pitch to store.
5
+ *
6
+ * `pitchAtStavePoint` answers in the coordinate space the notation is drawn
7
+ * in, and that space has been through up to two display lenses:
8
+ * `ottavaScore` moves bracketed noteheads to where they are written, and
9
+ * `writtenScore` transposes a transposing instrument into its written key.
10
+ * The model stores **sounding** pitch, so writing a clicked position straight
11
+ * back in stores whatever was on screen as though it were the sound.
12
+ *
13
+ * That was silently wrong in two ways. A click inside an `8va` stored the note
14
+ * an octave from where it will sound — in *every* mode, since a bracket is
15
+ * part of the notation rather than a way of reading it — and a click on a
16
+ * transposing part in written mode stored it by that instrument's interval
17
+ * (a whole tone on a B-flat clarinet).
18
+ *
19
+ * The lenses are undone in the reverse of the order they were applied:
20
+ * `displayScore` is `writtenScore(ottavaScore(score))`, so the transposition
21
+ * comes off first and the bracket second.
22
+ */
23
+ export function soundingPitchForDrawn(score, trackId, tick, drawn, pitchDisplay) {
24
+ const track = score.tracks.find((t) => t.id === trackId);
25
+ if (!track)
26
+ return drawn;
27
+ // The **sounding** key, which is what is stored — `soundingPitchForTrack`
28
+ // reads the key the note will sound in, not the one it is drawn in.
29
+ const measure = track.measures.find((m) => tick >= m.startTick && tick < m.startTick + m.durationTicks);
30
+ // Same fallback the inspector uses: a measure carries the key in force.
31
+ const key = measure?.keySignature ?? { fifths: 0, mode: 'major' };
32
+ const untransposed = pitchDisplay === 'written' ? soundingPitchForTrack(drawn, track, key) : drawn;
33
+ // `ottavaScore` draws at `octave - shift`, so the inverse adds it back.
34
+ const shift = ottavaShiftAt(score, trackId, tick);
35
+ return shift === 0 ? untransposed : { ...untransposed, octave: untransposed.octave + shift };
36
+ }
37
+ //# sourceMappingURL=display-lens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-lens.js","sourceRoot":"","sources":["../../../src/domain/notation/display-lens.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAY,EACZ,OAAa,EACb,IAAY,EACZ,KAAY,EACZ,YAAmC;IAEnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,aAAa,CACnE,CAAC;IACF,wEAAwE;IACxE,MAAM,GAAG,GAAG,OAAO,EAAE,YAAY,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAElE,MAAM,YAAY,GAChB,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhF,wEAAwE;IACxE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;AAC/F,CAAC"}
@@ -31,4 +31,50 @@ export declare function allNotes(score: Score): NoteEvent[];
31
31
  * reference — this filters, it never rewrites the music.
32
32
  */
33
33
  export declare function scoreWithTracks(score: Score, trackIds: string[]): Score;
34
+ /**
35
+ * A track's notes in tick order.
36
+ *
37
+ * Lyric entry walks these, and so does anything that means "the next note
38
+ * after here" — so the sort is part of the answer rather than something each
39
+ * caller remembers. Rests are dropped: they carry no syllable and nothing that
40
+ * steps through notes wants to stop on one.
41
+ */
42
+ export declare function trackNotesInOrder(score: Score, trackId: UUID): NoteEvent[];
43
+ /**
44
+ * The index of the first note at or after `tick`, or 0 when the tick is past
45
+ * every note.
46
+ *
47
+ * Falling back to the start rather than to -1: "begin here" with the caret
48
+ * past the end means begin at the beginning, which is what a writer expects
49
+ * from a command that has to start somewhere.
50
+ */
51
+ export declare function noteIndexAtOrAfter(notes: readonly NoteEvent[], tick: number): number;
52
+ /**
53
+ * Which voice a note is in, counted from 1.
54
+ *
55
+ * From 1 because that is what the toolbar's own Voice 1 / Voice 2 buttons say;
56
+ * the same note used to read as "Voice 1" on the bar and `0` in the panel.
57
+ */
58
+ export declare function voiceNumberOf(score: Score, note: NoteEvent): number;
59
+ /** The position of a measure in its own track, or `null` if it is not in the score. */
60
+ export declare function measureIndexOf(score: Score, measureId: UUID): number | null;
61
+ /** The measure holding `tick` on `trackId`, clamped to the last one past the end. */
62
+ export declare function measureAtTick(score: Score, trackId: UUID, tick: number): Measure | null;
63
+ /**
64
+ * The ids of notes whose sound overlaps `range` on the range's own tracks.
65
+ *
66
+ * Overlap, not containment: a note that starts before the range and is still
67
+ * sounding inside it was replaced by whatever was written there, so it is part
68
+ * of what changed.
69
+ */
70
+ export declare function noteIdsOverlappingRange(score: Score, range: ScoreRange): UUID[];
71
+ /** The track a measure belongs to, or `null` if it is not in the score. */
72
+ export declare function trackOfMeasure(score: Score, measureId: UUID): Track | null;
73
+ /**
74
+ * How many bars the score has.
75
+ *
76
+ * Off track 0, because every track shares the measure grid — the convention
77
+ * the layout, the gutter and `measureIndexOf` all already rely on.
78
+ */
79
+ export declare function barCount(score: Score | null): number;
34
80
  //# sourceMappingURL=queries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/domain/score/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,SAAS,EACT,KAAK,EACL,KAAK,EACL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAIxB,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAEnE;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAMzE;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,YAAY,GAAG,IAAI,CAU1E;AAkBD,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAkB1E;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB,KAAK,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAU/C;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAmBlB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CASjD;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,CAYlD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAKvE"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/domain/score/queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,SAAS,EACT,KAAK,EACL,KAAK,EACL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAIxB,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAEnE;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAMzE;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,GAAG,YAAY,GAAG,IAAI,CAU1E;AAkBD,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAkB1E;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB,KAAK,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAU/C;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,SAAS,GAAG,IAAI,CAmBlB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CASjD;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,CAYlD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAKvE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,GACZ,SAAS,EAAE,CAYb;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,IAAI,EAAE,MAAM,GACX,MAAM,CAGR;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAQnE;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAM3E;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,IAAI,CAQhB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,GAChB,IAAI,EAAE,CASR;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,CAI1E;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAEpD"}
@@ -129,4 +129,98 @@ export function scoreWithTracks(score, trackIds) {
129
129
  return score;
130
130
  return { ...score, tracks };
131
131
  }
132
+ /**
133
+ * A track's notes in tick order.
134
+ *
135
+ * Lyric entry walks these, and so does anything that means "the next note
136
+ * after here" — so the sort is part of the answer rather than something each
137
+ * caller remembers. Rests are dropped: they carry no syllable and nothing that
138
+ * steps through notes wants to stop on one.
139
+ */
140
+ export function trackNotesInOrder(score, trackId) {
141
+ const track = findTrack(score, trackId);
142
+ if (!track)
143
+ return [];
144
+ const notes = [];
145
+ for (const measure of track.measures) {
146
+ for (const voice of measure.voices) {
147
+ for (const event of voice.events) {
148
+ if (isNoteEvent(event))
149
+ notes.push(event);
150
+ }
151
+ }
152
+ }
153
+ return notes.sort((a, b) => a.startTick - b.startTick);
154
+ }
155
+ /**
156
+ * The index of the first note at or after `tick`, or 0 when the tick is past
157
+ * every note.
158
+ *
159
+ * Falling back to the start rather than to -1: "begin here" with the caret
160
+ * past the end means begin at the beginning, which is what a writer expects
161
+ * from a command that has to start somewhere.
162
+ */
163
+ export function noteIndexAtOrAfter(notes, tick) {
164
+ const at = notes.findIndex((note) => note.startTick >= tick);
165
+ return at === -1 ? 0 : at;
166
+ }
167
+ /**
168
+ * Which voice a note is in, counted from 1.
169
+ *
170
+ * From 1 because that is what the toolbar's own Voice 1 / Voice 2 buttons say;
171
+ * the same note used to read as "Voice 1" on the bar and `0` in the panel.
172
+ */
173
+ export function voiceNumberOf(score, note) {
174
+ for (const track of score.tracks) {
175
+ for (const measure of track.measures) {
176
+ const index = measure.voices.findIndex((v) => v.id === note.voiceId);
177
+ if (index >= 0)
178
+ return index + 1;
179
+ }
180
+ }
181
+ return 1;
182
+ }
183
+ /** The position of a measure in its own track, or `null` if it is not in the score. */
184
+ export function measureIndexOf(score, measureId) {
185
+ for (const track of score.tracks) {
186
+ const index = track.measures.findIndex((m) => m.id === measureId);
187
+ if (index >= 0)
188
+ return index;
189
+ }
190
+ return null;
191
+ }
192
+ /** The measure holding `tick` on `trackId`, clamped to the last one past the end. */
193
+ export function measureAtTick(score, trackId, tick) {
194
+ const track = findTrack(score, trackId);
195
+ if (!track || track.measures.length === 0)
196
+ return null;
197
+ return (track.measures.find((m) => tick >= m.startTick && tick < m.startTick + m.durationTicks) ?? track.measures[track.measures.length - 1]);
198
+ }
199
+ /**
200
+ * The ids of notes whose sound overlaps `range` on the range's own tracks.
201
+ *
202
+ * Overlap, not containment: a note that starts before the range and is still
203
+ * sounding inside it was replaced by whatever was written there, so it is part
204
+ * of what changed.
205
+ */
206
+ export function noteIdsOverlappingRange(score, range) {
207
+ return allNotes(score)
208
+ .filter((note) => range.trackIds.includes(note.trackId) &&
209
+ note.startTick < range.endTick &&
210
+ note.startTick + note.durationTicks > range.startTick)
211
+ .map((note) => note.id);
212
+ }
213
+ /** The track a measure belongs to, or `null` if it is not in the score. */
214
+ export function trackOfMeasure(score, measureId) {
215
+ return (score.tracks.find((t) => t.measures.some((m) => m.id === measureId)) ?? null);
216
+ }
217
+ /**
218
+ * How many bars the score has.
219
+ *
220
+ * Off track 0, because every track shares the measure grid — the convention
221
+ * the layout, the gutter and `measureIndexOf` all already rely on.
222
+ */
223
+ export function barCount(score) {
224
+ return score?.tracks[0]?.measures.length ?? 0;
225
+ }
132
226
  //# sourceMappingURL=queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/domain/score/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/domain/score/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * When cut and paste need to ask, and what they are asking about.
3
+ *
4
+ * Pure over the score — no store, no DOM — because the interesting part is the
5
+ * rule for *not* asking. Both prompts follow the export dialog's precedent:
6
+ * ask only when the answers would differ. A dialog whose options do the same
7
+ * thing is a click the user cannot get wrong, so it should not appear.
8
+ */
9
+ import type { NoteEvent, Score } from "../../index.js";
10
+ /**
11
+ * Whether cutting `notes` should ask "leave silence, or close the gap?".
12
+ *
13
+ * Only when something actually follows the cut on that track: with nothing
14
+ * after it, sliding the rest of the track up moves nothing, so the two answers
15
+ * produce identical scores.
16
+ *
17
+ * A cut spanning several tracks never asks. Closing a gap in one track while
18
+ * the others stay put is exactly the desynchronisation `insert` mode exists
19
+ * for, and doing it to several at once by accident would be worse than not
20
+ * offering it.
21
+ */
22
+ export declare function cutNeedsPrompt(score: Score, notes: readonly NoteEvent[]): boolean;
23
+ /**
24
+ * Whether pasting `span` ticks at `anchorTick` on `trackId` should ask
25
+ * "replace, or insert?".
26
+ *
27
+ * Only when the target span already holds something: pasting into empty time
28
+ * replaces nothing and displaces nothing, so both answers land the same notes
29
+ * in the same place.
30
+ */
31
+ export declare function pasteNeedsPrompt(score: Score, trackId: string, anchorTick: number, span: number): boolean;
32
+ /** The tick span the clipboard occupies, measured from its own earliest start. */
33
+ export declare function clipboardSpan(events: readonly NoteEvent[]): number;
34
+ //# sourceMappingURL=clipboard-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard-prompts.d.ts","sourceRoot":"","sources":["../../../src/domain/selection/clipboard-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAiBvD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAUjF;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAgBT;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAKlE"}
@@ -0,0 +1,73 @@
1
+ /** Notes on `trackId` that start at or after `tick`. */
2
+ function notesAfter(score, trackId, tick) {
3
+ const track = score.tracks.find((t) => t.id === trackId);
4
+ if (!track)
5
+ return [];
6
+ const found = [];
7
+ for (const measure of track.measures) {
8
+ for (const voice of measure.voices) {
9
+ for (const event of voice.events) {
10
+ if ('pitch' in event && event.startTick >= tick)
11
+ found.push(event);
12
+ }
13
+ }
14
+ }
15
+ return found;
16
+ }
17
+ /**
18
+ * Whether cutting `notes` should ask "leave silence, or close the gap?".
19
+ *
20
+ * Only when something actually follows the cut on that track: with nothing
21
+ * after it, sliding the rest of the track up moves nothing, so the two answers
22
+ * produce identical scores.
23
+ *
24
+ * A cut spanning several tracks never asks. Closing a gap in one track while
25
+ * the others stay put is exactly the desynchronisation `insert` mode exists
26
+ * for, and doing it to several at once by accident would be worse than not
27
+ * offering it.
28
+ */
29
+ export function cutNeedsPrompt(score, notes) {
30
+ if (notes.length === 0)
31
+ return false;
32
+ const trackId = notes[0].trackId;
33
+ if (!notes.every((note) => note.trackId === trackId))
34
+ return false;
35
+ const cutIds = new Set(notes.map((note) => note.id));
36
+ const cutEnd = Math.max(...notes.map((note) => note.startTick + note.durationTicks));
37
+ return notesAfter(score, trackId, cutEnd).some((note) => !cutIds.has(note.id));
38
+ }
39
+ /**
40
+ * Whether pasting `span` ticks at `anchorTick` on `trackId` should ask
41
+ * "replace, or insert?".
42
+ *
43
+ * Only when the target span already holds something: pasting into empty time
44
+ * replaces nothing and displaces nothing, so both answers land the same notes
45
+ * in the same place.
46
+ */
47
+ export function pasteNeedsPrompt(score, trackId, anchorTick, span) {
48
+ const track = score.tracks.find((t) => t.id === trackId);
49
+ if (!track)
50
+ return false;
51
+ for (const measure of track.measures) {
52
+ for (const voice of measure.voices) {
53
+ for (const event of voice.events) {
54
+ if (!('pitch' in event))
55
+ continue;
56
+ const note = event;
57
+ const overlaps = note.startTick < anchorTick + span && note.startTick + note.durationTicks > anchorTick;
58
+ if (overlaps)
59
+ return true;
60
+ }
61
+ }
62
+ }
63
+ return false;
64
+ }
65
+ /** The tick span the clipboard occupies, measured from its own earliest start. */
66
+ export function clipboardSpan(events) {
67
+ if (events.length === 0)
68
+ return 0;
69
+ const start = Math.min(...events.map((e) => e.startTick));
70
+ const end = Math.max(...events.map((e) => e.startTick + e.durationTicks));
71
+ return end - start;
72
+ }
73
+ //# sourceMappingURL=clipboard-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard-prompts.js","sourceRoot":"","sources":["../../../src/domain/selection/clipboard-prompts.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -98,6 +98,8 @@ export * from "./domain/score/snapshot-tree.js";
98
98
  export * from "./domain/score/written-pitch.js";
99
99
  export * from "./domain/selection/range-select.js";
100
100
  export * from "./domain/selection/selection-editing.js";
101
+ export * from "./domain/selection/clipboard-prompts.js";
102
+ export * from "./domain/notation/display-lens.js";
101
103
  export * from "./domain/time/duration-modifiers.js";
102
104
  export * from "./domain/time/duration-selection.js";
103
105
  export * from "./domain/time/tap-to-note.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AASH,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAQ5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,oBAAoB,CAAC;AAKnC,cAAc,qBAAqB,CAAC;AAMpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAM9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AAItD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wCAAwC,CAAC;AACvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AASH,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAQ5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AAEjC,cAAc,oBAAoB,CAAC;AAKnC,cAAc,qBAAqB,CAAC;AAMpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAM9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AAItD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wCAAwC,CAAC;AACvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -122,6 +122,8 @@ export * from "./domain/score/snapshot-tree.js";
122
122
  export * from "./domain/score/written-pitch.js";
123
123
  export * from "./domain/selection/range-select.js";
124
124
  export * from "./domain/selection/selection-editing.js";
125
+ export * from "./domain/selection/clipboard-prompts.js";
126
+ export * from "./domain/notation/display-lens.js";
125
127
  export * from "./domain/time/duration-modifiers.js";
126
128
  export * from "./domain/time/duration-selection.js";
127
129
  export * from "./domain/time/tap-to-note.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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"}
@@ -74,6 +74,31 @@ export interface IMusicPosition {
74
74
  * {@link IMusicPosition} and cannot move the playhead by accident.
75
75
  */
76
76
  export interface IMusicPositionSource extends IMusicPosition {
77
+ /**
78
+ * Move the playhead, because something other than the transport decided to.
79
+ *
80
+ * A click on the stave, an arrow key, a note written at the caret: all of
81
+ * them are somebody saying where the position *should be*, and they are the
82
+ * opposite of {@link report}, which is the transport saying where it already
83
+ * is. Keeping the two apart is what lets the transport follow this one
84
+ * without following its own reports around a loop.
85
+ *
86
+ * It is on this interface rather than the read one so a passive follower
87
+ * still cannot move the playhead by accident — but note that moving it is
88
+ * not a transport privilege. The editor moves the playhead; it just has no
89
+ * business knowing that a transport exists, so it says where the position is
90
+ * and whatever is playing follows.
91
+ */
92
+ moveTo(tick: number): void;
93
+ /**
94
+ * Observe deliberate moves, and *only* those.
95
+ *
96
+ * The transport subscribes here to follow a seek. It must not use
97
+ * {@link IMusicPosition.subscribe}, which also fires on its own reports:
98
+ * following those would mean seeking to where it already is, thirty times a
99
+ * second, forever.
100
+ */
101
+ subscribeToMoves(listener: (tick: number) => void): UnsubscribePosition;
77
102
  /**
78
103
  * Report an authoritative position, in score ticks.
79
104
  *
@@ -1 +1 @@
1
- {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/model/position.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB,CAAC;CAClE;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/C,kEAAkE;IAClE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5D;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC"}
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/model/position.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB,CAAC;CAClE;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB,CAAC;IAExE;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/C,kEAAkE;IAClE,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5D;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC"}
@@ -33,6 +33,8 @@
33
33
  import type { IMusicPositionSource, UnsubscribePosition } from "../model/position.js";
34
34
  export declare class MusicPosition implements IMusicPositionSource {
35
35
  private readonly listeners;
36
+ /** Kept apart from `listeners`: the transport follows these and must not follow its own reports. */
37
+ private readonly moveListeners;
36
38
  /** The last authoritative report, and the clock reading it belongs to. */
37
39
  private anchorTick;
38
40
  private anchorSeconds;
@@ -55,6 +57,17 @@ export declare class MusicPosition implements IMusicPositionSource {
55
57
  */
56
58
  get reportedTick(): number;
57
59
  report(tick: number, atSeconds?: number): void;
60
+ /**
61
+ * Somebody moved the playhead.
62
+ *
63
+ * Anchors exactly as `report` does — the position *is* here now, and a
64
+ * projection from the old anchor would glide away from it — then tells the
65
+ * ordinary subscribers, so anything drawing the caret sees one number change
66
+ * whoever moved it, and finally the movement subscribers, which is how the
67
+ * transport learns to follow.
68
+ */
69
+ moveTo(tick: number): void;
70
+ subscribeToMoves(listener: (tick: number) => void): UnsubscribePosition;
58
71
  /**
59
72
  * Update the tick rate without disturbing the anchor.
60
73
  *
@@ -1 +1 @@
1
- {"version":3,"file":"music-position.d.ts","sourceRoot":"","sources":["../../src/position/music-position.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AA8B9B,qBAAa,aAAc,YAAW,oBAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAE/D,0EAA0E;IAC1E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAK;IAE3B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,MAAM,CAcjB;IAED;;;;OAIG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAM9C;;;;;;OAMG;IACH,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIrC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAY3D,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB;CAIjE"}
1
+ {"version":3,"file":"music-position.d.ts","sourceRoot":"","sources":["../../src/position/music-position.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,sBAAsB,CAAC;AA8B9B,qBAAa,aAAc,YAAW,oBAAoB;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IAEnE,0EAA0E;IAC1E,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAK;IAE3B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,MAAM,CAcjB;IAED;;;;OAIG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAM9C;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ1B,gBAAgB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB;IAKvE;;;;;;OAMG;IACH,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIrC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAY3D,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,mBAAmB;CAIjE"}
@@ -27,6 +27,8 @@ function nowSeconds() {
27
27
  export class MusicPosition {
28
28
  constructor() {
29
29
  this.listeners = new Set();
30
+ /** Kept apart from `listeners`: the transport follows these and must not follow its own reports. */
31
+ this.moveListeners = new Set();
30
32
  /** The last authoritative report, and the clock reading it belongs to. */
31
33
  this.anchorTick = 0;
32
34
  this.anchorSeconds = nowSeconds();
@@ -68,6 +70,28 @@ export class MusicPosition {
68
70
  for (const listener of this.listeners)
69
71
  listener(tick);
70
72
  }
73
+ /**
74
+ * Somebody moved the playhead.
75
+ *
76
+ * Anchors exactly as `report` does — the position *is* here now, and a
77
+ * projection from the old anchor would glide away from it — then tells the
78
+ * ordinary subscribers, so anything drawing the caret sees one number change
79
+ * whoever moved it, and finally the movement subscribers, which is how the
80
+ * transport learns to follow.
81
+ */
82
+ moveTo(tick) {
83
+ const target = Math.max(0, tick);
84
+ this.anchorTick = target;
85
+ this.anchorSeconds = nowSeconds();
86
+ for (const listener of this.listeners)
87
+ listener(target);
88
+ for (const listener of this.moveListeners)
89
+ listener(target);
90
+ }
91
+ subscribeToMoves(listener) {
92
+ this.moveListeners.add(listener);
93
+ return () => this.moveListeners.delete(listener);
94
+ }
71
95
  /**
72
96
  * Update the tick rate without disturbing the anchor.
73
97
  *
@@ -1 +1 @@
1
- {"version":3,"file":"music-position.js","sourceRoot":"","sources":["../../src/position/music-position.ts"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,kEAAkE;AAClE,SAAS,UAAU;IACjB,OAAO,OAAO,WAAW,KAAK,WAAW;QACvC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI;QAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,OAAO,aAAa;IAA1B;QACmB,cAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;QAE/D,0EAA0E;QAClE,eAAU,GAAG,CAAC,CAAC;QACf,kBAAa,GAAG,UAAU,EAAE,CAAC;QAE7B,YAAO,GAAG,KAAK,CAAC;QAChB,mBAAc,GAAG,CAAC,CAAC;IAwE7B,CAAC;IAtEC,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,IAAI;QACN,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QACtE,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,UAAU,EAAE,GAAG,IAAI,CAAC,aAAa,EACjC,sBAAsB,CACvB,CAAC;QACF,uEAAuE;QACvE,uDAAuD;QACvD,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC,cAAc,CAChD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,SAAkB;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC;QAC/C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,cAAsB;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,UAAU,CAAC,OAAgB,EAAE,cAAuB;QAClD,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,UAAU,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,cAAc,KAAK,SAAS;YAAE,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACvE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnE,CAAC;IAED,SAAS,CAAC,QAAgC;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACF"}
1
+ {"version":3,"file":"music-position.js","sourceRoot":"","sources":["../../src/position/music-position.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.2",
3
+ "version": "0.13.4",
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",