d8df1b5ccfc22140844a8a490090c3169a57360f
[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   for (auto entry : cfg.entries)
21     {
22       if (!enc_params.add_config_entry (entry.param, entry.value))
23         {
24           fprintf (stderr, "InstEncoder: encoder config entry %s is not supported\n", entry.param.c_str());
25         }
26     }
27   enc_params.setup_params (wav_data, freq_from_note (midi_note));
28   enc_params.enable_phases = false; // save some space
29
30   Encoder encoder (enc_params);
31
32   encoder.encode (wav_data, /* channel */ 0, /* opt */ 1, /* attack */ true, /* sines */ true);
33
34   /* strip stuff we don't need (but keep everything that is needed if loop points are changed) */
35   vector<EncoderBlock>& audio_blocks = encoder.audio_blocks;
36
37   for (size_t i = 0; i < audio_blocks.size(); i++)
38     {
39       audio_blocks[i].debug_samples.clear();
40       audio_blocks[i].original_fft.clear();
41     }
42   encoder.original_samples.clear();
43
44   return encoder.save_as_audio();
45 }