osci-render/Source/UGen/EnvCurve.h

148 wiersze
4.1 KiB
C++

// $Id$
// $HeadURL$
/*
==============================================================================
This file is part of the UGEN++ library
Copyright 2008-11 The University of the West of England.
by Martin Robinson
------------------------------------------------------------------------------
UGEN++ can be redistributed and/or modified 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.
UGEN++ 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 for more details.
You should have received a copy of the GNU General Public License
along with UGEN++; if not, visit www.gnu.org/licenses or write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
The idea for this project and code in the UGen implementations is
derived from SuperCollider which is also released under the
GNU General Public License:
SuperCollider real time audio synthesis system
Copyright (c) 2002 James McCartney. All rights reserved.
http://www.audiosynth.com
==============================================================================
*/
#ifndef _UGEN_ugen_EnvCurve_H_
#define _UGEN_ugen_EnvCurve_H_
#include <vector>
#include <JuceHeader.h>
/** Specify curved sections of breakpoint envelopes.
Curve type may be linear or from a selection of curve types, or a numerical
value which specifies the degree of curvature.
@see Env, EnvGen */
class EnvCurve
{
public:
/// @name Construction and destruction
/// @{
enum CurveType
{
Empty,
Numerical,
Step,
Linear,
Exponential,
Sine,
Welch
};
EnvCurve(float curve) throw() : type_(Numerical), curve_(curve) { }
//EnvCurve(double curve) throw() : type_(Numerical), curve_((float)curve) { }
EnvCurve(CurveType type = Empty) throw() : type_(type), curve_(0.f) { }
/// @} <!-- end Construction and destruction ------------------------------------------- -->
/// @name Curve access
/// @{
CurveType getType() const throw() { return type_; }
float getCurve() const throw() { return curve_; }
void setType(const CurveType newType) throw() { type_ = newType; }
void setCurve(const float newCurve) throw() { curve_ = newCurve; }
bool equalsInfinity() const throw() { return type_ == Numerical && curve_ == INFINITY; }
bool operator==(EnvCurve const& other) const
{
if (type_ != other.type_)
return false;
if (type_ == Numerical)
return curve_ == other.curve_;
return true;
}
bool operator!=(EnvCurve const& other) const { return !(*this==other); }
/// @} <!-- end Curve access ----------------------------------------------------------- -->
private:
CurveType type_;
float curve_;
};
/** An array of EnvCurve objects.
@see EnvCurve, Env, EnvGen */
class EnvCurveList
{
public:
/// @name Construction and destruction
/// @{
EnvCurveList(EnvCurve const& i00) throw();
EnvCurveList(const std::vector<EnvCurve>&) throw();
EnvCurveList(EnvCurve::CurveType type, const int size = 1) throw();
EnvCurveList(const double curve, const int size = 1) throw();
~EnvCurveList() throw();
EnvCurveList(EnvCurveList const& copy) throw();
EnvCurveList& operator= (EnvCurveList const& other) throw();
bool operator== (EnvCurveList const& other) const throw();
/// @} <!-- end Construction and destruction ------------------------------------------- -->
/// @name Array access and manipulation
/// @{
EnvCurve& operator[] (const int index) throw();
const EnvCurve& operator[] (const int index) const throw();
inline int size() const throw() { return data.size(); }
inline const std::vector<EnvCurve> getData() throw() { return data; }
inline const std::vector<EnvCurve> getData() const throw() { return data; }
EnvCurveList blend(EnvCurveList const& other, float fraction) const throw();
/// @} <!-- end Array access and manipulation ----------------------------------------------- -->
static EnvCurve empty;
std::vector<EnvCurve> data;
};
#endif // _UGEN_ugen_EnvCurve_H_