@sudobility/music_drawing 0.0.33 → 0.0.35

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 (63) hide show
  1. package/dist/canvas-renderer.d.ts +79 -4
  2. package/dist/canvas-renderer.d.ts.map +1 -1
  3. package/dist/canvas-renderer.js +245 -53
  4. package/dist/canvas-renderer.js.map +1 -1
  5. package/dist/cursor.d.ts +60 -0
  6. package/dist/cursor.d.ts.map +1 -0
  7. package/dist/cursor.js +157 -0
  8. package/dist/cursor.js.map +1 -0
  9. package/dist/index.d.ts +16 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +16 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/keyboard-geometry.d.ts +50 -2
  14. package/dist/keyboard-geometry.d.ts.map +1 -1
  15. package/dist/keyboard-geometry.js +71 -2
  16. package/dist/keyboard-geometry.js.map +1 -1
  17. package/dist/keyboard-keys.d.ts +93 -0
  18. package/dist/keyboard-keys.d.ts.map +1 -0
  19. package/dist/keyboard-keys.js +60 -0
  20. package/dist/keyboard-keys.js.map +1 -0
  21. package/dist/layered-paint.d.ts +47 -0
  22. package/dist/layered-paint.d.ts.map +1 -0
  23. package/dist/layered-paint.js +22 -0
  24. package/dist/layered-paint.js.map +1 -0
  25. package/dist/pagination.d.ts +6 -2
  26. package/dist/pagination.d.ts.map +1 -1
  27. package/dist/pagination.js +4 -0
  28. package/dist/pagination.js.map +1 -1
  29. package/dist/playback-binding.d.ts +57 -0
  30. package/dist/playback-binding.d.ts.map +1 -0
  31. package/dist/playback-binding.js +110 -0
  32. package/dist/playback-binding.js.map +1 -0
  33. package/dist/playhead.d.ts.map +1 -1
  34. package/dist/playhead.js +22 -3
  35. package/dist/playhead.js.map +1 -1
  36. package/dist/press.d.ts +66 -0
  37. package/dist/press.d.ts.map +1 -0
  38. package/dist/press.js +64 -0
  39. package/dist/press.js.map +1 -0
  40. package/dist/print-plan.d.ts +64 -0
  41. package/dist/print-plan.d.ts.map +1 -0
  42. package/dist/print-plan.js +101 -0
  43. package/dist/print-plan.js.map +1 -0
  44. package/dist/render-theme.d.ts.map +1 -1
  45. package/dist/render-theme.js +11 -2
  46. package/dist/render-theme.js.map +1 -1
  47. package/dist/score-canvas.d.ts +280 -0
  48. package/dist/score-canvas.d.ts.map +1 -0
  49. package/dist/score-canvas.js +702 -0
  50. package/dist/score-canvas.js.map +1 -0
  51. package/dist/skia/index.d.ts +2 -0
  52. package/dist/skia/index.d.ts.map +1 -1
  53. package/dist/skia/index.js +1 -0
  54. package/dist/skia/index.js.map +1 -1
  55. package/dist/skia/skia-layers.d.ts +43 -0
  56. package/dist/skia/skia-layers.d.ts.map +1 -0
  57. package/dist/skia/skia-layers.js +24 -0
  58. package/dist/skia/skia-layers.js.map +1 -0
  59. package/dist/types.d.ts +13 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js +1 -1
  62. package/dist/types.js.map +1 -1
  63. package/package.json +3 -3
