ardour
smf.h
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 2007, 2008 Edward Tomasz NapieraƂa <trasz@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
13  *
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.
25  *
26  */
27 
216 #ifndef SMF_H
217 #define SMF_H
218 
219 #ifdef __cplusplus
220 extern "C" {
221 #endif
222 
223 #include <stdio.h>
224 #include <stdint.h>
225 #include <glib.h>
226 
227 #if defined(__GNUC__) && __GNUC__ >= 4
228 #define WARN_UNUSED_RESULT __attribute__ ((warn_unused_result))
229 #else
230 #define WARN_UNUSED_RESULT
231 #endif
232 
234 struct smf_struct {
235  int format;
236 
239  uint16_t ppqn;
243 
245  FILE *stream;
246  void *file_buffer;
250 
252  GPtrArray *tracks_array;
254 
257  GPtrArray *tempo_array;
258 };
259 
260 typedef struct smf_struct smf_t;
261 
264  size_t time_pulses;
265  double time_seconds;
271 };
272 
274 
278 
281 
283  void *file_buffer;
285  int last_status; /* Used for "running status". */
286 
291 
294  GPtrArray *events_array;
295 };
296 
298 
303 
305  size_t event_number;
306 
310 
312  size_t time_pulses;
313 
315  double time_seconds;
316 
319 
321  uint8_t *midi_buffer;
322 
325 };
326 
328 
329 /* Routines for manipulating smf_t. */
331 void smf_delete(smf_t *smf);
332 
333 int smf_set_format(smf_t *smf, int format) WARN_UNUSED_RESULT;
334 int smf_set_ppqn(smf_t *smf, uint16_t ppqn) WARN_UNUSED_RESULT;
335 
336 char *smf_decode(const smf_t *smf) WARN_UNUSED_RESULT;
337 
338 smf_track_t *smf_get_track_by_number(const smf_t *smf, int track_number) WARN_UNUSED_RESULT;
339 
340 smf_event_t *smf_peek_next_event(smf_t *smf) WARN_UNUSED_RESULT;
341 smf_event_t *smf_get_next_event(smf_t *smf) WARN_UNUSED_RESULT;
342 void smf_skip_next_event(smf_t *smf);
343 
344 void smf_rewind(smf_t *smf);
345 int smf_seek_to_seconds(smf_t *smf, double seconds) WARN_UNUSED_RESULT;
346 int smf_seek_to_pulses(smf_t *smf, size_t pulses) WARN_UNUSED_RESULT;
347 int smf_seek_to_event(smf_t *smf, const smf_event_t *event) WARN_UNUSED_RESULT;
348 
349 size_t smf_get_length_pulses(const smf_t *smf) WARN_UNUSED_RESULT;
350 double smf_get_length_seconds(const smf_t *smf) WARN_UNUSED_RESULT;
351 int smf_event_is_last(const smf_event_t *event) WARN_UNUSED_RESULT;
352 
353 void smf_add_track(smf_t *smf, smf_track_t *track);
355 
356 /* Routines for manipulating smf_track_t. */
357 smf_track_t *smf_track_new(void) WARN_UNUSED_RESULT;
358 void smf_track_delete(smf_track_t *track);
359 
360 smf_event_t *smf_track_get_next_event(smf_track_t *track) WARN_UNUSED_RESULT;
361 smf_event_t *smf_track_get_event_by_number(const smf_track_t *track, size_t num) WARN_UNUSED_RESULT;
362 smf_event_t *smf_track_get_last_event(const smf_track_t *track) WARN_UNUSED_RESULT;
363 
364 void smf_track_add_event_delta_pulses(smf_track_t *track, smf_event_t *event, uint32_t delta);
365 void smf_track_add_event_pulses(smf_track_t *track, smf_event_t *event, size_t pulses);
366 void smf_track_add_event_seconds(smf_track_t *track, smf_event_t *event, double seconds);
367 int smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta) WARN_UNUSED_RESULT;
368 int smf_track_add_eot_pulses(smf_track_t *track, size_t pulses) WARN_UNUSED_RESULT;
369 int smf_track_add_eot_seconds(smf_track_t *track, double seconds) WARN_UNUSED_RESULT;
371 
372 /* Routines for manipulating smf_event_t. */
373 smf_event_t *smf_event_new(void) WARN_UNUSED_RESULT;
374 smf_event_t *smf_event_new_from_pointer(const void *midi_data, size_t len) WARN_UNUSED_RESULT;
375 smf_event_t *smf_event_new_from_bytes(int byte1, int byte2, int byte3) WARN_UNUSED_RESULT;
376 smf_event_t *smf_event_new_textual(int type, const char *text);
377 void smf_event_delete(smf_event_t *event);
378 
379 int smf_event_is_valid(const smf_event_t *event) WARN_UNUSED_RESULT;
380 int smf_event_is_metadata(const smf_event_t *event) WARN_UNUSED_RESULT;
381 int smf_event_is_system_realtime(const smf_event_t *event) WARN_UNUSED_RESULT;
382 int smf_event_is_system_common(const smf_event_t *event) WARN_UNUSED_RESULT;
383 int smf_event_is_sysex(const smf_event_t *event) WARN_UNUSED_RESULT;
384 int smf_event_is_eot(const smf_event_t *event) WARN_UNUSED_RESULT;
385 int smf_event_is_textual(const smf_event_t *event) WARN_UNUSED_RESULT;
386 char *smf_event_decode(const smf_event_t *event) WARN_UNUSED_RESULT;
387 char *smf_event_extract_text(const smf_event_t *event) WARN_UNUSED_RESULT;
388 
389 /* Routines for dealing with Variable Length Quantities (VLQ's).
390  Slightly odd names reflect original static names within libsmf
391  */
392 int smf_format_vlq (unsigned char *buf, int length, unsigned long value);
393 int smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32_t *value, uint32_t *len);
394 
395 /* Routines for loading SMF files. */
396 smf_t *smf_load(FILE *) WARN_UNUSED_RESULT;
397 smf_t *smf_load_from_memory(const void *buffer, const size_t buffer_length) WARN_UNUSED_RESULT;
398 
399 /* Routine for writing SMF files. */
400 int smf_save(smf_t *smf, FILE *file) WARN_UNUSED_RESULT;
401 
402 /* Routines for manipulating smf_tempo_t. */
403 smf_tempo_t *smf_get_tempo_by_pulses(const smf_t *smf, size_t pulses) WARN_UNUSED_RESULT;
404 smf_tempo_t *smf_get_tempo_by_seconds(const smf_t *smf, double seconds) WARN_UNUSED_RESULT;
405 smf_tempo_t *smf_get_tempo_by_number(const smf_t *smf, size_t number) WARN_UNUSED_RESULT;
406 smf_tempo_t *smf_get_last_tempo(const smf_t *smf) WARN_UNUSED_RESULT;
407 
408 const char *smf_get_version(void) WARN_UNUSED_RESULT;
409 
410 #ifdef __cplusplus
411 }
412 #endif
413 
414 #endif /* SMF_H */
415 
void smf_event_delete(smf_event_t *event)
Definition: smf.c:371
void smf_track_remove_from_smf(smf_track_t *track)
Definition: smf.c:185
int smf_seek_to_seconds(smf_t *smf, double seconds) WARN_UNUSED_RESULT
Definition: smf.c:975
int clocks_per_click
Definition: smf.h:269
int32_t delta_time_pulses
Definition: smf.h:309
void smf_add_track(smf_t *smf, smf_track_t *track)
Definition: smf.c:156
double time_seconds
Definition: smf.h:265
int smf_event_is_valid(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_load.c:770
int last_status
Definition: smf.h:285
int format
Definition: smf.h:235
GPtrArray * events_array
Definition: smf.h:294
int smf_track_add_eot_pulses(smf_track_t *track, size_t pulses) WARN_UNUSED_RESULT
Definition: smf.c:545
int numerator
Definition: smf.h:267
void * file_buffer
Definition: smf.h:246
int smf_seek_to_pulses(smf_t *smf, size_t pulses) WARN_UNUSED_RESULT
Definition: smf.c:1018
GPtrArray * tempo_array
Definition: smf.h:257
smf_event_t * smf_event_new_from_bytes(int byte1, int byte2, int byte3) WARN_UNUSED_RESULT
Definition: smf.c:290
size_t smf_get_length_pulses(const smf_t *smf) WARN_UNUSED_RESULT
Definition: smf.c:1051
smf_event_t * smf_get_next_event(smf_t *smf) WARN_UNUSED_RESULT
Definition: smf.c:845
void smf_track_add_event_pulses(smf_track_t *track, smf_event_t *event, size_t pulses)
Definition: smf_tempo.c:418
const char * smf_get_version(void) WARN_UNUSED_RESULT
Definition: smf.c:1120
smf_track_t * smf_get_track_by_number(const smf_t *smf, int track_number) WARN_UNUSED_RESULT
Definition: smf.c:757
size_t midi_buffer_length
Definition: smf.h:324
GPtrArray * tracks_array
Definition: smf.h:252
size_t event_number
Definition: smf.h:305
int smf_event_is_metadata(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_decode.c:57
int denominator
Definition: smf.h:268
smf_t * smf_load_from_memory(const void *buffer, const size_t buffer_length) WARN_UNUSED_RESULT
Definition: smf_load.c:876
int track_number
Definition: smf.h:279
int notes_per_note
Definition: smf.h:270
smf_tempo_t * smf_get_tempo_by_seconds(const smf_t *smf, double seconds) WARN_UNUSED_RESULT
Definition: smf_tempo.c:294
void smf_track_delete(smf_track_t *track)
Definition: smf.c:131
smf_t * smf_new(void) WARN_UNUSED_RESULT
Definition: smf.c:55
size_t next_chunk_offset
Definition: smf.h:248
char * smf_event_decode(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_decode.c:519
int smf_extract_vlq(const unsigned char *buf, const size_t buffer_length, uint32_t *value, uint32_t *len)
Definition: smf_load.c:213
smf_event_t * smf_event_new_from_pointer(const void *midi_data, size_t len) WARN_UNUSED_RESULT
Definition: smf.c:251
smf_tempo_t * smf_get_tempo_by_number(const smf_t *smf, size_t number) WARN_UNUSED_RESULT
Definition: smf_tempo.c:257
int smf_event_is_system_common(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_decode.c:90
#define WARN_UNUSED_RESULT
Definition: smf.h:230
smf_t * smf
Definition: smf.h:277
uint16_t ppqn
Definition: smf.h:239
int smf_event_is_last(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf.c:1108
int expected_number_of_tracks
Definition: smf.h:249
smf_track_t * smf_track_new(void) WARN_UNUSED_RESULT
Definition: smf.c:110
int smf_event_is_eot(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_save.c:467
double smf_get_length_seconds(const smf_t *smf) WARN_UNUSED_RESULT
Definition: smf.c:1079
void smf_event_remove_from_track(smf_event_t *event)
Definition: smf.c:588
int smf_event_is_sysex(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_decode.c:104
size_t time_pulses
Definition: smf.h:312
void smf_skip_next_event(smf_t *smf)
Definition: smf.c:872
size_t next_event_offset
Definition: smf.h:289
int frames_per_second
Definition: smf.h:240
smf_event_t * smf_peek_next_event(smf_t *smf) WARN_UNUSED_RESULT
Definition: smf.c:883
int number_of_tracks
Definition: smf.h:242
int smf_track_add_eot_seconds(smf_track_t *track, double seconds) WARN_UNUSED_RESULT
Definition: smf.c:565
int smf_event_is_system_realtime(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_decode.c:72
size_t number_of_events
Definition: smf.h:280
double last_seek_position
Definition: smf.h:253
size_t time_pulses
Definition: smf.h:264
void smf_rewind(smf_t *smf)
Definition: smf.c:908
FILE * stream
Definition: smf.h:245
smf_event_t * smf_track_get_last_event(const smf_track_t *track) WARN_UNUSED_RESULT
Definition: smf.c:798
smf_tempo_t * smf_get_tempo_by_pulses(const smf_t *smf, size_t pulses) WARN_UNUSED_RESULT
Definition: smf_tempo.c:269
int resolution
Definition: smf.h:241
void smf_delete(smf_t *smf)
Definition: smf.c:88
char * smf_event_extract_text(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_load.c:668
int smf_set_ppqn(smf_t *smf, uint16_t ppqn) WARN_UNUSED_RESULT
Definition: smf.c:682
double time_seconds
Definition: smf.h:315
int microseconds_per_quarter_note
Definition: smf.h:266
char * smf_decode(const smf_t *smf) WARN_UNUSED_RESULT
Definition: smf_decode.c:605
size_t file_buffer_length
Definition: smf.h:247
smf_event_t * smf_event_new_textual(int type, const char *text)
Definition: smf_save.c:193
void smf_track_add_event_delta_pulses(smf_track_t *track, smf_event_t *event, uint32_t delta)
Definition: smf_tempo.c:400
int smf_seek_to_event(smf_t *smf, const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf.c:943
smf_t * smf_load(FILE *) WARN_UNUSED_RESULT
Definition: smf_load.c:930
smf_event_t * smf_track_get_next_event(smf_track_t *track) WARN_UNUSED_RESULT
Definition: smf.c:698
void smf_track_add_event_seconds(smf_track_t *track, smf_event_t *event, double seconds)
Definition: smf_tempo.c:434
int smf_set_format(smf_t *smf, int format) WARN_UNUSED_RESULT
Definition: smf.c:660
void * file_buffer
Definition: smf.h:283
smf_event_t * smf_track_get_event_by_number(const smf_track_t *track, size_t num) WARN_UNUSED_RESULT
Definition: smf.c:778
int smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta) WARN_UNUSED_RESULT
Definition: smf.c:531
smf_event_t * smf_event_new(void) WARN_UNUSED_RESULT
Definition: smf.c:225
smf_tempo_t * smf_get_last_tempo(const smf_t *smf) WARN_UNUSED_RESULT
Definition: smf_tempo.c:322
int track_number
Definition: smf.h:318
int smf_event_is_textual(const smf_event_t *event) WARN_UNUSED_RESULT
Definition: smf_load.c:648
size_t file_buffer_length
Definition: smf.h:284
int smf_save(smf_t *smf, FILE *file) WARN_UNUSED_RESULT
Definition: smf_save.c:623
size_t next_event_number
Definition: smf.h:290
uint8_t * midi_buffer
Definition: smf.h:321
smf_track_t * track
Definition: smf.h:302
smf_t * smf
Definition: smfsh.c:51
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length
Definition: region.cc:64
size_t time_of_next_event
Definition: smf.h:293
int smf_format_vlq(unsigned char *buf, int length, unsigned long value)
Definition: smf_save.c:164