@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.
Files changed (229) hide show
  1. package/dist/domain/commands/edit-commands.d.ts +3 -3
  2. package/dist/domain/commands/edit-commands.d.ts.map +1 -1
  3. package/dist/domain/commands/edit-commands.js +25 -25
  4. package/dist/domain/commands/edit-commands.js.map +1 -1
  5. package/dist/domain/commands/history.d.ts +32 -0
  6. package/dist/domain/commands/history.d.ts.map +1 -0
  7. package/dist/domain/commands/history.js +63 -0
  8. package/dist/domain/commands/history.js.map +1 -0
  9. package/dist/domain/commands/note-commands.d.ts +147 -3
  10. package/dist/domain/commands/note-commands.d.ts.map +1 -1
  11. package/dist/domain/commands/note-commands.js +438 -46
  12. package/dist/domain/commands/note-commands.js.map +1 -1
  13. package/dist/domain/commands/reflow.d.ts +1 -1
  14. package/dist/domain/commands/reflow.js +17 -17
  15. package/dist/domain/commands/reflow.js.map +1 -1
  16. package/dist/domain/commands/region-commands.d.ts +4 -4
  17. package/dist/domain/commands/region-commands.d.ts.map +1 -1
  18. package/dist/domain/commands/region-commands.js +7 -7
  19. package/dist/domain/commands/region-commands.js.map +1 -1
  20. package/dist/domain/commands/relocate-commands.d.ts +3 -3
  21. package/dist/domain/commands/relocate-commands.js +15 -15
  22. package/dist/domain/commands/relocate-commands.js.map +1 -1
  23. package/dist/domain/commands/ripple-commands.d.ts +2 -2
  24. package/dist/domain/commands/ripple-commands.js +13 -13
  25. package/dist/domain/commands/ripple-commands.js.map +1 -1
  26. package/dist/domain/commands/snapshot.d.ts +3 -3
  27. package/dist/domain/commands/snapshot.js +5 -5
  28. package/dist/domain/commands/snapshot.js.map +1 -1
  29. package/dist/domain/commands/structure-commands.d.ts +86 -5
  30. package/dist/domain/commands/structure-commands.d.ts.map +1 -1
  31. package/dist/domain/commands/structure-commands.js +272 -36
  32. package/dist/domain/commands/structure-commands.js.map +1 -1
  33. package/dist/domain/commands/track-commands.d.ts +2 -2
  34. package/dist/domain/commands/track-commands.js +7 -7
  35. package/dist/domain/commands/track-commands.js.map +1 -1
  36. package/dist/domain/commands/types.d.ts +2 -2
  37. package/dist/domain/generation/replacement-region.d.ts +32 -0
  38. package/dist/domain/generation/replacement-region.d.ts.map +1 -0
  39. package/dist/domain/generation/replacement-region.js +79 -0
  40. package/dist/domain/generation/replacement-region.js.map +1 -0
  41. package/dist/domain/instruments/gm-icon.d.ts +12 -0
  42. package/dist/domain/instruments/gm-icon.d.ts.map +1 -0
  43. package/dist/domain/instruments/gm-icon.js +327 -0
  44. package/dist/domain/instruments/gm-icon.js.map +1 -0
  45. package/dist/domain/instruments/gm-kit.js +9 -9
  46. package/dist/domain/instruments/gm-kit.js.map +1 -1
  47. package/dist/domain/instruments/gm-percussion.js +48 -48
  48. package/dist/domain/instruments/gm-percussion.js.map +1 -1
  49. package/dist/domain/instruments/gm-polyphony.js +6 -6
  50. package/dist/domain/instruments/gm-range.js +6 -6
  51. package/dist/domain/instruments/gm-transposition.js +1 -1
  52. package/dist/domain/instruments/gm.d.ts +1 -1
  53. package/dist/domain/instruments/gm.js +161 -161
  54. package/dist/domain/instruments/gm.js.map +1 -1
  55. package/dist/domain/instruments/icon-art.d.ts +75 -0
  56. package/dist/domain/instruments/icon-art.d.ts.map +1 -0
  57. package/dist/domain/instruments/icon-art.js +93 -0
  58. package/dist/domain/instruments/icon-art.js.map +1 -0
  59. package/dist/domain/instruments/instrument-fit.d.ts +31 -0
  60. package/dist/domain/instruments/instrument-fit.d.ts.map +1 -0
  61. package/dist/domain/instruments/instrument-fit.js +117 -0
  62. package/dist/domain/instruments/instrument-fit.js.map +1 -0
  63. package/dist/domain/instruments/instrument-options.d.ts +62 -0
  64. package/dist/domain/instruments/instrument-options.d.ts.map +1 -0
  65. package/dist/domain/instruments/instrument-options.js +69 -0
  66. package/dist/domain/instruments/instrument-options.js.map +1 -0
  67. package/dist/domain/instruments/track-instrument.d.ts +80 -0
  68. package/dist/domain/instruments/track-instrument.d.ts.map +1 -0
  69. package/dist/domain/instruments/track-instrument.js +102 -0
  70. package/dist/domain/instruments/track-instrument.js.map +1 -0
  71. package/dist/domain/notation/chord-symbol.d.ts +26 -0
  72. package/dist/domain/notation/chord-symbol.d.ts.map +1 -0
  73. package/dist/domain/notation/chord-symbol.js +32 -0
  74. package/dist/domain/notation/chord-symbol.js.map +1 -0
  75. package/dist/domain/notation/lyric-syllables.d.ts +15 -0
  76. package/dist/domain/notation/lyric-syllables.d.ts.map +1 -0
  77. package/dist/domain/notation/lyric-syllables.js +15 -0
  78. package/dist/domain/notation/lyric-syllables.js.map +1 -0
  79. package/dist/domain/notation/music-vocabulary.d.ts +59 -0
  80. package/dist/domain/notation/music-vocabulary.d.ts.map +1 -0
  81. package/dist/domain/notation/music-vocabulary.js +164 -0
  82. package/dist/domain/notation/music-vocabulary.js.map +1 -0
  83. package/dist/domain/pitch/pitch.d.ts +1 -1
  84. package/dist/domain/pitch/pitch.js +29 -29
  85. package/dist/domain/pitch/transpose.d.ts +1 -1
  86. package/dist/domain/pitch/transpose.js +2 -2
  87. package/dist/domain/quantization/quantize.d.ts +2 -2
  88. package/dist/domain/quantization/quantize.js +9 -9
  89. package/dist/domain/quantization/quantize.js.map +1 -1
  90. package/dist/domain/score/articulation.d.ts +56 -0
  91. package/dist/domain/score/articulation.d.ts.map +1 -0
  92. package/dist/domain/score/articulation.js +56 -0
  93. package/dist/domain/score/articulation.js.map +1 -0
  94. package/dist/domain/score/bar-numbers.d.ts +38 -0
  95. package/dist/domain/score/bar-numbers.d.ts.map +1 -0
  96. package/dist/domain/score/bar-numbers.js +49 -0
  97. package/dist/domain/score/bar-numbers.js.map +1 -0
  98. package/dist/domain/score/collapse-rests.d.ts +23 -0
  99. package/dist/domain/score/collapse-rests.d.ts.map +1 -0
  100. package/dist/domain/score/collapse-rests.js +78 -0
  101. package/dist/domain/score/collapse-rests.js.map +1 -0
  102. package/dist/domain/score/cue-notes.d.ts +24 -0
  103. package/dist/domain/score/cue-notes.d.ts.map +1 -0
  104. package/dist/domain/score/cue-notes.js +105 -0
  105. package/dist/domain/score/cue-notes.js.map +1 -0
  106. package/dist/domain/score/dynamics.d.ts +62 -0
  107. package/dist/domain/score/dynamics.d.ts.map +1 -0
  108. package/dist/domain/score/dynamics.js +142 -0
  109. package/dist/domain/score/dynamics.js.map +1 -0
  110. package/dist/domain/score/effective-clef.d.ts +42 -0
  111. package/dist/domain/score/effective-clef.d.ts.map +1 -0
  112. package/dist/domain/score/effective-clef.js +39 -0
  113. package/dist/domain/score/effective-clef.js.map +1 -0
  114. package/dist/domain/score/extract-part.d.ts +10 -0
  115. package/dist/domain/score/extract-part.d.ts.map +1 -0
  116. package/dist/domain/score/extract-part.js +44 -0
  117. package/dist/domain/score/extract-part.js.map +1 -0
  118. package/dist/domain/score/factory.d.ts +1 -1
  119. package/dist/domain/score/factory.js +12 -12
  120. package/dist/domain/score/factory.js.map +1 -1
  121. package/dist/domain/score/fermata-tempo.d.ts +40 -0
  122. package/dist/domain/score/fermata-tempo.d.ts.map +1 -0
  123. package/dist/domain/score/fermata-tempo.js +95 -0
  124. package/dist/domain/score/fermata-tempo.js.map +1 -0
  125. package/dist/domain/score/flatten.d.ts +32 -0
  126. package/dist/domain/score/flatten.d.ts.map +1 -0
  127. package/dist/domain/score/flatten.js +132 -0
  128. package/dist/domain/score/flatten.js.map +1 -0
  129. package/dist/domain/score/fragment.d.ts +3 -3
  130. package/dist/domain/score/fragment.js +8 -8
  131. package/dist/domain/score/fragment.js.map +1 -1
  132. package/dist/domain/score/ids.d.ts +1 -1
  133. package/dist/domain/score/ids.js +6 -6
  134. package/dist/domain/score/ottava.d.ts +41 -0
  135. package/dist/domain/score/ottava.d.ts.map +1 -0
  136. package/dist/domain/score/ottava.js +98 -0
  137. package/dist/domain/score/ottava.js.map +1 -0
  138. package/dist/domain/score/performance-timeline.d.ts +42 -0
  139. package/dist/domain/score/performance-timeline.d.ts.map +1 -0
  140. package/dist/domain/score/performance-timeline.js +78 -0
  141. package/dist/domain/score/performance-timeline.js.map +1 -0
  142. package/dist/domain/score/queries.d.ts +2 -2
  143. package/dist/domain/score/queries.js +7 -7
  144. package/dist/domain/score/queries.js.map +1 -1
  145. package/dist/domain/score/rehearsal-marks.d.ts +30 -0
  146. package/dist/domain/score/rehearsal-marks.d.ts.map +1 -0
  147. package/dist/domain/score/rehearsal-marks.js +126 -0
  148. package/dist/domain/score/rehearsal-marks.js.map +1 -0
  149. package/dist/domain/score/repeat-order.d.ts +21 -0
  150. package/dist/domain/score/repeat-order.d.ts.map +1 -0
  151. package/dist/domain/score/repeat-order.js +123 -0
  152. package/dist/domain/score/repeat-order.js.map +1 -0
  153. package/dist/domain/score/snapshot-tree.d.ts +23 -0
  154. package/dist/domain/score/snapshot-tree.d.ts.map +1 -0
  155. package/dist/domain/score/snapshot-tree.js +45 -0
  156. package/dist/domain/score/snapshot-tree.js.map +1 -0
  157. package/dist/domain/score/ties.d.ts +1 -1
  158. package/dist/domain/score/ties.js +7 -7
  159. package/dist/domain/score/ties.js.map +1 -1
  160. package/dist/domain/score/written-pitch.d.ts +33 -0
  161. package/dist/domain/score/written-pitch.d.ts.map +1 -0
  162. package/dist/domain/score/written-pitch.js +110 -0
  163. package/dist/domain/score/written-pitch.js.map +1 -0
  164. package/dist/domain/selection/range-select.d.ts +13 -0
  165. package/dist/domain/selection/range-select.d.ts.map +1 -0
  166. package/dist/domain/selection/range-select.js +40 -0
  167. package/dist/domain/selection/range-select.js.map +1 -0
  168. package/dist/domain/selection/selection-editing.d.ts +30 -0
  169. package/dist/domain/selection/selection-editing.d.ts.map +1 -0
  170. package/dist/domain/selection/selection-editing.js +31 -0
  171. package/dist/domain/selection/selection-editing.js.map +1 -0
  172. package/dist/domain/selection/selection.d.ts +2 -2
  173. package/dist/domain/selection/selection.js +7 -7
  174. package/dist/domain/selection/selection.js.map +1 -1
  175. package/dist/domain/selection/types.d.ts +2 -2
  176. package/dist/domain/time/duration-modifiers.d.ts +40 -0
  177. package/dist/domain/time/duration-modifiers.d.ts.map +1 -0
  178. package/dist/domain/time/duration-modifiers.js +50 -0
  179. package/dist/domain/time/duration-modifiers.js.map +1 -0
  180. package/dist/domain/time/duration-selection.d.ts +23 -0
  181. package/dist/domain/time/duration-selection.d.ts.map +1 -0
  182. package/dist/domain/time/duration-selection.js +50 -0
  183. package/dist/domain/time/duration-selection.js.map +1 -0
  184. package/dist/domain/time/durations.js +6 -6
  185. package/dist/domain/time/durations.js.map +1 -1
  186. package/dist/domain/time/fraction.d.ts +1 -1
  187. package/dist/domain/time/fraction.js +1 -1
  188. package/dist/domain/time/tap-to-note.d.ts +21 -0
  189. package/dist/domain/time/tap-to-note.d.ts.map +1 -0
  190. package/dist/domain/time/tap-to-note.js +43 -0
  191. package/dist/domain/time/tap-to-note.js.map +1 -0
  192. package/dist/domain/time/tempo-map.d.ts +1 -1
  193. package/dist/domain/time/ticks.d.ts +1 -1
  194. package/dist/domain/time/ticks.d.ts.map +1 -1
  195. package/dist/domain/time/ticks.js +14 -14
  196. package/dist/domain/time/ticks.js.map +1 -1
  197. package/dist/domain/time/tuplets.d.ts +42 -0
  198. package/dist/domain/time/tuplets.d.ts.map +1 -0
  199. package/dist/domain/time/tuplets.js +53 -0
  200. package/dist/domain/time/tuplets.js.map +1 -0
  201. package/dist/domain/validation/issues.d.ts +1 -1
  202. package/dist/domain/validation/issues.js +20 -20
  203. package/dist/domain/validation/validator.d.ts +2 -2
  204. package/dist/domain/validation/validator.d.ts.map +1 -1
  205. package/dist/domain/validation/validator.js +31 -31
  206. package/dist/domain/validation/validator.js.map +1 -1
  207. package/dist/domain/voicing/allocate.d.ts +2 -2
  208. package/dist/domain/voicing/allocate.js +6 -6
  209. package/dist/domain/voicing/allocate.js.map +1 -1
  210. package/dist/index.d.ts +90 -59
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +151 -83
  213. package/dist/index.js.map +1 -1
  214. package/dist/platform/audio.d.ts.map +1 -1
  215. package/dist/platform/file.d.ts.map +1 -1
  216. package/dist/platform/index.d.ts +7 -7
  217. package/dist/platform/index.js +7 -7
  218. package/dist/platform/midi-input.d.ts +2 -2
  219. package/dist/platform/midi.d.ts.map +1 -1
  220. package/dist/platform/mod.d.ts +2 -2
  221. package/dist/platform/playback.d.ts +7 -7
  222. package/dist/platform/xml.js +1 -1
  223. package/dist/services/regeneration/controller.d.ts +6 -6
  224. package/dist/services/regeneration/controller.js +12 -12
  225. package/dist/services/regeneration/controller.js.map +1 -1
  226. package/dist/test/fixtures.d.ts +1 -1
  227. package/dist/test/fixtures.js +103 -103
  228. package/dist/test/fixtures.js.map +1 -1
  229. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import type { CreateTrackOptions } from '../score/factory.js';
