|
|
1.1 root 1: #import <streams/streams.h>
2: #import <objc/objc.h>
3:
4: typedef struct _MIDIFILEReadStruct {
5: int quanta;
6: BOOL metaEventFlag;
7: int nData;
8: unsigned char *data;
9: } MIDIFILEReadStruct;
10:
11: #define MIDIFILE_DEFAULTQUANTASIZE (1000)
12:
13: typedef enum _MIDIFILEMetaEvent {
14: /* In all of the metaevents, data[0] is the metaevent itself. */
15: MIDIFILE_sequenceNumber = 0,
16: /*
17: * data[1] and data[2] contain high and low order bits of number.
18: */
19: MIDIFILE_text = 1,
20: MIDIFILE_copyright = 2,
21: MIDIFILE_sequenceOrTrackName = 3,
22: /* MIDIFILE_instrumentName not supported */
23: MIDIFILE_lyric = 5,
24: MIDIFILE_marker = 6,
25: MIDIFILE_cuePoint = 7,
26: /* data[1]* specifies null-terminated text.
27: */
28: /*
29: * MIDIFILE_channelprefix, should be implemented by midifile.c and
30: * should not be passed up to user.
31: */
32: MIDIFILE_trackChange,
33: /*
34: * Track change metaevent: data[1] and data[2] contain high/low order bits,
35: * respectively, containing the track number. These events can only be
36: * encountered when reading a level-1 file.
37: */
38: MIDIFILE_tempoChange,
39: /*
40: * Tempo change metaevent: data[1:4] contain 4 bytes of data.
41: */
42: MIDIFILE_smpteOffset,
43: /*
44: data[1:5] are the 5 numbers hr mn sec fr ff
45: */
46: MIDIFILE_timeSig,
47: /* data is a single int, where 1-byte fields are nn dd cc bb */
48: MIDIFILE_keySig
49: /* data is a single short, where 1-byte fields are sf mi */
50: } MIDIFILEMetaevent;
51:
52: extern void *MIDIFILEBeginReading(NXStream *s,MIDIFILEReadStruct *m);
53: /* Initializes reading. Returns a struct that should be passed to
54: * other reading routines. The struct pointed to by m is used to
55: * return the MIDIFILE event information. It should not be freed or
56: * altered by the caller.
57: * MIDIFILEBeginReading must be balanced by a call to MIDIFILEEndReading.
58: */
59:
60: extern void *MIDIFILEEndReading(void *p);
61: /* Terminates reading and frees internal structure. */
62:
63: extern int MIDIFILEReadPreamble(void *p,int *level,int *track_count);
64: /*
65: * Reads the header of the specified file, and returns the midifile level
66: * (format) of the file, and the total number of tracks, in the respective
67: * parameters. The return value will be non-zero if all is well; any error
68: * causes zero to be returned.
69: */
70:
71: extern int MIDIFILESetReadQuantaSize(void *p,int usec);
72: /* Sets read quantum as indicated. */
73:
74: extern int MIDIFILEReadEvent(void *p);
75: /*
76: * Reads the next event in the current track. Return nonzero if successful;
77: * zero if an error or end-of-stream occurred. The next event data is
78: * returned in the MIDIFILEReadStruct passed to MIDIFILEBeginReading().
79: */
80:
81: void *MIDIFILEBeginWriting(NXStream *s, int level, char *sequenceName);
82: /*
83: * Writes the preamble and opens track zero for writing. In level 1 files,
84: * track zero is used by convention for timing information (tempo,time
85: * signature, click track).
86: * MIDIFILEBeginWriting must be balanced by a call to MIDIFILEEndWriting.
87: * Returns a struct that must be passed to other writing routines.
88: */
89:
90: extern int MIDIFILEEndWriting(void *p);
91: /*
92: * Terminates writing to the stream. After this call, the stream may
93: * be closed.
94: */
95:
96: extern int MIDIFILEBeginWritingTrack(void *p, char *trackName);
97: extern int MIDIFILEEndWritingTrack(void *p,int quanta);
98: /*
99: * These two functions must be called in a level 1 or 2 file to bracket each
100: * chunk of track data (except track 0, which is special).
101: */
102:
103: extern int MIDIFILEWriteEvent(void *p,int quanta,int ndata,
104: unsigned char *bytes);
105: /* Bytes are assumed to be a valid and complete event. */
106:
107: extern int MIDIFILEWriteSysExcl(void *p,int quanta,int ndata,
108: unsigned char *bytes);
109: /* Writes a system exclusive message. quanta is the time of the message.
110: * The message must start with 0xf0 and end with 0xf7. ndata includes
111: * all bytes.
112: */
113:
114: /* The following functions write various meta-events. */
115: extern int MIDIFILEWriteTempo(void *p,int quanta, int beatsPerMinute);
116: /* Writes the tempo. quanta is the time of the tempo change. */
117:
118: extern int MIDIFILEWriteSig(void *p,int quanta,short metaevent,
119: unsigned data);
120: /* Write time sig or key sig. Specified in midifile format. */
121:
122: extern int MIDIFILEWriteText(void *p,int quanta,short metaevent,char *data);
123:
124: extern int MIDIFILEWriteSMPTEoffset(void *p,
125: unsigned char hr,
126: unsigned char min,
127: unsigned char sec,
128: unsigned char ff,
129: unsigned char fr);
130:
131: extern int MIDIFILEWriteSequenceNumber(void *p,int data);
132:
133:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.