diff --git a/assets/js/creations/file.js b/assets/js/creations/file.js index 3c2b0f0a..2f59cc97 100755 --- a/assets/js/creations/file.js +++ b/assets/js/creations/file.js @@ -47,9 +47,8 @@ function resolveSamplePath(sampleName, pathMap) { // helper: LMMS ticks -> seconds (1 beat = 192 ticks) function ticksToSeconds(ticks, bpm) { - const t = Number(ticks || 0); - const b = Number(bpm || 120); - return (t * 60) / (b * 192); + seconds = (ticks / 12) * getSecondsPerStep() + return seconds; } export async function parseBeatIndexJson(data) { @@ -95,37 +94,33 @@ export async function parseBeatIndexJson(data) { appState.pattern.tracks = newPatternTracks; // 2) cria lanes/clips de áudio a partir dos sample-tracks - const sampleTracks = (project?.tracks || []).filter((t) => t?.type === "sample"); + const sampleTracks = (data?.tracks || []).filter((t) => t?.type === "sample"); // ✅ data for (let i = 0; i < sampleTracks.length; i++) { const t = sampleTracks[i]; - // 1) cria lane de áudio const trackId = `sample_lane_${Date.now()}_${i}`; appState.audio.tracks.push({ id: trackId, name: t.track_name || "Áudio", }); - // 2) resolve URL do arquivo - const fileName = t.sample_name || basename(t.sample_info?.src) || `${sample_info.src}.wav`; + const fileName = + t.sample_name || + basename(t.sample_info?.src) || + `${basename(t.sample_info?.src || "")}`; // ✅ sem sample_info solto - // tenta achar pelo filename no manifest do browser - // (se o seu manifest tiver duplicados com mesmo nome, aqui pode colidir) const resolvedUrl = pathMap[fileName] || - // fallback bem simples (ajuste pro seu servidor) - `/src_mmpSearch/samples/samples/${project?.file || project?.original_title || ""}/${fileName}`; + `/src_mmpSearch/samples/samples/${data?.file || data?.original_title || ""}/${fileName}`; // ✅ data - // 3) converte pos/len (ticks) -> seconds - const startSec = ticksToSeconds(t.sample_info?.pos, bpm); - const durSec = ticksToSeconds(t.sample_info?.len, bpm); + // ✅ tempo no padrão do seu playlist (12 ticks por step) + const startSec = ((Number(t.sample_info?.pos || 0) / 12) * secondsPerStep); + const durSec = ((Number(t.sample_info?.len || 0) / 12) * secondsPerStep); - // 4) cria clip const clipId = `clip_${trackId}_0`; addAudioClipToTimeline(resolvedUrl, trackId, startSec, clipId, fileName); - // 5) aplica propriedades (duração/vol/pan) pra largura não ficar 0 const vol = Number(t.sample_info?.vol ?? 100) / 100; const pan = Number(t.sample_info?.pan ?? 0) / 100; const muted = String(t.sample_info?.muted ?? "0") === "1"; @@ -137,6 +132,7 @@ export async function parseBeatIndexJson(data) { }); } + renderAll(); }