// 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, }; 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); } }