LIB: support enabled attribute for inst encoder config
[spectmorph.git] / lib / sminstencoder.cc
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2
3 #include "sminstencoder.hh"
4
5 using namespace SpectMorph;
6
7 using std::string;
8 using std::vector;
9 using std::max;
10
11 static float
12 freq_from_note (float note)
13 {
14   return 440 * exp (log (2) * (note - 69) / 12.0);
15 }
16
17 Audio *
18 InstEncoder::encode (const WavData& wav_data, int midi_note, Instrument::EncoderConfig& cfg)
19 {
20   if (cfg.enabled)
21     {
22       for (auto entry : cfg.entries)
23         {
24           if (!enc_params.add_config_entry (entry.param, entry.value))
25             {
26               fprintf (stderr, "InstEncoder: encoder config entry %s is not supported\n", entry.param.c_str());
27             }
28         }
29     }
30   enc_params.setup_params (wav_data, freq_from_note (midi_note));
31   enc_params.enable_phases = false; // save some space
32
33   Encoder encoder (enc_params);
34
35   encoder.encode (wav_data, /* channel */ 0, /* opt */ 1, /* attack */ true, /* sines */ true);
36
37   /* strip stuff we don't need (but keep everything that is needed if loop points are changed) */
38   vector<EncoderBlock>& audio_blocks = encoder.audio_blocks;
39
40   for (size_t i = 0; i < audio_blocks.size(); i++)
41     {
42       audio_blocks[i].debug_samples.clear();
43       audio_blocks[i].original_fft.clear();
44     }
45   encoder.original_samples.clear();
46
47   return encoder.save_as_audio();
48 }