From 12d0754fee71205cc858a6ea74216dbfebf2c8a8 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Jul 2026 10:32:22 +0200 Subject: [PATCH] Refactor pattern scene generation in ableton transformer --- src/lib/transformers/ableton.ts | 37 +++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/lib/transformers/ableton.ts b/src/lib/transformers/ableton.ts index bfc04f1..a3e1f6b 100644 --- a/src/lib/transformers/ableton.ts +++ b/src/lib/transformers/ableton.ts @@ -375,7 +375,7 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams }); }); - data.groupPatterns + const unusedPatterns = data.groupPatterns .filter( (pattern) => getPatternSources(pattern).length > 0 && @@ -385,17 +385,31 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams const patternDifference = a.patternNumber - b.patternNumber; const groupDifference = PROJECT_GROUPS.indexOf(a.group) - PROJECT_GROUPS.indexOf(b.group); return patternDifference || groupDifference; - }) - .forEach((pattern) => { - const sceneIndex = ablScenes.length; - const sceneName = `${pattern.group.toUpperCase()} PATTERN ${String(pattern.patternNumber).padStart(2, '0')}`; - const timeSignature = data.scenesSettings.timeSignature; + }); + const patternRows = new Map(); + unusedPatterns.forEach((pattern) => { + const row = patternRows.get(pattern.patternNumber) || []; + row.push(pattern); + patternRows.set(pattern.patternNumber, row); + }); + + patternRows.forEach((patterns, patternNumber) => { + const sceneIndex = ablScenes.length; + const affectedGroups = patterns.map((pattern) => pattern.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 timeSignature = data.scenesSettings.timeSignature; + ablScenes.push({ + name: sceneName, + kind: 'pattern', + affectedGroups, + }); + + patterns.forEach((pattern) => { const duration = Math.max(1, pattern.bars) * getQuarterNotesPerBar(timeSignature); - ablScenes.push({ - name: sceneName, - kind: 'pattern', - affectedGroups: [pattern.group], - }); const occurrence = createOccurrence( pattern, sceneName, @@ -406,6 +420,7 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams ); addPatternClips(pattern, occurrence, 'session'); }); + }); } let arrangementOffset = 0;