28 #ifndef SRC_HEADERS_GX_PARAMETER_H_ 29 #define SRC_HEADERS_GX_PARAMETER_H_ 31 namespace gx_system {
class JsonWriter;
class JsonParser; }
36 #define debug_check(func, ...) func(__VA_ARGS__) 38 #define debug_check(...) 49 map<string, string> groups;
52 map<string, bool> used;
53 void group_exists(
const string&
id);
54 void group_is_new(
const string&
id);
55 friend string param_group(
const string& group_id,
bool nowarn);
62 inline string get(
const string& id) {
return groups[id]; }
67 inline void insert(
const string&
id,
const string& group) {
69 groups.insert(pair<string, string>(
id, group));
71 inline void erase(
const string&
id) {
72 #ifndef NDEBUG // avoid unused variable warning in release mode 73 size_t n = groups.erase(
id);
86 string param_group(
const string& group_id,
bool nowarn =
false);
109 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
110 virtual bool midi_set_bpm(
float n,
float high,
float llimit,
float ulimit);
111 virtual void trigger_changed();
120 unsigned int d_flags : 2;
121 bool save_in_preset : 1;
122 bool controllable : 1;
123 bool do_not_save : 1;
127 void range_warning(
float value,
float lower,
float upper);
130 inline std::string
group_id()
const {
return _id.substr(0, _id.find_last_of(
".")); }
133 boost::noncopyable(),
136 _group(param_group(group_id())),
141 save_in_preset(preset),
158 const char *get_typename()
const;
159 bool isFloat()
const {
return v_type == tp_float; }
161 bool isBool()
const {
return v_type == tp_bool; }
162 bool isFile()
const {
return v_type == tp_file; }
163 bool isString()
const {
return v_type == tp_string; }
169 const string&
id()
const {
return _id; }
170 const string&
group()
const {
return _group; }
171 string l_group()
const {
return gettext(_group.c_str()); }
172 const string&
name()
const {
return _name; }
173 string l_name()
const {
return gettext(_name.c_str()); }
174 const string&
desc()
const {
return _desc; }
175 void set_desc(
const string& desc) { _desc = desc; }
176 string l_desc()
const {
return gettext(_desc.c_str()); }
182 virtual void stdJSON_value() = 0;
183 virtual bool on_off_value() = 0;
186 virtual void setJSON_value() = 0;
187 virtual bool compareJSON_value() = 0;
188 virtual bool hasRange()
const;
189 virtual float getLowerAsFloat()
const;
190 virtual float getUpperAsFloat()
const;
191 virtual float getStepAsFloat()
const;
192 virtual const value_pair *getValueNames()
const;
196 FloatParameter& getFloat();
197 IntParameter& getInt();
199 BoolParameter& getBool();
201 StringParameter &getString();
202 sigc::signal<void, float>& signal_changed_float();
203 sigc::signal<void, int>& signal_changed_int();
204 sigc::signal<void, bool>& signal_changed_bool();
205 sigc::signal<void, const Glib::ustring&>& signal_changed_string();
226 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
227 virtual bool midi_set_bpm(
float n,
float high,
float llimit,
float ulimit);
228 virtual void trigger_changed();
238 bool set(
float val)
const;
240 void convert_from_range(
float low,
float up);
241 virtual void stdJSON_value();
242 virtual bool on_off_value();
245 virtual bool compareJSON_value();
246 virtual void setJSON_value();
247 virtual bool hasRange()
const;
248 virtual float getLowerAsFloat()
const;
249 virtual float getUpperAsFloat()
const;
250 virtual float getStepAsFloat()
const;
251 virtual float idx_from_id(
string v_id);
253 float *v,
float sv,
float lv,
float uv,
float tv,
bool ctrl,
bool no_init):
254 Parameter(id, name, tp_float, ctp, preset, ctrl),
255 value(v ? v : &value_storage), std_value(sv),lower(lv),upper(uv),step(tv) {
256 set(no_init ? *value : sv);
277 virtual const value_pair *getValueNames()
const;
279 int sv,
int low,
bool ctrl,
bool no_init);
281 virtual float idx_from_id(
string v_id);
289 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
290 virtual void trigger_changed();
299 bool set(
int val)
const;
301 virtual void stdJSON_value();
302 virtual bool on_off_value();
305 virtual bool compareJSON_value();
306 virtual void setJSON_value();
307 virtual bool hasRange()
const;
308 virtual float getLowerAsFloat()
const;
309 virtual float getUpperAsFloat()
const;
310 virtual int idx_from_id(
string v_id);
312 int *v,
int sv,
int lv,
int uv,
bool ctrl):
314 value(v ? v : &value_storage), std_value(sv), lower(lv), upper(uv) {
332 virtual const value_pair *getValueNames()
const;
333 virtual int idx_from_id(
string v_id);
345 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
346 virtual void trigger_changed();
354 bool set(
bool val)
const;
355 virtual void stdJSON_value();
357 virtual bool on_off_value();
359 virtual bool compareJSON_value();
360 virtual void setJSON_value();
363 bool *v,
bool sv,
bool ctrl):
364 Parameter(id, name, tp_bool, ctp, preset, ctrl),
365 value(v ? v : &value_storage), std_value(sv) {
386 bool set(
const Glib::RefPtr<Gio::File>& val);
387 void set_path(
const string& path);
388 const Glib::RefPtr<Gio::File>&
get()
const {
return value; }
389 virtual void stdJSON_value();
390 virtual bool on_off_value();
393 virtual bool compareJSON_value();
394 virtual void setJSON_value();
395 FileParameter(
const string&
id,
const string& filename,
bool preset =
false):
396 Parameter(id,
"", tp_file, None, preset, false),
397 value(Gio::File::create_for_path(filename)),
398 std_value(value->dup()) {}
400 Parameter(id,
"", tp_file, None, preset, false),
405 void set_standard(
const string& filename);
406 bool is_equal(
const Glib::RefPtr<Gio::File>& v)
const;
408 string get_path()
const;
409 string get_directory_path()
const;
410 string get_parse_name()
const;
411 string get_display_name()
const;
412 void copy(
const string& destination)
const;
423 sigc::signal<void, const Glib::ustring&>
changed;
426 bool set(
const Glib::ustring& val)
const;
427 const Glib::ustring&
get_value()
const {
return *value; }
428 virtual void stdJSON_value();
429 virtual bool on_off_value();
431 virtual bool compareJSON_value();
432 virtual void setJSON_value();
434 ParameterV(
const string&
id,
const string& name, Glib::ustring *v,
const Glib::ustring& sv,
bool preset =
false)
435 :
Parameter(id, name, tp_string, None, preset, false),
436 value(v ? v : &value_storage), std_value(sv) {
447 inline FloatParameter &Parameter::getFloat() {
449 return static_cast<FloatParameter&
>(*this);
452 inline IntParameter &Parameter::getInt() {
454 return static_cast<IntParameter&
>(*this);
463 inline BoolParameter &Parameter::getBool() {
465 return static_cast<BoolParameter&
>(*this);
473 inline StringParameter &Parameter::getString() {
475 return static_cast<StringParameter&
>(*this);
478 inline sigc::signal<void, float>& Parameter::signal_changed_float() {
479 FloatParameter *p =
dynamic_cast<FloatParameter*
>(
this);
484 inline sigc::signal<void, int>& Parameter::signal_changed_int() {
485 IntParameter *p =
dynamic_cast<IntParameter*
>(
this);
490 inline sigc::signal<void, bool>& Parameter::signal_changed_bool() {
491 BoolParameter *p =
dynamic_cast<BoolParameter*
>(
this);
496 inline sigc::signal<void, const Glib::ustring&>& Parameter::signal_changed_string() {
497 StringParameter *p =
dynamic_cast<StringParameter*
>(
this);
509 map<string, Parameter*> id_map;
511 sigc::signal<void,Parameter*,bool> insert_remove;
515 void check_p(
const char *p);
527 typedef map<string, Parameter*>::const_iterator
iterator;
528 iterator
begin()
const {
return id_map.begin(); }
529 iterator
end()
const {
return id_map.end(); }
530 bool hasId(
const string&
id)
const {
return id_map.find(
id) != id_map.end(); }
531 bool hasId(
const char *p)
const {
return id_map.find(p) != id_map.end(); }
541 void set_init_values();
542 void reset_unit(
const PluginDef *pdef)
const;
543 bool unit_has_std_values(
const PluginDef *pdef)
const;
546 void unregister(
const string&
id);
547 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std,
548 float lower,
float upper,
float step) {
549 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
true, var, std, lower, upper, step,
true, replace_mode);
554 const string&
id,
const string& name,
float *var,
float std,
float lower,
float upper,
float step) {
555 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
false, var, std, lower, upper, step,
false, replace_mode);
559 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std = 0) {
560 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Switch,
true, var,
std, 0, 1, 1,
true, replace_mode);
564 inline BoolParameter *
reg_par(
const string&
id,
const string& name,
bool *var,
bool std=
false,
bool preset=
true) {
565 BoolParameter * p =
new BoolParameter(
id, name, Parameter::Switch, preset, var,
std,
true);
576 const string&
id,
const string& name,
const value_pair *vl,
577 int *var,
bool preset,
int std = 0) {
584 int std = 0,
int low = 0) {
590 BoolParameter *p =
new BoolParameter(
id,
"", Parameter::Switch, preset, var,
std,
false);
594 inline IntParameter *
reg_non_midi_par(
const string&
id,
int *var,
bool preset,
int std,
int lower,
int upper) {
595 IntParameter *p =
new IntParameter(
id,
"", Parameter::None, preset, var, std, lower, upper,
false);
600 float std = 0,
float lower = 0,
float upper = 1,
float step = 0) {
601 FloatParameter *p =
new FloatParameter(
id,
"", Parameter::None, preset, val,
std, lower, upper, step,
false, replace_mode);
610 inline StringParameter *
reg_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
false) {
615 inline StringParameter *
reg_preset_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
true) {
622 void dump(
const string& fmt);
645 modstring(
const string& n,
bool m,
const char* s): name(n), modified(m), std(s) {}
646 explicit modstring(
const char* n): name(n), modified(
false), std(n) {}
647 modstring(): name(
""), modified(
false), std(0) {}
649 map<int, modstring> m;
654 void replace(
int ctr,
const string& name);
669 float _lower, _upper;
673 param(&p), _lower(l), _upper(u), toggle(t) {}
674 float lower()
const {
return _lower; }
675 float upper()
const {
return _upper; }
680 bool set_midi(
int n,
int last_value);
681 bool set_bpm(
int n,
int last_value);
682 bool set_trans(
int n,
int last_value);
683 void set(
float v,
float high) { param->midi_set(v, high, _lower, _upper); }
709 unsigned int rounded(
float f);
710 bool time_to_bpm(
double time,
unsigned int* bpm_);
716 enum { array_size = 128 };
729 int last_midi_control_value[ControllerArray::array_size];
730 int last_midi_control;
731 volatile gint program_change;
732 volatile gint mute_change;
733 volatile gint bank_change;
738 Glib::Dispatcher pgm_chg;
739 Glib::Dispatcher mute_chg;
740 Glib::Dispatcher bank_chg;
741 sigc::signal<void> changed;
742 sigc::signal<void,int> new_program;
743 sigc::signal<void,int> new_mute_state;
744 sigc::signal<void,int> new_bank;
745 sigc::signal<void, int, int> midi_value_changed;
750 bool check_midi_values();
754 int size() {
return map.size(); }
755 void set_config_mode(
bool mode,
int ctl=-1);
759 void set_ctr_val(
int ctr,
int val);
760 void set_bpm_val(
unsigned int val);
762 void modifyCurrent(
Parameter& param,
float lower,
float upper,
bool toggle);
767 assert(n < ControllerArray::array_size);
return last_midi_control_value[n]; }
769 assert(n < ControllerArray::array_size); last_midi_control_value[n] = v; }
771 void remove_controlled_parameters(paramlist& plist,
const ControllerArray *m);
776 void compute_midi_in(
void* midi_input_port_buf,
void *arg);
777 void process_trans(
int transport_state);
778 void update_from_controller(
int ctr);
779 void update_from_controllers();
781 void request_midi_value_update();
786 #endif // SRC_HEADERS_GX_PARAMETER_H_ ParameterV< float > FloatParameter
int get_last_midi_control_value(unsigned int n)
FloatEnumParameter(gx_system::JsonParser &jp)
FloatEnumParameter * reg_enum_par(const string &id, const string &name, const value_pair *vl, float *var, int std=0, int low=0)
int param2controller(Parameter ¶m, const MidiController **p)
string operator[](const string &id)
ParameterV(const string &id, const string &name, ctrl_type ctp, bool preset, int *v, int sv, int lv, int uv, bool ctrl)
Parameter & getParameter() const
midi_controller_list & operator[](int n)
void check_id(Gtk::Widget *w, const std::string &id, gx_engine::GxMachineBase &machine)
int get_current_control()
MidiController(Parameter &p, float l, float u, bool t=false)
void set_current_control(int ctl)
sigc::signal< void > & signal_changed()
BoolParameter * reg_non_midi_par(const string &id, bool *var, bool preset, bool std=false)
MidiStandardControllers midi_std_ctr
const string & group() const
map< string, Parameter * >::const_iterator iterator
Parameter(const string &id, const string &name, value_type vtp, ctrl_type ctp, bool preset, bool ctrl)
list< Parameter * > paramlist
FloatParameter * reg_par_non_preset(const string &id, const string &name, float *var, float std, float lower, float upper, float step)
FloatParameter * reg_par(const string &id, const string &name, float *var, float std=0)
const string operator[](int ctr)
string param_group(const string &group_id, bool nowarn=false)
int param2controller(Parameter ¶m, const MidiController **p)
bool hasId(const string &id) const
Parameter & operator[](const string &id)
void compare_parameter(const char *title, Parameter *p1, Parameter *p2, bool all=false)
sigc::signal< void, int > & signal_new_program()
const string & id() const
bool isControllable() const
Glib::RefPtr< Gio::File > std_value
EnumParameter(gx_system::JsonParser &jp)
IntParameter * reg_non_midi_par(const string &id, int *var, bool preset, int std, int lower, int upper)
ParameterV< int > IntParameter
sigc::signal< void, float > & signal_changed()
sigc::signal< void > changed
StringParameter * reg_string(const string &id, const string &name, Glib::ustring *var, const string &sv, bool preset=false)
bool hasParameter(const Parameter &p) const
ParameterV< bool > BoolParameter
sigc::signal< void, int, int > & signal_midi_value_changed()
#define debug_check(func,...)
Glib::ustring value_storage
void insert(const string &id, const string &group)
sigc::signal< void > & signal_changed()
ParameterGroups & get_group_table()
const string & desc() const
sigc::signal< void, bool > changed
const value_pair * value_names
ctrl_type getControlType() const
FileParameter(const string &id, bool preset=false)
sigc::signal< void, bool > & signal_changed()
void set_replace_mode(bool mode)
Parameter & operator[](const char *p)
const value_pair * value_names
void erase(const string &id)
std::string group_id() const
void writeJSON(gx_system::JsonWriter &jw) const
sigc::signal< void, Parameter *, bool > signal_insert_remove()
sigc::signal< void, int > & signal_new_bank()
FloatParameter * reg_par(const string &id, const string &name, float *var, float std, float lower, float upper, float step)
list< MidiController > midi_controller_list
void writeJSON(gx_system::JsonWriter &jw) const
FileParameter * reg_filepar(const string &id, bool preset=false)
const string & name() const
Glib::RefPtr< Gio::File > value
sigc::signal< void, int > changed
const Glib::ustring & get_value() const
BoolParameter * reg_par(const string &id, const string &name, bool *var, bool std=false, bool preset=true)
sigc::signal< void, int > & signal_new_mute_state()
sigc::signal< void, const Glib::ustring & > & signal_changed()
void set_desc(const string &desc)
FloatParameter * reg_non_midi_par(const string &id, float *val, bool preset, float std=0, float lower=0, float upper=1, float step=0)
EnumParameter * reg_enum_par(const string &id, const string &name, const value_pair *vl, int *var, int std=0)
sigc::signal< void, float > changed
FileParameter(const string &id, const string &filename, bool preset=false)
ParameterV(const string &id, const string &name, ctrl_type ctp, bool preset, float *v, float sv, float lv, float uv, float tv, bool ctrl, bool no_init)
ParameterV(const string &id, const string &name, Glib::ustring *v, const Glib::ustring &sv, bool preset=false)
bool hasId(const char *p) const
static const char * value_label(const value_pair &vp)
ParameterV(const string &id, const string &name, ctrl_type ctp, bool preset, bool *v, bool sv, bool ctrl)
ParameterV< Glib::ustring > StringParameter
Glib::RefPtr< Gio::File > json_value
const value_pair & get_pair()
sigc::signal< void, const Glib::ustring & > changed
EnumParameter * reg_non_midi_enum_par(const string &id, const string &name, const value_pair *vl, int *var, bool preset, int std=0)
bool operator==(const Parameter &p) const
void set_last_midi_control_value(unsigned int n, int v)
sigc::signal< void, int > & signal_changed()
StringParameter * reg_preset_string(const string &id, const string &name, Glib::ustring *var, const string &sv, bool preset=true)