aboutsummaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-12-07 03:05:20 +0000
committerDavid Robillard <d@drobilla.net>2007-12-07 03:05:20 +0000
commitffb37e6de2934aa227c3483f8a00118e3604b5e5 (patch)
tree8c40493f8de562677e1e54cc4b26a1fbbb493d26 /src/gui
parent33e9991326a1cd90a4956f3221f5a48d03d5af89 (diff)
downloadmachina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.tar.gz
machina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.tar.bz2
machina-ffb37e6de2934aa227c3483f8a00118e3604b5e5.zip
It's evolution, baby.
git-svn-id: http://svn.drobilla.net/lad/machina@958 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/MachinaCanvas.cpp8
-rw-r--r--src/gui/MachinaCanvas.hpp2
-rw-r--r--src/gui/MachinaGUI.cpp79
-rw-r--r--src/gui/MachinaGUI.hpp7
4 files changed, 59 insertions, 37 deletions
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<Machina::Node> node)
void
-MachinaCanvas::build(SharedPtr<Machina::Machine> machine)
+MachinaCanvas::build(SharedPtr<const Machina::Machine> 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<Machina::Machine> 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<NodeView> port1,
SharedPtr<NodeView> port2);
- void build(SharedPtr<Machina::Machine> machine);
+ void build(SharedPtr<const Machina::Machine> 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 <cmath>
#include <sstream>
#include <fstream>
@@ -32,6 +34,10 @@
#include "NodeView.hpp"
#include "EdgeView.hpp"
+#ifdef HAVE_EUGENE
+#include <machina/Evolver.hpp>
+#endif
+
using namespace Machina;
@@ -130,8 +136,6 @@ MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> 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<Machine>()));
_compress_button->signal_clicked().connect(sigc::hide_return(sigc::bind(
@@ -169,10 +173,14 @@ MachinaGUI::MachinaGUI(SharedPtr<Machina::Engine> 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<Machine> 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<Evolver>(new Evolver("target.mid", _engine->machine()));
_evolve = true;
- else
+ stop_clicked();
+ _evolver->start();
+ } else {
+ _evolver->stop();
_evolve = false;
+ SharedPtr<Machine> new_machine = SharedPtr<Machine>(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> 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> 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<Machina::Machine> 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<Machina::Machine> machine);
void mutate(SharedPtr<Machina::Machine> machine, unsigned mutation);
void zoom(double z);
@@ -87,7 +87,8 @@ protected:
boost::shared_ptr<MachinaCanvas> _canvas;
boost::shared_ptr<Machina::Engine> _engine;
- SharedPtr<Raul::Maid> _maid;
+ SharedPtr<Raul::Maid> _maid;
+ SharedPtr<Machina::Evolver> _evolver;
Gtk::Main* _gtk_main;