00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00213 #ifndef SMF_H
00214 #define SMF_H
00215
00216 #ifdef __cplusplus
00217 extern "C" {
00218 #endif
00219
00220 #include <stdio.h>
00221 #include <glib.h>
00222
00223 #if defined(__GNUC__) && __GNUC__ >= 4
00224 #define WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
00225 #else
00226 #define WARN_UNUSED_RESULT
00227 #endif
00228
00230 struct smf_struct {
00231 int format;
00232
00234 int ppqn;
00235 int frames_per_second;
00236 int resolution;
00237 int number_of_tracks;
00238
00240 FILE *stream;
00241 void *file_buffer;
00242 int file_buffer_length;
00243 int next_chunk_offset;
00244 int expected_number_of_tracks;
00245
00247 GPtrArray *tracks_array;
00248 double last_seek_position;
00249
00252 GPtrArray *tempo_array;
00253 };
00254
00255 typedef struct smf_struct smf_t;
00256
00258 struct smf_tempo_struct {
00259 int time_pulses;
00260 double time_seconds;
00261 int microseconds_per_quarter_note;
00262 int numerator;
00263 int denominator;
00264 int clocks_per_click;
00265 int notes_per_note;
00266 };
00267
00268 typedef struct smf_tempo_struct smf_tempo_t;
00269
00271 struct smf_track_struct {
00272 smf_t *smf;
00273
00274 int track_number;
00275 int number_of_events;
00276
00278 void *file_buffer;
00279 int file_buffer_length;
00280 int last_status;
00281
00284 int next_event_offset;
00285 int next_event_number;
00286
00288 int time_of_next_event;
00289 GPtrArray *events_array;
00290
00295 void *user_pointer;
00296 };
00297
00298 typedef struct smf_track_struct smf_track_t;
00299
00301 struct smf_event_struct {
00303 smf_track_t *track;
00304
00306 int event_number;
00307
00310 int delta_time_pulses;
00311
00313 int time_pulses;
00314
00316 double time_seconds;
00317
00319 int track_number;
00320
00322 unsigned char *midi_buffer;
00323
00325 int midi_buffer_length;
00326
00331 void *user_pointer;
00332 };
00333
00334 typedef struct smf_event_struct smf_event_t;
00335
00336
00337 smf_t *smf_new(void) WARN_UNUSED_RESULT;
00338 void smf_delete(smf_t *smf);
00339
00340 int smf_set_format(smf_t *smf, int format) WARN_UNUSED_RESULT;
00341 int smf_set_ppqn(smf_t *smf, int format) WARN_UNUSED_RESULT;
00342
00343 char *smf_decode(const smf_t *smf) WARN_UNUSED_RESULT;
00344
00345 smf_track_t *smf_get_track_by_number(const smf_t *smf, int track_number) WARN_UNUSED_RESULT;
00346
00347 smf_event_t *smf_peek_next_event(smf_t *smf) WARN_UNUSED_RESULT;
00348 smf_event_t *smf_get_next_event(smf_t *smf) WARN_UNUSED_RESULT;
00349 void smf_skip_next_event(smf_t *smf);
00350
00351 void smf_rewind(smf_t *smf);
00352 int smf_seek_to_seconds(smf_t *smf, double seconds) WARN_UNUSED_RESULT;
00353 int smf_seek_to_pulses(smf_t *smf, int pulses) WARN_UNUSED_RESULT;
00354 int smf_seek_to_event(smf_t *smf, const smf_event_t *event) WARN_UNUSED_RESULT;
00355
00356 int smf_get_length_pulses(const smf_t *smf) WARN_UNUSED_RESULT;
00357 double smf_get_length_seconds(const smf_t *smf) WARN_UNUSED_RESULT;
00358 int smf_event_is_last(const smf_event_t *event) WARN_UNUSED_RESULT;
00359
00360 void smf_add_track(smf_t *smf, smf_track_t *track);
00361 void smf_track_remove_from_smf(smf_track_t *track);
00362
00363
00364 smf_track_t *smf_track_new(void) WARN_UNUSED_RESULT;
00365 void smf_track_delete(smf_track_t *track);
00366
00367 smf_event_t *smf_track_get_next_event(smf_track_t *track) WARN_UNUSED_RESULT;
00368 smf_event_t *smf_track_get_event_by_number(const smf_track_t *track, int event_number) WARN_UNUSED_RESULT;
00369 smf_event_t *smf_track_get_last_event(const smf_track_t *track) WARN_UNUSED_RESULT;
00370
00371 void smf_track_add_event_delta_pulses(smf_track_t *track, smf_event_t *event, int pulses);
00372 void smf_track_add_event_pulses(smf_track_t *track, smf_event_t *event, int pulses);
00373 void smf_track_add_event_seconds(smf_track_t *track, smf_event_t *event, double seconds);
00374 int smf_track_add_eot_delta_pulses(smf_track_t *track, int delta) WARN_UNUSED_RESULT;
00375 int smf_track_add_eot_pulses(smf_track_t *track, int pulses) WARN_UNUSED_RESULT;
00376 int smf_track_add_eot_seconds(smf_track_t *track, double seconds) WARN_UNUSED_RESULT;
00377 void smf_event_remove_from_track(smf_event_t *event);
00378
00379
00380 smf_event_t *smf_event_new(void) WARN_UNUSED_RESULT;
00381 smf_event_t *smf_event_new_from_pointer(void *midi_data, int len) WARN_UNUSED_RESULT;
00382 smf_event_t *smf_event_new_from_bytes(int first_byte, int second_byte, int third_byte) WARN_UNUSED_RESULT;
00383 smf_event_t *smf_event_new_textual(int type, const char *text);
00384 void smf_event_delete(smf_event_t *event);
00385
00386 int smf_event_is_valid(const smf_event_t *event) WARN_UNUSED_RESULT;
00387 int smf_event_is_metadata(const smf_event_t *event) WARN_UNUSED_RESULT;
00388 int smf_event_is_system_realtime(const smf_event_t *event) WARN_UNUSED_RESULT;
00389 int smf_event_is_system_common(const smf_event_t *event) WARN_UNUSED_RESULT;
00390 int smf_event_is_sysex(const smf_event_t *event) WARN_UNUSED_RESULT;
00391 int smf_event_is_eot(const smf_event_t *event) WARN_UNUSED_RESULT;
00392 int smf_event_is_textual(const smf_event_t *event) WARN_UNUSED_RESULT;
00393 char *smf_event_decode(const smf_event_t *event) WARN_UNUSED_RESULT;
00394 char *smf_event_extract_text(const smf_event_t *event) WARN_UNUSED_RESULT;
00395
00396
00397 smf_t *smf_load(const char *file_name) WARN_UNUSED_RESULT;
00398 smf_t *smf_load_from_memory(const void *buffer, const int buffer_length) WARN_UNUSED_RESULT;
00399
00400
00401 int smf_save(smf_t *smf, const char *file_name) WARN_UNUSED_RESULT;
00402
00403
00404 smf_tempo_t *smf_get_tempo_by_pulses(const smf_t *smf, int pulses) WARN_UNUSED_RESULT;
00405 smf_tempo_t *smf_get_tempo_by_seconds(const smf_t *smf, double seconds) WARN_UNUSED_RESULT;
00406 smf_tempo_t *smf_get_tempo_by_number(const smf_t *smf, int number) WARN_UNUSED_RESULT;
00407 smf_tempo_t *smf_get_last_tempo(const smf_t *smf) WARN_UNUSED_RESULT;
00408
00409 const char *smf_get_version(void) WARN_UNUSED_RESULT;
00410
00411 #ifdef __cplusplus
00412 }
00413 #endif
00414
00415 #endif
00416