23 #ifndef ENVELOPEGENERATOR_H
24 #define ENVELOPEGENERATOR_H
26 #include "siddefs-fp.h"
53 ATTACK, DECAY_SUSTAIN, RELEASE
70 int exponential_counter;
76 int exponential_counter_period;
98 bool envelope_pipeline;
104 unsigned char envelope_counter;
113 void set_exponential_counter();
126 static const int adsrtable[16];
148 short output()
const {
return dac[envelope_counter]; }
156 exponential_counter(0),
157 exponential_counter_period(1),
164 envelope_pipeline(false),
166 envelope_counter(0) {}
200 unsigned char readENV()
const {
return envelope_counter; }
205 #if RESID_INLINING || defined(ENVELOPEGENERATOR_CPP)
213 if (envelope_pipeline)
216 envelope_pipeline =
false;
218 set_exponential_counter();
236 const int feedback = ((lfsr >> 14) ^ (lfsr >> 13)) & 0x01;
237 lfsr = ((lfsr << 1) & 0x7fff) | feedback;
247 if (state == ATTACK || ++exponential_counter == exponential_counter_period)
250 exponential_counter = 0;
268 if (envelope_counter == (
unsigned char) 0xff)
270 state = DECAY_SUSTAIN;
271 rate = adsrtable[decay];
284 if (envelope_counter == (
unsigned char)(sustain << 4 | sustain))
289 if (exponential_counter_period != 1)
293 envelope_pipeline =
true;
308 if (exponential_counter_period != 1)
312 envelope_pipeline =
true;
321 set_exponential_counter();