Exemplo n.º 1
0
bool midi_file_write(const midi & m, const char * fn) {
	ofstream out(fn, ios_base::out | ios_base::binary);
	if (out.fail()) return false;
	printHeader(m, out);
	int lengths[m.trackCount()];
	uint16_t ff = getFileFormat(m);
	if (m.trackCount()) {
		lengths[0] = writeTrack(m.tracks(0), out, m.getTicksPerQuaterNote(), true);
		for (unsigned i = 1; i < m.trackCount(); ++i) {
			if (ff < 2)
				lengths[i] = writeTrack(m.tracks(i), out);
			else
				lengths[i] = writeTrack(m.tracks(i), out, m.getTicksPerQuaterNote(), true);
		}
	}
	out.seekp(14, ios_base::beg);
	for (unsigned i = 0; i < m.trackCount(); ++i) {
		out.seekp(4, ios_base::cur);
		printUint32_t(lengths[i] - 8, out);
		out.seekp(lengths[i] - 8, ios_base::cur);
	}

	out.close();
	return out.fail();
}
Exemplo n.º 2
0
void printHeader(const midi& m, ostream &out) {
	out.write("MThd\0\0\0\6", 8);
	if (m.trackCount() == 0)
		throw "No tracks! Cannot save a file.";
	else if (m.trackCount() == 1)
		printUint16_t(1, out);
	else {
		printUint16_t(getFileFormat(m), out);
	}
	printUint16_t(m.trackCount(), out);
	printUint16_t((uint16_t) m.getTicksPerQuaterNote(), out);
}