diff --git a/src/lib/transformers/ableton.ts b/src/lib/transformers/ableton.ts index 9e4a655..db55dd9 100644 --- a/src/lib/transformers/ableton.ts +++ b/src/lib/transformers/ableton.ts @@ -2,6 +2,7 @@ import * as Sentry from '@sentry/react'; import omit from 'lodash/omit'; import { ExporterParams, + FaderAutomationEvent, FaderParam, Note, Pad, @@ -49,6 +50,11 @@ export type AblClip = { sceneName: string; timeSignature: TimeSignature; faderParams: { [K in FaderParam]: number }; + faderAutomation: AblFaderAutomationPoint[]; +}; + +export type AblFaderAutomationPoint = Pick & { + parameter: FaderParam; }; export type AblScene = { @@ -64,7 +70,11 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams let offset = 0; scenes.forEach((scene, sceneIndex) => { - const sceneBars = Math.max(...scene.patterns.map((p) => p.bars)); + const sceneBars = Math.max( + 1, + ...scene.patterns.map((p) => p.bars), + ...Object.values(scene.patternEvents).map((pattern) => pattern?.bars || 0), + ); const ablScene: AblScene = { name: customSceneNames[scene.name] || scene.name, }; @@ -102,6 +112,15 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams } const faderParams = data.settings.groupFaderParams[pad.group]; + const faderAutomation = (scene.patternEvents[pad.group]?.events || []) + .filter((event): event is FaderAutomationEvent => event.type === 'fader') + .filter((event) => event.parameter >= FaderParam.LVL && event.parameter <= FaderParam.MOD) + .map((event) => ({ + position: event.position, + parameter: event.parameter as FaderParam, + value: event.value, + flags: event.flags, + })); if (!track) { const soundId = findSoundIdByPad(pattern.pad, pads) || 0; @@ -146,6 +165,7 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams sceneName: customSceneNames[scene.name] || scene.name, timeSignature: data.scenesSettings.timeSignature, faderParams, + faderAutomation, }); track.lane = lane;