midi-player-demo / src /common /transform /NoteCoordTransform.ts
Yann
test
f23825d
raw
history blame
2.38 kB
import { IPoint } from "../geometry"
import { NoteEvent } from "../track"
import { NotePoint } from "./NotePoint"
export default class NoteCoordTransform {
private _pixelsPerTick: number
private _pixelsPerKey: number
private _maxNoteNumber: number
constructor(
pixelsPerTick: number,
pixelsPerKey: number,
maxNoteNumber: number,
) {
this._pixelsPerTick = pixelsPerTick
this._pixelsPerKey = pixelsPerKey
this._maxNoteNumber = maxNoteNumber
}
// pixels
getX(tick: number) {
return tick * this._pixelsPerTick
}
getY(noteNumber: number) {
return (this._maxNoteNumber - noteNumber) * this._pixelsPerKey
}
getDeltaY(deltaNoteNumber: number) {
return -deltaNoteNumber * this._pixelsPerKey
}
get pixelsPerTick() {
return this._pixelsPerTick
}
// ticks
getTicks(pixels: number) {
return pixels / this._pixelsPerTick
}
getNoteNumber(pixels: number) {
return Math.ceil(this.getNoteNumberFractional(pixels))
}
getNoteNumberFractional(pixels: number) {
return this._maxNoteNumber - pixels / this._pixelsPerKey
}
getDeltaNoteNumber(deltaPixels: number) {
return -deltaPixels / this._pixelsPerKey
}
get maxNoteNumber() {
return this._maxNoteNumber
}
get numberOfKeys() {
return this._maxNoteNumber + 1
}
get pixelsPerKey() {
return this._pixelsPerKey
}
//
getMaxY() {
return (this._maxNoteNumber + 1) * this._pixelsPerKey
}
getRect(note: NoteEvent) {
return {
x: this.getX(note.tick),
y: this.getY(note.noteNumber),
width: this.getX(note.duration),
height: this._pixelsPerKey,
}
}
getDrumRect(note: NoteEvent) {
return {
x: this.getX(note.tick) - this._pixelsPerKey / 2,
y: this.getY(note.noteNumber),
width: this._pixelsPerKey,
height: this._pixelsPerKey,
}
}
getNotePoint(pos: IPoint): NotePoint {
return {
tick: this.getTicks(pos.x),
noteNumber: this.getNoteNumber(pos.y),
}
}
getNotePointFractional(pos: IPoint): NotePoint {
return {
tick: this.getTicks(pos.x),
noteNumber: this.getNoteNumberFractional(pos.y),
}
}
equals(t: NoteCoordTransform) {
return (
this.pixelsPerKey === t.pixelsPerKey &&
this.pixelsPerTick === t.pixelsPerTick &&
this.maxNoteNumber === t.maxNoteNumber
)
}
}