42 #ifdef PLATFORM_WINDOWS
45 #include <arpa/inet.h>
61 g_critical(
"Cannot allocate smf_t structure: %s", strerror(errno));
65 memset(smf, 0,
sizeof(
smf_t));
101 memset(smf, 0,
sizeof(
smf_t));
114 g_critical(
"Cannot allocate smf_track_t structure: %s", strerror(errno));
162 assert(track->
smf == NULL);
192 assert(track->
smf != NULL);
229 g_critical(
"Cannot allocate smf_event_t structure: %s", strerror(errno));
235 event->delta_time_pulses = -1;
236 event->time_pulses = -1;
237 event->time_seconds = -1.0;
238 event->track_number = -1;
259 event->midi_buffer_length = len;
262 g_critical(
"Cannot allocate MIDI buffer structure: %s", strerror(errno));
300 if (first_byte < 0) {
301 g_critical(
"First byte of MIDI message cannot be < 0");
307 if (first_byte > 255) {
308 g_critical(
"smf_event_new_from_bytes: first byte is %d, which is larger than 255.", 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);
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);
344 g_critical(
"smf_event_new_from_bytes: third byte cannot be a status byte.");
349 event->midi_buffer_length = len;
352 g_critical(
"Cannot allocate MIDI buffer structure: %s", strerror(errno));
358 event->midi_buffer[0] = first_byte;
360 event->midi_buffer[1] = second_byte;
362 event->midi_buffer[2] = third_byte;
373 if (event->
track != NULL)
451 size_t i, last_pulses = 0;
453 assert(track->
smf != NULL);
454 assert(event->
track == NULL);
460 event->track = track;
474 if (last_pulses <= event->time_pulses) {
475 event->delta_time_pulses =
event->time_pulses - last_pulses;
550 if (last_event != NULL) {
570 if (last_event != NULL) {
595 assert(event->
track != NULL);
598 track =
event->track;
615 for (i = event->
event_number; i <= track->number_of_events; i++) {
629 event->event_number = 0;
630 event->delta_time_pulses = -1;
631 event->time_pulses = 0;
632 event->time_seconds = -1.0;
662 assert(format == 0 || format == 1);
665 g_critical(
"There is more than one track, cannot set format to 0.");
714 assert(event != NULL);
761 assert(track_number >= 1);
782 assert(event_number >= 1);
834 min_time_track = track;
838 return (min_time_track);
852 g_debug(
"End of the song.");
860 assert(event != NULL);
862 event->track->smf->last_seek_position = -1.0;
890 g_debug(
"End of the song.");
898 assert(event != NULL);
921 assert(track != NULL);
932 g_warning(
"Warning: empty track.");
979 assert(seconds >= 0.0);
983 g_debug(
"Avoiding seek to %f seconds.", seconds);
991 g_debug(
"Seeking to %f seconds.", seconds);
998 g_critical(
"Trying to seek past the end of song.");
1025 g_debug(
"Seeking to %d pulses.", pulses);
1031 if (event == NULL) {
1032 g_critical(
"Trying to seek past the end of song.");
1069 pulses =
event->time_pulses;
1082 double seconds = 0.0;
1097 seconds =
event->time_seconds;
1122 return (SMF_VERSION);
void smf_rewind(smf_t *smf)
double smf_get_length_seconds(const smf_t *smf)
int32_t delta_time_pulses
static void remove_eot_if_before_pulses(smf_track_t *track, size_t pulses)
int smf_event_is_tempo_change_or_time_signature(const smf_event_t *event)
void smf_track_add_event(smf_track_t *track, smf_event_t *event)
int smf_set_ppqn(smf_t *smf, uint16_t ppqn)
void smf_track_add_event_pulses(smf_track_t *track, smf_event_t *event, size_t pulses)
void smf_track_remove_from_smf(smf_track_t *track)
static gint events_array_compare_function(gconstpointer aa, gconstpointer bb)
size_t midi_buffer_length
int smf_seek_to_event(smf_t *smf, const smf_event_t *target)
void smf_add_track(smf_t *smf, smf_track_t *track)
int smf_event_is_metadata(const smf_event_t *event) WARN_UNUSED_RESULT
void smf_init_tempo(smf_t *smf)
smf_event_t * smf_track_get_event_by_number(const smf_track_t *track, size_t event_number)
void smf_event_delete(smf_event_t *event)
void smf_create_tempo_map_and_compute_seconds(smf_t *smf)
int smf_track_add_eot_pulses(smf_track_t *track, size_t pulses)
int smf_seek_to_pulses(smf_t *smf, size_t pulses)
void maybe_add_to_tempo_map(smf_event_t *event)
int smf_event_is_eot(const smf_event_t *event) WARN_UNUSED_RESULT
smf_event_t * smf_event_new_from_bytes(int first_byte, int second_byte, int third_byte)
smf_event_t * smf_event_new_from_pointer(const void *midi_data, size_t len)
void smf_delete(smf_t *smf)
const char * smf_get_version(void)
smf_track_t * smf_track_new(void)
static smf_event_t * smf_peek_next_event_from_track(smf_track_t *track)
smf_event_t * smf_event_new(void)
double last_seek_position
void remove_last_tempo_with_pulses(smf_t *smf, size_t pulses)
int smf_seek_to_seconds(smf_t *smf, double seconds)
int smf_event_is_last(const smf_event_t *event)
int is_status_byte(const unsigned char status)
smf_event_t * smf_track_get_next_event(smf_track_t *track)
smf_track_t * smf_find_track_with_next_event(smf_t *smf)
smf_track_t * smf_get_track_by_number(const smf_t *smf, int track_number)
void smf_track_add_event_delta_pulses(smf_track_t *track, smf_event_t *event, uint32_t delta)
int smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta)
void smf_event_remove_from_track(smf_event_t *event)
smf_event_t * smf_track_get_last_event(const smf_track_t *track)
void smf_fini_tempo(smf_t *smf)
void smf_track_add_event_seconds(smf_track_t *track, smf_event_t *event, double seconds)
void smf_track_delete(smf_track_t *track)
int smf_track_add_eot_seconds(smf_track_t *track, double seconds)
smf_event_t * smf_peek_next_event(smf_t *smf)
int smf_set_format(smf_t *smf, int format)
size_t smf_get_length_pulses(const smf_t *smf)
smf_event_t * smf_get_next_event(smf_t *smf)
size_t time_of_next_event
void smf_skip_next_event(smf_t *smf)