diff --git a/src/lib/exporters/ableton/builders.ts b/src/lib/exporters/ableton/builders.ts index 4b13dab..6b050fd 100644 --- a/src/lib/exporters/ableton/builders.ts +++ b/src/lib/exporters/ableton/builders.ts @@ -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,