65 lines
2.4 KiB
TypeScript
65 lines
2.4 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
||
import { KGProject } from '../KGProject';
|
||
import { KGMidiTrack } from '../track/KGMidiTrack';
|
||
import { upgradeToV7 } from './upgradeToV7';
|
||
import { AUDIO_INTERFACE_CONSTANTS } from '../../constants/coreConstants';
|
||
|
||
function makeProject(volumes: number[]): KGProject {
|
||
const tracks = volumes.map((v, i) => {
|
||
const track = new KGMidiTrack(`Track ${i}`, i);
|
||
// Bypass setVolume clamping to simulate old 0–1 linear values stored in JSON
|
||
(track as unknown as { volume: number }).volume = v;
|
||
return track;
|
||
});
|
||
const project = new KGProject('Test', 32, 0, 125, undefined, undefined, undefined, undefined, undefined, undefined, tracks, 6);
|
||
return project;
|
||
}
|
||
|
||
describe('upgradeToV7', () => {
|
||
it('converts 1.0 linear to 0 dB', () => {
|
||
const project = makeProject([1.0]);
|
||
upgradeToV7(project);
|
||
expect(project.getTracks()[0].getVolume()).toBeCloseTo(0, 5);
|
||
});
|
||
|
||
it('converts 0.8 linear to ~−1.94 dB', () => {
|
||
const project = makeProject([0.8]);
|
||
upgradeToV7(project);
|
||
expect(project.getTracks()[0].getVolume()).toBeCloseTo(20 * Math.log10(0.8), 3);
|
||
});
|
||
|
||
it('converts 0.5 linear to ~−6.02 dB', () => {
|
||
const project = makeProject([0.5]);
|
||
upgradeToV7(project);
|
||
expect(project.getTracks()[0].getVolume()).toBeCloseTo(-6.021, 2);
|
||
});
|
||
|
||
it('converts 0.0 linear to MIN_TRACK_VOLUME_DB', () => {
|
||
const project = makeProject([0.0]);
|
||
upgradeToV7(project);
|
||
expect(project.getTracks()[0].getVolume()).toBe(AUDIO_INTERFACE_CONSTANTS.MIN_TRACK_VOLUME_DB);
|
||
});
|
||
|
||
it('clamps values that exceed MAX_TRACK_VOLUME_DB', () => {
|
||
// linear > 1.0 gives positive dB but 2.0 is still below the +12 dB ceiling
|
||
const project = makeProject([2.0]);
|
||
upgradeToV7(project);
|
||
expect(project.getTracks()[0].getVolume()).toBeCloseTo(20 * Math.log10(2.0), 5);
|
||
});
|
||
|
||
it('bumps project structure version to 7', () => {
|
||
const project = makeProject([1.0]);
|
||
upgradeToV7(project);
|
||
expect(project.getProjectStructureVersion()).toBe(7);
|
||
});
|
||
|
||
it('handles multiple tracks independently', () => {
|
||
const project = makeProject([1.0, 0.5, 0.0]);
|
||
upgradeToV7(project);
|
||
const tracks = project.getTracks();
|
||
expect(tracks[0].getVolume()).toBeCloseTo(0, 5);
|
||
expect(tracks[1].getVolume()).toBeCloseTo(-6.021, 2);
|
||
expect(tracks[2].getVolume()).toBe(AUDIO_INTERFACE_CONSTANTS.MIN_TRACK_VOLUME_DB);
|
||
});
|
||
});
|