From 96a7bd3f3ca10753cae5d0d6095f114263e77aeb Mon Sep 17 00:00:00 2001 From: JotaChina Date: Sat, 27 Dec 2025 19:53:47 -0300 Subject: [PATCH] adicionando instrumentos no editor de patterns --- assets/js/creations/pattern/pattern_state.js | 57 +++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/assets/js/creations/pattern/pattern_state.js b/assets/js/creations/pattern/pattern_state.js index 89c328f7..3ec6fdff 100755 --- a/assets/js/creations/pattern/pattern_state.js +++ b/assets/js/creations/pattern/pattern_state.js @@ -202,30 +202,61 @@ export async function loadAudioForTrack(track) { export function addTrackToState() { const totalSteps = getTotalSteps(); - const referenceTrack = appState.pattern.tracks[0]; + + // ✅ define o "pai" correto pra UI conseguir renderizar + const focusedId = appState.pattern.focusedBasslineId || null; + + let parentBasslineId = null; + if (focusedId) { + const basslineTrack = appState.pattern.tracks.find( + (t) => t.type === "bassline" && t.id === focusedId + ); + // mesmo critério do pattern_ui: srcId = instrumentSourceId || focusedId + parentBasslineId = basslineTrack?.instrumentSourceId || focusedId; + } else { + parentBasslineId = null; // IMPORTANTÍSSIMO: não deixar undefined + } + + // ✅ pega referência do mesmo pai (pra clonar patterns compatíveis) + const referenceTrack = + appState.pattern.tracks.find( + (t) => + t.type !== "bassline" && + (t.parentBasslineId ?? null) === parentBasslineId && + Array.isArray(t.patterns) && + t.patterns.length > 0 + ) || + appState.pattern.tracks.find( + (t) => t.type !== "bassline" && Array.isArray(t.patterns) && t.patterns.length > 0 + ) || + null; + const newId = Date.now() + Math.random(); const newTrack = { id: newId, - name: `Novo Instrumento ${appState.pattern.tracks.length + 1}`, + name: `Novo Instrumento ${appState.pattern.tracks.filter(t => t.type !== "bassline").length + 1}`, samplePath: null, - type: 'plugin', - - // 🔥 CORREÇÃO: Definir instrumento padrão (Kicker) e XML + type: "plugin", + + // ✅ AQUI a chave: agora a track entra no lugar certo (rack ou root) + parentBasslineId, + instrumentName: "kicker", instrumentXml: DEFAULT_KICKER_XML, - + player: null, buffer: null, + patterns: referenceTrack - ? referenceTrack.patterns.map(p => ({ + ? referenceTrack.patterns.map((p) => ({ name: p.name, - steps: new Array(p.steps.length).fill(false), + steps: new Array((p.steps?.length || totalSteps)).fill(false), notes: [], - pos: p.pos + pos: p.pos, })) : [{ name: "Pattern 1", steps: new Array(totalSteps).fill(false), notes: [], pos: 0 }], - + activePatternIndex: 0, volume: DEFAULT_VOLUME, pan: DEFAULT_PAN, @@ -235,16 +266,16 @@ export function addTrackToState() { newTrack.volumeNode.connect(newTrack.pannerNode); newTrack.pannerNode.connect(getMainGainNode()); - - // Carrega o áudio (vai cair no case "kicker" do loadAudioForTrack) + loadAudioForTrack(newTrack); appState.pattern.tracks.push(newTrack); appState.pattern.activeTrackId = newTrack.id; - + console.log("Faixa adicionada ao estado com Kicker padrão."); } + export function removeTrackById(trackId) { const index = appState.pattern.tracks.findIndex(t => t.id === trackId);