melhorando a leitura de projetos no mmpCreator
Deploy / Deploy (push) Successful in 2m13s
Details
Deploy / Deploy (push) Successful in 2m13s
Details
This commit is contained in:
parent
3727ac7b13
commit
a636b514ed
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue