Refactor and fix Ableton exporter logic across multiple files

This commit is contained in:
2026-07-14 11:28:39 +02:00
parent d582adb3fc
commit 772caebcba
6 changed files with 12 additions and 40 deletions

View File

@@ -1,10 +1,6 @@
import { FaderParam } from '../../../types/types'; import { FaderParam } from '../../../types/types';
import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton'; import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton';
import { import { convertGroupFaderValue, getFaderDefaultValue, getFaderPolicy } from './faderPolicies';
convertGroupFaderValue,
getFaderDefaultValue,
getFaderPolicy,
} from './faderPolicies';
export type AbletonAutomationTarget = { export type AbletonAutomationTarget = {
arrangement?: number; arrangement?: number;
@@ -101,13 +97,7 @@ function getArrangementPoints(
const points: AutomationPoint[] = []; const points: AutomationPoint[] = [];
let previousValue = orderedPatterns[0] let previousValue = orderedPatterns[0]
? getConvertedStaticValue(orderedPatterns[0], parameter, track, groupMixer, target) ? getConvertedStaticValue(orderedPatterns[0], parameter, track, groupMixer, target)
: convertFaderValue( : convertFaderValue(parameter, getFaderDefaultValue(parameter), track, groupMixer, target);
parameter,
getFaderDefaultValue(parameter),
track,
groupMixer,
target,
);
orderedPatterns.forEach((pattern) => { orderedPatterns.forEach((pattern) => {
const patternTicks = Math.max(1, pattern.loopDuration * 96); const patternTicks = Math.max(1, pattern.loopDuration * 96);

View File

@@ -373,10 +373,8 @@ async function buildSimplerDevice(
simplerFilter.ModByLfo.Manual['@Value'] = 0; simplerFilter.ModByLfo.Manual['@Value'] = 0;
device.Lfo.IsOn.Manual['@Value'] = 'false'; device.Lfo.IsOn.Manual['@Value'] = 'false';
device.Pitch.PitchLfoAmount.Manual['@Value'] = 0; device.Pitch.PitchLfoAmount.Manual['@Value'] = 0;
device.VolumeAndPan.OneShotEnvelope.FadeInTime.Manual['@Value'] = device.VolumeAndPan.OneShotEnvelope.FadeInTime.Manual['@Value'] = padEnvelope.oneShotFadeInMs;
padEnvelope.oneShotFadeInMs; device.VolumeAndPan.OneShotEnvelope.FadeOutTime.Manual['@Value'] = padEnvelope.oneShotFadeOutMs;
device.VolumeAndPan.OneShotEnvelope.FadeOutTime.Manual['@Value'] =
padEnvelope.oneShotFadeOutMs;
device.VolumeAndPan.OneShotEnvelope.SustainMode.Manual['@Value'] = 0; device.VolumeAndPan.OneShotEnvelope.SustainMode.Manual['@Value'] = 0;
device.VolumeAndPan.Envelope.AttackTime.Manual['@Value'] = padEnvelope.classicAttackMs; device.VolumeAndPan.Envelope.AttackTime.Manual['@Value'] = padEnvelope.classicAttackMs;
device.VolumeAndPan.Envelope.ReleaseTime.Manual['@Value'] = padEnvelope.classicReleaseMs; device.VolumeAndPan.Envelope.ReleaseTime.Manual['@Value'] = padEnvelope.classicReleaseMs;
@@ -449,10 +447,7 @@ async function buildSimplerDevice(
device.Pitch.TransposeKey.Manual['@Value'] = pitch; device.Pitch.TransposeKey.Manual['@Value'] = pitch;
// adding vibrato from MOD fader param if defined // adding vibrato from MOD fader param if defined
if ( if (koTrack.faderParams[FaderParam.MOD] !== -1 || automatedParameters.has(FaderParam.MOD)) {
koTrack.faderParams[FaderParam.MOD] !== -1 ||
automatedParameters.has(FaderParam.MOD)
) {
device.Lfo.IsOn.Manual['@Value'] = 'true'; device.Lfo.IsOn.Manual['@Value'] = 'true';
if (!device.Lfo.Slot.Value.SimplerLfo && abletonVersion === '10') { if (!device.Lfo.Slot.Value.SimplerLfo && abletonVersion === '10') {
const simplerLfoTemplate = await loadTemplate<any>('simplerLfo', abletonVersion); const simplerLfoTemplate = await loadTemplate<any>('simplerLfo', abletonVersion);
@@ -583,11 +578,7 @@ async function buildDrumRackDevice(
drumBranch.BranchInfo.ChokeGroup['@Value'] = subtrack.inChokeGroup ? 1 : 0; drumBranch.BranchInfo.ChokeGroup['@Value'] = subtrack.inChokeGroup ? 1 : 0;
drumBranch.MixerDevice.Volume.Manual['@Value'] = subtrack.volume; drumBranch.MixerDevice.Volume.Manual['@Value'] = subtrack.volume;
drumBranch.MixerDevice.SendInfos = {}; drumBranch.MixerDevice.SendInfos = {};
const branchDevices = await buildSimplerDevice( const branchDevices = await buildSimplerDevice(subtrack, abletonVersion, automatedParameters);
subtrack,
abletonVersion,
automatedParameters,
);
assignDeviceListIds([branchDevices]); assignDeviceListIds([branchDevices]);
drumBranch.DeviceChain.MidiToAudioDeviceChain.Devices = branchDevices; drumBranch.DeviceChain.MidiToAudioDeviceChain.Devices = branchDevices;

View File

@@ -27,8 +27,7 @@ export const FADER_POLICIES = {
renderStrategy: 'target', renderStrategy: 'target',
targetScope: 'track', targetScope: 'track',
status: 'mapped', status: 'mapped',
toLive: (value, context) => toLive: (value, context) => (context.groupMixer ? value : context.track.volume * value),
context.groupMixer ? value : context.track.volume * value,
}, },
[FaderParam.PTC]: { [FaderParam.PTC]: {
defaultValue: 0.5, defaultValue: 0.5,

View File

@@ -52,10 +52,8 @@ export function getPadSoundState(track: AblTrack): PadSoundState {
export function getPadEnvelopeState(sound: PadSoundState): PadEnvelopeState { export function getPadEnvelopeState(sound: PadSoundState): PadEnvelopeState {
return { return {
classicAttackMs: classicAttackMs: koEnvRangeToSeconds(sound.envelope.attack, sound.soundLength) * 1000,
koEnvRangeToSeconds(sound.envelope.attack, sound.soundLength) * 1000, classicReleaseMs: koEnvRangeToSeconds(sound.envelope.release, sound.soundLength) * 1000,
classicReleaseMs:
koEnvRangeToSeconds(sound.envelope.release, sound.soundLength) * 1000,
oneShotFadeInMs: 0, oneShotFadeInMs: 0,
oneShotFadeOutMs: 5, oneShotFadeOutMs: 5,
}; };

View File

@@ -1,8 +1,8 @@
import assert from 'node:assert/strict'; import assert from 'node:assert/strict';
import test from 'node:test'; import test from 'node:test';
import { import {
FADER_POLICIES,
convertGroupFaderValue, convertGroupFaderValue,
FADER_POLICIES,
getFaderPolicy, getFaderPolicy,
} from '../src/lib/exporters/ableton/faderPolicies'; } from '../src/lib/exporters/ableton/faderPolicies';
import { AblTrack } from '../src/lib/transformers/ableton'; import { AblTrack } from '../src/lib/transformers/ableton';
@@ -28,8 +28,5 @@ test('separates Live targets, note transforms and unsupported group parameters',
test('uses one group-fader conversion path for mixer and pad targets', () => { test('uses one group-fader conversion path for mixer and pad targets', () => {
assert.equal(convertGroupFaderValue(FaderParam.LVL, 0.5, { track }), 0.2); assert.equal(convertGroupFaderValue(FaderParam.LVL, 0.5, { track }), 0.2);
assert.equal(convertGroupFaderValue(FaderParam.PAN, 0.75, { track }), 0.5); assert.equal(convertGroupFaderValue(FaderParam.PAN, 0.75, { track }), 0.5);
assert.equal( assert.equal(convertGroupFaderValue(FaderParam.PTC, 0.75, { track, valueOffset: 7 }), 9.5);
convertGroupFaderValue(FaderParam.PTC, 0.75, { track, valueOffset: 7 }),
9.5,
);
}); });

View File

@@ -1,9 +1,6 @@
import assert from 'node:assert/strict'; import assert from 'node:assert/strict';
import test from 'node:test'; import test from 'node:test';
import { import { getPadEnvelopeState, getPadSoundState } from '../src/lib/exporters/ableton/padSound';
getPadEnvelopeState,
getPadSoundState,
} from '../src/lib/exporters/ableton/padSound';
import { AblTrack } from '../src/lib/transformers/ableton'; import { AblTrack } from '../src/lib/transformers/ableton';
const track = { const track = {