feat: implemented editable automation lane in piano roll window
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user