feat: implemented editable automation lane in piano roll window

This commit is contained in:
Xiaohan-Tian
2026-05-08 14:39:45 -07:00
parent eead27dbd8
commit 6e5d9466f4
7 changed files with 1010 additions and 179 deletions
@@ -0,0 +1,53 @@
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;
}