From db6f6e87dc4ff620f399597913f14a3b4eda277f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 2 Apr 2007 01:52:53 +0000 Subject: 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 --- src/engine/Engine.cpp | 24 +++++++++++++++++++++++- src/engine/JackDriver.cpp | 13 ++++++++++++- src/engine/Loader.cpp | 7 +++++++ src/engine/MachineBuilder.cpp | 24 +++++++++++++++--------- src/engine/machina/Driver.hpp | 3 +++ src/engine/machina/Engine.hpp | 1 + src/engine/machina/JackDriver.hpp | 2 ++ 7 files changed, 63 insertions(+), 11 deletions(-) (limited to 'src/engine') 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 +Engine::import_machine(const Glib::ustring& uri) +{ + SharedPtr old_machine = _driver->machine(); // Hold a reference to current machine.. + + SharedPtr 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 file_driver(new SMFDriver()); SharedPtr 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 @@ -294,6 +294,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() { @@ -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_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 m, SharedPtr 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(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(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(new Node()); delay_node->set_duration(head_start_time - tail_end_time); tail->add_outgoing_edge(SharedPtr(new Edge(tail, delay_node))); @@ -96,7 +96,7 @@ MachineBuilder::connect_nodes(SharedPtr 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 >::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 action = PtrCast((*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 * * 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() { return _driver->machine(); } SharedPtr load_machine(const Glib::ustring& uri); + SharedPtr import_machine(const Glib::ustring& uri); SharedPtr 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(); -- cgit v1.2.1