versão 2.0.1 - Correção do grid (Editor de Samples), loop, delete, resize, trim e streching funcionais
This commit is contained in:
1 parent
352ceecec8
commit
b3f0d13b90
9 files changed
+856
-250
No files matched your search
@@ -2,14 +2,69 @@
|
||||
import { appState } from './state.js';
|
||||
import { PIXELS_PER_STEP, ZOOM_LEVELS } from './config.js';
|
||||
|
||||
/**
|
||||
* Helper interna para ler o BPM do input.
|
||||
* @returns {number} O BPM atual.
|
||||
*/
|
||||
function _getBpm() {
|
||||
const bpmInput = document.getElementById("bpm-input");
|
||||
return parseFloat(bpmInput.value, 10) || 120;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcula e exporta quantos compassos (beats) existem por compasso (bar).
|
||||
* @returns {number} O número de batidas por compasso (ex: 4 para 4/4).
|
||||
*/
|
||||
export function getBeatsPerBar() {
|
||||
const compassoAInput = document.getElementById("compasso-a-input");
|
||||
return parseInt(compassoAInput.value, 10) || 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcula e exporta quantos segundos dura uma "batida" (beat).
|
||||
* No contexto de BPM, uma "batida" é quase sempre uma semínima (1/4).
|
||||
* @returns {number} Duração da batida em segundos.
|
||||
*/
|
||||
export function getSecondsPerBeat() {
|
||||
return 60.0 / _getBpm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calcula e exporta quantos segundos dura um "step".
|
||||
* Baseado na config, um "step" é uma semicolcheia (1/16).
|
||||
* Há 4 steps (1/16) por batida (1/4).
|
||||
* @returns {number} Duração do step em segundos.
|
||||
*/
|
||||
export function getSecondsPerStep() {
|
||||
return getSecondsPerBeat() / 4.0; // 4 steps (1/16) por beat (1/4)
|
||||
}
|
||||
|
||||
/**
|
||||
* Quantiza (arredonda) um tempo em segundos para o "step" do grid mais próximo.
|
||||
* @param {number} timeInSeconds - O tempo arbitrário (ex: 1.234s).
|
||||
* @returns {number} O tempo alinhado ao grid (ex: 1.250s).
|
||||
*/
|
||||
export function quantizeTime(timeInSeconds) {
|
||||
// TODO: Adicionar um toggle global (appState.global.isSnapEnabled)
|
||||
|
||||
const secondsPerStep = getSecondsPerStep();
|
||||
if (secondsPerStep <= 0) return timeInSeconds; // Evita divisão por zero
|
||||
|
||||
const roundedSteps = Math.round(timeInSeconds / secondsPerStep);
|
||||
return roundedSteps * secondsPerStep;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Calcula a quantidade de pixels que representa um segundo na timeline,
|
||||
* levando em conta o BPM e o nível de zoom atual.
|
||||
* @returns {number} A quantidade de pixels por segundo.
|
||||
*/
|
||||
export function getPixelsPerSecond() {
|
||||
const bpm = parseInt(document.getElementById("bpm-input").value, 10) || 120;
|
||||
const stepsPerSecond = (bpm / 60) * 4;
|
||||
const bpm = _getBpm(); // Usa a helper interna
|
||||
// (bpm / 60) = batidas por segundo
|
||||
// * 4 = steps por segundo (assumindo 4 steps/beat)
|
||||
const stepsPerSecond = (bpm / 60) * 4;
|
||||
const zoomFactor = ZOOM_LEVELS[appState.global.zoomLevelIndex];
|
||||
return stepsPerSecond * PIXELS_PER_STEP * zoomFactor;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user