Update Ableton exporter to use sound length for automation calculations

This commit is contained in:
2026-07-13 08:47:53 +02:00
parent a5b61b9443
commit 95a64e7536
2 changed files with 13 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ export type AbletonAutomationTarget = {
arrangement?: number; arrangement?: number;
session?: number; session?: number;
maxValue?: number; maxValue?: number;
soundLength?: number;
}; };
export type AbletonAutomationTargets = Partial<Record<FaderParam, AbletonAutomationTarget[]>>; export type AbletonAutomationTargets = Partial<Record<FaderParam, AbletonAutomationTarget[]>>;
@@ -62,10 +63,12 @@ export function convertFaderValue(
convertedValue = value; convertedValue = value;
break; break;
case FaderParam.ATK: case FaderParam.ATK:
convertedValue = koEnvRangeToSeconds(value * 255, track.soundLength) * 1000; convertedValue =
koEnvRangeToSeconds(value * 255, target?.soundLength ?? track.soundLength) * 1000;
break; break;
case FaderParam.REL: case FaderParam.REL:
convertedValue = koEnvRangeToSeconds(value * 255, track.soundLength) * 1000; convertedValue =
koEnvRangeToSeconds(value * 255, target?.soundLength ?? track.soundLength) * 1000;
break; break;
case FaderParam.PAN: case FaderParam.PAN:
convertedValue = (value - 0.5) * 2; convertedValue = (value - 0.5) * 2;

View File

@@ -104,7 +104,7 @@ function setLive10SampleReference(fileRef: any, sampleName: string) {
fileRef.LivePackId = { '@Value': '' }; fileRef.LivePackId = { '@Value': '' };
} }
function targetFor(parameter: any, maxValue?: number) { function targetFor(parameter: any, maxValue?: number, soundLength?: number) {
const automationTarget = const automationTarget =
parameter?.AutomationTarget?.['@Id'] === undefined parameter?.AutomationTarget?.['@Id'] === undefined
? undefined ? undefined
@@ -113,6 +113,7 @@ function targetFor(parameter: any, maxValue?: number) {
arrangement: automationTarget, arrangement: automationTarget,
session: automationTarget, session: automationTarget,
maxValue, maxValue,
soundLength,
}; };
} }
@@ -188,6 +189,10 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean
findSimplers(midiTrack.DeviceChain.DeviceChain.Devices).forEach((simpler) => { findSimplers(midiTrack.DeviceChain.DeviceChain.Devices).forEach((simpler) => {
const oneshot = Number(simpler.Globals.PlaybackMode['@Value']) === 1; const oneshot = Number(simpler.Globals.PlaybackMode['@Value']) === 1;
const sampleRef = simpler.Player.MultiSampleMap.SampleParts.MultiSamplePart.SampleRef;
const sampleRate = Number(sampleRef.DefaultSampleRate?.['@Value']);
const sampleDuration = Number(sampleRef.DefaultDuration?.['@Value']);
const soundLength = sampleRate > 0 ? sampleDuration / sampleRate : undefined;
addTarget(targets, FaderParam.PTC, targetFor(simpler.Pitch.TransposeKey)); addTarget(targets, FaderParam.PTC, targetFor(simpler.Pitch.TransposeKey));
addTarget(targets, FaderParam.TUNE, targetFor(simpler.Pitch.TransposeFine)); addTarget(targets, FaderParam.TUNE, targetFor(simpler.Pitch.TransposeFine));
addTarget( addTarget(
@@ -198,6 +203,7 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean
? simpler.VolumeAndPan.OneShotEnvelope.FadeInTime ? simpler.VolumeAndPan.OneShotEnvelope.FadeInTime
: simpler.VolumeAndPan.Envelope.AttackTime, : simpler.VolumeAndPan.Envelope.AttackTime,
oneshot ? 2000 : undefined, oneshot ? 2000 : undefined,
soundLength,
), ),
); );
addTarget( addTarget(
@@ -208,6 +214,7 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean
? simpler.VolumeAndPan.OneShotEnvelope.FadeOutTime ? simpler.VolumeAndPan.OneShotEnvelope.FadeOutTime
: simpler.VolumeAndPan.Envelope.ReleaseTime, : simpler.VolumeAndPan.Envelope.ReleaseTime,
oneshot ? 2000 : undefined, oneshot ? 2000 : undefined,
soundLength,
), ),
); );
addTarget(targets, FaderParam.MOD, targetFor(simpler.Pitch.PitchLfoAmount)); addTarget(targets, FaderParam.MOD, targetFor(simpler.Pitch.PitchLfoAmount));