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
+20
View File
@@ -2,6 +2,7 @@ import { describe, it, expect, beforeEach, vi } from 'vitest';
import { KGProjectStorage, DuplicateEntryError } from './KGProjectStorage';
import { KGProject } from '../KGProject';
import { GlobalTrackType } from '../global-track';
import { KGKeySignatureRegion } from '../region/KGKeySignatureRegion';
import { KGMarkerRegion } from '../region/KGMarkerRegion';
import { KGTrack } from '../track/KGTrack';
@@ -179,6 +180,25 @@ describe('KGProjectStorage', () => {
expect(loadedMarkerTrack?.getRegions()[0].getName()).toBe('Intro');
});
it('preserves key signature regions when saving and loading', async () => {
const project = createTestProject('Signature Song');
const signatureTrack = project.getGlobalTracks().find(track => track.getType() === GlobalTrackType.Signature);
expect(signatureTrack).toBeDefined();
signatureTrack?.addRegion(new KGKeySignatureRegion('signature-1', signatureTrack.getId(), signatureTrack.getTrackIndex(), 'G major', 4, 12, 4));
await storage.save('Signature Song', project);
const loaded = await storage.load('Signature Song');
const loadedSignatureTrack = loaded?.getGlobalTracks().find(track => track.getType() === GlobalTrackType.Signature);
expect(loadedSignatureTrack).toBeDefined();
expect(loadedSignatureTrack?.getRegions()).toHaveLength(1);
expect(loadedSignatureTrack?.getRegions()[0]).toBeInstanceOf(KGKeySignatureRegion);
expect((loadedSignatureTrack?.getRegions()[0] as KGKeySignatureRegion).getKeySignature()).toBe('G major');
expect((loadedSignatureTrack?.getRegions()[0] as KGKeySignatureRegion).getStartBar()).toBe(4);
});
it('creates meta.json and media/ directory on save', async () => {
const project = createTestProject('My Song');
await storage.save('My Song', project);