1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_MORPH_LINEAR_MODULE_HH
4 #define SPECTMORPH_MORPH_LINEAR_MODULE_HH
5 
6 #include "smmorphplan.hh"
7 #include "smmorphoutput.hh"
8 #include "smmorphoperatormodule.hh"
9 #include "smmorphlinear.hh"
10 #include "smmorphsourcemodule.hh"
11 
12 namespace SpectMorph
13 {
14 
15 class MorphLinearModule : public MorphOperatorModule
16 {
17   MorphOperatorModule *left_mod;
18   MorphOperatorModule *right_mod;
19   MorphOperatorModule *control_mod;
20   SimpleWavSetSource   left_source;
21   bool                 have_left_source;
22   SimpleWavSetSource   right_source;
23   bool                 have_right_source;
24   float                morphing;
25   bool                 db_linear;
26 
27   MorphLinear::ControlType control_type;
28 
29   Audio                audio;
30   AudioBlock           audio_block;
31 
32   struct MySource : public LiveDecoderSource
33   {
34     MorphLinearModule    *module;
35 
36     // temporary data for morphing (avoid malloc by putting it here)
37     AudioBlock            left_block;
38     AudioBlock            right_block;
39 
40     void interp_mag_one (double interp, uint16_t *left, uint16_t *right);
41     void retrigger (int channel, float freq, int midi_velocity, float mix_freq);
42     Audio* audio();
43     AudioBlock *audio_block (size_t index);
44   } my_source;
45 
46 public:
47   MorphLinearModule (MorphPlanVoice *voice);
48   ~MorphLinearModule();
49 
50   void set_config (MorphOperator *op);
51   LiveDecoderSource *source();
52 };
53 
54 }
55 
56 #endif
57