diff options
author | John Glover <glover.john@gmail.com> | 2011-07-08 18:06:21 +0100 |
---|---|---|
committer | John Glover <glover.john@gmail.com> | 2011-07-08 18:06:21 +0100 |
commit | d6073e01c933c77f1e2bc3c3fe1126d617003549 (patch) | |
tree | 695d23677c5b84bf3a0f88fbd4959b4f7cbc0e90 /src/loris/Envelope.h | |
parent | 641688b252da468eb374674a0dbaae1bbac70b2b (diff) | |
download | simpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.tar.gz simpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.tar.bz2 simpl-d6073e01c933c77f1e2bc3c3fe1126d617003549.zip |
Start adding Loris files
Diffstat (limited to 'src/loris/Envelope.h')
-rw-r--r-- | src/loris/Envelope.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/loris/Envelope.h b/src/loris/Envelope.h new file mode 100644 index 0000000..832619a --- /dev/null +++ b/src/loris/Envelope.h @@ -0,0 +1,170 @@ +#ifndef INCLUDE_ENVELOPE_H +#define INCLUDE_ENVELOPE_H +/* + * This is the Loris C++ Class Library, implementing analysis, + * manipulation, and synthesis of digitized sounds using the Reassigned + * Bandwidth-Enhanced Additive Sound Model. + * + * Loris is Copyright (c) 1999-2010 by Kelly Fitz and Lippold Haken + * + * 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. + * + * 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * Envelope.h + * + * Definition of abstract interface class Envelope. + * + * Kelly Fitz, 21 July 2000 + * loris@cerlsoundgroup.org + * + * http://www.cerlsoundgroup.org/Loris/ + * + */ + +#include <memory> // for autoptr + +// begin namespace +namespace Loris { + +// --------------------------------------------------------------------------- +// class Envelope +// +//! Envelope is an base class for objects representing real functions +//! of time. +//! +//! Class Envelope is an abstract base class, specifying interface for +//! prototypable (clonable) objects representing generic, real-valued +//! (double) functions of one real-valued (double) time argument. Derived +//! classes (like BreakpointEnvelope) must implement valueAt() and +//! clone(), the latter to support the Prototype pattern. Clients of +//! Envelope, like Morpher and Distiller, can use prototype Envelopes to +//! make their own private Envelopes. +//! +//! \sa Distiller, Envelope, Morpher +// +class Envelope +{ +// -- public interface -- +public: +// -- construction -- + + // allow compiler to generate constructors + + //! Destroy this Envelope (virtual to allow subclassing). + virtual ~Envelope( void ); + +// -- Envelope interface -- + + //! Return an exact copy of this Envelope (following the Prototype + //! pattern). + virtual Envelope * clone( void ) const = 0; + + //! Return the value of this Envelope at the specified time. + virtual double valueAt( double x ) const = 0; + +}; // end of abstract class Envelope + + +// --------------------------------------------------------------------------- +// class ScaleAndOffsetEnvelope +// +//! ScaleAndOffsetEnvelope is an derived Envelope class for objects +//! representing envelopes having a scale and offset applied (in that order). + +class ScaleAndOffsetEnvelope : public Envelope +{ +// -- public interface -- +public: +// -- construction -- + + //! Construct a new envelope that is a scaled and offset + //! version of another. + ScaleAndOffsetEnvelope( const Envelope & e, double scale, double offset ) : + m_env( e.clone() ), + m_scale( scale ), + m_offset( offset ) + { + } + + //! Construct a copy of an envelope. + ScaleAndOffsetEnvelope( const ScaleAndOffsetEnvelope & rhs ) : + m_env( rhs.m_env->clone() ), + m_scale( rhs.m_scale ), + m_offset( rhs.m_offset ) + { + } + + //! Assignment from another envelope. + ScaleAndOffsetEnvelope & + operator=( const ScaleAndOffsetEnvelope & rhs ) + { + if ( &rhs != this ) + { + m_env.reset( rhs.m_env->clone() ); + m_scale = rhs.m_scale; + m_offset = rhs.m_offset; + } + return *this; + } + +// -- Envelope interface -- + + //! Return an exact copy of this Envelope (following the Prototype + //! pattern). + ScaleAndOffsetEnvelope * clone( void ) const + { + return new ScaleAndOffsetEnvelope( *this ); + } + + //! Return the value of this Envelope at the specified time. + virtual double valueAt( double x ) const + { + return m_offset + ( m_scale * m_env->valueAt( x ) ); + } + +// -- private member variables -- + +private: + + std::auto_ptr< Envelope > m_env; + double m_scale, m_offset; + +}; // end of class ScaleAndOffsetEnvelope + + +// --------------------------------------------------------------------------- +// math operators +// --------------------------------------------------------------------------- + +inline +ScaleAndOffsetEnvelope +operator*( const Envelope & e, double x ) +{ + return ScaleAndOffsetEnvelope( e, x, 0 ); +} + +inline +ScaleAndOffsetEnvelope +operator*( double x, const Envelope & e ) +{ + return e * x; +} + + + + +} // end of namespace Loris + +#endif /* ndef INCLUDE_ENVELOPE_H */ |