@sudobility/music_drawing 0.0.32 → 0.0.34

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 (47) hide show
  1. package/dist/cursor.d.ts +60 -0
  2. package/dist/cursor.d.ts.map +1 -0
  3. package/dist/cursor.js +157 -0
  4. package/dist/cursor.js.map +1 -0
  5. package/dist/index.d.ts +15 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +15 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/keyboard-geometry.d.ts +50 -2
  10. package/dist/keyboard-geometry.d.ts.map +1 -1
  11. package/dist/keyboard-geometry.js +71 -2
  12. package/dist/keyboard-geometry.js.map +1 -1
  13. package/dist/keyboard-keys.d.ts +93 -0
  14. package/dist/keyboard-keys.d.ts.map +1 -0
  15. package/dist/keyboard-keys.js +60 -0
  16. package/dist/keyboard-keys.js.map +1 -0
  17. package/dist/pagination.d.ts +6 -2
  18. package/dist/pagination.d.ts.map +1 -1
  19. package/dist/pagination.js +4 -0
  20. package/dist/pagination.js.map +1 -1
  21. package/dist/playback-binding.d.ts +57 -0
  22. package/dist/playback-binding.d.ts.map +1 -0
  23. package/dist/playback-binding.js +110 -0
  24. package/dist/playback-binding.js.map +1 -0
  25. package/dist/playhead.d.ts.map +1 -1
  26. package/dist/playhead.js +22 -3
  27. package/dist/playhead.js.map +1 -1
  28. package/dist/press.d.ts +66 -0
  29. package/dist/press.d.ts.map +1 -0
  30. package/dist/press.js +64 -0
  31. package/dist/press.js.map +1 -0
  32. package/dist/print-plan.d.ts +64 -0
  33. package/dist/print-plan.d.ts.map +1 -0
  34. package/dist/print-plan.js +101 -0
  35. package/dist/print-plan.js.map +1 -0
  36. package/dist/render-theme.d.ts.map +1 -1
  37. package/dist/render-theme.js +11 -2
  38. package/dist/render-theme.js.map +1 -1
  39. package/dist/score-canvas.d.ts +225 -0
  40. package/dist/score-canvas.d.ts.map +1 -0
  41. package/dist/score-canvas.js +541 -0
  42. package/dist/score-canvas.js.map +1 -0
  43. package/dist/types.d.ts +13 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js +1 -1
  46. package/dist/types.js.map +1 -1
  47. package/package.json +3 -3
