23 #ifndef ENVELOPEGENERATOR_H
24 #define ENVELOPEGENERATOR_H
26 #include "siddefs-fp.h"
50 ATTACK, DECAY_SUSTAIN, RELEASE
69 int exponential_counter;
75 int exponential_counter_period;
78 unsigned char envelope_counter;
100 bool envelope_pipeline;
141 static const int ENVELOPE_PERIOD[16];
177 void set_exponential_counter();
194 short output()
const;
202 exponential_counter(0),
203 exponential_counter_period(1),
211 envelope_pipeline(false),
246 unsigned char readENV() {
return envelope_counter; }
251 #if RESID_INLINING || defined(ENVELOPEGENERATOR_CPP)
258 if (envelope_pipeline) {
260 envelope_pipeline =
false;
262 set_exponential_counter();
272 if ((++ rate_counter & 0x8000) != 0) {
273 rate_counter = (rate_counter + 1) & 0x7fff;
276 if (rate_counter != rate_period) {
285 if (state == ATTACK || ++exponential_counter == exponential_counter_period) {
287 exponential_counter = 0;
302 if (envelope_counter == (
unsigned char) 0xff) {
303 state = DECAY_SUSTAIN;
304 rate_period = ENVELOPE_PERIOD[decay];
308 if (envelope_counter == (
unsigned char) (sustain << 4 | sustain)) {
311 if (exponential_counter_period != 1) {
314 envelope_pipeline =
true;
326 if (exponential_counter_period != 1) {
329 envelope_pipeline =
true;
337 set_exponential_counter();
342 short EnvelopeGenerator::output()
const {
345 return dac[envelope_counter & 0xff];