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 bool group_exist(
const string&
id);
72 inline void erase(
const string&
id) {
73 #ifndef NDEBUG // avoid unused variable warning in release mode 74 size_t n = groups.erase(
id);
87 string param_group(
const string& group_id,
bool nowarn =
false);
111 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
112 virtual bool midi_set_bpm(
float n,
float high,
float llimit,
float ulimit);
113 virtual void trigger_changed();
130 void range_warning(
float value,
float lower,
float upper);
133 inline std::string
group_id()
const {
return _id.substr(0, _id.find_last_of(
".")); }
136 boost::noncopyable(),
139 _group(param_group(group_id())),
144 save_in_preset(preset),
162 const char *get_typename()
const;
163 bool isFloat()
const {
return v_type == tp_float; }
165 bool isBool()
const {
return v_type == tp_bool; }
166 bool isFile()
const {
return v_type == tp_file; }
167 bool isString()
const {
return v_type == tp_string; }
173 const string&
id()
const {
return _id; }
174 const string&
group()
const {
return _group; }
175 string l_group()
const {
return gettext(_group.c_str()); }
176 const string&
name()
const {
return _name; }
177 string l_name()
const {
return gettext(_name.c_str()); }
178 const string&
desc()
const {
return _desc; }
179 void set_desc(
const string& desc) { _desc = desc; }
180 string l_desc()
const {
return gettext(_desc.c_str()); }
188 virtual void stdJSON_value() = 0;
189 virtual bool on_off_value() = 0;
192 virtual void setJSON_value() = 0;
193 virtual bool compareJSON_value() = 0;
194 virtual bool hasRange()
const;
195 virtual float getLowerAsFloat()
const;
196 virtual float getUpperAsFloat()
const;
197 virtual float getStepAsFloat()
const;
198 virtual const value_pair *getValueNames()
const;
202 FloatParameter& getFloat();
203 IntParameter& getInt();
205 BoolParameter& getBool();
207 StringParameter &getString();
208 sigc::signal<void, float>& signal_changed_float();
209 sigc::signal<void, int>& signal_changed_int();
210 sigc::signal<void, bool>& signal_changed_bool();
211 sigc::signal<void, const Glib::ustring&>& signal_changed_string();
232 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
233 virtual bool midi_set_bpm(
float n,
float high,
float llimit,
float ulimit);
234 virtual void trigger_changed();
244 bool set(
float val)
const;
246 void convert_from_range(
float low,
float up);
247 virtual void stdJSON_value();
248 virtual bool on_off_value();
251 virtual bool compareJSON_value();
252 virtual void setJSON_value();
253 virtual bool hasRange()
const;
254 virtual float getLowerAsFloat()
const;
255 virtual float getUpperAsFloat()
const;
256 virtual float getStepAsFloat()
const;
257 virtual float idx_from_id(
string v_id);
259 float *v,
float sv,
float lv,
float uv,
float tv,
bool ctrl,
bool no_init):
260 Parameter(id, name, tp_float, ctp, preset, ctrl),
261 value(v ? v : &value_storage), std_value(sv),lower(lv),upper(uv),step(tv) {
262 set(no_init ? *value : sv);
283 virtual const value_pair *getValueNames()
const;
285 int sv,
int low,
bool ctrl,
bool no_init);
287 virtual float idx_from_id(
string v_id);
295 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
296 virtual void trigger_changed();
305 bool set(
int val)
const;
307 virtual void stdJSON_value();
308 virtual bool on_off_value();
311 virtual bool compareJSON_value();
312 virtual void setJSON_value();
313 virtual bool hasRange()
const;
314 virtual float getLowerAsFloat()
const;
315 virtual float getUpperAsFloat()
const;
316 virtual int idx_from_id(
string v_id);
318 int *v,
int sv,
int lv,
int uv,
bool ctrl):
320 value(v ? v : &value_storage), std_value(sv), lower(lv), upper(uv) {
338 virtual const value_pair *getValueNames()
const;
339 virtual int idx_from_id(
string v_id);
351 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
352 virtual void trigger_changed();
360 bool set(
bool val)
const;
361 virtual void stdJSON_value();
363 virtual bool on_off_value();
365 virtual bool compareJSON_value();
366 virtual void setJSON_value();
369 bool *v,
bool sv,
bool ctrl):
370 Parameter(id, name, tp_bool, ctp, preset, ctrl),
371 value(v ? v : &value_storage), std_value(sv) {
392 bool set(
const Glib::RefPtr<Gio::File>& val);
393 void set_path(
const string& path);
394 const Glib::RefPtr<Gio::File>&
get()
const {
return value; }
395 virtual void stdJSON_value();
396 virtual bool on_off_value();
399 virtual bool compareJSON_value();
400 virtual void setJSON_value();
401 FileParameter(
const string&
id,
const string& filename,
bool preset =
false):
402 Parameter(id,
"", tp_file, None, preset, false),
403 value(Gio::File::create_for_path(filename)),
404 std_value(value->dup()) {}
406 Parameter(id,
"", tp_file, None, preset, false),
411 void set_standard(
const string& filename);
412 bool is_equal(
const Glib::RefPtr<Gio::File>& v)
const;
414 string get_path()
const;
415 string get_directory_path()
const;
416 string get_parse_name()
const;
417 string get_display_name()
const;
418 void copy(
const string& destination)
const;
429 sigc::signal<void, const Glib::ustring&>
changed;
432 bool set(
const Glib::ustring& val)
const;
433 const Glib::ustring&
get_value()
const {
return *value; }
434 virtual void stdJSON_value();
435 virtual bool on_off_value();
437 virtual bool compareJSON_value();
438 virtual void setJSON_value();
440 ParameterV(
const string&
id,
const string& name, Glib::ustring *v,
const Glib::ustring& sv,
bool preset =
false)
441 :
Parameter(id, name, tp_string, None, preset, false),
442 value(v ? v : &value_storage), std_value(sv) {
453 inline FloatParameter &Parameter::getFloat() {
455 return static_cast<FloatParameter&
>(*this);
458 inline IntParameter &Parameter::getInt() {
460 return static_cast<IntParameter&
>(*this);
469 inline BoolParameter &Parameter::getBool() {
471 return static_cast<BoolParameter&
>(*this);
479 inline StringParameter &Parameter::getString() {
481 return static_cast<StringParameter&
>(*this);
484 inline sigc::signal<void, float>& Parameter::signal_changed_float() {
485 FloatParameter *p =
dynamic_cast<FloatParameter*
>(
this);
490 inline sigc::signal<void, int>& Parameter::signal_changed_int() {
491 IntParameter *p =
dynamic_cast<IntParameter*
>(
this);
496 inline sigc::signal<void, bool>& Parameter::signal_changed_bool() {
497 BoolParameter *p =
dynamic_cast<BoolParameter*
>(
this);
502 inline sigc::signal<void, const Glib::ustring&>& Parameter::signal_changed_string() {
503 StringParameter *p =
dynamic_cast<StringParameter*
>(
this);
515 map<string, Parameter*> id_map;
517 sigc::signal<void,Parameter*,bool> insert_remove;
521 void check_p(
const char *p);
533 typedef map<string, Parameter*>::const_iterator
iterator;
534 iterator
begin()
const {
return id_map.begin(); }
535 iterator
end()
const {
return id_map.end(); }
536 bool hasId(
const string&
id)
const {
return id_map.find(
id) != id_map.end(); }
537 bool hasId(
const char *p)
const {
return id_map.find(p) != id_map.end(); }
547 void set_init_values();
548 void reset_unit(
const PluginDef *pdef)
const;
549 bool unit_has_std_values(
const PluginDef *pdef)
const;
552 void unregister(
const string&
id);
553 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std,
554 float lower,
float upper,
float step) {
555 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
true, var, std, lower, upper, step,
true, replace_mode);
560 const string&
id,
const string& name,
float *var,
float std,
float lower,
float upper,
float step) {
561 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
false, var, std, lower, upper, step,
false, replace_mode);
565 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std = 0) {
566 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Switch,
true, var,
std, 0, 1, 1,
true, replace_mode);
570 inline BoolParameter *
reg_par(
const string&
id,
const string& name,
bool *var,
bool std=
false,
bool preset=
true) {
571 BoolParameter * p =
new BoolParameter(
id, name, Parameter::Switch, preset, var,
std,
true);
582 const string&
id,
const string& name,
const value_pair *vl,
583 int *var,
bool preset,
int std = 0) {
590 int std = 0,
int low = 0) {
596 BoolParameter *p =
new BoolParameter(
id,
"", Parameter::Switch, preset, var,
std,
false);
600 inline IntParameter *
reg_non_midi_par(
const string&
id,
int *var,
bool preset,
int std,
int lower,
int upper) {
601 IntParameter *p =
new IntParameter(
id,
"", Parameter::None, preset, var, std, lower, upper,
false);
606 float std = 0,
float lower = 0,
float upper = 1,
float step = 0) {
607 FloatParameter *p =
new FloatParameter(
id,
"", Parameter::Continuous, preset, val,
std, lower, upper, step,
false, replace_mode);
616 inline StringParameter *
reg_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
false) {
621 inline StringParameter *
reg_preset_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
true) {
628 void dump(
const string& fmt);
651 modstring(
const string& n,
bool m,
const char* s): name(n), modified(m), std(s) {}
652 explicit modstring(
const char* n): name(n), modified(
false), std(n) {}
653 modstring(): name(
""), modified(
false), std(0) {}
655 map<int, modstring> m;
656 string midi_to_note(
int ctr);
657 string ctr_desc(
int ctr);
661 void replace(
int ctr,
const string& name);
676 float _lower, _upper;
678 int _toggle_behaviour;
682 param(&p), _lower(l), _upper(u), toggle(t), _toggle_behaviour(tt) {}
683 float lower()
const {
return _lower; }
684 float upper()
const {
return _upper; }
690 bool set_midi(
int n,
int last_value,
bool update);
691 bool set_bpm(
int n,
int last_value);
692 bool set_trans(
int n,
int last_value);
693 void set(
float v,
float high) { param->midi_set(v, high, _lower, _upper); }
719 unsigned int rounded(
float f);
720 bool time_to_bpm(
double time,
unsigned int* bpm_);
726 enum { array_size = 328 };
739 int last_midi_control_value[ControllerArray::array_size];
740 int last_midi_control;
741 int changed_midi_control_value[ControllerArray::array_size];
742 volatile gint program_change;
743 volatile gint mute_change;
744 volatile gint bank_change;
750 Glib::Dispatcher pgm_chg;
751 Glib::Dispatcher mute_chg;
752 Glib::Dispatcher bank_chg;
753 Glib::Dispatcher val_chg;
754 sigc::signal<void> changed;
755 sigc::signal<void,int> new_program;
756 sigc::signal<void,int> new_mute_state;
757 sigc::signal<void,int> new_bank;
758 sigc::signal<void, int, int> midi_value_changed;
764 bool check_midi_values();
768 int size() {
return map.size(); }
769 void set_config_mode(
bool mode,
int ctl=-1);
773 void set_ctr_val(
int ctr,
int val);
774 void set_bpm_val(
unsigned int val);
776 void modifyCurrent(
Parameter& param,
float lower,
float upper,
bool toggle,
int toggle_behaviour);
781 assert(n < ControllerArray::array_size);
return last_midi_control_value[n]; }
783 assert(n < ControllerArray::array_size); last_midi_control_value[n] = v; changed_midi_control_value[n] = 1; }
785 void remove_controlled_parameters(paramlist& plist,
const ControllerArray *m);
790 void compute_midi_in(
void* midi_input_port_buf,
void *arg);
791 void process_trans(
int transport_state);
792 void update_from_controller(
int ctr);
793 void update_from_controllers();
794 void set_midi_channel(
int s);
796 void request_midi_value_update();
801 #endif // SRC_HEADERS_GX_PARAMETER_H_ ParameterV< float > FloatParameter
bool hasParameter(const Parameter &p) const
int get_last_midi_control_value(unsigned int n)
FloatEnumParameter(gx_system::JsonParser &jp)
bool hasId(const char *p) const
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)
midi_controller_list & operator[](int n)
void check_id(Gtk::Widget *w, const std::string &id, gx_engine::GxMachineBase &machine)
int get_current_control()
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
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
const string & name() const
FloatParameter * reg_par_non_preset(const string &id, const string &name, float *var, float std, float lower, float upper, float step)
const string & group() const
FloatParameter * reg_par(const string &id, const string &name, float *var, float std=0)
void writeJSON(gx_system::JsonWriter &jw) const
const string operator[](int ctr)
string param_group(const string &group_id, bool nowarn=false)
int param2controller(Parameter ¶m, const MidiController **p)
Parameter & operator[](const string &id)
ctrl_type getControlType() const
void compare_parameter(const char *title, Parameter *p1, Parameter *p2, bool all=false)
sigc::signal< void, int > & signal_new_program()
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)
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()
std::string group_id() const
void set_midi_blocked(bool v)
sigc::signal< void, bool > changed
MidiController(Parameter &p, float l, float u, bool t=false, int tt=0)
const value_pair * value_names
bool hasId(const string &id) const
Parameter & getParameter() 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)
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)
bool operator==(const Parameter &p) const
list< MidiController > midi_controller_list
const string & desc() const
FileParameter * reg_filepar(const string &id, bool preset=false)
Glib::RefPtr< Gio::File > value
sigc::signal< void, int > changed
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)
int toggle_behaviour() const
sigc::signal< void, float > changed
FileParameter(const string &id, const string &filename, bool preset=false)
const Glib::ustring & get_value() const
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)
void writeJSON(gx_system::JsonWriter &jw) 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
bool isControllable() const
Glib::RefPtr< Gio::File > json_value
const string & id() const
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)
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)