2
- import type { Clef, KeySignature, Measure, ScoreMetadata, TimeSignature, Track, UUID } from '../../index.js';
3
- import type { ScoreCommand } from './types.js';
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, 'createdAt'>>, label: string): ScoreCommand;
35
- export type TrackPropsPatch = Partial<Omit<Track, 'id' | 'measures'>>;
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;AAG9D,OAAO,KAAK,EACV,IAAI,EACJ,YAAY,EACZ,OAAO,EAEP,aAAa,EAEb,aAAa,EACb,KAAK,EACL,IAAI,EACL,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAM5D,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAE7D;AAYD,qGAAqG;AACrG,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAyB1E;AAeD,0HAA0H;AAC1H,wBAAgB,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAOD,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAE7E;AA4BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAiBD,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,IAAI,EACf,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAqCD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAsBF,sHAAsH;AACtH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAkBD,sHAAsH;AACtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,EAChD,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;AA+BtE,2HAA2H;AAC3H,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAMd"}
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;AAI9D,OAAO,KAAK,EACV,YAAY,EACZ,IAAI,EACJ,YAAY,EACZ,OAAO,EAEP,aAAa,EAEb,aAAa,EACb,KAAK,EACL,IAAI,EACL,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAM5D,yFAAyF;AACzF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAE7D;AAYD,qGAAqG;AACrG,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAyB1E;AAeD,0HAA0H;AAC1H,wBAAgB,eAAe,CAC7B,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAOD,2CAA2C;AAC3C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAE7E;AA4BD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,IAAI,EACf,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AA2CF,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,IAAI,EACf,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAiBD,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,IAAI,EACf,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAqCD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,EACb,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,IAAI,EACb,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,GAAG,SAAS,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAoCd;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,GACZ,YAAY,CAuCd;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,KAAK,EAAE,MAAM,GACZ,YAAY,CAoBd;AAED,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG,OAAO,CACnC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAC7D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAyBd;AAID,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAsBF,sHAAsH;AACtH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAoBD,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,IAAI,EAClB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAkBD,sHAAsH;AACtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,EAChD,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;AA+BtE,2HAA2H;AAC3H,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,EACb,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAMd"}
@@ -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 '../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 { measureDurationTicks } from '../time/ticks.js';
11
- import { transformCommand } from './snapshot.js';
12
- import { reflowVoice, touchMetadata, withTracks } from './reflow.js';
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: 'Voice 1',
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 === 'percussion';
144
- const isPercussion = clef === 'percussion';
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 ?? 'Acoustic Grand Piano',
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(['volume', 'pan', 'muted', 'solo']);
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
- ? 'mix'
214
- : 'content';
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":"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"}
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 '../../index.js';
2
- import type { ScoreCommand } from './types.js';
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 './reflow.js';
10
- import { transformCommand } from './snapshot.js';
11
- import { restMeasureLike } from './structure-commands.js';
12
- import { createId } from '../score/ids.js';
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,