1 #ifndef INCLUDED_AUDIOFX_COMPRESSOR_H
2 #define INCLUDED_AUDIOFX_COMPRESSOR_H
3 
4 #include <vector>
5 #include "audiofx_amplitude.h"
6 
7 /**
8  * C++ version of John Dyson's advanced compressor design.
9  * @author Kai Vehmanen
10  */
11 class ADVANCED_COMPRESSOR : public EFFECT_AMPLITUDE {
12 
13   SAMPLE_ITERATOR_INTERLEAVED iter;
14 
15  public:
16 
17  static const int NFILT = 12;
18  static const int NEFILT = 17;
19 
20  public:
21 
ADVANCED_COMPRESSOR(void)22   ADVANCED_COMPRESSOR (void)
23     : rlevelsqn(ADVANCED_COMPRESSOR::NFILT),
24       rlevelsqe(ADVANCED_COMPRESSOR::NEFILT) {
25     init_values();
26     //    map_parameters();
27   }
28 
29   virtual ~ADVANCED_COMPRESSOR (void);
30 
name(void)31   virtual std::string name(void) const { return("Advanced compressor"); }
parameter_names(void)32   virtual std::string parameter_names(void) const { return("peak-limit-%,release-time-sec,fast-crate,overall-crate"); }
33 
34   virtual void set_parameter(int param, parameter_t value);
35   virtual parameter_t get_parameter(int param) const;
36 
37   virtual void init(SAMPLE_BUFFER *insample);
38   virtual void process(void);
output_channels(int i_channels)39   virtual int output_channels(int i_channels) const { return(2); }
40 
clone(void)41   ADVANCED_COMPRESSOR* clone(void) const { return new ADVANCED_COMPRESSOR(*this); }
new_expr(void)42   ADVANCED_COMPRESSOR* new_expr(void) const { return new ADVANCED_COMPRESSOR(); }
43   ADVANCED_COMPRESSOR (double peak_limit, double release_time, double cfrate, double crate);
44 
45  private:
46 
47   double rlevelsq0, rlevelsq1;
48   double rlevelsq0filter, rlevelsq1filter;
49   std::vector<double> rlevelsqn; // [NFILT];
50   double rlevelsqefilter;
51   std::vector<double> rlevelsqe; // [NEFILT];
52   double rlevelsq0ffilter;
53   int ndelay; /* delay for rlevelsq0ffilter delay */
54   int ndelayptr; /* ptr for the input */
55   std::vector<double> rightdelay;
56   std::vector<double> leftdelay;
57 /* Simple gain running average */
58   double rgain;
59   double rgainfilter;
60   double lastrgain;
61 /* Max fast agc gain, slow agc gain */
62   double maxfastgain, maxslowgain;
63 /* Fast gain compression ratio */
64 /*	Note that .5 is 2:1, 1.0 is infinity (hard) */
65   double fastgaincompressionratio;
66   double compressionratio;
67 /* Max level, target level, floor level */
68   double maxlevel, targetlevel, floorlevel;
69 /* Gainriding gain */
70   double rmastergain0filter;
71   double rmastergain0;
72 /* Peak limit gain */
73   double rpeakgain0, rpeakgain1, rpeakgainfilter;
74   int peaklimitdelay, rpeaklimitdelay;
75 /* Running total gain */
76   double totalgain;
77 /* Idle gain */
78   double npeakgain;
79 /* Compress enabled */
80   int compress;
81 
82   double level, levelsq0, levelsq1, levelsqe;
83   double gain, qgain, tgain;
84   double newright, newleft;
85   double efilt;
86   double fastgain, slowgain, tslowgain;
87   double leveldelta;
88   double right, left, rightd, leftd;
89   int delayed;
90   double nrgain, nlgain, ngain, ngsq;
91   double sqrtrpeakgain;
92   int i;
93   int skipmode;
94 
95   double extra_maxlevel;
96   int parm;
97   double maxgain, mingain;
98   int ch;
99   double fratio;
100   double ratio;
101   double releasetime;
102   double peakpercent;
103 
104   double tnrgain;
105 
106   void init_values(void);
107   double hardlimit(double value, double knee, double limit);
108 
109 };
110 
111 #endif
112