From dbcc1fd71326c775b74d451cad7016e779c0c19a Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 15:45:27 +1000 Subject: [PATCH 01/13] fixed OSCClient.sendto MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit the sendto method would fail if a socket hadn’t already been created. this version makes sure the socket exists and uses a connection-less socket (socket.sendto) as the user would probably expect. --- OSC.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/OSC.py b/OSC.py index a65ae20..74b162c 100755 --- a/OSC.py +++ b/OSC.py @@ -1160,8 +1160,8 @@ def connect(self, address): if self.server != None: self.server.return_port = address[1] - def sendto(self, msg, address, timeout=None): - """Send the given OSCMessage to the specified address. +def sendto(self, msg, address, timeout=None): + """Send the given OSCMessage to the specified address (this uses a connectionless socket). - msg: OSCMessage (or OSCBundle) to be sent - address: (host, port) tuple specifing remote server to send the message to - timeout: A timeout value for attempting to send. If timeout == None, @@ -1171,6 +1171,21 @@ def sendto(self, msg, address, timeout=None): if not isinstance(msg, OSCMessage): raise TypeError("'msg' argument is not an OSCMessage or OSCBundle object") + # First make sure the socket exists + try: + if not self.socket: + if len(address) == 4: + address_family = socket.AF_INET6 + else: + address_family = socket.AF_INET + self._setSocket(socket.socket(address_family, socket.SOCK_DGRAM)) + except socket.error as e: + if e[0] in (7, 65): # 7 = 'no address associated with nodename', 65 = 'no route to host' + raise e + else: + raise OSCClientError("Error while CONNECTING to %s: %s" % (str(address), str(e))) + + # Then Select ret = select.select([],[self._fd], [], timeout) try: ret[1].index(self._fd) @@ -1178,18 +1193,16 @@ def sendto(self, msg, address, timeout=None): # for the very rare case this might happen raise OSCClientError("Timed out waiting for file descriptor") + # Finally Send try: - self._ensureConnected(address) - self.socket.sendall(msg.getBinary()) - + self.socket.sendto(msg.getBinary(),address) if self.client_address: self.socket.connect(self.client_address) - except socket.error, e: if e[0] in (7, 65): # 7 = 'no address associated with nodename', 65 = 'no route to host' raise e else: - raise OSCClientError("while sending to %s: %s" % (str(address), str(e))) + raise OSCClientError("Error while SENDING to %s: %s" % (str(address), str(e))) def send(self, msg, timeout=None): """Send the given OSCMessage. From ab20c87fbffd85cd7e90d8eff3c52a9e357eb1e7 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 15:51:47 +1000 Subject: [PATCH 02/13] fixing formatting in the read me --- README.txt | 328 +++++++++++++++++++++++++---------------------------- 1 file changed, 153 insertions(+), 175 deletions(-) diff --git a/README.txt b/README.txt index b12e9bb..64e0643 100644 --- a/README.txt +++ b/README.txt @@ -1,194 +1,172 @@ -NOTE - This documentation is very similar to the header in OSC.py. One day both should be merged and placed either - in this file or in OSC.py to avoid diverging documentation. - -DESCRIPTION - This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the - good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. - - This implementation is intended to still be 'Simple' to the user, but much more complete - (with OSCServer & OSCClient classes) and much more powerful - (the OSCMultiClient supports subscriptions & message-filtering, - OSCMessage & OSCBundle are now proper container-types) - - ================ - OpenSoundControl - ================ - - OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. - The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. - - In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more - common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC - specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size - as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new - implementation provides server and client classes. Their use is illustrated in the testbench. - - OSC-packets come in two kinds: - - OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), - followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), - and finally the arguments themselves, encoded in an OSC-specific way. - The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way - (that is, OSCMessage-objects behave a lot like lists) - - - OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. - (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) - OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages - a bundle contains will have OSC-addresses!) - Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until - the specified time. - The OSCBundle class allows easy cration & manipulation of OSC-bundles. - - see also http://opensoundcontrol.org/spec-1_0 - - --------- - - To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. - - The OSCClient uses an 'AF_INET / SOCK_DGRAM' type socket (see the 'socket' module) to send - binary representations of OSC-messages to a remote host:port address. - - The OSCServer listens on an 'AF_INET / SOCK_DGRAM' type socket bound to a local port, and handles - incoming requests. Either one-after-the-other (OSCServer) or in a multi-threaded / multi-process fashion - (ThreadingOSCServer / ForkingOSCServer). If the Server has a callback-function (a.k.a. handler) registered - to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message - - The different OSCServers implemented here all support the (recursive) un-bundling of OSC-bundles, - and OSC-bundle timetags. - - In fact, this implementation supports: - - - OSC-messages with 'i' (int32), 'f' (float32), 's' (string) and 'b' (blob / binary data) types - - OSC-bundles, including timetag-support - - OSC-address patterns including '*', '?', '{,}' and '[]' wildcards. - - (please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) - - In addition, the OSCMultiClient supports: - - Sending a specific OSC-message to multiple remote servers - - Remote server subscription / unsubscription (through OSC-messages, of course) - - Message-address filtering. - - The streaming server and clients use SOCK_STREAM sockets. Since this protocol is connection oriented - replies are usually sent to the peer and not to a random server/client as in UDP implementations. If - one likes to send messages to other clients/servers, a separate connection has to be established. - - --------- - - Stock, V2_Lab, Rotterdam, 2008 - - ---------- - Changelog: - ---------- - v0.3.0 - 27 Dec. 2007 - Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. - Rewrote OSCMessage - Added OSCBundle - - v0.3.1 - 3 Jan. 2008 - Added OSClient - Added OSCRequestHandler, loosely based on the original CallbackManager - Added OSCServer - Removed original CallbackManager - Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client - - v0.3.2 - 5 Jan. 2008 - Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage - Added ThreadingOSCServer & ForkingOSCServer - - 6 Jan. 2008 - Added OSCMultiClient - Added command-line options to testing-script (try 'python OSC.py --help') - - v0.3.3 - 9 Jan. 2008 - Added OSC-timetag support to OSCBundle & OSCRequestHandler - Added ThreadingOSCRequestHandler - - v0.3.4 - 13 Jan. 2008 - Added message-filtering to OSCMultiClient - Added subscription-handler to OSCServer - Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) - Cleaned-up and added more Docstrings - - v0.3.5 - 14 aug. 2008 - Added OSCServer.reportErr(...) method - - v0.3.6 - 19 April 2010 - Added Streaming support (OSC over TCP) - Updated documentation - Moved pattern matching stuff into separate class (OSCAddressSpace) to - facilitate implementation of different server and client architectures. - Moved testing code into separate testbench (testbench.py) - - ----------------- - Original Comments - ----------------- - - > Open SoundControl for Python - > Copyright (C) 2002 Daniel Holth, Clinton McChesney - > - > This library is free software; you can redistribute it and/or modify it under - > the terms of the GNU Lesser General Public License as published by the Free - > Software Foundation; either version 2.1 of the License, or (at your option) any - > later version. - > - > This library 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 Lesser General Public License for more - > details. - - > You should have received a copy of the GNU Lesser General Public License along - > with this library; if not, write to the Free Software Foundation, Inc., 59 - > Temple Place, Suite 330, Boston, MA 02111-1307 USA - - > For questions regarding this module contact Daniel Holth - > or visit http://www.stetson.edu/~ProctoLogic/ - - > Changelog: - > 15 Nov. 2001: - > Removed dependency on Python 2.0 features. - > - dwh - > 13 Feb. 2002: - > Added a generic callback handler. - > - dwh - -INSTALLING - To install, simply run +## NOTE + +This documentation is very similar to the header in OSC.py. One day both should be merged and placed either in this file or in OSC.py to avoid diverging documentation. + +## DESCRIPTION +This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. + +This implementation is intended to still be 'Simple' to the user, but much more complete (with OSCServer & OSCClient classes) and much more powerful (the OSCMultiClient supports subscriptions & message-filtering, OSCMessage & OSCBundle are now proper container-types) + +# OpenSoundControl + +OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. + +In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. + +OSC-packets come in two kinds: + +- OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), and finally the arguments themselves, encoded in an OSC-specific way. The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way (that is, OSCMessage-objects behave a lot like lists) +- OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages a bundle contains will have OSC-addresses!) Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until the specified time. The OSCBundle class allows easy cration & manipulation of OSC-bundles. + +see also http://opensoundcontrol.org/spec-1_0 + +--------- + +To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. + +The OSCClient uses an 'AF_INET / SOCK_DGRAM' type socket (see the 'socket' module) to send binary representations of OSC-messages to a remote host:port address. + +The OSCServer listens on an 'AF_INET / SOCK_DGRAM' type socket bound to a local port, and handles +incoming requests. Either one-after-the-other (OSCServer) or in a multi-threaded / multi-process fashion +(ThreadingOSCServer / ForkingOSCServer). If the Server has a callback-function (a.k.a. handler) registered +to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message + +The different OSCServers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. + +In fact, this implementation supports: + +- OSC-messages with 'i' (int32), 'f' (float32), 's' (string) and 'b' (blob / binary data) types +- OSC-bundles, including timetag-support +- OSC-address patterns including '*', '?', '{,}' and '[]' wildcards. + +(please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) + +In addition, the OSCMultiClient supports: + +- Sending a specific OSC-message to multiple remote servers +- Remote server subscription / unsubscription (through OSC-messages, of course) +- Message-address filtering. + +The streaming server and clients use SOCK_STREAM sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. + +--------- + +Stock, V2_Lab, Rotterdam, 2008 + +---------- +Changelog: +---------- +v0.3.0 - 27 Dec. 2007 + Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. + Rewrote OSCMessage + Added OSCBundle + +v0.3.1 - 3 Jan. 2008 + Added OSClient + Added OSCRequestHandler, loosely based on the original CallbackManager + Added OSCServer + Removed original CallbackManager + Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client + +v0.3.2 - 5 Jan. 2008 + Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage + Added ThreadingOSCServer & ForkingOSCServer + - 6 Jan. 2008 + Added OSCMultiClient + Added command-line options to testing-script (try 'python OSC.py --help') + +v0.3.3 - 9 Jan. 2008 + Added OSC-timetag support to OSCBundle & OSCRequestHandler + Added ThreadingOSCRequestHandler + +v0.3.4 - 13 Jan. 2008 + Added message-filtering to OSCMultiClient + Added subscription-handler to OSCServer + Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) + Cleaned-up and added more Docstrings + +v0.3.5 - 14 aug. 2008 + Added OSCServer.reportErr(...) method + +v0.3.6 - 19 April 2010 + Added Streaming support (OSC over TCP) + Updated documentation + Moved pattern matching stuff into separate class (OSCAddressSpace) to + facilitate implementation of different server and client architectures. + Moved testing code into separate testbench (testbench.py) + +----------------- +Original Comments +----------------- + +> Open SoundControl for Python +> Copyright (C) 2002 Daniel Holth, Clinton McChesney +> +> This library is free software; you can redistribute it and/or modify it under +> the terms of the GNU Lesser General Public License as published by the Free +> Software Foundation; either version 2.1 of the License, or (at your option) any +> later version. +> +> This library 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 Lesser General Public License for more +> details. + +> You should have received a copy of the GNU Lesser General Public License along +> with this library; if not, write to the Free Software Foundation, Inc., 59 +> Temple Place, Suite 330, Boston, MA 02111-1307 USA + +> For questions regarding this module contact Daniel Holth +> or visit http://www.stetson.edu/~ProctoLogic/ + +> Changelog: +> 15 Nov. 2001: +> Removed dependency on Python 2.0 features. +> - dwh +> 13 Feb. 2002: +> Added a generic callback handler. +> - dwh + +## INSTALLING + +To install, simply run $ sudo ./setup.py install - and provide your password. - That's it. After this, you can use the 'pyOSC' module in your python-scripts by doing +and provide your password. +That's it. After this, you can use the 'pyOSC' module in your python-scripts by doing import OSC -DOCUMENTATION - To get help, run +## DOCUMENTATION + +To get help, run $ pydoc OSC - or, from within a python-interpreter +or, from within a python-interpreter + + import OSC + help(OSC) - >>> import OSC - >>> help(OSC) +## TESTING -TESTING - This package contains an OSC-testing program (testbench.py). - Please have a good look at the source for this program for an example on how to use this module. +This package contains an OSC-testing program (testbench.py). Please have a good look at the source for this program for an example on how to use this module. - To get help on how to invoke the test-program, run +To get help on how to invoke the test-program, run $ python testbench.py --help - Usage: testbench.py [options] +Usage: testbench.py [options] testbench.py OpenSoundControl-for-Python Test Program - Options: - -h, --help show this help message and exit - -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' - -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' - -t, --threading Test ThreadingOSCServer - -f, --forking Test ForkingOSCServer - -u, --usage Show this help message and exit - -c, --streaming Test streaming OSC (OSC over TCP) +Options: + -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) From f9b1b9eb9b5b8bac7205a17f79afef5afd0fac39 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 15:53:09 +1000 Subject: [PATCH 03/13] using markdown for read me --- README.txt => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.txt => README.md (100%) diff --git a/README.txt b/README.md similarity index 100% rename from README.txt rename to README.md From c2518f838616b4733291d42c6914e8ba3b00bf69 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:00:08 +1000 Subject: [PATCH 04/13] fixing markdown formatting --- README.txt | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 README.txt diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..0b26bcb --- /dev/null +++ b/README.txt @@ -0,0 +1,162 @@ +## NOTE + +This documentation is very similar to the header in `OSC.py`. One day both should be merged and placed either in this file or in `OSC.py` to avoid diverging documentation. + +## DESCRIPTION +This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. + +This implementation is intended to still be 'Simple' to the user, but much more complete (with `OSCServer` & `OSCClient` classes) and much more powerful (the `OSCMultiClient` supports subscriptions & message-filtering, `OSCMessage` & `OSCBundle` are now proper container-types) + +## OpenSoundControl + +OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. + +In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. + +OSC-packets come in two kinds: + +- OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), and finally the arguments themselves, encoded in an OSC-specific way. The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way (that is, OSCMessage-objects behave a lot like lists) +- OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages a bundle contains will have OSC-addresses!) Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until the specified time. The OSCBundle class allows easy cration & manipulation of OSC-bundles. + +see also http://opensoundcontrol.org/spec-1_0 + +--------- + +To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. + +The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. + +The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles +incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered +to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message + +The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. + +In fact, this implementation supports: + +- OSC-messages with `i` (int32), `f` (float32), `s` (string) and `b` (blob / binary data) types +- OSC-bundles, including timetag-support +- OSC-address patterns including `*`, `?`, `{,}` and `[]` wildcards. + +(please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) + +In addition, the `OSCMultiClient` supports: + +- Sending a specific OSC-message to multiple remote servers +- Remote server subscription / unsubscription (through OSC-messages, of course) +- Message-address filtering. + +The streaming server and clients use `SOCK_STREAM` sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. + +--------- + +Stock, V2_Lab, Rotterdam, 2008 + +---------- +Changelog: +---------- +v0.3.0 - 27 Dec. 2007 + Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. + Rewrote OSCMessage + Added OSCBundle + +v0.3.1 - 3 Jan. 2008 + Added OSClient + Added OSCRequestHandler, loosely based on the original CallbackManager + Added OSCServer + Removed original CallbackManager + Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client + +v0.3.2 - 5 Jan. 2008 + Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage + Added ThreadingOSCServer & ForkingOSCServer + - 6 Jan. 2008 + Added OSCMultiClient + Added command-line options to testing-script (try 'python OSC.py --help') + +v0.3.3 - 9 Jan. 2008 + Added OSC-timetag support to OSCBundle & OSCRequestHandler + Added ThreadingOSCRequestHandler + +v0.3.4 - 13 Jan. 2008 + Added message-filtering to OSCMultiClient + Added subscription-handler to OSCServer + Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) + Cleaned-up and added more Docstrings + +v0.3.5 - 14 aug. 2008 + Added OSCServer.reportErr(...) method + +v0.3.6 - 19 April 2010 + Added Streaming support (OSC over TCP) + Updated documentation + Moved pattern matching stuff into separate class (OSCAddressSpace) to + facilitate implementation of different server and client architectures. + Moved testing code into separate testbench (testbench.py) + +----------------- +Original Comments +----------------- + +> Open SoundControl for Python +> Copyright (C) 2002 Daniel Holth, Clinton McChesney +> +> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +> +> This library 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 Lesser General Public License for more details. + +> You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +> For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ + +> Changelog: +> 15 Nov. 2001: +> Removed dependency on Python 2.0 features. +> - dwh +> 13 Feb. 2002: +> Added a generic callback handler. +> - dwh + +## INSTALLING + +To install, simply run + + $ sudo ./setup.py install + +and provide your password. That's it. After this, you can use the 'pyOSC' module in your python scripts by doing + + import OSC + +## DOCUMENTATION + +To get help, run + + $ pydoc OSC + +or, from within a python interpreter + + import OSC + help(OSC) + +## TESTING + +This package contains an OSC testing program (`testbench.py`). Please have a good look at the source for this program for an example on how to use this module. + +To get help on how to invoke the test-program, run + + $ python testbench.py --help + +Usage: `testbench.py [options]` + + testbench.py OpenSoundControl-for-Python Test Program + +Options: + + -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) + From 346e70cda64b5481ebb0e255dcebb5432a3eb524 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:02:30 +1000 Subject: [PATCH 05/13] formatting --- README.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.txt b/README.txt index 0b26bcb..0723f7c 100644 --- a/README.txt +++ b/README.txt @@ -153,10 +153,16 @@ Usage: `testbench.py [options]` Options: -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) From a669dec7cfd861f553a7700953dd4ac10e58bdef Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:04:05 +1000 Subject: [PATCH 06/13] formatting --- README.md | 74 ++++++++++++++++++++++++------------------------------- 1 file changed, 32 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 64e0643..414b19a 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ ## NOTE -This documentation is very similar to the header in OSC.py. One day both should be merged and placed either in this file or in OSC.py to avoid diverging documentation. +This documentation is very similar to the header in `OSC.py`. One day both should be merged and placed either in this file or in `OSC.py` to avoid diverging documentation. ## DESCRIPTION This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. -This implementation is intended to still be 'Simple' to the user, but much more complete (with OSCServer & OSCClient classes) and much more powerful (the OSCMultiClient supports subscriptions & message-filtering, OSCMessage & OSCBundle are now proper container-types) +This implementation is intended to still be 'Simple' to the user, but much more complete (with `OSCServer` & `OSCClient` classes) and much more powerful (the `OSCMultiClient` supports subscriptions & message-filtering, `OSCMessage` & `OSCBundle` are now proper container-types) -# OpenSoundControl +## OpenSoundControl OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. -In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. +In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. OSC-packets come in two kinds: @@ -24,30 +24,29 @@ see also http://opensoundcontrol.org/spec-1_0 To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. -The OSCClient uses an 'AF_INET / SOCK_DGRAM' type socket (see the 'socket' module) to send binary representations of OSC-messages to a remote host:port address. +The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. -The OSCServer listens on an 'AF_INET / SOCK_DGRAM' type socket bound to a local port, and handles -incoming requests. Either one-after-the-other (OSCServer) or in a multi-threaded / multi-process fashion -(ThreadingOSCServer / ForkingOSCServer). If the Server has a callback-function (a.k.a. handler) registered +The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles +incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message -The different OSCServers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. +The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. In fact, this implementation supports: -- OSC-messages with 'i' (int32), 'f' (float32), 's' (string) and 'b' (blob / binary data) types +- OSC-messages with `i` (int32), `f` (float32), `s` (string) and `b` (blob / binary data) types - OSC-bundles, including timetag-support -- OSC-address patterns including '*', '?', '{,}' and '[]' wildcards. +- OSC-address patterns including `*`, `?`, `{,}` and `[]` wildcards. (please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) -In addition, the OSCMultiClient supports: +In addition, the `OSCMultiClient` supports: - Sending a specific OSC-message to multiple remote servers - Remote server subscription / unsubscription (through OSC-messages, of course) - Message-address filtering. -The streaming server and clients use SOCK_STREAM sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. +The streaming server and clients use `SOCK_STREAM` sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. --------- @@ -101,23 +100,14 @@ Original Comments > Open SoundControl for Python > Copyright (C) 2002 Daniel Holth, Clinton McChesney -> -> This library is free software; you can redistribute it and/or modify it under -> the terms of the GNU Lesser General Public License as published by the Free -> Software Foundation; either version 2.1 of the License, or (at your option) any -> later version. -> -> This library 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 Lesser General Public License for more -> details. - -> You should have received a copy of the GNU Lesser General Public License along -> with this library; if not, write to the Free Software Foundation, Inc., 59 -> Temple Place, Suite 330, Boston, MA 02111-1307 USA - -> For questions regarding this module contact Daniel Holth -> or visit http://www.stetson.edu/~ProctoLogic/ +> +> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +> +> This library 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 Lesser General Public License for more details. + +> You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +> For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ > Changelog: > 15 Nov. 2001: @@ -133,8 +123,7 @@ To install, simply run $ sudo ./setup.py install -and provide your password. -That's it. After this, you can use the 'pyOSC' module in your python-scripts by doing +and provide your password. That's it. After this, you can use the 'pyOSC' module in your python scripts by doing import OSC @@ -144,29 +133,30 @@ To get help, run $ pydoc OSC -or, from within a python-interpreter +or, from within a python interpreter import OSC help(OSC) ## TESTING -This package contains an OSC-testing program (testbench.py). Please have a good look at the source for this program for an example on how to use this module. +This package contains an OSC testing program (`testbench.py`). Please have a good look at the source for this program for an example on how to use this module. To get help on how to invoke the test-program, run $ python testbench.py --help -Usage: testbench.py [options] +Usage: `testbench.py [options]` testbench.py OpenSoundControl-for-Python Test Program Options: - -h, --help show this help message and exit - -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' - -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' - -t, --threading Test ThreadingOSCServer - -f, --forking Test ForkingOSCServer - -u, --usage Show this help message and exit - -c, --streaming Test streaming OSC (OSC over TCP) + + -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) From cedfc396262ebaad907d58660200ca75baa2aef6 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:05:14 +1000 Subject: [PATCH 07/13] formatting --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 414b19a..c59ee21 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,8 @@ Original Comments > For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ > Changelog: -> 15 Nov. 2001: -> Removed dependency on Python 2.0 features. -> - dwh -> 13 Feb. 2002: -> Added a generic callback handler. -> - dwh +> 15 Nov. 2001: Removed dependency on Python 2.0 features. - dwh +> 13 Feb. 2002: Added a generic callback handler. - dwh ## INSTALLING From 77eef0f6803a103d9eda576c9c1f16509abea992 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:06:39 +1000 Subject: [PATCH 08/13] formatting and removed txt readme --- README.txt | 168 ----------------------------------------------------- 1 file changed, 168 deletions(-) delete mode 100644 README.txt diff --git a/README.txt b/README.txt deleted file mode 100644 index 0723f7c..0000000 --- a/README.txt +++ /dev/null @@ -1,168 +0,0 @@ -## NOTE - -This documentation is very similar to the header in `OSC.py`. One day both should be merged and placed either in this file or in `OSC.py` to avoid diverging documentation. - -## DESCRIPTION -This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. - -This implementation is intended to still be 'Simple' to the user, but much more complete (with `OSCServer` & `OSCClient` classes) and much more powerful (the `OSCMultiClient` supports subscriptions & message-filtering, `OSCMessage` & `OSCBundle` are now proper container-types) - -## OpenSoundControl - -OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. - -In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. - -OSC-packets come in two kinds: - -- OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), and finally the arguments themselves, encoded in an OSC-specific way. The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way (that is, OSCMessage-objects behave a lot like lists) -- OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages a bundle contains will have OSC-addresses!) Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until the specified time. The OSCBundle class allows easy cration & manipulation of OSC-bundles. - -see also http://opensoundcontrol.org/spec-1_0 - ---------- - -To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. - -The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. - -The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles -incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered -to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message - -The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. - -In fact, this implementation supports: - -- OSC-messages with `i` (int32), `f` (float32), `s` (string) and `b` (blob / binary data) types -- OSC-bundles, including timetag-support -- OSC-address patterns including `*`, `?`, `{,}` and `[]` wildcards. - -(please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) - -In addition, the `OSCMultiClient` supports: - -- Sending a specific OSC-message to multiple remote servers -- Remote server subscription / unsubscription (through OSC-messages, of course) -- Message-address filtering. - -The streaming server and clients use `SOCK_STREAM` sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. - ---------- - -Stock, V2_Lab, Rotterdam, 2008 - ----------- -Changelog: ----------- -v0.3.0 - 27 Dec. 2007 - Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. - Rewrote OSCMessage - Added OSCBundle - -v0.3.1 - 3 Jan. 2008 - Added OSClient - Added OSCRequestHandler, loosely based on the original CallbackManager - Added OSCServer - Removed original CallbackManager - Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client - -v0.3.2 - 5 Jan. 2008 - Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage - Added ThreadingOSCServer & ForkingOSCServer - - 6 Jan. 2008 - Added OSCMultiClient - Added command-line options to testing-script (try 'python OSC.py --help') - -v0.3.3 - 9 Jan. 2008 - Added OSC-timetag support to OSCBundle & OSCRequestHandler - Added ThreadingOSCRequestHandler - -v0.3.4 - 13 Jan. 2008 - Added message-filtering to OSCMultiClient - Added subscription-handler to OSCServer - Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) - Cleaned-up and added more Docstrings - -v0.3.5 - 14 aug. 2008 - Added OSCServer.reportErr(...) method - -v0.3.6 - 19 April 2010 - Added Streaming support (OSC over TCP) - Updated documentation - Moved pattern matching stuff into separate class (OSCAddressSpace) to - facilitate implementation of different server and client architectures. - Moved testing code into separate testbench (testbench.py) - ------------------ -Original Comments ------------------ - -> Open SoundControl for Python -> Copyright (C) 2002 Daniel Holth, Clinton McChesney -> -> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. -> -> This library 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 Lesser General Public License for more details. - -> You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -> For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ - -> Changelog: -> 15 Nov. 2001: -> Removed dependency on Python 2.0 features. -> - dwh -> 13 Feb. 2002: -> Added a generic callback handler. -> - dwh - -## INSTALLING - -To install, simply run - - $ sudo ./setup.py install - -and provide your password. That's it. After this, you can use the 'pyOSC' module in your python scripts by doing - - import OSC - -## DOCUMENTATION - -To get help, run - - $ pydoc OSC - -or, from within a python interpreter - - import OSC - help(OSC) - -## TESTING - -This package contains an OSC testing program (`testbench.py`). Please have a good look at the source for this program for an example on how to use this module. - -To get help on how to invoke the test-program, run - - $ python testbench.py --help - -Usage: `testbench.py [options]` - - testbench.py OpenSoundControl-for-Python Test Program - -Options: - - -h, --help show this help message and exit - - -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' - - -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' - - -t, --threading Test ThreadingOSCServer - - -f, --forking Test ForkingOSCServer - - -u, --usage Show this help message and exit - - -c, --streaming Test streaming OSC (OSC over TCP) - From 170181e02c99e87c6bc12420eb73d315e2be8806 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 7 Jul 2014 16:12:19 +1000 Subject: [PATCH 09/13] formatting --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c59ee21..7dc0a74 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ Original Comments ----------------- > Open SoundControl for Python +> > Copyright (C) 2002 Daniel Holth, Clinton McChesney > > This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. @@ -110,7 +111,9 @@ Original Comments > For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ > Changelog: +> > 15 Nov. 2001: Removed dependency on Python 2.0 features. - dwh +> > 13 Feb. 2002: Added a generic callback handler. - dwh ## INSTALLING From 6288f70bcdba24315939d172416214afa9c094b7 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 3 Nov 2014 13:06:57 +1100 Subject: [PATCH 10/13] Revert dbcc1fd..170181e This rolls back to commit dbcc1fd71326c775b74d451cad7016e779c0c19a. --- README.md | 161 -------------------------------------------- README.txt | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 161 deletions(-) delete mode 100644 README.md create mode 100644 README.txt diff --git a/README.md b/README.md deleted file mode 100644 index 7dc0a74..0000000 --- a/README.md +++ /dev/null @@ -1,161 +0,0 @@ -## NOTE - -This documentation is very similar to the header in `OSC.py`. One day both should be merged and placed either in this file or in `OSC.py` to avoid diverging documentation. - -## DESCRIPTION -This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. - -This implementation is intended to still be 'Simple' to the user, but much more complete (with `OSCServer` & `OSCClient` classes) and much more powerful (the `OSCMultiClient` supports subscriptions & message-filtering, `OSCMessage` & `OSCBundle` are now proper container-types) - -## OpenSoundControl - -OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. - -In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. - -OSC-packets come in two kinds: - -- OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), and finally the arguments themselves, encoded in an OSC-specific way. The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way (that is, OSCMessage-objects behave a lot like lists) -- OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages a bundle contains will have OSC-addresses!) Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until the specified time. The OSCBundle class allows easy cration & manipulation of OSC-bundles. - -see also http://opensoundcontrol.org/spec-1_0 - ---------- - -To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. - -The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. - -The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles -incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered -to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message - -The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. - -In fact, this implementation supports: - -- OSC-messages with `i` (int32), `f` (float32), `s` (string) and `b` (blob / binary data) types -- OSC-bundles, including timetag-support -- OSC-address patterns including `*`, `?`, `{,}` and `[]` wildcards. - -(please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) - -In addition, the `OSCMultiClient` supports: - -- Sending a specific OSC-message to multiple remote servers -- Remote server subscription / unsubscription (through OSC-messages, of course) -- Message-address filtering. - -The streaming server and clients use `SOCK_STREAM` sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. - ---------- - -Stock, V2_Lab, Rotterdam, 2008 - ----------- -Changelog: ----------- -v0.3.0 - 27 Dec. 2007 - Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. - Rewrote OSCMessage - Added OSCBundle - -v0.3.1 - 3 Jan. 2008 - Added OSClient - Added OSCRequestHandler, loosely based on the original CallbackManager - Added OSCServer - Removed original CallbackManager - Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client - -v0.3.2 - 5 Jan. 2008 - Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage - Added ThreadingOSCServer & ForkingOSCServer - - 6 Jan. 2008 - Added OSCMultiClient - Added command-line options to testing-script (try 'python OSC.py --help') - -v0.3.3 - 9 Jan. 2008 - Added OSC-timetag support to OSCBundle & OSCRequestHandler - Added ThreadingOSCRequestHandler - -v0.3.4 - 13 Jan. 2008 - Added message-filtering to OSCMultiClient - Added subscription-handler to OSCServer - Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) - Cleaned-up and added more Docstrings - -v0.3.5 - 14 aug. 2008 - Added OSCServer.reportErr(...) method - -v0.3.6 - 19 April 2010 - Added Streaming support (OSC over TCP) - Updated documentation - Moved pattern matching stuff into separate class (OSCAddressSpace) to - facilitate implementation of different server and client architectures. - Moved testing code into separate testbench (testbench.py) - ------------------ -Original Comments ------------------ - -> Open SoundControl for Python -> -> Copyright (C) 2002 Daniel Holth, Clinton McChesney -> -> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. -> -> This library 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 Lesser General Public License for more details. - -> You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -> For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ - -> Changelog: -> -> 15 Nov. 2001: Removed dependency on Python 2.0 features. - dwh -> -> 13 Feb. 2002: Added a generic callback handler. - dwh - -## INSTALLING - -To install, simply run - - $ sudo ./setup.py install - -and provide your password. That's it. After this, you can use the 'pyOSC' module in your python scripts by doing - - import OSC - -## DOCUMENTATION - -To get help, run - - $ pydoc OSC - -or, from within a python interpreter - - import OSC - help(OSC) - -## TESTING - -This package contains an OSC testing program (`testbench.py`). Please have a good look at the source for this program for an example on how to use this module. - -To get help on how to invoke the test-program, run - - $ python testbench.py --help - -Usage: `testbench.py [options]` - - testbench.py OpenSoundControl-for-Python Test Program - -Options: - - -h, --help show this help message and exit - -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' - -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' - -t, --threading Test ThreadingOSCServer - -f, --forking Test ForkingOSCServer - -u, --usage Show this help message and exit - -c, --streaming Test streaming OSC (OSC over TCP) - diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..b12e9bb --- /dev/null +++ b/README.txt @@ -0,0 +1,194 @@ +NOTE + This documentation is very similar to the header in OSC.py. One day both should be merged and placed either + in this file or in OSC.py to avoid diverging documentation. + +DESCRIPTION + This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the + good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. + + This implementation is intended to still be 'Simple' to the user, but much more complete + (with OSCServer & OSCClient classes) and much more powerful + (the OSCMultiClient supports subscriptions & message-filtering, + OSCMessage & OSCBundle are now proper container-types) + + ================ + OpenSoundControl + ================ + + OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. + The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. + + In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more + common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC + specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size + as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new + implementation provides server and client classes. Their use is illustrated in the testbench. + + OSC-packets come in two kinds: + - OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), + followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), + and finally the arguments themselves, encoded in an OSC-specific way. + The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way + (that is, OSCMessage-objects behave a lot like lists) + + - OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. + (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) + OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages + a bundle contains will have OSC-addresses!) + Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until + the specified time. + The OSCBundle class allows easy cration & manipulation of OSC-bundles. + + see also http://opensoundcontrol.org/spec-1_0 + + --------- + + To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. + + The OSCClient uses an 'AF_INET / SOCK_DGRAM' type socket (see the 'socket' module) to send + binary representations of OSC-messages to a remote host:port address. + + The OSCServer listens on an 'AF_INET / SOCK_DGRAM' type socket bound to a local port, and handles + incoming requests. Either one-after-the-other (OSCServer) or in a multi-threaded / multi-process fashion + (ThreadingOSCServer / ForkingOSCServer). If the Server has a callback-function (a.k.a. handler) registered + to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message + + The different OSCServers implemented here all support the (recursive) un-bundling of OSC-bundles, + and OSC-bundle timetags. + + In fact, this implementation supports: + + - OSC-messages with 'i' (int32), 'f' (float32), 's' (string) and 'b' (blob / binary data) types + - OSC-bundles, including timetag-support + - OSC-address patterns including '*', '?', '{,}' and '[]' wildcards. + + (please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) + + In addition, the OSCMultiClient supports: + - Sending a specific OSC-message to multiple remote servers + - Remote server subscription / unsubscription (through OSC-messages, of course) + - Message-address filtering. + + The streaming server and clients use SOCK_STREAM sockets. Since this protocol is connection oriented + replies are usually sent to the peer and not to a random server/client as in UDP implementations. If + one likes to send messages to other clients/servers, a separate connection has to be established. + + --------- + + Stock, V2_Lab, Rotterdam, 2008 + + ---------- + Changelog: + ---------- + v0.3.0 - 27 Dec. 2007 + Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. + Rewrote OSCMessage + Added OSCBundle + + v0.3.1 - 3 Jan. 2008 + Added OSClient + Added OSCRequestHandler, loosely based on the original CallbackManager + Added OSCServer + Removed original CallbackManager + Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client + + v0.3.2 - 5 Jan. 2008 + Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage + Added ThreadingOSCServer & ForkingOSCServer + - 6 Jan. 2008 + Added OSCMultiClient + Added command-line options to testing-script (try 'python OSC.py --help') + + v0.3.3 - 9 Jan. 2008 + Added OSC-timetag support to OSCBundle & OSCRequestHandler + Added ThreadingOSCRequestHandler + + v0.3.4 - 13 Jan. 2008 + Added message-filtering to OSCMultiClient + Added subscription-handler to OSCServer + Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) + Cleaned-up and added more Docstrings + + v0.3.5 - 14 aug. 2008 + Added OSCServer.reportErr(...) method + + v0.3.6 - 19 April 2010 + Added Streaming support (OSC over TCP) + Updated documentation + Moved pattern matching stuff into separate class (OSCAddressSpace) to + facilitate implementation of different server and client architectures. + Moved testing code into separate testbench (testbench.py) + + ----------------- + Original Comments + ----------------- + + > Open SoundControl for Python + > Copyright (C) 2002 Daniel Holth, Clinton McChesney + > + > This library is free software; you can redistribute it and/or modify it under + > the terms of the GNU Lesser General Public License as published by the Free + > Software Foundation; either version 2.1 of the License, or (at your option) any + > later version. + > + > This library 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 Lesser General Public License for more + > details. + + > You should have received a copy of the GNU Lesser General Public License along + > with this library; if not, write to the Free Software Foundation, Inc., 59 + > Temple Place, Suite 330, Boston, MA 02111-1307 USA + + > For questions regarding this module contact Daniel Holth + > or visit http://www.stetson.edu/~ProctoLogic/ + + > Changelog: + > 15 Nov. 2001: + > Removed dependency on Python 2.0 features. + > - dwh + > 13 Feb. 2002: + > Added a generic callback handler. + > - dwh + +INSTALLING + To install, simply run + + $ sudo ./setup.py install + + and provide your password. + That's it. After this, you can use the 'pyOSC' module in your python-scripts by doing + + import OSC + +DOCUMENTATION + To get help, run + + $ pydoc OSC + + or, from within a python-interpreter + + >>> import OSC + >>> help(OSC) + +TESTING + This package contains an OSC-testing program (testbench.py). + Please have a good look at the source for this program for an example on how to use this module. + + To get help on how to invoke the test-program, run + + $ python testbench.py --help + + Usage: testbench.py [options] + + testbench.py OpenSoundControl-for-Python Test Program + + Options: + -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) + From adb86841652356684de9e0ea2d63b11ce6ec5b95 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 3 Nov 2014 13:10:31 +1100 Subject: [PATCH 11/13] Changed readme to Markdown formatting. --- README.txt | 317 ++++++++++++++++++++++++----------------------------- 1 file changed, 142 insertions(+), 175 deletions(-) diff --git a/README.txt b/README.txt index b12e9bb..7dc0a74 100644 --- a/README.txt +++ b/README.txt @@ -1,194 +1,161 @@ -NOTE - This documentation is very similar to the header in OSC.py. One day both should be merged and placed either - in this file or in OSC.py to avoid diverging documentation. - -DESCRIPTION - This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the - good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. - - This implementation is intended to still be 'Simple' to the user, but much more complete - (with OSCServer & OSCClient classes) and much more powerful - (the OSCMultiClient supports subscriptions & message-filtering, - OSCMessage & OSCBundle are now proper container-types) - - ================ - OpenSoundControl - ================ - - OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. - The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. - - In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more - common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC - specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size - as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new - implementation provides server and client classes. Their use is illustrated in the testbench. - - OSC-packets come in two kinds: - - OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), - followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), - and finally the arguments themselves, encoded in an OSC-specific way. - The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way - (that is, OSCMessage-objects behave a lot like lists) - - - OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. - (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) - OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages - a bundle contains will have OSC-addresses!) - Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until - the specified time. - The OSCBundle class allows easy cration & manipulation of OSC-bundles. - - see also http://opensoundcontrol.org/spec-1_0 - - --------- - - To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. - - The OSCClient uses an 'AF_INET / SOCK_DGRAM' type socket (see the 'socket' module) to send - binary representations of OSC-messages to a remote host:port address. - - The OSCServer listens on an 'AF_INET / SOCK_DGRAM' type socket bound to a local port, and handles - incoming requests. Either one-after-the-other (OSCServer) or in a multi-threaded / multi-process fashion - (ThreadingOSCServer / ForkingOSCServer). If the Server has a callback-function (a.k.a. handler) registered - to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message - - The different OSCServers implemented here all support the (recursive) un-bundling of OSC-bundles, - and OSC-bundle timetags. - - In fact, this implementation supports: - - - OSC-messages with 'i' (int32), 'f' (float32), 's' (string) and 'b' (blob / binary data) types - - OSC-bundles, including timetag-support - - OSC-address patterns including '*', '?', '{,}' and '[]' wildcards. - - (please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) - - In addition, the OSCMultiClient supports: - - Sending a specific OSC-message to multiple remote servers - - Remote server subscription / unsubscription (through OSC-messages, of course) - - Message-address filtering. - - The streaming server and clients use SOCK_STREAM sockets. Since this protocol is connection oriented - replies are usually sent to the peer and not to a random server/client as in UDP implementations. If - one likes to send messages to other clients/servers, a separate connection has to be established. - - --------- - - Stock, V2_Lab, Rotterdam, 2008 - - ---------- - Changelog: - ---------- - v0.3.0 - 27 Dec. 2007 - Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. - Rewrote OSCMessage - Added OSCBundle - - v0.3.1 - 3 Jan. 2008 - Added OSClient - Added OSCRequestHandler, loosely based on the original CallbackManager - Added OSCServer - Removed original CallbackManager - Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client - - v0.3.2 - 5 Jan. 2008 - Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage - Added ThreadingOSCServer & ForkingOSCServer - - 6 Jan. 2008 - Added OSCMultiClient - Added command-line options to testing-script (try 'python OSC.py --help') - - v0.3.3 - 9 Jan. 2008 - Added OSC-timetag support to OSCBundle & OSCRequestHandler - Added ThreadingOSCRequestHandler - - v0.3.4 - 13 Jan. 2008 - Added message-filtering to OSCMultiClient - Added subscription-handler to OSCServer - Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) - Cleaned-up and added more Docstrings - - v0.3.5 - 14 aug. 2008 - Added OSCServer.reportErr(...) method - - v0.3.6 - 19 April 2010 - Added Streaming support (OSC over TCP) - Updated documentation - Moved pattern matching stuff into separate class (OSCAddressSpace) to - facilitate implementation of different server and client architectures. - Moved testing code into separate testbench (testbench.py) - - ----------------- - Original Comments - ----------------- - - > Open SoundControl for Python - > Copyright (C) 2002 Daniel Holth, Clinton McChesney - > - > This library is free software; you can redistribute it and/or modify it under - > the terms of the GNU Lesser General Public License as published by the Free - > Software Foundation; either version 2.1 of the License, or (at your option) any - > later version. - > - > This library 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 Lesser General Public License for more - > details. - - > You should have received a copy of the GNU Lesser General Public License along - > with this library; if not, write to the Free Software Foundation, Inc., 59 - > Temple Place, Suite 330, Boston, MA 02111-1307 USA - - > For questions regarding this module contact Daniel Holth - > or visit http://www.stetson.edu/~ProctoLogic/ - - > Changelog: - > 15 Nov. 2001: - > Removed dependency on Python 2.0 features. - > - dwh - > 13 Feb. 2002: - > Added a generic callback handler. - > - dwh - -INSTALLING - To install, simply run +## NOTE + +This documentation is very similar to the header in `OSC.py`. One day both should be merged and placed either in this file or in `OSC.py` to avoid diverging documentation. + +## DESCRIPTION +This module contains an OpenSoundControl implementation (in Pure Python), based (somewhat) on the good old 'SimpleOSC' implementation by Daniel Holth & Clinton McChesney. + +This implementation is intended to still be 'Simple' to the user, but much more complete (with `OSCServer` & `OSCClient` classes) and much more powerful (the `OSCMultiClient` supports subscriptions & message-filtering, `OSCMessage` & `OSCBundle` are now proper container-types) + +## OpenSoundControl + +OpenSoundControl is a network-protocol for sending (small) packets of addressed data over network sockets. The original OSC-implementation uses the UDP/IP protocol for sending and receiving packets. + +In early 2010 TCP was added as transport layer. The application of OSC as interprocess communication becomes more and more common and ask for increased reliability which can be accomodated by using TCP as transport. The OSC specifications 1.0 and 1.1 require that OSC data (messages and bundles) must be framed by their packet size as 32 bit integer in network byte order (which is big endian) when using streaming protocols. This new implementation provides server and client classes. Their use is illustrated in the testbench. + +OSC-packets come in two kinds: + +- OSC-messages consist of an 'address'-string (not to be confused with a (host:port) network-address!), followed by a string of 'typetags' associated with the message's arguments (ie. 'payload'), and finally the arguments themselves, encoded in an OSC-specific way. The OSCMessage class makes it easy to create & manipulate OSC-messages of this kind in a 'pythonesque' way (that is, OSCMessage-objects behave a lot like lists) +- OSC-bundles are a special type of OSC-message containing only OSC-messages as 'payload'. Recursively. (meaning; an OSC-bundle could contain other OSC-bundles, containing OSC-bundles etc.) OSC-bundles start with the special keyword '#bundle' and do not have an OSC-address. (but the OSC-messages a bundle contains will have OSC-addresses!) Also, an OSC-bundle can have a timetag, essentially telling the receiving Server to 'hold' the bundle until the specified time. The OSCBundle class allows easy cration & manipulation of OSC-bundles. + +see also http://opensoundcontrol.org/spec-1_0 + +--------- + +To send OSC-messages, you need an OSCClient, and to receive OSC-messages you need an OSCServer. + +The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. + +The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles +incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered +to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message + +The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags. + +In fact, this implementation supports: + +- OSC-messages with `i` (int32), `f` (float32), `s` (string) and `b` (blob / binary data) types +- OSC-bundles, including timetag-support +- OSC-address patterns including `*`, `?`, `{,}` and `[]` wildcards. + +(please *do* read the OSC-spec! http://opensoundcontrol.org/spec-1_0 it explains what these things mean.) + +In addition, the `OSCMultiClient` supports: + +- Sending a specific OSC-message to multiple remote servers +- Remote server subscription / unsubscription (through OSC-messages, of course) +- Message-address filtering. + +The streaming server and clients use `SOCK_STREAM` sockets. Since this protocol is connection oriented replies are usually sent to the peer and not to a random server/client as in UDP implementations. If one likes to send messages to other clients/servers, a separate connection has to be established. + +--------- + +Stock, V2_Lab, Rotterdam, 2008 + +---------- +Changelog: +---------- +v0.3.0 - 27 Dec. 2007 + Started out to extend the 'SimpleOSC' implementation (v0.2.3) by Daniel Holth & Clinton McChesney. + Rewrote OSCMessage + Added OSCBundle + +v0.3.1 - 3 Jan. 2008 + Added OSClient + Added OSCRequestHandler, loosely based on the original CallbackManager + Added OSCServer + Removed original CallbackManager + Adapted testing-script (the 'if __name__ == "__main__":' block at the end) to use new Server & Client + +v0.3.2 - 5 Jan. 2008 + Added 'container-type emulation' methods (getitem(), setitem(), __iter__() & friends) to OSCMessage + Added ThreadingOSCServer & ForkingOSCServer + - 6 Jan. 2008 + Added OSCMultiClient + Added command-line options to testing-script (try 'python OSC.py --help') + +v0.3.3 - 9 Jan. 2008 + Added OSC-timetag support to OSCBundle & OSCRequestHandler + Added ThreadingOSCRequestHandler + +v0.3.4 - 13 Jan. 2008 + Added message-filtering to OSCMultiClient + Added subscription-handler to OSCServer + Added support fon numpy/scipy int & float types. (these get converted to 'standard' 32-bit OSC ints / floats!) + Cleaned-up and added more Docstrings + +v0.3.5 - 14 aug. 2008 + Added OSCServer.reportErr(...) method + +v0.3.6 - 19 April 2010 + Added Streaming support (OSC over TCP) + Updated documentation + Moved pattern matching stuff into separate class (OSCAddressSpace) to + facilitate implementation of different server and client architectures. + Moved testing code into separate testbench (testbench.py) + +----------------- +Original Comments +----------------- + +> Open SoundControl for Python +> +> Copyright (C) 2002 Daniel Holth, Clinton McChesney +> +> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +> +> This library 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 Lesser General Public License for more details. + +> You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +> For questions regarding this module contact Daniel Holth or visit http://www.stetson.edu/~ProctoLogic/ + +> Changelog: +> +> 15 Nov. 2001: Removed dependency on Python 2.0 features. - dwh +> +> 13 Feb. 2002: Added a generic callback handler. - dwh + +## INSTALLING + +To install, simply run $ sudo ./setup.py install - and provide your password. - That's it. After this, you can use the 'pyOSC' module in your python-scripts by doing +and provide your password. That's it. After this, you can use the 'pyOSC' module in your python scripts by doing import OSC -DOCUMENTATION - To get help, run +## DOCUMENTATION + +To get help, run $ pydoc OSC - or, from within a python-interpreter +or, from within a python interpreter - >>> import OSC - >>> help(OSC) + import OSC + help(OSC) -TESTING - This package contains an OSC-testing program (testbench.py). - Please have a good look at the source for this program for an example on how to use this module. +## TESTING - To get help on how to invoke the test-program, run +This package contains an OSC testing program (`testbench.py`). Please have a good look at the source for this program for an example on how to use this module. + +To get help on how to invoke the test-program, run $ python testbench.py --help - Usage: testbench.py [options] +Usage: `testbench.py [options]` testbench.py OpenSoundControl-for-Python Test Program - Options: - -h, --help show this help message and exit - -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' - -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' - -t, --threading Test ThreadingOSCServer - -f, --forking Test ForkingOSCServer - -u, --usage Show this help message and exit - -c, --streaming Test streaming OSC (OSC over TCP) +Options: + + -h, --help show this help message and exit + -l LISTEN, --listen=LISTEN listen on given host[:port]. default = '0.0.0.0:2222' + -s SENDTO, --sendto=SENDTO send to given host[:port]. default = '127.0.0.1:2222' + -t, --threading Test ThreadingOSCServer + -f, --forking Test ForkingOSCServer + -u, --usage Show this help message and exit + -c, --streaming Test streaming OSC (OSC over TCP) From 77915d5edc5adafdcc4eaceea555f4b9a9163de4 Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 3 Nov 2014 13:11:23 +1100 Subject: [PATCH 12/13] changed readme file format --- README.txt => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.txt => README.md (100%) diff --git a/README.txt b/README.md similarity index 100% rename from README.txt rename to README.md From 1813b07795adf6f4bb7f107038b68cfeced4b81e Mon Sep 17 00:00:00 2001 From: cpmpercussion Date: Mon, 3 Nov 2014 17:54:56 +1100 Subject: [PATCH 13/13] small fixes --- OSC.py | 4 ++-- OSC.pyc | Bin 0 -> 101520 bytes README.md | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) create mode 100644 OSC.pyc diff --git a/OSC.py b/OSC.py index 74b162c..102e1c2 100755 --- a/OSC.py +++ b/OSC.py @@ -1160,7 +1160,7 @@ def connect(self, address): if self.server != None: self.server.return_port = address[1] -def sendto(self, msg, address, timeout=None): + def sendto(self, msg, address, timeout=None): """Send the given OSCMessage to the specified address (this uses a connectionless socket). - msg: OSCMessage (or OSCBundle) to be sent - address: (host, port) tuple specifing remote server to send the message to @@ -1864,7 +1864,7 @@ class OSCServer(UDPServer, OSCAddressSpace): Serves one request at-a-time, until the OSCServer is closed. The OSC address-pattern is matched against a set of OSC-adresses that have been registered to the server with a callback-function. - If the adress-pattern of the message machtes the registered address of a callback, + If the adress-pattern of the message matches the registered address of a callback, that function is called. """ diff --git a/OSC.pyc b/OSC.pyc new file mode 100644 index 0000000000000000000000000000000000000000..537c5fa09bd5ae02338fb92583ac75eac7e65eb7 GIT binary patch literal 101520 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

l>B%iexrQSlTc2vMit5ljY+QX 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 7dc0a74..a092074 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,7 @@ To send OSC-messages, you need an OSCClient, and to receive OSC-messages you nee The OSCClient uses an `AF_INET` / `SOCK_DGRAM` type socket (see the `socket` module) to send binary representations of OSC-messages to a remote host:port address. -The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles -incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered -to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message +The OSCServer listens on an `AF_INET` / `SOCK_DGRAM` type socket bound to a local port, and handles incoming requests. Either one-after-the-other (`OSCServer`) or in a multi-threaded / multi-process fashion (`ThreadingOSCServer` / `ForkingOSCServer`). If the Server has a callback-function (a.k.a. handler) registered to 'deal with' (i.e. handle) the received message's OSC-address, that function is called, passing it the (decoded) message The different OSC servers implemented here all support the (recursive) un-bundling of OSC-bundles, and OSC-bundle timetags.