@@ -0,0 +1,541 @@
1
+ import { displayScore, measureAtTick, measureIndexOf, } from '@sudobility/music_types';
2
+ import { TRACK_INFO_WIDTH, boxForMeasureIndex, computeLayout, resolveZoom, } from './layout.js';
3
+ import { eventIdAtPoint, eventIdsAtPoint, eventIdsInBox, measureAtPoint, measureIndexAtGutterPoint, pitchAtStavePoint, } from './hit-test.js';
4
+ import { trackIdAtGutterPoint } from './track-gutter.js';
5
+ import { noteColorsFor } from './note-colors.js';
6
+ import { outOfRangeNoteIds } from './out-of-range.js';
7
+ import { playbackScrollTarget } from './playback-scroll.js';
8
+ import { tickForPoint } from './playhead.js';
9
+ import { shouldShowTrackInfo } from './types.js';
10
+ import { cursorGeometryAt, cursorPathFor, cursorTickAt, measureStartTicks, sameCursorPath, systemEndTick, systemIndexForTick, } from './cursor.js';
11
+ /** A frame, the default for `presentLatencyMs`. */
12
+ const FRAME_MS = 16;
13
+ /** Highlight latency before anything has been measured: one frame. */
14
+ const DEFAULT_HIGHLIGHT_LATENCY_SECONDS = 0.016;
15
+ /** Measurements kept for the median. */
16
+ const HIGHLIGHT_SAMPLES = 15;
17
+ /** A change smaller than this is not worth telling the player about. */
18
+ const HIGHLIGHT_REPORT_STEP_SECONDS = 0.003;
19
+ /** Clear space kept between the playing bar and the edge it nears, in view px. */
20
+ const FOLLOW_MARGIN = 40;
21
+ const HELD = { tick: 0, atMs: 0, ticksPerSecond: 0 };
22
+ export class ScoreCanvas {
23
+ constructor({ surface, scheduler }) {
24
+ this.score = null;
25
+ /** What `setStoredScore` was last given, so a repeat call does no work. */
26
+ this.stored = null;
27
+ this.pitchDisplay = 'concert';
28
+ this.view = null;
29
+ this.scrollLeft = 0;
30
+ this.scrollTop = 0;
31
+ this.activeTrackId = null;
32
+ this.playing = [];
33
+ this.selectedIds = [];
34
+ this.regenerated = false;
35
+ this.outOfRangeIds = [];
36
+ this.selectedMeasureIds = new Set();
37
+ this.lastFrame = null;
38
+ /** The plan the last frame was drawn against is only trusted while this matches. */
39
+ this.currentPlan = null;
40
+ this.starts = [];
41
+ this.cancelPaint = null;
42
+ /** What the drawn window last showed, so an invisible colour change skips the paint. */
43
+ this.paintedSignature = '';
44
+ /** When the lit notes last changed without being painted yet. */
45
+ this.highlightRequestedAt = null;
46
+ this.highlightSamples = [];
47
+ this.highlightLatency = DEFAULT_HIGHLIGHT_LATENCY_SECONDS;
48
+ this.highlightListeners = new Set();
49
+ this.motion = HELD;
50
+ this.path = null;
51
+ this.shownMotion = null;
52
+ this.cancelWrap = null;
53
+ this.surface = surface;
54
+ this.scheduler = scheduler;
55
+ }
56
+ // ---- what is drawn -------------------------------------------------------
57
+ /**
58
+ * The score as the store holds it — sounding pitch, before any lens — and
59
+ * the reading mode to draw it in.
60
+ *
61
+ * The preferred way in. The canvas applies `displayScore` itself and scans
62
+ * the stored score with `outOfRangeNoteIds`, so no host has to remember
63
+ * either half: the scan must see **stored** pitch (the compass is sounding
64
+ * pitch) while the paint must see the **display** score, and a host handed
65
+ * only one of the two was always one line away from colouring a clarinet's
66
+ * part a tone out, or from marking nothing at all.
67
+ *
68
+ * The ids it marks survive the lenses — both keep event ids — so they colour
69
+ * the drawn notes correctly in either mode. Calling again with the same
70
+ * score and mode does nothing. A later `setOutOfRangeNotes` overrides the
71
+ * marks until the stored score next changes.
72
+ */
73
+ setStoredScore(score, pitchDisplay = 'concert') {
74
+ if (score === this.stored && pitchDisplay === this.pitchDisplay)
75
+ return;
76
+ const scoreChanged = score !== this.stored;
77
+ this.stored = score;
78
+ this.pitchDisplay = pitchDisplay;
79
+ this.setScore(score ? displayScore(score, pitchDisplay) : null);
80
+ if (scoreChanged) {
81
+ this.outOfRangeIds = outOfRangeNoteIds(score).ids;
82
+ this.scheduleColourPaint();
83
+ }
84
+ }
85
+ /**
86
+ * The **display** score, lenses already applied.
87
+ *
88
+ * Lower level than `setStoredScore`: the host owns the lenses and, if it
89
+ * wants out-of-range marks, must pass them to `setOutOfRangeNotes` from a
90
+ * scan of the stored score. Kept for hosts that have not moved over.
91
+ */
92
+ setScore(score) {
93
+ if (score === this.score)
94
+ return;
95
+ this.score = score;
96
+ this.starts = score ? measureStartTicks(score) : [];
97
+ this.invalidateLayout();
98
+ }
99
+ setView(view) {
100
+ const previous = this.view;
101
+ this.view = view;
102
+ if (previous &&
103
+ previous.width === view.width &&
104
+ previous.zoom === view.zoom &&
105
+ previous.layoutMode === view.layoutMode &&
106
+ previous.theme === view.theme &&
107
+ sameIds(previous.trackIds, view.trackIds)) {
108
+ // Only the height or the pixel ratio moved: same layout, new window.
109
+ if (previous.height !== view.height ||
110
+ previous.devicePixelRatio !== view.devicePixelRatio) {
111
+ this.schedulePaint();
112
+ }
113
+ return;
114
+ }
115
+ this.invalidateLayout();
116
+ }
117
+ /** Content px. */
118
+ setScroll(left, top) {
119
+ if (left === this.scrollLeft && top === this.scrollTop)
120
+ return;
121
+ this.scrollLeft = left;
122
+ this.scrollTop = top;
123
+ this.schedulePaint();
124
+ }
125
+ // ---- 1–2. the cursor -----------------------------------------------------
126
+ setCursorTick(tick) {
127
+ this.animateCursor({ tick, atMs: this.scheduler.now(), ticksPerSecond: 0 });
128
+ }
129
+ animateCursor(motion) {
130
+ this.motion = motion;
131
+ this.refreshCursor();
132
+ }
133
+ // ---- 3–6. what colours the notation --------------------------------------
134
+ setActiveTrack(trackId) {
135
+ if (trackId === this.activeTrackId)
136
+ return;
137
+ this.activeTrackId = trackId;
138
+ // The stave tint changes with it, so this is always visible.
139
+ this.paintedSignature = '';
140
+ this.schedulePaint();
141
+ }
142
+ setPlayingNotes(notes) {
143
+ this.playing = notes;
144
+ // Stamped before scheduling: a host that paints synchronously measures
145
+ // inside `scheduleColourPaint`, and must find the stamp already there.
146
+ const stamped = this.highlightRequestedAt === null;
147
+ if (stamped)
148
+ this.highlightRequestedAt = this.scheduler.now();
149
+ if (!this.scheduleColourPaint() && stamped) {
150
+ this.highlightRequestedAt = null;
151
+ }
152
+ }
153
+ setSelectedNotes(ids, options = {}) {
154
+ this.selectedIds = ids;
155
+ this.regenerated = options.regenerated ?? false;
156
+ this.scheduleColourPaint();
157
+ }
158
+ setSelectedMeasures(ids) {
159
+ this.selectedMeasureIds = new Set(ids);
160
+ this.scheduleColourPaint();
161
+ }
162
+ setOutOfRangeNotes(ids) {
163
+ this.outOfRangeIds = ids;
164
+ this.scheduleColourPaint();
165
+ }
166
+ // ---- questions -----------------------------------------------------------
167
+ /** The layout the canvas draws against, or null with no score or view. */
168
+ get plan() {
169
+ if (this.currentPlan)
170
+ return this.currentPlan;
171
+ if (!this.score || !this.view)
172
+ return null;
173
+ this.currentPlan = computeLayout(this.score, this.layoutOptions(this.view));
174
+ return this.currentPlan;
175
+ }
176
+ /** What the last paint drew, while it still describes the current layout. */
177
+ get frame() {
178
+ return this.lastFrame;
179
+ }
180
+ get zoom() {
181
+ return resolveZoom(this.view?.zoom ?? 1);
182
+ }
183
+ /** How large the scrollable content is, in content px. */
184
+ contentSize() {
185
+ const plan = this.plan;
186
+ if (!plan)
187
+ return { width: 0, height: 0 };
188
+ return {
189
+ width: plan.totalWidth * this.zoom,
190
+ height: plan.totalHeight * this.zoom,
191
+ };
192
+ }
193
+ /** Content px. */
194
+ cursorGeometry(tick) {
195
+ const plan = this.plan;
196
+ if (!plan || !this.score)
197
+ return null;
198
+ return cursorGeometryAt(plan, this.score, this.zoom, tick, this.positions());
199
+ }
200
+ hitTest(point) {
201
+ const plan = this.plan;
202
+ const score = this.score;
203
+ const view = this.view;
204
+ if (!plan || !score || !view)
205
+ return null;
206
+ const zoom = this.zoom;
207
+ // 10. The gutter is pinned to the view, so it is tested in view px.
208
+ if (shouldShowTrackInfo(this.layoutOptions(view))) {
209
+ const trackId = trackIdAtGutterPoint(plan, zoom, this.scrollTop, point);
210
+ if (trackId)
211
+ return { kind: 'trackGutter', trackId };
212
+ if (point.x >= 0 && point.x <= TRACK_INFO_WIDTH * zoom)
213
+ return null;
214
+ }
215
+ const content = {
216
+ x: point.x + this.scrollLeft,
217
+ y: point.y + this.scrollTop,
218
+ };
219
+ const logical = { x: content.x / zoom, y: content.y / zoom };
220
+ // 11.
221
+ const measureIndex = measureIndexAtGutterPoint(plan, logical);
222
+ if (measureIndex !== null)
223
+ return { kind: 'measureNumber', measureIndex };
224
+ const measure = measureAtPoint(plan, logical);
225
+ if (!measure)
226
+ return null;
227
+ const tick = tickForPoint(plan, score, logical.x, logical.y, this.positions()) ?? 0;
228
+ // 12. Bounding boxes are content px.
229
+ const boxes = this.lastFrame?.idToBBox;
230
+ const noteId = boxes ? eventIdAtPoint(boxes, content) : null;
231
+ if (boxes && noteId) {
232
+ const chord = eventIdsAtPoint(boxes, content);
233
+ return {
234
+ kind: 'note',
235
+ eventIds: chord.length > 0 ? chord : [noteId],
236
+ trackId: measure.trackId,
237
+ measureIndex: measure.measureIndex,
238
+ tick,
239
+ };
240
+ }
241
+ // 13.
242
+ return {
243
+ kind: 'stave',
244
+ trackId: measure.trackId,
245
+ measureIndex: measure.measureIndex,
246
+ tick,
247
+ pitch: pitchAtStavePoint(plan, score, logical)?.pitch ?? null,
248
+ };
249
+ }
250
+ /** The tick under a view point: the inverse of the cursor. */
251
+ tickAt(point) {
252
+ const plan = this.plan;
253
+ if (!plan || !this.score)
254
+ return null;
255
+ const zoom = this.zoom;
256
+ return tickForPoint(plan, this.score, (point.x + this.scrollLeft) / zoom, (point.y + this.scrollTop) / zoom, this.positions());
257
+ }
258
+ /** Drawn notes inside a view-px rectangle spanned by two corners. */
259
+ noteIdsInRect(a, b) {
260
+ const boxes = this.lastFrame?.idToBBox;
261
+ if (!boxes)
262
+ return [];
263
+ const x = Math.min(a.x, b.x) + this.scrollLeft;
264
+ const y = Math.min(a.y, b.y) + this.scrollTop;
265
+ return eventIdsInBox(boxes, {
266
+ x,
267
+ y,
268
+ width: Math.abs(a.x - b.x),
269
+ height: Math.abs(a.y - b.y),
270
+ });
271
+ }
272
+ /** The bar index `tick` falls in, or null — following playback decides per bar. */
273
+ measureIndexAt(tick) {
274
+ const score = this.score;
275
+ const track = score?.tracks[0];
276
+ if (!score || !track)
277
+ return null;
278
+ const measure = measureAtTick(score, track.id, tick);
279
+ return measure ? measureIndexOf(score, measure.id) : null;
280
+ }
281
+ /**
282
+ * Ticks per second at `tick` from the written tempo — a first guess for a
283
+ * cursor that has just started moving, before the real rate is measured.
284
+ */
285
+ writtenTicksPerSecond(tick) {
286
+ const score = this.score;
287
+ if (!score)
288
+ return 0;
289
+ let bpm = 0;
290
+ for (const event of score.tempoMap) {
291
+ if (event.tick > tick)
292
+ break;
293
+ bpm = event.bpm;
294
+ }
295
+ return (bpm * score.ppq) / 60;
296
+ }
297
+ /** Where following playback should scroll for `tick`, or null to stay. */
298
+ followTarget(tick) {
299
+ const plan = this.plan;
300
+ const score = this.score;
301
+ const view = this.view;
302
+ const track = score?.tracks[0];
303
+ if (!plan || !score || !view || !track)
304
+ return null;
305
+ const measure = measureAtTick(score, track.id, tick);
306
+ const measureIndex = measure ? measureIndexOf(score, measure.id) : null;
307
+ if (measureIndex === null)
308
+ return null;
309
+ const box = boxForMeasureIndex(plan, 0, measureIndex);
310
+ if (!box)
311
+ return null;
312
+ return playbackScrollTarget({
313
+ plan,
314
+ layoutMode: view.layoutMode,
315
+ zoom: this.zoom,
316
+ measureIndex,
317
+ measureX: box.x,
318
+ measureWidth: box.width,
319
+ scrollLeft: this.scrollLeft,
320
+ viewportWidth: view.width,
321
+ scrollTop: this.scrollTop,
322
+ viewportHeight: view.height,
323
+ margin: FOLLOW_MARGIN,
324
+ });
325
+ }
326
+ /** Scroll so `tick` is in view: a jump for more than a screen, else smooth. */
327
+ scrollToFollow(tick) {
328
+ const target = this.followTarget(tick);
329
+ const view = this.view;
330
+ if (!target || !view)
331
+ return;
332
+ const relocating = Math.abs(target.top - this.scrollTop) > view.height ||
333
+ Math.abs(target.left - this.scrollLeft) > view.width;
334
+ this.surface.scrollTo?.(target, relocating ? 'jump' : 'smooth');
335
+ }
336
+ /**
337
+ * How long a change of lit notes takes to reach the screen here, in seconds:
338
+ * waiting for the frame, drawing, and presenting.
339
+ *
340
+ * Measured rather than assumed because it is a property of the host. A web
341
+ * canvas repaints a window of notation in a few milliseconds; the native app
342
+ * records a Skia picture and waits a React commit, measured at 45–70ms on a
343
+ * dense score. The player publishes the lit notes this far ahead
344
+ * (`setSoundingRenderDelay`), which is what keeps them with the sound on
345
+ * both. The median of recent paints, so one stalled frame does not move it.
346
+ */
347
+ get highlightLatencySeconds() {
348
+ return this.highlightLatency;
349
+ }
350
+ subscribeHighlightLatency(listener) {
351
+ this.highlightListeners.add(listener);
352
+ return () => this.highlightListeners.delete(listener);
353
+ }
354
+ /** Paint now rather than on the next frame — for a host that must, like a resize. */
355
+ paintNow() {
356
+ this.cancelPaint?.();
357
+ this.cancelPaint = null;
358
+ this.paint();
359
+ }
360
+ dispose() {
361
+ this.cancelPaint?.();
362
+ this.cancelPaint = null;
363
+ this.cancelWrap?.();
364
+ this.cancelWrap = null;
365
+ }
366
+ // ---- internals -----------------------------------------------------------
367
+ layoutOptions(view) {
368
+ return {
369
+ zoom: view.zoom,
370
+ layoutMode: view.layoutMode,
371
+ width: view.width,
372
+ theme: view.theme,
373
+ ...(view.trackIds ? { trackIds: view.trackIds } : {}),
374
+ };
375
+ }
376
+ positions() {
377
+ const frame = this.lastFrame;
378
+ return frame && frame.plan === this.plan
379
+ ? frame.measureNotePositions
380
+ : undefined;
381
+ }
382
+ invalidateLayout() {
383
+ this.currentPlan = null;
384
+ this.lastFrame = null;
385
+ this.paintedSignature = '';
386
+ this.schedulePaint();
387
+ this.refreshCursor();
388
+ }
389
+ /** Schedules a paint for a colour change; says whether one was needed. */
390
+ scheduleColourPaint() {
391
+ const frame = this.lastFrame;
392
+ if (frame) {
393
+ const signature = this.colourSignature(frame);
394
+ if (signature === this.paintedSignature)
395
+ return false;
396
+ }
397
+ this.schedulePaint();
398
+ return true;
399
+ }
400
+ colourSignature(frame) {
401
+ let signature = `a${this.activeTrackId ?? ''};`;
402
+ for (const [id, role] of this.noteColors()) {
403
+ if (frame.idToBBox.has(id))
404
+ signature += `${id}:${role};`;
405
+ }
406
+ for (const id of this.selectedMeasureIds) {
407
+ if (frame.measureIdToBBox.has(id))
408
+ signature += `m${id};`;
409
+ }
410
+ return signature;
411
+ }
412
+ noteColors() {
413
+ return noteColorsFor({
414
+ selectedIds: this.selectedIds,
415
+ outOfRangeIds: this.outOfRangeIds,
416
+ sounding: this.playing,
417
+ activeTrackId: this.activeTrackId,
418
+ regenerated: this.regenerated,
419
+ });
420
+ }
421
+ schedulePaint() {
422
+ if (this.cancelPaint)
423
+ return;
424
+ /*
425
+ The canceller is kept only if the callback has not already run. A host
426
+ may run a frame callback synchronously (a test's stubbed
427
+ `requestAnimationFrame` does), and storing the canceller *after* that
428
+ callback had cleared it left this guard set for good: the canvas never
429
+ painted again.
430
+ */
431
+ let ran = false;
432
+ const cancel = this.scheduler.frame(() => {
433
+ ran = true;
434
+ this.cancelPaint = null;
435
+ this.paint();
436
+ });
437
+ if (!ran)
438
+ this.cancelPaint = cancel;
439
+ }
440
+ paint() {
441
+ const score = this.score;
442
+ const view = this.view;
443
+ if (!score || !view)
444
+ return;
445
+ const zoom = this.zoom;
446
+ const noteColors = this.noteColors();
447
+ const frame = this.surface.paint(score, {
448
+ ...this.layoutOptions(view),
449
+ noteColors,
450
+ activeTrackId: this.activeTrackId,
451
+ selectedMeasureIds: this.selectedMeasureIds,
452
+ viewport: {
453
+ top: this.scrollTop / zoom,
454
+ bottom: (this.scrollTop + view.height) / zoom,
455
+ left: this.scrollLeft / zoom,
456
+ right: (this.scrollLeft + view.width) / zoom,
457
+ },
458
+ ...(view.devicePixelRatio
459
+ ? { devicePixelRatio: view.devicePixelRatio }
460
+ : {}),
461
+ });
462
+ this.measureHighlight();
463
+ if (!frame)
464
+ return;
465
+ // The renderer's plan is the one the notes were placed in.
466
+ this.currentPlan = frame.plan;
467
+ this.lastFrame = frame;
468
+ this.paintedSignature = this.colourSignature(frame);
469
+ // 6. A repaint can move the noteheads the path runs through.
470
+ this.refreshCursor();
471
+ }
472
+ measureHighlight() {
473
+ const requestedAt = this.highlightRequestedAt;
474
+ if (requestedAt === null)
475
+ return;
476
+ this.highlightRequestedAt = null;
477
+ const present = this.surface.presentLatencyMs ?? FRAME_MS;
478
+ const sample = (this.scheduler.now() - requestedAt + present) / 1000;
479
+ this.highlightSamples.push(sample);
480
+ if (this.highlightSamples.length > HIGHLIGHT_SAMPLES) {
481
+ this.highlightSamples.shift();
482
+ }
483
+ const sorted = [...this.highlightSamples].sort((a, b) => a - b);
484
+ const median = sorted[sorted.length >> 1] ?? sample;
485
+ const unreported = this.highlightSamples.length === 1;
486
+ if (unreported ||
487
+ Math.abs(median - this.highlightLatency) >= HIGHLIGHT_REPORT_STEP_SECONDS) {
488
+ this.highlightLatency = median;
489
+ for (const listener of this.highlightListeners)
490
+ listener(median);
491
+ }
492
+ }
493
+ refreshCursor() {
494
+ this.cancelWrap?.();
495
+ this.cancelWrap = null;
496
+ const plan = this.plan;
497
+ const score = this.score;
498
+ if (!plan || !score) {
499
+ this.show(null);
500
+ return;
501
+ }
502
+ const now = this.scheduler.now();
503
+ const tick = cursorTickAt(this.motion, now);
504
+ const systemIndex = systemIndexForTick(plan, this.starts, tick);
505
+ const path = systemIndex < 0
506
+ ? null
507
+ : cursorPathFor(plan, score, this.zoom, this.starts, systemIndex, this.positions());
508
+ this.show(path);
509
+ // 6. Hand over to the next system when the moving cursor gets there.
510
+ const rate = this.motion.ticksPerSecond;
511
+ if (path && rate > 0 && systemIndex < plan.systems.length - 1) {
512
+ const end = systemEndTick(plan, this.starts, systemIndex);
513
+ const ms = ((end - tick) / rate) * 1000;
514
+ // Kept only if not already run, for the reason `schedulePaint` gives.
515
+ let ran = false;
516
+ const cancel = this.scheduler.timeout(() => {
517
+ ran = true;
518
+ this.cancelWrap = null;
519
+ this.refreshCursor();
520
+ }, Math.max(0, ms) + 1);
521
+ if (!ran)
522
+ this.cancelWrap = cancel;
523
+ }
524
+ }
525
+ show(path) {
526
+ if (sameCursorPath(path, this.path) && this.shownMotion === this.motion) {
527
+ return;
528
+ }
529
+ this.path = path;
530
+ this.shownMotion = this.motion;
531
+ this.surface.showCursor(path, this.motion);
532
+ }
533
+ }
534
+ function sameIds(a, b) {
535
+ if (a === b)
536
+ return true;
537
+ if (!a || !b || a.length !== b.length)
538
+ return false;
539
+ return a.every((id, index) => id === b[index]);
540
+ }
541
+ //# sourceMappingURL=score-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-canvas.js","sourceRoot":"","sources":["../src/score-canvas.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -79,6 +79,19 @@ export type RenderTheme = {
79
79
  * white paper.
80
80
  */
81
81
  printForeground?: string;
82
+ /**
83
+ * A piano key that is sounding (or held). Defaults to `notePlaying`, so a
84
+ * lit key and a playing note read as the same state.
85
+ *
86
+ * On the theme rather than in each app's keyboard, which is where it was:
87
+ * the web read `notePlaying` while the native app hard-coded its own blues,
88
+ * so the two keyboards lit in different colours for the same note.
89
+ * Optional so a theme written before the keyboard existed still type-checks.
90
+ * Read through `keyboardKeyFill`, which also applies the fallback.
91
+ */
92
+ keyboardLit?: string;
93
+ /** A piano key in the one selected chord. Defaults to `noteSelected`. */
94
+ keyboardSelected?: string;
82
95
  };
83
96
  /** Default high-contrast paper ink. */
84
97
  export declare const PRINT_INK = "#000000";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oGAAoG;AACpG,MAAM,MAAM,aAAa,GACvB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5C,KAAK,oBAAoB,GAAG;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAIvE;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAE1E;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,oHAAoH;IACpH,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,SAAS,YAAY,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAazC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,EAAE,WAkBxC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,iCAAkC,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,UAAU,EAAE,UAAU,CAAC;IACvB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kGAAkG;IAClG,KAAK,EAAE,MAAM,CAAC;IACd,sHAAsH;IACtH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAChD,sGAAsG;IACtG,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4IAA4I;IAC5I,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oGAAoG;AACpG,MAAM,MAAM,aAAa,GACvB,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,CAAC;AAEnE,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5C,KAAK,oBAAoB,GAAG;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAIvE;AAED,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAE1E;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,oHAAoH;IACpH,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,uCAAuC;AACvC,eAAO,MAAM,SAAS,YAAY,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,WAazC,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,EAAE,WAkBxC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,iCAAkC,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,UAAU,EAAE,UAAU,CAAC;IACvB;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kGAAkG;IAClG,KAAK,EAAE,MAAM,CAAC;IACd,sHAAsH;IACtH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAChD,sGAAsG;IACtG,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4IAA4I;IAC5I,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/types.js CHANGED
