2 * Copyright (c) 2007, 2008 Edward Tomasz NapieraĆa <trasz@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * ALTHOUGH THIS SOFTWARE IS MADE OF WIN AND SCIENCE, IT IS PROVIDED BY THE
15 * AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
16 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
17 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
18 * THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
20 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
21 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 * Standard MIDI File format loader.
35 /* Reference: http://www.borg.com/~jglatt/tech/midifile.htm */
43 #ifdef PLATFORM_WINDOWS
46 #include <arpa/inet.h>
49 #include "smf_private.h"
52 * Returns pointer to the next SMF chunk in smf->buffer, based on length of the previous one.
53 * Returns NULL in case of error.
55 static struct chunk_header_struct *
56 next_chunk(smf_t *smf)
58 struct chunk_header_struct *chunk;
61 assert(smf->file_buffer != NULL);
62 assert(smf->file_buffer_length > 0);
64 if (smf->next_chunk_offset + sizeof(struct chunk_header_struct) >= smf->file_buffer_length) {
65 g_warning("SMF warning: no more chunks left.");
69 next_chunk_ptr = (unsigned char *)smf->file_buffer + smf->next_chunk_offset;
71 chunk = (struct chunk_header_struct *)next_chunk_ptr;
73 if (!isalpha(chunk->id[0]) || !isalpha(chunk->id[1]) || !isalpha(chunk->id[2]) || !isalpha(chunk->id[3])) {
74 g_warning("SMF error: chunk signature contains at least one non-alphanumeric byte.");
79 * XXX: On SPARC, after compiling with "-fast" option there will be SIGBUS here.
80 * Please compile with -xmemalign=8i".
82 smf->next_chunk_offset += sizeof(struct chunk_header_struct) + ntohl(chunk->length);
84 if (smf->next_chunk_offset > smf->file_buffer_length) {
85 g_warning("SMF error: malformed chunk; truncated file?");
92 * Returns 1, iff signature of the "chunk" is the same as string passed as "signature".
95 chunk_signature_matches(const struct chunk_header_struct *chunk, const char *signature)
97 if (!memcmp(chunk->id, signature, 4))
104 * Verifies if MThd header looks OK. Returns 0 iff it does.
107 parse_mthd_header(smf_t *smf)
110 struct chunk_header_struct *mthd, *tmp_mthd;
112 /* Make sure compiler didn't do anything stupid. */
113 assert(sizeof(struct chunk_header_struct) == 8);
116 * We could just do "mthd = smf->file_buffer;" here, but this way we wouldn't
117 * get useful error messages.
119 if (smf->file_buffer_length < 6) {
120 g_warning ("SMF error: file is too short, it cannot be a MIDI file.");
125 tmp_mthd = (struct chunk_header_struct*)smf->file_buffer;
127 if (!chunk_signature_matches(tmp_mthd, "MThd")) {
128 g_warning("SMF error: MThd signature not found, is that a MIDI file?");
133 /* Ok, now use next_chunk(). */
134 mthd = next_chunk(smf);
138 assert(mthd == tmp_mthd);
140 len = ntohl(mthd->length);
142 g_warning("SMF error: MThd chunk length %d, must be 6.", len);
151 * Parses MThd chunk, filling "smf" structure with values extracted from it. Returns 0 iff everything went OK.
154 parse_mthd_chunk(smf_t *smf)
156 signed char first_byte_of_division, second_byte_of_division;
158 struct mthd_chunk_struct *mthd;
160 assert(sizeof(struct mthd_chunk_struct) == 14);
162 if (parse_mthd_header(smf))
165 mthd = (struct mthd_chunk_struct *)smf->file_buffer;
167 smf->format = ntohs(mthd->format);
168 if (smf->format < 0 || smf->format > 2) {
169 g_warning("SMF error: bad MThd format field value: %d, valid values are 0-2, inclusive.", smf->format);
173 if (smf->format == 2) {
174 g_warning("SMF file uses format #2, no support for that yet.");
178 smf->expected_number_of_tracks = ntohs(mthd->number_of_tracks);
179 if (smf->expected_number_of_tracks <= 0) {
180 g_warning("SMF error: bad number of tracks: %d, must be greater than zero.", smf->expected_number_of_tracks);
184 /* XXX: endianess? */
185 first_byte_of_division = *((signed char *)&(mthd->division));
186 second_byte_of_division = *((signed char *)&(mthd->division) + 1);
188 if (first_byte_of_division >= 0) {
189 smf->ppqn = ntohs(mthd->division);
190 smf->frames_per_second = 0;
194 smf->frames_per_second = - first_byte_of_division;
195 smf->resolution = second_byte_of_division;
198 if (smf->ppqn == 0) {
199 g_warning("SMF file uses FPS timing instead of PPQN, no support for that yet.");
207 * Interprets Variable Length Quantity pointed at by "buf" and puts its value into "value" and number
208 * of bytes consumed into "len", making sure it does not read past "buf" + "buffer_length".
209 * Explanation of Variable Length Quantities is here: http://www.borg.com/~jglatt/tech/midifile/vari.htm
210 * Returns 0 iff everything went OK, different value in case of error.
213 smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32_t *value, uint32_t *len)
216 const unsigned char *c = buf;
220 if (c >= buf + buffer_length) {
221 g_warning("End of buffer in extract_vlq().");
225 if (i == 4 && (val & 0xfe000000)) {
226 g_warning("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
230 val = (val << 7) + (*c & 0x7F);
243 g_warning("SMF error: Variable Length Quantities longer than four bytes are not supported yet.");
251 * Returns 1 if the given byte is a valid status byte, 0 otherwise.
254 is_status_byte(const unsigned char status)
256 return (status & 0x80);
260 is_sysex_byte(const unsigned char status)
269 is_escape_byte(const unsigned char status)
278 * Just like expected_message_length(), but only for System Exclusive messages.
279 * Note that value returned by this thing here is the length of SysEx "on the wire",
280 * not the number of bytes that this sysex takes in the file - in SMF format sysex
281 * contains VLQ telling how many bytes it takes, "on the wire" format does not have
285 expected_sysex_length(const unsigned char status, const unsigned char *second_byte, const size_t buffer_length, int32_t *consumed_bytes)
287 uint32_t sysex_length = 0;
293 assert(status == 0xF0);
296 if (buffer_length < 3) {
297 g_warning("SMF error: end of buffer in expected_sysex_length().");
301 smf_extract_vlq(second_byte, buffer_length, &sysex_length, &len);
303 if (consumed_bytes != NULL)
304 *consumed_bytes = len;
306 /* +1, because the length does not include status byte. */
307 return (sysex_length + 1);
311 expected_escaped_length(const unsigned char status, const unsigned char *second_byte, const size_t buffer_length, int32_t *consumed_bytes)
313 /* -1, because we do not want to account for 0x7F status. */
314 return (expected_sysex_length(status, second_byte, buffer_length, consumed_bytes) - 1);
318 * Returns expected length of the midi message (including the status byte), in bytes, for the given status byte.
319 * The "second_byte" points to the expected second byte of the MIDI message. "buffer_length" is the buffer
320 * length limit, counting from "second_byte". Returns value < 0 iff there was an error.
323 expected_message_length(unsigned char status, const unsigned char *second_byte, const size_t buffer_length)
325 /* Make sure this really is a valid status byte. */
326 assert(is_status_byte(status));
328 /* We cannot use this routine for sysexes. */
329 assert(!is_sysex_byte(status));
331 /* We cannot use this routine for escaped events. */
332 assert(!is_escape_byte(status));
334 /* Is this a metamessage? */
335 if (status == 0xFF) {
336 if (buffer_length < 2) {
337 g_warning("SMF error: end of buffer in expected_message_length().");
342 * Format of this kind of messages is like this: 0xFF 0xTYPE 0xlength and then "length" bytes.
343 * TYPE is < 127, length may be 0
345 * "lenght" is a 7bit value, the 8th bit is used to extend the length.
346 * eg. ff02 8266 <0x166 byte (C) message follows>
350 for (off = 1; off < 4; ++off) {
351 uint8_t val = *(second_byte + off);
352 mlen = mlen << 7 | (val & 0x7f);
353 if (0 == (val & 0x80)) {
354 mlen += 2 + off; // 2 byte "header" 0xff <type> + <length of length>
361 if ((status & 0xF0) == 0xF0) {
363 case 0xF2: /* Song Position Pointer. */
366 case 0xF1: /* MTC Quarter Frame. */
367 case 0xF3: /* Song Select. */
370 case 0xF6: /* Tune Request. */
371 case 0xF8: /* MIDI Clock. */
372 case 0xF9: /* Tick. */
373 case 0xFA: /* MIDI Start. */
374 case 0xFB: /* MIDI Continue. */
375 case 0xFC: /* MIDI Stop. */
376 case 0xFE: /* Active Sense. */
380 g_warning("SMF error: unknown 0xFx-type status byte '0x%x'.", status);
385 /* Filter out the channel. */
389 case 0x80: /* Note Off. */
390 case 0x90: /* Note On. */
391 case 0xA0: /* AfterTouch. */
392 case 0xB0: /* Control Change. */
393 case 0xE0: /* Pitch Wheel. */
396 case 0xC0: /* Program Change. */
397 case 0xD0: /* Channel Pressure. */
401 g_warning("SMF error: unknown status byte '0x%x'.", status);
407 extract_sysex_event(const unsigned char *buf, const size_t buffer_length, smf_event_t *event, uint32_t *len, int last_status)
412 int32_t vlq_length, message_length;
413 const unsigned char *c = buf;
417 if (!(is_sysex_byte(status))) {
418 g_warning("Corrupt sysex status byte in extract_sysex_event().");
424 message_length = expected_sysex_length(status, c, buffer_length - 1, &vlq_length);
426 if (message_length < 0)
431 if (vlq_length + (size_t)message_length >= buffer_length) {
432 g_warning("End of buffer in extract_sysex_event().");
436 event->midi_buffer_length = message_length;
437 event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
438 if (event->midi_buffer == NULL) {
439 g_warning("Cannot allocate memory in extract_sysex_event(): %s", strerror(errno));
443 event->midi_buffer[0] = status;
444 memcpy(event->midi_buffer + 1, c, message_length - 1);
446 *len = vlq_length + message_length;
452 extract_escaped_event(const unsigned char *buf, const size_t buffer_length, smf_event_t *event, uint32_t *len, int last_status)
457 int32_t message_length = 0;
458 int32_t vlq_length = 0;
459 const unsigned char *c = buf;
463 if (!(is_escape_byte(status))) {
464 g_warning("Corrupt escape status byte in extract_escaped_event().");
470 message_length = expected_escaped_length(status, c, buffer_length - 1, &vlq_length);
472 if (message_length < 0)
477 if (vlq_length + (size_t)message_length >= buffer_length) {
478 g_warning("End of buffer in extract_escaped_event().");
482 event->midi_buffer_length = message_length;
483 event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
484 if (event->midi_buffer == NULL) {
485 g_warning("Cannot allocate memory in extract_escaped_event(): %s", strerror(errno));
489 memcpy(event->midi_buffer, c, message_length);
491 if (smf_event_is_valid(event)) {
492 g_warning("Escaped event is invalid.");
496 if (smf_event_is_system_realtime(event) || smf_event_is_system_common(event)) {
497 g_warning("Escaped event is not System Realtime nor System Common.");
500 *len = vlq_length + message_length;
507 * Puts MIDI data extracted from from "buf" into "event" and number of consumed bytes into "len".
508 * In case valid status is not found, it uses "last_status" (so called "running status").
509 * Returns 0 iff everything went OK, value < 0 in case of error.
512 extract_midi_event(const unsigned char *buf, const size_t buffer_length, smf_event_t *event, uint32_t *len, int last_status)
515 int32_t message_length;
516 const unsigned char *c = buf;
518 assert(buffer_length > 0);
520 /* Is the first byte the status byte? */
521 if (is_status_byte(*c)) {
526 /* No, we use running status then. */
527 status = last_status;
530 if (!is_status_byte(status)) {
531 g_warning("SMF error: bad status byte (MSB is zero).");
535 if (is_sysex_byte(status))
536 return (extract_sysex_event(buf, buffer_length, event, len, last_status));
538 if (is_escape_byte(status))
539 return (extract_escaped_event(buf, buffer_length, event, len, last_status));
541 /* At this point, "c" points to first byte following the status byte. */
542 message_length = expected_message_length(status, c, buffer_length - (c - buf));
544 if (message_length < 0)
547 if ((size_t)message_length > buffer_length - (c - buf) + 1) {
548 g_warning("End of buffer in extract_midi_event().");
552 event->midi_buffer_length = message_length;
553 event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
554 if (event->midi_buffer == NULL) {
555 g_warning("Cannot allocate memory in extract_midi_event(): %s", strerror(errno));
559 event->midi_buffer[0] = status;
560 memcpy(event->midi_buffer + 1, c, message_length - 1);
562 *len = c + message_length - 1 - buf;
568 * Locates, basing on track->next_event_offset, the next event data in track->buffer,
569 * interprets it, allocates smf_event_t and fills it properly. Returns smf_event_t
570 * or NULL, if there was an error. Allocating event means adding it to the track;
571 * see smf_event_new().
574 parse_next_event(smf_track_t *track)
578 size_t buffer_length;
579 unsigned char *c, *start;
581 smf_event_t *event = smf_event_new();
585 c = start = (unsigned char *)track->file_buffer + track->next_event_offset;
587 assert(track->file_buffer != NULL);
588 assert(track->file_buffer_length > 0);
589 assert(track->next_event_offset > 0);
591 buffer_length = track->file_buffer_length - track->next_event_offset;
592 /* if there was no meta-EOT event, buffer_length can be zero. This is
593 an error in the SMF file, but it shouldn't be treated as fatal.
595 if (buffer_length == 0) {
596 g_warning ("SMF warning: expected EOT at end of track, but none found");
599 /* First, extract time offset from previous event. */
600 if (smf_extract_vlq(c, buffer_length, &etime, &len)) {
605 buffer_length -= len;
607 if (buffer_length <= 0)
610 /* Now, extract the actual event. */
611 if (extract_midi_event(c, buffer_length, event, &len, track->last_status)) {
616 buffer_length -= len;
617 track->last_status = event->midi_buffer[0];
618 track->next_event_offset += c - start;
620 smf_track_add_event_delta_pulses(track, event, etime);
626 smf_event_delete(event);
632 * Takes "len" characters starting in "buf", making sure it does not access past the length of the buffer,
633 * and makes ordinary, zero-terminated string from it. May return NULL if there was any problem.
636 make_string(const unsigned char *buf, const size_t buffer_length, uint32_t len)
640 assert(buffer_length > 0);
643 if (len > buffer_length) {
644 g_warning("End of buffer in make_string().");
649 str = (char*)malloc(len + 1);
651 g_warning("Cannot allocate memory in make_string().");
655 memcpy(str, buf, len);
662 * \return 1, if passed a metaevent containing text, that is, Text, Copyright,
663 * Sequence/Track Name, Instrument, Lyric, Marker, Cue Point, Program Name,
664 * or Device Name; 0 otherwise.
667 smf_event_is_textual(const smf_event_t *event)
669 if (!smf_event_is_metadata(event)) {
673 if (event->midi_buffer_length < 4) {
677 if (event->midi_buffer[1] < 1 || event->midi_buffer[1] > 7) {
685 * Extracts text from "textual metaevents", such as Text or Lyric.
687 * \return Zero-terminated string extracted from "text events" or NULL, if there was any problem.
690 smf_event_extract_text(const smf_event_t *event)
692 uint32_t string_length = 0;
693 uint32_t length_length = 0;
695 if (!smf_event_is_textual(event)) {
696 g_warning ("smf_event_extract_text: event is not textual.");
700 smf_extract_vlq((const unsigned char*)(void *)&(event->midi_buffer[2]), event->midi_buffer_length - 2, &string_length, &length_length);
702 if (string_length <= 0) {
703 g_warning("smf_event_extract_text: truncated MIDI message.");
707 return (make_string((const unsigned char*)(void *)(&event->midi_buffer[2] + length_length), event->midi_buffer_length - 2 - length_length, string_length));
711 * Verify if the next chunk really is MTrk chunk, and if so, initialize some track variables and return 0.
712 * Return different value otherwise.
715 parse_mtrk_header(smf_track_t *track)
717 struct chunk_header_struct *mtrk;
719 /* Make sure compiler didn't do anything stupid. */
720 assert(sizeof(struct chunk_header_struct) == 8);
721 assert(track->smf != NULL);
723 mtrk = next_chunk(track->smf);
728 if (!chunk_signature_matches(mtrk, "MTrk")) {
729 g_warning("SMF warning: Expected MTrk signature, got %c%c%c%c instead; ignoring this chunk.",
730 mtrk->id[0], mtrk->id[1], mtrk->id[2], mtrk->id[3]);
735 track->file_buffer = mtrk;
736 track->file_buffer_length = sizeof(struct chunk_header_struct) + ntohl(mtrk->length);
737 track->next_event_offset = sizeof(struct chunk_header_struct);
743 * Return 1 if event is end-of-the-track, 0 otherwise.
746 event_is_end_of_track(const smf_event_t *event)
748 if (event->midi_buffer[0] == 0xFF && event->midi_buffer[1] == 0x2F)
755 * \return Nonzero, if event is as long as it should be, from the MIDI specification point of view.
756 * Does not work for SysExes - it doesn't recognize internal structure of SysEx.
759 smf_event_length_is_valid(const smf_event_t *event)
762 assert(event->midi_buffer);
766 if (event->midi_buffer_length < 1)
769 /* We cannot use expected_message_length on sysexes. */
770 if (smf_event_is_sysex(event))
774 expected = expected_message_length(event->midi_buffer[0],
775 &(event->midi_buffer[1]), event->midi_buffer_length - 1);
776 if (expected < 0 || event->midi_buffer_length != (size_t)expected) {
784 * \return Nonzero, if MIDI data in the event is valid, 0 otherwise. For example,
785 * it checks if event length is correct.
787 /* XXX: this routine requires some more work to detect more errors. */
789 smf_event_is_valid(const smf_event_t *event)
792 assert(event->midi_buffer);
793 assert(event->midi_buffer_length >= 1);
795 if (!is_status_byte(event->midi_buffer[0])) {
796 g_warning("First byte of MIDI message is not a valid status byte.");
801 if (!smf_event_length_is_valid(event))
808 * Parse events and put it on the track.
811 parse_mtrk_chunk(smf_track_t *track)
816 if (parse_mtrk_header(track))
820 event = parse_next_event(track);
822 /* Couldn't parse an event? */
823 if (event == NULL || !smf_event_is_valid(event)) {
828 if (event_is_end_of_track(event)) {
832 if (smf_event_is_metadata (event)) {
833 switch (event->midi_buffer[1]) {
835 track->name = smf_event_extract_text (event);
838 track->instrument = smf_event_extract_text (event);
846 track->file_buffer = NULL;
847 track->file_buffer_length = 0;
848 track->next_event_offset = -1;
854 * Allocate buffer of proper size and read file contents into it.
857 load_file_into_buffer(void **file_buffer, size_t *file_buffer_length, FILE* stream)
861 if (stream == NULL) {
862 g_warning("Cannot open input file: %s", strerror(errno));
867 if (fseek(stream, 0, SEEK_END)) {
868 g_warning("fseek(3) failed: %s", strerror(errno));
873 offset = ftell(stream);
875 g_warning("ftell(3) failed: %s", strerror(errno));
879 *file_buffer_length = (size_t)offset;
881 if (fseek(stream, 0, SEEK_SET)) {
882 g_warning("fseek(3) failed: %s", strerror(errno));
887 *file_buffer = malloc(*file_buffer_length);
888 if (*file_buffer == NULL) {
889 g_warning("malloc(3) failed: %s", strerror(errno));
894 if (fread(*file_buffer, 1, *file_buffer_length, stream) != *file_buffer_length) {
895 g_warning("fread(3) failed: %s", strerror(errno));
905 * Creates new SMF and fills it with data loaded from the given buffer.
906 * \return SMF or NULL, if loading failed.
909 smf_load_from_memory(void *buffer, const size_t buffer_length)
914 smf_t *smf = smf_new();
916 smf->file_buffer = (void *) buffer;
917 smf->file_buffer_length = buffer_length;
918 smf->next_chunk_offset = 0;
920 if (parse_mthd_chunk(smf))
923 for (i = 1; i <= smf->expected_number_of_tracks; i++) {
924 smf_track_t *track = smf_track_new();
928 smf_add_track(smf, track);
930 ret = parse_mtrk_chunk(track);
932 track->file_buffer = NULL;
933 track->file_buffer_length = 0;
934 track->next_event_offset = -1;
937 g_warning("SMF warning: Error parsing track, continuing with data loaded so far.");
942 if (smf->expected_number_of_tracks != smf->number_of_tracks) {
943 g_warning("SMF warning: MThd header declared %d tracks, but only %d found; continuing anyway.",
944 smf->expected_number_of_tracks, smf->number_of_tracks);
946 smf->expected_number_of_tracks = smf->number_of_tracks;
949 smf->file_buffer = NULL;
950 smf->file_buffer_length = 0;
951 smf->next_chunk_offset = 0;
959 * \param file Open file.
960 * \return SMF or NULL, if loading failed.
965 size_t file_buffer_length;
969 if (load_file_into_buffer(&file_buffer, &file_buffer_length, file))
972 smf = smf_load_from_memory(file_buffer, file_buffer_length);
974 memset(file_buffer, 0, file_buffer_length);