Update test data structure to use groupPatterns for project definition and track mapping
This commit is contained in:
@@ -9,6 +9,7 @@ import {
|
|||||||
FaderParam,
|
FaderParam,
|
||||||
Group,
|
Group,
|
||||||
GroupFaderParam,
|
GroupFaderParam,
|
||||||
|
GroupPattern,
|
||||||
MidiPatternEvent,
|
MidiPatternEvent,
|
||||||
Note,
|
Note,
|
||||||
Pad,
|
Pad,
|
||||||
@@ -64,6 +65,30 @@ function note(noteValue: number, position: number, velocity = 100): Note {
|
|||||||
|
|
||||||
function project(): ProjectRawData {
|
function project(): ProjectRawData {
|
||||||
const params = faderParams();
|
const params = faderParams();
|
||||||
|
const groupPatterns: GroupPattern[] = [
|
||||||
|
{
|
||||||
|
group: 'a',
|
||||||
|
patternNumber: 1,
|
||||||
|
bars: 1,
|
||||||
|
recordCount: 0,
|
||||||
|
events: [],
|
||||||
|
notes: {
|
||||||
|
0: [note(72, 0, 110)],
|
||||||
|
1: [note(60, 0), note(64, 96)],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
group: 'a',
|
||||||
|
patternNumber: 2,
|
||||||
|
bars: 1,
|
||||||
|
recordCount: 0,
|
||||||
|
events: [],
|
||||||
|
notes: {
|
||||||
|
0: [note(72, 24, 90)],
|
||||||
|
1: [note(67, 48)],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
return {
|
return {
|
||||||
pads: {
|
pads: {
|
||||||
a: [
|
a: [
|
||||||
@@ -77,10 +102,13 @@ function project(): ProjectRawData {
|
|||||||
},
|
},
|
||||||
scenes: [
|
scenes: [
|
||||||
{
|
{
|
||||||
|
number: 1,
|
||||||
name: '01',
|
name: '01',
|
||||||
|
patternNumbers: { a: 1, b: 0, c: 0, d: 0 },
|
||||||
|
timeSignature: { numerator: 4, denominator: 4 },
|
||||||
patterns: [
|
patterns: [
|
||||||
{ pad: 'a0', group: 'a', notes: [note(72, 0, 110)], bars: 1 },
|
{ pad: 'a0', group: 'a', notes: groupPatterns[0].notes[0], bars: 1 },
|
||||||
{ pad: 'a1', group: 'a', notes: [note(60, 0), note(64, 96)], bars: 1 },
|
{ pad: 'a1', group: 'a', notes: groupPatterns[0].notes[1], bars: 1 },
|
||||||
],
|
],
|
||||||
patternEvents: {
|
patternEvents: {
|
||||||
a: {
|
a: {
|
||||||
@@ -93,10 +121,13 @@ function project(): ProjectRawData {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
number: 2,
|
||||||
name: '02',
|
name: '02',
|
||||||
|
patternNumbers: { a: 2, b: 0, c: 0, d: 0 },
|
||||||
|
timeSignature: { numerator: 4, denominator: 4 },
|
||||||
patterns: [
|
patterns: [
|
||||||
{ pad: 'a0', group: 'a', notes: [note(72, 24, 90)], bars: 1 },
|
{ pad: 'a0', group: 'a', notes: groupPatterns[1].notes[0], bars: 1 },
|
||||||
{ pad: 'a1', group: 'a', notes: [note(67, 48)], bars: 1 },
|
{ pad: 'a1', group: 'a', notes: groupPatterns[1].notes[1], bars: 1 },
|
||||||
],
|
],
|
||||||
patternEvents: {
|
patternEvents: {
|
||||||
a: {
|
a: {
|
||||||
@@ -109,6 +140,11 @@ function project(): ProjectRawData {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
groupPatterns,
|
||||||
|
songPositions: [
|
||||||
|
{ position: 0, sceneNumber: 1 },
|
||||||
|
{ position: 1, sceneNumber: 2 },
|
||||||
|
],
|
||||||
settings: {
|
settings: {
|
||||||
bpm: 120,
|
bpm: 120,
|
||||||
scale: 0,
|
scale: 0,
|
||||||
@@ -140,10 +176,14 @@ function trackShape(tracks: AblTrack[]) {
|
|||||||
drumRack: track.drumRack,
|
drumRack: track.drumRack,
|
||||||
padCode: track.padCode,
|
padCode: track.padCode,
|
||||||
children: track.tracks.map((child) => child.padCode),
|
children: track.tracks.map((child) => child.padCode),
|
||||||
clips: track.lane?.clips.map((clip) => ({
|
sessionClips: track.lane?.sessionClips.map((clip) => ({
|
||||||
sceneIndex: clip.sceneIndex,
|
sceneIndex: clip.sceneIndex,
|
||||||
notes: clip.notes.map((item) => item.note),
|
notes: clip.notes.map((item) => item.note),
|
||||||
})),
|
})),
|
||||||
|
arrangementClips: track.lane?.arrangementClips.map((clip) => ({
|
||||||
|
occurrenceIndex: clip.occurrenceIndex,
|
||||||
|
notes: clip.notes.map((item) => item.note),
|
||||||
|
})),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,14 +255,14 @@ test('automatically builds a per-group rack without flattening chromatic pads',
|
|||||||
['a0', 'a2'],
|
['a0', 'a2'],
|
||||||
);
|
);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
rack.lane?.clips.map((clip) => [clip.sceneIndex, clip.sceneName, clip.notes[0].note]),
|
rack.lane?.sessionClips.map((clip) => [clip.sceneIndex, clip.sceneName, clip.notes[0].note]),
|
||||||
[
|
[
|
||||||
[0, 'Same', getDrumRackMidiNote('a0')],
|
[0, 'Same', getDrumRackMidiNote('a0')],
|
||||||
[1, 'Same', getDrumRackMidiNote('a0')],
|
[1, 'Same', getDrumRackMidiNote('a0')],
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
melodic.lane?.clips.map((clip) => clip.notes.map((item) => item.note)),
|
melodic.lane?.sessionClips.map((clip) => clip.notes.map((item) => item.note)),
|
||||||
[[60, 64], [67]],
|
[[60, 64], [67]],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -266,8 +306,8 @@ test('uses one hybrid classification for Arrangement and Session exports', () =>
|
|||||||
|
|
||||||
test('classifies a pad from its distinct pitches across every exported scene', () => {
|
test('classifies a pad from its distinct pitches across every exported scene', () => {
|
||||||
const data = project();
|
const data = project();
|
||||||
data.scenes[0].patterns[1].notes = [note(60, 0)];
|
data.groupPatterns[0].notes[1] = [note(60, 0)];
|
||||||
data.scenes[1].patterns[1].notes = [note(61, 0)];
|
data.groupPatterns[1].notes[1] = [note(61, 0)];
|
||||||
const result = abletonTransformer(data, { includeArchivedSamples: true });
|
const result = abletonTransformer(data, { includeArchivedSamples: true });
|
||||||
const rack = result.tracks.find((track) => track.drumRack);
|
const rack = result.tracks.find((track) => track.drumRack);
|
||||||
|
|
||||||
@@ -290,12 +330,12 @@ test('keeps pad-specific MIDI expression on an individual track', () => {
|
|||||||
rawData,
|
rawData,
|
||||||
data: rawData.slice(3, 7),
|
data: rawData.slice(3, 7),
|
||||||
};
|
};
|
||||||
data.scenes[0].patternEvents.a?.events.push(event);
|
data.groupPatterns[0].events.push(event);
|
||||||
const result = abletonTransformer(data, { includeArchivedSamples: true });
|
const result = abletonTransformer(data, { includeArchivedSamples: true });
|
||||||
const a0 = result.tracks.find((track) => track.padCode === 'a0' && !track.drumRack);
|
const a0 = result.tracks.find((track) => track.padCode === 'a0' && !track.drumRack);
|
||||||
|
|
||||||
assert.ok(a0);
|
assert.ok(a0);
|
||||||
assert.equal(a0.lane?.clips[0].midiEvents.length, 1);
|
assert.equal(a0.lane?.sessionClips[0].midiEvents.length, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('does not create selector-note racks when samples are excluded', () => {
|
test('does not create selector-note racks when samples are excluded', () => {
|
||||||
@@ -313,7 +353,7 @@ test('does not create selector-note racks when samples are excluded', () => {
|
|||||||
['a0', 'a1', 'a2'] as PadCode[],
|
['a0', 'a1', 'a2'] as PadCode[],
|
||||||
);
|
);
|
||||||
assert.deepEqual(
|
assert.deepEqual(
|
||||||
result.tracks[0].lane?.clips.map((clip) => clip.notes.map((item) => item.note)),
|
result.tracks[0].lane?.sessionClips.map((clip) => clip.notes.map((item) => item.note)),
|
||||||
[[72], [72]],
|
[[72], [72]],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user