26 #define FOR_DRUMS(func) std::for_each(drums.begin(), drums.end(), [&](Drums d) { func }); 32 PluginPresetConnectWindow *PluginPresetConnectWindow::create_from_builder(
34 return new PluginPresetConnectWindow(cobject, bld, _machine);
42 Glib::RefPtr<gx_gui::GxBuilder> bld = gx_gui::GxBuilder::create_from_file(
45 bld->get_toplevel_derived(
"PluginPresetConnectWindow", w,
46 sigc::bind(sigc::ptr_fun(PluginPresetConnectWindow::create_from_builder), bld, sigc::ref(machine)));
50 bool PluginPresetConnectWindow::on_key_press_event(GdkEventKey *event) {
51 if (event->keyval ==
GDK_KEY_Escape && (event->state & Gtk::AccelGroup::get_default_mod_mask()) == 0) {
55 return Gtk::Window::on_key_press_event(event);
58 void PluginPresetConnectWindow::on_connect() {
59 Gtk::TreeIter it = treeview->get_selection()->get_selected();
61 Glib::ustring
id =
"seq." + it->get_value(upresetliststore->col.name);
67 PluginPresetConnectWindow::PluginPresetConnectWindow(
69 : Gtk::Window(cobject),
72 set_title(
"Connect Midi");
74 bld->find_widget(
"closebutton", b);
75 b->signal_clicked().connect(
76 sigc::mem_fun(*
this, &PluginPresetConnectWindow::hide));
77 bld->find_widget(
"connectbutton", connectbutton);
78 connectbutton->signal_clicked().connect(
79 sigc::mem_fun0(*
this, &PluginPresetConnectWindow::on_connect));
80 bld->find_widget(
"treeview", treeview);
83 for (gx_preset::UnitPresetList::const_iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
84 if (i->name.empty()) {
87 upresetliststore->append()->set_value(upresetliststore->col.name, i->name);
89 treeview->set_model(upresetliststore);
90 connectbutton->set_sensitive(
false);
91 Glib::RefPtr<Gtk::TreeSelection> sel = treeview->get_selection();
92 sel->signal_changed().connect(
93 sigc::mem_fun(*
this, &PluginPresetConnectWindow::on_selection_changed));
96 void PluginPresetConnectWindow::on_selection_changed() {
97 connectbutton->set_sensitive(treeview->get_selection()->get_selected());
101 Gtk::Main::run(*
this);
109 Glib::RefPtr<gx_gui::GxBuilder> bld = gx_gui::GxBuilder::create_from_file(
123 return new SEQWindow(bld, tomp, tomp1, tomp2, kickp, snarep, hatp, machine);
144 bld->get_toplevel(
"SequencerWindow", gtk_window);
151 void SEQWindow::init_connect() {
153 builder->find_widget(
"viewport1", vp);
154 builder->find_widget(
"hbox1", tom.box);
155 builder->find_widget(
"hbox1a", tom1.box);
156 builder->find_widget(
"hbox1b", tom2.box);
157 builder->find_widget(
"hbox2", kick.box);
158 builder->find_widget(
"hbox3", snare.box);
159 builder->find_widget(
"hbox4", hat.box);
160 builder->find_widget(
"gxplayhead1", seq_pos);
161 builder->find_widget(
"gxsmallknob6", seq_count);
162 builder->find_widget(
"gxselector1", seq_tact);
163 builder->find_widget(
"hbox12", preset_button);
164 builder->find_widget(
"gxswitch6", add_button);
165 builder->find_widget(
"gxswitch3", next_preset);
166 builder->find_widget(
"gxswitch7", previus_preset);
167 builder->find_widget(
"gxswitch4", set_step);
168 builder->find_widget(
"gxswitch5", set_fstep);
169 builder->find_widget(
"gxswitch8", set_sync);
170 builder->find_widget(
"gxswitch9", reset_step);
171 builder->find_widget(
"label9:rack_label_inverse", preset_label);
173 Pango::FontDescription font = preset_label->get_style()->get_font();
174 font.set_size(10*Pango::SCALE);
175 font.set_weight(Pango::WEIGHT_BOLD);
176 preset_label->modify_font(font);
178 make_preset_button(preset_button);
180 drums.push_back(tom);
181 drums.push_back(tom1);
182 drums.push_back(tom2);
183 drums.push_back(kick);
184 drums.push_back(snare);
185 drums.push_back(hat);
187 on_sec_length_changed(
false);
190 d.p->signal_changed().connect(sigc::bind(
191 sigc::mem_fun(
this, &SEQWindow::seq_changed), d.box));
192 init_sequences(d.p, d.box);
195 seq_pos->cp_set_value(0.0);
197 seq_pos->get_property(
"var_id",
id);
199 Glib::signal_timeout().connect(
200 sigc::bind<Gxw::Regler*>(sigc::bind<const std::string>(
201 sigc::mem_fun(*
this, &SEQWindow::get_sequencer_pos),
id), seq_pos), 60);
203 seq_count->signal_value_changed().connect(
204 sigc::bind(sigc::mem_fun(*
this, &SEQWindow::on_sec_length_changed),
true));
206 seq_tact->signal_value_changed().connect(
207 sigc::mem_fun(*
this, &SEQWindow::on_sec_tact_changed));
209 next_preset->signal_toggled().connect(
210 sigc::mem_fun(*
this, &SEQWindow::on_next_preset));
212 previus_preset->signal_toggled().connect(
213 sigc::mem_fun(*
this, &SEQWindow::on_previus_preset));
215 set_step->signal_toggled().connect(
216 sigc::mem_fun(*
this, &SEQWindow::on_set_step));
218 set_fstep->signal_toggled().connect(
219 sigc::mem_fun(*
this, &SEQWindow::on_set_fstep));
221 set_sync->signal_toggled().connect(
222 sigc::mem_fun(*
this, &SEQWindow::on_sync_stepper));
224 reset_step->signal_toggled().connect(
225 sigc::mem_fun(*
this, &SEQWindow::on_reset_stepper));
227 add_button->signal_clicked().connect(
228 sigc::mem_fun(*
this, &SEQWindow::on_preset_add_clicked));
229 add_button->set_tooltip_text(_(
"add effect unit preset to the sequence"));
231 gtk_window->signal_key_press_event().connect(
232 sigc::mem_fun(
this, &SEQWindow::on_key_press_event));
236 Glib::ListHandle<Gtk::Widget*> List = _box->get_children();
237 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = List.begin();itt != List.end(); ++itt) {
238 dynamic_cast<Gtk::ToggleButton*
>((*itt))->signal_clicked().connect(
239 sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked),p),_box));
243 void SEQWindow::on_set_step() {
244 if (!set_step->get_active())
return;
247 reset_control(
"seq.step",value);
248 set_step->set_active(
false);
251 void SEQWindow::on_set_fstep() {
252 if (!set_fstep->get_active())
return;
256 reset_control(
"seq.step",value);
257 set_fstep->set_active(
false);
260 void SEQWindow::on_sync_stepper() {
261 if (!set_sync->get_active())
return;
263 set_sync->set_active(
false);
266 void SEQWindow::on_reset_stepper() {
267 if (!reset_step->get_active())
return;
268 reset_control(
"seq.step",0.0);
269 reset_control(
"seq.step_orig",0.0);
270 reset_control(
"seq.pos",0.0);
271 reset_step->set_active(
false);
274 void SEQWindow::on_next_preset() {
275 if (!next_preset->get_active())
return;
278 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::on_next_preset_set));
282 void SEQWindow::on_next_preset_set() {
285 for (gx_preset::UnitPresetList::iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
286 if (!i->name.empty()) {
289 if (i->name.empty()) i = presetnames.begin();
298 reset_control(
"seq.npreset",0);
301 void SEQWindow::on_previus_preset() {
302 if (!previus_preset->get_active())
return;
305 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::on_previus_preset_set));
309 void SEQWindow::on_previus_preset_set() {
312 gx_preset::UnitPresetList::iterator i = presetnames.begin();
313 for ( i = presetnames.begin(); i != presetnames.end(); ++i) {
314 if (!i->name.empty()) {
315 if (i->is_set)
break;
318 if (i == presetnames.begin()) {
319 i = presetnames.end();
321 }
else if (i == presetnames.end()) {
327 reset_control(
"seq.ppreset",0);
330 void SEQWindow::on_preset_popup_clicked() {
332 Gtk::MenuItem* subitem = Gtk::manage(
new Gtk::MenuItem(
"connect midi...",
true));
333 presetMenu->append(*subitem);
334 subitem->signal_activate().connect(sigc::mem_fun(
335 *
this, &SEQWindow::connect_midi));
336 presetMenu->show_all();
339 void SEQWindow::connect_midi() {
345 void SEQWindow::make_preset_button(Gtk::HBox * box) {
346 Gtk::Button *p =
new Gtk::Button();
347 GtkWidget *l = gtk_image_new_from_stock(
"rack_preset", (GtkIconSize)-1);
349 p->set_can_default(
false);
350 p->set_can_focus(
false);
351 p->set_tooltip_text(_(
"manage effect unit presets"));
352 p->set_name(
"effect_on_off");
353 box->pack_start(*Gtk::manage(p),Gtk::PACK_SHRINK);
354 p->signal_clicked().connect(
355 sigc::mem_fun(*
this, &SEQWindow::on_preset_popup_clicked));
359 void SEQWindow::reset_control(Glib::ustring
id,
float value) {
366 std::vector<int> sequence_append = seqc->
getseqline();
367 for(std::vector<int>::const_iterator i = sequence_append.begin(); i != sequence_append.end(); ++i) {
368 sequence->push_back(*i);
374 void SEQWindow::append_plugin_preset(Glib::ustring name) {
377 Glib::signal_timeout().connect_once(sigc::bind(sigc::mem_fun(
this, &SEQWindow::append_plugin_preset_set),name),5);
381 void SEQWindow::append_plugin_preset_set(Glib::ustring name) {
383 std::vector<int> sequence[
DRUMS];
386 sequence[i] = static_cast<const gx_engine::GxSeqSettings*>(&d.p->get_value())->getseqline();
408 s = append_sequence(&d.p->get_value(), d.p, &sequence[i]);
414 reset_control(
"seq.asequences",value);
426 reset_control(
"seq.bpm",bpmv);
427 reset_control(
"seq.tact",tactv);
428 reset_control(
"seq.gain",gainv);
429 reset_control(
"seq.tom.dsp.Gain",tomg);
430 reset_control(
"seq.tom.dsp.Gain1",tomg1);
431 reset_control(
"seq.tom.dsp.Gain2",tomg2);
432 reset_control(
"seq.kick.dsp.Gain",kickg);
433 reset_control(
"seq.snare.dsp.Gain",snareg);
434 reset_control(
"seq.hat_closed.dsp.Gain",hatg);
439 static bool delete_plugin_preset_popup(Gtk::Menu *presetMenu) {
444 void SEQWindow::on_selection_done(Gtk::Menu *presetMenu) {
445 Glib::signal_idle().connect(sigc::bind(
446 sigc::ptr_fun(delete_plugin_preset_popup), presetMenu));
449 void SEQWindow::on_preset_add_clicked() {
450 if (!add_button->get_active())
return;
452 Gtk::Menu *presetMenu = Gtk::manage(
new Gtk::Menu());
455 for (gx_preset::UnitPresetList::iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
456 if (!i->name.empty()) {
457 item = Gtk::manage(
new Gtk::MenuItem(i->name,
true));
458 presetMenu->append(*item);
459 item->signal_activate().connect(sigc::bind(sigc::mem_fun(
460 *
this, &SEQWindow::append_plugin_preset),i->name));
463 presetMenu->signal_selection_done().connect(sigc::bind(sigc::mem_fun(
464 *
this, &SEQWindow::on_selection_done),presetMenu));
465 presetMenu->show_all();
466 presetMenu->popup(1, gtk_get_current_event_time());
467 add_button->set_active(
false);
470 void SEQWindow::on_sec_length_changed(
bool update) {
471 static int r_save = 24;
472 int r = int(seq_count->cp_get_value());
475 remove_seq_block(d.box, r);
478 }
else if( r_save < r) {
480 append_seq_block(d.box,d.p, r,r_save);
486 on_seq_button_clicked(d.box,d.p);
491 void SEQWindow::on_sec_tact_changed() {
493 seq_changed(&d.p->get_value(), d.box);
498 Gtk::ToggleButton * ab;
499 for(
int j = r_save; j<r; ++j) {
500 ab =
new Gtk::ToggleButton();
501 box->pack_start(*Gtk::manage(ab),Gtk::PACK_EXPAND_WIDGET);
502 ab->signal_clicked().connect(
503 sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked),p),box));
508 void SEQWindow::remove_seq_block(Gtk::HBox * box,
int r) {
509 Glib::ListHandle<Gtk::Widget*> boxList = box->get_children();
511 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = boxList.begin();itt != boxList.end(); ++itt) {
513 box->remove(*(*itt));
520 void SEQWindow::scroll_playhead(
float value) {
521 Gtk::Adjustment *a = vp->get_hadjustment();
522 static float old_state = 0.0;
523 float u = a->get_upper();
524 float l = a->get_lower();
525 float s = a->get_page_size();
526 float set = (u-s) * ((value)/2300.0);
528 if (
set>l &&
set<u) {
529 if(std::abs(
set-old_state) > 10) {
538 bool SEQWindow::get_sequencer_pos(
Gxw::Regler * regler,
const std::string
id) {
544 if (value<99.0)
return true;
549 scroll_playhead(value);
557 bool SEQWindow::on_key_press_event(GdkEventKey *event) {
562 Glib::signal_timeout().connect_once(sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked_set),p),box),2);
566 std::vector<int> sequence;
568 Glib::ListHandle<Gtk::Widget*> seqList = box->get_children();
569 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = seqList.begin();itt != seqList.end(); ++itt) {
570 sequence.push_back(dynamic_cast<Gtk::ToggleButton*>((*itt))->get_active());
576 void SEQWindow::check_preset_label() {
577 Glib::ustring pset =
" ";
580 gx_preset::UnitPresetList::iterator i = presetnames.begin();
581 for ( i = presetnames.begin(); i != presetnames.end(); ++i) {
582 if (!i->name.empty()) {
589 preset_label->set_label(pset);
594 Glib::ListHandle<Gtk::Widget*> seqList = box->get_children();
595 Glib::ListHandle<Gtk::Widget*>::iterator itt = seqList.begin();
596 std::vector<int> sequence = seqc->
getseqline();
599 for (std::vector<int>::const_iterator i = sequence.begin(); i != sequence.end(); ++i) {
600 if (itt == seqList.end())
break;
601 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_active(*i);
603 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_name(
"seq_button");
606 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_name(
"button");
611 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::check_preset_label));
615 if (gtk_window->get_visible() && !(gtk_window->get_window()->get_state() & Gdk::WINDOW_STATE_ICONIFIED)) {
619 seq_changed(&d.p->get_value(), d.box);
621 gtk_window->present();
625 SEQWindow::~SEQWindow() {
void setseqline(const std::vector< int > &seq)
virtual void plugin_preset_list_sync_set(const PluginDef *pdef, bool factory, const Glib::ustring &name)=0
const std::vector< int > & getseqline() const
std::string get_builder_filepath(const std::string &basename) const
virtual Parameter & get_parameter(const std::string &id)=0
std::vector< PluginPresetEntry > UnitPresetList
static PluginPresetConnectWindow * create(gx_engine::GxMachineBase &machine)
static SEQWindow * create(const std::string &unit_id, gx_engine::GxMachineBase &machine)
virtual gx_jack::GxJack * get_jack()=0
bool set(const GxSeqSettings &val) const
~PluginPresetConnectWindow()
T get_parameter_value(const std::string &id)
virtual bool parameter_hasId(const char *p)=0
virtual void set_parameter_value(const std::string &id, int value)=0
virtual void plugin_preset_list_load(const PluginDef *pdef, gx_preset::UnitPresetList &presetnames)=0
virtual gx_system::CmdlineOptions & get_options() const =0
static Glib::RefPtr< UPresetListStore > create()
virtual void plugin_preset_list_set(const PluginDef *pdef, bool factory, const Glib::ustring &name)=0
Gxw::BigKnob * wrap(GxBigKnob *object, bool take_copy)
virtual Plugin * pluginlist_lookup_plugin(const std::string &id) const =0
virtual bool midi_get_config_mode(int *ctl=0)=0
sigc::signal< void, T > & signal_parameter_value(const std::string &id)