static int cmd_length(char *notused) { g_message("Length: %d pulses, %f seconds.", smf_get_length_pulses(smf), smf_get_length_seconds(smf)); return (0); }
double get_end_time () { if (Denemo.project && Denemo.project->movement && Denemo.project->movement->smf) { if (Denemo.project->movement->end_time < 0.0) Denemo.project->movement->end_time = smf_get_length_seconds (Denemo.project->movement->smf); return Denemo.project->movement->end_time; } else { return 0.0; } }
//finds the first note which comes ON after the passed time DenemoObject * get_obj_for_start_time (smf_t * smf, gdouble time) { if (time < 0.0) time = 0.0; static smf_event_t *event; smf_event_t *initial = smf_peek_next_event (smf); gdouble total = smf_get_length_seconds (smf); time = (time > total ? total : time); if(smf_seek_to_seconds (smf, time)) g_debug("smf_seek_to_seconds failed"); do { event = smf_get_next_event (smf); } while (event && (((event->midi_buffer[0] & 0xF0) == MIDI_NOTE_OFF) || !event->user_pointer)); if (initial && smf_seek_to_event (smf, initial)) g_debug("smf_seek_to_event failed"); //if (event) g_debug("sought for endObj %f found %f\n", time, event->time_seconds); if (event) return (DenemoObject *) (event->user_pointer); return get_object_for_time (time, TRUE); }
//finds the first note which comes OFF after the passed time DenemoObject * get_obj_for_end_time (smf_t * smf, gdouble time) { if (time < 0.0) time = 0.0; static smf_event_t *event = NULL; smf_event_t *initial = smf_peek_next_event (smf); gdouble total = smf_get_length_seconds (smf); time = (time > total ? total : time); if(smf_seek_to_seconds (smf, time)) g_debug("smf_seek_to_seconds failed"); do { event = smf_get_next_event (smf); } while (event && (((event->midi_buffer[0] & 0xF0) == MIDI_NOTE_ON) || !event->user_pointer)); if (initial && smf_seek_to_event (smf, initial)) g_debug("smf_seek_to_event failed");//if (event) g_debug("sought for startObj %f found %f\n", time, event->time_seconds); if (event) return (DenemoObject *) (event->user_pointer); //midi is generated by LilyPond, no user_pointer, get timings from events.txt return get_object_for_time (time, FALSE); }