Created
April 2, 2011 23:50
-
-
Save also/900023 to your computer and use it in GitHub Desktop.
Generate WAVE file headers in JavaScript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ | |
function buildWaveHeader(opts) { | |
var numFrames = opts.numFrames; | |
var numChannels = opts.numChannels || 2; | |
var sampleRate = opts.sampleRate || 44100; | |
var bytesPerSample = opts.bytesPerSample || 2; | |
var blockAlign = numChannels * bytesPerSample; | |
var byteRate = sampleRate * blockAlign; | |
var dataSize = numFrames * blockAlign; | |
var buffer = new ArrayBuffer(44); | |
var dv = new DataView(buffer); | |
var p = 0; | |
function writeString(s) { | |
for (var i = 0; i < s.length; i++) { | |
dv.setUint8(p + i, s.charCodeAt(i)); | |
} | |
p += s.length; | |
} | |
function writeUint32(d) { | |
dv.setUint32(p, d, true); | |
p += 4; | |
} | |
function writeUint16(d) { | |
dv.setUint16(p, d, true); | |
p += 2; | |
} | |
writeString('RIFF'); // ChunkID | |
writeUint32(dataSize + 36); // ChunkSize | |
writeString('WAVE'); // Format | |
writeString('fmt '); // Subchunk1ID | |
writeUint32(16); // Subchunk1Size | |
writeUint16(1); // AudioFormat | |
writeUint16(numChannels); // NumChannels | |
writeUint32(sampleRate); // SampleRate | |
writeUint32(byteRate); // ByteRate | |
writeUint16(blockAlign); // BlockAlign | |
writeUint16(bytesPerSample * 8); // BitsPerSample | |
writeString('data'); // Subchunk2ID | |
writeUint32(dataSize); // Subchunk2Size | |
return buffer; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
writeUint16(1);
is hardcoded on unsigned integer samples, whilewriteUint16(3);
is float32 data, which could be made an option