200 lines
4.6 KiB
TypeScript
200 lines
4.6 KiB
TypeScript
import { KGMidiNote } from '../../core/midi/KGMidiNote';
|
|
import { KGMidiControllerEvent } from '../../core/midi/KGMidiControllerEvent';
|
|
import { KGMidiPitchBend } from '../../core/midi/KGMidiPitchBend';
|
|
import { KGProject } from '../../core/KGProject';
|
|
import { KGMidiTrack } from '../../core/track/KGMidiTrack';
|
|
import { KGMidiRegion } from '../../core/region/KGMidiRegion';
|
|
|
|
/**
|
|
* Test data factories for creating mock objects
|
|
* These help create consistent test data across different test files
|
|
*/
|
|
|
|
export const createMockMidiNote = (overrides: Partial<{
|
|
pitch: number
|
|
velocity: number
|
|
startBeat: number
|
|
endBeat: number
|
|
id: string
|
|
}> = {}): KGMidiNote => {
|
|
const defaults = {
|
|
id: 'test-note-1',
|
|
startBeat: 0,
|
|
endBeat: 1,
|
|
pitch: 60, // Middle C
|
|
velocity: 80,
|
|
...overrides
|
|
};
|
|
|
|
return new KGMidiNote(
|
|
defaults.id,
|
|
defaults.startBeat,
|
|
defaults.endBeat,
|
|
defaults.pitch,
|
|
defaults.velocity
|
|
);
|
|
};
|
|
|
|
export const createMockMidiRegion = (overrides: Partial<{
|
|
id: string
|
|
trackId: string
|
|
trackIndex: number
|
|
name: string
|
|
startFromBeat: number
|
|
length: number
|
|
notes: KGMidiNote[]
|
|
pitchBends: KGMidiPitchBend[]
|
|
controllerEventsByType: KGMidiControllerEvent[][]
|
|
}> = {}): KGMidiRegion => {
|
|
const defaults = {
|
|
id: 'test-region-1',
|
|
trackId: 'test-track-1',
|
|
trackIndex: 0,
|
|
name: 'Test Region',
|
|
startFromBeat: 0,
|
|
length: 4,
|
|
...overrides
|
|
};
|
|
|
|
const region = new KGMidiRegion(
|
|
defaults.id,
|
|
defaults.trackId,
|
|
defaults.trackIndex,
|
|
defaults.name,
|
|
defaults.startFromBeat,
|
|
defaults.length
|
|
);
|
|
|
|
// Add notes if provided
|
|
if (overrides.notes) {
|
|
overrides.notes.forEach(note => region.addNote(note));
|
|
}
|
|
if (overrides.pitchBends) {
|
|
overrides.pitchBends.forEach(pitchBend => region.addPitchBend(pitchBend));
|
|
}
|
|
if (overrides.controllerEventsByType) {
|
|
region.setControllerEventsByType(overrides.controllerEventsByType);
|
|
}
|
|
|
|
return region;
|
|
};
|
|
|
|
export const createMockMidiPitchBend = (overrides: Partial<{
|
|
id: string
|
|
beat: number
|
|
value: number
|
|
}> = {}): KGMidiPitchBend => {
|
|
const defaults = {
|
|
id: 'test-bend-1',
|
|
beat: 0,
|
|
value: 8192,
|
|
...overrides,
|
|
};
|
|
|
|
return new KGMidiPitchBend(defaults.id, defaults.beat, defaults.value);
|
|
};
|
|
|
|
export const createMockMidiControllerEvent = (overrides: Partial<{
|
|
id: string
|
|
beat: number
|
|
value: number
|
|
}> = {}): KGMidiControllerEvent => {
|
|
const defaults = {
|
|
id: 'test-controller-1',
|
|
beat: 0,
|
|
value: 127,
|
|
...overrides,
|
|
};
|
|
|
|
return new KGMidiControllerEvent(defaults.id, defaults.beat, defaults.value);
|
|
};
|
|
|
|
export const createMockMidiTrack = (overrides: Partial<{
|
|
name: string
|
|
id: number
|
|
instrument: string
|
|
volume: number
|
|
regions: KGMidiRegion[]
|
|
}> = {}): KGMidiTrack => {
|
|
const defaults = {
|
|
name: 'Test Track',
|
|
id: 0,
|
|
instrument: 'acoustic_grand_piano' as const,
|
|
volume: 0.8,
|
|
...overrides
|
|
};
|
|
|
|
const track = new KGMidiTrack(
|
|
defaults.name,
|
|
defaults.id,
|
|
defaults.instrument as keyof typeof import('../../constants/generalMidiConstants').FLUIDR3_INSTRUMENT_MAP,
|
|
defaults.volume
|
|
);
|
|
|
|
// Add regions if provided
|
|
if (overrides.regions) {
|
|
track.setRegions(overrides.regions);
|
|
}
|
|
|
|
return track;
|
|
};
|
|
|
|
export const createMockProject = (overrides: Partial<{
|
|
name: string
|
|
bpm: number
|
|
timeSignature: { numerator: number; denominator: number }
|
|
tracks: KGMidiTrack[]
|
|
}> = {}): KGProject => {
|
|
const defaults = {
|
|
name: 'Test Project',
|
|
bpm: 120,
|
|
timeSignature: { numerator: 4, denominator: 4 },
|
|
tracks: [],
|
|
...overrides
|
|
};
|
|
|
|
const project = new KGProject(
|
|
defaults.name,
|
|
32, // maxBars
|
|
0, // currentBars
|
|
defaults.bpm,
|
|
defaults.timeSignature,
|
|
'C major', // keySignature
|
|
'ionian', // selectedMode
|
|
false, // isLooping
|
|
[0, 0], // loopingRange
|
|
1, // barWidthMultiplier
|
|
defaults.tracks, // tracks
|
|
KGProject.CURRENT_PROJECT_STRUCTURE_VERSION // projectStructureVersion
|
|
);
|
|
|
|
return project;
|
|
};
|
|
|
|
// Common test scenarios
|
|
export const createBasicProjectWithTrack = (): { project: KGProject; track: KGMidiTrack; region: KGMidiRegion } => {
|
|
const notes = [
|
|
createMockMidiNote({ pitch: 60, startBeat: 0, endBeat: 1 }),
|
|
createMockMidiNote({ pitch: 64, startBeat: 1, endBeat: 2 }),
|
|
];
|
|
|
|
const region = createMockMidiRegion({
|
|
id: 'region-1',
|
|
trackId: 'track-1',
|
|
notes
|
|
});
|
|
|
|
const track = createMockMidiTrack({
|
|
id: 1,
|
|
name: 'Track 1',
|
|
regions: [region]
|
|
});
|
|
|
|
const project = createMockProject({
|
|
name: 'Basic Test Project',
|
|
tracks: [track]
|
|
});
|
|
|
|
return { project, track, region };
|
|
};
|