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( function buildArrangementTimeSignatureEvents(
sections: AblArrangementSection[], sections: AblArrangementSection[],
fallbackTimeSignature: { numerator: number; denominator: number }, fallbackTimeSignature: { numerator: number; denominator: number },
) { ) {
const initialTimeSignature = sections[0]?.timeSignature || fallbackTimeSignature; const initialTimeSignature = sections[0]?.timeSignature || fallbackTimeSignature;
const initialTimeSignatureId =
sections.length > 0
? getArrangementTimeSignatureId(initialTimeSignature)
: getTimeSignatureId(initialTimeSignature);
const events = [ const events = [
{ {
'@Id': 0, '@Id': 0,
'@Time': -63072000, '@Time': -63072000,
'@Value': getTimeSignatureId(initialTimeSignature), '@Value': initialTimeSignatureId,
}, },
]; ];
let previousTimeSignatureId = getTimeSignatureId(initialTimeSignature); let previousTimeSignatureId = initialTimeSignatureId;
sections.forEach((section, index) => { sections.forEach((section, index) => {
const timeSignatureId = getTimeSignatureId(section.timeSignature); const timeSignatureId = getArrangementTimeSignatureId(section.timeSignature);
if (index === 0 || timeSignatureId === previousTimeSignatureId) { if (index === 0 || timeSignatureId === previousTimeSignatureId) {
previousTimeSignatureId = timeSignatureId; previousTimeSignatureId = timeSignatureId;
return; return;
@@ -1162,7 +1180,9 @@ export async function buildProject(projectData: ProjectRawData, exporterParams:
transformedData.arrangementSections[0]?.timeSignature || transformedData.arrangementSections[0]?.timeSignature ||
projectData.scenesSettings.timeSignature; projectData.scenesSettings.timeSignature;
(project.Ableton.LiveSet.MasterTrack.DeviceChain.Mixer as any).TimeSignature.Manual['@Value'] = (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 = project.Ableton.LiveSet.MasterTrack.AutomationEnvelopes.Envelopes.AutomationEnvelope[0].Automation.Events.EnumEvent =
buildArrangementTimeSignatureEvents( buildArrangementTimeSignatureEvents(
transformedData.arrangementSections, transformedData.arrangementSections,