aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-04-02 01:52:53 +0000
committerDavid Robillard <d@drobilla.net>2007-04-02 01:52:53 +0000
commitdb6f6e87dc4ff620f399597913f14a3b4eda277f (patch)
tree4258f8cc7f2a841fd41ce9dac222919f0ee98eeb /src/engine
parent69ad86f21555d28f5065923eea06ccc3cc4f4ce5 (diff)
downloadmachina-db6f6e87dc4ff620f399597913f14a3b4eda277f.tar.gz
machina-db6f6e87dc4ff620f399597913f14a3b4eda277f.tar.bz2
machina-db6f6e87dc4ff620f399597913f14a3b4eda277f.zip
Edge label toggling.
Made state properties dialog actually work. Other things... git-svn-id: http://svn.drobilla.net/lad/machina@390 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/Engine.cpp24
-rw-r--r--src/engine/JackDriver.cpp13
-rw-r--r--src/engine/Loader.cpp7
-rw-r--r--src/engine/MachineBuilder.cpp24
-rw-r--r--src/engine/machina/Driver.hpp3
-rw-r--r--src/engine/machina/Engine.hpp1
-rw-r--r--src/engine/machina/JackDriver.hpp2
7 files changed, 63 insertions, 11 deletions
diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp
index 5da3289..69402a3 100644
--- a/src/engine/Engine.cpp
+++ b/src/engine/Engine.cpp
@@ -36,6 +36,7 @@ Engine::load_machine(const Glib::ustring& uri)
if (m) {
m->activate();
_driver->set_machine(m);
+ //_driver->machine()->nodes().append(m->nodes());
}
// .. and drop it in this thread (to prevent deallocation in the RT thread)
@@ -44,6 +45,26 @@ Engine::load_machine(const Glib::ustring& uri)
}
+/** Load the machine at @a uri, and insert it into the current machine..
+ * Safe to call while engine is processing.
+ */
+SharedPtr<Machine>
+Engine::import_machine(const Glib::ustring& uri)
+{
+ SharedPtr<Machine> old_machine = _driver->machine(); // Hold a reference to current machine..
+
+ SharedPtr<Machine> m = Loader().load(uri);
+ if (m) {
+ m->activate();
+ _driver->machine()->nodes().append(m->nodes());
+ }
+
+ // .. and drop it in this thread (to prevent deallocation in the RT thread)
+
+ return _driver->machine();
+}
+
+
/** Learn the SMF (MIDI) file at @a uri, and run the resulting machine
* (replacing current machine).
* Safe to call while engine is processing.
@@ -56,7 +77,8 @@ Engine::learn_midi(const Glib::ustring& uri)
SharedPtr<SMFDriver> file_driver(new SMFDriver());
SharedPtr<Machine> m = file_driver->learn(uri, 32.0); // FIXME: hardcoded
m->activate();
- _driver->set_machine(m);
+ //_driver->set_machine(m);
+ _driver->machine()->nodes().append(m->nodes());
// .. and drop it in this thread (to prevent deallocation in the RT thread)
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp
index 7df3a4b..3493105 100644
--- a/src/engine/JackDriver.cpp
+++ b/src/engine/JackDriver.cpp
@@ -295,6 +295,16 @@ JackDriver::on_process(jack_nframes_t nframes)
void
+JackDriver::reset()
+{
+ // FIXME: Flag audio thread and end active notes, etc
+ _machine->deactivate();
+ _machine->reset();
+ _cycle_time.set_start(0);
+}
+
+
+void
JackDriver::start_record()
{
std::cerr << "START RECORD" << std::endl;
@@ -314,7 +324,8 @@ JackDriver::finish_record()
std::cout << "Learned machine! " << machine->nodes().size() << " nodes." << std::endl;
_recorder.reset();
machine->activate();
- set_machine(machine);
+ //set_machine(machine);
+ _machine->nodes().append(machine->nodes());
}
diff --git a/src/engine/Loader.cpp b/src/engine/Loader.cpp
index 539c86f..b3e4c81 100644
--- a/src/engine/Loader.cpp
+++ b/src/engine/Loader.cpp
@@ -137,6 +137,11 @@ Loader::load(const Glib::ustring& uri)
}
+ for (Created::iterator n = created.begin(); n != created.end(); ++n) {
+ cout << "NODE: " << n->first << endl;
+ }
+
+
/* Get note actions */
query = Raul::RDFQuery(*_namespaces, Glib::ustring(
@@ -152,6 +157,8 @@ Loader::load(const Glib::ustring& uri)
const Glib::ustring& node_id = (*i)["node"];
const Glib::ustring& note = (*i)["note"];
+ cerr << "NOTE: " << node_id << " = " << note << endl;
+
Created::iterator node_i = created.find(node_id);
if (node_i != created.end()) {
SharedPtr<Node> node = node_i->second;
diff --git a/src/engine/MachineBuilder.cpp b/src/engine/MachineBuilder.cpp
index 515f1a0..c8ad273 100644
--- a/src/engine/MachineBuilder.cpp
+++ b/src/engine/MachineBuilder.cpp
@@ -73,22 +73,22 @@ MachineBuilder::connect_nodes(SharedPtr<Machine> m,
SharedPtr<Node> delay_node;
- cerr << "******" << endl;
+ /*cerr << "******" << endl;
cerr << "Connect nodes durations: " << tail->duration() << " .. " << head->duration() << endl;
- cerr << "Connect nodes times: " << tail_end_time << " .. " << head_start_time << endl;
+ cerr << "Connect nodes times: " << tail_end_time << " .. " << head_start_time << endl;*/
if (is_delay_node(tail) && tail->outgoing_edges().size() == 0) {
// Tail is a delay node, just accumulate the time difference into it
- cerr << "Accumulating delay " << tail_end_time << " .. " << head_start_time << endl;
+ //cerr << "Accumulating delay " << tail_end_time << " .. " << head_start_time << endl;
tail->set_duration(tail->duration() + head_start_time - tail_end_time);
tail->add_outgoing_edge(SharedPtr<Edge>(new Edge(tail, head)));
} else if (head_start_time == tail_end_time) {
// Connect directly
- cerr << "Connnecting directly " << tail_end_time << " .. " << head_start_time << endl;
+ //cerr << "Connnecting directly " << tail_end_time << " .. " << head_start_time << endl;
tail->add_outgoing_edge(SharedPtr<Edge>(new Edge(tail, head)));
} else {
// Need to actually create a delay node
- cerr << "Adding delay node for " << tail_end_time << " .. " << head_start_time << endl;
+ //cerr << "Adding delay node for " << tail_end_time << " .. " << head_start_time << endl;
delay_node = SharedPtr<Node>(new Node());
delay_node->set_duration(head_start_time - tail_end_time);
tail->add_outgoing_edge(SharedPtr<Edge>(new Edge(tail, delay_node)));
@@ -96,7 +96,7 @@ MachineBuilder::connect_nodes(SharedPtr<Machine> m,
m->add_node(delay_node);
}
- cerr << "******" << endl << endl;
+ /*cerr << "******" << endl << endl;*/
return delay_node;
}
@@ -109,7 +109,7 @@ MachineBuilder::event(Raul::BeatTime time_offset,
{
Raul::BeatTime t = _time + time_offset;
- cerr << "t = " << t << endl;
+ //cerr << "t = " << t << endl;
if (ev_size > 0) {
if ((buf[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
@@ -150,6 +150,8 @@ MachineBuilder::event(Raul::BeatTime time_offset,
resolved->set_duration(t - resolved->enter_time());
if (_active_nodes.size() == 1) {
+
+ //cerr << "{ RESOLVING, t= " << t << "\n";
_connect_node_end_time = t;
@@ -176,7 +178,7 @@ MachineBuilder::event(Raul::BeatTime time_offset,
if (is_delay_node(_connect_node) && _connect_node->duration() == 0
&& _connect_node->outgoing_edges().size() == 1
&& (*_connect_node->outgoing_edges().begin())->head() == resolved) {
- cerr << "TRIMMING\n";
+ //cerr << "TRIMMING\n";
_connect_node->outgoing_edges().clear();
assert(_connect_node->outgoing_edges().empty());
_connect_node->set_enter_action(resolved->enter_action());
@@ -188,12 +190,16 @@ MachineBuilder::event(Raul::BeatTime time_offset,
if (_machine->nodes().find(_connect_node) == _machine->nodes().end())
_machine->add_node(_connect_node);
} else {
+ //cerr << "RESOLVED\n";
_connect_node = resolved;
_machine->add_node(resolved);
}
}
+ //cerr << "}";
+
} else {
+ //cerr << "ADDING POLY\n";
_poly_nodes.push_back(make_pair(resolved->enter_time(), resolved));
}
@@ -217,7 +223,7 @@ MachineBuilder::resolve()
{
if ( ! _active_nodes.empty()) {
for (list<SharedPtr<Node> >::iterator i = _active_nodes.begin(); i != _active_nodes.end(); ++i) {
- cerr << "WARNING: Resolving stuck note from MIDI file." << endl;
+ cerr << "WARNING: Resolving stuck note." << endl;
SharedPtr<MidiAction> action = PtrCast<MidiAction>((*i)->enter_action());
if (!action)
continue;
diff --git a/src/engine/machina/Driver.hpp b/src/engine/machina/Driver.hpp
index bf4d2be..acc4278 100644
--- a/src/engine/machina/Driver.hpp
+++ b/src/engine/machina/Driver.hpp
@@ -1,4 +1,5 @@
/* This file is part of Machina.
+ * _engine->driver()->reset_time();
* Copyright (C) 2007 Dave Robillard <http://drobilla.net>
*
* Machina is free software; you can redistribute it and/or modify it under the
@@ -39,6 +40,8 @@ public:
virtual void activate() {}
virtual void deactivate() {}
+ virtual void reset() {}
+
virtual bool recording() { return false; }
virtual void start_record() {}
virtual void finish_record() {}
diff --git a/src/engine/machina/Engine.hpp b/src/engine/machina/Engine.hpp
index 82c21ba..dc47b2a 100644
--- a/src/engine/machina/Engine.hpp
+++ b/src/engine/machina/Engine.hpp
@@ -37,6 +37,7 @@ public:
SharedPtr<Machine> machine() { return _driver->machine(); }
SharedPtr<Machine> load_machine(const Glib::ustring& uri);
+ SharedPtr<Machine> import_machine(const Glib::ustring& uri);
SharedPtr<Machine> learn_midi(const Glib::ustring& uri);
void set_bpm(double bpm);
diff --git a/src/engine/machina/JackDriver.hpp b/src/engine/machina/JackDriver.hpp
index 47b718d..1ab6643 100644
--- a/src/engine/machina/JackDriver.hpp
+++ b/src/engine/machina/JackDriver.hpp
@@ -62,6 +62,8 @@ public:
void set_bpm(double bpm) { _bpm.set(bpm); }
void set_quantization(double quantization) { _quantization.set(quantization); }
+ void reset();
+
bool recording() { return _recording.get(); }
void start_record();
void finish_record();