/* 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