54 lines
1.4 KiB
TypeScript
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;
|
|
}
|