function parse(buffer) { let reader = new BufferReader(buffer); let file = { header: undefined, tracks: [] }; let chunk = _readChunk(reader); if (chunk.isHeader) { file.header = chunk; delete chunk.isHeader; } if (_.isUndefined(file.header)) { throw new Error('MIDI file has no header data.'); } for (let i = 0, len = file.header.numberOfTracks; i < len; i++) { file.tracks.push(_readChunk(reader)); } if (reader.tell() < buffer.byteLength) { debug('File has bytes left over. This should not happen. Bytes are: ', reader.restAll()); } return new MIDIFile(file); }
function _readTrackChunk(reader) { let length = reader.nextUInt32BE(); let events = []; let initialPosition = reader.tell(); let runningStatus; let chunkBuffer = reader.nextBuffer(length); let chunkReader = new BufferReader(chunkBuffer); while (chunkReader.tell() < length) { let eventChunk = _readEvent(chunkReader, runningStatus); runningStatus = eventChunk.runningStatus; delete eventChunk.runningStatus; events.push(eventChunk); } if (chunkReader.tell() < length) { // there are still bytes left unread--something has gone wrong let err = new Error('Chunk buffer was not exhausted; ' + (length - chunkReader.tell()) + ' bytes left'); err.remainingBytes = chunkReader.restAll(); throw err; } return events; }