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;
125 bool midi_blocked : 1;
128 void range_warning(
float value,
float lower,
float upper);
131 inline std::string
group_id()
const {
return _id.substr(0, _id.find_last_of(
".")); }
134 boost::noncopyable(),
137 _group(param_group(group_id())),
142 save_in_preset(preset),
160 const char *get_typename()
const;
161 bool isFloat()
const {
return v_type == tp_float; }
163 bool isBool()
const {
return v_type == tp_bool; }
164 bool isFile()
const {
return v_type == tp_file; }
165 bool isString()
const {
return v_type == tp_string; }
171 const string&
id()
const {
return _id; }
172 const string&
group()
const {
return _group; }
173 string l_group()
const {
return gettext(_group.c_str()); }
174 const string&
name()
const {
return _name; }
175 string l_name()
const {
return gettext(_name.c_str()); }
176 const string&
desc()
const {
return _desc; }
177 void set_desc(
const string& desc) { _desc = desc; }
178 string l_desc()
const {
return gettext(_desc.c_str()); }
186 virtual void stdJSON_value() = 0;
187 virtual bool on_off_value() = 0;
190 virtual void setJSON_value() = 0;
191 virtual bool compareJSON_value() = 0;
192 virtual bool hasRange()
const;
193 virtual float getLowerAsFloat()
const;
194 virtual float getUpperAsFloat()
const;
195 virtual float getStepAsFloat()
const;
196 virtual const value_pair *getValueNames()
const;
200 FloatParameter& getFloat();
201 IntParameter& getInt();
203 BoolParameter& getBool();
205 StringParameter &getString();
206 sigc::signal<void, float>& signal_changed_float();
207 sigc::signal<void, int>& signal_changed_int();
208 sigc::signal<void, bool>& signal_changed_bool();
209 sigc::signal<void, const Glib::ustring&>& signal_changed_string();
230 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
231 virtual bool midi_set_bpm(
float n,
float high,
float llimit,
float ulimit);
232 virtual void trigger_changed();
242 bool set(
float val)
const;
244 void convert_from_range(
float low,
float up);
245 virtual void stdJSON_value();
246 virtual bool on_off_value();
249 virtual bool compareJSON_value();
250 virtual void setJSON_value();
251 virtual bool hasRange()
const;
252 virtual float getLowerAsFloat()
const;
253 virtual float getUpperAsFloat()
const;
254 virtual float getStepAsFloat()
const;
255 virtual float idx_from_id(
string v_id);
257 float *v,
float sv,
float lv,
float uv,
float tv,
bool ctrl,
bool no_init):
258 Parameter(id, name, tp_float, ctp, preset, ctrl),
259 value(v ? v : &value_storage), std_value(sv),lower(lv),upper(uv),step(tv) {
260 set(no_init ? *value : sv);
281 virtual const value_pair *getValueNames()
const;
283 int sv,
int low,
bool ctrl,
bool no_init);
285 virtual float idx_from_id(
string v_id);
293 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
294 virtual void trigger_changed();
303 bool set(
int val)
const;
305 virtual void stdJSON_value();
306 virtual bool on_off_value();
309 virtual bool compareJSON_value();
310 virtual void setJSON_value();
311 virtual bool hasRange()
const;
312 virtual float getLowerAsFloat()
const;
313 virtual float getUpperAsFloat()
const;
314 virtual int idx_from_id(
string v_id);
316 int *v,
int sv,
int lv,
int uv,
bool ctrl):
318 value(v ? v : &value_storage), std_value(sv), lower(lv), upper(uv) {
336 virtual const value_pair *getValueNames()
const;
337 virtual int idx_from_id(
string v_id);
349 virtual bool midi_set(
float n,
float high,
float llimit,
float ulimit);
350 virtual void trigger_changed();
358 bool set(
bool val)
const;
359 virtual void stdJSON_value();
361 virtual bool on_off_value();
363 virtual bool compareJSON_value();
364 virtual void setJSON_value();
367 bool *v,
bool sv,
bool ctrl):
368 Parameter(id, name, tp_bool, ctp, preset, ctrl),
369 value(v ? v : &value_storage), std_value(sv) {
390 bool set(
const Glib::RefPtr<Gio::File>& val);
391 void set_path(
const string& path);
392 const Glib::RefPtr<Gio::File>&
get()
const {
return value; }
393 virtual void stdJSON_value();
394 virtual bool on_off_value();
397 virtual bool compareJSON_value();
398 virtual void setJSON_value();
399 FileParameter(
const string&
id,
const string& filename,
bool preset =
false):
400 Parameter(id,
"", tp_file, None, preset, false),
401 value(Gio::File::create_for_path(filename)),
402 std_value(value->dup()) {}
404 Parameter(id,
"", tp_file, None, preset, false),
409 void set_standard(
const string& filename);
410 bool is_equal(
const Glib::RefPtr<Gio::File>& v)
const;
412 string get_path()
const;
413 string get_directory_path()
const;
414 string get_parse_name()
const;
415 string get_display_name()
const;
416 void copy(
const string& destination)
const;
427 sigc::signal<void, const Glib::ustring&>
changed;
430 bool set(
const Glib::ustring& val)
const;
431 const Glib::ustring&
get_value()
const {
return *value; }
432 virtual void stdJSON_value();
433 virtual bool on_off_value();
435 virtual bool compareJSON_value();
436 virtual void setJSON_value();
438 ParameterV(
const string&
id,
const string& name, Glib::ustring *v,
const Glib::ustring& sv,
bool preset =
false)
439 :
Parameter(id, name, tp_string, None, preset, false),
440 value(v ? v : &value_storage), std_value(sv) {
451 inline FloatParameter &Parameter::getFloat() {
453 return static_cast<FloatParameter&
>(*this);
456 inline IntParameter &Parameter::getInt() {
458 return static_cast<IntParameter&
>(*this);
467 inline BoolParameter &Parameter::getBool() {
469 return static_cast<BoolParameter&
>(*this);
477 inline StringParameter &Parameter::getString() {
479 return static_cast<StringParameter&
>(*this);
482 inline sigc::signal<void, float>& Parameter::signal_changed_float() {
483 FloatParameter *p =
dynamic_cast<FloatParameter*
>(
this);
488 inline sigc::signal<void, int>& Parameter::signal_changed_int() {
489 IntParameter *p =
dynamic_cast<IntParameter*
>(
this);
494 inline sigc::signal<void, bool>& Parameter::signal_changed_bool() {
495 BoolParameter *p =
dynamic_cast<BoolParameter*
>(
this);
500 inline sigc::signal<void, const Glib::ustring&>& Parameter::signal_changed_string() {
501 StringParameter *p =
dynamic_cast<StringParameter*
>(
this);
513 map<string, Parameter*> id_map;
515 sigc::signal<void,Parameter*,bool> insert_remove;
519 void check_p(
const char *p);
531 typedef map<string, Parameter*>::const_iterator
iterator;
532 iterator
begin()
const {
return id_map.begin(); }
533 iterator
end()
const {
return id_map.end(); }
534 bool hasId(
const string&
id)
const {
return id_map.find(
id) != id_map.end(); }
535 bool hasId(
const char *p)
const {
return id_map.find(p) != id_map.end(); }
545 void set_init_values();
546 void reset_unit(
const PluginDef *pdef)
const;
547 bool unit_has_std_values(
const PluginDef *pdef)
const;
550 void unregister(
const string&
id);
551 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std,
552 float lower,
float upper,
float step) {
553 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
true, var, std, lower, upper, step,
true, replace_mode);
558 const string&
id,
const string& name,
float *var,
float std,
float lower,
float upper,
float step) {
559 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Continuous,
false, var, std, lower, upper, step,
false, replace_mode);
563 inline FloatParameter *
reg_par(
const string&
id,
const string& name,
float *var,
float std = 0) {
564 FloatParameter *p =
new FloatParameter(
id, name, Parameter::Switch,
true, var,
std, 0, 1, 1,
true, replace_mode);
568 inline BoolParameter *
reg_par(
const string&
id,
const string& name,
bool *var,
bool std=
false,
bool preset=
true) {
569 BoolParameter * p =
new BoolParameter(
id, name, Parameter::Switch, preset, var,
std,
true);
580 const string&
id,
const string& name,
const value_pair *vl,
581 int *var,
bool preset,
int std = 0) {
588 int std = 0,
int low = 0) {
594 BoolParameter *p =
new BoolParameter(
id,
"", Parameter::Switch, preset, var,
std,
false);
598 inline IntParameter *
reg_non_midi_par(
const string&
id,
int *var,
bool preset,
int std,
int lower,
int upper) {
599 IntParameter *p =
new IntParameter(
id,
"", Parameter::None, preset, var, std, lower, upper,
false);
604 float std = 0,
float lower = 0,
float upper = 1,
float step = 0) {
605 FloatParameter *p =
new FloatParameter(
id,
"", Parameter::None, preset, val,
std, lower, upper, step,
false, replace_mode);
614 inline StringParameter *
reg_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
false) {
619 inline StringParameter *
reg_preset_string(
const string&
id,
const string& name, Glib::ustring *var,
const string& sv,
bool preset=
true) {
626 void dump(
const string& fmt);
649 modstring(
const string& n,
bool m,
const char* s): name(n), modified(m), std(s) {}
650 explicit modstring(
const char* n): name(n), modified(
false), std(n) {}
651 modstring(): name(
""), modified(
false), std(0) {}
653 map<int, modstring> m;
658 void replace(
int ctr,
const string& name);
673 float _lower, _upper;
677 param(&p), _lower(l), _upper(u), toggle(t) {}
678 float lower()
const {
return _lower; }
679 float upper()
const {
return _upper; }
684 bool set_midi(
int n,
int last_value);
685 bool set_bpm(
int n,
int last_value);
686 bool set_trans(
int n,
int last_value);
687 void set(
float v,
float high) { param->midi_set(v, high, _lower, _upper); }
713 unsigned int rounded(
float f);
714 bool time_to_bpm(
double time,
unsigned int* bpm_);
720 enum { array_size = 128 };
733 int last_midi_control_value[ControllerArray::array_size];
734 int last_midi_control;
735 volatile gint program_change;
736 volatile gint mute_change;
737 volatile gint bank_change;
742 Glib::Dispatcher pgm_chg;
743 Glib::Dispatcher mute_chg;
744 Glib::Dispatcher bank_chg;
745 sigc::signal<void> changed;
746 sigc::signal<void,int> new_program;
747 sigc::signal<void,int> new_mute_state;
748 sigc::signal<void,int> new_bank;
749 sigc::signal<void, int, int> midi_value_changed;
754 bool check_midi_values();
758 int size() {
return map.size(); }
759 void set_config_mode(
bool mode,
int ctl=-1);
763 void set_ctr_val(
int ctr,
int val);
764 void set_bpm_val(
unsigned int val);
766 void modifyCurrent(
Parameter& param,
float lower,
float upper,
bool toggle);
771 assert(n < ControllerArray::array_size);
return last_midi_control_value[n]; }
773 assert(n < ControllerArray::array_size); last_midi_control_value[n] = v; }
775 void remove_controlled_parameters(paramlist& plist,
const ControllerArray *m);
780 void compute_midi_in(
void* midi_input_port_buf,
void *arg);
781 void process_trans(
int transport_state);
782 void update_from_controller(
int ctr);
783 void update_from_controllers();
785 void request_midi_value_update();
790 #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
void set_midi_blocked(bool v)
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)