@sudobility/music_types 0.11.30 → 0.11.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domain/commands/edit-commands.d.ts +3 -3
- package/dist/domain/commands/edit-commands.d.ts.map +1 -1
- package/dist/domain/commands/edit-commands.js +25 -25
- package/dist/domain/commands/edit-commands.js.map +1 -1
- package/dist/domain/commands/history.d.ts +32 -0
- package/dist/domain/commands/history.d.ts.map +1 -0
- package/dist/domain/commands/history.js +63 -0
- package/dist/domain/commands/history.js.map +1 -0
- package/dist/domain/commands/note-commands.d.ts +147 -3
- package/dist/domain/commands/note-commands.d.ts.map +1 -1
- package/dist/domain/commands/note-commands.js +438 -46
- package/dist/domain/commands/note-commands.js.map +1 -1
- package/dist/domain/commands/reflow.d.ts +1 -1
- package/dist/domain/commands/reflow.js +17 -17
- package/dist/domain/commands/reflow.js.map +1 -1
- package/dist/domain/commands/region-commands.d.ts +4 -4
- package/dist/domain/commands/region-commands.d.ts.map +1 -1
- package/dist/domain/commands/region-commands.js +7 -7
- package/dist/domain/commands/region-commands.js.map +1 -1
- package/dist/domain/commands/relocate-commands.d.ts +3 -3
- package/dist/domain/commands/relocate-commands.js +15 -15
- package/dist/domain/commands/relocate-commands.js.map +1 -1
- package/dist/domain/commands/ripple-commands.d.ts +2 -2
- package/dist/domain/commands/ripple-commands.js +13 -13
- package/dist/domain/commands/ripple-commands.js.map +1 -1
- package/dist/domain/commands/snapshot.d.ts +3 -3
- package/dist/domain/commands/snapshot.js +5 -5
- package/dist/domain/commands/snapshot.js.map +1 -1
- package/dist/domain/commands/structure-commands.d.ts +86 -5
- package/dist/domain/commands/structure-commands.d.ts.map +1 -1
- package/dist/domain/commands/structure-commands.js +272 -36
- package/dist/domain/commands/structure-commands.js.map +1 -1
- package/dist/domain/commands/track-commands.d.ts +2 -2
- package/dist/domain/commands/track-commands.js +7 -7
- package/dist/domain/commands/track-commands.js.map +1 -1
- package/dist/domain/commands/types.d.ts +2 -2
- package/dist/domain/generation/replacement-region.d.ts +32 -0
- package/dist/domain/generation/replacement-region.d.ts.map +1 -0
- package/dist/domain/generation/replacement-region.js +79 -0
- package/dist/domain/generation/replacement-region.js.map +1 -0
- package/dist/domain/instruments/gm-icon.d.ts +12 -0
- package/dist/domain/instruments/gm-icon.d.ts.map +1 -0
- package/dist/domain/instruments/gm-icon.js +327 -0
- package/dist/domain/instruments/gm-icon.js.map +1 -0
- package/dist/domain/instruments/gm-kit.js +9 -9
- package/dist/domain/instruments/gm-kit.js.map +1 -1
- package/dist/domain/instruments/gm-percussion.js +48 -48
- package/dist/domain/instruments/gm-percussion.js.map +1 -1
- package/dist/domain/instruments/gm-polyphony.js +6 -6
- package/dist/domain/instruments/gm-range.js +6 -6
- package/dist/domain/instruments/gm-transposition.js +1 -1
- package/dist/domain/instruments/gm.d.ts +1 -1
- package/dist/domain/instruments/gm.js +161 -161
- package/dist/domain/instruments/gm.js.map +1 -1
- package/dist/domain/instruments/icon-art.d.ts +75 -0
- package/dist/domain/instruments/icon-art.d.ts.map +1 -0
- package/dist/domain/instruments/icon-art.js +93 -0
- package/dist/domain/instruments/icon-art.js.map +1 -0
- package/dist/domain/instruments/instrument-fit.d.ts +31 -0
- package/dist/domain/instruments/instrument-fit.d.ts.map +1 -0
- package/dist/domain/instruments/instrument-fit.js +117 -0
- package/dist/domain/instruments/instrument-fit.js.map +1 -0
- package/dist/domain/instruments/instrument-options.d.ts +62 -0
- package/dist/domain/instruments/instrument-options.d.ts.map +1 -0
- package/dist/domain/instruments/instrument-options.js +69 -0
- package/dist/domain/instruments/instrument-options.js.map +1 -0
- package/dist/domain/instruments/track-instrument.d.ts +80 -0
- package/dist/domain/instruments/track-instrument.d.ts.map +1 -0
- package/dist/domain/instruments/track-instrument.js +102 -0
- package/dist/domain/instruments/track-instrument.js.map +1 -0
- package/dist/domain/notation/chord-symbol.d.ts +26 -0
- package/dist/domain/notation/chord-symbol.d.ts.map +1 -0
- package/dist/domain/notation/chord-symbol.js +32 -0
- package/dist/domain/notation/chord-symbol.js.map +1 -0
- package/dist/domain/notation/lyric-syllables.d.ts +15 -0
- package/dist/domain/notation/lyric-syllables.d.ts.map +1 -0
- package/dist/domain/notation/lyric-syllables.js +15 -0
- package/dist/domain/notation/lyric-syllables.js.map +1 -0
- package/dist/domain/notation/music-vocabulary.d.ts +59 -0
- package/dist/domain/notation/music-vocabulary.d.ts.map +1 -0
- package/dist/domain/notation/music-vocabulary.js +164 -0
- package/dist/domain/notation/music-vocabulary.js.map +1 -0
- package/dist/domain/pitch/pitch.d.ts +1 -1
- package/dist/domain/pitch/pitch.js +29 -29
- package/dist/domain/pitch/transpose.d.ts +1 -1
- package/dist/domain/pitch/transpose.js +2 -2
- package/dist/domain/quantization/quantize.d.ts +2 -2
- package/dist/domain/quantization/quantize.js +9 -9
- package/dist/domain/quantization/quantize.js.map +1 -1
- package/dist/domain/score/articulation.d.ts +56 -0
- package/dist/domain/score/articulation.d.ts.map +1 -0
- package/dist/domain/score/articulation.js +56 -0
- package/dist/domain/score/articulation.js.map +1 -0
- package/dist/domain/score/bar-numbers.d.ts +38 -0
- package/dist/domain/score/bar-numbers.d.ts.map +1 -0
- package/dist/domain/score/bar-numbers.js +49 -0
- package/dist/domain/score/bar-numbers.js.map +1 -0
- package/dist/domain/score/collapse-rests.d.ts +23 -0
- package/dist/domain/score/collapse-rests.d.ts.map +1 -0
- package/dist/domain/score/collapse-rests.js +78 -0
- package/dist/domain/score/collapse-rests.js.map +1 -0
- package/dist/domain/score/cue-notes.d.ts +24 -0
- package/dist/domain/score/cue-notes.d.ts.map +1 -0
- package/dist/domain/score/cue-notes.js +105 -0
- package/dist/domain/score/cue-notes.js.map +1 -0
- package/dist/domain/score/dynamics.d.ts +62 -0
- package/dist/domain/score/dynamics.d.ts.map +1 -0
- package/dist/domain/score/dynamics.js +142 -0
- package/dist/domain/score/dynamics.js.map +1 -0
- package/dist/domain/score/effective-clef.d.ts +42 -0
- package/dist/domain/score/effective-clef.d.ts.map +1 -0
- package/dist/domain/score/effective-clef.js +39 -0
- package/dist/domain/score/effective-clef.js.map +1 -0
- package/dist/domain/score/extract-part.d.ts +10 -0
- package/dist/domain/score/extract-part.d.ts.map +1 -0
- package/dist/domain/score/extract-part.js +44 -0
- package/dist/domain/score/extract-part.js.map +1 -0
- package/dist/domain/score/factory.d.ts +1 -1
- package/dist/domain/score/factory.js +12 -12
- package/dist/domain/score/factory.js.map +1 -1
- package/dist/domain/score/fermata-tempo.d.ts +40 -0
- package/dist/domain/score/fermata-tempo.d.ts.map +1 -0
- package/dist/domain/score/fermata-tempo.js +95 -0
- package/dist/domain/score/fermata-tempo.js.map +1 -0
- package/dist/domain/score/flatten.d.ts +32 -0
- package/dist/domain/score/flatten.d.ts.map +1 -0
- package/dist/domain/score/flatten.js +132 -0
- package/dist/domain/score/flatten.js.map +1 -0
- package/dist/domain/score/fragment.d.ts +3 -3
- package/dist/domain/score/fragment.js +8 -8
- package/dist/domain/score/fragment.js.map +1 -1
- package/dist/domain/score/ids.d.ts +1 -1
- package/dist/domain/score/ids.js +6 -6
- package/dist/domain/score/ottava.d.ts +41 -0
- package/dist/domain/score/ottava.d.ts.map +1 -0
- package/dist/domain/score/ottava.js +98 -0
- package/dist/domain/score/ottava.js.map +1 -0
- package/dist/domain/score/performance-timeline.d.ts +42 -0
- package/dist/domain/score/performance-timeline.d.ts.map +1 -0
- package/dist/domain/score/performance-timeline.js +78 -0
- package/dist/domain/score/performance-timeline.js.map +1 -0
- package/dist/domain/score/queries.d.ts +2 -2
- package/dist/domain/score/queries.js +7 -7
- package/dist/domain/score/queries.js.map +1 -1
- package/dist/domain/score/rehearsal-marks.d.ts +30 -0
- package/dist/domain/score/rehearsal-marks.d.ts.map +1 -0
- package/dist/domain/score/rehearsal-marks.js +126 -0
- package/dist/domain/score/rehearsal-marks.js.map +1 -0
- package/dist/domain/score/repeat-order.d.ts +21 -0
- package/dist/domain/score/repeat-order.d.ts.map +1 -0
- package/dist/domain/score/repeat-order.js +123 -0
- package/dist/domain/score/repeat-order.js.map +1 -0
- package/dist/domain/score/snapshot-tree.d.ts +23 -0
- package/dist/domain/score/snapshot-tree.d.ts.map +1 -0
- package/dist/domain/score/snapshot-tree.js +45 -0
- package/dist/domain/score/snapshot-tree.js.map +1 -0
- package/dist/domain/score/ties.d.ts +1 -1
- package/dist/domain/score/ties.js +7 -7
- package/dist/domain/score/ties.js.map +1 -1
- package/dist/domain/score/written-pitch.d.ts +33 -0
- package/dist/domain/score/written-pitch.d.ts.map +1 -0
- package/dist/domain/score/written-pitch.js +110 -0
- package/dist/domain/score/written-pitch.js.map +1 -0
- package/dist/domain/selection/range-select.d.ts +13 -0
- package/dist/domain/selection/range-select.d.ts.map +1 -0
- package/dist/domain/selection/range-select.js +40 -0
- package/dist/domain/selection/range-select.js.map +1 -0
- package/dist/domain/selection/selection-editing.d.ts +30 -0
- package/dist/domain/selection/selection-editing.d.ts.map +1 -0
- package/dist/domain/selection/selection-editing.js +31 -0
- package/dist/domain/selection/selection-editing.js.map +1 -0
- package/dist/domain/selection/selection.d.ts +2 -2
- package/dist/domain/selection/selection.js +7 -7
- package/dist/domain/selection/selection.js.map +1 -1
- package/dist/domain/selection/types.d.ts +2 -2
- package/dist/domain/time/duration-modifiers.d.ts +40 -0
- package/dist/domain/time/duration-modifiers.d.ts.map +1 -0
- package/dist/domain/time/duration-modifiers.js +50 -0
- package/dist/domain/time/duration-modifiers.js.map +1 -0
- package/dist/domain/time/duration-selection.d.ts +23 -0
- package/dist/domain/time/duration-selection.d.ts.map +1 -0
- package/dist/domain/time/duration-selection.js +50 -0
- package/dist/domain/time/duration-selection.js.map +1 -0
- package/dist/domain/time/durations.js +6 -6
- package/dist/domain/time/durations.js.map +1 -1
- package/dist/domain/time/fraction.d.ts +1 -1
- package/dist/domain/time/fraction.js +1 -1
- package/dist/domain/time/tap-to-note.d.ts +21 -0
- package/dist/domain/time/tap-to-note.d.ts.map +1 -0
- package/dist/domain/time/tap-to-note.js +43 -0
- package/dist/domain/time/tap-to-note.js.map +1 -0
- package/dist/domain/time/tempo-map.d.ts +1 -1
- package/dist/domain/time/ticks.d.ts +1 -1
- package/dist/domain/time/ticks.d.ts.map +1 -1
- package/dist/domain/time/ticks.js +14 -14
- package/dist/domain/time/ticks.js.map +1 -1
- package/dist/domain/time/tuplets.d.ts +42 -0
- package/dist/domain/time/tuplets.d.ts.map +1 -0
- package/dist/domain/time/tuplets.js +53 -0
- package/dist/domain/time/tuplets.js.map +1 -0
- package/dist/domain/validation/issues.d.ts +1 -1
- package/dist/domain/validation/issues.js +20 -20
- package/dist/domain/validation/validator.d.ts +2 -2
- package/dist/domain/validation/validator.d.ts.map +1 -1
- package/dist/domain/validation/validator.js +31 -31
- package/dist/domain/validation/validator.js.map +1 -1
- package/dist/domain/voicing/allocate.d.ts +2 -2
- package/dist/domain/voicing/allocate.js +6 -6
- package/dist/domain/voicing/allocate.js.map +1 -1
- package/dist/index.d.ts +90 -59
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +151 -83
- package/dist/index.js.map +1 -1
- package/dist/platform/audio.d.ts.map +1 -1
- package/dist/platform/file.d.ts.map +1 -1
- package/dist/platform/index.d.ts +7 -7
- package/dist/platform/index.js +7 -7
- package/dist/platform/midi-input.d.ts +2 -2
- package/dist/platform/midi.d.ts.map +1 -1
- package/dist/platform/mod.d.ts +2 -2
- package/dist/platform/playback.d.ts +7 -7
- package/dist/platform/xml.js +1 -1
- package/dist/services/regeneration/controller.d.ts +6 -6
- package/dist/services/regeneration/controller.js +12 -12
- package/dist/services/regeneration/controller.js.map +1 -1
- package/dist/test/fixtures.d.ts +1 -1
- package/dist/test/fixtures.js +103 -103
- package/dist/test/fixtures.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* selection to full measures), and turns an accepted candidate back into a
|
|
6
6
|
* single undoable `ScoreCommand`.
|
|
7
7
|
*/
|
|
8
|
-
import { findTrack } from
|
|
9
|
-
import { selectionToRange } from
|
|
10
|
-
import { extractFragment } from
|
|
11
|
-
import { replaceRegionCommand } from
|
|
8
|
+
import { findTrack } from "../../domain/score/queries.js";
|
|
9
|
+
import { selectionToRange } from "../../domain/selection/selection.js";
|
|
10
|
+
import { extractFragment } from "../../domain/score/fragment.js";
|
|
11
|
+
import { replaceRegionCommand } from "../../domain/commands/region-commands.js";
|
|
12
12
|
/**
|
|
13
13
|
* One, always. Generation is a background job now: nobody is present to pick
|
|
14
14
|
* between alternatives when it lands, so a result that needed choosing would
|
|
@@ -51,7 +51,7 @@ function findEventTicks(score, eventId) {
|
|
|
51
51
|
for (const track of score.tracks) {
|
|
52
52
|
for (const measure of track.measures) {
|
|
53
53
|
for (const voice of measure.voices) {
|
|
54
|
-
const event = voice.events.find(e => e.id === eventId);
|
|
54
|
+
const event = voice.events.find((e) => e.id === eventId);
|
|
55
55
|
if (event)
|
|
56
56
|
return {
|
|
57
57
|
start: event.startTick,
|
|
@@ -64,7 +64,7 @@ function findEventTicks(score, eventId) {
|
|
|
64
64
|
}
|
|
65
65
|
function findMeasureTicks(score, measureId) {
|
|
66
66
|
for (const track of score.tracks) {
|
|
67
|
-
const measure = track.measures.find(m => m.id === measureId);
|
|
67
|
+
const measure = track.measures.find((m) => m.id === measureId);
|
|
68
68
|
if (measure)
|
|
69
69
|
return {
|
|
70
70
|
start: measure.startTick,
|
|
@@ -75,14 +75,14 @@ function findMeasureTicks(score, measureId) {
|
|
|
75
75
|
}
|
|
76
76
|
/** Up to `maxMeasures` measures immediately preceding `range.startTick`, unioned across `range`'s tracks (all tracks if `range.trackIds` is empty). */
|
|
77
77
|
function precedingContextRange(score, range, maxMeasures) {
|
|
78
|
-
const trackIds = range.trackIds.length > 0 ? range.trackIds : score.tracks.map(t => t.id);
|
|
78
|
+
const trackIds = range.trackIds.length > 0 ? range.trackIds : score.tracks.map((t) => t.id);
|
|
79
79
|
let earliestStart = range.startTick;
|
|
80
80
|
for (const trackId of trackIds) {
|
|
81
81
|
const track = findTrack(score, trackId);
|
|
82
82
|
if (!track)
|
|
83
83
|
continue;
|
|
84
84
|
const priorMeasures = track.measures
|
|
85
|
-
.filter(m => m.startTick < range.startTick)
|
|
85
|
+
.filter((m) => m.startTick < range.startTick)
|
|
86
86
|
.slice(-maxMeasures);
|
|
87
87
|
if (priorMeasures.length > 0) {
|
|
88
88
|
earliestStart = Math.min(earliestStart, priorMeasures[0].startTick);
|
|
@@ -96,14 +96,14 @@ function precedingContextRange(score, range, maxMeasures) {
|
|
|
96
96
|
}
|
|
97
97
|
/** Up to `maxMeasures` measures immediately following `range.endTick`, unioned across `range`'s tracks (all tracks if `range.trackIds` is empty). */
|
|
98
98
|
function followingContextRange(score, range, maxMeasures) {
|
|
99
|
-
const trackIds = range.trackIds.length > 0 ? range.trackIds : score.tracks.map(t => t.id);
|
|
99
|
+
const trackIds = range.trackIds.length > 0 ? range.trackIds : score.tracks.map((t) => t.id);
|
|
100
100
|
let latestEnd = range.endTick;
|
|
101
101
|
for (const trackId of trackIds) {
|
|
102
102
|
const track = findTrack(score, trackId);
|
|
103
103
|
if (!track)
|
|
104
104
|
continue;
|
|
105
105
|
const nextMeasures = track.measures
|
|
106
|
-
.filter(m => m.startTick >= range.endTick)
|
|
106
|
+
.filter((m) => m.startTick >= range.endTick)
|
|
107
107
|
.slice(0, maxMeasures);
|
|
108
108
|
if (nextMeasures.length > 0) {
|
|
109
109
|
const last = nextMeasures[nextMeasures.length - 1];
|
|
@@ -128,7 +128,7 @@ function followingContextRange(score, range, maxMeasures) {
|
|
|
128
128
|
export function prepareRegenerationRequest(score, selection, instruction, options = {}) {
|
|
129
129
|
const alignedRange = selectionToRange(score, selection);
|
|
130
130
|
if (!alignedRange) {
|
|
131
|
-
throw new Error(
|
|
131
|
+
throw new Error("prepareRegenerationRequest: selection has no resolvable tick range.");
|
|
132
132
|
}
|
|
133
133
|
const raw = rawTickExtent(score, selection);
|
|
134
134
|
const expandedToFullMeasures = raw !== null &&
|
|
@@ -193,7 +193,7 @@ export function prepareRegenerationRequestForRange(score, range, instruction, op
|
|
|
193
193
|
*/
|
|
194
194
|
export function applyCandidate(score, candidate) {
|
|
195
195
|
const { range } = candidate.fragment;
|
|
196
|
-
const missingTrackId = range.trackIds.find(id => findTrack(score, id) === null);
|
|
196
|
+
const missingTrackId = range.trackIds.find((id) => findTrack(score, id) === null);
|
|
197
197
|
if (missingTrackId) {
|
|
198
198
|
throw new Error(`applyCandidate: candidate references track "${missingTrackId}", which is not present in the score.`);
|
|
199
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/services/regeneration/controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAKvE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAQhF;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAiChC;;;;;GAKG;AACH,SAAS,aAAa,CACpB,KAAY,EACZ,GAAmB;IAEnB,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAEpB,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CACrB,KAAY,EACZ,OAAe;IAEf,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/services/regeneration/controller.ts"],"names":[],"mappings":"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"}
|
package/dist/test/fixtures.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* every call with the same arguments produces a structurally identical
|
|
13
13
|
* `Score`.
|
|
14
14
|
*/
|
|
15
|
-
import type { Score } from
|
|
15
|
+
import type { Score } from "../index.js";
|
|
16
16
|
/** An 8-measure C-major "Twinkle Twinkle Little Star" melody on a single piano track. */
|
|
17
17
|
export declare function twinkleScore(): Score;
|
|
18
18
|
/** A 4-measure two-track score: a treble melody and a supporting bass line. */
|
package/dist/test/fixtures.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* `testRenderTheme` — that one needs a `RenderTheme`, and nothing in this
|
|
6
6
|
* package renders anything.
|
|
7
7
|
*/
|
|
8
|
-
import { measureDurationTicks, ticksFor } from
|
|
9
|
-
const FIXED_TIMESTAMP =
|
|
8
|
+
import { measureDurationTicks, ticksFor } from "../index.js";
|
|
9
|
+
const FIXED_TIMESTAMP = "2024-01-01T00:00:00.000Z";
|
|
10
10
|
/** A per-call, per-prefix incrementing id generator (deterministic, cheap). */
|
|
11
11
|
function makeIdFactory() {
|
|
12
12
|
const counters = new Map();
|
|
@@ -23,12 +23,12 @@ function buildMelodyMeasures(measuresOfNotes, ppq, timeSignature, keySignature,
|
|
|
23
23
|
const measureTicks = measureDurationTicks(timeSignature, ppq);
|
|
24
24
|
return measuresOfNotes.map((notes, index) => {
|
|
25
25
|
const startTick = index * measureTicks;
|
|
26
|
-
const voiceId = ids.next(
|
|
26
|
+
const voiceId = ids.next("voice");
|
|
27
27
|
let cursor = startTick;
|
|
28
|
-
const events = notes.map(spec => {
|
|
28
|
+
const events = notes.map((spec) => {
|
|
29
29
|
const durationTicks = ticksFor(spec.duration, ppq);
|
|
30
30
|
const event = {
|
|
31
|
-
id: ids.next(
|
|
31
|
+
id: ids.next("note"),
|
|
32
32
|
pitch: spec.pitch,
|
|
33
33
|
startTick: cursor,
|
|
34
34
|
durationTicks,
|
|
@@ -40,13 +40,13 @@ function buildMelodyMeasures(measuresOfNotes, ppq, timeSignature, keySignature,
|
|
|
40
40
|
return event;
|
|
41
41
|
});
|
|
42
42
|
return {
|
|
43
|
-
id: ids.next(
|
|
43
|
+
id: ids.next("measure"),
|
|
44
44
|
index,
|
|
45
45
|
startTick,
|
|
46
46
|
durationTicks: measureTicks,
|
|
47
47
|
timeSignature,
|
|
48
48
|
keySignature,
|
|
49
|
-
voices: [{ id: voiceId, name:
|
|
49
|
+
voices: [{ id: voiceId, name: "Voice 1", events }],
|
|
50
50
|
};
|
|
51
51
|
});
|
|
52
52
|
}
|
|
@@ -55,9 +55,9 @@ function buildChordMeasures(chordsByMeasure, ppq, timeSignature, keySignature, t
|
|
|
55
55
|
const measureTicks = measureDurationTicks(timeSignature, ppq);
|
|
56
56
|
return chordsByMeasure.map((pitches, index) => {
|
|
57
57
|
const startTick = index * measureTicks;
|
|
58
|
-
const voiceId = ids.next(
|
|
59
|
-
const events = pitches.map(pitch => ({
|
|
60
|
-
id: ids.next(
|
|
58
|
+
const voiceId = ids.next("voice");
|
|
59
|
+
const events = pitches.map((pitch) => ({
|
|
60
|
+
id: ids.next("note"),
|
|
61
61
|
pitch,
|
|
62
62
|
startTick,
|
|
63
63
|
durationTicks: measureTicks,
|
|
@@ -66,17 +66,17 @@ function buildChordMeasures(chordsByMeasure, ppq, timeSignature, keySignature, t
|
|
|
66
66
|
trackId,
|
|
67
67
|
}));
|
|
68
68
|
return {
|
|
69
|
-
id: ids.next(
|
|
69
|
+
id: ids.next("measure"),
|
|
70
70
|
index,
|
|
71
71
|
startTick,
|
|
72
72
|
durationTicks: measureTicks,
|
|
73
73
|
timeSignature,
|
|
74
74
|
keySignature,
|
|
75
|
-
voices: [{ id: voiceId, name:
|
|
75
|
+
voices: [{ id: voiceId, name: "Voice 1", events }],
|
|
76
76
|
};
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
|
-
const C_MAJOR = { fifths: 0, mode:
|
|
79
|
+
const C_MAJOR = { fifths: 0, mode: "major" };
|
|
80
80
|
const FOUR_FOUR = { numerator: 4, denominator: 4 };
|
|
81
81
|
function naturalPitch(step, octave) {
|
|
82
82
|
return { step, accidental: 0, octave };
|
|
@@ -87,30 +87,30 @@ export function twinkleScore() {
|
|
|
87
87
|
const ppq = 480;
|
|
88
88
|
const q = (step, octave = 4) => ({
|
|
89
89
|
pitch: naturalPitch(step, octave),
|
|
90
|
-
duration:
|
|
90
|
+
duration: "quarter",
|
|
91
91
|
});
|
|
92
92
|
const h = (step, octave = 4) => ({
|
|
93
93
|
pitch: naturalPitch(step, octave),
|
|
94
|
-
duration:
|
|
94
|
+
duration: "half",
|
|
95
95
|
});
|
|
96
96
|
const measures = [
|
|
97
|
-
[q(
|
|
98
|
-
[q(
|
|
99
|
-
[q(
|
|
100
|
-
[q(
|
|
101
|
-
[q(
|
|
102
|
-
[q(
|
|
103
|
-
[q(
|
|
104
|
-
[q(
|
|
97
|
+
[q("C"), q("C"), q("G"), q("G")],
|
|
98
|
+
[q("A"), q("A"), h("G")],
|
|
99
|
+
[q("F"), q("F"), q("E"), q("E")],
|
|
100
|
+
[q("D"), q("D"), h("C")],
|
|
101
|
+
[q("G"), q("G"), q("F"), q("F")],
|
|
102
|
+
[q("E"), q("E"), h("D")],
|
|
103
|
+
[q("G"), q("G"), q("F"), q("F")],
|
|
104
|
+
[q("E"), q("E"), h("D")],
|
|
105
105
|
];
|
|
106
|
-
const trackId = ids.next(
|
|
106
|
+
const trackId = ids.next("track");
|
|
107
107
|
const track = {
|
|
108
108
|
id: trackId,
|
|
109
|
-
name:
|
|
110
|
-
instrumentName:
|
|
109
|
+
name: "Piano",
|
|
110
|
+
instrumentName: "Piano",
|
|
111
111
|
midiProgram: 0,
|
|
112
112
|
midiChannel: 0,
|
|
113
|
-
clef:
|
|
113
|
+
clef: "treble",
|
|
114
114
|
volume: 1,
|
|
115
115
|
pan: 0,
|
|
116
116
|
muted: false,
|
|
@@ -118,15 +118,15 @@ export function twinkleScore() {
|
|
|
118
118
|
measures: buildMelodyMeasures(measures, ppq, FOUR_FOUR, C_MAJOR, trackId, ids),
|
|
119
119
|
};
|
|
120
120
|
return {
|
|
121
|
-
id: ids.next(
|
|
121
|
+
id: ids.next("score"),
|
|
122
122
|
version: 1,
|
|
123
123
|
ppq,
|
|
124
124
|
metadata: {
|
|
125
|
-
title:
|
|
125
|
+
title: "Twinkle Twinkle Little Star",
|
|
126
126
|
createdAt: FIXED_TIMESTAMP,
|
|
127
127
|
updatedAt: FIXED_TIMESTAMP,
|
|
128
128
|
},
|
|
129
|
-
tempoMap: [{ id: ids.next(
|
|
129
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 120 }],
|
|
130
130
|
tracks: [track],
|
|
131
131
|
};
|
|
132
132
|
}
|
|
@@ -136,33 +136,33 @@ export function twoTrackScore() {
|
|
|
136
136
|
const ppq = 480;
|
|
137
137
|
const q = (step, octave) => ({
|
|
138
138
|
pitch: naturalPitch(step, octave),
|
|
139
|
-
duration:
|
|
139
|
+
duration: "quarter",
|
|
140
140
|
});
|
|
141
141
|
const w = (step, octave) => ({
|
|
142
142
|
pitch: naturalPitch(step, octave),
|
|
143
|
-
duration:
|
|
143
|
+
duration: "whole",
|
|
144
144
|
});
|
|
145
145
|
const trebleMeasures = [
|
|
146
|
-
[q(
|
|
147
|
-
[q(
|
|
148
|
-
[q(
|
|
149
|
-
[q(
|
|
146
|
+
[q("C", 4), q("D", 4), q("E", 4), q("F", 4)],
|
|
147
|
+
[q("G", 4), q("F", 4), q("E", 4), q("D", 4)],
|
|
148
|
+
[q("C", 4), q("D", 4), q("E", 4), q("F", 4)],
|
|
149
|
+
[q("G", 4), q("F", 4), q("E", 4), q("D", 4)],
|
|
150
150
|
];
|
|
151
151
|
const bassMeasures = [
|
|
152
|
-
[w(
|
|
153
|
-
[w(
|
|
154
|
-
[w(
|
|
155
|
-
[w(
|
|
152
|
+
[w("C", 2)],
|
|
153
|
+
[w("G", 2)],
|
|
154
|
+
[w("C", 2)],
|
|
155
|
+
[w("G", 2)],
|
|
156
156
|
];
|
|
157
|
-
const trebleId = ids.next(
|
|
158
|
-
const bassId = ids.next(
|
|
157
|
+
const trebleId = ids.next("track");
|
|
158
|
+
const bassId = ids.next("track");
|
|
159
159
|
const treble = {
|
|
160
160
|
id: trebleId,
|
|
161
|
-
name:
|
|
162
|
-
instrumentName:
|
|
161
|
+
name: "Treble",
|
|
162
|
+
instrumentName: "Piano",
|
|
163
163
|
midiProgram: 0,
|
|
164
164
|
midiChannel: 0,
|
|
165
|
-
clef:
|
|
165
|
+
clef: "treble",
|
|
166
166
|
volume: 1,
|
|
167
167
|
pan: 0,
|
|
168
168
|
muted: false,
|
|
@@ -171,11 +171,11 @@ export function twoTrackScore() {
|
|
|
171
171
|
};
|
|
172
172
|
const bass = {
|
|
173
173
|
id: bassId,
|
|
174
|
-
name:
|
|
175
|
-
instrumentName:
|
|
174
|
+
name: "Bass",
|
|
175
|
+
instrumentName: "Acoustic Bass",
|
|
176
176
|
midiProgram: 32,
|
|
177
177
|
midiChannel: 1,
|
|
178
|
-
clef:
|
|
178
|
+
clef: "bass",
|
|
179
179
|
volume: 1,
|
|
180
180
|
pan: 0,
|
|
181
181
|
muted: false,
|
|
@@ -183,15 +183,15 @@ export function twoTrackScore() {
|
|
|
183
183
|
measures: buildMelodyMeasures(bassMeasures, ppq, FOUR_FOUR, C_MAJOR, bassId, ids),
|
|
184
184
|
};
|
|
185
185
|
return {
|
|
186
|
-
id: ids.next(
|
|
186
|
+
id: ids.next("score"),
|
|
187
187
|
version: 1,
|
|
188
188
|
ppq,
|
|
189
189
|
metadata: {
|
|
190
|
-
title:
|
|
190
|
+
title: "Two Track Demo",
|
|
191
191
|
createdAt: FIXED_TIMESTAMP,
|
|
192
192
|
updatedAt: FIXED_TIMESTAMP,
|
|
193
193
|
},
|
|
194
|
-
tempoMap: [{ id: ids.next(
|
|
194
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 120 }],
|
|
195
195
|
tracks: [treble, bass],
|
|
196
196
|
};
|
|
197
197
|
}
|
|
@@ -208,21 +208,21 @@ export function threeTrackScore() {
|
|
|
208
208
|
const ppq = 480;
|
|
209
209
|
const q = (step, octave) => ({
|
|
210
210
|
pitch: naturalPitch(step, octave),
|
|
211
|
-
duration:
|
|
211
|
+
duration: "quarter",
|
|
212
212
|
});
|
|
213
213
|
const measures = [
|
|
214
|
-
[q(
|
|
215
|
-
[q(
|
|
214
|
+
[q("C", 4), q("D", 4), q("E", 4), q("F", 4)],
|
|
215
|
+
[q("G", 4), q("F", 4), q("E", 4), q("D", 4)],
|
|
216
216
|
];
|
|
217
|
-
const tracks = [
|
|
218
|
-
const trackId = ids.next(
|
|
217
|
+
const tracks = ["Alpha", "Beta", "Gamma"].map((name, index) => {
|
|
218
|
+
const trackId = ids.next("track");
|
|
219
219
|
return {
|
|
220
220
|
id: trackId,
|
|
221
221
|
name,
|
|
222
|
-
instrumentName:
|
|
222
|
+
instrumentName: "Piano",
|
|
223
223
|
midiProgram: 0,
|
|
224
224
|
midiChannel: index,
|
|
225
|
-
clef:
|
|
225
|
+
clef: "treble",
|
|
226
226
|
volume: 1,
|
|
227
227
|
pan: 0,
|
|
228
228
|
muted: false,
|
|
@@ -231,15 +231,15 @@ export function threeTrackScore() {
|
|
|
231
231
|
};
|
|
232
232
|
});
|
|
233
233
|
return {
|
|
234
|
-
id: ids.next(
|
|
234
|
+
id: ids.next("score"),
|
|
235
235
|
version: 1,
|
|
236
236
|
ppq,
|
|
237
237
|
metadata: {
|
|
238
|
-
title:
|
|
238
|
+
title: "Three Track Demo",
|
|
239
239
|
createdAt: FIXED_TIMESTAMP,
|
|
240
240
|
updatedAt: FIXED_TIMESTAMP,
|
|
241
241
|
},
|
|
242
|
-
tempoMap: [{ id: ids.next(
|
|
242
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 120 }],
|
|
243
243
|
tracks,
|
|
244
244
|
};
|
|
245
245
|
}
|
|
@@ -255,31 +255,31 @@ export function denseVsSparseScore() {
|
|
|
255
255
|
const ppq = 480;
|
|
256
256
|
const s = (step, octave) => ({
|
|
257
257
|
pitch: naturalPitch(step, octave),
|
|
258
|
-
duration:
|
|
258
|
+
duration: "sixteenth",
|
|
259
259
|
});
|
|
260
260
|
const w = (step, octave) => ({
|
|
261
261
|
pitch: naturalPitch(step, octave),
|
|
262
|
-
duration:
|
|
262
|
+
duration: "whole",
|
|
263
263
|
});
|
|
264
|
-
const runUp = [
|
|
265
|
-
.flatMap(step => [s(step, 4), s(step, 4)])
|
|
266
|
-
.concat([s(
|
|
264
|
+
const runUp = ["C", "D", "E", "F", "G", "A", "B"]
|
|
265
|
+
.flatMap((step) => [s(step, 4), s(step, 4)])
|
|
266
|
+
.concat([s("C", 5), s("C", 5)]);
|
|
267
267
|
const denseMeasures = [runUp, runUp, runUp, runUp];
|
|
268
268
|
const sparseMeasures = [
|
|
269
|
-
[w(
|
|
270
|
-
[w(
|
|
271
|
-
[w(
|
|
272
|
-
[w(
|
|
269
|
+
[w("C", 2)],
|
|
270
|
+
[w("G", 2)],
|
|
271
|
+
[w("C", 2)],
|
|
272
|
+
[w("G", 2)],
|
|
273
273
|
];
|
|
274
|
-
const denseId = ids.next(
|
|
275
|
-
const sparseId = ids.next(
|
|
274
|
+
const denseId = ids.next("track");
|
|
275
|
+
const sparseId = ids.next("track");
|
|
276
276
|
const dense = {
|
|
277
277
|
id: denseId,
|
|
278
|
-
name:
|
|
279
|
-
instrumentName:
|
|
278
|
+
name: "Dense",
|
|
279
|
+
instrumentName: "Piano",
|
|
280
280
|
midiProgram: 0,
|
|
281
281
|
midiChannel: 0,
|
|
282
|
-
clef:
|
|
282
|
+
clef: "treble",
|
|
283
283
|
volume: 1,
|
|
284
284
|
pan: 0,
|
|
285
285
|
muted: false,
|
|
@@ -288,11 +288,11 @@ export function denseVsSparseScore() {
|
|
|
288
288
|
};
|
|
289
289
|
const sparse = {
|
|
290
290
|
id: sparseId,
|
|
291
|
-
name:
|
|
292
|
-
instrumentName:
|
|
291
|
+
name: "Sparse",
|
|
292
|
+
instrumentName: "Acoustic Bass",
|
|
293
293
|
midiProgram: 32,
|
|
294
294
|
midiChannel: 1,
|
|
295
|
-
clef:
|
|
295
|
+
clef: "bass",
|
|
296
296
|
volume: 1,
|
|
297
297
|
pan: 0,
|
|
298
298
|
muted: false,
|
|
@@ -300,15 +300,15 @@ export function denseVsSparseScore() {
|
|
|
300
300
|
measures: buildMelodyMeasures(sparseMeasures, ppq, FOUR_FOUR, C_MAJOR, sparseId, ids),
|
|
301
301
|
};
|
|
302
302
|
return {
|
|
303
|
-
id: ids.next(
|
|
303
|
+
id: ids.next("score"),
|
|
304
304
|
version: 1,
|
|
305
305
|
ppq,
|
|
306
306
|
metadata: {
|
|
307
|
-
title:
|
|
307
|
+
title: "Dense vs Sparse",
|
|
308
308
|
createdAt: FIXED_TIMESTAMP,
|
|
309
309
|
updatedAt: FIXED_TIMESTAMP,
|
|
310
310
|
},
|
|
311
|
-
tempoMap: [{ id: ids.next(
|
|
311
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 120 }],
|
|
312
312
|
tracks: [dense, sparse],
|
|
313
313
|
};
|
|
314
314
|
}
|
|
@@ -317,19 +317,19 @@ export function chordScore() {
|
|
|
317
317
|
const ids = makeIdFactory();
|
|
318
318
|
const ppq = 480;
|
|
319
319
|
const chords = [
|
|
320
|
-
[naturalPitch(
|
|
321
|
-
[naturalPitch(
|
|
322
|
-
[naturalPitch(
|
|
323
|
-
[naturalPitch(
|
|
320
|
+
[naturalPitch("C", 4), naturalPitch("E", 4), naturalPitch("G", 4)], // I
|
|
321
|
+
[naturalPitch("F", 4), naturalPitch("A", 4), naturalPitch("C", 5)], // IV
|
|
322
|
+
[naturalPitch("G", 4), naturalPitch("B", 4), naturalPitch("D", 5)], // V
|
|
323
|
+
[naturalPitch("C", 4), naturalPitch("E", 4), naturalPitch("G", 4)], // I
|
|
324
324
|
];
|
|
325
|
-
const trackId = ids.next(
|
|
325
|
+
const trackId = ids.next("track");
|
|
326
326
|
const track = {
|
|
327
327
|
id: trackId,
|
|
328
|
-
name:
|
|
329
|
-
instrumentName:
|
|
328
|
+
name: "Piano",
|
|
329
|
+
instrumentName: "Piano",
|
|
330
330
|
midiProgram: 0,
|
|
331
331
|
midiChannel: 0,
|
|
332
|
-
clef:
|
|
332
|
+
clef: "treble",
|
|
333
333
|
volume: 1,
|
|
334
334
|
pan: 0,
|
|
335
335
|
muted: false,
|
|
@@ -337,19 +337,19 @@ export function chordScore() {
|
|
|
337
337
|
measures: buildChordMeasures(chords, ppq, FOUR_FOUR, C_MAJOR, trackId, ids),
|
|
338
338
|
};
|
|
339
339
|
return {
|
|
340
|
-
id: ids.next(
|
|
340
|
+
id: ids.next("score"),
|
|
341
341
|
version: 1,
|
|
342
342
|
ppq,
|
|
343
343
|
metadata: {
|
|
344
|
-
title:
|
|
344
|
+
title: "Chord Progression Demo",
|
|
345
345
|
createdAt: FIXED_TIMESTAMP,
|
|
346
346
|
updatedAt: FIXED_TIMESTAMP,
|
|
347
347
|
},
|
|
348
|
-
tempoMap: [{ id: ids.next(
|
|
348
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 90 }],
|
|
349
349
|
tracks: [track],
|
|
350
350
|
};
|
|
351
351
|
}
|
|
352
|
-
const STRESS_SCALE = [
|
|
352
|
+
const STRESS_SCALE = ["C", "D", "E", "F", "G", "A", "B"];
|
|
353
353
|
/**
|
|
354
354
|
* Generates a score with `trackCount` tracks of `measureCount` measures
|
|
355
355
|
* each (4 quarter notes per measure, cycling through a C-major scale), for
|
|
@@ -359,19 +359,19 @@ export function stressScore(trackCount, measureCount) {
|
|
|
359
359
|
const ids = makeIdFactory();
|
|
360
360
|
const ppq = 480;
|
|
361
361
|
const measureTicks = measureDurationTicks(FOUR_FOUR, ppq);
|
|
362
|
-
const quarterTicks = ticksFor(
|
|
362
|
+
const quarterTicks = ticksFor("quarter", ppq);
|
|
363
363
|
const tracks = [];
|
|
364
364
|
for (let t = 0; t < trackCount; t += 1) {
|
|
365
|
-
const trackId = ids.next(
|
|
365
|
+
const trackId = ids.next("track");
|
|
366
366
|
const measures = [];
|
|
367
367
|
for (let m = 0; m < measureCount; m += 1) {
|
|
368
368
|
const startTick = m * measureTicks;
|
|
369
|
-
const voiceId = ids.next(
|
|
369
|
+
const voiceId = ids.next("voice");
|
|
370
370
|
const events = [];
|
|
371
371
|
for (let beat = 0; beat < 4; beat += 1) {
|
|
372
372
|
const step = STRESS_SCALE[(t + m + beat) % STRESS_SCALE.length];
|
|
373
373
|
events.push({
|
|
374
|
-
id: ids.next(
|
|
374
|
+
id: ids.next("note"),
|
|
375
375
|
pitch: naturalPitch(step, 4),
|
|
376
376
|
startTick: startTick + beat * quarterTicks,
|
|
377
377
|
durationTicks: quarterTicks,
|
|
@@ -381,22 +381,22 @@ export function stressScore(trackCount, measureCount) {
|
|
|
381
381
|
});
|
|
382
382
|
}
|
|
383
383
|
measures.push({
|
|
384
|
-
id: ids.next(
|
|
384
|
+
id: ids.next("measure"),
|
|
385
385
|
index: m,
|
|
386
386
|
startTick,
|
|
387
387
|
durationTicks: measureTicks,
|
|
388
388
|
timeSignature: FOUR_FOUR,
|
|
389
389
|
keySignature: C_MAJOR,
|
|
390
|
-
voices: [{ id: voiceId, name:
|
|
390
|
+
voices: [{ id: voiceId, name: "Voice 1", events }],
|
|
391
391
|
});
|
|
392
392
|
}
|
|
393
393
|
tracks.push({
|
|
394
394
|
id: trackId,
|
|
395
395
|
name: `Track ${t + 1}`,
|
|
396
|
-
instrumentName:
|
|
396
|
+
instrumentName: "Piano",
|
|
397
397
|
midiProgram: 0,
|
|
398
398
|
midiChannel: t % 16,
|
|
399
|
-
clef:
|
|
399
|
+
clef: "treble",
|
|
400
400
|
volume: 1,
|
|
401
401
|
pan: 0,
|
|
402
402
|
muted: false,
|
|
@@ -405,7 +405,7 @@ export function stressScore(trackCount, measureCount) {
|
|
|
405
405
|
});
|
|
406
406
|
}
|
|
407
407
|
return {
|
|
408
|
-
id: ids.next(
|
|
408
|
+
id: ids.next("score"),
|
|
409
409
|
version: 1,
|
|
410
410
|
ppq,
|
|
411
411
|
metadata: {
|
|
@@ -413,7 +413,7 @@ export function stressScore(trackCount, measureCount) {
|
|
|
413
413
|
createdAt: FIXED_TIMESTAMP,
|
|
414
414
|
updatedAt: FIXED_TIMESTAMP,
|
|
415
415
|
},
|
|
416
|
-
tempoMap: [{ id: ids.next(
|
|
416
|
+
tempoMap: [{ id: ids.next("tempo"), tick: 0, bpm: 120 }],
|
|
417
417
|
tracks,
|
|
418
418
|
};
|
|
419
419
|
}
|