///
declare namespace Heartbeat {
export interface SongPosition {
bar?: number;
beat?: number;
sixteenth?: number;
tick?: number;
ticks: number;
timestamp: number;
barsAsString: string;
activeColumn: number;
}
export type Listener = {
[key: string]: any;
};
export interface Song {
ppq: number;
nominator: number;
denominator: number;
beat: number;
sixteenth: number;
tick: number;
ticks: number;
percentage: number;
activeNotes: MIDIEvent[];
id: string;
name: string;
loop: boolean;
bpm: number;
durationTicks: number;
durationMillis: number;
millisPerTick: number;
millis: number;
parts: Part[];
tracks: Track[];
listeners: Listener;
loopEndPosition: SongPosition;
bars: number; // number of bars in Song
bar: number; // current bar position
barsAsString: string; // current position in bars
events: Array;
timeEvents: Array;
notes: Array;
useMetronome: boolean;
play: () => void;
pause: () => void;
stop: () => void;
update: (updateTimeEvents?: boolean) => void;
setTempo: (bpm: number, update?: boolean) => void;
addEventListener: (event: string, typeOrCallback: any, callback?: (arg?: any) => void) => void;
addMidiEventListener: (event: string, callback: (arg?: any) => void) => void;
removeEventListener: (type: string) => void;
setLoop: (loop?: boolean) => void;
setLeftLocator: (type: string, bar: number, beat?: number, sixteenth?: number, tick?: number) => void;
setRightLocator: (type: string, bar: number, beat?: number, sixteenth?: number, tick?: number) => void;
addEvents: (events: Array) => void;
addTimeEvents: (events: Array) => void;
removeTimeEvents: () => void;
setTrackSolo: (t: Track, f: boolean) => void;
getPosition: (arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any) => SongPosition;
addTrack: (t: Track) => void;
setVolume: (val: any) => void;
paused: boolean;
playing: boolean;
setPlayhead: (type: string, value: number) => void;
playhead: Playhead;
}
export interface Playhead {
data: {
timeAsString: string;
barsAsString: string;
millis: number;
};
activeNotes: MIDINote[];
}
export interface MIDIEvent {
id: string;
bar: number;
type: number;
data1: number;
data2: number;
ticks: number;
command: number;
noteName: string;
noteNumber: number;
velocity: number;
midiNote: MIDINote;
muted: boolean;
song: null | Song;
track: null | Track;
trackId: string;
part: null | Part;
clone: () => this;
transpose: (semi: number) => void;
active?: boolean;
}
export type Note = {
name: string;
octave: number;
fullName: string;
number: number;
frequency: number;
blackKey: boolean;
};
export interface MIDINote extends MIDIEvent {
trackId: string;
track: Track;
number: number;
noteOn: MIDIEvent;
noteOff: MIDIEvent;
durationTicks: number;
note: Note;
mute: (flag: boolean) => void;
active?: boolean;
}
export interface Part {
id: string;
name: string;
events: Array;
needsUpdate: boolean;
eventsById: { [id: string]: MIDIEvent };
addEvents: (events: Array) => void;
removeEvents: (events: Array, part?: Part) => void;
transposeAllEvents: (semi: number) => void;
bbox: {
x: number;
y: number;
width: number;
height: number;
};
}
export type Track = {
id: string;
name: string;
parts: Array;
events: Array;
needsUpdate: boolean;
partsById: { [id: string]: Part };
audioLatency: number;
monitor: boolean;
mute: boolean;
addPart: (part: Part) => void;
addPartAt: (part: Part, type: [string, number]) => void;
removeEvents: (events: Array) => void;
removeAllEvents: () => void;
processMidiEvent: (event: MIDIEvent | Array) => void;
setMidiInput: (id: string, flag: boolean) => void;
setMidiOutput: (id: string, flag: boolean) => void;
setInstrument: (id: string) => void;
removePart: (part: Part) => void;
update: () => void;
};
export type InstrumentMapping = {
[id: string]: {
[id: string]: string;
};
};
export interface Instrument {
name: string;
mapping: InstrumentMapping;
}
export interface AssetPack {
instruments: Array;
midifiles: Array;
}
export interface MIDIPortsObject {
[id: string]: WebMidi.MIDIPort;
}
export interface MIDIFileJSON {
id: string;
url: string;
name: string;
ppq: number;
bpm: number;
nominator: number;
denominator: number;
tracks: Array