aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-03-02 00:05:18 +0000
committerDavid Robillard <d@drobilla.net>2007-03-02 00:05:18 +0000
commit19b537a142c127dd2c1d9a40a7999714f9d2175d (patch)
tree85d7da2a138e34ca5783dffbc6547fd4500ca7ca
parentde25ae35ccb0613290ba20bfcf0ea15476c26ed5 (diff)
downloadmachina-19b537a142c127dd2c1d9a40a7999714f9d2175d.tar.gz
machina-19b537a142c127dd2c1d9a40a7999714f9d2175d.tar.bz2
machina-19b537a142c127dd2c1d9a40a7999714f9d2175d.zip
Work towards Action serialization.
Made edge length in dot graphs (from machina2dot) correspond to node duration to make automaton diagram map closer to music notation. git-svn-id: http://svn.drobilla.net/lad/machina@341 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/engine/Action.cpp35
-rw-r--r--src/engine/Makefile.am1
-rw-r--r--src/engine/Node.cpp7
-rw-r--r--src/engine/machina/Action.hpp5
-rwxr-xr-xutil/machina2dot.py62
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 "}"