diff options
-rw-r--r-- | src/engine/Action.cpp | 35 | ||||
-rw-r--r-- | src/engine/Makefile.am | 1 | ||||
-rw-r--r-- | src/engine/Node.cpp | 7 | ||||
-rw-r--r-- | src/engine/machina/Action.hpp | 5 | ||||
-rwxr-xr-x | util/machina2dot.py | 62 |
5 files changed, 80 insertions, 30 deletions
diff --git a/src/engine/Action.cpp b/src/engine/Action.cpp new file mode 100644 index 0000000..a893d74 --- /dev/null +++ b/src/engine/Action.cpp @@ -0,0 +1,35 @@ +/* This file is part of Machina. + * Copyright (C) 2007 Dave Robillard <http://drobilla.net> + * + * Machina is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Machina is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <raul/RDFWriter.h> +#include "machina/Action.hpp" + +namespace Machina { + +void +Action::write_state(Raul::RDFWriter& writer) +{ + using Raul::RdfId; + + writer.write(_id, + RdfId(RdfId::RESOURCE, "rdf:type"), + RdfId(RdfId::RESOURCE, "machina:Action")); +} + + +} // namespace Machina + diff --git a/src/engine/Makefile.am b/src/engine/Makefile.am index 2cda9e5..d500302 100644 --- a/src/engine/Makefile.am +++ b/src/engine/Makefile.am @@ -9,6 +9,7 @@ libmachina_la_LIBADD = @RAUL_LIBS@ @JACK_LIBS@ @GLIBMM_LIBS@ libmachina_la_SOURCES = \ Node.cpp \ Edge.cpp \ + Action.cpp \ Machine.cpp \ Loader.cpp \ MidiAction.cpp \ diff --git a/src/engine/Node.cpp b/src/engine/Node.cpp index 47eee35..7af2997 100644 --- a/src/engine/Node.cpp +++ b/src/engine/Node.cpp @@ -130,6 +130,13 @@ Node::write_state(Raul::RDFWriter& writer) writer.write(_id, RdfId(RdfId::RESOURCE, "machina:duration"), Raul::Atom((float)_duration)); + + writer.write(_id, + RdfId(RdfId::RESOURCE, "machina:enterAction"), + _enter_action->id()); + _enter_action->write_state(writer); + + _exit_action->write_state(writer); /*for (Node::Edges::const_iterator e = _outgoing_edges.begin(); e != _outgoing_edges.end(); ++e) diff --git a/src/engine/machina/Action.hpp b/src/engine/machina/Action.hpp index 2bffaa3..16c9b58 100644 --- a/src/engine/machina/Action.hpp +++ b/src/engine/machina/Action.hpp @@ -22,6 +22,7 @@ #include <iostream> #include <raul/Deletable.h> #include <raul/TimeSlice.h> +#include <raul/Stateful.h> #include "types.hpp" namespace Machina { @@ -29,8 +30,10 @@ namespace Machina { /** An Action, executed on entering or exiting of a state. */ -struct Action : public Raul::Deletable { +struct Action : public Raul::Deletable, public Raul::Stateful { virtual void execute(Raul::BeatTime /*time*/) {} + + virtual void write_state(Raul::RDFWriter& writer); }; diff --git a/util/machina2dot.py b/util/machina2dot.py index bbf9725..f4e67ec 100755 --- a/util/machina2dot.py +++ b/util/machina2dot.py @@ -16,56 +16,60 @@ parser.parse_into_model(model, "file:" + sys.argv[1]) print """ digraph finite_state_machine { rankdir=LR; - size="8,5" - node [shape = doublecircle]; + node [shape = doublecircle, width = 1.25 ]; """, +node_durations = { } -initial_nodes = RDF.SPARQLQuery(""" +initial_nodes_query = RDF.SPARQLQuery(""" PREFIX machina: <http://drobilla.net/ns/machina#> -SELECT ?n ?dur WHERE { +SELECT DISTINCT ?n ?dur WHERE { ?m machina:initialNode ?n . ?n a machina:Node ; machina:duration ?dur . } -""").execute(model) +""") -for result in initial_nodes: - print '\t', result['n'].blank_identifier, "[ label = \"", - print float(result['dur'].literal_value['string']), - print "\"]; " +for result in initial_nodes_query.execute(model): + node_id = result['n'].blank_identifier + duration = float(result['dur'].literal_value['string']) + node_durations[node_id] = duration + print '\t', node_id, "[ label = \"d:", duration, "\"];" -print "\tnode [shape = circle];" +print "\tnode [shape = circle, width = 1.25 ];" -nodes = RDF.SPARQLQuery(""" + +nodes_query = RDF.SPARQLQuery(""" PREFIX machina: <http://drobilla.net/ns/machina#> -SELECT ?n ?dur WHERE { +SELECT DISTINCT ?n ?dur WHERE { ?m machina:node ?n . ?n a machina:Node ; machina:duration ?dur . } -""").execute(model) - -for result in nodes: - print '\t', result['n'].blank_identifier, "[ label = \"", - print float(result['dur'].literal_value['string']), - print "\"]; " +""") +for result in nodes_query.execute(model): + node_id = result['n'].blank_identifier + duration = float(result['dur'].literal_value['string']) + node_durations[node_id] = duration + print '\t', node_id, "[ label = \"d:", duration, "\"]; " -edges = RDF.SPARQLQuery(""" + +edge_query = RDF.SPARQLQuery(""" PREFIX machina: <http://drobilla.net/ns/machina#> -SELECT ?tail ?head ?prob WHERE { +SELECT DISTINCT ?tail ?head ?prob WHERE { ?e a machina:Edge ; - machina:tail ?tail ; + machina:tail ?tail ; machina:head ?head ; machina:probability ?prob . } -""").execute(model); - -for result in edges: - print '\t', result['tail'].blank_identifier, ' -> ', - print result['head'].blank_identifier, ' ', - print "[ label = \"", result['prob'].literal_value['string'], "\" ];" - -print "\n}" +""") + +for edge in edge_query.execute(model): + print '\t', edge['tail'].blank_identifier, ' -> ', + print edge['head'].blank_identifier, ' ', + print "[ label = \"", edge['prob'].literal_value['string'], "\" ", + print "minlen = ", node_durations[edge['tail'].blank_identifier] * 7.5, " ];" + +print "}" |