|
- /*
- ZynAddSubFX - a software synthesizer
-
- Note.h - Abstract Base Class for synthesizers
- Copyright (C) 2010-2010 Mark McCurry
- Author: Mark McCurry
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License
- as published by the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License (version 2 or later) for more details.
-
- You should have received a copy of the GNU General Public License (version 2)
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- */
- #ifndef SYNTH_NOTE_H
- #define SYNTH_NOTE_H
- #include "../globals.h"
-
- class Allocator;
- class Controller;
- struct SynthParams
- {
- Allocator &memory; //Memory Allocator for the Note to use
- const Controller &ctl;
- const SYNTH_T &synth;
- const AbsTime &time;
- float frequency; //Note base frequency
- float velocity; //Velocity of the Note
- bool portamento;//True if portamento is used for this note
- int note; //Integer value of the note
- bool quiet; //Initial output condition for legato notes
- };
-
- struct LegatoParams
- {
- float frequency;
- float velocity;
- bool portamento;
- int midinote;
- bool externcall;
- };
-
- class SynthNote
- {
- public:
- SynthNote(SynthParams &pars);
- virtual ~SynthNote() {}
-
- /**Compute Output Samples
- * @return 0 if note is finished*/
- virtual int noteout(float *outl, float *outr) = 0;
-
- //TODO fix this spelling error [noisey commit]
- /**Release the key for the note and start release portion of envelopes.*/
- virtual void releasekey() = 0;
-
- /**Return if note is finished.
- * @return finished=1 unfinished=0*/
- virtual int finished() const = 0;
-
- virtual void legatonote(LegatoParams pars) = 0;
-
- virtual SynthNote *cloneLegato(void) = 0;
-
- /* For polyphonic aftertouch needed */
- void setVelocity(float velocity_);
-
- //Realtime Safe Memory Allocator For notes
- class Allocator &memory;
- protected:
- // Legato transitions
- class Legato
- {
- public:
- Legato(const SYNTH_T &synth_, float freq, float vel, int port,
- int note, bool quiet);
-
- void apply(SynthNote ¬e, float *outl, float *outr);
- int update(LegatoParams pars);
-
- private:
- bool silent;
- float lastfreq;
- LegatoMsg msg;
- int decounter;
- struct { // Fade In/Out vars
- int length;
- float m, step;
- } fade;
- public:
- struct { // Note parameters
- float freq, vel;
- bool portamento;
- int midinote;
- } param;
- const SYNTH_T &synth;
-
- public: /* Some get routines for legatonote calls (aftertouch feature)*/
- float getFreq() {return param.freq; }
- float getVelocity() {return param.vel; }
- bool getPortamento() {return param.portamento; }
- int getMidinote() {return param.midinote; }
- void setSilent(bool silent_) {silent = silent_; }
- void setDecounter(int decounter_) {decounter = decounter_; }
- } legato;
-
- const Controller &ctl;
- const SYNTH_T &synth;
- const AbsTime &time;
- };
-
- #endif
|