Update Ableton export to use dedicated arrangement time signature ID generation
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user