diff options
Diffstat (limited to 'util')
-rwxr-xr-x | util/machina2dot | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/util/machina2dot b/util/machina2dot new file mode 100755 index 0000000..22cfbf0 --- /dev/null +++ b/util/machina2dot @@ -0,0 +1,184 @@ +#!/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 = doublecircle ]; +""", + +written_nodes = {} +node_durations = {} +invis_id = 0; + + +# Initial selectors + +initial_selectors_query = RDF.SPARQLQuery(""" +PREFIX machina: <http://drobilla.net/ns/machina#> +SELECT DISTINCT ?n ?dur ?note WHERE { + ?m machina:initialNode ?n . + ?n a machina:SelectorNode ; + machina:duration ?dur . + OPTIONAL { ?n machina:enterAction ?a . + ?a machina:midiNote ?note } +} +""") + +for result in initial_selectors_query.execute(model): + node_id = result['n'].blank_identifier + duration = float(result['dur'].literal_value['string']) + written_nodes[node_id] = True; + node_durations[node_id] = duration + print "\t{ node [ style = invis ] ", + print "invis%d" % invis_id, " }" + + label = "d=%.1f" % duration + if result['note']: + label += "\\nn=%s" % result['note'].literal_value['string'] + + print '\t', node_id, "[ label=\"%s\" ]" % label + print '\t', "invis%d" % invis_id, " -> ", node_id + invis_id += 1 + +print """ } { + node [ shape = circle ]; +""" + + +# Initial non-selectors + +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 } +} +""") + +for result in initial_nodes_query.execute(model): + node_id = result['n'].blank_identifier + duration = float(result['dur'].literal_value['string']) + + if written_nodes.has_key(node_id): + continue + + written_nodes[node_id] = True; + node_durations[node_id] = duration + print "\t{ node [ style = invis ] ", + print "invis%d" % invis_id, " }" + + label = "d=%.1f" % duration + if result['note']: + label += "\\nn=%s" % result['note'].literal_value['string'] + + print '\t', node_id, "[ label=\"%s\" ]" % label + print '\t', "invis%d" % invis_id, " -> ", node_id + invis_id += 1 + + +# Non-initial selectors + +print """ } { + node [ shape = doublecircle ]; +""" + +selectors_query = RDF.SPARQLQuery(""" +PREFIX machina: <http://drobilla.net/ns/machina#> +SELECT DISTINCT ?n ?dur ?note WHERE { + ?m machina:node ?n . + ?n a machina:SelectorNode ; + machina:duration ?dur . + OPTIONAL { ?n machina:enterAction ?a . + ?a machina:midiNote ?note } +} +""") + + +for result in selectors_query.execute(model): + node_id = result['n'].blank_identifier + duration = float(result['dur'].literal_value['string']) + + if written_nodes.has_key(node_id): + continue + + node_durations[node_id] = duration + + label = "d=%.1f" % duration + if result['note']: + label += "\\nn=%s" % result['note'].literal_value['string'] + + print '\t', node_id, "[ label=\"%s\" ]" % label + + + +# Non-initial non-selectors + +print """ } { + node [ shape = circle ]; +""" + +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']) + + if written_nodes.has_key(node_id): + continue + + node_durations[node_id] = duration + + label = "d=%.1f" % duration + if result['note']: + label += "\\nn=%s" % result['note'].literal_value['string'] + + print '\t', node_id, "[ label=\"%s\" ]" % label + + +# Edges + +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]+0.1, " ];" + +print """ + } +}""" |