1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.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    instrum.h
21 
22    */
23 
24 #ifndef ___INSTRUM_H_
25 #define ___INSTRUM_H_
26 
27 typedef struct _Sample {
28   splen_t
29     loop_start, loop_end, data_length;
30   int32
31     sample_rate, low_freq, high_freq, root_freq;
32   int8 panning, note_to_use;
33   int32
34     envelope_rate[6], envelope_offset[6],
35 	modenv_rate[6], modenv_offset[6];
36   FLOAT_T
37     volume;
38   sample_t
39     *data;
40   int32
41     tremolo_sweep_increment, tremolo_phase_increment,
42     vibrato_sweep_increment, vibrato_control_ratio;
43   int16
44     tremolo_depth;
45   int16 vibrato_depth;
46   uint8
47     modes, data_alloced,
48     low_vel, high_vel;
49   int32 cutoff_freq;	/* in Hz, [1, 20000] */
50   int16 resonance;	/* in centibels, [0, 960] */
51   /* in cents, [-12000, 12000] */
52   int16 tremolo_to_pitch, tremolo_to_fc, modenv_to_pitch, modenv_to_fc,
53 	  envelope_keyf[6], envelope_velf[6], modenv_keyf[6], modenv_velf[6],
54 	  vel_to_fc, key_to_fc;
55   int16 vel_to_resonance;	/* in centibels, [-960, 960] */
56   int8 envelope_velf_bpo, modenv_velf_bpo,
57 	  key_to_fc_bpo, vel_to_fc_threshold;	/* in notes */
58   int32 vibrato_delay, tremolo_delay, envelope_delay, modenv_delay;	/* in samples */
59   int16 scale_freq;	/* in notes */
60   int16 scale_factor;	/* in 1024divs/key */
61   int8 inst_type;
62   int32 sf_sample_index, sf_sample_link;	/* for stereo SoundFont */
63   uint16 sample_type;	/* 1 = Mono, 2 = Right, 4 = Left, 8 = Linked, $8000 = ROM */
64   FLOAT_T root_freq_detected;	/* root freq from pitch detection */
65   int transpose_detected;	/* note offset from detected root */
66   int chord;			/* type of chord for detected pitch */
67 } Sample;
68 
69 /* Bits in modes: */
70 #define MODES_16BIT	(1<<0)
71 #define MODES_UNSIGNED	(1<<1)
72 #define MODES_LOOPING	(1<<2)
73 #define MODES_PINGPONG	(1<<3)
74 #define MODES_REVERSE	(1<<4)
75 #define MODES_SUSTAIN	(1<<5)
76 #define MODES_ENVELOPE	(1<<6)
77 #define MODES_CLAMPED	(1<<7) /* ?? (for last envelope??) */
78 
79 #define INST_GUS	0
80 #define INST_SF2	1
81 #define INST_MOD	2
82 #define INST_PCM	3	/* %sample */
83 
84 /* sfSampleType */
85 #define SF_SAMPLETYPE_MONO 1
86 #define SF_SAMPLETYPE_RIGHT 2
87 #define SF_SAMPLETYPE_LEFT 4
88 #define SF_SAMPLETYPE_LINKED 8
89 #define SF_SAMPLETYPE_ROM 0x8000
90 
91 typedef struct {
92   int type;
93   int samples;
94   Sample *sample;
95   char *instname;
96 } Instrument;
97 
98 typedef struct {
99   char *name;
100   char *comment;
101   Instrument *instrument;
102   int8 note, pan, strip_loop, strip_envelope, strip_tail, loop_timeout,
103 	font_preset, font_keynote, legato, tva_level, play_note, damper_mode;
104   uint8 font_bank;
105   uint8 instype; /* 0: Normal
106 		    1: %font
107 		    2: %sample
108 		    3-255: reserved
109 		    */
110   int16 amp;
111   int16 rnddelay;
112   int tunenum;
113   float *tune;
114   int sclnotenum;
115   int16 *sclnote;
116   int scltunenum;
117   int16 *scltune;
118   int fcnum;
119   int16 *fc;
120   int resonum;
121   int16 *reso;
122   int trempitchnum, tremfcnum, modpitchnum, modfcnum;
123   int16 *trempitch, *tremfc, *modpitch, *modfc;
124 	int envratenum, envofsnum;
125 	int **envrate, **envofs;
126 	int modenvratenum, modenvofsnum;
127 	int **modenvrate, **modenvofs;
128 	int envvelfnum, envkeyfnum;
129 	int **envvelf, **envkeyf;
130 	int modenvvelfnum, modenvkeyfnum;
131 	int **modenvvelf, **modenvkeyf;
132 	int tremnum, vibnum;
133 	struct Quantity_ **trem, **vib;
134 	int16 vel_to_fc, key_to_fc, vel_to_resonance;
135 	int8 reverb_send, chorus_send, delay_send;
136 } ToneBankElement;
137 
138 /* A hack to delay instrument loading until after reading the
139    entire MIDI file. */
140 #define MAGIC_LOAD_INSTRUMENT ((Instrument *)(-1))
141 #define MAGIC_ERROR_INSTRUMENT ((Instrument *)(-2))
142 #define IS_MAGIC_INSTRUMENT(ip) ((ip) == MAGIC_LOAD_INSTRUMENT || (ip) == MAGIC_ERROR_INSTRUMENT)
143 
144 #define DYNAMIC_INSTRUMENT_NAME ""
145 
146 typedef struct _AlternateAssign {
147     /* 128 bit vector:
148      * bits[(note >> 5) & 0x3] & (1 << (note & 0x1F))
149      */
150     uint32 bits[4];
151     struct _AlternateAssign* next;
152 } AlternateAssign;
153 
154 typedef struct {
155   ToneBankElement tone[128];
156   AlternateAssign *alt;
157 } ToneBank;
158 
159 typedef struct _SpecialPatch /* To be used MIDI Module play mode */
160 {
161     int type;
162     int samples;
163     Sample *sample;
164     char *name;
165     int32 sample_offset;
166 } SpecialPatch;
167 
168 enum instrument_mapID
169 {
170     INST_NO_MAP = 0,
171     SC_55_TONE_MAP,
172     SC_55_DRUM_MAP,
173     SC_88_TONE_MAP,
174     SC_88_DRUM_MAP,
175     SC_88PRO_TONE_MAP,
176     SC_88PRO_DRUM_MAP,
177     SC_8850_TONE_MAP,
178     SC_8850_DRUM_MAP,
179     XG_NORMAL_MAP,
180     XG_SFX64_MAP,
181     XG_SFX126_MAP,
182     XG_DRUM_MAP,
183     GM2_TONE_MAP,
184     GM2_DRUM_MAP,
185     NUM_INST_MAP
186 };
187 
188 #define MAP_BANK_COUNT 256
189 extern ToneBank *tonebank[], *drumset[];
190 
191 extern Instrument *default_instrument;
192 #define NSPECIAL_PATCH 256
193 extern SpecialPatch *special_patch[ /* NSPECIAL_PATCH */ ];
194 extern int default_program[MAX_CHANNELS];
195 extern int antialiasing_allowed;
196 extern int fast_decay;
197 extern int free_instruments_afterwards;
198 extern int cutoff_allowed;
199 
200 #define SPECIAL_PROGRAM -1
201 
202 /* sndfont.c */
203 extern int opt_sf_close_each_file;
204 extern void add_soundfont(char *sf_file, int sf_order,
205 			  int cutoff_allowed, int resonance_allowed,
206 			  int amp);
207 extern void remove_soundfont(char *sf_file);
208 extern void init_load_soundfont(void);
209 extern Instrument *load_soundfont_inst(int order, int bank, int preset,
210 				       int keynote);
211 extern Instrument *extract_soundfont(char *sf_file, int bank, int preset,
212 				     int keynote);
213 extern int exclude_soundfont(int bank, int preset, int keynote);
214 extern int order_soundfont(int bank, int preset, int keynote, int order);
215 extern char *soundfont_preset_name(int bank, int preset, int keynote,
216 				   char **sndfile);
217 extern void free_soundfonts(void);
218 
219 /* instrum.c */
220 extern int load_missing_instruments(int *rc);
221 extern void free_instruments(int reload_default_inst);
222 extern void free_special_patch(int id);
223 extern int set_default_instrument(char *name);
224 extern void clear_magic_instruments(void);
225 extern Instrument *load_instrument(int dr, int b, int prog);
226 extern int find_instrument_map_bank(int dr, int map, int bk);
227 extern int alloc_instrument_map_bank(int dr, int map, int bk);
228 extern void alloc_instrument_bank(int dr, int bankset);
229 extern int instrument_map(int mapID, int *set_in_out, int *elem_in_out);
230 extern void set_instrument_map(int mapID,
231 			       int set_from, int elem_from,
232 			       int set_to, int elem_to);
233 extern void free_instrument_map(void);
234 extern AlternateAssign *add_altassign_string(AlternateAssign *old,
235 					     char **params, int n);
236 extern AlternateAssign *find_altassign(AlternateAssign *altassign, int note);
237 extern void copy_tone_bank_element(ToneBankElement *elm, const ToneBankElement *src);
238 extern void free_tone_bank_element(ToneBankElement *elm);
239 extern void free_tone_bank(void);
240 extern void free_instrument(Instrument *ip);
241 extern void squash_sample_16to8(Sample *sp);
242 
243 extern char *default_instrument_name;
244 extern int progbase;
245 
246 extern int32 modify_release;
247 #define MAX_MREL 5000
248 #define DEFAULT_MREL 800
249 
250 #endif /* ___INSTRUM_H_ */
251