src/view/download.js
- /**
- * Triggers a browser file download from a Blob or a Base64-encoded string.
- * @param {Blob|string} data - Blob or Base64 encoded binary (treated as audio/midi).
- * @param {string} [filename] - Output name; defaults to UTC-timestamp .mid.
- * @return {string} Filename stem (without extension).
- * @example
- * downloadBlob(blob); // "2026-05-09T14-23-07" (default UTC timestamp)
- * downloadBlob(b64String, "song.mid"); // "song" (custom filename, returns stem)
- */
- export function downloadBlob(
- data,
- filename = `${new Date().toISOString().replace(/[:.]/g, "-").slice(0, -5)}.mid`,
- ) {
- const blob =
- typeof data === "string"
- ? new Blob([Uint8Array.from(atob(data), (c) => c.charCodeAt(0))], {
- type: "audio/midi",
- })
- : data;
- const url = URL.createObjectURL(blob);
- const a = document.createElement("a");
- a.href = url;
- a.download = filename;
- document.body.appendChild(a);
- a.click();
- URL.revokeObjectURL(url);
- a.remove();
- return filename.replace(/\.[^.]+$/, "");
- }
