@sudobility/music_types 0.13.26 → 0.13.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +33 -3
- package/dist/domain/documents/document-state.d.ts +17 -0
- package/dist/domain/documents/document-state.d.ts.map +1 -0
- package/dist/domain/documents/document-state.js +6 -0
- package/dist/domain/documents/document-state.js.map +1 -0
- package/dist/domain/documents/export-formats.d.ts +74 -0
- package/dist/domain/documents/export-formats.d.ts.map +1 -0
- package/dist/domain/documents/export-formats.js +53 -0
- package/dist/domain/documents/export-formats.js.map +1 -0
- package/dist/domain/documents/formats.d.ts +17 -0
- package/dist/domain/documents/formats.d.ts.map +1 -0
- package/dist/domain/documents/formats.js +61 -0
- package/dist/domain/documents/formats.js.map +1 -0
- package/dist/domain/documents/project-file.d.ts +33 -0
- package/dist/domain/documents/project-file.d.ts.map +1 -0
- package/dist/domain/documents/project-file.js +14 -0
- package/dist/domain/documents/project-file.js.map +1 -0
- package/dist/domain/documents/publish.d.ts +6 -0
- package/dist/domain/documents/publish.d.ts.map +1 -0
- package/dist/domain/documents/publish.js +2 -0
- package/dist/domain/documents/publish.js.map +1 -0
- package/dist/domain/documents/templates.d.ts +21 -0
- package/dist/domain/documents/templates.d.ts.map +1 -0
- package/dist/domain/documents/templates.js +22 -0
- package/dist/domain/documents/templates.js.map +1 -0
- package/dist/domain/editor/app-errors.d.ts +16 -0
- package/dist/domain/editor/app-errors.d.ts.map +1 -0
- package/dist/domain/editor/app-errors.js +8 -0
- package/dist/domain/editor/app-errors.js.map +1 -0
- package/dist/domain/editor/context-menu.d.ts +74 -0
- package/dist/domain/editor/context-menu.d.ts.map +1 -0
- package/dist/domain/editor/context-menu.js +19 -0
- package/dist/domain/editor/context-menu.js.map +1 -0
- package/dist/domain/editor/device-prefs.d.ts +107 -0
- package/dist/domain/editor/device-prefs.d.ts.map +1 -0
- package/dist/domain/editor/device-prefs.js +66 -0
- package/dist/domain/editor/device-prefs.js.map +1 -0
- package/dist/domain/editor/docs.d.ts +56 -0
- package/dist/domain/editor/docs.d.ts.map +1 -0
- package/dist/domain/editor/docs.js +41 -0
- package/dist/domain/editor/docs.js.map +1 -0
- package/dist/domain/editor/edit-mode.d.ts +31 -0
- package/dist/domain/editor/edit-mode.d.ts.map +1 -0
- package/dist/domain/editor/edit-mode.js +40 -0
- package/dist/domain/editor/edit-mode.js.map +1 -0
- package/dist/domain/editor/editing-copy.d.ts +91 -0
- package/dist/domain/editor/editing-copy.d.ts.map +1 -0
- package/dist/domain/editor/editing-copy.js +88 -0
- package/dist/domain/editor/editing-copy.js.map +1 -0
- package/dist/domain/editor/inspector.d.ts +45 -0
- package/dist/domain/editor/inspector.d.ts.map +1 -0
- package/dist/domain/editor/inspector.js +34 -0
- package/dist/domain/editor/inspector.js.map +1 -0
- package/dist/domain/editor/labelled-option.d.ts +6 -0
- package/dist/domain/editor/labelled-option.d.ts.map +1 -0
- package/dist/domain/editor/labelled-option.js +2 -0
- package/dist/domain/editor/labelled-option.js.map +1 -0
- package/dist/domain/editor/library-copy.d.ts +61 -0
- package/dist/domain/editor/library-copy.d.ts.map +1 -0
- package/dist/domain/editor/library-copy.js +2 -0
- package/dist/domain/editor/library-copy.js.map +1 -0
- package/dist/domain/editor/print.d.ts +30 -0
- package/dist/domain/editor/print.d.ts.map +1 -0
- package/dist/domain/editor/print.js +43 -0
- package/dist/domain/editor/print.js.map +1 -0
- package/dist/domain/editor/score-input.d.ts +158 -0
- package/dist/domain/editor/score-input.d.ts.map +1 -0
- package/dist/domain/editor/score-input.js +2 -0
- package/dist/domain/editor/score-input.js.map +1 -0
- package/dist/domain/editor/toast.d.ts +32 -0
- package/dist/domain/editor/toast.d.ts.map +1 -0
- package/dist/domain/editor/toast.js +5 -0
- package/dist/domain/editor/toast.js.map +1 -0
- package/dist/domain/editor/toolbar.d.ts +62 -0
- package/dist/domain/editor/toolbar.d.ts.map +1 -0
- package/dist/domain/editor/toolbar.js +83 -0
- package/dist/domain/editor/toolbar.js.map +1 -0
- package/dist/domain/editor/view-settings.d.ts +22 -0
- package/dist/domain/editor/view-settings.d.ts.map +1 -0
- package/dist/domain/editor/view-settings.js +30 -0
- package/dist/domain/editor/view-settings.js.map +1 -0
- package/dist/domain/generation/replace-drafts.d.ts +78 -0
- package/dist/domain/generation/replace-drafts.d.ts.map +1 -0
- package/dist/domain/generation/replace-drafts.js +40 -0
- package/dist/domain/generation/replace-drafts.js.map +1 -0
- package/dist/domain/generation/request-drafts.d.ts +226 -0
- package/dist/domain/generation/request-drafts.d.ts.map +1 -0
- package/dist/domain/generation/request-drafts.js +52 -0
- package/dist/domain/generation/request-drafts.js.map +1 -0
- package/dist/domain/instruments/gm-catalogue.d.ts +27 -3
- package/dist/domain/instruments/gm-catalogue.d.ts.map +1 -1
- package/dist/domain/instruments/gm-catalogue.js +4 -3
- package/dist/domain/instruments/gm-catalogue.js.map +1 -1
- package/dist/domain/instruments/gm-polyphony.d.ts +25 -2
- package/dist/domain/instruments/gm-polyphony.d.ts.map +1 -1
- package/dist/domain/instruments/gm-polyphony.js +9 -3
- package/dist/domain/instruments/gm-polyphony.js.map +1 -1
- package/dist/domain/instruments/gm-range.d.ts +10 -6
- package/dist/domain/instruments/gm-range.d.ts.map +1 -1
- package/dist/domain/instruments/gm-range.js +18 -3
- package/dist/domain/instruments/gm-range.js.map +1 -1
- package/dist/domain/instruments/out-of-range.d.ts +70 -0
- package/dist/domain/instruments/out-of-range.d.ts.map +1 -0
- package/dist/domain/instruments/out-of-range.js +106 -0
- package/dist/domain/instruments/out-of-range.js.map +1 -0
- package/dist/domain/instruments/track-instrument.d.ts +23 -0
- package/dist/domain/instruments/track-instrument.d.ts.map +1 -1
- package/dist/domain/instruments/track-instrument.js +26 -0
- package/dist/domain/instruments/track-instrument.js.map +1 -1
- package/dist/domain/notation/music-vocabulary.d.ts +17 -0
- package/dist/domain/notation/music-vocabulary.d.ts.map +1 -1
- package/dist/domain/notation/music-vocabulary.js +25 -1
- package/dist/domain/notation/music-vocabulary.js.map +1 -1
- package/dist/domain/notation/picker-options.d.ts +42 -2
- package/dist/domain/notation/picker-options.d.ts.map +1 -1
- package/dist/domain/notation/picker-options.js +41 -2
- package/dist/domain/notation/picker-options.js.map +1 -1
- package/dist/domain/score/transport-settings.d.ts +29 -0
- package/dist/domain/score/transport-settings.d.ts.map +1 -0
- package/dist/domain/score/transport-settings.js +2 -0
- package/dist/domain/score/transport-settings.js.map +1 -0
- package/dist/formats/audio-import.d.ts +15 -0
- package/dist/formats/audio-import.d.ts.map +1 -0
- package/dist/formats/audio-import.js +26 -0
- package/dist/formats/audio-import.js.map +1 -0
- package/dist/formats/index.d.ts +10 -0
- package/dist/formats/index.d.ts.map +1 -1
- package/dist/formats/index.js +10 -0
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/midi-import.d.ts +128 -0
- package/dist/formats/midi-import.d.ts.map +1 -0
- package/dist/formats/midi-import.js +2 -0
- package/dist/formats/midi-import.js.map +1 -0
- package/dist/formats/musicxml.d.ts +44 -0
- package/dist/formats/musicxml.d.ts.map +1 -0
- package/dist/formats/musicxml.js +2 -0
- package/dist/formats/musicxml.js.map +1 -0
- package/dist/formats/tracker-export.d.ts +55 -0
- package/dist/formats/tracker-export.d.ts.map +1 -0
- package/dist/formats/tracker-export.js +18 -0
- package/dist/formats/tracker-export.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -1
- package/dist/platform/index.d.ts +2 -0
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +2 -0
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/score-files.d.ts +36 -0
- package/dist/platform/score-files.d.ts.map +1 -0
- package/dist/platform/score-files.js +2 -0
- package/dist/platform/score-files.js.map +1 -0
- package/dist/platform/storage.d.ts +19 -0
- package/dist/platform/storage.d.ts.map +1 -0
- package/dist/platform/storage.js +10 -0
- package/dist/platform/storage.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,5 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* How many notes a General MIDI program can sound at once.
|
|
3
|
+
*
|
|
4
|
+
* General MIDI says nothing about this, so the numbers are ours. They are
|
|
5
|
+
* physical facts about the instruments rather than preferences: a trumpet
|
|
6
|
+
* player has one airstream, a guitar has six strings, a banjo five, a violinist
|
|
7
|
+
* can bow two at once (and briefly break three).
|
|
8
|
+
*
|
|
9
|
+
* They live in `gm-catalogue.ts`, one row per program, alongside that
|
|
10
|
+
* program's range and transposition — see that module for why a family default
|
|
11
|
+
* plus overrides turned out to be the wrong shape for this.
|
|
12
|
+
*
|
|
13
|
+
* This exists so the editor can refuse to write a chord nobody could play. It
|
|
14
|
+
* deliberately does NOT describe what a synthesizer patch can do — polyphony
|
|
15
|
+
* there is a setting, not a limit — so every synth family is unlimited.
|
|
16
|
+
*/
|
|
17
|
+
import { UNLIMITED_POLYPHONY } from "./gm-catalogue.js";
|
|
18
|
+
/**
|
|
19
|
+
* `UNLIMITED_POLYPHONY` is declared in `gm-catalogue.ts` and re-exported here,
|
|
20
|
+
* so `./gm-polyphony.js` stays the module it is imported from. It was declared
|
|
21
|
+
* here, and the catalogue's rows read it while building — a cycle that threw
|
|
22
|
+
* `Cannot access 'UNLIMITED_POLYPHONY' before initialization` on any runtime
|
|
23
|
+
* that reached this module first.
|
|
24
|
+
*/
|
|
25
|
+
export { UNLIMITED_POLYPHONY };
|
|
3
26
|
/**
|
|
4
27
|
* The most notes `program` can sound simultaneously.
|
|
5
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gm-polyphony.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gm-polyphony.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAU,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;GAMG;AACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvE"}
|
|
@@ -14,9 +14,15 @@
|
|
|
14
14
|
* deliberately does NOT describe what a synthesizer patch can do — polyphony
|
|
15
15
|
* there is a setting, not a limit — so every synth family is unlimited.
|
|
16
16
|
*/
|
|
17
|
-
import { gmSpec } from "./gm-catalogue.js";
|
|
18
|
-
/**
|
|
19
|
-
|
|
17
|
+
import { gmSpec, UNLIMITED_POLYPHONY } from "./gm-catalogue.js";
|
|
18
|
+
/**
|
|
19
|
+
* `UNLIMITED_POLYPHONY` is declared in `gm-catalogue.ts` and re-exported here,
|
|
20
|
+
* so `./gm-polyphony.js` stays the module it is imported from. It was declared
|
|
21
|
+
* here, and the catalogue's rows read it while building — a cycle that threw
|
|
22
|
+
* `Cannot access 'UNLIMITED_POLYPHONY' before initialization` on any runtime
|
|
23
|
+
* that reached this module first.
|
|
24
|
+
*/
|
|
25
|
+
export { UNLIMITED_POLYPHONY };
|
|
20
26
|
/**
|
|
21
27
|
* The most notes `program` can sound simultaneously.
|
|
22
28
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gm-polyphony.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"gm-polyphony.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-polyphony.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;;GAMG;AACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,YAAY,IAAI,mBAAmB,CAAC;AAC9D,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,OAAO,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -6,12 +6,16 @@
|
|
|
6
6
|
* programs inherited a compass nobody had chosen for them — see that module's
|
|
7
7
|
* doc for what that hid.
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
import { FULL_KEYBOARD, type MidiRange } from "./gm-catalogue.js";
|
|
10
|
+
/**
|
|
11
|
+
* `MidiRange` and `FULL_KEYBOARD` are declared in `gm-catalogue.ts` and
|
|
12
|
+
* re-exported here, so `./gm-range.js` stays the module they are imported from.
|
|
13
|
+
* They were declared here, and the rows over there read `FULL_KEYBOARD` while
|
|
14
|
+
* building — a cycle that threw a TDZ `ReferenceError` on whichever of the two
|
|
15
|
+
* a runtime happened to enter first. Declaring them beside the table they
|
|
16
|
+
* describe is what points the arrows one way.
|
|
17
|
+
*/
|
|
18
|
+
export { FULL_KEYBOARD, type MidiRange };
|
|
15
19
|
/**
|
|
16
20
|
* The practical range for `program`, or the full keyboard for an unknown one —
|
|
17
21
|
* benefit of the doubt rather than edits blocked against a guess.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gm-range.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,
|
|
1
|
+
{"version":3,"file":"gm-range.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAU,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE1E;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAE5D"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* An instrument's compass.
|
|
3
|
+
*
|
|
4
|
+
* The numbers themselves live in `gm-catalogue.ts`, one row per program. They
|
|
5
|
+
* used to live here as a family default plus 38 overrides, which meant 90
|
|
6
|
+
* programs inherited a compass nobody had chosen for them — see that module's
|
|
7
|
+
* doc for what that hid.
|
|
8
|
+
*/
|
|
9
|
+
import { FULL_KEYBOARD, gmSpec } from "./gm-catalogue.js";
|
|
10
|
+
/**
|
|
11
|
+
* `MidiRange` and `FULL_KEYBOARD` are declared in `gm-catalogue.ts` and
|
|
12
|
+
* re-exported here, so `./gm-range.js` stays the module they are imported from.
|
|
13
|
+
* They were declared here, and the rows over there read `FULL_KEYBOARD` while
|
|
14
|
+
* building — a cycle that threw a TDZ `ReferenceError` on whichever of the two
|
|
15
|
+
* a runtime happened to enter first. Declaring them beside the table they
|
|
16
|
+
* describe is what points the arrows one way.
|
|
17
|
+
*/
|
|
18
|
+
export { FULL_KEYBOARD };
|
|
4
19
|
/**
|
|
5
20
|
* The practical range for `program`, or the full keyboard for an unknown one —
|
|
6
21
|
* benefit of the doubt rather than edits blocked against a guess.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gm-range.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gm-range.js","sourceRoot":"","sources":["../../../src/domain/instruments/gm-range.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAkB,MAAM,mBAAmB,CAAC;AAE1E;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAkB,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,aAAa,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes an instrument cannot play, found in a score that already holds them.
|
|
3
|
+
*
|
|
4
|
+
* Here, beside `trackRangeIsBinding`, because two apps draw this score and its
|
|
5
|
+
* inspector, and "which notes are out of range, and why" having two answers is
|
|
6
|
+
* how the native app came to light nothing at all during playback. It is a pure
|
|
7
|
+
* question about the model — no geometry and no colour — so it belongs with the
|
|
8
|
+
* compass it reads rather than with the renderer that colours the answer.
|
|
9
|
+
*
|
|
10
|
+
* The compass lives in one place — `gm-catalogue.ts`, reached through
|
|
11
|
+
* `trackKeyboardRange` — and three of the four surfaces that care already read
|
|
12
|
+
* it: the keyboard shows exactly that span, generation now states it in the
|
|
13
|
+
* prompt, and `inspect.ts` judges a generated part against it. The notation is
|
|
14
|
+
* the exception, by design: it draws what the score holds, because a score is
|
|
15
|
+
* not only ever a generated one.
|
|
16
|
+
*
|
|
17
|
+
* That is the disagreement a reader actually meets. A timpani part written a
|
|
18
|
+
* fifth below its lowest drum draws perfectly well on the stave and cannot
|
|
19
|
+
* light a single key on the keyboard — measured on one project, 482 of 1,067
|
|
20
|
+
* notes. Nothing here rewrites those notes: they are marked, and moving them
|
|
21
|
+
* by an octave is a musical decision that belongs to the person reading, not
|
|
22
|
+
* to a scan.
|
|
23
|
+
*
|
|
24
|
+
* Gated on `trackRangeIsBinding`, the same condition the server applies, so the
|
|
25
|
+
* page and the server cannot disagree about what counts as out of range. A
|
|
26
|
+
* compass nobody verified marks nothing.
|
|
27
|
+
*
|
|
28
|
+
* ## Sounding pitch, and so the STORED score
|
|
29
|
+
*
|
|
30
|
+
* Every number in `gm-catalogue.ts` is sounding pitch, and `midiIsInRange` is
|
|
31
|
+
* documented as taking one. The score this package *draws* is not: the app
|
|
32
|
+
* hands `render` a `displayScore(score, pitchDisplay)`, which in written mode
|
|
33
|
+
* has moved a B-flat clarinet up a tone and, in every mode, has moved an
|
|
34
|
+
* `8va`'s noteheads down an octave. Scanning that would place a clarinet's
|
|
35
|
+
* whole part a tone above where it sounds and mark the top of it wrongly.
|
|
36
|
+
*
|
|
37
|
+
* So this takes the **stored** score — the one the app holds, before the
|
|
38
|
+
* lenses — and the result stays correct in either display mode because it is
|
|
39
|
+
* expressed as event **ids**, which both lenses preserve: `transposeEvents`
|
|
40
|
+
* and `ottavaScore` spread `...event` and replace only `pitch`. The renderer
|
|
41
|
+
* colours by id, so "which notes" survives a transposition that changes what
|
|
42
|
+
* those notes look like. `out-of-range.test.ts` pins that with a clarinet.
|
|
43
|
+
*/
|
|
44
|
+
import { type Score } from "../../model/score.js";
|
|
45
|
+
import type { MidiRange } from "./gm-range.js";
|
|
46
|
+
export type OutOfRangeTrack = {
|
|
47
|
+
trackId: string;
|
|
48
|
+
name: string;
|
|
49
|
+
/** What the instrument can play. */
|
|
50
|
+
compass: MidiRange;
|
|
51
|
+
/** How many notes fall outside it. */
|
|
52
|
+
count: number;
|
|
53
|
+
/** The distinct pitches that do, lowest first. */
|
|
54
|
+
midis: number[];
|
|
55
|
+
};
|
|
56
|
+
export type OutOfRangeScan = {
|
|
57
|
+
/** Every offending note id, for the notation's colours. */
|
|
58
|
+
ids: string[];
|
|
59
|
+
/** One entry per track that has any, for the inspector's sentence. */
|
|
60
|
+
byTrack: OutOfRangeTrack[];
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Every note `score` holds that its own instrument cannot play.
|
|
64
|
+
*
|
|
65
|
+
* `score` is the **stored** score — sounding pitch, before `displayScore`. Do
|
|
66
|
+
* not pass the score handed to `render`; see this module's doc for why, and
|
|
67
|
+
* why the ids come back usable in either display mode anyway.
|
|
68
|
+
*/
|
|
69
|
+
export declare function outOfRangeNoteIds(score: Score | null): OutOfRangeScan;
|
|
70
|
+
//# sourceMappingURL=out-of-range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"out-of-range.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/out-of-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,SAAS,CAAC;IACnB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,sEAAsE;IACtE,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAIF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,cAAc,CAiDrE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes an instrument cannot play, found in a score that already holds them.
|
|
3
|
+
*
|
|
4
|
+
* Here, beside `trackRangeIsBinding`, because two apps draw this score and its
|
|
5
|
+
* inspector, and "which notes are out of range, and why" having two answers is
|
|
6
|
+
* how the native app came to light nothing at all during playback. It is a pure
|
|
7
|
+
* question about the model — no geometry and no colour — so it belongs with the
|
|
8
|
+
* compass it reads rather than with the renderer that colours the answer.
|
|
9
|
+
*
|
|
10
|
+
* The compass lives in one place — `gm-catalogue.ts`, reached through
|
|
11
|
+
* `trackKeyboardRange` — and three of the four surfaces that care already read
|
|
12
|
+
* it: the keyboard shows exactly that span, generation now states it in the
|
|
13
|
+
* prompt, and `inspect.ts` judges a generated part against it. The notation is
|
|
14
|
+
* the exception, by design: it draws what the score holds, because a score is
|
|
15
|
+
* not only ever a generated one.
|
|
16
|
+
*
|
|
17
|
+
* That is the disagreement a reader actually meets. A timpani part written a
|
|
18
|
+
* fifth below its lowest drum draws perfectly well on the stave and cannot
|
|
19
|
+
* light a single key on the keyboard — measured on one project, 482 of 1,067
|
|
20
|
+
* notes. Nothing here rewrites those notes: they are marked, and moving them
|
|
21
|
+
* by an octave is a musical decision that belongs to the person reading, not
|
|
22
|
+
* to a scan.
|
|
23
|
+
*
|
|
24
|
+
* Gated on `trackRangeIsBinding`, the same condition the server applies, so the
|
|
25
|
+
* page and the server cannot disagree about what counts as out of range. A
|
|
26
|
+
* compass nobody verified marks nothing.
|
|
27
|
+
*
|
|
28
|
+
* ## Sounding pitch, and so the STORED score
|
|
29
|
+
*
|
|
30
|
+
* Every number in `gm-catalogue.ts` is sounding pitch, and `midiIsInRange` is
|
|
31
|
+
* documented as taking one. The score this package *draws* is not: the app
|
|
32
|
+
* hands `render` a `displayScore(score, pitchDisplay)`, which in written mode
|
|
33
|
+
* has moved a B-flat clarinet up a tone and, in every mode, has moved an
|
|
34
|
+
* `8va`'s noteheads down an octave. Scanning that would place a clarinet's
|
|
35
|
+
* whole part a tone above where it sounds and mark the top of it wrongly.
|
|
36
|
+
*
|
|
37
|
+
* So this takes the **stored** score — the one the app holds, before the
|
|
38
|
+
* lenses — and the result stays correct in either display mode because it is
|
|
39
|
+
* expressed as event **ids**, which both lenses preserve: `transposeEvents`
|
|
40
|
+
* and `ottavaScore` spread `...event` and replace only `pitch`. The renderer
|
|
41
|
+
* colours by id, so "which notes" survives a transposition that changes what
|
|
42
|
+
* those notes look like. `out-of-range.test.ts` pins that with a clarinet.
|
|
43
|
+
*/
|
|
44
|
+
import { isNoteEvent } from "../../model/score.js";
|
|
45
|
+
import { pitchToMidi } from "../pitch/pitch.js";
|
|
46
|
+
import { midiIsInRange, trackRangeIsBinding } from "./range-fit.js";
|
|
47
|
+
import { isPercussionTrack, trackKeyboardRange } from "./track-instrument.js";
|
|
48
|
+
const EMPTY = { ids: [], byTrack: [] };
|
|
49
|
+
/**
|
|
50
|
+
* Every note `score` holds that its own instrument cannot play.
|
|
51
|
+
*
|
|
52
|
+
* `score` is the **stored** score — sounding pitch, before `displayScore`. Do
|
|
53
|
+
* not pass the score handed to `render`; see this module's doc for why, and
|
|
54
|
+
* why the ids come back usable in either display mode anyway.
|
|
55
|
+
*/
|
|
56
|
+
export function outOfRangeNoteIds(score) {
|
|
57
|
+
if (!score)
|
|
58
|
+
return EMPTY;
|
|
59
|
+
const ids = [];
|
|
60
|
+
const byTrack = [];
|
|
61
|
+
for (const track of score.tracks) {
|
|
62
|
+
/*
|
|
63
|
+
* A drum pitch names a drum rather than a place in a compass, so this test
|
|
64
|
+
* comes FIRST and is not folded into the gate below it.
|
|
65
|
+
*
|
|
66
|
+
* `trackRangeIsBinding` answers **true** for percussion on purpose — a kit
|
|
67
|
+
* has the pieces it has, which is the right answer for note entry and for
|
|
68
|
+
* generation, where refusing an address no drum sits at is a service. It is
|
|
69
|
+
* the wrong answer here: `percussion.ts` already handles a drum outside
|
|
70
|
+
* `GM_PERCUSSION_RANGE` by parking it on the middle line as `UNMAPPED`, and
|
|
71
|
+
* colouring it as well would be two marks for one fact.
|
|
72
|
+
*/
|
|
73
|
+
if (isPercussionTrack(track))
|
|
74
|
+
continue;
|
|
75
|
+
if (!trackRangeIsBinding(track))
|
|
76
|
+
continue;
|
|
77
|
+
const compass = trackKeyboardRange(track);
|
|
78
|
+
const midis = new Set();
|
|
79
|
+
let count = 0;
|
|
80
|
+
for (const measure of track.measures) {
|
|
81
|
+
for (const voice of measure.voices) {
|
|
82
|
+
for (const event of voice.events) {
|
|
83
|
+
if (!isNoteEvent(event))
|
|
84
|
+
continue;
|
|
85
|
+
const midi = pitchToMidi(event.pitch);
|
|
86
|
+
if (midiIsInRange(midi, compass))
|
|
87
|
+
continue;
|
|
88
|
+
ids.push(event.id);
|
|
89
|
+
midis.add(midi);
|
|
90
|
+
count += 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (count > 0) {
|
|
95
|
+
byTrack.push({
|
|
96
|
+
trackId: track.id,
|
|
97
|
+
name: track.name,
|
|
98
|
+
compass,
|
|
99
|
+
count,
|
|
100
|
+
midis: [...midis].sort((a, b) => a - b),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return ids.length > 0 ? { ids, byTrack } : EMPTY;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=out-of-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"out-of-range.js","sourceRoot":"","sources":["../../../src/domain/instruments/out-of-range.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,EAAE,WAAW,EAAc,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAoB9E,MAAM,KAAK,GAAmB,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC;;;;;;;;;;WAUG;QACH,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAAE,SAAS;QAE1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;wBAAE,SAAS;oBAClC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;wBAAE,SAAS;oBAC3C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACnB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAChB,KAAK,IAAI,CAAC,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO;gBACP,KAAK;gBACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACnD,CAAC"}
|
|
@@ -24,6 +24,29 @@ import { type MidiRange } from "./gm-range.js";
|
|
|
24
24
|
import type { InstrumentIconArt } from "./icon-art.js";
|
|
25
25
|
/** Whether `track`'s `midiProgram` addresses a drum kit rather than an instrument. */
|
|
26
26
|
export declare function isPercussionTrack(track: Pick<Track, "clef">): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* What pressing a key on `track`'s keyboard should sound: a program, and
|
|
29
|
+
* whether it goes to the drum channel.
|
|
30
|
+
*
|
|
31
|
+
* Both keyboards built this inline — `track?.midiProgram ?? 0` beside
|
|
32
|
+
* `track?.clef === 'percussion'` — and both halves are needed, because on a
|
|
33
|
+
* percussion track `midiProgram` names a kit: program 40 is Brush there and
|
|
34
|
+
* Violin anywhere else, and only the flag tells a player which. Two call sites
|
|
35
|
+
* spelling the same pair agree right up until one of them learns a rule the
|
|
36
|
+
* other has not. A percussion address GM defines no kit at is resolved to the
|
|
37
|
+
* kit whose region contains it (`gmKitAt`), which is what playback does, so a
|
|
38
|
+
* key and the part it belongs to cannot sound like different kits.
|
|
39
|
+
*
|
|
40
|
+
* No track — an empty score, or a keyboard shown before a part is chosen —
|
|
41
|
+
* auditions a piano, program 0, which is what both keyboards fell back to.
|
|
42
|
+
* The instrument's *name* is deliberately not here: the player resolves that
|
|
43
|
+
* from the program itself, and a name read off the track would be the one
|
|
44
|
+
* field free to disagree with it.
|
|
45
|
+
*/
|
|
46
|
+
export declare function auditionVoiceFor(track: Pick<Track, "clef" | "midiProgram"> | null | undefined): {
|
|
47
|
+
program: number;
|
|
48
|
+
isPercussion: boolean;
|
|
49
|
+
};
|
|
27
50
|
/**
|
|
28
51
|
* The notes worth showing for `track` — General MIDI's drum range on a
|
|
29
52
|
* percussion track, the instrument's compass otherwise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-instrument.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/track-instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EACV,yBAAyB,EACzB,KAAK,EACL,KAAK,EACN,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAMlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,SAAS,CAGX;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAIR;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,iBAAiB,CAInB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAezD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,GACX,yBAAyB,CAgB3B"}
|
|
1
|
+
{"version":3,"file":"track-instrument.d.ts","sourceRoot":"","sources":["../../../src/domain/instruments/track-instrument.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EACV,yBAAyB,EACzB,KAAK,EACL,KAAK,EACN,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAMlE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGvD,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,OAAO,CAErE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GAAG,IAAI,GAAG,SAAS,GAC5D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAK5C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,SAAS,CAGX;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAIR;AAED,0FAA0F;AAC1F,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,iBAAiB,CAInB;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,GACzC,MAAM,CAGR;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAezD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,GACX,yBAAyB,CAgB3B"}
|
|
@@ -9,6 +9,32 @@ import { gmInstrument } from "./gm.js";
|
|
|
9
9
|
export function isPercussionTrack(track) {
|
|
10
10
|
return track.clef === "percussion";
|
|
11
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* What pressing a key on `track`'s keyboard should sound: a program, and
|
|
14
|
+
* whether it goes to the drum channel.
|
|
15
|
+
*
|
|
16
|
+
* Both keyboards built this inline — `track?.midiProgram ?? 0` beside
|
|
17
|
+
* `track?.clef === 'percussion'` — and both halves are needed, because on a
|
|
18
|
+
* percussion track `midiProgram` names a kit: program 40 is Brush there and
|
|
19
|
+
* Violin anywhere else, and only the flag tells a player which. Two call sites
|
|
20
|
+
* spelling the same pair agree right up until one of them learns a rule the
|
|
21
|
+
* other has not. A percussion address GM defines no kit at is resolved to the
|
|
22
|
+
* kit whose region contains it (`gmKitAt`), which is what playback does, so a
|
|
23
|
+
* key and the part it belongs to cannot sound like different kits.
|
|
24
|
+
*
|
|
25
|
+
* No track — an empty score, or a keyboard shown before a part is chosen —
|
|
26
|
+
* auditions a piano, program 0, which is what both keyboards fell back to.
|
|
27
|
+
* The instrument's *name* is deliberately not here: the player resolves that
|
|
28
|
+
* from the program itself, and a name read off the track would be the one
|
|
29
|
+
* field free to disagree with it.
|
|
30
|
+
*/
|
|
31
|
+
export function auditionVoiceFor(track) {
|
|
32
|
+
if (!track)
|
|
33
|
+
return { program: 0, isPercussion: false };
|
|
34
|
+
if (isPercussionTrack(track))
|
|
35
|
+
return { program: gmKitAt(track.midiProgram).program, isPercussion: true };
|
|
36
|
+
return { program: track.midiProgram, isPercussion: false };
|
|
37
|
+
}
|
|
12
38
|
/**
|
|
13
39
|
* The notes worth showing for `track` — General MIDI's drum range on a
|
|
14
40
|
* percussion track, the instrument's compass otherwise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-instrument.js","sourceRoot":"","sources":["../../../src/domain/instruments/track-instrument.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"track-instrument.js","sourceRoot":"","sources":["../../../src/domain/instruments/track-instrument.ts"],"names":[],"mappings":"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"}
|
|
@@ -96,6 +96,23 @@ export declare function formatBarBeat(at: BarBeat | null): string;
|
|
|
96
96
|
* "beat 9" in 4/4 means the end of the bar rather than an error.
|
|
97
97
|
*/
|
|
98
98
|
export declare function tickForBarBeat(score: Score, bar: number, beat: number): number | null;
|
|
99
|
+
/**
|
|
100
|
+
* What a bar/beat field should commit when it is left: a tick, or `null` for
|
|
101
|
+
* "nothing to do".
|
|
102
|
+
*
|
|
103
|
+
* A position is said in two numbers and typed into two boxes, so every rule
|
|
104
|
+
* about leaving them is about the pair: a cleared box is "no change" and never
|
|
105
|
+
* bar 0 (`Number("")` is 0), a bar the score does not have is nothing to
|
|
106
|
+
* commit, and the tick the note already sits on is not a move. Both inspectors
|
|
107
|
+
* had that sequence written out — two `parseNumericDraft`s, `tickForBarBeat`,
|
|
108
|
+
* and the same "unchanged?" comparison — and it is arithmetic about a score
|
|
109
|
+
* rather than about either panel.
|
|
110
|
+
*
|
|
111
|
+
* A beat past the end of its bar is clamped by `tickForBarBeat` rather than
|
|
112
|
+
* refused, which is why this can answer the note's own tick: typing "beat 9" in
|
|
113
|
+
* 4/4 on a note already at the end of the bar commits nothing.
|
|
114
|
+
*/
|
|
115
|
+
export declare function barBeatCommitTick(score: Score, barText: string, beatText: string, currentTick: number): number | null;
|
|
99
116
|
/**
|
|
100
117
|
* The pitch at a staff position, counted in half-spaces below the top line.
|
|
101
118
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"music-vocabulary.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAQxB,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAA6B,YAAY,EAAE,CAAC;AAuBvE,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAyCD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAI1D;AAED,mCAAmC;AACnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;CAC3C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GACzB,kBAAkB,EAAE,CAYtB;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CA2BzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAef;AAuBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,qBAAqB,EAAE,MAAM,GAC5B,KAAK,CAEP;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM;AACnB;;;;;;;GAOG;AACH,SAAS,SAAI,GACZ,MAAM,CAKR"}
|
|
1
|
+
{"version":3,"file":"music-vocabulary.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAQxB,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAA6B,YAAY,EAAE,CAAC;AAuBvE,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD;AAyCD,sEAAsE;AACtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAI1D;AAED,mCAAmC;AACnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,cAAc,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;CAC3C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GACzB,kBAAkB,EAAE,CAYtB;AAID;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CA2BzE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,MAAM,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAef;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAMf;AAuBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,IAAI,EACV,qBAAqB,EAAE,MAAM,GAC5B,KAAK,CAEP;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM;AACnB;;;;;;;GAOG;AACH,SAAS,SAAI,GACZ,MAAM,CAKR"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DURATIONS, beatDurationTicks } from "../time/ticks.js";
|
|
2
2
|
import { barNumberAt, indexOfBarNumber } from "../score/bar-numbers.js";
|
|
3
3
|
import { shiftDiatonic } from "../pitch/transpose.js";
|
|
4
|
-
import { clampVolume } from "./field-values.js";
|
|
4
|
+
import { clampVolume, parseNumericDraft } from "./field-values.js";
|
|
5
5
|
// ---- durations -------------------------------------------------------------
|
|
6
6
|
/** Every duration name, longest first, so a picker reads top to bottom. */
|
|
7
7
|
export const DURATION_NAMES = Object.keys(DURATIONS);
|
|
@@ -177,6 +177,30 @@ export function tickForBarBeat(score, bar, beat) {
|
|
|
177
177
|
const offset = Math.max(0, (beat - 1) * beatTicks);
|
|
178
178
|
return measure.startTick + Math.min(offset, measure.durationTicks - 1);
|
|
179
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* What a bar/beat field should commit when it is left: a tick, or `null` for
|
|
182
|
+
* "nothing to do".
|
|
183
|
+
*
|
|
184
|
+
* A position is said in two numbers and typed into two boxes, so every rule
|
|
185
|
+
* about leaving them is about the pair: a cleared box is "no change" and never
|
|
186
|
+
* bar 0 (`Number("")` is 0), a bar the score does not have is nothing to
|
|
187
|
+
* commit, and the tick the note already sits on is not a move. Both inspectors
|
|
188
|
+
* had that sequence written out — two `parseNumericDraft`s, `tickForBarBeat`,
|
|
189
|
+
* and the same "unchanged?" comparison — and it is arithmetic about a score
|
|
190
|
+
* rather than about either panel.
|
|
191
|
+
*
|
|
192
|
+
* A beat past the end of its bar is clamped by `tickForBarBeat` rather than
|
|
193
|
+
* refused, which is why this can answer the note's own tick: typing "beat 9" in
|
|
194
|
+
* 4/4 on a note already at the end of the bar commits nothing.
|
|
195
|
+
*/
|
|
196
|
+
export function barBeatCommitTick(score, barText, beatText, currentTick) {
|
|
197
|
+
const bar = parseNumericDraft(barText);
|
|
198
|
+
const beat = parseNumericDraft(beatText);
|
|
199
|
+
if (bar === null || beat === null)
|
|
200
|
+
return null;
|
|
201
|
+
const tick = tickForBarBeat(score, bar, beat);
|
|
202
|
+
return tick === null || tick === currentTick ? null : tick;
|
|
203
|
+
}
|
|
180
204
|
// ---- staff positions -------------------------------------------------------
|
|
181
205
|
/**
|
|
182
206
|
* The pitch printed on each clef's top staff line.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"music-vocabulary.js","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"music-vocabulary.js","sourceRoot":"","sources":["../../../src/domain/notation/music-vocabulary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Accidental, Articulation, BarlineStyle, DurationName, Dynamic, KeySignature, Ornament } from "../../
|
|
1
|
+
import type { Accidental, Articulation, BarlineStyle, Clef, DurationName, Dynamic, KeySignature, Ornament } from "../../model/score.js";
|
|
2
2
|
/** "No marking here", distinct from a marking that happens to be quiet. */
|
|
3
3
|
export declare const NO_MARK = "none";
|
|
4
4
|
/** An entry in a picker: the value it sets, and the key naming it. */
|
|
@@ -25,8 +25,26 @@ export declare const ARTICULATION_OPTIONS: ReadonlyArray<PickerOption<Articulati
|
|
|
25
25
|
export declare const ORNAMENT_OPTIONS: ReadonlyArray<PickerOption<Ornament | typeof NO_MARK>>;
|
|
26
26
|
/** Accidentals, keyed `accidental.<fifths>` — `accidental.-1` is Flat. */
|
|
27
27
|
export declare const ACCIDENTAL_OPTIONS: ReadonlyArray<PickerOption<Accidental>>;
|
|
28
|
+
/**
|
|
29
|
+
* An entry in the dynamic picker.
|
|
30
|
+
*
|
|
31
|
+
* Only "no dynamic" carries a key. A marking is its own label — `pp` is `pp`
|
|
32
|
+
* in every language, the way a note name or a General MIDI program name is —
|
|
33
|
+
* so both apps print the value itself. The list used to hand every marking a
|
|
34
|
+
* `dynamic.<member>` key regardless, which neither app defined and neither
|
|
35
|
+
* could usefully fill: a translator has nothing to write for `mf`, and a
|
|
36
|
+
* published key nobody answers is a key some future picker prints raw. Leaving
|
|
37
|
+
* it off the type makes "label a marking by its value" something the compiler
|
|
38
|
+
* says rather than something each host has to know.
|
|
39
|
+
*/
|
|
40
|
+
export type DynamicOption = {
|
|
41
|
+
value: typeof NO_MARK;
|
|
42
|
+
labelKey: string;
|
|
43
|
+
} | {
|
|
44
|
+
value: Dynamic;
|
|
45
|
+
};
|
|
28
46
|
/** Dynamics, with "no dynamic" first. A level is not a loudness of zero. */
|
|
29
|
-
export declare const DYNAMIC_OPTIONS: ReadonlyArray<
|
|
47
|
+
export declare const DYNAMIC_OPTIONS: ReadonlyArray<DynamicOption>;
|
|
30
48
|
/**
|
|
31
49
|
* The grids a MIDI import may be quantized onto, coarsest first.
|
|
32
50
|
*
|
|
@@ -66,4 +84,26 @@ export declare const BARLINE_OPTIONS: ReadonlyArray<PickerOption<BarlineStyle |
|
|
|
66
84
|
* which is how a Chinese reader came to choose a mode in English.
|
|
67
85
|
*/
|
|
68
86
|
export declare const KEY_MODE_OPTIONS: ReadonlyArray<PickerOption<KeySignature["mode"]>>;
|
|
87
|
+
/**
|
|
88
|
+
* The word for each clef.
|
|
89
|
+
*
|
|
90
|
+
* Every clef picker used to print the model's own token — `treble`, `bass` — so
|
|
91
|
+
* a reader chose a clef in lower-case English whatever their language. Both
|
|
92
|
+
* apps then fixed that the same way and each kept its own copy of this table,
|
|
93
|
+
* which is exactly the drift this file exists to prevent: a `Record`, so a
|
|
94
|
+
* sixth clef fails to compile here rather than printing its token in somebody's
|
|
95
|
+
* picker.
|
|
96
|
+
*
|
|
97
|
+
* Published as the record *and* as the options below, because both shapes are
|
|
98
|
+
* in use: the Bar tab names the clef *in force* ("carry on with Treble"), which
|
|
99
|
+
* is one lookup rather than a list.
|
|
100
|
+
*/
|
|
101
|
+
export declare const CLEF_LABEL_KEY: Record<Clef, string>;
|
|
102
|
+
/**
|
|
103
|
+
* Every clef, in the model's order.
|
|
104
|
+
*
|
|
105
|
+
* There is no "none" here: a stave always has a clef, so the absence a *bar*
|
|
106
|
+
* can express is `INHERIT_CLEF`, which the Bar tab prepends itself.
|
|
107
|
+
*/
|
|
108
|
+
export declare const CLEF_OPTIONS: ReadonlyArray<PickerOption<Clef>>;
|
|
69
109
|
//# sourceMappingURL=picker-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-options.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/picker-options.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"picker-options.d.ts","sourceRoot":"","sources":["../../../src/domain/notation/picker-options.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAE9B,2EAA2E;AAC3E,eAAO,MAAM,OAAO,SAAS,CAAC;AAE9B,sEAAsE;AACtE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAC9C,YAAY,CAAC,YAAY,GAAG,OAAO,OAAO,CAAC,CAO5C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAC1C,YAAY,CAAC,QAAQ,GAAG,OAAO,OAAO,CAAC,CASxC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CACG,CAAC;AAE3E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,KAAK,EAAE,OAAO,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvB,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,aAAa,CAGxD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAC3C,YAAY,CAAC,YAAY,GAAG,OAAO,OAAO,CAAC,CAS5C,CAAC;AAaF;;;;GAIG;AACH,eAAO,MAAM,eAAe,eAAe,CAAC;AAE5C,wEAAwE;AACxE,eAAO,MAAM,YAAY,YAAY,CAAC;AAEtC,2CAA2C;AAC3C,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,sEAAsE;AACtE,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,8CAA8C;AAC9C,eAAO,MAAM,OAAO,SAAS,CAAC;AAQ9B;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,CACzC,YAAY,CAAC,YAAY,GAAG,OAAO,cAAc,CAAC,CAOnD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAI1E,CAAC;AAEN;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAM/C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAE1D,CAAC"}
|