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 ) } }