/* TiMidity++ -- MIDI to WAVE converter and player Copyright (C) 1999-2002 Masanao Izumo Copyright (C) 1995 Tuukka Toivonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA instrum.h */ #ifndef ___INSTRUM_H_ #define ___INSTRUM_H_ typedef struct _Sample { splen_t loop_start, loop_end, data_length; int32 sample_rate, low_freq, high_freq, root_freq; int8 panning, note_to_use; int32 envelope_rate[6], envelope_offset[6], modenv_rate[6], modenv_offset[6]; FLOAT_T volume; sample_t *data; int32 tremolo_sweep_increment, tremolo_phase_increment, vibrato_sweep_increment, vibrato_control_ratio; int16 tremolo_depth; int16 vibrato_depth; uint8 modes, data_alloced, low_vel, high_vel; int32 cutoff_freq; /* in Hz, [1, 20000] */ int16 resonance; /* in centibels, [0, 960] */ /* in cents, [-12000, 12000] */ int16 tremolo_to_pitch, tremolo_to_fc, modenv_to_pitch, modenv_to_fc, envelope_keyf[6], envelope_velf[6], modenv_keyf[6], modenv_velf[6], vel_to_fc, key_to_fc; int16 vel_to_resonance; /* in centibels, [-960, 960] */ int8 envelope_velf_bpo, modenv_velf_bpo, key_to_fc_bpo, vel_to_fc_threshold; /* in notes */ int32 vibrato_delay, tremolo_delay, envelope_delay, modenv_delay; /* in samples */ int16 scale_freq; /* in notes */ int16 scale_factor; /* in 1024divs/key */ int8 inst_type; int32 sf_sample_index, sf_sample_link; /* for stereo SoundFont */ uint16 sample_type; /* 1 = Mono, 2 = Right, 4 = Left, 8 = Linked, $8000 = ROM */ FLOAT_T root_freq_detected; /* root freq from pitch detection */ int transpose_detected; /* note offset from detected root */ int chord; /* type of chord for detected pitch */ } Sample; /* Bits in modes: */ #define MODES_16BIT (1<<0) #define MODES_UNSIGNED (1<<1) #define MODES_LOOPING (1<<2) #define MODES_PINGPONG (1<<3) #define MODES_REVERSE (1<<4) #define MODES_SUSTAIN (1<<5) #define MODES_ENVELOPE (1<<6) #define MODES_CLAMPED (1<<7) /* ?? (for last envelope??) */ #define INST_GUS 0 #define INST_SF2 1 #define INST_MOD 2 #define INST_PCM 3 /* %sample */ /* sfSampleType */ #define SF_SAMPLETYPE_MONO 1 #define SF_SAMPLETYPE_RIGHT 2 #define SF_SAMPLETYPE_LEFT 4 #define SF_SAMPLETYPE_LINKED 8 #define SF_SAMPLETYPE_ROM 0x8000 typedef struct { int type; int samples; Sample *sample; char *instname; } Instrument; typedef struct { char *name; char *comment; Instrument *instrument; int8 note, pan, strip_loop, strip_envelope, strip_tail, loop_timeout, font_preset, font_keynote, legato, tva_level, play_note, damper_mode; uint8 font_bank; uint8 instype; /* 0: Normal 1: %font 2: %sample 3-255: reserved */ int16 amp; int16 rnddelay; int tunenum; float *tune; int sclnotenum; int16 *sclnote; int scltunenum; int16 *scltune; int fcnum; int16 *fc; int resonum; int16 *reso; int trempitchnum, tremfcnum, modpitchnum, modfcnum; int16 *trempitch, *tremfc, *modpitch, *modfc; int envratenum, envofsnum; int **envrate, **envofs; int modenvratenum, modenvofsnum; int **modenvrate, **modenvofs; int envvelfnum, envkeyfnum; int **envvelf, **envkeyf; int modenvvelfnum, modenvkeyfnum; int **modenvvelf, **modenvkeyf; int tremnum, vibnum; struct Quantity_ **trem, **vib; int16 vel_to_fc, key_to_fc, vel_to_resonance; int8 reverb_send, chorus_send, delay_send; } ToneBankElement; /* A hack to delay instrument loading until after reading the entire MIDI file. */ #define MAGIC_LOAD_INSTRUMENT ((Instrument *)(-1)) #define MAGIC_ERROR_INSTRUMENT ((Instrument *)(-2)) #define IS_MAGIC_INSTRUMENT(ip) ((ip) == MAGIC_LOAD_INSTRUMENT || (ip) == MAGIC_ERROR_INSTRUMENT) typedef struct _AlternateAssign { /* 128 bit vector: * bits[(note >> 5) & 0x3] & (1 << (note & 0x1F)) */ uint32 bits[4]; struct _AlternateAssign* next; } AlternateAssign; typedef struct { ToneBankElement tone[128]; AlternateAssign *alt; } ToneBank; typedef struct _SpecialPatch /* To be used MIDI Module play mode */ { int type; int samples; Sample *sample; char *name; int32 sample_offset; } SpecialPatch; enum instrument_mapID { INST_NO_MAP = 0, SC_55_TONE_MAP, SC_55_DRUM_MAP, SC_88_TONE_MAP, SC_88_DRUM_MAP, SC_88PRO_TONE_MAP, SC_88PRO_DRUM_MAP, SC_8850_TONE_MAP, SC_8850_DRUM_MAP, XG_NORMAL_MAP, XG_SFX64_MAP, XG_SFX126_MAP, XG_DRUM_MAP, GM2_TONE_MAP, GM2_DRUM_MAP, NUM_INST_MAP }; #define MAP_BANK_COUNT 256 extern ToneBank *tonebank[], *drumset[]; extern Instrument *default_instrument; #define NSPECIAL_PATCH 256 extern SpecialPatch *special_patch[ /* NSPECIAL_PATCH */ ]; extern int default_program[MAX_CHANNELS]; extern int antialiasing_allowed; extern int fast_decay; extern int free_instruments_afterwards; extern int cutoff_allowed; #define SPECIAL_PROGRAM -1 /* sndfont.c */ extern void add_soundfont(char *sf_file, int sf_order, int cutoff_allowed, int resonance_allowed, int amp); extern void remove_soundfont(char *sf_file); extern void init_load_soundfont(void); extern Instrument *load_soundfont_inst(int order, int bank, int preset, int keynote); extern Instrument *extract_soundfont(char *sf_file, int bank, int preset, int keynote); extern int exclude_soundfont(int bank, int preset, int keynote); extern int order_soundfont(int bank, int preset, int keynote, int order); extern char *soundfont_preset_name(int bank, int preset, int keynote, char **sndfile); extern void free_soundfont_inst(void); /* instrum.c */ extern int load_missing_instruments(int *rc); extern void free_instruments(int reload_default_inst); extern void free_special_patch(int id); extern int set_default_instrument(char *name); extern void clear_magic_instruments(void); extern Instrument *load_instrument(int dr, int b, int prog); extern int find_instrument_map_bank(int dr, int map, int bk); extern int alloc_instrument_map_bank(int dr, int map, int bk); extern void alloc_instrument_bank(int dr, int bankset); extern int instrument_map(int mapID, int *set_in_out, int *elem_in_out); extern void set_instrument_map(int mapID, int set_from, int elem_from, int set_to, int elem_to); extern void free_instrument_map(void); extern AlternateAssign *add_altassign_string(AlternateAssign *old, char **params, int n); extern AlternateAssign *find_altassign(AlternateAssign *altassign, int note); extern void copy_tone_bank_element(ToneBankElement *elm, const ToneBankElement *src); extern void free_tone_bank_element(ToneBankElement *elm); extern void free_tone_bank(void); extern void free_instrument(Instrument *ip); extern void squash_sample_16to8(Sample *sp); extern char *default_instrument_name; extern int progbase; extern int32 modify_release; #define MAX_MREL 5000 #define DEFAULT_MREL 800 #endif /* ___INSTRUM_H_ */