From ffb37e6de2934aa227c3483f8a00118e3604b5e5 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 7 Dec 2007 03:05:20 +0000 Subject: It's evolution, baby. git-svn-id: http://svn.drobilla.net/lad/machina@958 a436a847-0d15-0410-975c-d299462d15a1 --- src/gui/MachinaCanvas.cpp | 8 ++--- src/gui/MachinaCanvas.hpp | 2 +- src/gui/MachinaGUI.cpp | 79 ++++++++++++++++++++++++++++++----------------- src/gui/MachinaGUI.hpp | 7 +++-- 4 files changed, 59 insertions(+), 37 deletions(-) (limited to 'src/gui') diff --git a/src/gui/MachinaCanvas.cpp b/src/gui/MachinaCanvas.cpp index 1323bb4..04053a5 100644 --- a/src/gui/MachinaCanvas.cpp +++ b/src/gui/MachinaCanvas.cpp @@ -155,10 +155,13 @@ MachinaCanvas::create_node_view(SharedPtr node) void -MachinaCanvas::build(SharedPtr machine) +MachinaCanvas::build(SharedPtr machine, bool show_labels) { + cout << "BUILDING " << machine.get() << endl; + destroy(); _last_clicked.reset(); + assert(_items.empty()); if (!machine) return; @@ -192,9 +195,6 @@ MachinaCanvas::build(SharedPtr machine) head_view->add_connection(c); add_connection(c); } - - //while (Gtk::Main::events_pending()) - // Gtk::Main::iteration(false); } arrange(); diff --git a/src/gui/MachinaCanvas.hpp b/src/gui/MachinaCanvas.hpp index 211ebd7..f5a37c4 100644 --- a/src/gui/MachinaCanvas.hpp +++ b/src/gui/MachinaCanvas.hpp @@ -40,7 +40,7 @@ public: void disconnect_node(SharedPtr port1, SharedPtr port2); - void build(SharedPtr machine); + void build(SharedPtr machine, bool show_labels); void update_edges(); ArtVpathDash* selector_dash() { return _selector_dash; } diff --git a/src/gui/MachinaGUI.cpp b/src/gui/MachinaGUI.cpp index 42cb4ce..025cd8b 100644 --- a/src/gui/MachinaGUI.cpp +++ b/src/gui/MachinaGUI.cpp @@ -15,6 +15,8 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include CONFIG_H_PATH + #include #include #include @@ -32,6 +34,10 @@ #include "NodeView.hpp" #include "EdgeView.hpp" +#ifdef HAVE_EUGENE +#include +#endif + using namespace Machina; @@ -130,8 +136,6 @@ MachinaGUI::MachinaGUI(SharedPtr engine) _quantize_spinbutton->signal_changed().connect( sigc::mem_fun(this, &MachinaGUI::quantize_changed)); - _evolve_button->signal_clicked().connect( - sigc::mem_fun(this, &MachinaGUI::evolve)); _mutate_button->signal_clicked().connect(sigc::bind( sigc::mem_fun(this, &MachinaGUI::random_mutation), SharedPtr())); _compress_button->signal_clicked().connect(sigc::hide_return(sigc::bind( @@ -169,10 +173,14 @@ MachinaGUI::MachinaGUI(SharedPtr engine) // Idle callback to update node states Glib::signal_timeout().connect(sigc::mem_fun(this, &MachinaGUI::idle_callback), 100); - // Periodic mutation callback (FIXME: temporary kludge, thread this) +#ifdef HAVE_EUGENE + _evolve_button->signal_clicked().connect(sigc::mem_fun(this, &MachinaGUI::evolve_toggled)); Glib::signal_timeout().connect(sigc::mem_fun(this, &MachinaGUI::evolve_callback), 1000); +#else + _evolve_button->hide(); +#endif - _canvas->build(engine->machine()); + _canvas->build(engine->machine(), _menu_view_labels->get_active()); } @@ -185,10 +193,10 @@ bool MachinaGUI::evolve_callback() { if (_evolve) { - // Single greedy mutation - SharedPtr copy(new Machine(*_engine->machine().get())); - random_mutation(copy); - _canvas->build(copy); + if (_evolver->improvement()) { + //_engine->driver()->set_machine(_evolver->best()); + _canvas->build(_evolver->best(), _menu_view_labels->get_active()); + } } return true; @@ -244,12 +252,22 @@ MachinaGUI::arrange() void -MachinaGUI::evolve() +MachinaGUI::evolve_toggled() { - if (_evolve_button->get_active()) + if (_evolve_button->get_active()) { + _evolver = SharedPtr(new Evolver("target.mid", _engine->machine())); _evolve = true; - else + stop_clicked(); + _evolver->start(); + } else { + _evolver->stop(); _evolve = false; + SharedPtr new_machine = SharedPtr(new Machine(*_evolver->best())); + _engine->driver()->set_machine(new_machine); + _canvas->build(new_machine, _menu_view_labels->get_active()); + new_machine->activate(); + _engine->driver()->activate(); + } } @@ -259,7 +277,7 @@ MachinaGUI::random_mutation(SharedPtr machine) if (!machine) machine = _engine->machine(); - mutate(machine, rand() % 7); + mutate(machine, machine->nodes().size() < 2 ? 1 : rand() % 7); } @@ -273,31 +291,31 @@ MachinaGUI::mutate(SharedPtr machine, unsigned mutation) switch (mutation) { case 0: - Compress::mutate(*machine.get()); - _canvas->build(machine); + Compress().mutate(*machine.get()); + _canvas->build(machine, _menu_view_labels->get_active()); break; case 1: - AddNode::mutate(*machine.get()); - _canvas->build(machine); + AddNode().mutate(*machine.get()); + _canvas->build(machine, _menu_view_labels->get_active()); break; case 2: - RemoveNode::mutate(*machine.get()); - _canvas->build(machine); + RemoveNode().mutate(*machine.get()); + _canvas->build(machine, _menu_view_labels->get_active()); break; case 3: - AdjustNode::mutate(*machine.get()); + AdjustNode().mutate(*machine.get()); idle_callback(); // update nodes break; case 4: - AddEdge::mutate(*machine.get()); - _canvas->build(machine); + AddEdge().mutate(*machine.get()); + _canvas->build(machine, _menu_view_labels->get_active()); break; case 5: - RemoveEdge::mutate(*machine.get()); - _canvas->build(machine); + RemoveEdge().mutate(*machine.get()); + _canvas->build(machine, _menu_view_labels->get_active()); break; case 6: - AdjustEdge::mutate(*machine.get()); + AdjustEdge().mutate(*machine.get()); _canvas->update_edges(); break; default: throw; @@ -372,7 +390,7 @@ MachinaGUI::menu_file_open() SharedPtr new_machine = _engine->import_machine(dialog.get_uri()); if (new_machine) { _canvas->destroy(); - _canvas->build(new_machine); + _canvas->build(new_machine, _menu_view_labels->get_active()); _save_uri = dialog.get_uri(); } } @@ -483,7 +501,7 @@ MachinaGUI::menu_import_midi() dialog.hide(); machine->activate(); machine->reset(machine->time()); - _canvas->build(machine); + _canvas->build(machine, _menu_view_labels->get_active()); _engine->driver()->set_machine(machine); } else { Gtk::MessageDialog msg_dialog(dialog, "Error loading MIDI file", @@ -588,7 +606,7 @@ MachinaGUI::record_toggled() _engine->driver()->start_record(); } else if (_engine->driver()->recording()) { _engine->driver()->finish_record(); - _canvas->build(_engine->machine()); + _canvas->build(_engine->machine(), _menu_view_labels->get_active()); update_toolbar(); } } @@ -597,12 +615,15 @@ MachinaGUI::record_toggled() void MachinaGUI::stop_clicked() { + _play_button->set_active(false); + if (_engine->driver()->recording()) { _engine->driver()->stop(); - _canvas->build(_engine->machine()); - update_toolbar(); + _engine->machine()->deactivate(); + _canvas->build(_engine->machine(), _menu_view_labels->get_active()); } else { _engine->driver()->stop(); + _engine->machine()->deactivate(); } update_toolbar(); diff --git a/src/gui/MachinaGUI.hpp b/src/gui/MachinaGUI.hpp index bbba67f..3b6c340 100644 --- a/src/gui/MachinaGUI.hpp +++ b/src/gui/MachinaGUI.hpp @@ -26,7 +26,7 @@ using namespace std; -namespace Machina { class Machine; class Engine; } +namespace Machina { class Machine; class Engine; class Evolver; } class MachinaCanvas; @@ -63,7 +63,7 @@ protected: void menu_help_about(); void menu_help_help(); void arrange(); - void evolve(); + void evolve_toggled(); void random_mutation(SharedPtr machine); void mutate(SharedPtr machine, unsigned mutation); void zoom(double z); @@ -87,7 +87,8 @@ protected: boost::shared_ptr _canvas; boost::shared_ptr _engine; - SharedPtr _maid; + SharedPtr _maid; + SharedPtr _evolver; Gtk::Main* _gtk_main; -- cgit v1.2.1