1 /*MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI
4 (/dev/umixiX.Y Direct MIDI Player)
6 Copyright(C) 2014 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI*/
31 #ifdef SUPPORT_JAPANESE
35 #define STRING_VERSION "Version 0.80 (2014/02/09)"
37 #define MAX_UMIDI_PORT 4
38 #define DEFAULT_TEMPO 500000 /* Default tempo = 120 */
39 #define UMIDIDEV_RETRY_WRITE 3
40 #define DEFAULT_MIN_SLEEP 2050 /* usec */
41 #define MSLEEP_USLEEP_TIME 1000 /* This value is depended on OS */
42 #define MSLEEP_AJUST_COUNT 50
43 #define DEFAULT_DEV_NAME "umidi"
44 #define ICONV_PERMIT_ERRCOUNT 5
46 /* Follow defines is Enable "SUPPORT_JAPANESE" mode when building playumidi */
47 #define DEFAULT_SMF_LANGCODE "SHIFT_JISX0213"
48 #define DEFAULT_TERM_LANGCODE "EUC-JP"
51 typedef unsigned char Byte;
52 typedef unsigned int DWord;
53 typedef unsigned short Word;
55 typedef struct _smf_header {
56 char str_header[4]; /* "MThd"(0x4d, 0x54, 0x68,0x64) */
57 DWord dw_data_size; /* Real DataSize - 32bit BigEndian */
58 Word uw_format; /* SMF format 0 or 1 - BigEndian */
59 Word uw_tracks; /* Tracks */
60 Word uw_deltabase; /* DeltaTime BaseValue */
61 } __attribute__ ((packed)) SmfHeader;
64 typedef struct _smf_track_header {
65 char str_header[4]; /* "MTrk" (0x4d, 0x54, 0x72, 0x6b) */
66 DWord dw_trksize; /* Track Data Size */
67 } __attribute__ ((packed)) SmfTrackHeader;
95 DWord dw_max_metasize;
97 MidiEventInfo *p_event;
102 /* ===================================================================*/
103 #define BIG2LITTLE16(n) (((((unsigned short)(n))&0x00ff)<<8)|\
104 ((((unsigned short)(n))&0xff00)>>8))
106 #define BIG2LITTLE32(n) (((((unsigned int)(n))&0x000000ff)<<24)|\
107 ((((unsigned int)(n))&0x0000ff00)<< 8)|\
108 ((((unsigned int)(n))&0x00ff0000)>> 8)|\
109 ((((unsigned int)(n))&0xff000000)>>24))
112 #define SMF_HEADER_STRING "MThd"
113 #define SMF_TRKHEADER_STRING "MTrk"
115 #define SMF_EVENT_NOTEOFF 0x80 /* 3Byte */
116 #define SMF_EVENT_NOTEON 0x90 /* 3Byte */
117 #define SMF_EVENT_KEYPRESSER 0xa0 /* 3Byte */
118 #define SMF_EVENT_CTRLCHANGE 0xb0 /* 3Byte */
119 #define SMF_EVENT_PROGCHANGE 0xc0 /* 2Byte */
120 #define SMF_EVENT_CHNPRESSER 0xd0 /* 2Byte */
121 #define SMF_EVENT_PITCHBEND 0xe0 /* 3Byte */
122 #define SMF_EVENT_SYSEX_META 0xf0 /* Variable Size */
124 #define SMF_EVENT_SYSEX_F0 0xf0
125 #define SMF_EVENT_SYSEX_F7 0xf7
126 #define SMF_EVENT_META 0xff
128 #define SMF_META_SEQUENCENO 0x00 /* 3Byte=0x02(len), 4,5Byte=Data */
129 #define SMF_META_TEXT 0x01 /* 3Byte=len, 4Byte- =Data */
130 #define SMF_META_COPYRIGHT 0x02 /* 3Byte=len, 4Byte- =Data */
131 #define SMF_META_TITLE 0x03 /* 3Byte=len, 4Byte- =Data */
132 #define SMF_META_INSTRUMENT 0x04 /* 3Byte=len, 4Byte- =Data */
133 #define SMF_META_LYLIC 0x05 /* 3Byte=len, 4Byte- =Data */
134 #define SMF_META_MARKER 0x06 /* 3Byte=len, 4Byte- =Data */
135 #define SMF_META_QUEPOINT 0x07 /* 3Byte=len, 4Byte- =Data */
136 #define SMF_META_PROGRAM 0x08 /* 3Byte=len, 4Byte- =Data */
137 #define SMF_META_DEVICE 0x09 /* 3Byte=len, 4Byte- =Data */
138 #define SMF_META_CHNPREFIX 0x20 /* 3Byte=0x01(len), 4Byte=Data */
139 #define SMF_META_PORT 0x21 /* 3Byte=0x01(len), 4Byte=Data(Port) */
140 #define SMF_META_TRACKEND 0x2f /* 3Byte=0x00(len) */
141 #define SMF_META_TEMPO 0x51 /* 3Byte=0x03(len), 4,5,6Byte=TempoData */
142 #define SMF_META_SMPTEOFFSET 0x54 /* 3Byte=0x05(len), 4Byte- = hr,mn,se,fr,ff */
143 #define SMF_META_TIMESIGNATURE 0x58 /* 3Byte=0x04(len), 4Byte- = nn,dd,cc,bb */
144 #define SMF_META_KEYSIGNATURE 0x59 /* 3Byte=0x02(len), 4Byte- = sf,mi */
145 #define SMF_META_SPECIAL 0x7f /* 3Byte=len, 4Byte- =Data */
147 #define SMF_IS_RUNNING_STATUS(n) (!((n)&0x80))
149 #define MIDI_VENDOR_SEQUENTIAL 0x01 /* Group America */
150 #define MIDI_VENDOR_CLARITY 0x1f
151 #define MIDI_VENDOR_PASSAC 0x20 /* Group Europe */
152 #define MIDI_VENDOR_WERSI 0x3b
153 #define MIDI_VENDOR_KAWAI 0x40 /* Group Japan */
154 #define MIDI_VENDOR_ROLAND 0x41
155 #define MIDI_VENDOR_KORG 0x42
156 #define MIDI_VENDOR_YAMAHA 0x43
157 #define MIDI_VENDOR_CASIO 0x44
158 #define MIDI_VENDOR_KAMIYA_STUDIO 0x46
159 #define MIDI_VENDOR_AKAI 0x47
160 #define MIDI_VENDOR_JAPAN_VICTOR 0x48
161 #define MIDI_VENDOR_MEISOSHA 0x49
162 #define MIDI_VENDOR_HOSHINO_GAKKI 0x4a
163 #define MIDI_VENDOR_FUJITSU 0x4b
164 #define MIDI_VENDOR_SONY 0x4c
165 #define MIDI_VENDOR_NISSIN_ONPA 0x4d
166 #define MIDI_VENDOR_TEAC 0x4e
167 #define MIDI_VENDOR_SYSTEM_PRODUCT 0x4f
168 #define MIDI_VENDOR_MATUSHITA 0x50
169 #define MIDI_VENDOR_FOSTEX 0x51
171 #define MIDI_RESETSIZE_GM 6
172 #define MIDI_RESETSIZE_XG 9
173 #define MIDI_RESETSIZE_GS 11
175 #define MIDI_RESET_GM { 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7 }
176 #define MIDI_RESET_XG \
177 { 0xf0, 0x43, 0x10 /*dev*/, 0x4c, 0x00, 0x00, \
179 #define MIDI_RESET_GS \
180 { 0xf0, 0x41, 0x20 /*dev*/, 0x42, 0x12, 0x40, \
181 0x00, 0x7f, 0x00, 0x41, 0xf7 }
183 #define STR_C_MAJOR "C Major" /* #,b(Flat) = 0 */
184 #define STR_A_MINOR "A Minor" /* #,b(Flat) = 0 */
185 #define STR_G_MAJOR "G Major" /* # = 1 */
186 #define STR_E_MINOR "E Minor" /* # = 1 */
187 #define STR_D_MAJOR "D Major" /* # = 2 */
188 #define STR_B_MINOR "B Minor" /* # = 2 */
189 #define STR_A_MAJOR "A Major" /* # = 3 */
190 #define STR_F_SHARP_MINOR "F Sharp Minor" /* # = 3 */
191 #define STR_E_MAJOR "E Major" /* # = 4 */
192 #define STR_C_SHARP_MINOR "C Sharp Minor" /* # = 4 */
193 #define STR_B_MAJOR "B Major" /* # = 5 */
194 #define STR_G_SHARP_MINOR "G Sharp Minor" /* # = 5 */
195 #define STR_F_SHARP_MAJOR "F Sharp Major" /* # = 6 */
196 #define STR_D_SHARP_MINOR "D Sharp Minor" /* # = 6 */
197 #define STR_C_SHARP_MAJOR "C Sharp Major" /* # = 7 */
198 #define STR_A_SHARP_MINOR "A Sharp Minor" /* # = 7 */
200 #define STR_F_MAJOR "F Major" /* b(Flat) = 1 */
201 #define STR_D_MINOR "D Minor" /* b(Flat) = 1 */
202 #define STR_B_FLAT_MAJOR "B Flat Major" /* b(Flat) = 2 */
203 #define STR_G_MINOR "G Minor" /* b(Flat) = 2 */
204 #define STR_E_FLAT_MAJOR "E Flat Major" /* b(Flat) = 3 */
205 #define STR_C_MINOR "C Minor" /* b(Flat) = 3 */
206 #define STR_A_FLAT_MAJOR "A Flat Major" /* b(Flat) = 4 */
207 #define STR_F_MINOR "F Minor" /* b(Flat) = 4 */
208 #define STR_D_FLAT_MAJOR "D Flat Major" /* b(Flat) = 5 */
209 #define STR_B_FLAT_MINOR "B Flat Minor" /* b(Flat) = 5 */
210 #define STR_G_FLAT_MAJOR "G Flat Major" /* b(Flat) = 6 */
211 #define STR_E_FLAT_MINOR "E Flat Minor" /* b(Flat) = 6 */
212 #define STR_C_FLAT_MAJOR "C Flat Major" /* b(Flat) = 7 */
213 #define STR_A_FLAT_MINOR "A Flat Minor" /* b(Flat) = 7 */
215 #define PLAYSTATUS_INITIALIZE 0x00
216 #define PLAYSTATUS_PREPARE 0x01
217 #define PLAYSTATUS_PLAYING 0x10
218 #define PLAYSTATUS_CLOSING 0x40
219 #define PLAYSTATUS_REQ_STOP 0x21
220 #define PLAYSTATUS_REQ_PAUSE 0x22
221 #define PLAYSTATUS_ERROR 0xff
223 #define DATAFLAG_GM 0x0001
224 #define DATAFLAG_XG 0x0002
225 #define DATAFLAG_GS 0x0004
226 #define DATAFLAG_OTHER 0x0008
227 #define DATAFLAG_GM_RESET 0x0010
228 #define DATAFLAG_XG_RESET 0x0020
229 #define DATAFLAG_GS_RESET 0x0040
231 #define DATAFLAG_MASK_RESET 0x00f0
234 #define IS_PLAYSTATUS_REQUEST(n) (0x20==((n)&0xf0))
237 #define MODE_DEFAULT 0x00
238 #define MODE_VERBOSE 0x01
239 #define MODE_QUIET 0x02
240 #define MODE_NORESET 0x04
242 #define IS_MSGVERBOSE (gb_mode & MODE_VERBOSE)
243 #define IS_MSGQUIET (gb_mode & MODE_QUIET)
244 #define IS_NORESET (gb_mode & MODE_NORESET)
246 #ifndef PLAYUMIDI_SRC_MAIN
247 #define EXTERN_FUNC_MAIN extern
248 #define EXTERN_PARAM_MAIN extern
250 #define EXTERN_FUNC_MAIN
251 #define EXTERN_PARAM_MAIN
253 EXTERN_PARAM_MAIN Byte gb_mode;
254 #ifdef SUPPORT_JAPANESE
255 EXTERN_PARAM_MAIN iconv_t gt_iconv;
259 #ifndef PLAYUMIDI_SRC_READ_SMF
260 #define EXTERN_FUNC_READ_SMF extern
262 #define EXTERN_FUNC_READ_SMF
264 EXTERN_FUNC_READ_SMF int DecodeValue( DWord *dw_delta, Byte *pb_now );
265 EXTERN_FUNC_READ_SMF int ReadMidiData( Byte *pb_fbuf );
266 EXTERN_FUNC_READ_SMF int ReadSMF( const char *pstr_filename );
269 #ifndef PLAYUMIDI_SRC_MIDIEVENT
270 #define EXTERN_FUNC_MIDIEVENT extern
272 #define EXTERN_FUNC_MIDIEVENT
274 EXTERN_FUNC_MIDIEVENT int MidiEvent_GetMidiInfo( MidiInfo *p_midi );
275 EXTERN_FUNC_MIDIEVENT void MidiEvent_SetMidiDivision( Word uw_division ) ;
276 EXTERN_FUNC_MIDIEVENT DWord MidiEvent_GetMidiEvents( void );
277 EXTERN_FUNC_MIDIEVENT MidiEventInfo *MidiEvent_GetMidiEventPointer( void );
278 EXTERN_FUNC_MIDIEVENT Byte *MidiEvent_GetVarDataPointer( void );
279 EXTERN_FUNC_MIDIEVENT int MidiEvent_AllocMidiVarData( DWord dw_varsize, DWord dw_metasize );
280 EXTERN_FUNC_MIDIEVENT int MidiEvent_FreeMidiVarData( void );
281 EXTERN_FUNC_MIDIEVENT int MidiEvent_AllocMidiEventInfo( DWord dw_events );
282 EXTERN_FUNC_MIDIEVENT int MidiEvent_FreeMidiEvnetInfo( void );
285 #ifndef PLAYUMIDI_SRC_PLAY_EVENT
286 #define EXTERN_FUNC_PLAY_EVENT extern
288 #define EXTERN_FUNC_PLAY_EVENT
290 EXTERN_FUNC_PLAY_EVENT void Play_RequestStop( void );
291 EXTERN_FUNC_PLAY_EVENT void PlayEvent_Play( void *v_arg );
292 EXTERN_FUNC_PLAY_EVENT int PlayEvent_Initialize( void );
293 EXTERN_FUNC_PLAY_EVENT int PlayEvent_Term( void );
296 #ifndef PLAYUMIDI_SRC_MSLEEP
297 #define EXTERN_FUNC_MSLEEP extern
299 #define EXTERN_FUNC_MSLEEP
301 EXTERN_FUNC_MSLEEP long MSleep_Ajust( void );
302 EXTERN_FUNC_MSLEEP int MSleep_MicroSleep( long l_usleep );
305 #ifndef PLAYUMIDI_SRC_MIDI_DEVICE
306 #define EXTERN_FUNC_MIDI_DEVICE extern
308 #define EXTERN_FUNC_MIDI_DEVICE
310 EXTERN_FUNC_MIDI_DEVICE int MidiDevice_Init( char *pstr_basedev, char *pstr_midiport[]);
311 EXTERN_FUNC_MIDI_DEVICE int MidiDevice_Term( void );
312 EXTERN_FUNC_MIDI_DEVICE int MidiDevice_Write( int i_port, Byte *pb_data, size_t sz_len );
316 #ifndef PLAYUMIDI_SRC_VERIFY_EVENT
317 extern int Veryfy_Event( TrackInfo *p_track_start, Word uw_tracks );
321 /* EOF of playumidi.h **************************************************/