const encodeWAV = (samples, numChannels, sampleRate) => {
var buffer = new ArrayBuffer(44 + samples.byteLength)
var view = new DataView(buffer)
writeString(view, 0, 'RIFF')
view.setUint32(4, 36 + samples.byteLength, true)
writeString(view, 8, 'WAVE')
writeString(view, 12, 'fmt ')
view.setUint32(16, 16, true)
view.setUint16(20, 1, true)
view.setUint16(22, numChannels, true)
view.setUint32(24, sampleRate, true)
view.setUint32(28, sampleRate * 4, true)
view.setUint16(32, numChannels * 2, true)
view.setUint16(34, 16, true)
writeString(view, 36, 'data')
view.setUint32(40, samples.byteLength, true)
copyBytes(view, 44, samples)
return view
}
const copyBytes = (output, offset, input) => {
const dataView = new DataView(input)
for (var i = 0; i < input.byteLength; i++, offset++) {
output.setInt8(offset, dataView.getInt8(i))
}
}
const writeString = (view, offset, string) => {
for (var i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i))
}
}
const buf2hex = (arrayBuffer) => {
let hex = ''
let uint8Array = new Uint8Array(arrayBuffer)
for (let i = 0; i < uint8Array.length; i++) {
hex += uint8Array[i].toString(16).padStart(2, '0')
}
return hex
}
const hexToString = (str: any) => {
var val = '',
len = str.length / 2
for (var i = 0; i < len; i++) {
val += String.fromCharCode(parseInt(str.substr(i * 2, 2), 16))
}
return utf8to16(val)
}
const utf8to16 = (str) => {
var out, i, len, c
var char2, char3
out = ''
len = str.length
i = 0
while (i < len) {
c = str.charCodeAt(i++)
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += str.charAt(i - 1)
break
case 12:
case 13:
char2 = str.charCodeAt(i++)
out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f))
break
case 14:
char2 = str.charCodeAt(i++)
char3 = str.charCodeAt(i++)
out += String.fromCharCode(
((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0)
)
break
}
}
return out
}
const toBase64 = (buffer : any, type) => {
var binary = ''
var bytes = new Uint8Array(buffer)
var len = bytes.byteLength
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i])
}
return window.btoa(binary)
}