199
|
1 /*
|
|
2
|
|
3 TiMidity -- Experimental MIDI to WAVE converter
|
|
4 Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
19
|
|
20 */
|
|
21
|
|
22 typedef Sint16 sample_t;
|
|
23 typedef Sint32 final_volume_t;
|
|
24
|
|
25 #define VIBRATO_SAMPLE_INCREMENTS 32
|
|
26
|
|
27 /* Maximum polyphony. */
|
|
28 #define MAX_VOICES 48
|
|
29
|
|
30 typedef struct {
|
|
31 Sint32
|
|
32 loop_start, loop_end, data_length,
|
|
33 sample_rate, low_freq, high_freq, root_freq;
|
|
34 Sint32
|
|
35 envelope_rate[6], envelope_offset[6];
|
|
36 float
|
|
37 volume;
|
|
38 sample_t *data;
|
|
39 Sint32
|
|
40 tremolo_sweep_increment, tremolo_phase_increment,
|
|
41 vibrato_sweep_increment, vibrato_control_ratio;
|
|
42 Uint8
|
|
43 tremolo_depth, vibrato_depth,
|
|
44 modes;
|
|
45 Sint8
|
|
46 panning, note_to_use;
|
|
47 } Sample;
|
|
48
|
|
49 typedef struct {
|
|
50 int
|
|
51 bank, program, volume, sustain, panning, pitchbend, expression,
|
|
52 mono, /* one note only on this channel -- not implemented yet */
|
|
53 pitchsens;
|
|
54 /* chorus, reverb... Coming soon to a 300-MHz, eight-way superscalar
|
|
55 processor near you */
|
|
56 float
|
|
57 pitchfactor; /* precomputed pitch bend factor to save some fdiv's */
|
|
58 } Channel;
|
|
59
|
|
60 typedef struct {
|
|
61 Uint8
|
|
62 status, channel, note, velocity;
|
|
63 Sample *sample;
|
|
64 Sint32
|
|
65 orig_frequency, frequency,
|
|
66 sample_offset, sample_increment,
|
|
67 envelope_volume, envelope_target, envelope_increment,
|
|
68 tremolo_sweep, tremolo_sweep_position,
|
|
69 tremolo_phase, tremolo_phase_increment,
|
|
70 vibrato_sweep, vibrato_sweep_position;
|
|
71
|
|
72 final_volume_t left_mix, right_mix;
|
|
73
|
|
74 float
|
|
75 left_amp, right_amp, tremolo_volume;
|
|
76 Sint32
|
|
77 vibrato_sample_increment[VIBRATO_SAMPLE_INCREMENTS];
|
|
78 int
|
|
79 vibrato_phase, vibrato_control_ratio, vibrato_control_counter,
|
|
80 envelope_stage, control_counter, panning, panned;
|
|
81
|
|
82 } Voice;
|
|
83
|
|
84 typedef struct {
|
|
85 int samples;
|
|
86 Sample *sample;
|
|
87 } Instrument;
|
|
88
|
|
89 /* Shared data */
|
|
90 typedef struct {
|
|
91 char *name;
|
|
92 int note, amp, pan, strip_loop, strip_envelope, strip_tail;
|
|
93 } ToneBankElement;
|
|
94
|
|
95 typedef struct {
|
|
96 ToneBankElement *tone;
|
|
97 Instrument *instrument[128];
|
|
98 } ToneBank;
|
|
99
|
|
100 typedef struct {
|
|
101 Sint32 time;
|
|
102 Uint8 channel, type, a, b;
|
|
103 } MidiEvent;
|
|
104
|
|
105 typedef struct {
|
|
106 MidiEvent event;
|
|
107 void *next;
|
|
108 } MidiEventList;
|
|
109
|
|
110 typedef struct {
|
|
111 int playing;
|
|
112 SDL_RWops *rw;
|
|
113 Sint32 rate;
|
|
114 Sint32 encoding;
|
|
115 float master_volume;
|
|
116 Sint32 amplification;
|
|
117 ToneBank *tonebank[128];
|
|
118 ToneBank *drumset[128];
|
|
119 Instrument *default_instrument;
|
|
120 int default_program;
|
|
121 void (*write)(void *dp, Sint32 *lp, Sint32 c);
|
|
122 int buffer_size;
|
|
123 sample_t *resample_buffer;
|
|
124 Sint32 *common_buffer;
|
|
125 Sint32 *buffer_pointer;
|
|
126 /* These would both fit into 32 bits, but they are often added in
|
|
127 large multiples, so it's simpler to have two roomy ints */
|
|
128 /* samples per MIDI delta-t */
|
|
129 Sint32 sample_increment;
|
|
130 Sint32 sample_correction;
|
|
131 Channel channel[16];
|
|
132 Voice voice[MAX_VOICES];
|
|
133 int voices;
|
|
134 Sint32 drumchannels;
|
|
135 Sint32 buffered_count;
|
|
136 Sint32 control_ratio;
|
|
137 Sint32 lost_notes;
|
|
138 Sint32 cut_notes;
|
|
139 Sint32 samples;
|
|
140 MidiEvent *events;
|
|
141 MidiEvent *current_event;
|
|
142 MidiEventList *evlist;
|
|
143 Sint32 current_sample;
|
|
144 Sint32 event_count;
|
|
145 Sint32 at;
|
|
146 } MidiSong;
|
|
147
|
|
148 /* Some of these are not defined in timidity.c but are here for convenience */
|
|
149
|
|
150 extern int Timidity_Init(void);
|
|
151 extern void Timidity_SetVolume(MidiSong *song, int volume);
|
|
152 extern int Timidity_PlaySome(MidiSong *song, void *stream, Sint32 len);
|
|
153 extern MidiSong *Timidity_LoadSong(SDL_RWops *rw, SDL_AudioSpec *audio);
|
|
154 extern void Timidity_Start(MidiSong *song);
|
|
155 extern void Timidity_FreeSong(MidiSong *song);
|
|
156 extern void Timidity_Exit(void);
|