1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/* Copyright (c) 2001-2003 krzYszcz and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
/* reading/writing midifiles, a prototype version */
#ifndef __MIFI_H__
#define __MIFI_H__
/* event types, as returned by mifi_read_event() */
#define MIFI_READ_FATAL -3 /* unexpected eof, error in last track, or file error */
#define MIFI_READ_EOF -2 /* regular eof */
#define MIFI_READ_SKIP -1 /* error and successful skip to the next track */
#define MIFI_META_SEQNUM 0
#define MIFI_META_TEXT 1
#define MIFI_META_COPYRIGHT 2
#define MIFI_META_TRACKNAME 3
#define MIFI_META_INSTRUMENT 4
#define MIFI_META_LYRIC 5
#define MIFI_META_MARKER 6
#define MIFI_META_CUE 7
#define MIFI_META_MAXPRINTABLE 15 /* 1..15 are various text meta-events */
#define MIFI_META_CHANNEL 0x20 /* channel prefix */
#define MIFI_META_EOT 0x2f /* end of track */
#define MIFI_META_TEMPO 0x51
#define MIFI_META_SMPTE 0x54 /* SMPTE offset */
#define MIFI_META_TIMESIG 0x58 /* time signature */
#define MIFI_META_KEYSIG 0x59 /* key signature */
/* ...channel status codes go here, too obvious to #define... */
#define MIFI_SYSEX_FIRST 0xf0
#define MIFI_SYSEX_NEXT 0xf7
/* this code is not returned as an event type, but in e_status of t_mifi_event */
#define MIFI_EVENT_META 0xff
/* true if one of channel messages */
#define MIFI_IS_CHANNEL(status) (((status) & 0x80) && (status) < 0xf0)
/* true if one of the two shorter channel messages */
#define MIFI_ONE_DATABYTE(status) (((status) & 0xe0) == 0xc0)
/* derived from t_squeve */
typedef struct _mifi_event
{
uint32 e_length;
uchar *e_data;
size_t e_bufsize;
uint32 e_delay;
uchar e_status;
uchar e_channel;
uchar e_meta; /* meta-event type */
} t_mifi_event;
/* This structure holds midi data stream properties, i.e. both the info stored
in midifile header, and the current state according to position in a stream. */
/* LATER clean up t_sq and derive t_mifi_stream */
typedef struct _sq t_mifi_stream;
/* prototypes of public interface routines */
t_mifi_event *mifi_event_new(void);
void mifi_event_free(t_mifi_event *e);
int mifi_event_settext(t_mifi_event *e, int type, char *text);
void mifi_event_printmeta(t_mifi_event *e);
t_mifi_stream *mifi_stream_new(void);
void mifi_stream_reset(t_mifi_stream *x);
void mifi_stream_free(t_mifi_stream *x);
t_mifi_stream *mifi_read_start(t_mifi_stream *x,
const char *filename, const char *dirname,
int complain);
int mifi_read_restart(t_mifi_stream *x);
void mifi_read_end(t_mifi_stream *x);
int mifi_read_event(t_mifi_stream *x, t_mifi_event *e);
int mifi_read_analyse(t_mifi_stream *stp);
int mifi_read_doit(t_mifi_stream *stp);
t_mifi_stream *mifi_write_start(t_mifi_stream *x,
const char *filename, const char *dirname);
void mifi_write_end(t_mifi_stream *x);
int mifi_write_start_track(t_mifi_stream *x);
int mifi_write_adjust_track(t_mifi_stream *x, uint32 eotdelay);
int mifi_write_event(t_mifi_stream *x, t_mifi_event *e);
#endif
|