The Following Script works perfectly to solve my problem, for those of you wanting to achieve the same thing before it gets officially implemented. Just save it as a .js and out it in the sscripts folder of your specific install.
Thanks guys.
studio.menu.addMenuItem({
name: "Change Tempo While Preserving Beat Alignments",
isEnabled: function() {
var current = studio.window.editorCurrent();
return current != null && current.entity == "TempoMarker";
},
execute: function() {
var tempoMarker = studio.window.editorCurrent();
var newTempo = studio.system.getNumber("Enter the new tempo:", tempoMarker.tempo);
if (newTempo == null || newTempo <= 0) {
return;
}
repositionModules(tempoMarker, newTempo);
repositionMarkers(tempoMarker, newTempo);
repositionAutomationCurvePoints(tempoMarker, newTempo);
tempoMarker.tempo = newTempo;
},
});
function positionToBeats(position, basePosition, tempo) {
var offset = position - basePosition;
return offset / 60 * tempo;
}
function beatsToPosition(beats, basePosition, tempo) {
var offset = beats * 60 / tempo;
return basePosition + offset;
}
function repositionModules(tempoMarker, newTempo) {
var modules = tempoMarker.timeline.modules;
for (var i = 0; i < modules.length; ++i) {
var module = modules[i];
if (module.start >= tempoMarker.position) {
var startBeat = positionToBeats(module.start, tempoMarker.position, tempoMarker.tempo);
var endBeat = positionToBeats(module.start + module.length, tempoMarker.position, tempoMarker.tempo);
module.start = beatsToPosition(startBeat, tempoMarker.position, newTempo);
module.length = beatsToPosition(endBeat, tempoMarker.position, newTempo) - module.start;
repositionFadeCurve(module.fadeInCurve, tempoMarker, newTempo);
repositionFadeCurve(module.fadeOutCurve, tempoMarker, newTempo);
}
}
}
function repositionFadeCurve(fadeCurve, tempoMarker, newTempo) {
if (fadeCurve != null) {
repositionAutomationPoint(fadeCurve.startPoint, tempoMarker, newTempo);
repositionAutomationPoint(fadeCurve.endPoint, tempoMarker, newTempo);
}
}
function repositionMarkers(tempoMarker, newTempo) {
var markers = tempoMarker.timeline.markers;
for (var i = 0; i < markers.length; ++i) {
var marker = markers[i];
if (marker != tempoMarker && marker.position >= tempoMarker.position) {
var startBeat = positionToBeats(marker.position, tempoMarker.position, tempoMarker.tempo);
var endBeat = null;
if (marker.length != null) {
endBeat = positionToBeats(marker.position + marker.length, tempoMarker.position, tempoMarker.tempo);
}
marker.position = beatsToPosition(startBeat, tempoMarker.position, newTempo);
if (marker.length != null) {
marker.length = beatsToPosition(endBeat, tempoMarker.position, newTempo) - marker.position;
}
}
}
}
function repositionAutomationCurvePoints(tempoMarker, newTempo) {
var curves = tempoMarker.timeline.automationCurves;
for (var i = 0; i < curves.length; ++i) {
var points = curves[i].automationPoints;
for (var j = 0; j < points.length; ++j) {
var point = points[j];
if (point.position >= tempoMarker.position) {
repositionAutomationPoint(point, tempoMarker, newTempo);
}
}
}
}
function repositionAutomationPoint(point, tempoMarker, newTempo) {
var beat = positionToBeats(point.position, tempoMarker.position, tempoMarker.tempo);
point.position = beatsToPosition(beat, tempoMarker.position, newTempo);
}