Fix minor syntax and logic errors in Ableton exporter

This commit is contained in:
2026-07-13 05:01:58 +02:00
parent 46ff0a52e1
commit 70a27e45d9
4 changed files with 16 additions and 29 deletions

View File

@@ -7,9 +7,7 @@ export type AbletonAutomationTarget = {
session?: number; session?: number;
}; };
export type AbletonAutomationTargets = Partial< export type AbletonAutomationTargets = Partial<Record<FaderParam, AbletonAutomationTarget[]>>;
Record<FaderParam, AbletonAutomationTarget[]>
>;
type AutomationPoint = { type AutomationPoint = {
time: number; time: number;
@@ -76,7 +74,8 @@ export function getFaderValueAt(
position: number, position: number,
) { ) {
const staticValue = occurrence?.faderParams[parameter]; const staticValue = occurrence?.faderParams[parameter];
let value = staticValue === undefined || staticValue === -1 ? defaultValue(parameter) : staticValue; let value =
staticValue === undefined || staticValue === -1 ? defaultValue(parameter) : staticValue;
const points = (occurrence?.faderAutomation || []) const points = (occurrence?.faderAutomation || [])
.filter((point) => point.parameter === parameter && point.position <= position) .filter((point) => point.parameter === parameter && point.position <= position)
.sort((a, b) => a.position - b.position); .sort((a, b) => a.position - b.position);
@@ -110,8 +109,7 @@ function getArrangementPoints(
); );
patterns.forEach((pattern) => { patterns.forEach((pattern) => {
const beats = const beats = pattern.timeSignature.numerator * (4 / pattern.timeSignature.denominator);
pattern.timeSignature.numerator * (4 / pattern.timeSignature.denominator);
const patternTicks = pattern.bars * beats * 96; const patternTicks = pattern.bars * beats * 96;
const sceneTicks = pattern.sceneBars * beats * 96; const sceneTicks = pattern.sceneBars * beats * 96;
const startTime = pattern.offset * beats; const startTime = pattern.offset * beats;

View File

@@ -14,6 +14,12 @@ import abletonTransformer, {
AblTrack, AblTrack,
} from '../../transformers/ableton'; } from '../../transformers/ableton';
import { getQuarterNotesPerBar } from '../utils'; import { getQuarterNotesPerBar } from '../utils';
import {
AbletonAutomationTargets,
buildArrangementEnvelopes,
buildClipEnvelopes,
getFaderValueAt,
} from './automation';
import { ALSDrumBranch } from './types/drumBranch'; import { ALSDrumBranch } from './types/drumBranch';
import { ALSDrumRack } from './types/drumRack'; import { ALSDrumRack } from './types/drumRack';
import { ALSChorus } from './types/effectChorus'; import { ALSChorus } from './types/effectChorus';
@@ -30,12 +36,6 @@ import { ALSReturnTrack } from './types/returnTrack';
import { ALSScene, ALSSceneContent } from './types/scene'; import { ALSScene, ALSSceneContent } from './types/scene';
import { ALSSimpler } from './types/simpler'; import { ALSSimpler } from './types/simpler';
import { ALSTrackSendHolder } from './types/trackSendHolder'; import { ALSTrackSendHolder } from './types/trackSendHolder';
import {
AbletonAutomationTargets,
buildArrangementEnvelopes,
buildClipEnvelopes,
getFaderValueAt,
} from './automation';
import { import {
filterFreqFromNormalized, filterFreqFromNormalized,
fixIds, fixIds,
@@ -141,9 +141,7 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean
const mixer = midiTrack.DeviceChain.Mixer; const mixer = midiTrack.DeviceChain.Mixer;
const sequencer = midiTrack.DeviceChain.MainSequencer; const sequencer = midiTrack.DeviceChain.MainSequencer;
addTarget(targets, FaderParam.LVL, { addTarget(targets, FaderParam.LVL, {
arrangement: includeArrangementMixer arrangement: includeArrangementMixer ? Number(mixer.Volume.AutomationTarget['@Id']) : undefined,
? Number(mixer.Volume.AutomationTarget['@Id'])
: undefined,
session: Number(sequencer.VolumeModulationTarget['@Id']), session: Number(sequencer.VolumeModulationTarget['@Id']),
}); });
addTarget(targets, FaderParam.PAN, { addTarget(targets, FaderParam.PAN, {
@@ -723,8 +721,7 @@ async function buildGroupTrack(
if (!exporterParams.clips) { if (!exporterParams.clips) {
if (koTrack.faderParams[FaderParam.LVL] !== -1) { if (koTrack.faderParams[FaderParam.LVL] !== -1) {
groupTrack.DeviceChain.Mixer.Volume.Manual['@Value'] = groupTrack.DeviceChain.Mixer.Volume.Manual['@Value'] = koTrack.faderParams[FaderParam.LVL];
koTrack.faderParams[FaderParam.LVL];
} }
if (koTrack.faderParams[FaderParam.PAN] !== -1) { if (koTrack.faderParams[FaderParam.PAN] !== -1) {
groupTrack.DeviceChain.Mixer.Pan.Manual['@Value'] = groupTrack.DeviceChain.Mixer.Pan.Manual['@Value'] =
@@ -828,13 +825,7 @@ async function buildTracks(
result.push(groupTrack); result.push(groupTrack);
} }
const midiTrack = await buildTrack( const midiTrack = await buildTrack(koTrack, groupLane, maxScenes, trackGroupId, exporterParams);
koTrack,
groupLane,
maxScenes,
trackGroupId,
exporterParams,
);
result.push(midiTrack); result.push(midiTrack);
} }
@@ -904,9 +895,7 @@ async function buildReturnTrack(
if (projectData.effects.effectType === EffectType.Chorus) { if (projectData.effects.effectType === EffectType.Chorus) {
const effectChorusTemplate = await loadTemplate<ALSChorus>('effectChorus', abletonVersion); const effectChorusTemplate = await loadTemplate<ALSChorus>('effectChorus', abletonVersion);
const effectChorus = structuredClone( const effectChorus = structuredClone(
abletonVersion === '10' abletonVersion === '10' ? (effectChorusTemplate as any).Chorus : effectChorusTemplate.Chorus2,
? (effectChorusTemplate as any).Chorus
: effectChorusTemplate.Chorus2,
); );
if (abletonVersion === '10') { if (abletonVersion === '10') {

View File

@@ -81,7 +81,8 @@ export async function loadTemplate<T>(
return templateCache[cacheKey]; return templateCache[cacheKey];
} }
const importFn = abletonVersion === '10' ? live10TemplateMap[templateName] : templateMap[templateName]; const importFn =
abletonVersion === '10' ? live10TemplateMap[templateName] : templateMap[templateName];
if (!importFn) { if (!importFn) {
throw new Error(`Unknown template: ${templateName}`); throw new Error(`Unknown template: ${templateName}`);
} }

View File

@@ -122,7 +122,6 @@ function ExportProjectDialog({
<div className="text-sm whitespace-pre-line">{NOTES[format]}</div> <div className="text-sm whitespace-pre-line">{NOTES[format]}</div>
</div> </div>
)} )}
</div> </div>
<div className="mt-4 min-h-13.5"> <div className="mt-4 min-h-13.5">