diff --git a/assets/js/creations/pattern/pattern_audio.js b/assets/js/creations/pattern/pattern_audio.js index c479d21c..40363be2 100755 --- a/assets/js/creations/pattern/pattern_audio.js +++ b/assets/js/creations/pattern/pattern_audio.js @@ -498,7 +498,8 @@ export async function renderActivePatternToBlob() { if (events.length > 0) { new Tone.Part((time) => { - new Tone.Player(track.buffer).connect(volume).start(time); + const buf = track.buffer?.get?.() || track.buffer; // ✅ pega AudioBuffer se for ToneAudioBuffer + new Tone.Player(buf).connect(volume).start(time); }, events).start(0); } } @@ -519,21 +520,21 @@ export async function renderActivePatternToBlob() { if (PluginClass) { // INSTANCIA O PLUGIN NO MUNDO OFFLINE // Passamos 'track.params' ou 'track.pluginData' (ajuste conforme seu appState salva os dados) - const instrumentInstance = new PluginClass( - null, - track.params || track.pluginData || {} - ); + const instrumentInstance = new PluginClass(Tone.getContext(), track.params || track.pluginData || {}); // Conecta na cadeia de áudio offline instrumentInstance.connect(volume); // 1. Agendar Notas do Piano Roll if (hasNotes) { + const TICKS_PER_BEAT = 192; + const TICKS_PER_STEP = 48; // 1/16 + const SECONDS_PER_BEAT = 60 / bpm; + const events = pattern.notes.map((note) => ({ - time: 0 + note.pos * (48 / 192) * stepInterval, // Conversão aproximada Ticks -> Segundos - // Se quiser precisão exata do Tone, use: note.pos * (Tone.Transport.PPQ / 192) / Tone.Transport.PPQ + time: (note.pos / TICKS_PER_BEAT) * SECONDS_PER_BEAT, // ✅ correto midi: note.key, - duration: (note.len / 192) * (60 / bpm), // Duração em segundos + duration: (note.len / TICKS_PER_BEAT) * SECONDS_PER_BEAT, // ✅ já estava ok velocity: (note.vol || 100) / 100, })); @@ -572,6 +573,11 @@ export async function renderActivePatternToBlob() { transport.start(); }, duration); + const ch = buffer.getChannelData(0); + let peak = 0; + for (let i = 0; i < ch.length; i++) peak = Math.max(peak, Math.abs(ch[i])); + console.log("[Render] peak =", peak); + const blob = bufferToWave(buffer); return blob; } @@ -1261,6 +1267,11 @@ export async function renderProjectToBlob({ tailSec = 0.25 } = {}) { transport.start(); }, duration); + const ch = buffer.getChannelData(0); + let peak = 0; + for (let i = 0; i < ch.length; i++) peak = Math.max(peak, Math.abs(ch[i])); + console.log("[Render] peak =", peak); + return bufferToWave(buffer); }