sintonia/library/ecasound-2.7.2/libecasound/audiofx_timebased.h

245 lines
7.0 KiB
C++

#ifndef INCLUDED_AUDIOFX_TIMEBASED_H
#define INCLUDED_AUDIOFX_TIMEBASED_H
#include <vector>
#include <deque>
#include <string>
#include "audiofx.h"
#include "audiofx_filter.h"
#include "osc-sine.h"
typedef std::deque<SAMPLE_SPECS::sample_t> SINGLE_BUFFER;
/**
* Base class for time-based effects (delays, reverbs, etc).
*/
class EFFECT_TIME_BASED : public EFFECT_BASE {
public:
virtual EFFECT_TIME_BASED* clone(void) const = 0;
};
/**
* Delay effect
*/
class EFFECT_DELAY : public EFFECT_TIME_BASED {
private:
SAMPLE_ITERATOR_CHANNEL l,r;
parameter_t surround;
parameter_t dnum;
parameter_t dtime;
parameter_t dtime_msec;
parameter_t mix;
parameter_t feedback;
parameter_t laskuri;
std::vector<std::vector<SINGLE_BUFFER> > buffer;
public:
virtual std::string name(void) const { return("Delay"); }
virtual std::string parameter_names(void) const { return("delay-time-msec,surround-mode,number-of-delays,mix-%,feedback-%"); }
virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* insample);
virtual void process(void);
virtual int output_channels(int i_channels) const { return(2); }
parameter_t get_delta_in_samples(void) { return(dnum * dtime); }
EFFECT_DELAY* clone(void) const { return new EFFECT_DELAY(*this); }
EFFECT_DELAY* new_expr(void) const { return new EFFECT_DELAY(); }
EFFECT_DELAY (parameter_t delay_time = 100.0, int surround_mode = 0, int num_of_delays = 1, parameter_t mix_percent = 50.0, parameter_t feedback_percent = 100.0);
};
/**
* Multi-tap delay
*/
class EFFECT_MULTITAP_DELAY : public EFFECT_TIME_BASED {
private:
SAMPLE_ITERATOR_INTERLEAVED i;
parameter_t surround;
parameter_t mix;
parameter_t dtime_msec;
long int dtime, dnum;
std::vector<long int> delay_index;
std::vector<std::vector<bool> > filled;
std::vector<std::vector<SAMPLE_SPECS::sample_t> > buffer;
public:
virtual std::string name(void) const { return("Multitap delay"); }
virtual std::string parameter_names(void) const { return("delay-time-msec,number-of-delays,mix-%"); }
virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* insample);
virtual void process(void);
EFFECT_MULTITAP_DELAY* clone(void) const { return new EFFECT_MULTITAP_DELAY(*this); }
EFFECT_MULTITAP_DELAY* new_expr(void) const { return new EFFECT_MULTITAP_DELAY(); }
EFFECT_MULTITAP_DELAY (parameter_t delay_time = 100.0, int num_of_delays = 1, parameter_t mix_percent = 50.0);
};
/**
* Transforms a mono signal to stereo using a panned delay signal.
* Suitable delays values range from 1 to 40 milliseconds.
*/
class EFFECT_FAKE_STEREO : public EFFECT_TIME_BASED {
std::vector<std::deque<SAMPLE_SPECS::sample_t> > buffer;
SAMPLE_ITERATOR_CHANNEL l,r;
parameter_t dtime;
parameter_t dtime_msec;
public:
std::string name(void) const { return("Fake stereo"); }
virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
virtual std::string parameter_names(void) const { return("delay-time-msec"); }
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* insample);
virtual void process(void);
virtual int output_channels(int i_channels) const { return(2); }
EFFECT_FAKE_STEREO* clone(void) const { return new EFFECT_FAKE_STEREO(*this); }
EFFECT_FAKE_STEREO* new_expr(void) const { return new EFFECT_FAKE_STEREO(); }
EFFECT_FAKE_STEREO (parameter_t delay_time = 20.0);
};
/**
* Simple reverb (based on a iir comb filter)
*/
class EFFECT_REVERB : public EFFECT_TIME_BASED {
private:
std::vector<std::deque<SAMPLE_SPECS::sample_t> > buffer;
SAMPLE_ITERATOR_CHANNEL l,r;
parameter_t surround;
parameter_t feedback;
parameter_t dtime;
parameter_t dtime_msec;
public:
virtual std::string name(void) const { return("Reverb"); }
virtual std::string parameter_names(void) const { return("delay-time,surround-mode,feedback-%"); }
virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* insample);
virtual void process(void);
virtual int output_channels(int i_channels) const { return(2); }
parameter_t get_delta_in_samples(void) { return(dtime); }
EFFECT_REVERB* clone(void) const { return new EFFECT_REVERB(*this); }
EFFECT_REVERB* new_expr(void) const { return new EFFECT_REVERB(); }
EFFECT_REVERB (parameter_t delay_time = 20.0, int surround_mode = 0, parameter_t feedback_percent = 50.0);
};
/**
* Base class for modulating delay effects
*/
class EFFECT_MODULATING_DELAY : public EFFECT_TIME_BASED {
protected:
std::vector<std::vector<SAMPLE_SPECS::sample_t> > buffer;
SAMPLE_ITERATOR_CHANNELS i;
double advance_len_secs_rep, lfo_pos_secs_rep;
long int dtime;
parameter_t dtime_msec;
parameter_t feedback, vartime;
SINE_OSCILLATOR lfo;
std::vector<long int> delay_index;
std::vector<bool> filled;
public:
virtual void parameter_description(int param, struct PARAM_DESCRIPTION *pd) const;
virtual parameter_t get_parameter(int param) const;
virtual void set_parameter(int param, parameter_t value);
virtual void init(SAMPLE_BUFFER* insample);
virtual void process(void);
EFFECT_MODULATING_DELAY(parameter_t delay_time = 2.0,
long int vartime_in_samples = 20,
parameter_t feedback_percent = 50.0,
parameter_t lfo_freq = 0.4);
};
/**
* Flanger
*/
class EFFECT_FLANGER : public EFFECT_MODULATING_DELAY {
public:
virtual std::string name(void) const { return("Flanger"); }
virtual std::string parameter_names(void) const { return("delay-time-msec,variance-time-samples,feedback-%,lfo-freq"); }
void process(void);
EFFECT_FLANGER* clone(void) const { return new EFFECT_FLANGER(*this); }
EFFECT_FLANGER* new_expr(void) const { return new EFFECT_FLANGER(); }
};
/**
* Chorus
*/
class EFFECT_CHORUS : public EFFECT_MODULATING_DELAY {
public:
virtual std::string name(void) const { return("Chorus"); }
virtual std::string parameter_names(void) const { return("delay-time-msec,variance-time-samples,feedback-%,lfo-freq"); }
void process(void);
EFFECT_CHORUS* clone(void) const { return new EFFECT_CHORUS(*this); }
EFFECT_CHORUS* new_expr(void) const { return new EFFECT_CHORUS(); }
};
/**
* Phaser
*/
class EFFECT_PHASER : public EFFECT_MODULATING_DELAY {
public:
virtual std::string name(void) const { return("Phaser"); }
virtual std::string parameter_names(void) const { return("delay-time-msec,variance-time-samples,feedback-%,lfo-freq"); }
void process(void);
EFFECT_PHASER* clone(void) const { return new EFFECT_PHASER(*this); }
EFFECT_PHASER* new_expr(void) const { return new EFFECT_PHASER(); }
};
#endif