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