UNPKG

scratch-sb1-converter

Version:

Scratch 1 (.sb) to Scratch 2 (.sb2) conversion library for Scratch 3.0

59 lines (47 loc) 1.75 kB
import {ByteStream} from './byte-stream'; import {WAVESignature, WAVEChunkStart, WAVEFMTChunkBody} from './wav-packets'; class WAVFile { encode (intSamples, {channels = 1, sampleRate = 22050} = {}) { const samplesUint8 = new Uint8Array(intSamples.buffer, intSamples.byteOffset, intSamples.byteLength); const size = ( WAVESignature.size + WAVEChunkStart.size + WAVEFMTChunkBody.size + WAVEChunkStart.size + samplesUint8.length ); const stream = new ByteStream(new ArrayBuffer(size)); stream.writeStruct(WAVESignature, { riff: 'RIFF', length: size - 8, wave: 'WAVE' }); stream.writeStruct(WAVEChunkStart, { chunkType: 'fmt ', length: WAVEFMTChunkBody.size }); stream.writeStruct(WAVEFMTChunkBody, { format: 1, channels: channels, sampleRate: sampleRate, bytesPerSec: sampleRate * 2 * channels, blockAlignment: channels * 2, bitsPerSample: 16 }); stream.writeStruct(WAVEChunkStart, { chunkType: 'data', length: size - stream.position - WAVEChunkStart.size }); stream.writeBytes(samplesUint8); return stream.uint8a; } static encode (intSamples, options) { return new WAVFile().encode(intSamples, options); } static samples (bytes) { const headerLength = new WAVEChunkStart(bytes, WAVESignature.size).length; const bodyLength = new WAVEChunkStart(bytes, WAVESignature.size + WAVEChunkStart.size + headerLength).length; return bodyLength / 2; } } export {WAVFile};