melhorando a leitura de projetos no mmpCreator
Deploy / Deploy (push) Successful in 2m13s Details

This commit is contained in:
JotaChina 2025-12-23 23:06:06 -03:00
parent 3727ac7b13
commit a636b514ed
1 changed files with 12 additions and 16 deletions

View File

@ -47,9 +47,8 @@ function resolveSamplePath(sampleName, pathMap) {
// helper: LMMS ticks -> seconds (1 beat = 192 ticks) // helper: LMMS ticks -> seconds (1 beat = 192 ticks)
function ticksToSeconds(ticks, bpm) { function ticksToSeconds(ticks, bpm) {
const t = Number(ticks || 0); seconds = (ticks / 12) * getSecondsPerStep()
const b = Number(bpm || 120); return seconds;
return (t * 60) / (b * 192);
} }
export async function parseBeatIndexJson(data) { export async function parseBeatIndexJson(data) {
@ -95,37 +94,33 @@ export async function parseBeatIndexJson(data) {
appState.pattern.tracks = newPatternTracks; appState.pattern.tracks = newPatternTracks;
// 2) cria lanes/clips de áudio a partir dos sample-tracks // 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++) { for (let i = 0; i < sampleTracks.length; i++) {
const t = sampleTracks[i]; const t = sampleTracks[i];
// 1) cria lane de áudio
const trackId = `sample_lane_${Date.now()}_${i}`; const trackId = `sample_lane_${Date.now()}_${i}`;
appState.audio.tracks.push({ appState.audio.tracks.push({
id: trackId, id: trackId,
name: t.track_name || "Áudio", name: t.track_name || "Áudio",
}); });
// 2) resolve URL do arquivo const fileName =
const fileName = t.sample_name || basename(t.sample_info?.src) || `${sample_info.src}.wav`; 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 = const resolvedUrl =
pathMap[fileName] || pathMap[fileName] ||
// fallback bem simples (ajuste pro seu servidor) `/src_mmpSearch/samples/samples/${data?.file || data?.original_title || ""}/${fileName}`; // ✅ data
`/src_mmpSearch/samples/samples/${project?.file || project?.original_title || ""}/${fileName}`;
// 3) converte pos/len (ticks) -> seconds // ✅ tempo no padrão do seu playlist (12 ticks por step)
const startSec = ticksToSeconds(t.sample_info?.pos, bpm); const startSec = ((Number(t.sample_info?.pos || 0) / 12) * secondsPerStep);
const durSec = ticksToSeconds(t.sample_info?.len, bpm); const durSec = ((Number(t.sample_info?.len || 0) / 12) * secondsPerStep);
// 4) cria clip
const clipId = `clip_${trackId}_0`; const clipId = `clip_${trackId}_0`;
addAudioClipToTimeline(resolvedUrl, trackId, startSec, clipId, fileName); 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 vol = Number(t.sample_info?.vol ?? 100) / 100;
const pan = Number(t.sample_info?.pan ?? 0) / 100; const pan = Number(t.sample_info?.pan ?? 0) / 100;
const muted = String(t.sample_info?.muted ?? "0") === "1"; const muted = String(t.sample_info?.muted ?? "0") === "1";
@ -137,6 +132,7 @@ export async function parseBeatIndexJson(data) {
}); });
} }
renderAll(); renderAll();
} }