aboutsummaryrefslogtreecommitdiffstats
path: root/util/machina2dot
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-03-18 02:11:51 +0000
committerDavid Robillard <d@drobilla.net>2007-03-18 02:11:51 +0000
commit47f59aaad7a5ab8c189905544a761940ae9f8509 (patch)
tree67b6ec9ad915de327cda5007c8c1708a1e256c87 /util/machina2dot
parenta716b2c0571f5bdcd817835cecb30cb7a4c745e0 (diff)
downloadmachina-47f59aaad7a5ab8c189905544a761940ae9f8509.tar.gz
machina-47f59aaad7a5ab8c189905544a761940ae9f8509.tar.bz2
machina-47f59aaad7a5ab8c189905544a761940ae9f8509.zip
Improved automata diagram drawing (include notes, use standard initial note notation).
Made compilation without Jack possible. git-svn-id: http://svn.drobilla.net/lad/machina@363 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'util/machina2dot')
-rwxr-xr-xutil/machina2dot84
1 files changed, 84 insertions, 0 deletions
diff --git a/util/machina2dot b/util/machina2dot
new file mode 100755
index 0000000..e3e420c
--- /dev/null
+++ b/util/machina2dot
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+import sys
+import RDF
+
+model = RDF.Model()
+parser = RDF.Parser(name="guess")
+
+if len(sys.argv) != 2:
+ print "Usage: machina2dot FILE"
+ sys.exit(-1)
+
+parser.parse_into_model(model, "file:" + sys.argv[1])
+
+print """
+digraph finite_state_machine {
+ rankdir=LR;
+ node [ shape = circle ];
+""",
+
+node_durations = { }
+
+initial_nodes_query = RDF.SPARQLQuery("""
+PREFIX machina: <http://drobilla.net/ns/machina#>
+SELECT DISTINCT ?n ?dur ?note WHERE {
+ ?m machina:initialNode ?n .
+ ?n a machina:Node ;
+ machina:duration ?dur .
+ OPTIONAL { ?n machina:enterAction ?a .
+ ?a machina:midiNote ?note }
+}
+""")
+
+invis_id = 0;
+
+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 [ style = invis ] ",
+ print "invis%d" % invis_id, " }"
+ print '\t', node_id, "[ label = \"d =", duration, "\"];"
+ print '\t', "invis%d" % invis_id, " -> ", node_id
+ invis_id += 1
+
+
+nodes_query = RDF.SPARQLQuery("""
+PREFIX machina: <http://drobilla.net/ns/machina#>
+SELECT DISTINCT ?n ?dur ?note WHERE {
+ ?m machina:node ?n .
+ ?n a machina:Node ;
+ machina:duration ?dur .
+ OPTIONAL { ?n machina:enterAction ?a .
+ ?a machina:midiNote ?note }
+}
+""")
+
+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
+ label = "d=%.2f" % duration
+ if result['note']:
+ label += "\\nn=%s" % result['note'].literal_value['string']
+ print '\t', node_id, "[ label=\"%s\" ]" % label
+
+
+edge_query = RDF.SPARQLQuery("""
+PREFIX machina: <http://drobilla.net/ns/machina#>
+SELECT DISTINCT ?tail ?head ?prob WHERE {
+ ?e a machina:Edge ;
+ machina:tail ?tail ;
+ machina:head ?head ;
+ machina:probability ?prob .
+}
+""")
+
+for edge in edge_query.execute(model):
+ print '\t', edge['tail'].blank_identifier, ' -> ',
+ print edge['head'].blank_identifier, ' ',
+ print "[ label = \"%1.2f\"" % float(edge['prob'].literal_value['string']),
+ print "minlen = ", node_durations[edge['tail'].blank_identifier] * 2, " ];"
+
+print "}"