@sudobility/music_types 0.11.30 → 0.11.31
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/domain/commands/edit-commands.d.ts +3 -3
- package/dist/domain/commands/edit-commands.d.ts.map +1 -1
- package/dist/domain/commands/edit-commands.js +25 -25
- package/dist/domain/commands/edit-commands.js.map +1 -1
- package/dist/domain/commands/history.d.ts +32 -0
- package/dist/domain/commands/history.d.ts.map +1 -0
- package/dist/domain/commands/history.js +63 -0
- package/dist/domain/commands/history.js.map +1 -0
- package/dist/domain/commands/note-commands.d.ts +147 -3
- package/dist/domain/commands/note-commands.d.ts.map +1 -1
- package/dist/domain/commands/note-commands.js +438 -46
- package/dist/domain/commands/note-commands.js.map +1 -1
- package/dist/domain/commands/reflow.d.ts +1 -1
- package/dist/domain/commands/reflow.js +17 -17
- package/dist/domain/commands/reflow.js.map +1 -1
- package/dist/domain/commands/region-commands.d.ts +4 -4
- package/dist/domain/commands/region-commands.d.ts.map +1 -1
- package/dist/domain/commands/region-commands.js +7 -7
- package/dist/domain/commands/region-commands.js.map +1 -1
- package/dist/domain/commands/relocate-commands.d.ts +3 -3
- package/dist/domain/commands/relocate-commands.js +15 -15
- package/dist/domain/commands/relocate-commands.js.map +1 -1
- package/dist/domain/commands/ripple-commands.d.ts +2 -2
- package/dist/domain/commands/ripple-commands.js +13 -13
- package/dist/domain/commands/ripple-commands.js.map +1 -1
- package/dist/domain/commands/snapshot.d.ts +3 -3
- package/dist/domain/commands/snapshot.js +5 -5
- package/dist/domain/commands/snapshot.js.map +1 -1
- package/dist/domain/commands/structure-commands.d.ts +86 -5
- package/dist/domain/commands/structure-commands.d.ts.map +1 -1
- package/dist/domain/commands/structure-commands.js +272 -36
- package/dist/domain/commands/structure-commands.js.map +1 -1
- package/dist/domain/commands/track-commands.d.ts +2 -2
- package/dist/domain/commands/track-commands.js +7 -7
- package/dist/domain/commands/track-commands.js.map +1 -1
- package/dist/domain/commands/types.d.ts +2 -2
- package/dist/domain/generation/replacement-region.d.ts +32 -0
- package/dist/domain/generation/replacement-region.d.ts.map +1 -0
- package/dist/domain/generation/replacement-region.js +79 -0
- package/dist/domain/generation/replacement-region.js.map +1 -0
- package/dist/domain/instruments/gm-icon.d.ts +12 -0
- package/dist/domain/instruments/gm-icon.d.ts.map +1 -0
- package/dist/domain/instruments/gm-icon.js +327 -0
- package/dist/domain/instruments/gm-icon.js.map +1 -0
- package/dist/domain/instruments/gm-kit.js +9 -9
- package/dist/domain/instruments/gm-kit.js.map +1 -1
- package/dist/domain/instruments/gm-percussion.js +48 -48
- package/dist/domain/instruments/gm-percussion.js.map +1 -1
- package/dist/domain/instruments/gm-polyphony.js +6 -6
- package/dist/domain/instruments/gm-range.js +6 -6
- package/dist/domain/instruments/gm-transposition.js +1 -1
- package/dist/domain/instruments/gm.d.ts +1 -1
- package/dist/domain/instruments/gm.js +161 -161
- package/dist/domain/instruments/gm.js.map +1 -1
- package/dist/domain/instruments/icon-art.d.ts +75 -0
- package/dist/domain/instruments/icon-art.d.ts.map +1 -0
- package/dist/domain/instruments/icon-art.js +93 -0
- package/dist/domain/instruments/icon-art.js.map +1 -0
- package/dist/domain/instruments/instrument-fit.d.ts +31 -0
- package/dist/domain/instruments/instrument-fit.d.ts.map +1 -0
- package/dist/domain/instruments/instrument-fit.js +117 -0
- package/dist/domain/instruments/instrument-fit.js.map +1 -0
- package/dist/domain/instruments/instrument-options.d.ts +62 -0
- package/dist/domain/instruments/instrument-options.d.ts.map +1 -0
- package/dist/domain/instruments/instrument-options.js +69 -0
- package/dist/domain/instruments/instrument-options.js.map +1 -0
- package/dist/domain/instruments/track-instrument.d.ts +80 -0
- package/dist/domain/instruments/track-instrument.d.ts.map +1 -0
- package/dist/domain/instruments/track-instrument.js +102 -0
- package/dist/domain/instruments/track-instrument.js.map +1 -0
- package/dist/domain/notation/chord-symbol.d.ts +26 -0
- package/dist/domain/notation/chord-symbol.d.ts.map +1 -0
- package/dist/domain/notation/chord-symbol.js +32 -0
- package/dist/domain/notation/chord-symbol.js.map +1 -0
- package/dist/domain/notation/lyric-syllables.d.ts +15 -0
- package/dist/domain/notation/lyric-syllables.d.ts.map +1 -0
- package/dist/domain/notation/lyric-syllables.js +15 -0
- package/dist/domain/notation/lyric-syllables.js.map +1 -0
- package/dist/domain/notation/music-vocabulary.d.ts +59 -0
- package/dist/domain/notation/music-vocabulary.d.ts.map +1 -0
- package/dist/domain/notation/music-vocabulary.js +164 -0
- package/dist/domain/notation/music-vocabulary.js.map +1 -0
- package/dist/domain/pitch/pitch.d.ts +1 -1
- package/dist/domain/pitch/pitch.js +29 -29
- package/dist/domain/pitch/transpose.d.ts +1 -1
- package/dist/domain/pitch/transpose.js +2 -2
- package/dist/domain/quantization/quantize.d.ts +2 -2
- package/dist/domain/quantization/quantize.js +9 -9
- package/dist/domain/quantization/quantize.js.map +1 -1
- package/dist/domain/score/articulation.d.ts +56 -0
- package/dist/domain/score/articulation.d.ts.map +1 -0
- package/dist/domain/score/articulation.js +56 -0
- package/dist/domain/score/articulation.js.map +1 -0
- package/dist/domain/score/bar-numbers.d.ts +38 -0
- package/dist/domain/score/bar-numbers.d.ts.map +1 -0
- package/dist/domain/score/bar-numbers.js +49 -0
- package/dist/domain/score/bar-numbers.js.map +1 -0
- package/dist/domain/score/collapse-rests.d.ts +23 -0
- package/dist/domain/score/collapse-rests.d.ts.map +1 -0
- package/dist/domain/score/collapse-rests.js +78 -0
- package/dist/domain/score/collapse-rests.js.map +1 -0
- package/dist/domain/score/cue-notes.d.ts +24 -0
- package/dist/domain/score/cue-notes.d.ts.map +1 -0
- package/dist/domain/score/cue-notes.js +105 -0
- package/dist/domain/score/cue-notes.js.map +1 -0
- package/dist/domain/score/dynamics.d.ts +62 -0
- package/dist/domain/score/dynamics.d.ts.map +1 -0
- package/dist/domain/score/dynamics.js +142 -0
- package/dist/domain/score/dynamics.js.map +1 -0
- package/dist/domain/score/effective-clef.d.ts +42 -0
- package/dist/domain/score/effective-clef.d.ts.map +1 -0
- package/dist/domain/score/effective-clef.js +39 -0
- package/dist/domain/score/effective-clef.js.map +1 -0
- package/dist/domain/score/extract-part.d.ts +10 -0
- package/dist/domain/score/extract-part.d.ts.map +1 -0
- package/dist/domain/score/extract-part.js +44 -0
- package/dist/domain/score/extract-part.js.map +1 -0
- package/dist/domain/score/factory.d.ts +1 -1
- package/dist/domain/score/factory.js +12 -12
- package/dist/domain/score/factory.js.map +1 -1
- package/dist/domain/score/fermata-tempo.d.ts +40 -0
- package/dist/domain/score/fermata-tempo.d.ts.map +1 -0
- package/dist/domain/score/fermata-tempo.js +95 -0
- package/dist/domain/score/fermata-tempo.js.map +1 -0
- package/dist/domain/score/flatten.d.ts +32 -0
- package/dist/domain/score/flatten.d.ts.map +1 -0
- package/dist/domain/score/flatten.js +132 -0
- package/dist/domain/score/flatten.js.map +1 -0
- package/dist/domain/score/fragment.d.ts +3 -3
- package/dist/domain/score/fragment.js +8 -8
- package/dist/domain/score/fragment.js.map +1 -1
- package/dist/domain/score/ids.d.ts +1 -1
- package/dist/domain/score/ids.js +6 -6
- package/dist/domain/score/ottava.d.ts +41 -0
- package/dist/domain/score/ottava.d.ts.map +1 -0
- package/dist/domain/score/ottava.js +98 -0
- package/dist/domain/score/ottava.js.map +1 -0
- package/dist/domain/score/performance-timeline.d.ts +42 -0
- package/dist/domain/score/performance-timeline.d.ts.map +1 -0
- package/dist/domain/score/performance-timeline.js +78 -0
- package/dist/domain/score/performance-timeline.js.map +1 -0
- package/dist/domain/score/queries.d.ts +2 -2
- package/dist/domain/score/queries.js +7 -7
- package/dist/domain/score/queries.js.map +1 -1
- package/dist/domain/score/rehearsal-marks.d.ts +30 -0
- package/dist/domain/score/rehearsal-marks.d.ts.map +1 -0
- package/dist/domain/score/rehearsal-marks.js +126 -0
- package/dist/domain/score/rehearsal-marks.js.map +1 -0
- package/dist/domain/score/repeat-order.d.ts +21 -0
- package/dist/domain/score/repeat-order.d.ts.map +1 -0
- package/dist/domain/score/repeat-order.js +123 -0
- package/dist/domain/score/repeat-order.js.map +1 -0
- package/dist/domain/score/snapshot-tree.d.ts +23 -0
- package/dist/domain/score/snapshot-tree.d.ts.map +1 -0
- package/dist/domain/score/snapshot-tree.js +45 -0
- package/dist/domain/score/snapshot-tree.js.map +1 -0
- package/dist/domain/score/ties.d.ts +1 -1
- package/dist/domain/score/ties.js +7 -7
- package/dist/domain/score/ties.js.map +1 -1
- package/dist/domain/score/written-pitch.d.ts +33 -0
- package/dist/domain/score/written-pitch.d.ts.map +1 -0
- package/dist/domain/score/written-pitch.js +110 -0
- package/dist/domain/score/written-pitch.js.map +1 -0
- package/dist/domain/selection/range-select.d.ts +13 -0
- package/dist/domain/selection/range-select.d.ts.map +1 -0
- package/dist/domain/selection/range-select.js +40 -0
- package/dist/domain/selection/range-select.js.map +1 -0
- package/dist/domain/selection/selection-editing.d.ts +30 -0
- package/dist/domain/selection/selection-editing.d.ts.map +1 -0
- package/dist/domain/selection/selection-editing.js +31 -0
- package/dist/domain/selection/selection-editing.js.map +1 -0
- package/dist/domain/selection/selection.d.ts +2 -2
- package/dist/domain/selection/selection.js +7 -7
- package/dist/domain/selection/selection.js.map +1 -1
- package/dist/domain/selection/types.d.ts +2 -2
- package/dist/domain/time/duration-modifiers.d.ts +40 -0
- package/dist/domain/time/duration-modifiers.d.ts.map +1 -0
- package/dist/domain/time/duration-modifiers.js +50 -0
- package/dist/domain/time/duration-modifiers.js.map +1 -0
- package/dist/domain/time/duration-selection.d.ts +23 -0
- package/dist/domain/time/duration-selection.d.ts.map +1 -0
- package/dist/domain/time/duration-selection.js +50 -0
- package/dist/domain/time/duration-selection.js.map +1 -0
- package/dist/domain/time/durations.js +6 -6
- package/dist/domain/time/durations.js.map +1 -1
- package/dist/domain/time/fraction.d.ts +1 -1
- package/dist/domain/time/fraction.js +1 -1
- package/dist/domain/time/tap-to-note.d.ts +21 -0
- package/dist/domain/time/tap-to-note.d.ts.map +1 -0
- package/dist/domain/time/tap-to-note.js +43 -0
- package/dist/domain/time/tap-to-note.js.map +1 -0
- package/dist/domain/time/tempo-map.d.ts +1 -1
- package/dist/domain/time/ticks.d.ts +1 -1
- package/dist/domain/time/ticks.d.ts.map +1 -1
- package/dist/domain/time/ticks.js +14 -14
- package/dist/domain/time/ticks.js.map +1 -1
- package/dist/domain/time/tuplets.d.ts +42 -0
- package/dist/domain/time/tuplets.d.ts.map +1 -0
- package/dist/domain/time/tuplets.js +53 -0
- package/dist/domain/time/tuplets.js.map +1 -0
- package/dist/domain/validation/issues.d.ts +1 -1
- package/dist/domain/validation/issues.js +20 -20
- package/dist/domain/validation/validator.d.ts +2 -2
- package/dist/domain/validation/validator.d.ts.map +1 -1
- package/dist/domain/validation/validator.js +31 -31
- package/dist/domain/validation/validator.js.map +1 -1
- package/dist/domain/voicing/allocate.d.ts +2 -2
- package/dist/domain/voicing/allocate.js +6 -6
- package/dist/domain/voicing/allocate.js.map +1 -1
- package/dist/index.d.ts +90 -59
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +151 -83
- package/dist/index.js.map +1 -1
- package/dist/platform/audio.d.ts.map +1 -1
- package/dist/platform/file.d.ts.map +1 -1
- package/dist/platform/index.d.ts +7 -7
- package/dist/platform/index.js +7 -7
- package/dist/platform/midi-input.d.ts +2 -2
- package/dist/platform/midi.d.ts.map +1 -1
- package/dist/platform/mod.d.ts +2 -2
- package/dist/platform/playback.d.ts +7 -7
- package/dist/platform/xml.js +1 -1
- package/dist/services/regeneration/controller.d.ts +6 -6
- package/dist/services/regeneration/controller.js +12 -12
- package/dist/services/regeneration/controller.js.map +1 -1
- package/dist/test/fixtures.d.ts +1 -1
- package/dist/test/fixtures.js +103 -103
- package/dist/test/fixtures.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { CreateTrackOptions } from
|
|
2
|
-
import type { Clef, KeySignature, Measure, ScoreMetadata, TimeSignature, Track, UUID } from
|
|
3
|
-
import type { ScoreCommand } from
|
|
1
|
+
import type { CreateTrackOptions } from "../score/factory.js";
|
|
2
|
+
import type { BarlineStyle, Clef, KeySignature, Measure, ScoreMetadata, TimeSignature, Track, UUID } from "../../index.js";
|
|
3
|
+
import type { ScoreCommand } from "./types.js";
|
|
4
4
|
/** Appends one fully-rested measure to every track (reuses Task 3's `appendMeasure`). */
|
|
5
5
|
export declare function addMeasureCommand(label: string): ScoreCommand;
|
|
6
6
|
/** Removes the measure at `measureIndex` from every track, retracking subsequent measures' ticks. */
|
|
@@ -19,10 +19,90 @@ export declare function deleteTrackCommand(trackId: UUID, label: string): ScoreC
|
|
|
19
19
|
* `rebuildMeasureTicks`.
|
|
20
20
|
*/
|
|
21
21
|
export declare function changeTimeSignatureCommand(measureId: UUID, timeSignature: TimeSignature, label: string): ScoreCommand;
|
|
22
|
+
/**
|
|
23
|
+
* Sets the repeat barlines and volta numbers on a bar.
|
|
24
|
+
*
|
|
25
|
+
* Applied at the same **measure index** across every track, not just the one
|
|
26
|
+
* whose id was given: a repeat is a property of the piece's structure, and a
|
|
27
|
+
* `:|` printed on the top stave but not the others would be a score that reads
|
|
28
|
+
* differently depending on which part you play from.
|
|
29
|
+
*
|
|
30
|
+
* A patch rather than three commands, because the Measure tab sets them
|
|
31
|
+
* together and each one alone would be its own undo entry.
|
|
32
|
+
*/
|
|
33
|
+
export type RepeatPatch = {
|
|
34
|
+
repeatStart?: boolean;
|
|
35
|
+
repeatEnd?: boolean;
|
|
36
|
+
endingNumbers?: number[];
|
|
37
|
+
};
|
|
38
|
+
export declare function changeRepeatsCommand(measureId: UUID, patch: RepeatPatch, label: string): ScoreCommand;
|
|
22
39
|
/** Changes one measure's key signature. Existing note spellings are left as-is. */
|
|
23
40
|
export declare function changeKeySignatureCommand(measureId: UUID, keySignature: KeySignature, label: string): ScoreCommand;
|
|
24
41
|
/** Changes a track's clef, reinterpreting its program if it crosses into or out of percussion. */
|
|
25
42
|
export declare function changeClefCommand(trackId: UUID, clef: Clef, label: string): ScoreCommand;
|
|
43
|
+
/**
|
|
44
|
+
* Sets or clears a clef change at one measure of one track.
|
|
45
|
+
*
|
|
46
|
+
* Per **track**, unlike `changeRepeatsCommand`, which applies at the same index
|
|
47
|
+
* across every track: a repeat barline that differed between staves would be a
|
|
48
|
+
* score that reads differently depending on which part you play from, but a
|
|
49
|
+
* clef change is exactly the opposite — a piano left hand crossing into treble
|
|
50
|
+
* says nothing about what the right hand is doing.
|
|
51
|
+
*
|
|
52
|
+
* `undefined` removes the change, so the bar goes back to inheriting. Setting
|
|
53
|
+
* the clef already in force at that bar removes it too, rather than storing a
|
|
54
|
+
* marking that would print nothing: `clefChangesAt` treats a redundant one as
|
|
55
|
+
* no change, and leaving it behind would make "clear" and "set to the current
|
|
56
|
+
* clef" produce different scores that look identical.
|
|
57
|
+
*
|
|
58
|
+
* Measure 0 is where a clef is *established* rather than changed, so it writes
|
|
59
|
+
* the **track** clef instead — which is what keeps one clef per track true for
|
|
60
|
+
* a part that never changes, and stops bar 1 printing a change against nothing.
|
|
61
|
+
*/
|
|
62
|
+
export declare function changeMeasureClefCommand(trackId: UUID, measureIndex: number, clef: Clef | undefined, label: string): ScoreCommand;
|
|
63
|
+
/**
|
|
64
|
+
* Turns the score's first bar into a pickup of `beats` beats, or removes the
|
|
65
|
+
* pickup and restores a full bar.
|
|
66
|
+
*
|
|
67
|
+
* Only the first bar, because that is what an anacrusis is — the run-up to bar
|
|
68
|
+
* 1. A short bar anywhere else is an irregular bar, which keeps its number and
|
|
69
|
+
* is a different thing entirely.
|
|
70
|
+
*
|
|
71
|
+
* Applies to **every track**, like `changeRepeatsCommand` and unlike the clef:
|
|
72
|
+
* the measure grid is shared, and a pickup on one stave and not the others is
|
|
73
|
+
* a score whose parts disagree about where bar 1 starts.
|
|
74
|
+
*
|
|
75
|
+
* Notes that no longer fit are dropped rather than the bar refusing to shrink:
|
|
76
|
+
* a pickup is normally set before anything is written, and silently keeping a
|
|
77
|
+
* note past the barline would leave the bar failing validation.
|
|
78
|
+
*/
|
|
79
|
+
export declare function setPickupCommand(beats: number | null, label: string): ScoreCommand;
|
|
80
|
+
/**
|
|
81
|
+
* Sets or clears the heavier barline at the end of one bar.
|
|
82
|
+
*
|
|
83
|
+
* Applies at the same measure **index across every track**, like
|
|
84
|
+
* `changeRepeatsCommand` and for the same reason: a double bar on one stave
|
|
85
|
+
* and not the others is a score that reads differently depending on which part
|
|
86
|
+
* you play from.
|
|
87
|
+
*
|
|
88
|
+
* `undefined` restores the ordinary single barline.
|
|
89
|
+
*/
|
|
90
|
+
export declare function changeBarlineCommand(measureIndex: number, barline: BarlineStyle | undefined, label: string): ScoreCommand;
|
|
91
|
+
/** The navigation marks a bar can carry, as a partial patch. */
|
|
92
|
+
export type NavigationPatch = Partial<Pick<Measure, "segno" | "coda" | "toCoda" | "fine" | "jump">>;
|
|
93
|
+
/**
|
|
94
|
+
* Sets or clears the navigation marks on one bar, across every track.
|
|
95
|
+
*
|
|
96
|
+
* Across every track like `changeRepeatsCommand`, and for the same reason: a
|
|
97
|
+
* D.S. on one stave and not the others is a score that navigates differently
|
|
98
|
+
* depending on which part you read from.
|
|
99
|
+
*
|
|
100
|
+
* A partial patch rather than a whole value, because the marks are
|
|
101
|
+
* independent: a bar can carry the coda sign and a `Fine`, and setting one
|
|
102
|
+
* must not silently clear another. `false`/`undefined` in the patch clears
|
|
103
|
+
* that mark; a key absent from the patch is left alone.
|
|
104
|
+
*/
|
|
105
|
+
export declare function changeNavigationCommand(measureIndex: number, patch: NavigationPatch, label: string): ScoreCommand;
|
|
26
106
|
export type ChangeTempoParams = {
|
|
27
107
|
tempoEventId?: UUID;
|
|
28
108
|
tick: number;
|
|
@@ -30,9 +110,10 @@ export type ChangeTempoParams = {
|
|
|
30
110
|
};
|
|
31
111
|
/** Updates an existing tempo event (`tempoEventId` given) or inserts a new one, keeping `tempoMap` sorted by tick. */
|
|
32
112
|
export declare function changeTempoCommand(params: ChangeTempoParams, label: string): ScoreCommand;
|
|
113
|
+
export declare function removeTempoCommand(tempoEventId: UUID, label: string): ScoreCommand;
|
|
33
114
|
/** Patches score metadata (title/composer/description); `createdAt` is immutable, `updatedAt` is always refreshed. */
|
|
34
|
-
export declare function changeMetadataCommand(patch: Partial<Omit<ScoreMetadata,
|
|
35
|
-
export type TrackPropsPatch = Partial<Omit<Track,
|
|
115
|
+
export declare function changeMetadataCommand(patch: Partial<Omit<ScoreMetadata, "createdAt">>, label: string): ScoreCommand;
|
|
116
|
+
export type TrackPropsPatch = Partial<Omit<Track, "id" | "measures">>;
|
|
36
117
|
/** Patches a track's non-structural properties (name, instrument, MIDI program/channel, clef, volume, pan, mute, solo). */
|
|
37
118
|
export declare function changeTrackPropsCommand(trackId: UUID, patch: TrackPropsPatch, label: string): ScoreCommand;
|
|
38
119
|
//# sourceMappingURL=structure-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/structure-commands.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"structure-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/structure-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,21 +3,22 @@
|
|
|
3
3
|
* §14). Each factory wraps a pure `(Score) => Score` transform via
|
|
4
4
|
* `transformCommand`, matching the note-commands.ts pattern.
|
|
5
5
|
*/
|
|
6
|
-
import { appendMeasure, createTrack, rebuildMeasureTicks, } from
|
|
7
|
-
import { gmKitAt } from
|
|
8
|
-
import { gmInstrument } from
|
|
9
|
-
import { createId } from
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
6
|
+
import { appendMeasure, createTrack, rebuildMeasureTicks, } from "../score/factory.js";
|
|
7
|
+
import { gmKitAt } from "../instruments/gm-kit.js";
|
|
8
|
+
import { gmInstrument } from "../instruments/gm.js";
|
|
9
|
+
import { createId } from "../score/ids.js";
|
|
10
|
+
import { clefAtMeasure } from "../score/effective-clef.js";
|
|
11
|
+
import { beatDurationTicks, measureDurationTicks } from "../time/ticks.js";
|
|
12
|
+
import { transformCommand } from "./snapshot.js";
|
|
13
|
+
import { reflowVoice, touchMetadata, withTracks } from "./reflow.js";
|
|
13
14
|
// ---- addMeasureCommand / deleteMeasureCommand ----------------------------------
|
|
14
15
|
/** Appends one fully-rested measure to every track (reuses Task 3's `appendMeasure`). */
|
|
15
16
|
export function addMeasureCommand(label) {
|
|
16
|
-
return transformCommand(label, score => appendMeasure(score));
|
|
17
|
+
return transformCommand(label, (score) => appendMeasure(score));
|
|
17
18
|
}
|
|
18
19
|
function deleteMeasure(score, measureIndex) {
|
|
19
|
-
const tracks = score.tracks.map(track => {
|
|
20
|
-
const filtered = track.measures.filter(m => m.index !== measureIndex);
|
|
20
|
+
const tracks = score.tracks.map((track) => {
|
|
21
|
+
const filtered = track.measures.filter((m) => m.index !== measureIndex);
|
|
21
22
|
return filtered.length === track.measures.length
|
|
22
23
|
? track
|
|
23
24
|
: { ...track, measures: filtered };
|
|
@@ -26,7 +27,7 @@ function deleteMeasure(score, measureIndex) {
|
|
|
26
27
|
}
|
|
27
28
|
/** Removes the measure at `measureIndex` from every track, retracking subsequent measures' ticks. */
|
|
28
29
|
export function deleteMeasureCommand(measureIndex, label) {
|
|
29
|
-
return transformCommand(label, score => deleteMeasure(score, measureIndex));
|
|
30
|
+
return transformCommand(label, (score) => deleteMeasure(score, measureIndex));
|
|
30
31
|
}
|
|
31
32
|
// ---- addTrackCommand / deleteTrackCommand --------------------------------------
|
|
32
33
|
/** Builds a fully-rested measure matching an existing measure's position/signatures, for a newly added track. */
|
|
@@ -42,7 +43,7 @@ export function restMeasureLike(reference, trackId) {
|
|
|
42
43
|
voices: [
|
|
43
44
|
{
|
|
44
45
|
id: voiceId,
|
|
45
|
-
name:
|
|
46
|
+
name: "Voice 1",
|
|
46
47
|
events: [
|
|
47
48
|
{
|
|
48
49
|
id: createId(),
|
|
@@ -60,7 +61,7 @@ function addTrack(score, options) {
|
|
|
60
61
|
const track = createTrack(options);
|
|
61
62
|
const referenceTrack = score.tracks[0];
|
|
62
63
|
const measures = referenceTrack
|
|
63
|
-
? referenceTrack.measures.map(m => restMeasureLike(m, track.id))
|
|
64
|
+
? referenceTrack.measures.map((m) => restMeasureLike(m, track.id))
|
|
64
65
|
: [];
|
|
65
66
|
return {
|
|
66
67
|
...score,
|
|
@@ -70,20 +71,20 @@ function addTrack(score, options) {
|
|
|
70
71
|
}
|
|
71
72
|
/** Adds a new track, fully-rested with the same measure layout (count/signatures) as the score's first existing track. */
|
|
72
73
|
export function addTrackCommand(options, label) {
|
|
73
|
-
return transformCommand(label, score => addTrack(score, options));
|
|
74
|
+
return transformCommand(label, (score) => addTrack(score, options));
|
|
74
75
|
}
|
|
75
76
|
function deleteTrack(score, trackId) {
|
|
76
|
-
const tracks = score.tracks.filter(t => t.id !== trackId);
|
|
77
|
+
const tracks = score.tracks.filter((t) => t.id !== trackId);
|
|
77
78
|
return withTracks(score, tracks);
|
|
78
79
|
}
|
|
79
80
|
/** Removes the track with id `trackId`. */
|
|
80
81
|
export function deleteTrackCommand(trackId, label) {
|
|
81
|
-
return transformCommand(label, score => deleteTrack(score, trackId));
|
|
82
|
+
return transformCommand(label, (score) => deleteTrack(score, trackId));
|
|
82
83
|
}
|
|
83
84
|
// ---- changeTimeSignatureCommand / changeKeySignatureCommand -------------------
|
|
84
85
|
function changeTimeSignature(score, measureId, timeSignature) {
|
|
85
|
-
const tracks = score.tracks.map(track => {
|
|
86
|
-
const index = track.measures.findIndex(m => m.id === measureId);
|
|
86
|
+
const tracks = score.tracks.map((track) => {
|
|
87
|
+
const index = track.measures.findIndex((m) => m.id === measureId);
|
|
87
88
|
if (index === -1)
|
|
88
89
|
return track;
|
|
89
90
|
const measure = track.measures[index];
|
|
@@ -106,11 +107,53 @@ function changeTimeSignature(score, measureId, timeSignature) {
|
|
|
106
107
|
* `rebuildMeasureTicks`.
|
|
107
108
|
*/
|
|
108
109
|
export function changeTimeSignatureCommand(measureId, timeSignature, label) {
|
|
109
|
-
return transformCommand(label, score => changeTimeSignature(score, measureId, timeSignature));
|
|
110
|
+
return transformCommand(label, (score) => changeTimeSignature(score, measureId, timeSignature));
|
|
111
|
+
}
|
|
112
|
+
function changeRepeats(score, measureId, patch) {
|
|
113
|
+
const index = score.tracks
|
|
114
|
+
.map((track) => track.measures.findIndex((m) => m.id === measureId))
|
|
115
|
+
.find((i) => i !== -1);
|
|
116
|
+
if (index === undefined || index === -1)
|
|
117
|
+
return score;
|
|
118
|
+
const tracks = score.tracks.map((track) => {
|
|
119
|
+
const measure = track.measures[index];
|
|
120
|
+
if (!measure)
|
|
121
|
+
return track;
|
|
122
|
+
const updated = { ...measure };
|
|
123
|
+
// Absent means "no repeat here", so a false or an empty list removes the
|
|
124
|
+
// field rather than storing a marking that prints nothing.
|
|
125
|
+
if (patch.repeatStart === undefined) {
|
|
126
|
+
// untouched
|
|
127
|
+
}
|
|
128
|
+
else if (patch.repeatStart)
|
|
129
|
+
updated.repeatStart = true;
|
|
130
|
+
else
|
|
131
|
+
delete updated.repeatStart;
|
|
132
|
+
if (patch.repeatEnd === undefined) {
|
|
133
|
+
// untouched
|
|
134
|
+
}
|
|
135
|
+
else if (patch.repeatEnd)
|
|
136
|
+
updated.repeatEnd = true;
|
|
137
|
+
else
|
|
138
|
+
delete updated.repeatEnd;
|
|
139
|
+
if (patch.endingNumbers !== undefined) {
|
|
140
|
+
if (patch.endingNumbers.length > 0)
|
|
141
|
+
updated.endingNumbers = [...patch.endingNumbers].sort((a, b) => a - b);
|
|
142
|
+
else
|
|
143
|
+
delete updated.endingNumbers;
|
|
144
|
+
}
|
|
145
|
+
const measures = track.measures.slice();
|
|
146
|
+
measures[index] = updated;
|
|
147
|
+
return { ...track, measures };
|
|
148
|
+
});
|
|
149
|
+
return withTracks(score, tracks);
|
|
150
|
+
}
|
|
151
|
+
export function changeRepeatsCommand(measureId, patch, label) {
|
|
152
|
+
return transformCommand(label, (score) => changeRepeats(score, measureId, patch));
|
|
110
153
|
}
|
|
111
154
|
function changeKeySignature(score, measureId, keySignature) {
|
|
112
|
-
const tracks = score.tracks.map(track => {
|
|
113
|
-
const index = track.measures.findIndex(m => m.id === measureId);
|
|
155
|
+
const tracks = score.tracks.map((track) => {
|
|
156
|
+
const index = track.measures.findIndex((m) => m.id === measureId);
|
|
114
157
|
if (index === -1)
|
|
115
158
|
return track;
|
|
116
159
|
const measures = track.measures.slice();
|
|
@@ -121,11 +164,11 @@ function changeKeySignature(score, measureId, keySignature) {
|
|
|
121
164
|
}
|
|
122
165
|
/** Changes one measure's key signature. Existing note spellings are left as-is. */
|
|
123
166
|
export function changeKeySignatureCommand(measureId, keySignature, label) {
|
|
124
|
-
return transformCommand(label, score => changeKeySignature(score, measureId, keySignature));
|
|
167
|
+
return transformCommand(label, (score) => changeKeySignature(score, measureId, keySignature));
|
|
125
168
|
}
|
|
126
169
|
// ---- changeClefCommand -----------------------------------------------------------
|
|
127
170
|
function changeClef(score, trackId, clef) {
|
|
128
|
-
const tracks = score.tracks.map(t => t.id === trackId ? { ...t, clef, ...programForClef(t, clef) } : t);
|
|
171
|
+
const tracks = score.tracks.map((t) => t.id === trackId ? { ...t, clef, ...programForClef(t, clef) } : t);
|
|
129
172
|
return withTracks(score, tracks);
|
|
130
173
|
}
|
|
131
174
|
/**
|
|
@@ -140,8 +183,8 @@ function changeClef(score, trackId, clef) {
|
|
|
140
183
|
* describes the sound and so has to follow it.
|
|
141
184
|
*/
|
|
142
185
|
function programForClef(track, clef) {
|
|
143
|
-
const wasPercussion = track.clef ===
|
|
144
|
-
const isPercussion = clef ===
|
|
186
|
+
const wasPercussion = track.clef === "percussion";
|
|
187
|
+
const isPercussion = clef === "percussion";
|
|
145
188
|
if (wasPercussion === isPercussion)
|
|
146
189
|
return {};
|
|
147
190
|
if (isPercussion) {
|
|
@@ -151,16 +194,190 @@ function programForClef(track, clef) {
|
|
|
151
194
|
const instrument = gmInstrument(0);
|
|
152
195
|
return {
|
|
153
196
|
midiProgram: 0,
|
|
154
|
-
instrumentName: instrument?.name ??
|
|
197
|
+
instrumentName: instrument?.name ?? "Acoustic Grand Piano",
|
|
155
198
|
};
|
|
156
199
|
}
|
|
157
200
|
/** Changes a track's clef, reinterpreting its program if it crosses into or out of percussion. */
|
|
158
201
|
export function changeClefCommand(trackId, clef, label) {
|
|
159
|
-
return transformCommand(label, score => changeClef(score, trackId, clef));
|
|
202
|
+
return transformCommand(label, (score) => changeClef(score, trackId, clef));
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Sets or clears a clef change at one measure of one track.
|
|
206
|
+
*
|
|
207
|
+
* Per **track**, unlike `changeRepeatsCommand`, which applies at the same index
|
|
208
|
+
* across every track: a repeat barline that differed between staves would be a
|
|
209
|
+
* score that reads differently depending on which part you play from, but a
|
|
210
|
+
* clef change is exactly the opposite — a piano left hand crossing into treble
|
|
211
|
+
* says nothing about what the right hand is doing.
|
|
212
|
+
*
|
|
213
|
+
* `undefined` removes the change, so the bar goes back to inheriting. Setting
|
|
214
|
+
* the clef already in force at that bar removes it too, rather than storing a
|
|
215
|
+
* marking that would print nothing: `clefChangesAt` treats a redundant one as
|
|
216
|
+
* no change, and leaving it behind would make "clear" and "set to the current
|
|
217
|
+
* clef" produce different scores that look identical.
|
|
218
|
+
*
|
|
219
|
+
* Measure 0 is where a clef is *established* rather than changed, so it writes
|
|
220
|
+
* the **track** clef instead — which is what keeps one clef per track true for
|
|
221
|
+
* a part that never changes, and stops bar 1 printing a change against nothing.
|
|
222
|
+
*/
|
|
223
|
+
export function changeMeasureClefCommand(trackId, measureIndex, clef, label) {
|
|
224
|
+
return transformCommand(label, (score) => {
|
|
225
|
+
const track = score.tracks.find((t) => t.id === trackId);
|
|
226
|
+
if (!track || measureIndex < 0 || measureIndex >= track.measures.length) {
|
|
227
|
+
return score;
|
|
228
|
+
}
|
|
229
|
+
// Bar 0 sets the part's clef, and goes through `changeClef` so a crossing
|
|
230
|
+
// into or out of percussion still reinterprets the program.
|
|
231
|
+
if (measureIndex === 0) {
|
|
232
|
+
return clef ? changeClef(score, trackId, clef) : score;
|
|
233
|
+
}
|
|
234
|
+
const inherited = clefAtMeasure(track.measures, measureIndex - 1, track.clef);
|
|
235
|
+
const measures = track.measures.map((measure, i) => {
|
|
236
|
+
if (i !== measureIndex)
|
|
237
|
+
return measure;
|
|
238
|
+
if (!clef || clef === inherited) {
|
|
239
|
+
if (measure.clef === undefined)
|
|
240
|
+
return measure;
|
|
241
|
+
const next = { ...measure };
|
|
242
|
+
delete next.clef;
|
|
243
|
+
return next;
|
|
244
|
+
}
|
|
245
|
+
return { ...measure, clef };
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
...score,
|
|
249
|
+
tracks: score.tracks.map((t) => t.id === trackId ? { ...t, measures } : t),
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Turns the score's first bar into a pickup of `beats` beats, or removes the
|
|
255
|
+
* pickup and restores a full bar.
|
|
256
|
+
*
|
|
257
|
+
* Only the first bar, because that is what an anacrusis is — the run-up to bar
|
|
258
|
+
* 1. A short bar anywhere else is an irregular bar, which keeps its number and
|
|
259
|
+
* is a different thing entirely.
|
|
260
|
+
*
|
|
261
|
+
* Applies to **every track**, like `changeRepeatsCommand` and unlike the clef:
|
|
262
|
+
* the measure grid is shared, and a pickup on one stave and not the others is
|
|
263
|
+
* a score whose parts disagree about where bar 1 starts.
|
|
264
|
+
*
|
|
265
|
+
* Notes that no longer fit are dropped rather than the bar refusing to shrink:
|
|
266
|
+
* a pickup is normally set before anything is written, and silently keeping a
|
|
267
|
+
* note past the barline would leave the bar failing validation.
|
|
268
|
+
*/
|
|
269
|
+
export function setPickupCommand(beats, label) {
|
|
270
|
+
return transformCommand(label, (score) => {
|
|
271
|
+
const first = score.tracks[0]?.measures[0];
|
|
272
|
+
if (!first)
|
|
273
|
+
return score;
|
|
274
|
+
const beatTicks = beatDurationTicks(first.timeSignature, score.ppq);
|
|
275
|
+
const full = measureDurationTicks(first.timeSignature, score.ppq);
|
|
276
|
+
const wanted = beats === null
|
|
277
|
+
? full
|
|
278
|
+
: Math.max(1, Math.min(Math.round(beats) * beatTicks, full - 1));
|
|
279
|
+
const tracks = score.tracks.map((track) => {
|
|
280
|
+
const measure = track.measures[0];
|
|
281
|
+
if (!measure)
|
|
282
|
+
return track;
|
|
283
|
+
const trimmed = {
|
|
284
|
+
...measure,
|
|
285
|
+
durationTicks: wanted,
|
|
286
|
+
voices: measure.voices.map((voice) => ({
|
|
287
|
+
...voice,
|
|
288
|
+
events: voice.events
|
|
289
|
+
.filter((e) => e.startTick - measure.startTick < wanted)
|
|
290
|
+
.map((e) => ({
|
|
291
|
+
...e,
|
|
292
|
+
durationTicks: Math.min(e.durationTicks, measure.startTick + wanted - e.startTick),
|
|
293
|
+
})),
|
|
294
|
+
})),
|
|
295
|
+
};
|
|
296
|
+
if (beats === null)
|
|
297
|
+
delete trimmed.pickup;
|
|
298
|
+
else
|
|
299
|
+
trimmed.pickup = true;
|
|
300
|
+
return { ...track, measures: [trimmed, ...track.measures.slice(1)] };
|
|
301
|
+
});
|
|
302
|
+
// Every following bar shifts, since bar 0 changed length.
|
|
303
|
+
return rebuildMeasureTicks({ ...score, tracks });
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Sets or clears the heavier barline at the end of one bar.
|
|
308
|
+
*
|
|
309
|
+
* Applies at the same measure **index across every track**, like
|
|
310
|
+
* `changeRepeatsCommand` and for the same reason: a double bar on one stave
|
|
311
|
+
* and not the others is a score that reads differently depending on which part
|
|
312
|
+
* you play from.
|
|
313
|
+
*
|
|
314
|
+
* `undefined` restores the ordinary single barline.
|
|
315
|
+
*/
|
|
316
|
+
export function changeBarlineCommand(measureIndex, barline, label) {
|
|
317
|
+
return transformCommand(label, (score) => {
|
|
318
|
+
if (measureIndex < 0)
|
|
319
|
+
return score;
|
|
320
|
+
return {
|
|
321
|
+
...score,
|
|
322
|
+
tracks: score.tracks.map((track) => {
|
|
323
|
+
const measure = track.measures[measureIndex];
|
|
324
|
+
if (!measure)
|
|
325
|
+
return track;
|
|
326
|
+
const next = { ...measure };
|
|
327
|
+
if (barline)
|
|
328
|
+
next.barline = barline;
|
|
329
|
+
else
|
|
330
|
+
delete next.barline;
|
|
331
|
+
return {
|
|
332
|
+
...track,
|
|
333
|
+
measures: track.measures.map((m, i) => i === measureIndex ? next : m),
|
|
334
|
+
};
|
|
335
|
+
}),
|
|
336
|
+
};
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Sets or clears the navigation marks on one bar, across every track.
|
|
341
|
+
*
|
|
342
|
+
* Across every track like `changeRepeatsCommand`, and for the same reason: a
|
|
343
|
+
* D.S. on one stave and not the others is a score that navigates differently
|
|
344
|
+
* depending on which part you read from.
|
|
345
|
+
*
|
|
346
|
+
* A partial patch rather than a whole value, because the marks are
|
|
347
|
+
* independent: a bar can carry the coda sign and a `Fine`, and setting one
|
|
348
|
+
* must not silently clear another. `false`/`undefined` in the patch clears
|
|
349
|
+
* that mark; a key absent from the patch is left alone.
|
|
350
|
+
*/
|
|
351
|
+
export function changeNavigationCommand(measureIndex, patch, label) {
|
|
352
|
+
return transformCommand(label, (score) => {
|
|
353
|
+
if (measureIndex < 0)
|
|
354
|
+
return score;
|
|
355
|
+
return {
|
|
356
|
+
...score,
|
|
357
|
+
tracks: score.tracks.map((track) => {
|
|
358
|
+
const measure = track.measures[measureIndex];
|
|
359
|
+
if (!measure)
|
|
360
|
+
return track;
|
|
361
|
+
const next = { ...measure };
|
|
362
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
363
|
+
if (value) {
|
|
364
|
+
next[key] = value;
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
delete next[key];
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
...track,
|
|
372
|
+
measures: track.measures.map((m, i) => i === measureIndex ? next : m),
|
|
373
|
+
};
|
|
374
|
+
}),
|
|
375
|
+
};
|
|
376
|
+
});
|
|
160
377
|
}
|
|
161
378
|
function changeTempo(score, params) {
|
|
162
379
|
const tempoMap = params.tempoEventId
|
|
163
|
-
? score.tempoMap.map(e => e.id === params.tempoEventId
|
|
380
|
+
? score.tempoMap.map((e) => e.id === params.tempoEventId
|
|
164
381
|
? { ...e, tick: params.tick, bpm: params.bpm }
|
|
165
382
|
: e)
|
|
166
383
|
: [
|
|
@@ -176,7 +393,26 @@ function changeTempo(score, params) {
|
|
|
176
393
|
}
|
|
177
394
|
/** Updates an existing tempo event (`tempoEventId` given) or inserts a new one, keeping `tempoMap` sorted by tick. */
|
|
178
395
|
export function changeTempoCommand(params, label) {
|
|
179
|
-
return transformCommand(label, score => changeTempo(score, params));
|
|
396
|
+
return transformCommand(label, (score) => changeTempo(score, params));
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Drops a tempo change.
|
|
400
|
+
*
|
|
401
|
+
* The first event is never removed: it is the score's starting tempo, and a
|
|
402
|
+
* score with an empty `tempoMap` has no tempo at all. Asking to remove it is a
|
|
403
|
+
* no-op rather than an error, because the only caller is a button that should
|
|
404
|
+
* simply not be offered there.
|
|
405
|
+
*/
|
|
406
|
+
function removeTempo(score, tempoEventId) {
|
|
407
|
+
if (score.tempoMap.length <= 1 || score.tempoMap[0]?.id === tempoEventId)
|
|
408
|
+
return score;
|
|
409
|
+
const tempoMap = score.tempoMap.filter((e) => e.id !== tempoEventId);
|
|
410
|
+
if (tempoMap.length === score.tempoMap.length)
|
|
411
|
+
return score;
|
|
412
|
+
return { ...score, tempoMap, metadata: touchMetadata(score.metadata) };
|
|
413
|
+
}
|
|
414
|
+
export function removeTempoCommand(tempoEventId, label) {
|
|
415
|
+
return transformCommand(label, (score) => removeTempo(score, tempoEventId));
|
|
180
416
|
}
|
|
181
417
|
// ---- changeMetadataCommand --------------------------------------------------------
|
|
182
418
|
function changeMetadata(score, patch) {
|
|
@@ -191,10 +427,10 @@ function changeMetadata(score, patch) {
|
|
|
191
427
|
}
|
|
192
428
|
/** Patches score metadata (title/composer/description); `createdAt` is immutable, `updatedAt` is always refreshed. */
|
|
193
429
|
export function changeMetadataCommand(patch, label) {
|
|
194
|
-
return transformCommand(label, score => changeMetadata(score, patch));
|
|
430
|
+
return transformCommand(label, (score) => changeMetadata(score, patch));
|
|
195
431
|
}
|
|
196
432
|
function changeTrackProps(score, trackId, patch) {
|
|
197
|
-
const tracks = score.tracks.map(t => t.id === trackId ? { ...t, ...patch } : t);
|
|
433
|
+
const tracks = score.tracks.map((t) => t.id === trackId ? { ...t, ...patch } : t);
|
|
198
434
|
return withTracks(score, tracks);
|
|
199
435
|
}
|
|
200
436
|
/**
|
|
@@ -206,15 +442,15 @@ function changeTrackProps(score, trackId, patch) {
|
|
|
206
442
|
* made here, where the patch is, rather than in a switch elsewhere that would
|
|
207
443
|
* have to be kept in step with this list.
|
|
208
444
|
*/
|
|
209
|
-
const MIX_PROPS = new Set([
|
|
445
|
+
const MIX_PROPS = new Set(["volume", "pan", "muted", "solo"]);
|
|
210
446
|
/** A patch is mix only if *every* key in it is. An empty patch changes nothing, so it counts as mix. */
|
|
211
447
|
function trackPatchKind(patch) {
|
|
212
|
-
return Object.keys(patch).every(key => MIX_PROPS.has(key))
|
|
213
|
-
?
|
|
214
|
-
:
|
|
448
|
+
return Object.keys(patch).every((key) => MIX_PROPS.has(key))
|
|
449
|
+
? "mix"
|
|
450
|
+
: "content";
|
|
215
451
|
}
|
|
216
452
|
/** Patches a track's non-structural properties (name, instrument, MIDI program/channel, clef, volume, pan, mute, solo). */
|
|
217
453
|
export function changeTrackPropsCommand(trackId, patch, label) {
|
|
218
|
-
return transformCommand(label, score => changeTrackProps(score, trackId, patch), trackPatchKind(patch));
|
|
454
|
+
return transformCommand(label, (score) => changeTrackProps(score, trackId, patch), trackPatchKind(patch));
|
|
219
455
|
}
|
|
220
456
|
//# sourceMappingURL=structure-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure-commands.js","sourceRoot":"","sources":["../../../src/domain/commands/structure-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAaxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErE,mFAAmF;AAEnF,yFAAyF;AACzF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,aAAa,CAAC,KAAY,EAAE,YAAoB;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM;YAC9C,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,mBAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,mFAAmF;AAEnF,iHAAiH;AACjH,MAAM,UAAU,eAAe,CAAC,SAAkB,EAAE,OAAa;IAC/D,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,OAAO;QACL,EAAE,EAAE,QAAQ,EAAE;QACd,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,aAAa,EAAE,SAAS,CAAC,aAAa;QACtC,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE;oBACN;wBACE,EAAE,EAAE,QAAQ,EAAE;wBACd,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,aAAa,EAAE,SAAS,CAAC,aAAa;wBACtC,OAAO;wBACP,OAAO;qBACR;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAY,EAAE,OAA2B;IACzD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,cAAc;QAC7B,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,GAAG,KAAK;QACR,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;QACjD,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,eAAe,CAC7B,OAA2B,EAC3B,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,WAAW,CAAC,KAAY,EAAE,OAAa;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC1D,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAAC,OAAa,EAAE,KAAa;IAC7D,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,kFAAkF;AAElF,SAAS,mBAAmB,CAC1B,KAAY,EACZ,SAAe,EACf,aAA4B;IAE5B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAE/B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,aAAa,GAAG,oBAAoB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACrE,IAAI,OAAO,GAAY,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;QACpE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;QAC1B,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,mBAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAe,EACf,aAA4B,EAC5B,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CACrC,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAY,EACZ,SAAe,EACf,YAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAChE,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,yBAAyB,CACvC,SAAe,EACf,YAA0B,EAC1B,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CACrC,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,qFAAqF;AAErF,SAAS,UAAU,CAAC,KAAY,EAAE,OAAa,EAAE,IAAU;IACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAClE,CAAC;IACF,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,KAAY,EAAE,IAAU;IAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,KAAK,YAAY,CAAC;IAC3C,IAAI,aAAa,KAAK,YAAY;QAAE,OAAO,EAAE,CAAC;IAC9C,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO;QACL,WAAW,EAAE,CAAC;QACd,cAAc,EAAE,UAAU,EAAE,IAAI,IAAI,sBAAsB;KAC3D,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAC/B,OAAa,EACb,IAAU,EACV,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC;AAUD,SAAS,WAAW,CAAC,KAAY,EAAE,MAAyB;IAC1D,MAAM,QAAQ,GAAiB,MAAM,CAAC,YAAY;QAChD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACrB,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,YAAY;YAC1B,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;YAC9C,CAAC,CAAC,CAAC,CACN;QACH,CAAC,CAAC;YACE,GAAG,KAAK,CAAC,QAAQ;YACjB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE;SACvD,CAAC;IAEN,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,GAAG,KAAK;QACR,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,kBAAkB,CAChC,MAAyB,EACzB,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,sFAAsF;AAEtF,SAAS,cAAc,CACrB,KAAY,EACZ,KAAgD;IAEhD,OAAO;QACL,GAAG,KAAK;QACR,QAAQ,EAAE;YACR,GAAG,KAAK,CAAC,QAAQ;YACjB,GAAG,KAAK;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;KACF,CAAC;AACJ,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,qBAAqB,CACnC,KAAgD,EAChD,KAAa;IAEb,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACxE,CAAC;AAMD,SAAS,gBAAgB,CACvB,KAAY,EACZ,OAAa,EACb,KAAsB;IAEtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAC1C,CAAC;IACF,OAAO,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtE,wGAAwG;AACxG,SAAS,cAAc,CAAC,KAAsB;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,2HAA2H;AAC3H,MAAM,UAAU,uBAAuB,CACrC,OAAa,EACb,KAAsB,EACtB,KAAa;IAEb,OAAO,gBAAgB,CACrB,KAAK,EACL,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAChD,cAAc,CAAC,KAAK,CAAC,CACtB,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"structure-commands.js","sourceRoot":"","sources":["../../../src/domain/commands/structure-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Track } from
|
|
2
|
-
import type { ScoreCommand } from
|
|
1
|
+
import type { Track } from "../../index.js";
|
|
2
|
+
import type { ScoreCommand } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Appends `track` to the score, re-homed onto the score's own measure grid.
|
|
5
5
|
*
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
* the MIDI importer rather than a note at a time. Generation still appends a
|
|
7
7
|
* single produced track, which is this.
|
|
8
8
|
*/
|
|
9
|
-
import { touchMetadata, withTracks } from
|
|
10
|
-
import { transformCommand } from
|
|
11
|
-
import { restMeasureLike } from
|
|
12
|
-
import { createId } from
|
|
9
|
+
import { touchMetadata, withTracks } from "./reflow.js";
|
|
10
|
+
import { transformCommand } from "./snapshot.js";
|
|
11
|
+
import { restMeasureLike } from "./structure-commands.js";
|
|
12
|
+
import { createId } from "../score/ids.js";
|
|
13
13
|
/**
|
|
14
14
|
* Appends `track` to the score, re-homed onto the score's own measure grid.
|
|
15
15
|
*
|
|
@@ -22,19 +22,19 @@ import { createId } from '../score/ids.js';
|
|
|
22
22
|
* Ids are regenerated so a track appended twice cannot collide with itself.
|
|
23
23
|
*/
|
|
24
24
|
export function appendTrackCommand(track, label) {
|
|
25
|
-
return transformCommand(label, score => {
|
|
25
|
+
return transformCommand(label, (score) => {
|
|
26
26
|
const reference = score.tracks[0];
|
|
27
27
|
if (!reference)
|
|
28
28
|
return score;
|
|
29
29
|
const id = createId();
|
|
30
30
|
const measures = reference.measures.map((template, index) => {
|
|
31
31
|
const source = track.measures[index];
|
|
32
|
-
const voices = (source?.voices ?? []).map(voice => {
|
|
32
|
+
const voices = (source?.voices ?? []).map((voice) => {
|
|
33
33
|
const voiceId = createId();
|
|
34
34
|
return {
|
|
35
35
|
id: voiceId,
|
|
36
36
|
name: voice.name,
|
|
37
|
-
events: voice.events.map(event => ({
|
|
37
|
+
events: voice.events.map((event) => ({
|
|
38
38
|
...event,
|
|
39
39
|
id: createId(),
|
|
40
40
|
voiceId,
|