|
- /*
- ZynAddSubFX - a software synthesizer
-
- EnvelopeParams.cpp - Parameters for Envelope
- 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 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
-
- */
-
- #include <stdio.h>
-
- #include <math.h>
- #include <stdlib.h>
- #include "EnvelopeParams.h"
-
- EnvelopeParams::EnvelopeParams(unsigned char Penvstretch_,
- unsigned char Pforcedrelease_):Presets()
- {
- int i;
-
- PA_dt = 10;
- PD_dt = 10;
- PR_dt = 10;
- PA_val = 64;
- PD_val = 64;
- PS_val = 64;
- PR_val = 64;
-
- for(i = 0; i < MAX_ENVELOPE_POINTS; ++i) {
- Penvdt[i] = 32;
- Penvval[i] = 64;
- }
- Penvdt[0] = 0; //no used
- Penvsustain = 1;
- Penvpoints = 1;
- Envmode = 1;
- Penvstretch = Penvstretch_;
- Pforcedrelease = Pforcedrelease_;
- Pfreemode = 1;
- Plinearenvelope = 0;
-
- store2defaults();
- }
-
- EnvelopeParams::~EnvelopeParams()
- {}
-
- float EnvelopeParams::getdt(char i)
- {
- float result = (powf(2.0f, Penvdt[(int)i] / 127.0f * 12.0f) - 1.0f) * 10.0f; //miliseconds
- return result;
- }
-
-
- /*
- * ADSR/ASR... initialisations
- */
- void EnvelopeParams::ADSRinit(char A_dt, char D_dt, char S_val, char R_dt)
- {
- setpresettype("Penvamplitude");
- Envmode = 1;
- PA_dt = A_dt;
- PD_dt = D_dt;
- PS_val = S_val;
- PR_dt = R_dt;
- Pfreemode = 0;
- converttofree();
-
- store2defaults();
- }
-
- void EnvelopeParams::ADSRinit_dB(char A_dt, char D_dt, char S_val, char R_dt)
- {
- setpresettype("Penvamplitude");
- Envmode = 2;
- PA_dt = A_dt;
- PD_dt = D_dt;
- PS_val = S_val;
- PR_dt = R_dt;
- Pfreemode = 0;
- converttofree();
-
- store2defaults();
- }
-
- void EnvelopeParams::ASRinit(char A_val, char A_dt, char R_val, char R_dt)
- {
- setpresettype("Penvfrequency");
- Envmode = 3;
- PA_val = A_val;
- PA_dt = A_dt;
- PR_val = R_val;
- PR_dt = R_dt;
- Pfreemode = 0;
- converttofree();
-
- store2defaults();
- }
-
- void EnvelopeParams::ADSRinit_filter(char A_val,
- char A_dt,
- char D_val,
- char D_dt,
- char R_dt,
- char R_val)
- {
- setpresettype("Penvfilter");
- Envmode = 4;
- PA_val = A_val;
- PA_dt = A_dt;
- PD_val = D_val;
- PD_dt = D_dt;
- PR_dt = R_dt;
- PR_val = R_val;
- Pfreemode = 0;
- converttofree();
- store2defaults();
- }
-
- void EnvelopeParams::ASRinit_bw(char A_val, char A_dt, char R_val, char R_dt)
- {
- setpresettype("Penvbandwidth");
- Envmode = 5;
- PA_val = A_val;
- PA_dt = A_dt;
- PR_val = R_val;
- PR_dt = R_dt;
- Pfreemode = 0;
- converttofree();
- store2defaults();
- }
-
- /*
- * Convert the Envelope to freemode
- */
- void EnvelopeParams::converttofree()
- {
- switch(Envmode) {
- case 1:
- Penvpoints = 4;
- Penvsustain = 2;
- Penvval[0] = 0;
- Penvdt[1] = PA_dt;
- Penvval[1] = 127;
- Penvdt[2] = PD_dt;
- Penvval[2] = PS_val;
- Penvdt[3] = PR_dt;
- Penvval[3] = 0;
- break;
- case 2:
- Penvpoints = 4;
- Penvsustain = 2;
- Penvval[0] = 0;
- Penvdt[1] = PA_dt;
- Penvval[1] = 127;
- Penvdt[2] = PD_dt;
- Penvval[2] = PS_val;
- Penvdt[3] = PR_dt;
- Penvval[3] = 0;
- break;
- case 3:
- Penvpoints = 3;
- Penvsustain = 1;
- Penvval[0] = PA_val;
- Penvdt[1] = PA_dt;
- Penvval[1] = 64;
- Penvdt[2] = PR_dt;
- Penvval[2] = PR_val;
- break;
- case 4:
- Penvpoints = 4;
- Penvsustain = 2;
- Penvval[0] = PA_val;
- Penvdt[1] = PA_dt;
- Penvval[1] = PD_val;
- Penvdt[2] = PD_dt;
- Penvval[2] = 64;
- Penvdt[3] = PR_dt;
- Penvval[3] = PR_val;
- break;
- case 5:
- Penvpoints = 3;
- Penvsustain = 1;
- Penvval[0] = PA_val;
- Penvdt[1] = PA_dt;
- Penvval[1] = 64;
- Penvdt[2] = PR_dt;
- Penvval[2] = PR_val;
- break;
- }
- }
-
-
-
-
- void EnvelopeParams::add2XML(XMLwrapper *xml)
- {
- xml->addparbool("free_mode", Pfreemode);
- xml->addpar("env_points", Penvpoints);
- xml->addpar("env_sustain", Penvsustain);
- xml->addpar("env_stretch", Penvstretch);
- xml->addparbool("forced_release", Pforcedrelease);
- xml->addparbool("linear_envelope", Plinearenvelope);
- xml->addpar("A_dt", PA_dt);
- xml->addpar("D_dt", PD_dt);
- xml->addpar("R_dt", PR_dt);
- xml->addpar("A_val", PA_val);
- xml->addpar("D_val", PD_val);
- xml->addpar("S_val", PS_val);
- xml->addpar("R_val", PR_val);
-
- if((Pfreemode != 0) || (!xml->minimal))
- for(int i = 0; i < Penvpoints; ++i) {
- xml->beginbranch("POINT", i);
- if(i != 0)
- xml->addpar("dt", Penvdt[i]);
- xml->addpar("val", Penvval[i]);
- xml->endbranch();
- }
- }
-
-
-
- void EnvelopeParams::getfromXML(XMLwrapper *xml)
- {
- Pfreemode = xml->getparbool("free_mode", Pfreemode);
- Penvpoints = xml->getpar127("env_points", Penvpoints);
- Penvsustain = xml->getpar127("env_sustain", Penvsustain);
- Penvstretch = xml->getpar127("env_stretch", Penvstretch);
- Pforcedrelease = xml->getparbool("forced_release", Pforcedrelease);
- Plinearenvelope = xml->getparbool("linear_envelope", Plinearenvelope);
-
- PA_dt = xml->getpar127("A_dt", PA_dt);
- PD_dt = xml->getpar127("D_dt", PD_dt);
- PR_dt = xml->getpar127("R_dt", PR_dt);
- PA_val = xml->getpar127("A_val", PA_val);
- PD_val = xml->getpar127("D_val", PD_val);
- PS_val = xml->getpar127("S_val", PS_val);
- PR_val = xml->getpar127("R_val", PR_val);
-
- for(int i = 0; i < Penvpoints; ++i) {
- if(xml->enterbranch("POINT", i) == 0)
- continue;
- if(i != 0)
- Penvdt[i] = xml->getpar127("dt", Penvdt[i]);
- Penvval[i] = xml->getpar127("val", Penvval[i]);
- xml->exitbranch();
- }
-
- if(!Pfreemode)
- converttofree();
- }
-
-
- void EnvelopeParams::defaults()
- {
- Penvstretch = Denvstretch;
- Pforcedrelease = Dforcedrelease;
- Plinearenvelope = Dlinearenvelope;
- PA_dt = DA_dt;
- PD_dt = DD_dt;
- PR_dt = DR_dt;
- PA_val = DA_val;
- PD_val = DD_val;
- PS_val = DS_val;
- PR_val = DR_val;
- Pfreemode = 0;
- converttofree();
- }
-
- void EnvelopeParams::store2defaults()
- {
- Denvstretch = Penvstretch;
- Dforcedrelease = Pforcedrelease;
- Dlinearenvelope = Plinearenvelope;
- DA_dt = PA_dt;
- DD_dt = PD_dt;
- DR_dt = PR_dt;
- DA_val = PA_val;
- DD_val = PD_val;
- DS_val = PS_val;
- DR_val = PR_val;
- }
|