feat: added MIDI CC recording and list event table operation support.

This commit is contained in:
Xiaohan-Tian
2026-05-07 22:12:06 -07:00
parent 6305983df8
commit f3d26126fa
30 changed files with 1250 additions and 53 deletions
@@ -7,6 +7,7 @@ import { upgradeToV5 } from './upgradeToV5';
import { upgradeToV6 } from './upgradeToV6';
import { upgradeToV7 } from './upgradeToV7';
import { upgradeToV8 } from './upgradeToV8';
import { upgradeToV9 } from './upgradeToV9';
/**
* Upgrade the given project to the latest structure version, one version at a time.
@@ -58,6 +59,10 @@ export function upgradeProjectToLatest(project: KGProject): KGProject {
workingProject = upgradeToV8(workingProject);
break;
}
case 9: {
workingProject = upgradeToV9(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}`);
@@ -57,7 +57,8 @@ describe('upgradeToV8', () => {
const upgraded = upgradeProjectToLatest(project);
expect(upgraded.getProjectStructureVersion()).toBe(8);
expect(upgraded.getProjectStructureVersion()).toBe(9);
expect((upgraded.getTracks()[0].getRegions()[0] as KGMidiRegion).getPitchBends()).toEqual([]);
expect((upgraded.getTracks()[0].getRegions()[0] as KGMidiRegion).getControllerEventsByType()).toHaveLength(128);
});
});
+23
View File
@@ -0,0 +1,23 @@
import { KGProject } from '../KGProject';
import { KGMidiRegion } from '../region/KGMidiRegion';
export function upgradeToV9(project: KGProject): KGProject {
try {
for (const track of project.getTracks()) {
for (const region of track.getRegions()) {
if (region instanceof KGMidiRegion) {
const candidate = (region as unknown as { controllerEventsByType?: unknown }).controllerEventsByType;
if (!Array.isArray(candidate) || candidate.length !== 128) {
region.setControllerEventsByType([]);
} else {
region.setControllerEventsByType(candidate as never);
}
}
}
}
} finally {
project.setProjectStructureVersion(9);
}
return project;
}