1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2004 Masanao Izumo <iz@onicos.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 
20     readmidi.h
21 */
22 
23 #ifndef ___READMIDI_H_
24 #define ___READMIDI_H_
25 #include "reverb.h"
26 
27 /* MIDI file types */
28 #define IS_ERROR_FILE	-1	/* Error file */
29 #define IS_OTHER_FILE	0	/* Not a MIDI file */
30 #define IS_SMF_FILE	101	/* Standard MIDI File */
31 #define IS_MCP_FILE	201	/* MCP */
32 #define IS_RCP_FILE	202	/* Recomposer */
33 #define IS_R36_FILE	203	/* Recomposer */
34 #define IS_G18_FILE	204	/* Recomposer */
35 #define IS_G36_FILE	205	/* Recomposer */
36 #define IS_SNG_FILE	301
37 #define IS_MM2_FILE	401
38 #define IS_MML_FILE	501
39 #define IS_FM_FILE	601
40 #define IS_FPD_FILE	602
41 #define IS_MOD_FILE	701	/* Pro/Fast/Star/Noise Tracker */
42 #define IS_669_FILE	702	/* Composer 669, UNIS669 */
43 #define IS_MTM_FILE	703	/* MultiModuleEdit */
44 #define IS_STM_FILE	704	/* ScreamTracker 2 */
45 #define IS_S3M_FILE	705	/* ScreamTracker 3 */
46 #define IS_ULT_FILE	706	/* UltraTracker */
47 #define IS_XM_FILE	707	/* FastTracker 2 */
48 #define IS_FAR_FILE	708	/* Farandole Composer */
49 #define IS_WOW_FILE	709	/* Grave Composer */
50 #define IS_OKT_FILE	710	/* Oktalyzer */
51 #define IS_DMF_FILE	711	/* X-Tracker */
52 #define IS_MED_FILE	712	/* MED/OctaMED */
53 #define IS_IT_FILE	713	/* Impulse Tracker */
54 #define IS_PTM_FILE	714	/* Poly Tracker */
55 #define IS_MFI_FILE	800	/* Melody Format for i-mode */
56 
57 #define REDUCE_CHANNELS		16
58 
59 enum play_system_modes
60 {
61     DEFAULT_SYSTEM_MODE,
62     GM_SYSTEM_MODE,
63     GM2_SYSTEM_MODE,
64     GS_SYSTEM_MODE,
65     XG_SYSTEM_MODE
66 };
67 
68 enum {
69     PCM_MODE_NON = 0,
70     PCM_MODE_WAV,
71     PCM_MODE_AIFF,
72     PCM_MODE_AU,
73     PCM_MODE_MP3
74 };
75 
76 #define IS_CURRENT_MOD_FILE \
77 	(current_file_info && \
78 	current_file_info->file_type >= 700 && \
79 	current_file_info->file_type < 800)
80 
81 typedef struct {
82   MidiEvent event;
83   void *next;
84   void *prev;
85 } MidiEventList;
86 
87 struct midi_file_info
88 {
89     int readflag;
90     char *filename;
91     char *seq_name;
92     char *karaoke_title;
93     char *first_text;
94     uint8 mid;	/* Manufacture ID (0x41/Roland, 0x43/Yamaha, etc...) */
95     int16 hdrsiz;
96     int16 format;
97     int16 tracks;
98     int32 divisions;
99     int time_sig_n, time_sig_d, time_sig_c, time_sig_b;	/* Time signature */
100     int drumchannels_isset;
101     ChannelBitMask drumchannels;
102     ChannelBitMask drumchannel_mask;
103     int32 samples;
104     int max_channel;
105     struct midi_file_info *next;
106     int compressed; /* True if midi_data is compressed */
107     char *midi_data;
108     int32 midi_data_size;
109     int file_type;
110 
111     int pcm_mode;
112     char *pcm_filename;
113     struct timidity_file *pcm_tf;
114 };
115 
116 typedef struct {
117 	int meas;
118 	int beat;
119 } Measure;
120 
121 typedef struct _TimeSegment {
122 	int type;	/* seconds: 0, measure: 1 */
123 	union {
124 		FLOAT_T s;
125 		Measure m;
126 	} begin;
127 	union {
128 		FLOAT_T s;
129 		Measure m;
130 	} end;
131 	struct _TimeSegment *prev;
132 	struct _TimeSegment *next;
133 } TimeSegment;
134 
135 extern int32 readmidi_set_track(int trackno, int rewindp);
136 extern void readmidi_add_event(MidiEvent *newev);
137 extern void readmidi_add_ctl_event(int32 at, int ch, int control, int val);
138 extern int parse_sysex_event(uint8 *data, int32 datalen, MidiEvent *ev_ret);
139 extern int parse_sysex_event_multi(uint8 *data, int32 datalen, MidiEvent *ev_ret);
140 extern int convert_midi_control_change(int chn, int type, int val,
141 				       MidiEvent *ev_ret);
142 extern int unconvert_midi_control_change(MidiEvent *ev);
143 extern char *readmidi_make_string_event(int type, char *string, MidiEvent *ev,
144 					int cnv);
145 extern void free_time_segments(void);
146 extern MidiEvent *read_midi_file(struct timidity_file *mtf,
147 				 int32 *count, int32 *sp, char *file_name);
148 extern struct midi_file_info *get_midi_file_info(char *filename,int newp);
149 extern struct midi_file_info *new_midi_file_info(const char *filename);
150 extern void free_all_midi_file_info(void);
151 extern int check_midi_file(char *filename);
152 extern char *get_midi_title(char *filename);
153 extern struct timidity_file *open_midi_file(char *name,
154 					    int decompress, int noise_mode);
155 extern int midi_file_save_as(char *in_name, char *out_name);
156 extern char *event2string(int id);
157 extern void change_system_mode(int mode);
158 extern int get_default_mapID(int ch);
159 extern int dump_current_timesig(MidiEvent *codes, int maxlen);
160 
161 extern ChannelBitMask quietchannels;
162 extern struct midi_file_info *current_file_info;
163 extern TimeSegment *time_segments;
164 extern int opt_trace_text_meta_event;
165 extern int opt_default_mid;
166 extern int opt_system_mid;
167 extern int ignore_midi_error;
168 extern int readmidi_error_flag;
169 extern int readmidi_wrd_mode;
170 extern int play_system_mode;
171 
172 extern void recompute_delay_status_gs(void);
173 extern void set_delay_macro_gs(int);
174 extern void recompute_chorus_status_gs(void);
175 extern void set_chorus_macro_gs(int);
176 extern void recompute_reverb_status_gs(void);
177 extern void set_reverb_macro_gs(int);
178 extern void set_reverb_macro_gm2(int);
179 extern void recompute_eq_status_gs(void);
180 extern void realloc_insertion_effect_gs(void);
181 extern void recompute_insertion_effect_gs(void);
182 extern void recompute_multi_eq_xg(void);
183 extern void set_multi_eq_type_xg(int);
184 extern void realloc_effect_xg(struct effect_xg_t *st);
185 extern void recompute_effect_xg(struct effect_xg_t *st);
186 
187 extern Instrument *recompute_userdrum(int bank, int prog);
188 extern void free_userdrum();
189 
190 extern void recompute_userinst(int bank, int prog);
191 extern void free_userinst();
192 
193 extern void init_channel_layer(int);
194 extern void add_channel_layer(int, int);
195 extern void remove_channel_layer(int);
196 
197 extern void free_readmidi(void);
198 
199 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
200 
201 #endif /* ___READMIDI_H_ */
202