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.
35 /* Reference: http://www.borg.com/~jglatt/tech/midifile.htm */
42 #ifdef PLATFORM_WINDOWS
45 #include <arpa/inet.h>
48 #include "smf_private.h"
51 * Allocates new smf_t structure.
52 * \return pointer to smf_t or NULL.
59 smf_t *smf = (smf_t*)malloc(sizeof(smf_t));
61 g_critical("Cannot allocate smf_t structure: %s", strerror(errno));
65 memset(smf, 0, sizeof(smf_t));
67 smf->tracks_array = g_ptr_array_new();
68 assert(smf->tracks_array);
70 smf->tempo_array = g_ptr_array_new();
71 assert(smf->tempo_array);
73 cantfail = smf_set_ppqn(smf, 120);
76 cantfail = smf_set_format(smf, 0);
85 * Frees smf and all it's descendant structures.
88 smf_delete(smf_t *smf)
90 /* Remove all the tracks, from last to first. */
91 while (smf->tracks_array->len > 0)
92 smf_track_delete((smf_track_t*)g_ptr_array_index(smf->tracks_array, smf->tracks_array->len - 1));
96 assert(smf->tracks_array->len == 0);
97 assert(smf->number_of_tracks == 0);
98 g_ptr_array_free(smf->tracks_array, TRUE);
99 g_ptr_array_free(smf->tempo_array, TRUE);
101 memset(smf, 0, sizeof(smf_t));
106 * Allocates new smf_track_t structure.
107 * \return pointer to smf_track_t or NULL.
112 smf_track_t *track = (smf_track_t*)malloc(sizeof(smf_track_t));
114 g_critical("Cannot allocate smf_track_t structure: %s", strerror(errno));
118 memset(track, 0, sizeof(smf_track_t));
119 track->next_event_number = 0;
121 track->events_array = g_ptr_array_new();
122 assert(track->events_array);
128 * Detaches track from its smf and frees it.
131 smf_track_delete(smf_track_t *track)
134 assert(track->events_array);
136 /* Remove all the events, from last to first. */
137 while (track->events_array->len > 0)
138 smf_event_delete((smf_event_t*)g_ptr_array_index(track->events_array, track->events_array->len - 1));
141 smf_track_remove_from_smf(track);
143 assert(track->events_array->len == 0);
144 assert(track->number_of_events == 0);
145 g_ptr_array_free(track->events_array, TRUE);
147 memset(track, 0, sizeof(smf_track_t));
153 * Appends smf_track_t to smf.
156 smf_add_track(smf_t *smf, smf_track_t *track)
162 assert(track->smf == NULL);
165 g_ptr_array_add(smf->tracks_array, track);
167 smf->number_of_tracks++;
168 track->track_number = smf->number_of_tracks;
170 if (smf->number_of_tracks > 1) {
172 cantfail = smf_set_format(smf, 1);
175 smf_set_format(smf, 1);
182 * Detaches track from the smf.
185 smf_track_remove_from_smf(smf_track_t *track)
192 assert(track->smf != NULL);
194 track->smf->number_of_tracks--;
196 assert(track->smf->tracks_array);
197 g_ptr_array_remove(track->smf->tracks_array, track);
199 /* Renumber the rest of the tracks, so they are consecutively numbered. */
200 for (i = track->track_number; i <= track->smf->number_of_tracks; i++) {
201 tmp = smf_get_track_by_number(track->smf, i);
202 tmp->track_number = i;
205 * Events have track numbers too. I guess this wasn't a wise
208 for (j = 1; j <= tmp->number_of_events; j++) {
209 ev = smf_track_get_event_by_number(tmp, j);
210 ev->track_number = i;
214 track->track_number = -1;
219 * Allocates new smf_event_t structure. The caller is responsible for allocating
220 * event->midi_buffer, filling it with MIDI data and setting event->midi_buffer_length properly.
221 * Note that event->midi_buffer will be freed by smf_event_delete.
222 * \return pointer to smf_event_t or NULL.
227 smf_event_t *event = (smf_event_t*)malloc(sizeof(smf_event_t));
229 g_critical("Cannot allocate smf_event_t structure: %s", strerror(errno));
233 memset(event, 0, sizeof(smf_event_t));
235 event->delta_time_pulses = -1;
236 event->time_pulses = -1;
237 event->time_seconds = -1.0;
238 event->track_number = -1;
244 * Allocates an smf_event_t structure and fills it with "len" bytes copied
246 * \param midi_data Pointer to MIDI data. It sill be copied to the newly allocated event->midi_buffer.
247 * \param len Length of the buffer. It must be proper MIDI event length, e.g. 3 for Note On event.
248 * \return Event containing MIDI data or NULL.
251 smf_event_new_from_pointer(const void *midi_data, size_t len)
255 event = smf_event_new();
259 event->midi_buffer_length = len;
260 event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
261 if (event->midi_buffer == NULL) {
262 g_critical("Cannot allocate MIDI buffer structure: %s", strerror(errno));
263 smf_event_delete(event);
268 memcpy(event->midi_buffer, midi_data, len);
274 * Allocates an smf_event_t structure and fills it with at most three bytes of data.
275 * For example, if you need to create Note On event, do something like this:
277 * smf_event_new_from_bytes(0x90, 0x3C, 0x7f);
279 * To create event for MIDI message that is shorter than three bytes, do something
282 * smf_event_new_from_bytes(0xC0, 0x42, -1);
284 * \param first_byte First byte of MIDI message. Must be valid status byte.
285 * \param second_byte Second byte of MIDI message or -1, if message is one byte long.
286 * \param third_byte Third byte of MIDI message or -1, if message is two bytes long.
287 * \return Event containing MIDI data or NULL.
290 smf_event_new_from_bytes(int first_byte, int second_byte, int third_byte)
296 event = smf_event_new();
300 if (first_byte < 0) {
301 g_critical("First byte of MIDI message cannot be < 0");
302 smf_event_delete(event);
307 if (first_byte > 255) {
308 g_critical("smf_event_new_from_bytes: first byte is %d, which is larger than 255.", first_byte);
312 if (!is_status_byte(first_byte)) {
313 g_critical("smf_event_new_from_bytes: first byte is not a valid status byte.");
320 else if (third_byte < 0)
326 if (second_byte > 255) {
327 g_critical("smf_event_new_from_bytes: second byte is %d, which is larger than 255.", second_byte);
331 if (is_status_byte(second_byte)) {
332 g_critical("smf_event_new_from_bytes: second byte cannot be a status byte.");
338 if (third_byte > 255) {
339 g_critical("smf_event_new_from_bytes: third byte is %d, which is larger than 255.", third_byte);
343 if (is_status_byte(third_byte)) {
344 g_critical("smf_event_new_from_bytes: third byte cannot be a status byte.");
349 event->midi_buffer_length = len;
350 event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
351 if (event->midi_buffer == NULL) {
352 g_critical("Cannot allocate MIDI buffer structure: %s", strerror(errno));
353 smf_event_delete(event);
358 event->midi_buffer[0] = first_byte;
360 event->midi_buffer[1] = second_byte;
362 event->midi_buffer[2] = third_byte;
368 * Detaches event from its track and frees it.
371 smf_event_delete(smf_event_t *event)
373 if (event->track != NULL)
374 smf_event_remove_from_track(event);
376 if (event->midi_buffer != NULL) {
377 memset(event->midi_buffer, 0, event->midi_buffer_length);
378 free(event->midi_buffer);
381 memset(event, 0, sizeof(smf_event_t));
386 * Used for sorting track->events_array.
389 events_array_compare_function(gconstpointer aa, gconstpointer bb)
391 const smf_event_t *a, *b;
393 /* "The comparison function for g_ptr_array_sort() doesn't take the pointers
394 from the array as arguments, it takes pointers to the pointers in the array." */
395 a = (const smf_event_t *)*(const gpointer *)aa;
396 b = (const smf_event_t *)*(const gpointer *)bb;
398 if (a->time_pulses < b->time_pulses)
401 if (a->time_pulses > b->time_pulses)
405 * We need to preserve original order, otherwise things will break
406 * when there are several events with the same ->time_pulses.
407 * XXX: This is an ugly hack; we should remove sorting altogether.
410 if (a->event_number < b->event_number)
413 if (a->event_number > b->event_number)
420 * An assumption here is that if there is an EOT event, it will be at the end of the track.
423 remove_eot_if_before_pulses(smf_track_t *track, size_t pulses)
427 event = smf_track_get_last_event(track);
432 if (!smf_event_is_eot(event))
435 if (event->time_pulses > pulses)
438 smf_event_remove_from_track(event);
442 * Adds the event to the track and computes ->delta_pulses. Note that it is faster
443 * to append events to the end of the track than to insert them in the middle.
444 * Usually you want to use smf_track_add_event_seconds or smf_track_add_event_pulses
445 * instead of this one. Event needs to have ->time_pulses and ->time_seconds already set.
446 * If you try to add event after an EOT, EOT event will be automatically deleted.
449 smf_track_add_event(smf_track_t *track, smf_event_t *event)
451 size_t i, last_pulses = 0;
453 assert(track->smf != NULL);
454 assert(event->track == NULL);
455 assert(event->delta_time_pulses == -1);
456 assert(event->time_seconds >= 0.0);
458 remove_eot_if_before_pulses(track, event->time_pulses);
460 event->track = track;
461 event->track_number = track->track_number;
463 if (track->number_of_events == 0) {
464 assert(track->next_event_number == 0);
465 track->next_event_number = 1;
468 if (track->number_of_events > 0)
469 last_pulses = smf_track_get_last_event(track)->time_pulses;
471 track->number_of_events++;
473 /* Are we just appending element at the end of the track? */
474 if (last_pulses <= event->time_pulses) {
475 event->delta_time_pulses = event->time_pulses - last_pulses;
476 assert(event->delta_time_pulses >= 0);
477 g_ptr_array_add(track->events_array, event);
478 event->event_number = track->number_of_events;
480 /* We need to insert in the middle of the track. XXX: This is slow. */
482 /* Append, then sort according to ->time_pulses. */
483 g_ptr_array_add(track->events_array, event);
484 g_ptr_array_sort(track->events_array, events_array_compare_function);
486 /* Renumber entries and fix their ->delta_pulses. */
487 for (i = 1; i <= track->number_of_events; i++) {
488 smf_event_t *tmp = smf_track_get_event_by_number(track, i);
489 tmp->event_number = i;
491 if (tmp->delta_time_pulses != -1)
495 tmp->delta_time_pulses = tmp->time_pulses;
497 tmp->delta_time_pulses = tmp->time_pulses -
498 smf_track_get_event_by_number(track, i - 1)->time_pulses;
499 assert(tmp->delta_time_pulses >= 0);
503 /* Adjust ->delta_time_pulses of the next event. */
504 if (event->event_number < track->number_of_events) {
505 smf_event_t *next_event = smf_track_get_event_by_number(track, event->event_number + 1);
507 assert(next_event->time_pulses >= event->time_pulses);
508 next_event->delta_time_pulses -= event->delta_time_pulses;
509 assert(next_event->delta_time_pulses >= 0);
513 if (smf_event_is_tempo_change_or_time_signature(event)) {
514 if (smf_event_is_last(event))
515 maybe_add_to_tempo_map(event);
517 smf_create_tempo_map_and_compute_seconds(event->track->smf);
522 * Add End Of Track metaevent. Using it is optional, libsmf will automatically
523 * add EOT to the tracks during smf_save, with delta_pulses 0. If you try to add EOT
524 * in the middle of the track, it will fail and nonzero value will be returned.
525 * If you try to add EOT after another EOT event, it will be added, but the existing
526 * EOT event will be removed.
528 * \return 0 if everything went ok, nonzero otherwise.
531 smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta)
535 event = smf_event_new_from_bytes(0xFF, 0x2F, 0x00);
539 smf_track_add_event_delta_pulses(track, event, delta);
545 smf_track_add_eot_pulses(smf_track_t *track, size_t pulses)
547 smf_event_t *event, *last_event;
549 last_event = smf_track_get_last_event(track);
550 if (last_event != NULL) {
551 if (last_event->time_pulses > pulses)
555 event = smf_event_new_from_bytes(0xFF, 0x2F, 0x00);
559 smf_track_add_event_pulses(track, event, pulses);
565 smf_track_add_eot_seconds(smf_track_t *track, double seconds)
567 smf_event_t *event, *last_event;
569 last_event = smf_track_get_last_event(track);
570 if (last_event != NULL) {
571 if (last_event->time_seconds > seconds)
575 event = smf_event_new_from_bytes(0xFF, 0x2F, 0x00);
579 smf_track_add_event_seconds(track, event, seconds);
585 * Detaches event from its track.
588 smf_event_remove_from_track(smf_event_t *event)
595 assert(event->track != NULL);
596 assert(event->track->smf != NULL);
598 track = event->track;
599 was_last = smf_event_is_last(event);
601 /* Adjust ->delta_time_pulses of the next event. */
602 if (event->event_number < track->number_of_events) {
603 tmp = smf_track_get_event_by_number(track, event->event_number + 1);
605 tmp->delta_time_pulses += event->delta_time_pulses;
608 track->number_of_events--;
609 g_ptr_array_remove(track->events_array, event);
611 if (track->number_of_events == 0)
612 track->next_event_number = 0;
614 /* Renumber the rest of the events, so they are consecutively numbered. */
615 for (i = event->event_number; i <= track->number_of_events; i++) {
616 tmp = smf_track_get_event_by_number(track, i);
617 tmp->event_number = i;
620 if (smf_event_is_tempo_change_or_time_signature(event)) {
621 /* XXX: This will cause problems, when there is more than one Tempo Change event at a given time. */
623 remove_last_tempo_with_pulses(event->track->smf, event->time_pulses);
625 smf_create_tempo_map_and_compute_seconds(track->smf);
629 event->event_number = 0;
630 event->delta_time_pulses = -1;
631 event->time_pulses = 0;
632 event->time_seconds = -1.0;
636 * \return Nonzero if event is Tempo Change or Time Signature metaevent.
639 smf_event_is_tempo_change_or_time_signature(const smf_event_t *event)
641 if (!smf_event_is_metadata(event))
644 assert(event->midi_buffer_length >= 2);
646 if (event->midi_buffer[1] == 0x51 || event->midi_buffer[1] == 0x58)
653 * Sets "Format" field of MThd header to the specified value. Note that you
654 * don't really need to use this, as libsmf will automatically change format
655 * from 0 to 1 when you add the second track.
657 * \param format 0 for one track per file, 1 for several tracks per file.
660 smf_set_format(smf_t *smf, int format)
662 assert(format == 0 || format == 1);
664 if (smf->number_of_tracks > 1 && format == 0) {
665 g_critical("There is more than one track, cannot set format to 0.");
669 smf->format = format;
675 * Sets the PPQN ("Division") field of MThd header. This is mandatory, you
676 * should call it right after smf_new. Note that changing PPQN will change time_seconds
679 * \param ppqn New PPQN.
682 smf_set_ppqn(smf_t *smf, uint16_t ppqn)
690 * Returns next event from the track given and advances next event counter.
691 * Do not depend on End Of Track event being the last event on the track - it
692 * is possible that the track will not end with EOT if you haven't added it
693 * yet. EOTs are added automatically during smf_save().
695 * \return Event or NULL, if there are no more events left in this track.
698 smf_track_get_next_event(smf_track_t *track)
700 smf_event_t *event, *next_event;
702 /* Track is empty? */
703 if (track->number_of_events == 0)
707 if (track->next_event_number == 0)
710 assert(track->next_event_number >= 1);
712 event = smf_track_get_event_by_number(track, track->next_event_number);
714 assert(event != NULL);
716 /* Is this the last event in the track? */
717 if (track->next_event_number < track->number_of_events) {
718 next_event = smf_track_get_event_by_number(track, track->next_event_number + 1);
721 track->time_of_next_event = next_event->time_pulses;
722 track->next_event_number++;
724 track->next_event_number = 0;
731 * Returns next event from the track given. Does not change next event counter,
732 * so repeatedly calling this routine will return the same event.
733 * \return Event or NULL, if there are no more events left in this track.
736 smf_peek_next_event_from_track(smf_track_t *track)
741 if (track->next_event_number == 0)
744 assert(track->next_event_number >= 1);
745 assert(track->events_array->len != 0);
747 event = smf_track_get_event_by_number(track, track->next_event_number);
753 * \return Track with a given number or NULL, if there is no such track.
754 * Tracks are numbered consecutively starting from one.
757 smf_get_track_by_number(const smf_t *smf, int track_number)
761 assert(track_number >= 1);
763 if (track_number > smf->number_of_tracks)
766 track = (smf_track_t *)g_ptr_array_index(smf->tracks_array, track_number - 1);
774 * \return Event with a given number or NULL, if there is no such event.
775 * Events are numbered consecutively starting from one.
778 smf_track_get_event_by_number(const smf_track_t *track, size_t event_number)
782 assert(event_number >= 1);
784 if (event_number > track->number_of_events)
787 event = (smf_event_t*)g_ptr_array_index(track->events_array, event_number - 1);
795 * \return Last event on the track or NULL, if track is empty.
798 smf_track_get_last_event(const smf_track_t *track)
802 if (track->number_of_events == 0)
805 event = smf_track_get_event_by_number(track, track->number_of_events);
811 * Searches for track that contains next event, in time order. In other words,
812 * returns the track that contains event that should be played next.
813 * \return Track with next event or NULL, if there are no events left.
816 smf_find_track_with_next_event(smf_t *smf)
820 smf_track_t *track = NULL, *min_time_track = NULL;
822 /* Find track with event that should be played next. */
823 for (i = 1; i <= smf->number_of_tracks; i++) {
824 track = smf_get_track_by_number(smf, i);
828 /* No more events in this track? */
829 if (track->next_event_number == 0)
832 if (track->time_of_next_event < min_time || min_time_track == NULL) {
833 min_time = track->time_of_next_event;
834 min_time_track = track;
838 return (min_time_track);
842 * \return Next event, in time order, or NULL, if there are none left.
845 smf_get_next_event(smf_t *smf)
848 smf_track_t *track = smf_find_track_with_next_event(smf);
852 g_debug("End of the song.");
858 event = smf_track_get_next_event(track);
860 assert(event != NULL);
862 event->track->smf->last_seek_position = -1.0;
868 * Advance the "next event counter". This is functionally the same as calling
869 * smf_get_next_event and ignoring the return value.
872 smf_skip_next_event(smf_t *smf)
874 smf_event_t *ignored = smf_get_next_event(smf);
879 * \return Next event, in time order, or NULL, if there are none left. Does
880 * not advance position in song.
883 smf_peek_next_event(smf_t *smf)
886 smf_track_t *track = smf_find_track_with_next_event(smf);
890 g_debug("End of the song.");
896 event = smf_peek_next_event_from_track(track);
898 assert(event != NULL);
904 * Rewinds the SMF. What that means is, after calling this routine, smf_get_next_event
905 * will return first event in the song.
908 smf_rewind(smf_t *smf)
911 smf_track_t *track = NULL;
916 smf->last_seek_position = 0.0;
918 for (i = 1; i <= smf->number_of_tracks; i++) {
919 track = smf_get_track_by_number(smf, i);
921 assert(track != NULL);
923 if (track->number_of_events > 0) {
924 track->next_event_number = 1;
925 event = smf_peek_next_event_from_track(track);
927 track->time_of_next_event = event->time_pulses;
929 track->next_event_number = 0;
930 track->time_of_next_event = 0;
932 g_warning("Warning: empty track.");
939 * Seeks the SMF to the given event. After calling this routine, smf_get_next_event
940 * will return the event that was the second argument of this call.
943 smf_seek_to_event(smf_t *smf, const smf_event_t *target)
950 g_debug("Seeking to event %d, track %d.", target->event_number, target->track->track_number);
954 event = smf_peek_next_event(smf);
956 /* There can't be NULL here, unless "target" is not in this smf. */
960 smf_skip_next_event(smf);
965 smf->last_seek_position = event->time_seconds;
971 * Seeks the SMF to the given position. For example, after seeking to 1.0 seconds,
972 * smf_get_next_event will return first event that happens after the first second of song.
975 smf_seek_to_seconds(smf_t *smf, double seconds)
979 assert(seconds >= 0.0);
981 if (seconds == smf->last_seek_position) {
983 g_debug("Avoiding seek to %f seconds.", seconds);
991 g_debug("Seeking to %f seconds.", seconds);
995 event = smf_peek_next_event(smf);
998 g_critical("Trying to seek past the end of song.");
1002 if (event->time_seconds < seconds)
1003 smf_skip_next_event(smf);
1008 smf->last_seek_position = seconds;
1014 * Seeks the SMF to the given position. For example, after seeking to 10 pulses,
1015 * smf_get_next_event will return first event that happens after the first ten pulses.
1018 smf_seek_to_pulses(smf_t *smf, size_t pulses)
1025 g_debug("Seeking to %d pulses.", pulses);
1029 event = smf_peek_next_event(smf);
1031 if (event == NULL) {
1032 g_critical("Trying to seek past the end of song.");
1036 if (event->time_pulses < pulses)
1037 smf_skip_next_event(smf);
1042 smf->last_seek_position = event->time_seconds;
1048 * \return Length of SMF, in pulses.
1051 smf_get_length_pulses(const smf_t *smf)
1056 for (i = 1; i <= smf->number_of_tracks; i++) {
1060 track = smf_get_track_by_number(smf, i);
1063 event = smf_track_get_last_event(track);
1068 if (event->time_pulses > pulses)
1069 pulses = event->time_pulses;
1076 * \return Length of SMF, in seconds.
1079 smf_get_length_seconds(const smf_t *smf)
1082 double seconds = 0.0;
1084 for (i = 1; i <= smf->number_of_tracks; i++) {
1088 track = smf_get_track_by_number(smf, i);
1091 event = smf_track_get_last_event(track);
1096 if (event->time_seconds > seconds)
1097 seconds = event->time_seconds;
1104 * \return Nonzero, if there are no events in the SMF after this one.
1105 * Note that may be more than one "last event", if they occur at the same time.
1108 smf_event_is_last(const smf_event_t *event)
1110 if (smf_get_length_pulses(event->track->smf) <= event->time_pulses)
1117 * \return Version of libsmf.
1120 smf_get_version(void)
1122 return (SMF_VERSION);