feat: implemented global key signature track

This commit is contained in:
Xiaohan-Tian
2026-05-23 14:44:48 -07:00
parent 1e816596e4
commit 8eb3f5d84d
30 changed files with 1689 additions and 57 deletions
@@ -12,6 +12,7 @@ import { upgradeToV10 } from './upgradeToV10';
import { upgradeToV11 } from './upgradeToV11';
import { upgradeToV12 } from './upgradeToV12';
import { upgradeToV13 } from './upgradeToV13';
import { upgradeToV14 } from './upgradeToV14';
/**
* Upgrade the given project to the latest structure version, one version at a time.
@@ -83,6 +84,10 @@ export function upgradeProjectToLatest(project: KGProject): KGProject {
workingProject = upgradeToV13(workingProject);
break;
}
case 14: {
workingProject = upgradeToV14(workingProject);
break;
}
default: {
// If an upgrader is missing, throw to prevent loading incompatible structures
throw new Error(`No upgrader found for project structure version ${nextVersion}`);
@@ -18,6 +18,7 @@ describe('upgradeToV13', () => {
GlobalTrackType.Signature,
GlobalTrackType.Chord,
]);
expect(project.getGlobalTracks()[2].getName()).toBe('Key Signature');
});
it('runs through the main upgrader path', () => {
@@ -0,0 +1,23 @@
import { describe, expect, it } from 'vitest';
import { KGProject } from '../KGProject';
import { upgradeProjectToLatest } from './KGProjectUpgrader';
import { upgradeToV14 } from './upgradeToV14';
describe('upgradeToV14', () => {
it('marks projects as upgraded even when no signature regions exist yet', () => {
const project = new KGProject('Legacy', 32, 0, 125, undefined, undefined, undefined, undefined, [0, 0], 1, [], 13, 1, []);
upgradeToV14(project);
expect(project.getProjectStructureVersion()).toBe(14);
expect(project.getGlobalTracks()).toHaveLength(4);
});
it('runs through the main upgrader path', () => {
const project = new KGProject('Legacy', 32, 0, 125, undefined, undefined, undefined, undefined, [0, 0], 1, [], 13, 1, []);
const upgraded = upgradeProjectToLatest(project);
expect(upgraded.getProjectStructureVersion()).toBe(KGProject.CURRENT_PROJECT_STRUCTURE_VERSION);
});
});
+20
View File
@@ -0,0 +1,20 @@
import { KGProject } from '../KGProject';
import { GlobalTrackType } from '../global-track';
import { ensureDefaultGlobalTracks, getSortedKeySignatureRegions } from '../../util/globalTrackUtil';
export function upgradeToV14(project: KGProject): KGProject {
try {
ensureDefaultGlobalTracks(project);
const signatureTrack = project.getGlobalTracks().find(track => track.getType() === GlobalTrackType.Signature);
if (signatureTrack) {
const beatsPerBar = project.getTimeSignature().numerator;
const regions = getSortedKeySignatureRegions(signatureTrack, beatsPerBar);
signatureTrack.setRegions(regions);
}
} finally {
project.setProjectStructureVersion(14);
}
return project;
}