@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.
- package/dist/canvas-renderer.d.ts +79 -4
- package/dist/canvas-renderer.d.ts.map +1 -1
- package/dist/canvas-renderer.js +245 -53
- package/dist/canvas-renderer.js.map +1 -1
- package/dist/cursor.d.ts +60 -0
- package/dist/cursor.d.ts.map +1 -0
- package/dist/cursor.js +157 -0
- package/dist/cursor.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/keyboard-geometry.d.ts +50 -2
- package/dist/keyboard-geometry.d.ts.map +1 -1
- package/dist/keyboard-geometry.js +71 -2
- package/dist/keyboard-geometry.js.map +1 -1
- package/dist/keyboard-keys.d.ts +93 -0
- package/dist/keyboard-keys.d.ts.map +1 -0
- package/dist/keyboard-keys.js +60 -0
- package/dist/keyboard-keys.js.map +1 -0
- package/dist/layered-paint.d.ts +47 -0
- package/dist/layered-paint.d.ts.map +1 -0
- package/dist/layered-paint.js +22 -0
- package/dist/layered-paint.js.map +1 -0
- package/dist/pagination.d.ts +6 -2
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +4 -0
- package/dist/pagination.js.map +1 -1
- package/dist/playback-binding.d.ts +57 -0
- package/dist/playback-binding.d.ts.map +1 -0
- package/dist/playback-binding.js +110 -0
- package/dist/playback-binding.js.map +1 -0
- package/dist/playhead.d.ts.map +1 -1
- package/dist/playhead.js +22 -3
- package/dist/playhead.js.map +1 -1
- package/dist/press.d.ts +66 -0
- package/dist/press.d.ts.map +1 -0
- package/dist/press.js +64 -0
- package/dist/press.js.map +1 -0
- package/dist/print-plan.d.ts +64 -0
- package/dist/print-plan.d.ts.map +1 -0
- package/dist/print-plan.js +101 -0
- package/dist/print-plan.js.map +1 -0
- package/dist/render-theme.d.ts.map +1 -1
- package/dist/render-theme.js +11 -2
- package/dist/render-theme.js.map +1 -1
- package/dist/score-canvas.d.ts +280 -0
- package/dist/score-canvas.d.ts.map +1 -0
- package/dist/score-canvas.js +702 -0
- package/dist/score-canvas.js.map +1 -0
- package/dist/skia/index.d.ts +2 -0
- package/dist/skia/index.d.ts.map +1 -1
- package/dist/skia/index.js +1 -0
- package/dist/skia/index.js.map +1 -1
- package/dist/skia/skia-layers.d.ts +43 -0
- package/dist/skia/skia-layers.d.ts.map +1 -0
- package/dist/skia/skia-layers.js +24 -0
- package/dist/skia/skia-layers.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- 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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"}
|