SpectMorph
smaudio.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2 
3 #ifndef SPECTMORPH_AUDIO_HH
4 #define SPECTMORPH_AUDIO_HH
5 
6 #include <vector>
7 
8 #include "smgenericin.hh"
9 #include "smgenericout.hh"
10 #include "smmath.hh"
11 #include "smutils.hh"
12 
13 #define SPECTMORPH_BINARY_FILE_VERSION 14
14 #define SPECTMORPH_SUPPORT_MULTI_CHANNEL 0
15 
16 namespace SpectMorph
17 {
18 
28 {
29 public:
30  std::vector<uint16_t> noise;
31  std::vector<uint16_t> freqs;
32  std::vector<uint16_t> mags;
33  std::vector<uint16_t> phases;
34  std::vector<float> original_fft;
35  std::vector<float> debug_samples;
36 
37  void sort_freqs();
38  double estimate_fundamental (int n_partials = 1, double *mag = nullptr) const;
39 
40  double
41  freqs_f (size_t i) const
42  {
43  return sm_ifreq2freq (freqs[i]);
44  }
45 
46  double
47  mags_f (size_t i) const
48  {
49  return sm_idb2factor (mags[i]);
50  }
51 
52  double
53  phases_f (size_t i) const
54  {
55  const double factor = 2.0 * M_PI / 65536.0;
56  return phases[i] * factor;
57  }
58 
59  double
60  noise_f (size_t i) const
61  {
62  return sm_idb2factor (noise[i]);
63  }
64 };
65 
66 enum AudioLoadOptions
67 {
68  AUDIO_LOAD_DEBUG,
69  AUDIO_SKIP_DEBUG
70 };
71 
79 class Audio
80 {
81  SPECTMORPH_CLASS_NON_COPYABLE (Audio);
82 public:
83  Audio();
84  ~Audio();
85 
86  enum LoopType {
87  LOOP_NONE = 0,
88  LOOP_FRAME_FORWARD,
89  LOOP_FRAME_PING_PONG,
90  LOOP_TIME_FORWARD,
91  LOOP_TIME_PING_PONG,
92  };
93 
94  float fundamental_freq = 0;
95  float mix_freq = 0;
96  float frame_size_ms = 0;
97  float frame_step_ms = 0;
98  float attack_start_ms = 0;
99  float attack_end_ms = 0;
100  int zeropad = 0;
101  LoopType loop_type = LOOP_NONE;
102  int loop_start = 0;
103  int loop_end = 0;
105  int sample_count = 0;
106  std::vector<float> original_samples;
108  std::vector<AudioBlock> contents;
109 
110  Error load (const std::string& filename, AudioLoadOptions load_options = AUDIO_LOAD_DEBUG);
111  Error load (SpectMorph::GenericIn *file, AudioLoadOptions load_options = AUDIO_LOAD_DEBUG);
112  Error save (const std::string& filename) const;
113  Error save (SpectMorph::GenericOut *file) const;
114 
115  Audio *clone() const; // create a deep copy
116 
117  static bool loop_type_to_string (LoopType loop_type, std::string& s);
118  static bool string_to_loop_type (const std::string& s, LoopType& loop_type);
119 };
120 
121 }
122 
123 #endif
SpectMorph::Audio
Audio sample containing many blocks.
Definition: smaudio.hh:79
SpectMorph::Audio::zero_values_at_start
int zero_values_at_start
number of zero values added by encoder (strip during decoding)
Definition: smaudio.hh:104
SpectMorph::Audio::loop_start
int loop_start
loop point to be used during sustain phase of playback
Definition: smaudio.hh:102
SpectMorph::AudioBlock::original_fft
std::vector< float > original_fft
original zeropadded FFT data - for debugging only
Definition: smaudio.hh:34
SpectMorph::AudioBlock::freqs
std::vector< uint16_t > freqs
frequencies of the sine components of this frame
Definition: smaudio.hh:31
SpectMorph::Audio::sample_count
int sample_count
number of samples encoded (including zero_values_at_start)
Definition: smaudio.hh:105
SpectMorph::Audio::save
Error save(const std::string &filename) const
Definition: smaudio.cc:249
SpectMorph::Audio::frame_step_ms
float frame_step_ms
stepping of the audio frames in milliseconds
Definition: smaudio.hh:97
SpectMorph::Audio::contents
std::vector< AudioBlock > contents
the actual frame data
Definition: smaudio.hh:108
SpectMorph::AudioBlock::phases
std::vector< uint16_t > phases
phases of the sine components
Definition: smaudio.hh:33
SpectMorph::AudioBlock
Block of audio data, encoded in SpectMorph parametric format.
Definition: smaudio.hh:27
SpectMorph::Audio::zeropad
int zeropad
FFT zeropadding used during analysis.
Definition: smaudio.hh:100
SpectMorph::Audio::loop_type
LoopType loop_type
type of loop to be used during sustain phase of playback
Definition: smaudio.hh:101
SpectMorph::Audio::loop_end
int loop_end
loop point to be used during sustain phase of playback
Definition: smaudio.hh:103
SpectMorph::Audio::original_samples
std::vector< float > original_samples
original time domain signal as samples (debugging only)
Definition: smaudio.hh:106
SpectMorph::GenericIn
Generic Input Stream.
Definition: smgenericin.hh:17
SpectMorph::GenericOut
Generic Output Stream.
Definition: smgenericout.hh:17
SpectMorph::Error
Definition: smutils.hh:90
SpectMorph::Audio::frame_size_ms
float frame_size_ms
length of each audio frame in milliseconds
Definition: smaudio.hh:96
SpectMorph::Audio::load
Error load(const std::string &filename, AudioLoadOptions load_options=AUDIO_LOAD_DEBUG)
Definition: smaudio.cc:31
SpectMorph::Audio::attack_end_ms
float attack_end_ms
end of attack in milliseconds
Definition: smaudio.hh:99
SpectMorph::AudioBlock::noise
std::vector< uint16_t > noise
noise envelope, representing the original signal minus sine components
Definition: smaudio.hh:30
SpectMorph::Audio::fundamental_freq
float fundamental_freq
fundamental frequency (note which was encoded), or 0 if not available
Definition: smaudio.hh:94
SpectMorph::Audio::mix_freq
float mix_freq
mix freq (sampling rate) of the original audio data
Definition: smaudio.hh:95
SpectMorph::Audio::original_samples_norm_db
float original_samples_norm_db
normalization factor to be applied to original samples
Definition: smaudio.hh:107
SpectMorph::AudioBlock::mags
std::vector< uint16_t > mags
magnitudes of the sine components
Definition: smaudio.hh:32
SpectMorph::AudioBlock::debug_samples
std::vector< float > debug_samples
original audio samples for this frame - for debugging only
Definition: smaudio.hh:35
SpectMorph::Audio::attack_start_ms
float attack_start_ms
start of attack in milliseconds
Definition: smaudio.hh:98