SpectMorph
smlivedecoder.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_LIVEDECODER_HH
4 #define SPECTMORPH_LIVEDECODER_HH
5 
6 #include "smwavset.hh"
7 #include "smsinedecoder.hh"
8 #include "smnoisedecoder.hh"
9 #include "smlivedecodersource.hh"
10 #include "smpolyphaseinter.hh"
11 #include "smalignedarray.hh"
12 #include <vector>
13 
14 namespace SpectMorph {
15 
17 {
18  struct PartialState
19  {
20  float freq;
21  float phase;
22  };
23  std::vector<PartialState> pstate[2], *last_pstate;
24 
25  WavSet *smset;
26  Audio *audio;
27 
28  IFFTSynth *ifft_synth;
29  NoiseDecoder *noise_decoder;
30  LiveDecoderSource *source;
31  PolyPhaseInter *pp_inter;
32 
33  bool sines_enabled;
34  bool noise_enabled;
35  bool debug_fft_perf_enabled;
36  bool original_samples_enabled;
37  bool loop_enabled;
38 
39  size_t frame_size, frame_step;
40  size_t zero_values_at_start_scaled;
41  size_t loop_start_scaled;
42  size_t loop_end_scaled;
43  int loop_point;
44  float current_freq;
45  float current_mix_freq;
46 
47  size_t have_samples;
48  size_t block_size;
49  size_t pos;
50  size_t env_pos;
51  size_t frame_idx;
52  double original_sample_pos;
53  double original_samples_norm_factor;
54 
55  int noise_seed;
56 
57  AlignedArray<float,16> *sse_samples;
58 
59  // unison
60  int unison_voices;
61  std::vector<float> unison_phases[2];
62  std::vector<float> unison_freq_factor;
63  float unison_gain;
64  Random unison_phase_random_gen;
65 
66  Audio::LoopType get_loop_type();
67 
68 public:
69  LiveDecoder (WavSet *smset);
71  ~LiveDecoder();
72 
73  void enable_noise (bool ne);
74  void enable_sines (bool se);
75  void enable_debug_fft_perf (bool dfp);
76  void enable_original_samples (bool eos);
77  void enable_loop (bool eloop);
78  void set_noise_seed (int seed);
79  void set_unison_voices (int voices, float detune);
80 
81  void precompute_tables (float mix_freq);
82  void retrigger (int channel, float freq, int midi_velocity, float mix_freq);
83  void process (size_t n_values,
84  const float *freq_in,
85  const float *freq_mod_in,
86  float *audio_out);
87 
88  static size_t compute_loop_frame_index (size_t index, Audio *audio);
89 // later: bool done();
90 };
91 
92 }
93 #endif
Definition: smpolyphaseinter.hh:11
Audio sample containing many blocks.
Definition: smaudio.hh:80
Definition: smwavset.hh:28
Definition: smlivedecodersource.hh:10
Definition: smrandom.hh:14
Definition: smifftsynth.hh:15
Definition: smalignedarray.cc:7
Definition: smlivedecoder.hh:16
Decoder for the noise component (stochastic component) of the signal.
Definition: smnoisedecoder.hh:16