Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}