83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import { KGCommand } from '../KGCommand';
|
|
import { KGCore } from '../../KGCore';
|
|
import { KGMidiPitchBend } from '../../midi/KGMidiPitchBend';
|
|
import { KGMidiRegion } from '../../region/KGMidiRegion';
|
|
import { KGTrack } from '../../track/KGTrack';
|
|
|
|
interface PitchBendSnapshot {
|
|
pitchBendId: string;
|
|
beat: number;
|
|
value: number;
|
|
}
|
|
|
|
interface PitchBendUpdate {
|
|
pitchBendId: string;
|
|
beat?: number;
|
|
value?: number;
|
|
}
|
|
|
|
export class UpdatePitchBendPropertiesCommand extends KGCommand {
|
|
private regionId: string;
|
|
private snapshots: PitchBendSnapshot[];
|
|
private updates: PitchBendUpdate[];
|
|
private targetRegion: KGMidiRegion | null = null;
|
|
private parentTrack: KGTrack | null = null;
|
|
|
|
constructor(regionId: string, snapshots: PitchBendSnapshot[], updates: PitchBendUpdate[]) {
|
|
super();
|
|
this.regionId = regionId;
|
|
this.snapshots = [...snapshots];
|
|
this.updates = [...updates];
|
|
}
|
|
|
|
execute(): void {
|
|
const tracks = KGCore.instance().getCurrentProject().getTracks();
|
|
|
|
for (const track of tracks) {
|
|
const region = track.getRegions().find(r => r.getId() === this.regionId) as KGMidiRegion | undefined;
|
|
if (region) {
|
|
this.targetRegion = region;
|
|
this.parentTrack = track;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!this.targetRegion) {
|
|
throw new Error(`Region with ID ${this.regionId} not found`);
|
|
}
|
|
|
|
const pitchBends = this.targetRegion.getPitchBends();
|
|
for (const update of this.updates) {
|
|
const pitchBend = pitchBends.find(candidate => candidate.getId() === update.pitchBendId);
|
|
if (pitchBend) {
|
|
if (update.beat !== undefined) pitchBend.setBeat(update.beat);
|
|
if (update.value !== undefined) pitchBend.setValue(update.value);
|
|
}
|
|
}
|
|
}
|
|
|
|
undo(): void {
|
|
if (!this.targetRegion) {
|
|
throw new Error('Cannot undo: command was not executed');
|
|
}
|
|
|
|
const pitchBends = this.targetRegion.getPitchBends();
|
|
this.snapshots.forEach(snapshot => {
|
|
const pitchBend = pitchBends.find(candidate => candidate.getId() === snapshot.pitchBendId);
|
|
if (pitchBend) {
|
|
pitchBend.setBeat(snapshot.beat);
|
|
pitchBend.setValue(snapshot.value);
|
|
}
|
|
});
|
|
}
|
|
|
|
getDescription(): string {
|
|
const count = this.snapshots.length;
|
|
return count === 1 ? 'Update pitch bend properties' : `Update ${count} pitch bends' properties`;
|
|
}
|
|
|
|
public getParentTrack(): KGTrack | null {
|
|
return this.parentTrack;
|
|
}
|
|
}
|