OSDN Git Service

* Collect INSTALL text-file.
[playumidi/playumidi.git] / src / playumidi.h
1 /*MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI
2
3                            P L A Y U M I D I
4                   (/dev/umixiX.Y Direct MIDI Player)
5
6    Copyright(C) 2014 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 MIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDIMIDI*/
30
31 #ifdef SUPPORT_JAPANESE
32 #include<iconv.h>
33 #endif
34
35 #define STRING_VERSION                  "Version 0.80 (2014/02/09)"
36
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
45
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"
49
50
51 typedef unsigned char   Byte;
52 typedef unsigned int    DWord;
53 typedef unsigned short  Word;
54
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;
62
63
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;
68
69
70 typedef struct  {
71         DWord           dw_tracksize;
72         Byte            *pb_data;
73
74         Byte            *pb_now;
75         Byte            b_run_status;
76         DWord           dw_delta_now;
77 } TrackInfo;
78
79
80 typedef struct  {
81         DWord           dw_delta;
82         DWord           dw_dataptr;
83         DWord           dw_length;
84         Byte            b_data[3];
85         Byte            b_run_status;
86 #ifdef  VERIFY_EVENT
87         Word            uw_track;
88 #endif
89 } MidiEventInfo;
90
91
92 typedef struct  {
93         Word                    uw_division;
94         DWord                   dw_max_events;
95         DWord                   dw_max_metasize;
96         
97         MidiEventInfo   *p_event;
98         Byte                    *pb_vardata;
99 } MidiInfo;
100
101
102 /* ===================================================================*/
103 #define BIG2LITTLE16(n)         (((((unsigned short)(n))&0x00ff)<<8)|\
104                                                                 ((((unsigned short)(n))&0xff00)>>8))
105
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))
110
111
112 #define SMF_HEADER_STRING               "MThd"
113 #define SMF_TRKHEADER_STRING    "MTrk"
114
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 */
123
124 #define SMF_EVENT_SYSEX_F0              0xf0
125 #define SMF_EVENT_SYSEX_F7              0xf7
126 #define SMF_EVENT_META                  0xff
127
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 */
146
147 #define SMF_IS_RUNNING_STATUS(n)        (!((n)&0x80))
148
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
170
171 #define MIDI_RESETSIZE_GM                       6
172 #define MIDI_RESETSIZE_XG                       9
173 #define MIDI_RESETSIZE_GS                       11
174
175 #define MIDI_RESET_GM   { 0xf0, 0x7e, 0x7f, 0x09, 0x01, 0xf7 }
176 #define MIDI_RESET_XG   \
177                 { 0xf0, 0x43, 0x10 /*dev*/, 0x4c, 0x00, 0x00, \
178                         0x7e, 0x00, 0xf7 }
179 #define MIDI_RESET_GS   \
180                 { 0xf0, 0x41, 0x20 /*dev*/, 0x42, 0x12, 0x40, \
181                         0x00, 0x7f, 0x00, 0x41, 0xf7 }
182
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 */
199
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 */
214
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
222
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
230
231 #define DATAFLAG_MASK_RESET             0x00f0
232
233
234 #define IS_PLAYSTATUS_REQUEST(n)        (0x20==((n)&0xf0))
235
236
237 #define MODE_DEFAULT    0x00
238 #define MODE_VERBOSE    0x01
239 #define MODE_QUIET              0x02
240 #define MODE_NORESET    0x04
241
242 #define IS_MSGVERBOSE   (gb_mode & MODE_VERBOSE)
243 #define IS_MSGQUIET             (gb_mode & MODE_QUIET)
244 #define IS_NORESET              (gb_mode & MODE_NORESET)
245
246 #ifndef PLAYUMIDI_SRC_MAIN
247         #define EXTERN_FUNC_MAIN                extern
248         #define EXTERN_PARAM_MAIN               extern
249 #else
250         #define EXTERN_FUNC_MAIN
251         #define EXTERN_PARAM_MAIN
252 #endif
253 EXTERN_PARAM_MAIN       Byte    gb_mode;
254 #ifdef SUPPORT_JAPANESE
255         EXTERN_PARAM_MAIN       iconv_t         gt_iconv;
256 #endif
257
258
259 #ifndef PLAYUMIDI_SRC_READ_SMF
260         #define EXTERN_FUNC_READ_SMF            extern
261 #else
262         #define EXTERN_FUNC_READ_SMF    
263 #endif
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 );
267
268
269 #ifndef PLAYUMIDI_SRC_MIDIEVENT
270     #define EXTERN_FUNC_MIDIEVENT     extern
271 #else
272     #define EXTERN_FUNC_MIDIEVENT 
273 #endif
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 );
283
284
285 #ifndef PLAYUMIDI_SRC_PLAY_EVENT
286     #define EXTERN_FUNC_PLAY_EVENT     extern
287 #else
288     #define EXTERN_FUNC_PLAY_EVENT 
289 #endif
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 ); 
294
295
296 #ifndef PLAYUMIDI_SRC_MSLEEP
297     #define EXTERN_FUNC_MSLEEP     extern
298 #else
299     #define EXTERN_FUNC_MSLEEP 
300 #endif
301 EXTERN_FUNC_MSLEEP long MSleep_Ajust( void );
302 EXTERN_FUNC_MSLEEP int  MSleep_MicroSleep( long l_usleep );
303
304
305 #ifndef PLAYUMIDI_SRC_MIDI_DEVICE
306     #define EXTERN_FUNC_MIDI_DEVICE     extern
307 #else
308     #define EXTERN_FUNC_MIDI_DEVICE 
309 #endif
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 );
313
314
315 #ifdef  VERIFY_EVENT
316         #ifndef PLAYUMIDI_SRC_VERIFY_EVENT
317                 extern int Veryfy_Event( TrackInfo *p_track_start, Word uw_tracks );
318         #endif
319 #endif
320
321 /* EOF of playumidi.h **************************************************/