LIB: support enabled attribute for inst encoder config
[spectmorph.git] / lib / sminstrument.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2
3 #ifndef SPECTMORPH_INSTRUMENT_HH
4 #define SPECTMORPH_INSTRUMENT_HH
5
6 #include "smutils.hh"
7 #include "smwavdata.hh"
8 #include "smsignal.hh"
9 #include "smmath.hh"
10 #include "smaudio.hh"
11
12 #include <map>
13 #include <memory>
14
15 namespace SpectMorph
16 {
17
18 enum MarkerType {
19   MARKER_NONE = 0,
20   MARKER_LOOP_START,
21   MARKER_LOOP_END,
22   MARKER_CLIP_START,
23   MARKER_CLIP_END
24 };
25
26 class Instrument;
27
28 class Sample
29 {
30 public:
31   enum class Loop { NONE, FORWARD, PING_PONG, SINGLE_FRAME };
32
33   struct Shared
34   {
35     WavData     m_wav_data;
36     std::string m_wav_data_hash;
37   public:
38     Shared (const WavData& wav_data);
39
40     const WavData& wav_data() const;
41     std::string    wav_data_hash() const;
42   };
43   typedef std::shared_ptr<Shared> SharedP;
44 private:
45
46   SPECTMORPH_CLASS_NON_COPYABLE (Sample);
47
48   std::map<MarkerType, double> marker_map;
49   int m_midi_note = 69;
50   Instrument *instrument = nullptr;
51   Loop m_loop = Loop::NONE;
52
53   SharedP m_shared;
54
55 public:
56   Sample (Instrument *inst, const WavData& wav_data);
57   void    set_marker (MarkerType marker_type, double value);
58   double  get_marker (MarkerType marker_type) const;
59
60   int     midi_note() const;
61   void    set_midi_note (int note);
62
63   Loop    loop() const;
64   void    set_loop (Loop loop);
65
66   SharedP shared() const;
67
68   const WavData&  wav_data() const;
69   std::string     wav_data_hash() const;
70
71   std::string filename;
72   std::string short_name;
73
74   std::unique_ptr<Audio> audio;
75 };
76
77 class Instrument
78 {
79 public:
80   struct AutoVolume {
81     enum { FROM_LOOP, GLOBAL } method = FROM_LOOP;
82
83     bool    enabled = false;
84     double  gain    = 0;     // used by: global
85   };
86
87   struct AutoTune {
88     enum { SIMPLE, ALL_FRAMES, SMOOTH } method = SIMPLE;
89
90     bool    enabled  = false;
91     int     partials = 1;    // used by: all_frames, smooth
92     double  time     = 100;  // used_by: smooth
93     double  amount   = 25;   // used by: smooth
94   };
95   struct EncoderEntry
96   {
97     std::string param;
98     std::string value;
99   };
100   struct EncoderConfig
101   {
102     bool enabled = false;
103
104     std::vector<EncoderEntry> entries;
105   };
106
107 private:
108   SPECTMORPH_CLASS_NON_COPYABLE (Instrument);
109
110   std::vector<std::unique_ptr<Sample>> samples;
111   int m_selected = -1;
112   std::string m_name = "untitled";
113
114   AutoVolume    m_auto_volume;
115   AutoTune      m_auto_tune;
116   EncoderConfig m_encoder_config;
117 public:
118   Instrument();
119
120   Sample     *add_sample (const std::string& filename);
121   Sample     *sample (size_t n) const;
122   std::string gen_short_name (const std::string& filename);
123
124   size_t      size() const;
125   std::string name() const;
126
127   int         selected() const;
128   void        set_selected (int sel);
129
130   void        load (const std::string& filename);
131   void        save (const std::string& filename, bool zip = false);
132
133   void        update_order();
134   void        marker_changed();
135
136   AutoVolume  auto_volume() const;
137   void        set_auto_volume (const AutoVolume& new_value);
138
139   AutoTune    auto_tune() const;
140   void        set_auto_tune (const AutoTune& new_value);
141
142   EncoderConfig encoder_config() const;
143   void          set_encoder_config (const EncoderConfig& new_value);
144
145   Signal<> signal_samples_changed;
146   Signal<> signal_marker_changed;
147   Signal<> signal_global_changed;  // global auto volume, auto tune or advanced params changed
148 };
149
150 }
151
152 #endif