@sudobility/music_types 0.11.30 → 0.11.32

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 (251) 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 +9 -12
  10. package/dist/domain/commands/note-commands.d.ts.map +1 -1
  11. package/dist/domain/commands/note-commands.js +42 -72
  12. package/dist/domain/commands/note-commands.js.map +1 -1
  13. package/dist/domain/commands/note-marks.d.ts +171 -0
  14. package/dist/domain/commands/note-marks.d.ts.map +1 -0
  15. package/dist/domain/commands/note-marks.js +427 -0
  16. package/dist/domain/commands/note-marks.js.map +1 -0
  17. package/dist/domain/commands/reflow.d.ts +1 -1
  18. package/dist/domain/commands/reflow.js +17 -17
  19. package/dist/domain/commands/reflow.js.map +1 -1
  20. package/dist/domain/commands/region-commands.d.ts +4 -4
  21. package/dist/domain/commands/region-commands.d.ts.map +1 -1
  22. package/dist/domain/commands/region-commands.js +7 -7
  23. package/dist/domain/commands/region-commands.js.map +1 -1
  24. package/dist/domain/commands/relocate-commands.d.ts +3 -3
  25. package/dist/domain/commands/relocate-commands.js +15 -15
  26. package/dist/domain/commands/relocate-commands.js.map +1 -1
  27. package/dist/domain/commands/ripple-commands.d.ts +2 -2
  28. package/dist/domain/commands/ripple-commands.js +13 -13
  29. package/dist/domain/commands/ripple-commands.js.map +1 -1
  30. package/dist/domain/commands/snapshot.d.ts +3 -3
  31. package/dist/domain/commands/snapshot.js +5 -5
  32. package/dist/domain/commands/snapshot.js.map +1 -1
  33. package/dist/domain/commands/structure-commands.d.ts +86 -5
  34. package/dist/domain/commands/structure-commands.d.ts.map +1 -1
  35. package/dist/domain/commands/structure-commands.js +272 -36
  36. package/dist/domain/commands/structure-commands.js.map +1 -1
  37. package/dist/domain/commands/track-commands.d.ts +2 -2
  38. package/dist/domain/commands/track-commands.js +7 -7
  39. package/dist/domain/commands/track-commands.js.map +1 -1
  40. package/dist/domain/commands/types.d.ts +2 -2
  41. package/dist/domain/generation/replacement-region.d.ts +32 -0
  42. package/dist/domain/generation/replacement-region.d.ts.map +1 -0
  43. package/dist/domain/generation/replacement-region.js +79 -0
  44. package/dist/domain/generation/replacement-region.js.map +1 -0
  45. package/dist/domain/instruments/gm-icon.d.ts +12 -0
  46. package/dist/domain/instruments/gm-icon.d.ts.map +1 -0
  47. package/dist/domain/instruments/gm-icon.js +327 -0
  48. package/dist/domain/instruments/gm-icon.js.map +1 -0
  49. package/dist/domain/instruments/gm-kit.js +9 -9
  50. package/dist/domain/instruments/gm-kit.js.map +1 -1
  51. package/dist/domain/instruments/gm-percussion.js +48 -48
  52. package/dist/domain/instruments/gm-percussion.js.map +1 -1
  53. package/dist/domain/instruments/gm-polyphony.js +6 -6
  54. package/dist/domain/instruments/gm-range.js +6 -6
  55. package/dist/domain/instruments/gm-transposition.js +1 -1
  56. package/dist/domain/instruments/gm.d.ts +1 -1
  57. package/dist/domain/instruments/gm.js +161 -161
  58. package/dist/domain/instruments/gm.js.map +1 -1
  59. package/dist/domain/instruments/icon-art.d.ts +75 -0
  60. package/dist/domain/instruments/icon-art.d.ts.map +1 -0
  61. package/dist/domain/instruments/icon-art.js +93 -0
  62. package/dist/domain/instruments/icon-art.js.map +1 -0
  63. package/dist/domain/instruments/instrument-fit.d.ts +31 -0
  64. package/dist/domain/instruments/instrument-fit.d.ts.map +1 -0
  65. package/dist/domain/instruments/instrument-fit.js +117 -0
  66. package/dist/domain/instruments/instrument-fit.js.map +1 -0
  67. package/dist/domain/instruments/instrument-options.d.ts +62 -0
  68. package/dist/domain/instruments/instrument-options.d.ts.map +1 -0
  69. package/dist/domain/instruments/instrument-options.js +69 -0
  70. package/dist/domain/instruments/instrument-options.js.map +1 -0
  71. package/dist/domain/instruments/track-instrument.d.ts +80 -0
  72. package/dist/domain/instruments/track-instrument.d.ts.map +1 -0
  73. package/dist/domain/instruments/track-instrument.js +102 -0
  74. package/dist/domain/instruments/track-instrument.js.map +1 -0
  75. package/dist/domain/notation/chord-symbol.d.ts +26 -0
  76. package/dist/domain/notation/chord-symbol.d.ts.map +1 -0
  77. package/dist/domain/notation/chord-symbol.js +32 -0
  78. package/dist/domain/notation/chord-symbol.js.map +1 -0
  79. package/dist/domain/notation/lyric-syllables.d.ts +15 -0
  80. package/dist/domain/notation/lyric-syllables.d.ts.map +1 -0
  81. package/dist/domain/notation/lyric-syllables.js +15 -0
  82. package/dist/domain/notation/lyric-syllables.js.map +1 -0
  83. package/dist/domain/notation/music-vocabulary.d.ts +59 -0
  84. package/dist/domain/notation/music-vocabulary.d.ts.map +1 -0
  85. package/dist/domain/notation/music-vocabulary.js +164 -0
  86. package/dist/domain/notation/music-vocabulary.js.map +1 -0
  87. package/dist/domain/pitch/pitch.d.ts +1 -1
  88. package/dist/domain/pitch/pitch.js +29 -29
  89. package/dist/domain/pitch/transpose.d.ts +1 -1
  90. package/dist/domain/pitch/transpose.js +2 -2
  91. package/dist/domain/quantization/quantize.d.ts +2 -2
  92. package/dist/domain/quantization/quantize.js +9 -9
  93. package/dist/domain/quantization/quantize.js.map +1 -1
  94. package/dist/domain/score/articulation.d.ts +56 -0
  95. package/dist/domain/score/articulation.d.ts.map +1 -0
  96. package/dist/domain/score/articulation.js +56 -0
  97. package/dist/domain/score/articulation.js.map +1 -0
  98. package/dist/domain/score/bar-numbers.d.ts +38 -0
  99. package/dist/domain/score/bar-numbers.d.ts.map +1 -0
  100. package/dist/domain/score/bar-numbers.js +49 -0
  101. package/dist/domain/score/bar-numbers.js.map +1 -0
  102. package/dist/domain/score/collapse-rests.d.ts +23 -0
  103. package/dist/domain/score/collapse-rests.d.ts.map +1 -0
  104. package/dist/domain/score/collapse-rests.js +78 -0
  105. package/dist/domain/score/collapse-rests.js.map +1 -0
  106. package/dist/domain/score/cue-notes.d.ts +24 -0
  107. package/dist/domain/score/cue-notes.d.ts.map +1 -0
  108. package/dist/domain/score/cue-notes.js +105 -0
  109. package/dist/domain/score/cue-notes.js.map +1 -0
  110. package/dist/domain/score/dynamics.d.ts +62 -0
  111. package/dist/domain/score/dynamics.d.ts.map +1 -0
  112. package/dist/domain/score/dynamics.js +142 -0
  113. package/dist/domain/score/dynamics.js.map +1 -0
  114. package/dist/domain/score/effective-clef.d.ts +42 -0
  115. package/dist/domain/score/effective-clef.d.ts.map +1 -0
  116. package/dist/domain/score/effective-clef.js +39 -0
  117. package/dist/domain/score/effective-clef.js.map +1 -0
  118. package/dist/domain/score/extract-part.d.ts +10 -0
  119. package/dist/domain/score/extract-part.d.ts.map +1 -0
  120. package/dist/domain/score/extract-part.js +44 -0
  121. package/dist/domain/score/extract-part.js.map +1 -0
  122. package/dist/domain/score/factory.d.ts +1 -1
  123. package/dist/domain/score/factory.js +12 -12
  124. package/dist/domain/score/factory.js.map +1 -1
  125. package/dist/domain/score/fermata-tempo.d.ts +40 -0
  126. package/dist/domain/score/fermata-tempo.d.ts.map +1 -0
  127. package/dist/domain/score/fermata-tempo.js +95 -0
  128. package/dist/domain/score/fermata-tempo.js.map +1 -0
  129. package/dist/domain/score/flatten.d.ts +32 -0
  130. package/dist/domain/score/flatten.d.ts.map +1 -0
  131. package/dist/domain/score/flatten.js +132 -0
  132. package/dist/domain/score/flatten.js.map +1 -0
  133. package/dist/domain/score/fragment.d.ts +4 -8
  134. package/dist/domain/score/fragment.d.ts.map +1 -1
  135. package/dist/domain/score/fragment.js +8 -8
  136. package/dist/domain/score/fragment.js.map +1 -1
  137. package/dist/domain/score/ids.d.ts +1 -1
  138. package/dist/domain/score/ids.js +6 -6
  139. package/dist/domain/score/ottava.d.ts +41 -0
  140. package/dist/domain/score/ottava.d.ts.map +1 -0
  141. package/dist/domain/score/ottava.js +98 -0
  142. package/dist/domain/score/ottava.js.map +1 -0
  143. package/dist/domain/score/performance-timeline.d.ts +42 -0
  144. package/dist/domain/score/performance-timeline.d.ts.map +1 -0
  145. package/dist/domain/score/performance-timeline.js +78 -0
  146. package/dist/domain/score/performance-timeline.js.map +1 -0
  147. package/dist/domain/score/queries.d.ts +2 -2
  148. package/dist/domain/score/queries.js +7 -7
  149. package/dist/domain/score/queries.js.map +1 -1
  150. package/dist/domain/score/rehearsal-marks.d.ts +30 -0
  151. package/dist/domain/score/rehearsal-marks.d.ts.map +1 -0
  152. package/dist/domain/score/rehearsal-marks.js +126 -0
  153. package/dist/domain/score/rehearsal-marks.js.map +1 -0
  154. package/dist/domain/score/repeat-order.d.ts +21 -0
  155. package/dist/domain/score/repeat-order.d.ts.map +1 -0
  156. package/dist/domain/score/repeat-order.js +123 -0
  157. package/dist/domain/score/repeat-order.js.map +1 -0
  158. package/dist/domain/score/snapshot-tree.d.ts +23 -0
  159. package/dist/domain/score/snapshot-tree.d.ts.map +1 -0
  160. package/dist/domain/score/snapshot-tree.js +45 -0
  161. package/dist/domain/score/snapshot-tree.js.map +1 -0
  162. package/dist/domain/score/ties.d.ts +1 -1
  163. package/dist/domain/score/ties.js +7 -7
  164. package/dist/domain/score/ties.js.map +1 -1
  165. package/dist/domain/score/written-pitch.d.ts +33 -0
  166. package/dist/domain/score/written-pitch.d.ts.map +1 -0
  167. package/dist/domain/score/written-pitch.js +110 -0
  168. package/dist/domain/score/written-pitch.js.map +1 -0
  169. package/dist/domain/selection/range-select.d.ts +13 -0
  170. package/dist/domain/selection/range-select.d.ts.map +1 -0
  171. package/dist/domain/selection/range-select.js +40 -0
  172. package/dist/domain/selection/range-select.js.map +1 -0
  173. package/dist/domain/selection/selection-editing.d.ts +30 -0
  174. package/dist/domain/selection/selection-editing.d.ts.map +1 -0
  175. package/dist/domain/selection/selection-editing.js +31 -0
  176. package/dist/domain/selection/selection-editing.js.map +1 -0
  177. package/dist/domain/selection/selection.d.ts +2 -2
  178. package/dist/domain/selection/selection.js +7 -7
  179. package/dist/domain/selection/selection.js.map +1 -1
  180. package/dist/domain/selection/types.d.ts +2 -2
  181. package/dist/domain/selection/types.d.ts.map +1 -1
  182. package/dist/domain/time/duration-modifiers.d.ts +40 -0
  183. package/dist/domain/time/duration-modifiers.d.ts.map +1 -0
  184. package/dist/domain/time/duration-modifiers.js +50 -0
  185. package/dist/domain/time/duration-modifiers.js.map +1 -0
  186. package/dist/domain/time/duration-selection.d.ts +23 -0
  187. package/dist/domain/time/duration-selection.d.ts.map +1 -0
  188. package/dist/domain/time/duration-selection.js +50 -0
  189. package/dist/domain/time/duration-selection.js.map +1 -0
  190. package/dist/domain/time/durations.js +6 -6
  191. package/dist/domain/time/durations.js.map +1 -1
  192. package/dist/domain/time/fraction.d.ts +1 -1
  193. package/dist/domain/time/fraction.js +1 -1
  194. package/dist/domain/time/tap-to-note.d.ts +21 -0
  195. package/dist/domain/time/tap-to-note.d.ts.map +1 -0
  196. package/dist/domain/time/tap-to-note.js +43 -0
  197. package/dist/domain/time/tap-to-note.js.map +1 -0
  198. package/dist/domain/time/tempo-map.d.ts +1 -1
  199. package/dist/domain/time/ticks.d.ts +1 -1
  200. package/dist/domain/time/ticks.d.ts.map +1 -1
  201. package/dist/domain/time/ticks.js +14 -14
  202. package/dist/domain/time/ticks.js.map +1 -1
  203. package/dist/domain/time/tuplets.d.ts +42 -0
  204. package/dist/domain/time/tuplets.d.ts.map +1 -0
  205. package/dist/domain/time/tuplets.js +53 -0
  206. package/dist/domain/time/tuplets.js.map +1 -0
  207. package/dist/domain/validation/issues.d.ts +1 -1
  208. package/dist/domain/validation/issues.js +20 -20
  209. package/dist/domain/validation/validator.d.ts +2 -2
  210. package/dist/domain/validation/validator.d.ts.map +1 -1
  211. package/dist/domain/validation/validator.js +31 -31
  212. package/dist/domain/validation/validator.js.map +1 -1
  213. package/dist/domain/voicing/allocate.d.ts +2 -2
  214. package/dist/domain/voicing/allocate.js +6 -6
  215. package/dist/domain/voicing/allocate.js.map +1 -1
  216. package/dist/index.d.ts +72 -5535
  217. package/dist/index.d.ts.map +1 -1
  218. package/dist/index.js +79 -462
  219. package/dist/index.js.map +1 -1
  220. package/dist/model/api.d.ts +1696 -0
  221. package/dist/model/api.d.ts.map +1 -0
  222. package/dist/model/api.js +125 -0
  223. package/dist/model/api.js.map +1 -0
  224. package/dist/model/generation.d.ts +2178 -0
  225. package/dist/model/generation.d.ts.map +1 -0
  226. package/dist/model/generation.js +142 -0
  227. package/dist/model/generation.js.map +1 -0
  228. package/dist/model/schemas.d.ts +1200 -0
  229. package/dist/model/schemas.d.ts.map +1 -0
  230. package/dist/model/schemas.js +200 -0
  231. package/dist/model/schemas.js.map +1 -0
  232. package/dist/model/score.d.ts +462 -0
  233. package/dist/model/score.d.ts.map +1 -0
  234. package/dist/model/score.js +34 -0
  235. package/dist/model/score.js.map +1 -0
  236. package/dist/platform/audio.d.ts.map +1 -1
  237. package/dist/platform/file.d.ts.map +1 -1
  238. package/dist/platform/index.d.ts +7 -7
  239. package/dist/platform/index.js +7 -7
  240. package/dist/platform/midi-input.d.ts +2 -2
  241. package/dist/platform/midi.d.ts.map +1 -1
  242. package/dist/platform/mod.d.ts +2 -2
  243. package/dist/platform/playback.d.ts +7 -7
  244. package/dist/platform/xml.js +1 -1
  245. package/dist/services/regeneration/controller.d.ts +6 -6
  246. package/dist/services/regeneration/controller.js +12 -12
  247. package/dist/services/regeneration/controller.js.map +1 -1
  248. package/dist/test/fixtures.d.ts +1 -1
  249. package/dist/test/fixtures.js +103 -103
  250. package/dist/test/fixtures.js.map +1 -1
  251. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import type { MusicalEvent, NoteEvent, Score, UUID } from '../../index.js';