@@ -33,7 +33,7 @@ export const DEFAULT_SCREEN_RENDER_THEME = {
33
33
  noteSelected: '#050816',
34
34
  noteRegenerated: '#2563eb',
35
35
  notePlaying: '#0f766e',
36
- noteOutOfRange: '#b91c1c',
36
+ noteOutOfRange: '#ea580c',
37
37
  measureSelection: '#f59e0b',
38
38
  staveActive: '#64748b',
39
39
  staveInactive: '#c3ccd8',
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,OAAO,CACL,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,OAAO,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AACtE,CAAC;AA6DD,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAgB;IACrD,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB;;;;MAIE;IACF,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,YAAY,CAAU,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,OAAO,CACL,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,OAAO,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AACtE,CAAC;AA0ED,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAgB;IACtD,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAgB;IACrD,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;IACvB,eAAe,EAAE,SAAS;IAC1B,WAAW,EAAE,SAAS;IACtB;;;;MAIE;IACF,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,SAAS;IAC3B,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;IAChB,eAAe,EAAE,SAAS;CAC3B,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,YAAY,CAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/music_drawing",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "description": "Canvas score rendering for Moosiac: layout, VexFlow drawing and the paint loop.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -44,11 +44,11 @@
44
44
  "vexflow": "^4.2.5"
45
45
  },
46
46
  "peerDependencies": {
47
- "@sudobility/music_types": "^0.13.23"
47
+ "@sudobility/music_types": "^0.13.25"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@eslint/js": "^9.38.0",
51
- "@sudobility/music_types": "^0.13.23",
51
+ "@sudobility/music_types": "^0.13.25",
52
52
  "@sudobility/types": "^1.9.67",
53
53
  "@tonejs/midi": "^2.0.28",
54
54
  "@types/jsdom": "^30.0.0",