comparison Plugins/Input/timidity/libtimidity/timidity_internal.h @ 285:d1762728ea4b trunk

[svn] Timidity support, via external contractor dai+audacious@cdr.jp.
author nenolod
date Wed, 14 Dec 2005 08:51:51 -0800
parents
children
comparison
equal deleted inserted replaced
284:763afa52f416 285:d1762728ea4b
1 #ifndef TIMIDITY_INTERNAL_H
2 #define TIMIDITY_INTERNAL_H
3
4 #include "timidity.h"
5
6 #if defined(__i386__) || defined(__ia64__) || defined(WIN32) || \
7 (defined(__alpha__) || defined(__alpha)) || \
8 defined(__arm__) || \
9 (defined(__mips__) && defined(__MIPSEL__)) || \
10 defined(__SYMBIAN32__) || \
11 defined(__x86_64__) || \
12 defined(__LITTLE_ENDIAN__)
13 #ifndef LITTLE_ENDIAN
14 #define LITTLE_ENDIAN
15 #endif
16 #undef BIG_ENDIAN
17 #else
18 #ifndef BIG_ENDIAN
19 #define BIG_ENDIAN
20 #endif
21 #undef LITTLE_ENDIAN
22 #endif
23
24 /* Instrument files are little-endian, MIDI files big-endian, so we
25 need to do some conversions. */
26
27 #define XCHG_SHORT(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF))
28 #ifdef __i486__
29 # define XCHG_LONG(x) \
30 ({ sint32 __value; \
31 asm ("bswap %1; movl %1,%0" : "=g" (__value) : "r" (x)); \
32 __value; })
33 #else
34 # define XCHG_LONG(x) ((((x)&0xFF)<<24) | \
35 (((x)&0xFF00)<<8) | \
36 (((x)&0xFF0000)>>8) | \
37 (((x)>>24)&0xFF))
38 #endif
39
40 #ifdef LITTLE_ENDIAN
41 #define SWAPLE16(x) x
42 #define SWAPLE32(x) x
43 #define SWAPBE16(x) XCHG_SHORT(x)
44 #define SWAPBE32(x) XCHG_LONG(x)
45 #else
46 #define SWAPBE16(x) x
47 #define SWAPBE32(x) x
48 #define SWAPLE16(x) XCHG_SHORT(x)
49 #define SWAPLE32(x) XCHG_LONG(x)
50 #endif
51
52 #ifdef DEBUG
53 #define DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__)
54 #else
55 #define DEBUG_MSG(...)
56 #endif
57
58
59 #define MID_VIBRATO_SAMPLE_INCREMENTS 32
60
61 /* Maximum polyphony. */
62 #define MID_MAX_VOICES 48
63
64 typedef sint16 sample_t;
65 typedef sint32 final_volume_t;
66
67 typedef struct _MidSample MidSample;
68 struct _MidSample
69 {
70 sint32
71 loop_start, loop_end, data_length,
72 sample_rate, low_vel, high_vel, low_freq, high_freq, root_freq;
73 sint32 envelope_rate[6], envelope_offset[6];
74 float volume;
75 sample_t *data;
76 sint32
77 tremolo_sweep_increment, tremolo_phase_increment,
78 vibrato_sweep_increment, vibrato_control_ratio;
79 uint8 tremolo_depth, vibrato_depth, modes;
80 sint8 panning, note_to_use;
81 };
82
83 typedef struct _MidChannel MidChannel;
84 struct _MidChannel
85 {
86 int bank, program, volume, sustain, panning, pitchbend, expression;
87 int mono; /* one note only on this channel -- not implemented yet */
88 int pitchsens;
89 /* chorus, reverb... Coming soon to a 300-MHz, eight-way superscalar
90 processor near you */
91 float pitchfactor; /* precomputed pitch bend factor to save some fdiv's */
92 };
93
94 typedef struct _MidVoice MidVoice;
95 struct _MidVoice
96 {
97 uint8 status, channel, note, velocity;
98 MidSample *sample;
99 sint32
100 orig_frequency, frequency,
101 sample_offset, sample_increment,
102 envelope_volume, envelope_target, envelope_increment,
103 tremolo_sweep, tremolo_sweep_position,
104 tremolo_phase, tremolo_phase_increment,
105 vibrato_sweep, vibrato_sweep_position;
106
107 final_volume_t left_mix, right_mix;
108
109 float left_amp, right_amp, tremolo_volume;
110 sint32 vibrato_sample_increment[MID_VIBRATO_SAMPLE_INCREMENTS];
111 int
112 vibrato_phase, vibrato_control_ratio, vibrato_control_counter,
113 envelope_stage, control_counter, panning, panned;
114
115 };
116
117 typedef struct _MidInstrument MidInstrument;
118 struct _MidInstrument
119 {
120 int samples;
121 MidSample *sample;
122 };
123
124 typedef struct _MidToneBankElement MidToneBankElement;
125 struct _MidToneBankElement
126 {
127 char *name;
128 int note, amp, pan, strip_loop, strip_envelope, strip_tail;
129 };
130
131 typedef struct _MidToneBank MidToneBank;
132 struct _MidToneBank
133 {
134 MidToneBankElement *tone;
135 MidInstrument *instrument[128];
136 };
137
138 typedef struct _MidEvent MidEvent;
139 struct _MidEvent
140 {
141 sint32 time;
142 uint8 channel, type, a, b;
143 };
144
145 typedef struct _MidEventList MidEventList;
146 struct _MidEventList
147 {
148 MidEvent event;
149 void *next;
150 };
151
152 struct _MidSong
153 {
154 int playing;
155 sint32 rate;
156 sint32 encoding;
157 int bytes_per_sample;
158 float master_volume;
159 sint32 amplification;
160 MidDLSPatches *patches;
161 MidToneBank *tonebank[128];
162 MidToneBank *drumset[128];
163 MidInstrument *default_instrument;
164 int default_program;
165 void (*write) (void *dp, sint32 * lp, sint32 c);
166 int buffer_size;
167 sample_t *resample_buffer;
168 sint32 *common_buffer;
169 /* These would both fit into 32 bits, but they are often added in
170 large multiples, so it's simpler to have two roomy ints */
171 /* samples per MIDI delta-t */
172 sint32 sample_increment;
173 sint32 sample_correction;
174 MidChannel channel[16];
175 MidVoice voice[MID_MAX_VOICES];
176 int voices;
177 sint32 drumchannels;
178 sint32 control_ratio;
179 sint32 lost_notes;
180 sint32 cut_notes;
181 sint32 samples;
182 MidEvent *events;
183 MidEvent *current_event;
184 MidEventList *evlist;
185 sint32 current_sample;
186 sint32 event_count;
187 sint32 at;
188 sint32 groomed_event_count;
189 char *meta_data[8];
190 };
191
192 #endif /* TIMIDITY_INTERNAL_H */