【发布时间】:2019-07-22 02:13:07
【问题描述】:
我正在尝试生成一个 midi 文件(使用jsmidgen),我可以通过这种方式使用节点输出它:
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 大调音阶的示例。
【问题讨论】:
-
file.toBytes() 是否返回相同的数组?
-
是的,这两种情况都是一样的。
标签: node.js blob midi filesaver.js