diff --git a/src/lib/exporters/ableton/automation.ts b/src/lib/exporters/ableton/automation.ts index 413fef0..396ac1c 100644 --- a/src/lib/exporters/ableton/automation.ts +++ b/src/lib/exporters/ableton/automation.ts @@ -6,6 +6,7 @@ export type AbletonAutomationTarget = { arrangement?: number; session?: number; maxValue?: number; + soundLength?: number; }; export type AbletonAutomationTargets = Partial>; @@ -62,10 +63,12 @@ export function convertFaderValue( convertedValue = value; break; case FaderParam.ATK: - convertedValue = koEnvRangeToSeconds(value * 255, track.soundLength) * 1000; + convertedValue = + koEnvRangeToSeconds(value * 255, target?.soundLength ?? track.soundLength) * 1000; break; case FaderParam.REL: - convertedValue = koEnvRangeToSeconds(value * 255, track.soundLength) * 1000; + convertedValue = + koEnvRangeToSeconds(value * 255, target?.soundLength ?? track.soundLength) * 1000; break; case FaderParam.PAN: convertedValue = (value - 0.5) * 2; diff --git a/src/lib/exporters/ableton/builders.ts b/src/lib/exporters/ableton/builders.ts index 0dee6f6..fd9b67d 100644 --- a/src/lib/exporters/ableton/builders.ts +++ b/src/lib/exporters/ableton/builders.ts @@ -104,7 +104,7 @@ function setLive10SampleReference(fileRef: any, sampleName: string) { fileRef.LivePackId = { '@Value': '' }; } -function targetFor(parameter: any, maxValue?: number) { +function targetFor(parameter: any, maxValue?: number, soundLength?: number) { const automationTarget = parameter?.AutomationTarget?.['@Id'] === undefined ? undefined @@ -113,6 +113,7 @@ function targetFor(parameter: any, maxValue?: number) { arrangement: automationTarget, session: automationTarget, maxValue, + soundLength, }; } @@ -188,6 +189,10 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean findSimplers(midiTrack.DeviceChain.DeviceChain.Devices).forEach((simpler) => { 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.TUNE, targetFor(simpler.Pitch.TransposeFine)); addTarget( @@ -198,6 +203,7 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean ? simpler.VolumeAndPan.OneShotEnvelope.FadeInTime : simpler.VolumeAndPan.Envelope.AttackTime, oneshot ? 2000 : undefined, + soundLength, ), ); addTarget( @@ -208,6 +214,7 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean ? simpler.VolumeAndPan.OneShotEnvelope.FadeOutTime : simpler.VolumeAndPan.Envelope.ReleaseTime, oneshot ? 2000 : undefined, + soundLength, ), ); addTarget(targets, FaderParam.MOD, targetFor(simpler.Pitch.PitchLfoAmount));