From 4dad835fcea9077efec7eb6eb6e6f449d3d54ec8 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Jul 2026 10:34:46 +0200 Subject: [PATCH] Update pattern naming logic and corresponding test cases for Ableton Live export --- src/lib/transformers/ableton.ts | 9 ++++----- tests/ableton-song.test.ts | 6 ++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lib/transformers/ableton.ts b/src/lib/transformers/ableton.ts index a3e1f6b..ad139b5 100644 --- a/src/lib/transformers/ableton.ts +++ b/src/lib/transformers/ableton.ts @@ -395,12 +395,11 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams patternRows.forEach((patterns, patternNumber) => { const sceneIndex = ablScenes.length; - const affectedGroups = patterns.map((pattern) => pattern.group); + const affectedGroups = PROJECT_GROUPS.filter((group) => + patterns.some((pattern) => pattern.group === group), + ); const patternLabel = String(patternNumber).padStart(2, '0'); - const sceneName = - patterns.length === 1 - ? `${patterns[0].group.toUpperCase()} PATTERN ${patternLabel}` - : `PATTERN ${patternLabel} (${affectedGroups.map((group) => group.toUpperCase()).join('/')})`; + const sceneName = `PATTERN ${patternLabel} (${affectedGroups.map((group) => group.toUpperCase()).join('/')})`; const timeSignature = data.scenesSettings.timeSignature; ablScenes.push({ name: sceneName, diff --git a/tests/ableton-song.test.ts b/tests/ableton-song.test.ts index a4a65c0..000fdbf 100644 --- a/tests/ableton-song.test.ts +++ b/tests/ableton-song.test.ts @@ -133,7 +133,7 @@ function project(): ProjectRawData { pattern('a', 1, 2, 0, 60), pattern('b', 2, 1, 0, 36), pattern('a', 3, 1, 1, 64), - pattern('c', 3, 1, 0, 67), + pattern('c', 3, 2, 0, 67), pattern('b', 1, 1, 0, 38), faderPattern('d', 2), ], @@ -183,7 +183,7 @@ test('combines genuine Session scenes, orphan patterns and the repeated Song Arr [ ['01', 'scene', ['a', 'b', 'c', 'd']], ['02', 'scene', ['a', 'b', 'c', 'd']], - ['B PATTERN 01', 'pattern', ['b']], + ['PATTERN 01 (B)', 'pattern', ['b']], ['PATTERN 03 (A/C)', 'pattern', ['a', 'c']], ], ); @@ -223,6 +223,7 @@ test('combines genuine Session scenes, orphan patterns and the repeated Song Arr [3], ); assert.deepEqual(a1?.lane?.arrangementClips, []); + assert.equal(a1?.lane?.sessionClips[0].loopDuration, 4); assert.deepEqual( b0?.lane?.sessionClips.map((clip) => clip.sceneIndex), [0, 2], @@ -236,6 +237,7 @@ test('combines genuine Session scenes, orphan patterns and the repeated Song Arr [3], ); assert.deepEqual(c0?.lane?.arrangementClips, []); + assert.equal(c0?.lane?.sessionClips[0].loopDuration, 8); }); test('keeps Session material and leaves Arrangement empty when no Song is present', () => {