gpt4 book ai didi

node.js - 无法从 FileSaver/Blob 与 Node 的 fs 获得相同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:50 25 4
gpt4 key购买 nike

我正在尝试生成一个 midi 文件(使用 jsmidgen ),并且我可以通过这种方式使用 Node 输出它:

fs.writeFileSync('test.mid', file.toBytes(), 'binary');

该 midi 文件工作正常。然后我尝试从浏览器生成它并使用 FileSaver.js 下载它。这样:

let blob = new Blob([file.toBytes()], {type: "audio/midi"});
saveAs(blob, "test.mid");

该 MIDI 文件已损坏。我尝试了各种 blob 内容类型,但没有成功,并且我还验证了 file.toBytes() 输出在两种情况下是相同的。我比较了两个十六进制输出,它看起来像是编码问题,但我无法找到如何解决此问题。

来自好文件的十六进制代码(使用 fs 保存在 Node 中)

4d 54 68 64 00 00 00 06 
00 00 00 01 00 80 4d 54
72 6b 00 00 00 5e 00 90
3c 5a 40 80 3c 5a 00 90
3e 5a 40 80 3e 5a 00 90
40 5a 40 80 40 5a 00 90
41 5a 40 80 41 5a 00 90
43 5a 40 80 43 5a 00 90
45 5a 40 80 45 5a 00 90
47 5a 40 80 47 5a 00 90
48 5a 40 80 48 5a 81 00
90 3c 5a 00 90 40 5a 00
90 43 5a 81 00 80 3c 5a
00 80 40 5a 00 80 43 5a
00 ff 2f 00

来自错误文件(FileSaver/Blob)的十六进制代码:

4d 54 68 64 00 00 00 06 
00 00 00 01 00 c2 80 4d
54 72 6b 00 00 00 44 00
c2 90 3c 5a 40 c2 80 3c
5a 00 c2 90 3e 5a 40 c2
80 3e 5a 00 c2 90 40 5a
40 c2 80 40 5a 00 c2 90
41 5a 40 c2 80 41 5a 00
c2 90 43 5a 40 c2 80 43
5a 00 c2 90 45 5a 40 c2
80 45 5a 00 c2 90 47 5a
40 c2 80 47 5a 00 c2 90
48 5a 40 c2 80 48 5a 00
c3 bf 2f 00

我使用 Blob 的方式有问题吗?或者我可以尝试其他方法吗?

我用来生成 midi 文件的代码是 jsmidgen 上的第一个示例。页面,演奏 C 大调音阶的页面。

最佳答案

是否需要专门使用Blob?如果没有,那么您可以使用btoa

我使用 jsmidgen 作为我的 module 的主要依赖项(它充当包装器并执行其他一些操作)并且我遇到了类似的问题,因此提出了这个:

const bytes = file.toBytes();
const b64 = btoa(bytes);
const uri = 'data:audio/midi;base64,' + b64;
const link=document.createElement('a');

link.href=uri;
link.download = 'music.mid';
link.click(); // this will start a download of the MIDI byte string

我已经在我的模块的上下文中记录了这一点,其中也有一个工作的 JS Bin:https://scribbletune.com/documentation/core/midi

关于node.js - 无法从 FileSaver/Blob 与 Node 的 fs 获得相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57129828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com