2
- import type { QuantizeOptions } from '../quantization/options.js';
3
- import type { ScoreCommand } from './types.js';
1
+ import type { MusicalEvent, NoteEvent, Score, UUID } from "../../index.js";
2
+ import type { QuantizeOptions } from "../quantization/options.js";
3
+ import type { ScoreCommand } from "./types.js";
4
4
  export type PasteDestination = {
5
5
  trackId: UUID;
6
6
  voiceIndex: number;
@@ -1 +1 @@
1
- {"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/edit-commands.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,KAAK,EACL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAkCF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,WAAW,EAAE,gBAAgB,EAC7B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAgBD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,SAAS,IAAI,EAAE,GACxB,cAAc,EAAE,CAiBlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,kBAAkB,EAAE,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,GACpD,KAAK,CAqCP;AAuBD,8GAA8G;AAC9G,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,IAAI,EAAE,EAChB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAuCD,uGAAuG;AACvG,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId"}
1
+ {"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/edit-commands.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAkCF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,EAAE,EAClB,WAAW,EAAE,gBAAgB,EAC7B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAgBD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,SAAS,IAAI,EAAE,GACxB,cAAc,EAAE,CAiBlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,kBAAkB,EAAE,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,GACpD,KAAK,CAqCP;AAuBD,8GAA8G;AAC9G,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,IAAI,EAAE,EAChB,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAuCD,uGAAuG;AACvG,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,EAAE,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId"}
@@ -3,19 +3,19 @@
3
3
  * §24). Each factory wraps a pure `(Score) => Score` transform via
4
4
  * `transformCommand`.
5
5
  */
6
- import { createId } from '../score/ids.js';
7
- import { splitNoteAcrossMeasures } from '../score/ties.js';
8
- import { isNoteEvent } from '../../index.js';
9
- import { transposePitch } from '../pitch/transpose.js';
10
- import { quantizeEvents } from '../quantization/quantize.js';
11
- import { transformCommand } from './snapshot.js';
12
- import { insertNoteIntoTrack, reflowVoice, withTracks } from './reflow.js';
6
+ import { createId } from "../score/ids.js";
7
+ import { splitNoteAcrossMeasures } from "../score/ties.js";
8
+ import { isNoteEvent } from "../../index.js";
9
+ import { transposePitch } from "../pitch/transpose.js";
10
+ import { quantizeEvents } from "../quantization/quantize.js";
11
+ import { transformCommand } from "./snapshot.js";
12
+ import { insertNoteIntoTrack, reflowVoice, withTracks } from "./reflow.js";
13
13
  function pasteEvents(score, notes, destination) {
14
- const track = score.tracks.find(t => t.id === destination.trackId);
14
+ const track = score.tracks.find((t) => t.id === destination.trackId);
15
15
  if (!track || notes.length === 0)
16
16
  return score;
17
- const originStart = Math.min(...notes.map(n => n.startTick));
18
- const boundaries = track.measures.map(m => m.startTick);
17
+ const originStart = Math.min(...notes.map((n) => n.startTick));
18
+ const boundaries = track.measures.map((m) => m.startTick);
19
19
  let working = track;
20
20
  for (const note of notes) {
21
21
  const startTick = destination.anchorTick + (note.startTick - originStart);
@@ -32,7 +32,7 @@ function pasteEvents(score, notes, destination) {
32
32
  working = insertNoteIntoTrack(working, segment, destination.voiceIndex);
33
33
  }
34
34
  }
35
- const tracks = score.tracks.map(t => (t.id === track.id ? working : t));
35
+ const tracks = score.tracks.map((t) => (t.id === track.id ? working : t));
36
36
  return withTracks(score, tracks);
37
37
  }
