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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/* Copyright (c) 2004-2005 krzYszcz and others.
* For information on usage and redistribution, and for a DISCLAIMER OF ALL
* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
#ifndef __MIFI_H__
#define __MIFI_H__
EXTERN_STRUCT _mifiread;
#define t_mifiread struct _mifiread
EXTERN_STRUCT _mifiwrite;
#define t_mifiwrite struct _mifiwrite
typedef int (*t_mifireadhook)(t_mifiread *mf, void *hookdata, int evtype);
#define MIFI_MAXTRACKS 0x7fff
#define MIFI_MAXBEATTICKS 0x7fff
/* event types, as returned by mifiread_nextevent(), ... */
#define MIFIREAD_FATAL -3 /* unexpected eof, last track's or file error */
#define MIFIREAD_EOF -2 /* regular eof */
#define MIFIREAD_SKIP -1 /* error and successful skip to the next track */
#define MIFIMETA_SEQNUM 0
#define MIFIMETA_TEXT 1
#define MIFIMETA_COPYRIGHT 2
#define MIFIMETA_TRACKNAME 3
#define MIFIMETA_INSTRUMENT 4
#define MIFIMETA_LYRIC 5
#define MIFIMETA_MARKER 6
#define MIFIMETA_CUE 7
#define MIFIMETA_MAXPRINTABLE 15 /* 1..15 are various text meta-events */
#define MIFIMETA_CHANNEL 0x20 /* channel prefix (obsolete) */
#define MIFIMETA_PORT 0x21 /* port prefix (obsolete) */
#define MIFIMETA_EOT 0x2f /* end of track */
#define MIFIMETA_TEMPO 0x51
#define MIFIMETA_SMPTE 0x54 /* SMPTE offset */
#define MIFIMETA_TIMESIG 0x58 /* time signature */
#define MIFIMETA_KEYSIG 0x59 /* key signature */
#define MIFIMETA_PROPRIETARY 0x7f
/* ...channel status codes go here, too obvious to #define... */
#define MIFISYSEX_FIRST 0xf0
#define MIFISYSEX_NEXT 0xf7
#define MIFISYSEX_ESCAPE 0xf7 /* without preceding MIFISYSEX_FIRST */
/* this code is not returned as an event type, but in e_status of t_mifievent */
#define MIFIEVENT_META 0xff
/* system messages (expected inside of sysex escape events) */
#define MIFISYS_SONGPOINTER 0xf2
#define MIFISYS_SONGSELECT 0xf3
#define MIFISYS_TUNEREQUEST 0xf6
#define MIFISYS_CLOCK 0xf8
#define MIFISYS_START 0xfa
#define MIFISYS_CONTINUE 0xfb
#define MIFISYS_STOP 0xfc
#define MIFISYS_ACTIVESENSING 0xfe
/* true if one of channel messages */
#define MIFI_ISCHANNEL(status) (((status) & 0x80) && (status) < 0xf0)
/* true if one of the two shorter channel messages */
#define MIFI_ONEDATABYTE(status) (((status) & 0xe0) == 0xc0)
int mifiread_getnevents(t_mifiread *mr);
int mifiread_getntempi(t_mifiread *mr);
int mifiread_gethdtracks(t_mifiread *mr);
int mifiread_getformat(t_mifiread *mr);
int mifiread_getnframes(t_mifiread *mr);
int mifiread_getbeatticks(t_mifiread *mr);
double mifiread_getdeftempo(t_mifiread *mr);
int mifiread_getbarindex(t_mifiread *mr);
double mifiread_getbarspan(t_mifiread *mr);
double mifiread_gettick(t_mifiread *mr);
double mifiread_getscoretime(t_mifiread *mr);
double mifiread_gettempo(t_mifiread *mr);
double mifiread_getmscoef(t_mifiread *mr);
t_symbol *mifiread_gettrackname(t_mifiread *mr);
unsigned mifiread_getstatus(t_mifiread *mr);
unsigned mifiread_getdata1(t_mifiread *mr);
unsigned mifiread_getdata2(t_mifiread *mr);
unsigned mifiread_getchannel(t_mifiread *mr);
t_pd *mifiread_getowner(t_mifiread *mr);
t_mifiread *mifiread_new(t_pd *owner);
void mifiread_setuserticks(t_mifiread *mr, double wholeticks);
int mifiread_open(t_mifiread *mr, const char *filename,
const char *dirname, int complain);
int mifiread_doit(t_mifiread *mr, t_mifireadhook hook, void *hookdata);
void mifiread_close(t_mifiread *mr);
void mifiread_free(t_mifiread *mr);
t_mifiwrite *mifiwrite_new(t_pd *owner);
void mifiwrite_sethardticks(t_mifiwrite *mw, int beatticks);
void mifiwrite_setuserticks(t_mifiwrite *mw, double wholeticks);
void mifiwrite_setusertempo(t_mifiwrite *mw, double tickspersec);
int mifiwrite_open(t_mifiwrite *mw, const char *filename,
const char *dirname, int ntracks, int complain);
int mifiwrite_opentrack(t_mifiwrite *mw, char *trackname, int complain);
int mifiwrite_textevent(t_mifiwrite *mw, double delay,
unsigned type, char *text);
int mifiwrite_channelevent(t_mifiwrite *mw, double delay, unsigned status,
unsigned channel, unsigned data1, unsigned data2);
int mifiwrite_closetrack(t_mifiwrite *mw, double enddelay, int complain);
void mifiwrite_close(t_mifiwrite *mw);
void mifiwrite_free(t_mifiwrite *mw);
#endif
|