@@ -0,0 +1,280 @@
1
+ /**
2
+ * The score canvas: one contract between the drawn score and what drives it.
3
+ *
4
+ * See `docs/score-canvas.md` for the interface and the expectations the tests
5
+ * pin. In short: playback, selection and the active track talk to a
6
+ * `ScoreCanvas`; the canvas owns every geometric decision (layout, units, the
7
+ * cursor path, hit-testing, where following playback scrolls); and each app
8
+ * supplies only a `ScoreCanvasSurface` that puts pixels on its platform. Both
9
+ * apps therefore answer "where is tick N" and "what is under this point" with
10
+ * the same code.
11
+ */
12
+ import type { Pitch, PitchDisplay, Score, SoundingNote } from '@sudobility/music_types';
13
+ import type { CanvasRenderOptions, CanvasRenderResult } from './canvas-renderer.js';
14
+ import type { LayoutPlan } from './layout.js';
15
+ import type { PlaybackScrollTarget } from './playback-scroll.js';
16
+ import type { LayoutMode, RenderTheme } from './types.js';
17
+ import type { CursorGeometry, CursorMotion, CursorPath } from './cursor.js';
18
+ import type { PaintFrame } from './layered-paint.js';
19
+ /** What the canvas is showing and at what size. `width`/`height` are view px. */
20
+ export type ScoreCanvasView = {
21
+ width: number;
22
+ height: number;
23
+ zoom: number;
24
+ layoutMode: LayoutMode;
25
+ theme: RenderTheme;
26
+ /** Tracks to draw, top to bottom; omitted means all. */
27
+ trackIds?: string[];
28
+ devicePixelRatio?: number;
29
+ };
30
+ /** A point in view px: relative to the visible top-left, scroll not added. */
31
+ export type ViewPoint = {
32
+ x: number;
33
+ y: number;
34
+ };
35
+ export type ScoreCanvasHit = {
36
+ kind: 'trackGutter';
37
+ trackId: string;
38
+ } | {
39
+ kind: 'measureNumber';
40
+ measureIndex: number;
41
+ } | {
42
+ kind: 'note';
43
+ /** Every event sharing the notehead's box: a chord is one target. */
44
+ eventIds: string[];
45
+ trackId: string;
46
+ measureIndex: number;
47
+ tick: number;
48
+ } | {
49
+ kind: 'stave';
50
+ trackId: string;
51
+ measureIndex: number;
52
+ tick: number;
53
+ /** The pitch *as drawn* at that point, when the point is on a stave. */
54
+ pitch: Pitch | null;
55
+ };
56
+ /** What a platform provides. */
57
+ export interface ScoreCanvasSurface {
58
+ /**
59
+ * Draw the window described by `options` with a `CanvasScoreRenderer` the
60
+ * surface keeps for its life (its column cache is what makes a repaint cheap),
61
+ * and return what it returned. The surface renders because only it has a
62
+ * drawing context: Skia's exists only inside a picture recording.
63
+ *
64
+ * `frame.baseVersion` is unchanged from the last paint when only the lit
65
+ * notes have changed, which is what lets a surface built on
66
+ * `createLayeredPaint` keep its base and redraw the active track alone.
67
+ */
68
+ paint(score: Score, options: CanvasRenderOptions, frame: PaintFrame): CanvasRenderResult | null;
69
+ /**
70
+ * Show the cursor moving along `path` per `motion` (held when the rate is 0),
71
+ * or hide it with `null`. Called only when either changes.
72
+ */
73
+ showCursor(path: CursorPath | null, motion: CursorMotion): void;
74
+ /** Scroll the view to a content-px target. */
75
+ scrollTo?(target: PlaybackScrollTarget, how: 'jump' | 'smooth'): void;
76
+ /**
77
+ * Build, without drawing, some of what a later paint of `options` will need
78
+ * — `CanvasScoreRenderer.prepare` on the surface's renderer — and answer how
79
+ * much is still missing. The canvas calls it during playback, a slice per
80
+ * task, for the window following the music is about to move to.
81
+ */
82
+ prepare?(score: Score, options: CanvasRenderOptions): number;
83
+ /**
84
+ * How long a painted frame takes to reach the screen after `paint` returns,
85
+ * in ms — the part of highlight latency the canvas cannot time itself. One
86
+ * frame when omitted: a browser composites the canvas at the next frame, and
87
+ * the native app's React commit and Skia draw land about a frame later too.
88
+ */
89
+ readonly presentLatencyMs?: number;
90
+ }
91
+ /**
92
+ * Time and frames, injected.
93
+ *
94
+ * Required rather than defaulted: this package names no host global (see
95
+ * `globals.d.ts`), so a web host passes `requestAnimationFrame` and a native one
96
+ * whatever its runtime offers.
97
+ */
98
+ export type CanvasScheduler = {
99
+ /** Run `callback` before the next paint; returns a canceller. */
100
+ frame(callback: () => void): () => void;
101
+ /** Run `callback` after `ms`; returns a canceller. */
102
+ timeout(callback: () => void, ms: number): () => void;
103
+ /** `performance.now()`. */
104
+ now(): number;
105
+ };
106
+ export type ScoreCanvasOptions = {
107
+ surface: ScoreCanvasSurface;
108
+ scheduler: CanvasScheduler;
109
+ };
110
+ export declare class ScoreCanvas {
111
+ private readonly surface;
112
+ private readonly scheduler;
113
+ private score;
114
+ /** What `setStoredScore` was last given, so a repeat call does no work. */
115
+ private stored;
116
+ private pitchDisplay;
117
+ private view;
118
+ private scrollLeft;
119
+ private scrollTop;
120
+ private activeTrackId;
121
+ private playing;
122
+ private selectedIds;
123
+ private regenerated;
124
+ private outOfRangeIds;
125
+ private selectedMeasureIds;
126
+ private lastFrame;
127
+ /** The plan the last frame was drawn against is only trusted while this matches. */
128
+ private currentPlan;
129
+ private starts;
130
+ private cancelPaint;
131
+ /** What the drawn window last showed, so an invisible colour change skips the paint. */
132
+ private paintedSignature;
133
+ /**
134
+ * Moves whenever something other than the lit notes changes what a paint
135
+ * draws; see `PaintFrame`. Bumped lazily, at the next paint, so a burst of
136
+ * changes costs one version.
137
+ */
138
+ private baseVersion;
139
+ private baseDirty;
140
+ /**
141
+ * Moves with every change `baseDirty` records, eagerly — the base colour
142
+ * signature is cached against it, and that cache is read between paints.
143
+ */
144
+ private baseEpoch;
145
+ private baseSignatureCache;
146
+ /** When the lit notes last changed without being painted yet. */
147
+ private highlightRequestedAt;
148
+ private highlightSamples;
149
+ private highlightLatency;
150
+ private readonly highlightListeners;
151
+ private motion;
152
+ private path;
153
+ private shownMotion;
154
+ private cancelWrap;
155
+ /** The look-ahead preparation in progress, and the window it is for. */
156
+ private cancelLookahead;
157
+ private lookaheadKey;
158
+ private lookaheadPlan;
159
+ constructor({ surface, scheduler }: ScoreCanvasOptions);
160
+ /**
161
+ * The score as the store holds it — sounding pitch, before any lens — and
162
+ * the reading mode to draw it in.
163
+ *
164
+ * The preferred way in. The canvas applies `displayScore` itself and scans
165
+ * the stored score with `outOfRangeNoteIds`, so no host has to remember
166
+ * either half: the scan must see **stored** pitch (the compass is sounding
167
+ * pitch) while the paint must see the **display** score, and a host handed
168
+ * only one of the two was always one line away from colouring a clarinet's
169
+ * part a tone out, or from marking nothing at all.
170
+ *
171
+ * The ids it marks survive the lenses — both keep event ids — so they colour
172
+ * the drawn notes correctly in either mode. Calling again with the same
173
+ * score and mode does nothing. A later `setOutOfRangeNotes` overrides the
174
+ * marks until the stored score next changes.
175
+ */
176
+ setStoredScore(score: Score | null, pitchDisplay?: PitchDisplay): void;
177
+ /**
178
+ * The **display** score, lenses already applied.
179
+ *
180
+ * Lower level than `setStoredScore`: the host owns the lenses and, if it
181
+ * wants out-of-range marks, must pass them to `setOutOfRangeNotes` from a
182
+ * scan of the stored score. Kept for hosts that have not moved over.
183
+ */
184
+ setScore(score: Score | null): void;
185
+ setView(view: ScoreCanvasView): void;
186
+ /** Content px. */
187
+ setScroll(left: number, top: number): void;
188
+ setCursorTick(tick: number): void;
189
+ animateCursor(motion: CursorMotion): void;
190
+ setActiveTrack(trackId: string | null): void;
191
+ setPlayingNotes(notes: readonly SoundingNote[]): void;
192
+ setSelectedNotes(ids: readonly string[], options?: {
193
+ regenerated?: boolean;
194
+ }): void;
195
+ setSelectedMeasures(ids: readonly string[]): void;
196
+ setOutOfRangeNotes(ids: readonly string[]): void;
197
+ /** The layout the canvas draws against, or null with no score or view. */
198
+ get plan(): LayoutPlan | null;
199
+ /** What the last paint drew, while it still describes the current layout. */
200
+ get frame(): CanvasRenderResult | null;
201
+ get zoom(): number;
202
+ /** How large the scrollable content is, in content px. */
203
+ contentSize(): {
204
+ width: number;
205
+ height: number;
206
+ };
207
+ /** Content px. */
208
+ cursorGeometry(tick: number): CursorGeometry | null;
209
+ hitTest(point: ViewPoint): ScoreCanvasHit | null;
210
+ /** The tick under a view point: the inverse of the cursor. */
211
+ tickAt(point: ViewPoint): number | null;
212
+ /** Drawn notes inside a view-px rectangle spanned by two corners. */
213
+ noteIdsInRect(a: ViewPoint, b: ViewPoint): string[];
214
+ /** The bar index `tick` falls in, or null — following playback decides per bar. */
215
+ measureIndexAt(tick: number): number | null;
216
+ /**
217
+ * Ticks per second at `tick` from the written tempo — a first guess for a
218
+ * cursor that has just started moving, before the real rate is measured.
219
+ */
220
+ writtenTicksPerSecond(tick: number): number;
221
+ /** Where following playback should scroll for `tick`, or null to stay. */
222
+ followTarget(tick: number): PlaybackScrollTarget | null;
223
+ /** Scroll so `tick` is in view: a jump for more than a screen, else smooth. */
224
+ scrollToFollow(tick: number): void;
225
+ /**
226
+ * How long a change of lit notes takes to reach the screen here, in seconds:
227
+ * waiting for the frame, drawing, and presenting.
228
+ *
229
+ * Measured rather than assumed because it is a property of the host. A web
230
+ * canvas repaints a window of notation in a few milliseconds; the native app
231
+ * records a Skia picture and waits a React commit, measured at 45–70ms on a
232
+ * dense score. The player publishes the lit notes this far ahead
233
+ * (`setSoundingRenderDelay`), which is what keeps them with the sound on
234
+ * both. The median of recent paints, so one stalled frame does not move it.
235
+ */
236
+ get highlightLatencySeconds(): number;
237
+ subscribeHighlightLatency(listener: (seconds: number) => void): () => void;
238
+ /** Paint now rather than on the next frame — for a host that must, like a resize. */
239
+ paintNow(): void;
240
+ dispose(): void;
241
+ private layoutOptions;
242
+ private positions;
243
+ private invalidateLayout;
244
+ /** Schedules a paint for a colour change; says whether one was needed. */
245
+ private scheduleColourPaint;
246
+ private markBaseDirty;
247
+ /**
248
+ * What colour the drawn window shows, as a string two states compare by.
249
+ *
250
+ * In two parts, because they change at very different rates. Everything but
251
+ * the lit notes — the active track, the selection, the out-of-range marks,
252
+ * the selected bars — changes when somebody does something, and is cached
253
+ * until then; the lit notes change on every note during playback, and are a
254
+ * handful. Building the whole string on every change of lit notes cost time
255
+ * in proportion to every coloured note in the window, which on an import
256
+ * full of out-of-range notes is most of them. A playing note is drawn playing
257
+ * whatever else it is (`buildNoteColors` applies it last), so the two parts
258
+ * together decide the colours exactly.
259
+ */
260
+ private colourSignature;
261
+ private baseSignature;
262
+ /** The drawn notes lit now: the active track's sounding notes on screen. */
263
+ private playingSignature;
264
+ private noteColors;
265
+ private schedulePaint;
266
+ private paint;
267
+ /**
268
+ * While the cursor moves, builds the window following it will show next —
269
+ * the music just past what is drawn, where `followTarget` would put it — a
270
+ * slice per task, so the frame that scrolls there only has to paint.
271
+ *
272
+ * Keyed on the plan and that window, so each is prepared once however many
273
+ * paints happen while it is the next one.
274
+ */
275
+ private scheduleLookahead;
276
+ private measureHighlight;
277
+ private refreshCursor;
278
+ private show;
279
+ }
280
+ //# sourceMappingURL=score-canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-canvas.d.ts","sourceRoot":"","sources":["../src/score-canvas.ts"],"names":[],"mappings":"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"}