feat: implemented global marker track

This commit is contained in:
Xiaohan-Tian
2026-05-23 12:56:43 -07:00
parent 7ca2cb0d05
commit fb3c6cde70
27 changed files with 1566 additions and 38 deletions
+16
View File
@@ -0,0 +1,16 @@
import { Expose } from 'class-transformer';
import { GlobalTrackType, KGGlobalTrack } from './KGGlobalTrack';
export class KGChordTrack extends KGGlobalTrack {
@Expose()
protected override __type: string = 'KGChordTrack';
constructor(id: string = 'global-chord', trackIndex: number = 3, name: string = 'Chord') {
super(id, trackIndex, GlobalTrackType.Chord, name, []);
this.__type = 'KGChordTrack';
}
public override getCurrentType(): string {
return 'KGChordTrack';
}
}
+115
View File
@@ -0,0 +1,115 @@
import { Expose, Type } from 'class-transformer';
import { KGGlobalRegion } from '../region/KGGlobalRegion';
import { KGMarkerRegion } from '../region/KGMarkerRegion';
export enum GlobalTrackType {
Marker = 'marker',
Tempo = 'tempo',
Signature = 'signature',
Chord = 'chord',
}
export class KGGlobalTrack {
@Expose()
protected __type: string = 'KGGlobalTrack';
@Expose()
protected id: string = '';
@Expose()
protected trackIndex: number = 0;
@Expose()
protected type: GlobalTrackType = GlobalTrackType.Marker;
@Expose()
protected name: string = '';
@Expose()
@Type(() => KGGlobalRegion, {
discriminator: {
property: '__type',
subTypes: [
{ value: KGGlobalRegion, name: 'KGGlobalRegion' },
{ value: KGMarkerRegion, name: 'KGMarkerRegion' },
],
},
})
protected regions: KGGlobalRegion[] = [];
constructor(
id: string = '',
trackIndex: number = 0,
type: GlobalTrackType = GlobalTrackType.Marker,
name: string = '',
regions: KGGlobalRegion[] = []
) {
this.id = id;
this.trackIndex = trackIndex;
this.type = type;
this.name = name;
this.regions = regions;
}
public getId(): string {
return this.id;
}
public setId(id: string): void {
this.id = id;
}
public getTrackIndex(): number {
return this.trackIndex;
}
public setTrackIndex(trackIndex: number): void {
this.trackIndex = trackIndex;
this.regions.forEach(region => {
region.setTrackIndex(trackIndex);
region.setTrackId(this.id);
});
}
public getType(): GlobalTrackType {
return this.type;
}
public setType(type: GlobalTrackType): void {
this.type = type;
}
public getName(): string {
return this.name;
}
public setName(name: string): void {
this.name = name;
}
public getRegions(): KGGlobalRegion[] {
return this.regions;
}
public setRegions(regions: KGGlobalRegion[]): void {
this.regions = regions.map(region => {
region.setTrackId(this.id);
region.setTrackIndex(this.trackIndex);
return region;
});
}
public addRegion(region: KGGlobalRegion): void {
region.setTrackId(this.id);
region.setTrackIndex(this.trackIndex);
this.regions.push(region);
}
public removeRegion(regionId: string): void {
this.regions = this.regions.filter(region => region.getId() !== regionId);
}
public getCurrentType(): string {
return 'KGGlobalTrack';
}
}
+16
View File
@@ -0,0 +1,16 @@
import { Expose } from 'class-transformer';
import { GlobalTrackType, KGGlobalTrack } from './KGGlobalTrack';
export class KGMarkerTrack extends KGGlobalTrack {
@Expose()
protected override __type: string = 'KGMarkerTrack';
constructor(id: string = 'global-marker', trackIndex: number = 0, name: string = 'Marker') {
super(id, trackIndex, GlobalTrackType.Marker, name, []);
this.__type = 'KGMarkerTrack';
}
public override getCurrentType(): string {
return 'KGMarkerTrack';
}
}
+16
View File
@@ -0,0 +1,16 @@
import { Expose } from 'class-transformer';
import { GlobalTrackType, KGGlobalTrack } from './KGGlobalTrack';
export class KGSignatureTrack extends KGGlobalTrack {
@Expose()
protected override __type: string = 'KGSignatureTrack';
constructor(id: string = 'global-signature', trackIndex: number = 2, name: string = 'Signature') {
super(id, trackIndex, GlobalTrackType.Signature, name, []);
this.__type = 'KGSignatureTrack';
}
public override getCurrentType(): string {
return 'KGSignatureTrack';
}
}
+16
View File
@@ -0,0 +1,16 @@
import { Expose } from 'class-transformer';
import { GlobalTrackType, KGGlobalTrack } from './KGGlobalTrack';
export class KGTempoTrack extends KGGlobalTrack {
@Expose()
protected override __type: string = 'KGTempoTrack';
constructor(id: string = 'global-tempo', trackIndex: number = 1, name: string = 'Tempo') {
super(id, trackIndex, GlobalTrackType.Tempo, name, []);
this.__type = 'KGTempoTrack';
}
public override getCurrentType(): string {
return 'KGTempoTrack';
}
}
@@ -0,0 +1,14 @@
import { KGChordTrack } from './KGChordTrack';
import { KGGlobalTrack } from './KGGlobalTrack';
import { KGMarkerTrack } from './KGMarkerTrack';
import { KGSignatureTrack } from './KGSignatureTrack';
import { KGTempoTrack } from './KGTempoTrack';
export function createDefaultGlobalTracks(): KGGlobalTrack[] {
return [
new KGMarkerTrack(),
new KGTempoTrack(),
new KGSignatureTrack(),
new KGChordTrack(),
];
}
+6
View File
@@ -0,0 +1,6 @@
export { KGGlobalTrack, GlobalTrackType } from './KGGlobalTrack';
export { KGMarkerTrack } from './KGMarkerTrack';
export { KGTempoTrack } from './KGTempoTrack';
export { KGSignatureTrack } from './KGSignatureTrack';
export { KGChordTrack } from './KGChordTrack';
export { createDefaultGlobalTracks } from './createDefaultGlobalTracks';