summaryrefslogtreecommitdiffstats
path: root/scripts/ingenish
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ingenish')
-rwxr-xr-xscripts/ingenish121
1 files changed, 121 insertions, 0 deletions
diff --git a/scripts/ingenish b/scripts/ingenish
new file mode 100755
index 00000000..97640645
--- /dev/null
+++ b/scripts/ingenish
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+# Ingen Interactive Shell
+# Copyright 2011-2015 David Robillard <http://drobilla.net>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import ingen
+import os.path
+import re
+import shlex
+import sys
+import time
+try:
+ import readline
+except:
+ pass
+
+# Python 2 compatibility
+try:
+ input = raw_input
+except NameError:
+ pass
+
+def print_usage():
+ print('''Usage: ingenish [OPTION]... [COMMAND [ARGUMENT]...]
+
+A command line interface to an Ingen server. A command can be given directly
+on the command line, or when run with no arguments an interactive shell is
+launched.
+
+Options:
+ -s ADDRESS The address of the Ingen server. Default is the local server
+ at unix:///tmp/ingen.sock but remote servers can be used with
+ an address like tcp:///my-ingen-server-host:16180
+
+Commands:
+ put SUBJECT BODY
+ set SUBJECT KEY VALUE
+ connect TAIL HEAD
+ disconnect TAIL HEAD
+ patch SUBJECT REMOVE ADD
+ delete SUBJECT
+ help
+ exit
+
+Subjects are specified by URI, relative to the engine. The top level audio
+graph has the path /main, so for example, a port on a block might have the
+(relative) URI /main/osc/freq.
+
+Bodies are specified in fragments of Turtle, just as written in Ingen graph files.
+
+Example:
+ put /main/left_in 'a lv2:InputPort ; a lv2:AudioPort'
+ put /main/left_out 'a lv2:OutputPort ; a lv2:AudioPort'
+ put /main/tone 'a ingen:Block ; lv2:prototype <http://drobilla.net/plugins/mda/Shepard>'
+ put /main/combo 'a ingen:Block ; lv2:prototype <http://drobilla.net/plugins/mda/Combo>'
+ connect /main/left_in /main/tone/left_in
+ connect /main/tone/left_out /main/combo/left_in
+ connect /main/combo/left_out /main/left_out
+ set /main/tone/output ingen:value 0.7
+''')
+
+def run(cmd):
+ if cmd[0] == 'help':
+ print_usage()
+ elif cmd[0] == 'exit':
+ sys.exit(0)
+ elif cmd[0] == 'get' and len(cmd) == 2:
+ print(ingen.get(cmd[1]).serialize(format='n3'))
+ elif cmd[0] == 'put' and len(cmd) == 3:
+ return ingen.put(cmd[1], cmd[2])
+ elif cmd[0] == 'patch' and len(cmd) == 4:
+ return ingen.patch(cmd[1], cmd[2], cmd[3])
+ elif cmd[0] == 'set' and len(cmd) == 4:
+ return ingen.set(cmd[1], cmd[2], cmd[3])
+ elif cmd[0] == 'connect' and len(cmd) == 3:
+ return ingen.connect(cmd[1], cmd[2])
+ elif cmd[0] == 'disconnect' and len(cmd) == 3:
+ return ingen.disconnect(cmd[1], cmd[2])
+ elif cmd[0] == 'delete' and len(cmd) == 2:
+ return ingen.delete(cmd[1])
+ return False
+
+a = 1
+server = 'unix:///tmp/ingen.sock'
+if len(sys.argv) > 1:
+ if sys.argv[a] == '-s':
+ server = sys.argv[a + 1]
+ a = a + 2
+ elif sys.argv[a][0] == '-':
+ print_usage()
+ sys.exit(1)
+
+ingen = ingen.Remote(server)
+
+if len(sys.argv) - a == 0:
+ print('Ingen server at %s' % server)
+ while True:
+ try:
+ run(shlex.split(input('> ')))
+ except (EOFError, KeyboardInterrupt, SystemExit):
+ break
+ except:
+ print('error: %s' % sys.exc_info()[1])
+else:
+ try:
+ update = run(sys.argv[a:])
+ if update:
+ print(update.serialize(format='n3'))
+ except:
+ print('error: %s' % sys.exc_info()[1])