plugin v1.0.1
Deploy / Deploy (push) Successful in 1m14s
Details
Deploy / Deploy (push) Successful in 1m14s
Details
This commit is contained in:
parent
ef0b8428f7
commit
0947156d7e
|
|
@ -305,65 +305,10 @@ export async function parseMmpContent(xmlString) {
|
||||||
appState.pattern.activeTrackId = appState.pattern.tracks[0]?.id || null;
|
appState.pattern.activeTrackId = appState.pattern.tracks[0]?.id || null;
|
||||||
appState.pattern.activePatternIndex = 0;
|
appState.pattern.activePatternIndex = 0;
|
||||||
|
|
||||||
// --- Restauração de Sessão (F5) ---
|
// --- SUBSTUIÇÃO DO BLOCO DE RESTAURAÇÃO ---
|
||||||
try {
|
// Em vez daquele bloco try/catch gigante, apenas chamamos a função:
|
||||||
const roomName = window.ROOM_NAME || "default_room";
|
loadStateFromSession();
|
||||||
const tempStateJSON = sessionStorage.getItem(`temp_state_${roomName}`);
|
// ------------------------------------------
|
||||||
|
|
||||||
if (tempStateJSON) {
|
|
||||||
console.log("Restaurando estado temporário da sessão...");
|
|
||||||
const tempState = JSON.parse(tempStateJSON);
|
|
||||||
|
|
||||||
// 1. Restaura Pattern (mantido)
|
|
||||||
appState.pattern.tracks.forEach((liveTrack) => {
|
|
||||||
const savedTrack = tempState.pattern.tracks.find(
|
|
||||||
(t) => t.id === liveTrack.id
|
|
||||||
);
|
|
||||||
if (savedTrack) {
|
|
||||||
liveTrack.name = savedTrack.name;
|
|
||||||
liveTrack.patterns = savedTrack.patterns;
|
|
||||||
liveTrack.activePatternIndex = savedTrack.activePatternIndex;
|
|
||||||
liveTrack.volume = savedTrack.volume;
|
|
||||||
liveTrack.pan = savedTrack.pan;
|
|
||||||
if (liveTrack.volumeNode) {
|
|
||||||
liveTrack.volumeNode.volume.value = Tone.gainToDb(savedTrack.volume);
|
|
||||||
}
|
|
||||||
if (liveTrack.pannerNode) {
|
|
||||||
liveTrack.pannerNode.pan.value = savedTrack.pan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
appState.pattern.tracks = appState.pattern.tracks.filter((liveTrack) =>
|
|
||||||
tempState.pattern.tracks.some((t) => t.id === liveTrack.id)
|
|
||||||
);
|
|
||||||
|
|
||||||
// 2. 🔥 NOVO: Restaura Áudio (Clips e Tracks) no F5
|
|
||||||
if (tempState.audio) {
|
|
||||||
console.log("Restaurando faixas de áudio e clips...");
|
|
||||||
appState.audio.tracks = tempState.audio.tracks || [];
|
|
||||||
appState.audio.clips = tempState.audio.clips || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Restaura Global (mantido)
|
|
||||||
document.getElementById("bpm-input").value = tempState.global.bpm;
|
|
||||||
document.getElementById("compasso-a-input").value = tempState.global.compassoA;
|
|
||||||
document.getElementById("compasso-b-input").value = tempState.global.compassoB;
|
|
||||||
document.getElementById("bars-input").value = tempState.global.bars;
|
|
||||||
|
|
||||||
if (tempState.global.syncMode) {
|
|
||||||
appState.global.syncMode = tempState.global.syncMode;
|
|
||||||
const syncBtn = document.getElementById("sync-mode-btn");
|
|
||||||
if (syncBtn) {
|
|
||||||
syncBtn.classList.toggle("active", tempState.global.syncMode === "global");
|
|
||||||
syncBtn.textContent = tempState.global.syncMode === "global" ? "Global" : "Local";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
appState.pattern.activeTrackId = tempState.pattern.activeTrackId;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error("Erro ao restaurar sessão:", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
await Promise.resolve();
|
await Promise.resolve();
|
||||||
renderAll();
|
renderAll();
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
// js/state.js
|
// js/state.js
|
||||||
import { initializePatternState } from "./pattern/pattern_state.js";
|
import { initializePatternState } from "./pattern/pattern_state.js";
|
||||||
import { audioState, initializeAudioState, getAudioSnapshot, applyAudioSnapshot } from "./audio/audio_state.js";
|
import { audioState, initializeAudioState } from "./audio/audio_state.js";
|
||||||
import { DEFAULT_VOLUME, DEFAULT_PAN } from "./config.js";
|
import { DEFAULT_VOLUME, DEFAULT_PAN } from "./config.js";
|
||||||
import { generateMmpFile } from "./file.js"; // Vamos usar uma adaptação disto ou criar um helper
|
import * as Tone from "https://esm.sh/tone"; // Adicione esta importação
|
||||||
import { parseMmpContent } from "./file.js"; // Importante para restaurar o XML
|
|
||||||
|
|
||||||
// Estado global da aplicação
|
// Estado global da aplicação
|
||||||
const globalState = {
|
const globalState = {
|
||||||
|
|
@ -27,14 +26,9 @@ const globalState = {
|
||||||
clipboard: null,
|
clipboard: null,
|
||||||
lastRulerClickTime: 0,
|
lastRulerClickTime: 0,
|
||||||
justReset: false,
|
justReset: false,
|
||||||
// Configs Globais que devem persistir
|
|
||||||
bpm: 140,
|
|
||||||
compassoA: 4,
|
|
||||||
compassoB: 4,
|
|
||||||
bars: 1,
|
|
||||||
syncMode: "global" // Adicionado para persistir a escolha
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Define o ESTADO INICIAL para o pattern module
|
||||||
const patternState = {
|
const patternState = {
|
||||||
tracks: [],
|
tracks: [],
|
||||||
activeTrackId: null,
|
activeTrackId: null,
|
||||||
|
|
@ -44,7 +38,7 @@ const patternState = {
|
||||||
// Combina todos os estados em um único objeto namespaced
|
// Combina todos os estados em um único objeto namespaced
|
||||||
export let appState = {
|
export let appState = {
|
||||||
global: globalState,
|
global: globalState,
|
||||||
pattern: patternState,
|
pattern: patternState,
|
||||||
audio: audioState,
|
audio: audioState,
|
||||||
};
|
};
|
||||||
window.appState = appState;
|
window.appState = appState;
|
||||||
|
|
@ -83,28 +77,26 @@ export function resetProjectState() {
|
||||||
activePatternIndex: 0,
|
activePatternIndex: 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3. 🔥 CRÍTICO: Reseta o estado de áudio na força bruta
|
// 3. Reseta o estado de áudio (Força bruta para garantir limpeza na memória)
|
||||||
// Isso garante que os arrays fiquem vazios ANTES de qualquer salvamento de sessão
|
|
||||||
if (appState.audio) {
|
if (appState.audio) {
|
||||||
appState.audio.tracks = [];
|
appState.audio.tracks = [];
|
||||||
appState.audio.clips = [];
|
appState.audio.clips = [];
|
||||||
appState.audio.audioEditorSeekTime = 0;
|
appState.audio.audioEditorSeekTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Chama a função original para garantir reinicialização de contextos se houver
|
|
||||||
initializeAudioState();
|
initializeAudioState();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function saveStateToSession() {
|
export function saveStateToSession() {
|
||||||
if (!window.ROOM_NAME) return;
|
if (!window.ROOM_NAME) return;
|
||||||
|
|
||||||
// 1. Limpa Tracks do Pattern
|
// 1. Crie uma versão "limpa" dos tracks
|
||||||
const cleanTracks = appState.pattern.tracks.map((track) => {
|
const cleanTracks = appState.pattern.tracks.map((track) => {
|
||||||
return {
|
return {
|
||||||
id: track.id,
|
id: track.id,
|
||||||
name: track.name,
|
name: track.name,
|
||||||
samplePath: track.samplePath,
|
samplePath: track.samplePath,
|
||||||
patterns: track.patterns,
|
patterns: track.patterns,
|
||||||
activePatternIndex: track.activePatternIndex,
|
activePatternIndex: track.activePatternIndex,
|
||||||
volume: track.volume,
|
volume: track.volume,
|
||||||
pan: track.pan,
|
pan: track.pan,
|
||||||
|
|
@ -113,22 +105,21 @@ export function saveStateToSession() {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// 2. Constrói o objeto. 🔥 AQUI ADICIONAMOS O ÁUDIO
|
// 2. Construa o objeto de estado final para salvar
|
||||||
const stateToSave = {
|
const stateToSave = {
|
||||||
pattern: {
|
pattern: {
|
||||||
...appState.pattern,
|
...appState.pattern,
|
||||||
tracks: cleanTracks,
|
tracks: cleanTracks,
|
||||||
},
|
},
|
||||||
// Salva o estado de Áudio para o F5 funcionar
|
|
||||||
audio: {
|
audio: {
|
||||||
tracks: appState.audio.tracks || [],
|
tracks: appState.audio.tracks || [],
|
||||||
clips: appState.audio.clips || [],
|
clips: appState.audio.clips || [],
|
||||||
},
|
},
|
||||||
global: {
|
global: {
|
||||||
bpm: document.getElementById("bpm-input").value,
|
bpm: document.getElementById("bpm-input")?.value || 140,
|
||||||
compassoA: document.getElementById("compasso-a-input").value,
|
compassoA: document.getElementById("compasso-a-input")?.value || 4,
|
||||||
compassoB: document.getElementById("compasso-b-input").value,
|
compassoB: document.getElementById("compasso-b-input")?.value || 4,
|
||||||
bars: document.getElementById("bars-input").value,
|
bars: document.getElementById("bars-input")?.value || 1,
|
||||||
syncMode: appState.global.syncMode,
|
syncMode: appState.global.syncMode,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
@ -142,4 +133,79 @@ export function saveStateToSession() {
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Falha ao salvar estado na sessão:", e);
|
console.error("Falha ao salvar estado na sessão:", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- NOVA FUNÇÃO PARA CORRIGIR O ERRO ---
|
||||||
|
export function loadStateFromSession() {
|
||||||
|
const roomName = window.ROOM_NAME || "default_room";
|
||||||
|
const tempStateJSON = sessionStorage.getItem(`temp_state_${roomName}`);
|
||||||
|
|
||||||
|
if (!tempStateJSON) return false;
|
||||||
|
|
||||||
|
console.log("Restaurando estado da sessão...");
|
||||||
|
try {
|
||||||
|
const tempState = JSON.parse(tempStateJSON);
|
||||||
|
|
||||||
|
// 1. Restaura Pattern Tracks
|
||||||
|
appState.pattern.tracks.forEach((liveTrack) => {
|
||||||
|
const savedTrack = tempState.pattern.tracks.find(
|
||||||
|
(t) => t.id === liveTrack.id
|
||||||
|
);
|
||||||
|
if (savedTrack) {
|
||||||
|
liveTrack.name = savedTrack.name;
|
||||||
|
liveTrack.patterns = savedTrack.patterns;
|
||||||
|
liveTrack.activePatternIndex = savedTrack.activePatternIndex;
|
||||||
|
liveTrack.volume = savedTrack.volume;
|
||||||
|
liveTrack.pan = savedTrack.pan;
|
||||||
|
|
||||||
|
if (liveTrack.volumeNode) {
|
||||||
|
liveTrack.volumeNode.volume.value = Tone.gainToDb(savedTrack.volume);
|
||||||
|
}
|
||||||
|
if (liveTrack.pannerNode) {
|
||||||
|
liveTrack.pannerNode.pan.value = savedTrack.pan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Filtra tracks que não existem mais no salvo
|
||||||
|
appState.pattern.tracks = appState.pattern.tracks.filter((liveTrack) =>
|
||||||
|
tempState.pattern.tracks.some((t) => t.id === liveTrack.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
// 2. Restaura Áudio
|
||||||
|
if (tempState.audio) {
|
||||||
|
appState.audio.tracks = tempState.audio.tracks || [];
|
||||||
|
appState.audio.clips = tempState.audio.clips || [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Restaura Global
|
||||||
|
if (tempState.global) {
|
||||||
|
const bpmInput = document.getElementById("bpm-input");
|
||||||
|
if (bpmInput) bpmInput.value = tempState.global.bpm;
|
||||||
|
|
||||||
|
const compassoA = document.getElementById("compasso-a-input");
|
||||||
|
if (compassoA) compassoA.value = tempState.global.compassoA;
|
||||||
|
|
||||||
|
const compassoB = document.getElementById("compasso-b-input");
|
||||||
|
if (compassoB) compassoB.value = tempState.global.compassoB;
|
||||||
|
|
||||||
|
const barsInput = document.getElementById("bars-input");
|
||||||
|
if (barsInput) barsInput.value = tempState.global.bars;
|
||||||
|
|
||||||
|
if (tempState.global.syncMode) {
|
||||||
|
appState.global.syncMode = tempState.global.syncMode;
|
||||||
|
const syncBtn = document.getElementById("sync-mode-btn");
|
||||||
|
if (syncBtn) {
|
||||||
|
syncBtn.classList.toggle("active", tempState.global.syncMode === "global");
|
||||||
|
syncBtn.textContent = tempState.global.syncMode === "global" ? "Global" : "Local";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
appState.pattern.activeTrackId = tempState.pattern.activeTrackId;
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Erro ao carregar estado da sessão:", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue