Klang C++
Language Reference (draft)
Loading...
Searching...
No Matches
klang::Envelope

Envelope object. More...

#include <klang.h>

+ Inheritance diagram for klang::Envelope:

Classes

struct  Follower
 Envelope follower (Peak / RMS) More...
 
struct  Linear
 Linear envelope ramp (default) More...
 
struct  Loop
 Envelope loop. More...
 
struct  Point
 Envelope point (x,y) More...
 
struct  Ramp
 Abstract envelope ramp type. More...
 

Public Types

enum  Stage { Sustain , Release , Off }
 Envelope stage. More...
 
enum  Mode { Time , Rate }
 Envelope mode. More...
 

Public Member Functions

 Envelope ()
 
 Envelope (const Points &points)
 
 Envelope (std::initializer_list< Point > points)
 
 Envelope (const Envelope &in)
 
virtual ~Envelope ()
 
bool operator== (Stage stage) const
 
bool operator!= (Stage stage) const
 
 operator float () const
 
Envelopeoperator= (std::initializer_list< Point > points)
 
void set (const std::vector< Point > &points)
 
void set (const Points &point)
 
void sequence ()
 
void setLoop (int startPoint, int endPoint)
 
signal at (param time) const
 
void resetLoop ()
 
void setStage (Stage stage)
 
const Stage getStage () const
 
float getLength () const
 
virtual void release (float time, float level=0.f)
 
bool finished () const
 
void initialise ()
 
void resize (float length)
 
void setTarget (const Point &point, float time=0.0)
 
signaloperator++ (int)
 
void process () override
 
const Pointoperator[] (int point) const
 
void set (Ramp *ramp)
 
void setMode (Mode mode)
 
Mode mode () const
 
Output< signal > & operator() (params... p)
 
 operator const signal & () override
 
 operator const signal & () const override
 
virtual const signaloutput () const
 
TYPE & operator>> (TYPE &destination)
 
signal operator+ (TYPE &other)
 
signal operator* (TYPE &other)
 
signal operator- (TYPE &other)
 
signal operator/ (TYPE &other)
 

Public Attributes

signal out
 

Protected Attributes

void(Envelope::* setTargetFunction )(const Point &point, float time) = &Envelope::setTargetTime
 
std::vector< Pointpoints
 
Loop loop
 
int point
 
float time
 
float timeInc
 
Stage stage
 
std::shared_ptr< Rampramp
 

Detailed Description

Definition at line 2609 of file klang.h.

Member Enumeration Documentation

◆ Mode

Values
Time 
Rate 

Definition at line 2698 of file klang.h.

◆ Stage

Values
Sustain 
Release 
Off 

Definition at line 2696 of file klang.h.

Constructor & Destructor Documentation

◆ Envelope() [1/4]

klang::Envelope::Envelope ( )
inline

Definition at line 2753 of file klang.h.

2753: ramp(new Linear()) { set(Points(0.f, 1.f)); }
std::shared_ptr< Ramp > ramp
Definition klang.h:2984
void set(const std::vector< Point > &points)
Definition klang.h:2779

References ramp, and set().

◆ Envelope() [2/4]

klang::Envelope::Envelope ( const Points & points)
inline

Definition at line 2756 of file klang.h.

2756: ramp(new Linear()) { set(points); }
std::vector< Point > points
Definition klang.h:2977

References ramp, and set().

◆ Envelope() [3/4]

klang::Envelope::Envelope ( std::initializer_list< Point > points)
inline

Definition at line 2759 of file klang.h.

2759: ramp(new Linear()) { set(points); }

References ramp, and set().

◆ Envelope() [4/4]

klang::Envelope::Envelope ( const Envelope & in)
inline

Definition at line 2762 of file klang.h.

2762: ramp(new Linear()) { set(in.points); }

References points, ramp, and set().

◆ ~Envelope()

virtual klang::Envelope::~Envelope ( )
inlinevirtual

Definition at line 2764 of file klang.h.

2764{ }

Member Function Documentation

◆ at()

signal klang::Envelope::at ( param time) const
inline

Definition at line 2815 of file klang.h.

2815 {
2816 if (points.empty()) return 0;
2817 Point last = { 0, points[0].y };
2818 for (const Point& point : points) {
2819 if (point.x >= time) {
2820 const float dx = point.x - last.x;
2821 const float dy = point.y - last.y;
2822 const float x = time - last.x;
2823 return dx == 0 ? last.y : (last.y + x * dy / dx);
2824 }
2825 last = point;
2826 }
2827 return points.back().y;
2828 }

References klang::Envelope::Point::Point(), klang::signal::operator-(), points, klang::Envelope::Point::x, and klang::Envelope::Point::y.

◆ finished()

bool klang::Envelope::finished ( ) const
inline

Definition at line 2855 of file klang.h.

2855 {
2856 return getStage() == Stage::Off;
2857 }
const Stage getStage() const
Definition klang.h:2841

References getStage(), and Off.

◆ getLength()

float klang::Envelope::getLength ( ) const
inline

Definition at line 2844 of file klang.h.

2844{ return points.size() ? points[points.size() - 1].x : 0.f; }

References points, and klang::Envelope::Point::x.

Referenced by resize().

◆ getStage()

const Stage klang::Envelope::getStage ( ) const
inline

Definition at line 2841 of file klang.h.

2841{ return stage; }

References stage.

Referenced by finished(), and klang::ADSR::operator==().

◆ initialise()

void klang::Envelope::initialise ( )
inline

Definition at line 2860 of file klang.h.

2860 {
2861 point = 0;
2862 timeInc = 1.0f / fs;
2863 loop.reset();
2864 stage = Sustain;
2865 if(points.size()){
2866 out = points[0].y;
2867 ramp->setValue(points[0].y);
2868 if(points.size() > 1)
2869 setTarget(points[1], points[0].x);
2870 }else{
2871 out = 1.0f;
2872 ramp->setValue(1.0f);
2873 }
2874 }
void setTarget(const Point &point, float time=0.0)
Definition klang.h:2893
float timeInc
Definition klang.h:2981
klang::dB fs

References loop, point, points, ramp, klang::Envelope::Loop::reset(), setTarget(), klang::Envelope::Ramp::setValue(), stage, Sustain, timeInc, klang::Envelope::Point::x, and klang::Envelope::Point::y.

Referenced by resize(), sequence(), klang::ADSR::set(), set(), set(), and set().

◆ mode()

Mode klang::Envelope::mode ( ) const
inline

Definition at line 2955 of file klang.h.

void setTargetTime(const Point &point, float time=0.0)
Definition klang.h:2961
void(Envelope::* setTargetFunction)(const Point &point, float time)
Definition klang.h:2959

References Rate, setTargetFunction, setTargetTime(), and Time.

Referenced by operator++().

◆ operator const signal &() [1/2]

klang::Generic::Generator< signal >::operator const signal & ( ) const
inlineoverridevirtualinherited

Reimplemented from klang::Generic::Output< signal >.

Definition at line 1416 of file klang.h.

1416{ return out; } // return last output

◆ operator const signal &() [2/2]

klang::Generic::Generator< signal >::operator const signal & ( )
inlineoverridevirtualinherited

Reimplemented from klang::Generic::Output< signal >.

Definition at line 1415 of file klang.h.

1415{ process(); return out; } // return processed output

◆ operator float()

klang::Envelope::operator float ( ) const
inline

Definition at line 2770 of file klang.h.

2770{ return out; }

◆ operator!=()

bool klang::Envelope::operator!= ( Stage stage) const
inline

Definition at line 2768 of file klang.h.

2768{ return Envelope::stage != stage; }

References stage.

◆ operator()()

Output< signal > & klang::Generic::Generator< signal >::operator() ( params... p)
inlineinherited

Definition at line 1409 of file klang.h.

1409 {
1410 set(p...); return *this;
1411 }

◆ operator*()

signal klang::Generic::Output< signal >::operator* ( TYPE & other)
inlineinherited

Definition at line 1372 of file klang.h.

1372{ process(); return out * (other); }

◆ operator+()

signal klang::Generic::Output< signal >::operator+ ( TYPE & other)
inlineinherited

Definition at line 1371 of file klang.h.

1371{ process(); return out + (other); }

◆ operator++()

signal & klang::Envelope::operator++ ( int )
inline

Definition at line 2898 of file klang.h.

2898 {
2899 out = (*ramp)++;
2900
2901 switch(stage){
2902 case Sustain:
2903 time += timeInc;
2904 if (!ramp->isActive()) { // envelop segment end reached
2905 if (loop.isActive() && (point + 1) >= loop.end) {
2906 point = loop.start;
2907 ramp->setValue(points[point].y);
2908 if (loop.start != loop.end)
2909 setTarget(points[point + 1], points[point].x);
2910 } else if ((point + 1) < points.size()) {
2911 if (mode() == Rate || time >= points[point + 1].x) { // reached target point
2912 point++;
2913 ramp->setValue(points[point].y); // make sure exact value is set
2914
2915 if ((point + 1) < points.size()) // new target point?
2916 setTarget(points[point + 1], points[point].x);
2917 }
2918 } else {
2919 stage = Off;
2920 }
2921 } break;
2922 case Release:
2923 if (!ramp->isActive()) //if(out == 0.0)
2924 stage = Off;
2925 break;
2926 case Off:
2927 break;
2928 }
2929
2930 return out;
2931 }
Mode mode() const
Definition klang.h:2955
bool isActive() const
Definition klang.h:2746

References klang::Envelope::Loop::end, klang::Envelope::Loop::isActive(), klang::Envelope::Ramp::isActive(), loop, mode(), Off, klang::Envelope::Ramp::operator++(), point, points, ramp, Rate, Release, setTarget(), klang::Envelope::Ramp::setValue(), stage, klang::Envelope::Loop::start, Sustain, time, timeInc, klang::Envelope::Point::x, and klang::Envelope::Point::y.

◆ operator-()

signal klang::Generic::Output< signal >::operator- ( TYPE & other)
inlineinherited

Definition at line 1373 of file klang.h.

1373{ process(); return out - (other); }

◆ operator/()

signal klang::Generic::Output< signal >::operator/ ( TYPE & other)
inlineinherited

Definition at line 1374 of file klang.h.

1374{ process(); return out / (other); }

◆ operator=()

Envelope & klang::Envelope::operator= ( std::initializer_list< Point > points)
inline

Definition at line 2773 of file klang.h.

2773 {
2774 set(points);
2775 return *this;
2776 }

References set().

◆ operator==()

bool klang::Envelope::operator== ( Stage stage) const
inline

Definition at line 2767 of file klang.h.

2767{ return Envelope::stage == stage; }

References stage.

◆ operator>>()

TYPE & klang::Generic::Output< signal >::operator>> ( TYPE & destination)
inlineinherited

Definition at line 1364 of file klang.h.

1364{ process(); return destination = out; }

◆ operator[]()

const Point & klang::Envelope::operator[] ( int point) const
inline

Definition at line 2938 of file klang.h.

2938 {
2939 return points[point];
2940 }

References points.

◆ output()

virtual const signal & klang::Generic::Output< signal >::output ( ) const
inlinevirtualinherited

Definition at line 1360 of file klang.h.

1360{ return out; }

◆ process()

void klang::Envelope::process ( )
inlineoverridevirtual

Implements klang::Generic::Output< signal >.

Definition at line 2933 of file klang.h.

2933 { /* do nothing -> only process on ++ */
2934 out = *ramp;
2935 }

References ramp.

◆ release()

virtual void klang::Envelope::release ( float time,
float level = 0.f )
inlinevirtual

Reimplemented in klang::ADSR.

Definition at line 2847 of file klang.h.

2847 {
2848 stage = Release;
2849 setTarget({ time, level }, 0);
2850 //ramp->setTime(time);
2851 //ramp->setTarget(0.f);
2852 }

References klang::Envelope::Point::Point(), Release, setTarget(), and stage.

Referenced by klang::ADSR::release().

◆ resetLoop()

void klang::Envelope::resetLoop ( )
inline

Definition at line 2831 of file klang.h.

2831 {
2832 loop.reset();
2833 if(stage == Sustain && (point+1) < points.size())
2835 }

References loop, point, points, klang::Envelope::Loop::reset(), setTarget(), stage, Sustain, and klang::Envelope::Point::x.

◆ resize()

void klang::Envelope::resize ( float length)
inline

Definition at line 2877 of file klang.h.

2877 {
2878 const float old_length = getLength();
2879 if(old_length == 0.0)
2880 return;
2881
2882 const float multiplier = length / (fs * old_length);
2883 std::vector<Point>::iterator point = points.begin();
2884 while(point != points.end()){
2885 point->x *= multiplier;
2886 point++;
2887 }
2888
2889 initialise();
2890 }
void initialise()
Definition klang.h:2860
float getLength() const
Definition klang.h:2844

References getLength(), initialise(), points, and klang::Envelope::Point::x.

◆ sequence()

void klang::Envelope::sequence ( )
inline

Definition at line 2798 of file klang.h.

2798 {
2799 float time = 0.f;
2800 for(Point& point : points) {
2801 const float delta = point.x;
2802 time += delta + 0.00001f;
2803 point.x = time;
2804 }
2805 initialise();
2806 }

References initialise(), points, and klang::Envelope::Point::x.

◆ set() [1/3]

void klang::Envelope::set ( const Points & point)
inline

Definition at line 2785 of file klang.h.

2785 {
2786 points.clear();
2787
2788 const Points* pPoint = &point;
2789 while(pPoint){
2790 points.push_back(*pPoint);
2791 pPoint = pPoint->next;
2792 }
2793
2794 initialise();
2795 }

References initialise(), and points.

Referenced by Envelope(), and Envelope().

◆ set() [2/3]

void klang::Envelope::set ( const std::vector< Point > & points)
inline

Definition at line 2779 of file klang.h.

2779 {
2781 initialise();
2782 }

References initialise(), and points.

Referenced by Envelope(), Envelope(), and operator=().

◆ set() [3/3]

void klang::Envelope::set ( Ramp * ramp)
inline

Definition at line 2943 of file klang.h.

2943 {
2944 Envelope::ramp = std::shared_ptr<Ramp>(ramp);
2945 initialise();
2946 }

References initialise(), and ramp.

◆ setLoop()

void klang::Envelope::setLoop ( int startPoint,
int endPoint )
inline

Definition at line 2809 of file klang.h.

2809 {
2810 if(startPoint >= 0 && endPoint < points.size())
2811 loop.set(startPoint, endPoint);
2812 }
void set(int from, int to)
Definition klang.h:2743

References loop, points, and klang::Envelope::Loop::set().

Referenced by klang::ADSR::set().

◆ setMode()

void klang::Envelope::setMode ( Mode mode)
inline

Definition at line 2948 of file klang.h.

2948 {
2949 if (mode == Time)
2951 else
2953 }
void setTargetRate(const Point &point, float rate=0.0)
Definition klang.h:2967

References setTargetFunction, setTargetRate(), setTargetTime(), and Time.

◆ setStage()

void klang::Envelope::setStage ( Stage stage)
inline

Definition at line 2838 of file klang.h.

2838{ this->stage = stage; }

References stage.

◆ setTarget()

void klang::Envelope::setTarget ( const Point & point,
float time = 0.0 )
inline

Definition at line 2893 of file klang.h.

2893 {
2894 (this->*setTargetFunction)(point, time);
2895 }

References setTargetFunction.

Referenced by initialise(), operator++(), release(), and resetLoop().

◆ setTargetRate()

void klang::Envelope::setTargetRate ( const Point & point,
float rate = 0.0 )
inlineprotected

Definition at line 2967 of file klang.h.

2967 {
2968 this->time = 0;
2969 if (point.x == 0) {
2970 ramp->setValue(point.y);
2971 } else {
2972 ramp->setTarget(point.y);
2973 ramp->setRate(point.x);
2974 }
2975 }

References ramp, klang::Envelope::Ramp::setRate(), klang::Envelope::Ramp::setTarget(), klang::Envelope::Ramp::setValue(), time, klang::Envelope::Point::x, and klang::Envelope::Point::y.

Referenced by setMode().

◆ setTargetTime()

void klang::Envelope::setTargetTime ( const Point & point,
float time = 0.0 )
inlineprotected

Definition at line 2961 of file klang.h.

2961 {
2962 this->time = time;
2963 ramp->setTarget(point.y);
2964 ramp->setRate(abs(point.y - ramp->out) / ((point.x - time) * fs));
2965 }

References klang::Generic::operator/(), ramp, klang::Envelope::Ramp::setRate(), klang::Envelope::Ramp::setTarget(), time, klang::Envelope::Point::x, and klang::Envelope::Point::y.

Referenced by mode(), and setMode().

Member Data Documentation

◆ loop

Loop klang::Envelope::loop
protected

Definition at line 2978 of file klang.h.

Referenced by initialise(), operator++(), resetLoop(), and setLoop().

◆ out

Definition at line 1357 of file klang.h.

1357{ 0.f };

◆ point

int klang::Envelope::point
protected

Definition at line 2980 of file klang.h.

Referenced by initialise(), operator++(), and resetLoop().

◆ points

std::vector<Point> klang::Envelope::points
protected

◆ ramp

std::shared_ptr<Ramp> klang::Envelope::ramp
protected

◆ setTargetFunction

void(Envelope::* klang::Envelope::setTargetFunction) (const Point &point, float time) = &Envelope::setTargetTime
protected

Definition at line 2959 of file klang.h.

Referenced by mode(), setMode(), and setTarget().

◆ stage

Stage klang::Envelope::stage
protected

◆ time

float klang::Envelope::time
protected

Definition at line 2981 of file klang.h.

Referenced by operator++(), setTargetRate(), and setTargetTime().

◆ timeInc

float klang::Envelope::timeInc
protected

Definition at line 2981 of file klang.h.

Referenced by initialise(), and operator++().