38
38
  /**
@@ -45,7 +45,7 @@ function pasteEvents(score, notes, destination) {
45
45
  * with their source.
46
46
  */
47
47
  export function pasteEventsCommand(notes, destination, label) {
48
- return transformCommand(label, score => pasteEvents(score, notes, destination));
48
+ return transformCommand(label, (score) => pasteEvents(score, notes, destination));
49
49
  }
50
50
  // ---- quantizeCommand -----------------------------------------------------------
51
51
  /** Clips `event` to fit within `measure`'s span, or returns `null` if that leaves no positive duration. */
@@ -75,7 +75,7 @@ export function collectQuantizeTargets(score, eventIds) {
75
75
  for (const track of score.tracks) {
76
76
  for (const measure of track.measures) {
77
77
  for (const voice of measure.voices) {
78
- if (!voice.events.some(e => idSet.has(e.id)))
78
+ if (!voice.events.some((e) => idSet.has(e.id)))
79
79
  continue;
80
80
  targets.push({
81
81
  trackId: track.id,
@@ -110,8 +110,8 @@ export function applyQuantizedGroups(score, targets, quantizedByVoiceId) {
110
110
  else
111
111
  targetsByTrackMeasure.set(key, [target]);
112
112
  }
113
- const tracks = score.tracks.map(track => {
114
- const measures = track.measures.map(measure => {
113
+ const tracks = score.tracks.map((track) => {
114
+ const measures = track.measures.map((measure) => {
115
115
  const measureTargets = targetsByTrackMeasure.get(`${track.id}::${measure.id}`);
116
116
  if (!measureTargets)
117
117
  return measure;
@@ -119,11 +119,11 @@ export function applyQuantizedGroups(score, targets, quantizedByVoiceId) {
119
119
  const measureEnd = measure.startTick + measure.durationTicks;
120
120
  for (const target of measureTargets) {
121
121
  const quantizedNotes = (quantizedByVoiceId.get(target.voiceId) ?? [])
122
- .map(e => clipToMeasure(e, measure.startTick, measureEnd))
122
+ .map((e) => clipToMeasure(e, measure.startTick, measureEnd))
123
123
  .filter((e) => e !== null);
124
124
  const withQuantized = {
125
125
  ...nextMeasure,
126
- voices: nextMeasure.voices.map(v => v.id === target.voiceId ? { ...v, events: quantizedNotes } : v),
126
+ voices: nextMeasure.voices.map((v) => v.id === target.voiceId ? { ...v, events: quantizedNotes } : v),
127
127
  };
128
128
  nextMeasure = reflowVoice(withQuantized, target.voiceId, track.id);
129
129
  }
@@ -145,24 +145,24 @@ export function applyQuantizedGroups(score, targets, quantizedByVoiceId) {
145
145
  */
146
146
  function quantize(score, eventIds, options) {
147
147
  const targets = collectQuantizeTargets(score, eventIds);
148
- const quantizedByVoiceId = new Map(targets.map(t => [t.voiceId, quantizeEvents(t.notes, options)]));
148
+ const quantizedByVoiceId = new Map(targets.map((t) => [t.voiceId, quantizeEvents(t.notes, options)]));
149
149
  return applyQuantizedGroups(score, targets, quantizedByVoiceId);
150
150
  }
151
151
  /** Quantizes every voice containing at least one of `eventIds`, per Task 4's reusable quantization engine. */
152
152
  export function quantizeCommand(eventIds, options, label) {
153
- return transformCommand(label, score => quantize(score, eventIds, options));
153
+ return transformCommand(label, (score) => quantize(score, eventIds, options));
154
154
  }
155
155
  // ---- transposeCommand -----------------------------------------------------------
156
156
  function transpose(score, eventIds, semitones) {
157
157
  const idSet = new Set(eventIds);
158
- const tracks = score.tracks.map(track => {
159
- const measures = track.measures.map(measure => {
160
- const voices = measure.voices.map(voice => {
161
- if (!voice.events.some(e => idSet.has(e.id)))
158
+ const tracks = score.tracks.map((track) => {
159
+ const measures = track.measures.map((measure) => {
160
+ const voices = measure.voices.map((voice) => {
161
+ if (!voice.events.some((e) => idSet.has(e.id)))
162
162
  return voice;
163
163
  return {
164
164
  ...voice,
165
- events: voice.events.map(event => isNoteEvent(event) && idSet.has(event.id)
165
+ events: voice.events.map((event) => isNoteEvent(event) && idSet.has(event.id)
166
166
  ? {
167
167
  ...event,
168
168
  pitch: transposePitch(event.pitch, semitones, measure.keySignature),
@@ -180,6 +180,6 @@ function transpose(score, eventIds, semitones) {
180
180
  }
181
181
  /** Transposes the given notes by `semitones`, re-spelling each per its own measure's key signature. */
182
182
  export function transposeCommand(eventIds, semitones, label) {
183
- return transformCommand(label, score => transpose(score, eventIds, semitones));
183
+ return transformCommand(label, (score) => transpose(score, eventIds, semitones));
184
184
  }
185
185
  //# sourceMappingURL=edit-commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../../src/domain/commands/edit-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../../src/domain/commands/edit-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Command-based undo/redo history (spec §14). `HistoryManager` holds only
3
+ * command-history bookkeeping (the undo/redo stacks and a size limit) —
4
+ * never a `Score` itself or any store reference: the current score always
5
+ * lives with the caller, passed in and received back on every call.
6
+ */
7
+ import type { Score } from "../../index.js";
8
+ import type { ScoreCommand } from "./types.js";
9
+ export declare class HistoryManager {
10
+ private readonly limit;
11
+ private undoStack;
12
+ private redoStack;
13
+ constructor(limit?: number);
14
+ /**
15
+ * Runs `cmd.execute(score)`, pushes `cmd` onto the undo stack (evicting
16
+ * the oldest entry if that exceeds `limit`), and clears the redo stack
17
+ * (a fresh command invalidates any previously-undone branch), per spec
18
+ * §14.
19
+ */
20
+ execute(cmd: ScoreCommand, score: Score): Score;
21
+ /** Undoes the most recently executed (or redone) command, or returns `null` if there is nothing to undo. */
22
+ undo(score: Score): Score | null;
23
+ /** Re-executes the most recently undone command, or returns `null` if there is nothing to redo. */
24
+ redo(score: Score): Score | null;
25
+ get canUndo(): boolean;
26
+ get canRedo(): boolean;
27
+ get undoLabel(): string | null;
28
+ get redoLabel(): string | null;
29
+ /** Clears both the undo and redo stacks. */
30
+ clear(): void;
31
+ }
32
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/history.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,SAAS,CAAsB;gBAE3B,KAAK,GAAE,MAAsB;IAIzC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK;IAU/C,4GAA4G;IAC5G,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI;IAQhC,mGAAmG;IACnG,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI;IAQhC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAI7B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAI7B;IAED,4CAA4C;IAC5C,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,63 @@
1
+ const DEFAULT_LIMIT = 200;
2
+ export class HistoryManager {
3
+ constructor(limit = DEFAULT_LIMIT) {
4
+ this.undoStack = [];
5
+ this.redoStack = [];
6
+ this.limit = limit;
7
+ }
8
+ /**
9
+ * Runs `cmd.execute(score)`, pushes `cmd` onto the undo stack (evicting
10
+ * the oldest entry if that exceeds `limit`), and clears the redo stack
11
+ * (a fresh command invalidates any previously-undone branch), per spec
12
+ * §14.
13
+ */
14
+ execute(cmd, score) {
15
+ const next = cmd.execute(score);
16
+ this.undoStack.push(cmd);
17
+ if (this.undoStack.length > this.limit) {
18
+ this.undoStack.shift();
19
+ }
20
+ this.redoStack = [];
21
+ return next;
22
+ }
23
+ /** Undoes the most recently executed (or redone) command, or returns `null` if there is nothing to undo. */
24
+ undo(score) {
25
+ const cmd = this.undoStack.pop();
26
+ if (!cmd)
27
+ return null;
28
+ const previous = cmd.undo(score);
29
+ this.redoStack.push(cmd);
30
+ return previous;
31
+ }
32
+ /** Re-executes the most recently undone command, or returns `null` if there is nothing to redo. */
33
+ redo(score) {
34
+ const cmd = this.redoStack.pop();
35
+ if (!cmd)
36
+ return null;
37
+ const next = cmd.execute(score);
38
+ this.undoStack.push(cmd);
39
+ return next;
40
+ }
41
+ get canUndo() {
42
+ return this.undoStack.length > 0;
43
+ }
44
+ get canRedo() {
45
+ return this.redoStack.length > 0;
46
+ }
47
+ get undoLabel() {
48
+ return this.undoStack.length > 0
49
+ ? this.undoStack[this.undoStack.length - 1].label
50
+ : null;
51
+ }
52
+ get redoLabel() {
53
+ return this.redoStack.length > 0
54
+ ? this.redoStack[this.redoStack.length - 1].label
55
+ : null;
56
+ }
57
+ /** Clears both the undo and redo stacks. */
58
+ clear() {
59
+ this.undoStack = [];
60
+ this.redoStack = [];
61
+ }
62
+ }
63
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/domain/commands/history.ts"],"names":[],"mappings":"AASA,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B,MAAM,OAAO,cAAc;IAKzB,YAAY,QAAgB,aAAa;QAHjC,cAAS,GAAmB,EAAE,CAAC;QAC/B,cAAS,GAAmB,EAAE,CAAC;QAGrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAiB,EAAE,KAAY;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4GAA4G;IAC5G,IAAI,CAAC,KAAY;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,mGAAmG;IACnG,IAAI,CAAC,KAAY;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;YACjD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK;YACjD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED,4CAA4C;IAC5C,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -1,5 +1,12 @@
1
- import type { Accidental, Articulation, DurationName, Pitch, UUID } from '../../index.js';
2
- import type { ScoreCommand } from './types.js';
1
+ import type { Articulation, DurationName, NoteEvent, Pitch, Score, UUID } from "../../index.js";
2
+ import type { ScoreCommand } from "./types.js";
3
+ /**
4
+ * Applies `updater` to every note event in `score` whose id is in
5
+ * `eventIds`; other events pass through unchanged. Preserves referential
6
+ * equality at every level (voice/measure/track) that has no matching
7
+ * event, so a call that matches nothing is a true no-op (see `withTracks`).
8
+ */
9
+ export declare function mapNotes(score: Score, eventIds: readonly UUID[], updater: (note: NoteEvent) => NoteEvent): Score;
3
10
  export type AddNoteParams = {
4
11
  trackId: UUID;
5
12
  measureId: UUID;
@@ -58,16 +65,6 @@ export declare function moveNotesCommand(eventIds: UUID[], params: MoveNotesPara
58
65
  export declare function resizeNotesCommand(eventIds: UUID[], durationTicks: number, label: string): ScoreCommand;
59
66
  /** Sets the given notes' duration to a named value (e.g. from the inspector), converted to ticks via the score's ppq. */
60
67
  export declare function changeDurationCommand(eventIds: UUID[], duration: DurationName, label: string): ScoreCommand;
61
- /** Sets the given notes' pitch to an absolute `Pitch`. */
62
- export declare function changePitchCommand(eventIds: UUID[], pitch: Pitch, label: string): ScoreCommand;
63
- /** Sets the given notes' velocity (0-127). */
64
- export declare function changeVelocityCommand(eventIds: UUID[], velocity: number, label: string): ScoreCommand;
65
- /** Sets (or clears, when `articulation` is `undefined`) the given notes' articulation. */
66
- export declare function changeArticulationCommand(eventIds: UUID[], articulation: Articulation | undefined, label: string): ScoreCommand;
67
- /** Sets the given notes' pitch accidental, keeping their step/octave. */
68
- export declare function changeAccidentalCommand(eventIds: UUID[], accidental: Accidental, label: string): ScoreCommand;
69
- /** Toggles `tieStart` or `tieStop` on the given notes. */
70
- export declare function toggleTieCommand(eventIds: UUID[], which: 'tieStart' | 'tieStop', label: string): ScoreCommand;
71
68
  /** Moves the given notes to the voice at ordinal position `targetVoiceIndex` within their current measure (created if absent). */
72
69
  export declare function changeVoiceCommand(eventIds: UUID[], targetVoiceIndex: number, label: string): ScoreCommand;
73
70
  //# sourceMappingURL=note-commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"note-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/note-commands.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,KAAK,EAGL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+C/C,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAwBF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAcD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,IAAI,EAAE,EAChB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAiF7E;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,EAAE,EAChB,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AA0CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,IAAI,EAAE,EAChB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAED,yHAAyH;AACzH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,IAAI,EAAE,EAChB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAID,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,IAAI,EAAE,EAChB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAED,8CAA8C;AAC9C,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,IAAI,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,IAAI,EAAE,EAChB,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,KAAK,EAAE,MAAM,GACZ,YAAY,CASd;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,IAAI,EAAE,EAChB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAOd;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,EAAE,EAChB,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AA0DD,kIAAkI;AAClI,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,IAAI,EAAE,EAChB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId"}
1
+ {"version":3,"file":"note-commands.d.ts","sourceRoot":"","sources":["../../../src/domain/commands/note-commands.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,KAAK,EACL,KAAK,EAEL,IAAI,EACL,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,SAAS,IAAI,EAAE,EACzB,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,GACtC,KAAK,CAoBP;AAID,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAwBF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAgBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,IAAI,EAAE,EAChB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AAID,MAAM,MAAM,eAAe,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAiF7E;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,IAAI,EAAE,EAChB,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,GACZ,YAAY,CAEd;AA0CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,IAAI,EAAE,EAChB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AAED,yHAAyH;AACzH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,IAAI,EAAE,EAChB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId;AA0DD,kIAAkI;AAClI,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,IAAI,EAAE,EAChB,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,GACZ,YAAY,CAId"}
@@ -10,13 +10,13 @@
10
10
  * note that crosses a measure boundary into tied segments via Task 3's
11
11
  * `splitNoteAcrossMeasures`, per the Task 5 brief.
12
12
  */
13
- import { createId } from '../score/ids.js';
14
- import { splitNoteAcrossMeasures } from '../score/ties.js';
15
- import { isNoteEvent } from '../../index.js';
16
- import { ticksFor } from '../time/ticks.js';
17
- import { transposePitch } from '../pitch/transpose.js';
18
- import { transformCommand } from './snapshot.js';
19
- import { clearDanglingTies, ensureVoiceAtIndex, insertNoteIntoTrack, removeNotesFromTrack, reflowVoice, withTracks, } from './reflow.js';
13
+ import { createId } from "../score/ids.js";
14
+ import { splitNoteAcrossMeasures } from "../score/ties.js";
15
+ import { isNoteEvent } from "../../index.js";
16
+ import { ticksFor } from "../time/ticks.js";
17
+ import { transposePitch } from "../pitch/transpose.js";
18
+ import { transformCommand } from "./snapshot.js";
19
+ import { clearDanglingTies, ensureVoiceAtIndex, insertNoteIntoTrack, removeNotesFromTrack, reflowVoice, withTracks, } from "./reflow.js";
20
20
  // ---- shared traversal helpers ------------------------------------------------
21
21
  /**
22
22
  * Applies `updater` to every note event in `score` whose id is in
@@ -24,16 +24,16 @@ import { clearDanglingTies, ensureVoiceAtIndex, insertNoteIntoTrack, removeNotes
24
24
  * equality at every level (voice/measure/track) that has no matching
25
25
  * event, so a call that matches nothing is a true no-op (see `withTracks`).
26
26
  */
27
- function mapNotes(score, eventIds, updater) {
27
+ export function mapNotes(score, eventIds, updater) {
28
28
  const idSet = new Set(eventIds);
29
- const tracks = score.tracks.map(track => {
30
- const measures = track.measures.map(measure => {
31
- const voices = measure.voices.map(voice => {
32
- if (!voice.events.some(e => idSet.has(e.id)))
29
+ const tracks = score.tracks.map((track) => {
30
+ const measures = track.measures.map((measure) => {
31
+ const voices = measure.voices.map((voice) => {
32
+ if (!voice.events.some((e) => idSet.has(e.id)))
33
33
  return voice;
34
34
  return {
35
35
  ...voice,
36
- events: voice.events.map(event => isNoteEvent(event) && idSet.has(event.id) ? updater(event) : event),
36
+ events: voice.events.map((event) => isNoteEvent(event) && idSet.has(event.id) ? updater(event) : event),
37
37
  };
38
38
  });
39
39
  const measureChanged = voices.some((v, i) => v !== measure.voices[i]);
@@ -45,10 +45,10 @@ function mapNotes(score, eventIds, updater) {
45
45
  return withTracks(score, tracks);
46
46
  }
47
47
  function addNote(score, params) {
48
- const tracks = score.tracks.map(track => {
48
+ const tracks = score.tracks.map((track) => {
49
49
  if (track.id !== params.trackId)
50
50
  return track;
51
- const measureExists = track.measures.some(m => m.id === params.measureId);
51
+ const measureExists = track.measures.some((m) => m.id === params.measureId);
52
52
  if (!measureExists)
53
53
  return track;
54
54
  const note = {
@@ -57,7 +57,7 @@ function addNote(score, params) {
57
57
  startTick: params.startTick,
58
58
  durationTicks: params.durationTicks,
59
59
  velocity: params.velocity ?? 80,
60
- voiceId: '', // renumbered by insertNoteIntoTrack to the destination voice's id
60
+ voiceId: "", // renumbered by insertNoteIntoTrack to the destination voice's id
61
61
  trackId: track.id,
62
62
  ...(params.articulation ? { articulation: params.articulation } : {}),
63
63
  };
@@ -84,7 +84,7 @@ function addNote(score, params) {
84
84
  * further, or split it into per-measure `addNoteCommand` calls themselves.
85
85
  */
86
86
  export function addNoteCommand(params, label) {
87
- return transformCommand(label, score => addNote(score, params));
87
+ return transformCommand(label, (score) => addNote(score, params));
88
88
  }
89
89
  // ---- deleteEventsCommand -------------------------------------------------------
90
90
  function deleteEvents(score, eventIds) {
@@ -93,7 +93,7 @@ function deleteEvents(score, eventIds) {
93
93
  // note *before* actually removing the notes (clearDanglingTies needs
94
94
  // the deleted notes still in place to find their chain partners).
95
95
  const detied = clearDanglingTies(score, idSet);
96
- const tracks = detied.tracks.map(track => removeNotesFromTrack(track, idSet));
96
+ const tracks = detied.tracks.map((track) => removeNotesFromTrack(track, idSet));
97
97
  return withTracks(detied, tracks);
98
98
  }
99
99
  /**
@@ -102,13 +102,13 @@ function deleteEvents(score, eventIds) {
102
102
  * also being deleted, that partner's now-dangling tie flag is cleared.
103
103
  */
104
104
  export function deleteEventsCommand(eventIds, label) {
105
- return transformCommand(label, score => deleteEvents(score, eventIds));
105
+ return transformCommand(label, (score) => deleteEvents(score, eventIds));
106
106
  }
107
107
  function moveNotesOnTrack(track, eventIds, params) {
108
108
  const toMove = [];
109
- track.measures.forEach(measure => {
109
+ track.measures.forEach((measure) => {
110
110
  measure.voices.forEach((voice, voiceIndex) => {
111
- voice.events.forEach(event => {
111
+ voice.events.forEach((event) => {
112
112
  if (isNoteEvent(event) && eventIds.has(event.id))
113
113
  toMove.push({ note: event, voiceIndex });
114
114
  });
@@ -116,8 +116,8 @@ function moveNotesOnTrack(track, eventIds, params) {
116
116
  });
117
117
  if (toMove.length === 0)
118
118
  return track;
119
- let working = removeNotesFromTrack(track, new Set(toMove.map(m => m.note.id)));
120
- const boundaries = working.measures.map(m => m.startTick);
119
+ let working = removeNotesFromTrack(track, new Set(toMove.map((m) => m.note.id)));
120
+ const boundaries = working.measures.map((m) => m.startTick);
121
121
  const lastMeasure = working.measures[working.measures.length - 1];
122
122
  const trackEnd = lastMeasure
123
123
  ? lastMeasure.startTick + lastMeasure.durationTicks
@@ -125,7 +125,7 @@ function moveNotesOnTrack(track, eventIds, params) {
125
125
  for (const { note, voiceIndex } of toMove) {
126
126
  const maxStart = Math.max(0, trackEnd - note.durationTicks);
127
127
  const clampedStart = Math.max(0, Math.min(note.startTick + params.deltaTicks, maxStart));
128
- const destMeasure = working.measures.find(m => clampedStart >= m.startTick &&
128
+ const destMeasure = working.measures.find((m) => clampedStart >= m.startTick &&
129
129
  clampedStart < m.startTick + m.durationTicks) ?? lastMeasure;
130
130
  const newPitch = params.deltaSemitones !== 0
131
131
  ? transposePitch(note.pitch, params.deltaSemitones, destMeasure?.keySignature)
@@ -149,7 +149,7 @@ function moveNotes(score, eventIds, params) {
149
149
  // As in deleteEvents: clear dangling tie flags on any surviving partner
150
150
  // of a moved note before moveNotesOnTrack relocates it away.
151
151
  const detied = clearDanglingTies(score, idSet);
152
- const tracks = detied.tracks.map(track => moveNotesOnTrack(track, idSet, params));
152
+ const tracks = detied.tracks.map((track) => moveNotesOnTrack(track, idSet, params));
153
153
  return withTracks(detied, tracks);
154
154
  }
155
155
  /**
@@ -163,21 +163,21 @@ function moveNotes(score, eventIds, params) {
163
163
  * partner's now-dangling tie flag is cleared too.
164
164
  */
165
165
  export function moveNotesCommand(eventIds, params, label) {
166
- return transformCommand(label, score => moveNotes(score, eventIds, params));
166
+ return transformCommand(label, (score) => moveNotes(score, eventIds, params));
167
167
  }
168
168
  // ---- resizeNotesCommand / changeDurationCommand ----------------------------------
169
169
  function resizeNotes(score, eventIds, durationTicks) {
170
170
  const idSet = new Set(eventIds);
171
- const tracks = score.tracks.map(track => {
172
- const measures = track.measures.map(measure => {
171
+ const tracks = score.tracks.map((track) => {
172
+ const measures = track.measures.map((measure) => {
173
173
  let nextMeasure = measure;
174
174
  let changed = false;
175
175
  for (const voice of measure.voices) {
176
- if (!voice.events.some(e => idSet.has(e.id)))
176
+ if (!voice.events.some((e) => idSet.has(e.id)))
177
177
  continue;
178
178
  changed = true;
179
179
  const measureEnd = measure.startTick + measure.durationTicks;
180
- const updatedNotes = voice.events.filter(isNoteEvent).map(e => {
180
+ const updatedNotes = voice.events.filter(isNoteEvent).map((e) => {
181
181
  if (!idSet.has(e.id))
182
182
  return e;
183
183
  const clamped = Math.max(1, Math.min(durationTicks, measureEnd - e.startTick));
@@ -185,7 +185,7 @@ function resizeNotes(score, eventIds, durationTicks) {
185
185
  });
186
186
  const withResized = {
187
187
  ...nextMeasure,
188
- voices: nextMeasure.voices.map(v => v.id === voice.id ? { ...v, events: updatedNotes } : v),
188
+ voices: nextMeasure.voices.map((v) => v.id === voice.id ? { ...v, events: updatedNotes } : v),
189
189
  };
190
190
  nextMeasure = reflowVoice(withResized, voice.id, track.id);
191
191
  }
@@ -202,50 +202,20 @@ function resizeNotes(score, eventIds, durationTicks) {
202
202
  * current measure (no cross-measure re-splitting), then reflows.
203
203
  */
204
204
  export function resizeNotesCommand(eventIds, durationTicks, label) {
205
- return transformCommand(label, score => resizeNotes(score, eventIds, durationTicks));
205
+ return transformCommand(label, (score) => resizeNotes(score, eventIds, durationTicks));
206
206
  }
207
207
  /** Sets the given notes' duration to a named value (e.g. from the inspector), converted to ticks via the score's ppq. */
208
208
  export function changeDurationCommand(eventIds, duration, label) {
209
- return transformCommand(label, score => resizeNotes(score, eventIds, ticksFor(duration, score.ppq)));
210
- }
211
- // ---- simple per-note field commands ------------------------------------------
212
- /** Sets the given notes' pitch to an absolute `Pitch`. */
213
- export function changePitchCommand(eventIds, pitch, label) {
214
- return transformCommand(label, score => mapNotes(score, eventIds, note => ({ ...note, pitch })));
215
- }
216
- /** Sets the given notes' velocity (0-127). */
217
- export function changeVelocityCommand(eventIds, velocity, label) {
218
- return transformCommand(label, score => mapNotes(score, eventIds, note => ({ ...note, velocity })));
219
- }
220
- /** Sets (or clears, when `articulation` is `undefined`) the given notes' articulation. */
221
- export function changeArticulationCommand(eventIds, articulation, label) {
222
- return transformCommand(label, score => mapNotes(score, eventIds, note => {
223
- if (articulation)
224
- return { ...note, articulation };
225
- const updated = { ...note };
226
- delete updated.articulation;
227
- return updated;
228
- }));
229
- }
230
- /** Sets the given notes' pitch accidental, keeping their step/octave. */
231
- export function changeAccidentalCommand(eventIds, accidental, label) {
232
- return transformCommand(label, score => mapNotes(score, eventIds, note => ({
233
- ...note,
234
- pitch: { ...note.pitch, accidental },
235
- })));
236
- }
237
- /** Toggles `tieStart` or `tieStop` on the given notes. */
238
- export function toggleTieCommand(eventIds, which, label) {
239
- return transformCommand(label, score => mapNotes(score, eventIds, note => ({ ...note, [which]: !note[which] })));
209
+ return transformCommand(label, (score) => resizeNotes(score, eventIds, ticksFor(duration, score.ppq)));
240
210
  }
241
211
  // ---- changeVoiceCommand -----------------------------------------------------------
242
212
  function changeVoice(score, eventIds, targetVoiceIndex) {
243
213
  const idSet = new Set(eventIds);
244
- const tracks = score.tracks.map(track => {
245
- const measures = track.measures.map(measure => {
214
+ const tracks = score.tracks.map((track) => {
215
+ const measures = track.measures.map((measure) => {
246
216
  const matches = [];
247
- measure.voices.forEach(voice => {
248
- voice.events.forEach(e => {
217
+ measure.voices.forEach((voice) => {
218
+ voice.events.forEach((e) => {
249
219
  if (isNoteEvent(e) && idSet.has(e.id))
250
220
  matches.push(e);
251
221
  });
@@ -254,21 +224,21 @@ function changeVoice(score, eventIds, targetVoiceIndex) {
254
224
  return measure;
255
225
  let nextMeasure = measure;
256
226
  for (const voice of measure.voices) {
257
- if (!voice.events.some(e => idSet.has(e.id)))
227
+ if (!voice.events.some((e) => idSet.has(e.id)))
258
228
  continue;
259
229
  const remaining = voice.events
260
230
  .filter(isNoteEvent)
261
- .filter(e => !idSet.has(e.id));
231
+ .filter((e) => !idSet.has(e.id));
262
232
  const withRemoved = {
263
233
  ...nextMeasure,
264
- voices: nextMeasure.voices.map(v => v.id === voice.id ? { ...v, events: remaining } : v),
234
+ voices: nextMeasure.voices.map((v) => v.id === voice.id ? { ...v, events: remaining } : v),
265
235
  };
266
236
  nextMeasure = reflowVoice(withRemoved, voice.id, track.id);
267
237
  }
268
238
  nextMeasure = ensureVoiceAtIndex(nextMeasure, targetVoiceIndex, track.id);
269
239
  const targetVoice = nextMeasure.voices[targetVoiceIndex];
270
240
  const existingNotes = targetVoice.events.filter(isNoteEvent);
271
- const movedNotes = matches.map(n => ({
241
+ const movedNotes = matches.map((n) => ({
272
242
  ...n,
273
243
  voiceId: targetVoice.id,
274
244
  }));
@@ -287,6 +257,6 @@ function changeVoice(score, eventIds, targetVoiceIndex) {
287
257
  }
288
258
  /** Moves the given notes to the voice at ordinal position `targetVoiceIndex` within their current measure (created if absent). */
289
259
  export function changeVoiceCommand(eventIds, targetVoiceIndex, label) {
290
- return transformCommand(label, score => changeVoice(score, eventIds, targetVoiceIndex));
260
+ return transformCommand(label, (score) => changeVoice(score, eventIds, targetVoiceIndex));
291
261
  }
292
262
  //# sourceMappingURL=note-commands.js.map