Update Ableton export to use dedicated arrangement time signature ID generation

This commit is contained in:
2026-07-14 10:04:23 +02:00
parent e23c59d2b4
commit b9fe445576

View File

@@ -1102,22 +1102,40 @@ function getTimeSignatureId(timeSignature: { numerator: number; denominator: num
);
}
function getArrangementTimeSignatureId(timeSignature: {
numerator: number;
denominator: number;
}) {
const signature = `${timeSignature.numerator}/${timeSignature.denominator}`;
const timeSignatureId = TIME_SIGNATURES[signature];
if (timeSignatureId === undefined) {
throw new Error(
`Arrangement export has no verified Ableton Live time-signature ID for ${signature}`,
);
}
return timeSignatureId;
}
function buildArrangementTimeSignatureEvents(
sections: AblArrangementSection[],
fallbackTimeSignature: { numerator: number; denominator: number },
) {
const initialTimeSignature = sections[0]?.timeSignature || fallbackTimeSignature;
const initialTimeSignatureId =
sections.length > 0
? getArrangementTimeSignatureId(initialTimeSignature)
: getTimeSignatureId(initialTimeSignature);
const events = [
{
'@Id': 0,
'@Time': -63072000,
'@Value': getTimeSignatureId(initialTimeSignature),
'@Value': initialTimeSignatureId,
},
];
let previousTimeSignatureId = getTimeSignatureId(initialTimeSignature);
let previousTimeSignatureId = initialTimeSignatureId;
sections.forEach((section, index) => {
const timeSignatureId = getTimeSignatureId(section.timeSignature);
const timeSignatureId = getArrangementTimeSignatureId(section.timeSignature);
if (index === 0 || timeSignatureId === previousTimeSignatureId) {
previousTimeSignatureId = timeSignatureId;
return;
@@ -1162,7 +1180,9 @@ export async function buildProject(projectData: ProjectRawData, exporterParams:
transformedData.arrangementSections[0]?.timeSignature ||
projectData.scenesSettings.timeSignature;
(project.Ableton.LiveSet.MasterTrack.DeviceChain.Mixer as any).TimeSignature.Manual['@Value'] =
getTimeSignatureId(initialTimeSignature);
transformedData.arrangementSections.length > 0
? getArrangementTimeSignatureId(initialTimeSignature)
: getTimeSignatureId(initialTimeSignature);
project.Ableton.LiveSet.MasterTrack.AutomationEnvelopes.Envelopes.AutomationEnvelope[0].Automation.Events.EnumEvent =
buildArrangementTimeSignatureEvents(
transformedData.arrangementSections,