1 /*
2     TiMidity -- Experimental MIDI to WAVE converter
3     Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the Perl Artistic License, available in COPYING.
7  */
8 
9 
10 typedef struct {
11   int32
12     loop_start, loop_end, data_length,
13     sample_rate, low_freq, high_freq, root_freq;
14   uint8
15     root_tune, fine_tune;
16   int32
17     envelope_rate[7], envelope_offset[7],
18     modulation_rate[7], modulation_offset[7];
19   FLOAT_T
20     volume, resonance,
21     modEnvToFilterFc, modEnvToPitch, modLfoToFilterFc;
22   sample_t *data;
23   int32
24     tremolo_sweep_increment, tremolo_phase_increment,
25     lfo_sweep_increment, lfo_phase_increment,
26     vibrato_sweep_increment, vibrato_control_ratio,
27     cutoff_freq;
28   uint8
29     reverberation, chorusdepth,
30     tremolo_depth, vibrato_depth,
31     modes;
32   uint8
33     attenuation, freq_center;
34   int8
35     panning, note_to_use, exclusiveClass;
36   int16
37     scale_tuning, keyToModEnvHold, keyToModEnvDecay,
38     keyToVolEnvHold, keyToVolEnvDecay;
39   int32
40     freq_scale, vibrato_delay;
41 } Sample;
42 
43 /* Bits in modes: */
44 #define MODES_16BIT	(1<<0)
45 #define MODES_UNSIGNED	(1<<1)
46 #define MODES_LOOPING	(1<<2)
47 #define MODES_PINGPONG	(1<<3)
48 #define MODES_REVERSE	(1<<4)
49 #define MODES_SUSTAIN	(1<<5)
50 #define MODES_ENVELOPE	(1<<6)
51 #define MODES_FAST_RELEASE	(1<<7)
52 
53 #if 0
54 typedef struct {
55   int samples;
56   Sample *sample;
57 } Instrument;
58 #endif
59 
60 #define INST_GUS	0
61 #define INST_SF2	1
62 
63 typedef struct {
64   int type;
65   int samples;
66   Sample *sample;
67   int left_samples;
68   Sample *left_sample;
69   int right_samples;
70   Sample *right_sample;
71   unsigned char *contents;
72 } Instrument;
73 
74 
75 typedef struct _InstrumentLayer {
76   uint8 lo, hi;
77   int size;
78   Instrument *instrument;
79   struct _InstrumentLayer *next;
80 } InstrumentLayer;
81 
82 struct cfg_type {
83 	int font_code;
84 	int num;
85 	const char *name;
86 };
87 
88 #define FONT_NORMAL 0
89 #define FONT_FFF    1
90 #define FONT_SBK    2
91 #define FONT_TONESET 3
92 #define FONT_DRUMSET 4
93 #define FONT_PRESET 5
94 
95 
96 typedef struct {
97   char *name;
98   InstrumentLayer *layer;
99   int font_type, sf_ix, last_used, tuning;
100   int note, amp, pan, strip_loop, strip_envelope, strip_tail;
101 } ToneBankElement;
102 
103 #if 0
104 typedef struct {
105   char *name;
106   Instrument *instrument;
107   int note, amp, pan, strip_loop, strip_envelope, strip_tail;
108 } ToneBankElement;
109 #endif
110 /* A hack to delay instrument loading until after reading the
111    entire MIDI file. */
112 #define MAGIC_LOAD_INSTRUMENT ((InstrumentLayer *)(-1))
113 
114 #define MAXPROG 128
115 #define MAXBANK 130
116 #define SFXBANK (MAXBANK-1)
117 #define SFXDRUM1 (MAXBANK-2)
118 #define SFXDRUM2 (MAXBANK-1)
119 #define XGDRUM 1
120 
121 #if 0
122 typedef struct {
123   ToneBankElement tone[128];
124 } ToneBank;
125 #endif
126 
127 typedef struct {
128   char *name;
129   ToneBankElement tone[MAXPROG];
130 } ToneBank;
131 
132 
133 extern char *sf_file;
134 
135 extern ToneBank *tonebank[], *drumset[];
136 
137 #if 0
138 extern Instrument *default_instrument;
139 #endif
140 extern InstrumentLayer *default_instrument;
141 extern int default_program;
142 extern int antialiasing_allowed;
143 extern int fast_decay;
144 extern int free_instruments_afterwards;
145 
146 #define SPECIAL_PROGRAM -1
147 
148 extern int load_missing_instruments(void);
149 extern void free_instruments(void);
150 extern void end_soundfont(void);
151 extern int set_default_instrument(const char *name);
152 
153 
154 extern int32 convert_tremolo_sweep(uint8 sweep);
155 extern int32 convert_vibrato_sweep(uint8 sweep, int32 vib_control_ratio);
156 extern int32 convert_tremolo_rate(uint8 rate);
157 extern int32 convert_vibrato_rate(uint8 rate);
158 
159 extern int init_soundfont(char *fname, int oldbank, int newbank, int level);
160 extern InstrumentLayer *load_sbk_patch(const char *name, int gm_num, int bank, int percussion,
161  int panning, int amp, int note_to_use, int sf_ix);
162 extern int current_tune_number;
163 extern int max_patch_memory;
164 extern int current_patch_memory;
165 #define XMAPMAX 800
166 extern int xmap[XMAPMAX][5];
167 extern void pcmap(int *b, int *v, int *p, int *drums);
168 
169