mmpSearch/assets/js/creations/state.js

132 lines
3.7 KiB
JavaScript

// js/state.js
import { initializePatternState } from "./pattern/pattern_state.js";
import { audioState, initializeAudioState } from "./audio/audio_state.js";
import { DEFAULT_VOLUME, DEFAULT_PAN } from "./config.js";
// Estado global da aplicação
const globalState = {
sliceToolActive: false,
isPlaying: false,
isAudioEditorPlaying: false,
playbackIntervalId: null,
currentStep: 0,
metronomeEnabled: false,
originalXmlDoc: null,
currentBeatBasslineName: "Novo Projeto",
masterVolume: DEFAULT_VOLUME,
masterPan: DEFAULT_PAN,
zoomLevelIndex: 2,
isLoopActive: false,
loopStartTime: 0,
loopEndTime: 8,
resizeMode: "trim",
selectedClipId: null,
isRecording: false,
clipboard: null,
lastRulerClickTime: 0,
justReset: false,
};
// --- ADICIONE ESTE BLOCO ---
// Define o ESTADO INICIAL para o pattern module
const patternState = {
tracks: [],
activeTrackId: null,
activePatternIndex: 0,
};
// --- FIM DA ADIÇÃO ---
// Combina todos os estados em um único objeto namespaced
export let appState = {
global: globalState,
pattern: patternState, // <-- AGORA 'patternState' está definido
audio: audioState,
};
window.appState = appState;
export function resetProjectState() {
console.log("Executando resetProjectState completo...");
// 1. Reseta o estado global para os padrões
Object.assign(appState.global, {
sliceToolActive: false,
isPlaying: false,
isAudioEditorPlaying: false,
playbackIntervalId: null,
currentStep: 0,
metronomeEnabled: false,
originalXmlDoc: null,
currentBeatBasslineName: "Novo Projeto",
masterVolume: DEFAULT_VOLUME,
masterPan: DEFAULT_PAN,
zoomLevelIndex: 2,
isLoopActive: false,
loopStartTime: 0,
loopEndTime: 8,
resizeMode: "trim",
selectedClipId: null,
isRecording: false,
clipboard: null,
lastRulerClickTime: 0,
justReset: false,
});
// 2. Reseta o estado do pattern
Object.assign(appState.pattern, {
tracks: [],
activeTrackId: null,
activePatternIndex: 0,
});
// 3. Reseta o estado de áudio (A PARTE QUE FALTAVA)
// Isso limpa appState.audio.clips e appState.audio.tracks
initializeAudioState(); //
}
export function saveStateToSession() {
if (!window.ROOM_NAME) return;
// 1. Crie uma versão "limpa" dos tracks, contendo APENAS dados
const cleanTracks = appState.pattern.tracks.map((track) => {
// Este novo objeto só contém dados que o JSON entende
return {
id: track.id,
name: track.name,
samplePath: track.samplePath,
patterns: track.patterns, // Isto é seguro (arrays de arrays/booleanos)
activePatternIndex: track.activePatternIndex,
volume: track.volume, // O número (0-1)
pan: track.pan, // O número (-1 to 1)
instrumentName: track.instrumentName,
instrumentXml: track.instrumentXml,
// *** OBJETOS TONE.JS EXCLUÍDOS ***:
// track.volumeNode, track.pannerNode, track.player
};
});
// 2. Construa o objeto de estado final para salvar
const stateToSave = {
pattern: {
...appState.pattern, // Copia outras propriedades (ex: activeTrackId)
tracks: cleanTracks, // Usa a nossa versão limpa dos tracks
},
global: {
bpm: document.getElementById("bpm-input").value,
compassoA: document.getElementById("compasso-a-input").value,
compassoB: document.getElementById("compasso-b-input").value,
bars: document.getElementById("bars-input").value,
},
};
// 3. Agora o stringify vai funcionar
try {
const roomName = window.ROOM_NAME || "default_room";
sessionStorage.setItem(
`temp_state_${roomName}`,
JSON.stringify(stateToSave)
);
} catch (e) {
console.error("Falha ao salvar estado na sessão:", e);
}
}