Update Ableton export logic to use comprehensive playback state parameters

This commit is contained in:
2026-07-13 15:58:10 +02:00
parent cdbe72e775
commit e4ef0f97cd
8 changed files with 28 additions and 125 deletions

View File

@@ -389,7 +389,7 @@ async function buildMidiClip(
async function buildSimplerDevice(koTrack: AblTrack, abletonVersion: AbletonVersion) {
const simplerTemplate = await loadTemplate<ALSSimpler>('simpler', abletonVersion);
const device = structuredClone(simplerTemplate.OriginalSimpler);
const playbackState = getSimplerPlaybackState(koTrack.playMode, koTrack.oneShotOverride);
const playbackState = getSimplerPlaybackState(koTrack.playMode);
const samplePart = device.Player.MultiSampleMap.SampleParts.MultiSamplePart;
const loopModulators = device.Player.LoopModulators;
const simplerFilter = device.Filter.Slot.Value.SimplerFilter;
@@ -415,10 +415,10 @@ async function buildSimplerDevice(koTrack: AblTrack, abletonVersion: AbletonVers
device.VolumeAndPan.OneShotEnvelope.FadeOutTime.Manual['@Value'] = 0;
device.VolumeAndPan.OneShotEnvelope.SustainMode.Manual['@Value'] = 0;
device.Globals.PlaybackMode['@Value'] = playbackState.playbackMode;
if (playbackState.monophonic) {
device.Globals.NumVoices['@Value'] = 1;
device.Globals.RetriggerMode['@Value'] = 'false';
}
device.Globals.NumVoices['@Value'] = playbackState.voices;
device.Globals.RetriggerMode['@Value'] = playbackState.retrigger;
device.Globals.PortamentoMode.Manual['@Value'] = playbackState.portamentoMode;
device.Globals.PortamentoTime.Manual['@Value'] = playbackState.portamentoMode === 2 ? 0.1 : 50;
const sampleRef = device.Player.MultiSampleMap.SampleParts.MultiSamplePart.SampleRef;
if (abletonVersion === '10') {
setLive10SampleReference(sampleRef.FileRef, koTrack.sampleName);

View File

@@ -1,18 +1,11 @@
import { PadCode } from '../../../types/types';
export type AbletonPlaybackMode = 'oneshot' | 'key' | 'legato';
export function hasOneShotOverride(padCode: PadCode, oneShotPads: PadCode[] = []) {
return oneShotPads.includes(padCode);
}
export function getSimplerPlaybackState(
projectMode: AbletonPlaybackMode,
oneShotOverride: boolean,
) {
export function getSimplerPlaybackState(projectMode: AbletonPlaybackMode) {
return {
playbackMode: projectMode === 'oneshot' || oneShotOverride ? 1 : 0,
monophonic: projectMode === 'legato',
playbackMode: 1,
voices: projectMode === 'key' ? 5 : 0,
retrigger: projectMode === 'oneshot',
portamentoMode: projectMode === 'legato' ? 2 : 0,
useOneShotEnvelope: projectMode === 'oneshot',
};
}

View File

@@ -10,7 +10,6 @@ import {
ProjectRawData,
TimeSignature,
} from '../../types/types';
import { hasOneShotOverride } from '../exporters/ableton/playback';
import { getSampleName } from '../exporters/utils';
import { findPad, findSoundByPad, findSoundIdByPad } from '../utils';
@@ -22,7 +21,6 @@ export type AblData = {
export type AblTrack = Omit<Pad, 'file' | 'rawData' | 'midiChannel'> & {
padCode: PadCode;
oneShotOverride: boolean;
group: string;
sampleName: string;
sampleChannels: number;
@@ -176,7 +174,6 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams
...omit(pad, ['file', 'rawData']),
soundId,
padCode: pattern.pad,
oneShotOverride: hasOneShotOverride(pattern.pad, exporterParams.abletonOneShotPads),
name: sound?.meta?.name || pattern.pad,
volume: pad.volume / 200, // converting from 0-200 to 0.0-1.0
sampleName: getSampleName(sound?.meta?.name, soundId),
@@ -247,7 +244,6 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams
...omit(pad, ['file', 'rawData']),
soundId: pad.soundId,
padCode,
oneShotOverride: hasOneShotOverride(padCode, exporterParams.abletonOneShotPads),
name: sound?.meta?.name || padCode,
volume: pad.volume / 200,
sampleName: getSampleName(sound?.meta?.name, pad.soundId),
@@ -278,7 +274,6 @@ function abletonTransformer(data: ProjectRawData, exporterParams: ExporterParams
const drumTrack: AblTrack = {
padCode: `${group}0` as PadCode,
oneShotOverride: false,
group,
sampleName: '',
sampleChannels: 0,