Add rsf2wav.js
This commit is contained in:
parent
98e430f3c1
commit
3a1601a419
2
.gitignore
vendored
2
.gitignore
vendored
@ -31,3 +31,5 @@ videos/**
|
|||||||
lib/
|
lib/
|
||||||
.vscode/
|
.vscode/
|
||||||
bin
|
bin
|
||||||
|
out.wav
|
||||||
|
|
||||||
|
46
scripts/rsf2wav.js
Executable file
46
scripts/rsf2wav.js
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require("fs")
|
||||||
|
const rsf = fs.readFileSync(process.argv[2])
|
||||||
|
|
||||||
|
const fmt = rsf.readInt16BE(0) // 0x0100
|
||||||
|
if (fmt != 0x0100) {
|
||||||
|
throw new Error("Invalid input format: " + fmt)
|
||||||
|
}
|
||||||
|
const size = rsf.readInt16BE(2)
|
||||||
|
const samplerate = rsf.readInt16BE(4)
|
||||||
|
const repeat = rsf.readInt16BE(6)
|
||||||
|
|
||||||
|
const datasize = rsf.length - 8
|
||||||
|
|
||||||
|
const wavHd = new Buffer(44)
|
||||||
|
|
||||||
|
function writeMark(off, mark) {
|
||||||
|
for (let i = 0; i < mark.length; ++i) {
|
||||||
|
wavHd[off + i] = mark.charCodeAt(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writeMark(0, 'RIFF')
|
||||||
|
wavHd.writeInt32LE(datasize + 36, 4)
|
||||||
|
writeMark(8, 'WAVE')
|
||||||
|
writeMark(12, 'fmt ')
|
||||||
|
wavHd.writeInt32LE(16, 16) // fmt size
|
||||||
|
wavHd.writeInt16LE(1, 20) // PCM
|
||||||
|
wavHd.writeInt16LE(1, 22) // mono, 1ch
|
||||||
|
wavHd.writeInt32LE(samplerate, 24)
|
||||||
|
wavHd.writeInt32LE(samplerate, 28) // byterate
|
||||||
|
wavHd.writeInt16LE(1, 32) // block align
|
||||||
|
wavHd.writeInt16LE(8, 34) // bits per sample
|
||||||
|
writeMark(36, 'data')
|
||||||
|
wavHd.writeInt32LE(datasize, 40)
|
||||||
|
|
||||||
|
const wav = Buffer.concat([wavHd, rsf.slice(8)])
|
||||||
|
|
||||||
|
console.log("writing out.wav")
|
||||||
|
fs.writeFileSync("out.wav", wav)
|
||||||
|
|
||||||
|
if (require("os").platform() == "darwin")
|
||||||
|
require('child_process').execSync("afplay out.wav")
|
||||||
|
|
||||||
|
// TODO also play on Windows
|
Loading…
Reference in New Issue
Block a user