/* ZynAddSubFX - a software synthesizer SUBnote.h - The subtractive synthesizer Copyright (C) 2002-2005 Nasca Octavian Paul Author: Nasca Octavian Paul This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #ifndef SUB_NOTE_H #define SUB_NOTE_H #include "SynthNote.h" #include "../globals.h" namespace zyncarla { class SUBnote:public SynthNote { public: SUBnote(const SUBnoteParameters *parameters, SynthParams &pars); ~SUBnote(); SynthNote *cloneLegato(void); void legatonote(LegatoParams pars); int noteout(float *outl, float *outr); //note output,return 0 if the note is finished void releasekey(); bool finished() const; void entomb(void); private: void setup(float freq, float velocity, int portamento_, int midinote, bool legato = false); float setupFilters(int *pos, bool automation); void computecurrentparameters(); /* * Initialize envelopes and global filter * calls computercurrentparameters() */ void initparameters(float freq, WatchManager *wm); void KillNote(); const SUBnoteParameters &pars; //parameters bool stereo; int numstages; //number of stages of filters int numharmonics; //number of harmonics (after the too higher hamonics are removed) int firstnumharmonics; //To keep track of the first note's numharmonics value, useful in legato mode. int start; //how the harmonics start float basefreq; float BendAdjust; float OffsetHz; float panning; Envelope *AmpEnvelope; Envelope *FreqEnvelope; Envelope *BandWidthEnvelope; ModFilter *GlobalFilter; Envelope *GlobalFilterEnvelope; //internal values bool NoteEnabled; bool firsttick, portamento; float volume, oldamplitude, newamplitude; float oldreduceamp; struct bpfilter { float freq, bw, amp; //filter parameters float a1, a2, b0, b2; //filter coefs. b1=0 float xn1, xn2, yn1, yn2; //filter internal values }; void chanOutput(float *out, bpfilter *bp, int buffer_size); void initfilter(bpfilter &filter, float freq, float bw, float amp, float mag, bool automation); float computerolloff(float freq); void computeallfiltercoefs(bpfilter *filters, float envfreq, float envbw, float gain); void computefiltercoefs(bpfilter &filter, float freq, float bw, float gain); inline void filter(bpfilter &filter, float *smps); bpfilter *lfilter, *rfilter; float overtone_rolloff[MAX_SUB_HARMONICS]; float overtone_freq[MAX_SUB_HARMONICS]; int oldpitchwheel, oldbandwidth; float globalfiltercenterq; float velocity; WatchManager *wm; }; } #endif