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);
172 builder->find_widget(
"gxvaluedisplay1", step_value);
173 builder->find_widget(
"label8:rack_label_inverse", step_label);
175 Pango::FontDescription font = preset_label->get_style()->get_font();
176 font.set_size(10*Pango::SCALE);
177 font.set_weight(Pango::WEIGHT_BOLD);
178 preset_label->modify_font(font);
180 make_preset_button(preset_button);
182 drums.push_back(tom);
183 drums.push_back(tom1);
184 drums.push_back(tom2);
185 drums.push_back(kick);
186 drums.push_back(snare);
187 drums.push_back(hat);
189 on_sec_length_changed(
false);
192 d.p->signal_changed().connect(sigc::bind(
193 sigc::mem_fun(
this, &SEQWindow::seq_changed), d.box));
194 init_sequences(d.p, d.box);
197 seq_pos->cp_set_value(0.0);
199 seq_pos->get_property(
"var_id",
id);
202 if (!machine.
get_jack()) ti_o = 250;
203 Glib::signal_timeout().connect(
204 sigc::bind<Gxw::Regler*>(sigc::bind<const std::string>(
205 sigc::mem_fun(*
this, &SEQWindow::get_sequencer_pos),
id), seq_pos), ti_o);
207 seq_count->signal_value_changed().connect(
208 sigc::bind(sigc::mem_fun(*
this, &SEQWindow::on_sec_length_changed),
true));
210 seq_tact->signal_value_changed().connect(
211 sigc::mem_fun(*
this, &SEQWindow::on_sec_tact_changed));
213 next_preset->signal_toggled().connect(
214 sigc::mem_fun(*
this, &SEQWindow::on_next_preset));
216 previus_preset->signal_toggled().connect(
217 sigc::mem_fun(*
this, &SEQWindow::on_previus_preset));
219 set_step->signal_toggled().connect(
220 sigc::mem_fun(*
this, &SEQWindow::on_set_step));
222 set_fstep->signal_toggled().connect(
223 sigc::mem_fun(*
this, &SEQWindow::on_set_fstep));
225 set_sync->signal_toggled().connect(
226 sigc::mem_fun(*
this, &SEQWindow::on_sync_stepper));
228 reset_step->signal_toggled().connect(
229 sigc::mem_fun(*
this, &SEQWindow::on_reset_stepper));
231 add_button->signal_clicked().connect(
232 sigc::mem_fun(*
this, &SEQWindow::on_preset_add_clicked));
233 add_button->set_tooltip_text(_(
"add effect unit preset to the sequence"));
235 gtk_window->signal_key_press_event().connect(
236 sigc::mem_fun(
this, &SEQWindow::on_key_press_event));
245 Glib::ListHandle<Gtk::Widget*> List = _box->get_children();
246 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = List.begin();itt != List.end(); ++itt) {
247 dynamic_cast<Gtk::ToggleButton*
>((*itt))->signal_clicked().connect(
248 sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked),p),_box));
252 void SEQWindow::on_set_step() {
253 if (!set_step->get_active())
return;
256 reset_control(
"seq.step",value);
257 set_step->set_active(
false);
260 void SEQWindow::on_set_fstep() {
261 if (!set_fstep->get_active())
return;
265 reset_control(
"seq.step",value);
266 set_fstep->set_active(
false);
269 void SEQWindow::on_sync_stepper() {
270 if (!set_sync->get_active())
return;
272 set_sync->set_active(
false);
275 void SEQWindow::on_reset_stepper() {
276 if (!reset_step->get_active())
return;
277 reset_control(
"seq.step",0.0);
278 reset_control(
"seq.step_orig",0.0);
279 reset_control(
"seq.pos",0.0);
280 reset_step->set_active(
false);
283 void SEQWindow::on_next_preset() {
284 if (!next_preset->get_active())
return;
287 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::on_next_preset_set));
291 void SEQWindow::on_next_preset_set() {
294 for (gx_preset::UnitPresetList::iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
295 if (!i->name.empty()) {
298 if (i->name.empty()) i = presetnames.begin();
307 reset_control(
"seq.npreset",0);
310 void SEQWindow::on_previus_preset() {
311 if (!previus_preset->get_active())
return;
314 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::on_previus_preset_set));
318 void SEQWindow::on_previus_preset_set() {
321 gx_preset::UnitPresetList::iterator i = presetnames.begin();
322 for ( i = presetnames.begin(); i != presetnames.end(); ++i) {
323 if (!i->name.empty()) {
324 if (i->is_set)
break;
327 if (i == presetnames.begin()) {
328 i = presetnames.end();
330 }
else if (i == presetnames.end()) {
336 reset_control(
"seq.ppreset",0);
339 void SEQWindow::on_preset_popup_clicked() {
341 Gtk::MenuItem* subitem = Gtk::manage(
new Gtk::MenuItem(
"connect midi...",
true));
342 presetMenu->append(*subitem);
343 subitem->signal_activate().connect(sigc::mem_fun(
344 *
this, &SEQWindow::connect_midi));
345 presetMenu->show_all();
348 void SEQWindow::connect_midi() {
354 void SEQWindow::make_preset_button(Gtk::HBox * box) {
355 Gtk::Button *p =
new Gtk::Button();
356 GtkWidget *l = gtk_image_new_from_stock(
"rack_preset", (GtkIconSize)-1);
358 p->set_can_default(
false);
359 p->set_can_focus(
false);
360 p->set_tooltip_text(_(
"manage effect unit presets"));
361 p->set_name(
"effect_on_off");
362 box->pack_start(*Gtk::manage(p),Gtk::PACK_SHRINK);
363 p->signal_clicked().connect(
364 sigc::mem_fun(*
this, &SEQWindow::on_preset_popup_clicked));
368 void SEQWindow::reset_control(Glib::ustring
id,
float value) {
375 std::vector<int> sequence_append = seqc->
getseqline();
376 for(std::vector<int>::const_iterator i = sequence_append.begin(); i != sequence_append.end(); ++i) {
377 sequence->push_back(*i);
383 void SEQWindow::append_plugin_preset(Glib::ustring name) {
386 Glib::signal_timeout().connect_once(sigc::bind(sigc::mem_fun(
this, &SEQWindow::append_plugin_preset_set),name),5);
390 void SEQWindow::append_plugin_preset_set(Glib::ustring name) {
392 std::vector<int> sequence[
DRUMS];
395 sequence[i] = static_cast<const gx_engine::GxSeqSettings*>(&d.p->get_value())->getseqline();
417 s = append_sequence(&d.p->get_value(), d.p, &sequence[i]);
423 reset_control(
"seq.asequences",value);
435 reset_control(
"seq.bpm",bpmv);
436 reset_control(
"seq.tact",tactv);
437 reset_control(
"seq.gain",gainv);
438 reset_control(
"seq.tom.dsp.Gain",tomg);
439 reset_control(
"seq.tom.dsp.Gain1",tomg1);
440 reset_control(
"seq.tom.dsp.Gain2",tomg2);
441 reset_control(
"seq.kick.dsp.Gain",kickg);
442 reset_control(
"seq.snare.dsp.Gain",snareg);
443 reset_control(
"seq.hat_closed.dsp.Gain",hatg);
448 static bool delete_plugin_preset_popup(Gtk::Menu *presetMenu) {
453 void SEQWindow::on_selection_done(Gtk::Menu *presetMenu) {
454 Glib::signal_idle().connect(sigc::bind(
455 sigc::ptr_fun(delete_plugin_preset_popup), presetMenu));
458 void SEQWindow::on_preset_add_clicked() {
459 if (!add_button->get_active())
return;
461 Gtk::Menu *presetMenu = Gtk::manage(
new Gtk::Menu());
464 for (gx_preset::UnitPresetList::iterator i = presetnames.begin(); i != presetnames.end(); ++i) {
465 if (!i->name.empty()) {
466 item = Gtk::manage(
new Gtk::MenuItem(i->name,
true));
467 presetMenu->append(*item);
468 item->signal_activate().connect(sigc::bind(sigc::mem_fun(
469 *
this, &SEQWindow::append_plugin_preset),i->name));
472 presetMenu->signal_selection_done().connect(sigc::bind(sigc::mem_fun(
473 *
this, &SEQWindow::on_selection_done),presetMenu));
474 presetMenu->show_all();
475 presetMenu->popup(1, gtk_get_current_event_time());
476 add_button->set_active(
false);
479 void SEQWindow::on_sec_length_changed(
bool update) {
480 static int r_save = 24;
481 int r = int(seq_count->cp_get_value());
484 remove_seq_block(d.box, r);
487 }
else if( r_save < r) {
489 append_seq_block(d.box,d.p, r,r_save);
495 on_seq_button_clicked(d.box,d.p);
500 void SEQWindow::on_sec_tact_changed() {
502 seq_changed(&d.p->get_value(), d.box);
507 Gtk::ToggleButton * ab;
508 for(
int j = r_save; j<r; ++j) {
509 ab =
new Gtk::ToggleButton();
510 box->pack_start(*Gtk::manage(ab),Gtk::PACK_EXPAND_WIDGET);
511 ab->signal_clicked().connect(
512 sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked),p),box));
517 void SEQWindow::remove_seq_block(Gtk::HBox * box,
int r) {
518 Glib::ListHandle<Gtk::Widget*> boxList = box->get_children();
520 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = boxList.begin();itt != boxList.end(); ++itt) {
522 box->remove(*(*itt));
529 void SEQWindow::scroll_playhead(
float value) {
530 Gtk::Adjustment *a = vp->get_hadjustment();
531 static float old_state = 0.0;
532 float u = a->get_upper();
533 float l = a->get_lower();
534 float s = a->get_page_size();
535 float set = (u-s) * ((value)/2300.0);
537 if (
set>l &&
set<u) {
538 if(std::abs(
set-old_state) > 10) {
547 bool SEQWindow::get_sequencer_pos(
Gxw::Regler * regler,
const std::string
id) {
553 if (value<99.0)
return true;
558 scroll_playhead(value);
566 bool SEQWindow::on_key_press_event(GdkEventKey *event) {
571 Glib::signal_timeout().connect_once(sigc::bind(sigc::bind(sigc::mem_fun(
this, &SEQWindow::on_seq_button_clicked_set),p),box),2);
575 std::vector<int> sequence;
577 Glib::ListHandle<Gtk::Widget*> seqList = box->get_children();
578 for (Glib::ListHandle<Gtk::Widget*>::iterator itt = seqList.begin();itt != seqList.end(); ++itt) {
579 sequence.push_back(dynamic_cast<Gtk::ToggleButton*>((*itt))->get_active());
585 void SEQWindow::check_preset_label() {
586 Glib::ustring pset =
" ";
589 gx_preset::UnitPresetList::iterator i = presetnames.begin();
590 for ( i = presetnames.begin(); i != presetnames.end(); ++i) {
591 if (!i->name.empty()) {
598 preset_label->set_label(pset);
603 Glib::ListHandle<Gtk::Widget*> seqList = box->get_children();
604 Glib::ListHandle<Gtk::Widget*>::iterator itt = seqList.begin();
605 std::vector<int> sequence = seqc->
getseqline();
608 for (std::vector<int>::const_iterator i = sequence.begin(); i != sequence.end(); ++i) {
609 if (itt == seqList.end())
break;
610 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_active(*i);
612 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_name(
"seq_button");
615 dynamic_cast<Gtk::ToggleButton*
>((*itt))->set_name(
"button");
620 Glib::signal_idle().connect_once(sigc::mem_fun(
this, &SEQWindow::check_preset_label));
624 if (gtk_window->get_visible() && !(gtk_window->get_window()->get_state() & Gdk::WINDOW_STATE_ICONIFIED)) {
628 seq_changed(&d.p->get_value(), d.box);
630 gtk_window->present();
634 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)