Files
KGStudio/src/components/piano-roll/pianoRollSnap.ts
T

54 lines
1.4 KiB
TypeScript

import { DEBUG_MODE } from '../../constants';
export function getSnapStep(currentSnap: string): number | null {
if (currentSnap === 'NO SNAP') {
return null;
}
const denominator = parseInt(currentSnap.split('/')[1], 10);
if (Number.isNaN(denominator)) {
return null;
}
return 4 / denominator;
}
export function getSnappedBeatPosition(
beatPosition: number,
currentSnap: string,
useFloorSnapping: boolean = false,
): number {
const snapStep = getSnapStep(currentSnap);
if (snapStep === null) {
return beatPosition;
}
const snappedPosition = useFloorSnapping
? Math.floor(beatPosition / snapStep) * snapStep
: Math.round(beatPosition / snapStep) * snapStep;
if (DEBUG_MODE.PIANO_ROLL) {
console.log(
`Snapping (${useFloorSnapping ? 'floor' : 'round'}): ${beatPosition} -> ${snappedPosition} (snap: ${currentSnap}, step: ${snapStep})`,
);
}
return snappedPosition;
}
export function getSnappedLength(length: number, currentSnap: string, minimumLength: number): number {
const snapStep = getSnapStep(currentSnap);
if (snapStep === null) {
return length;
}
const snappedLength = Math.round(length / snapStep) * snapStep;
const finalLength = Math.max(minimumLength, snappedLength);
if (DEBUG_MODE.PIANO_ROLL) {
console.log(`Length snapping: ${length} -> ${finalLength} (snap: ${currentSnap}, step: ${snapStep})`);
}
return finalLength;
}