Skip to content

Repository files navigation

python-osc

Open Sound Control server and client implementations in pure python.

Current status

This library was developed following the OpenSoundControl Specification 1.0 and is currently in a stable state.

Features

  • UDP and TCP blocking/threading/forking/asyncio server implementations
  • UDP and TCP clients, including asyncio support
  • TCP support for 1.0 and 1.1 protocol formats
  • int, int64, float, string, double, MIDI, timestamps, blob, nil OSC arguments
  • simple OSC address<->callback matching system
  • support for sending responses from callback handlers in client and server
  • extensive unit test coverage
  • basic client and server examples

Documentation

Available at https://python-osc.readthedocs.io/.

Installation

python-osc is a pure python library that has no external dependencies, to install it just use pip (prefered):

$ pip install python-osc

Examples

Simple client

"""Small example OSC clientThis program sends 10 random values between 0.0 and 1.0 to the /filter address,waiting for 1 seconds between each value."""importargparseimportrandomimporttimefrompythonoscimportudp_clientif__name__=="__main__":
parser=argparse.ArgumentParser()
parser.add_argument("--ip", default="127.0.0.1",
help="The ip of the OSC server")
parser.add_argument("--port", type=int, default=5005,
help="The port the OSC server is listening on")
args=parser.parse_args()
client=udp_client.SimpleUDPClient(args.ip, args.port, timeout=10)
forxinrange(10):
client.send_message("/filter", random.random())
time.sleep(1)

Simple server

"""Small example OSC serverThis program listens to several addresses, and prints some information aboutreceived packets."""importargparseimportmathfrompythonosc.dispatcherimportDispatcherfrompythonoscimportosc_serverdefprint_volume_handler(unused_addr, args, volume):
print("[{0}] ~ {1}".format(args[0], volume))
defprint_compute_handler(unused_addr, args, volume):
try:
print("[{0}] ~ {1}".format(args[0], args[1](volume)))
exceptValueError: passif__name__=="__main__":
parser=argparse.ArgumentParser()
parser.add_argument("--ip",
default="127.0.0.1", help="The ip to listen on")
parser.add_argument("--port",
type=int, default=5005, help="The port to listen on")
args=parser.parse_args()
dispatcher=Dispatcher()
dispatcher.map("/filter", print)
dispatcher.map("/volume", print_volume_handler, "Volume")
dispatcher.map("/logvolume", print_compute_handler, "Log volume", math.log)
server=osc_server.ThreadingOSCUDPServer(
(args.ip, args.port), dispatcher, timeout=10)
print("Serving on {}".format(server.server_address))
server.serve_forever()

Building bundles

frompythonoscimportosc_bundle_builderfrompythonoscimportosc_message_builderbundle=osc_bundle_builder.OscBundleBuilder(
osc_bundle_builder.IMMEDIATELY)
msg=osc_message_builder.OscMessageBuilder(address="/SYNC")
msg.add_arg(4.0)
# Add 4 messages in the bundle, each with more arguments.bundle.add_content(msg.build())
msg.add_arg(2)
bundle.add_content(msg.build())
msg.add_arg("value")
bundle.add_content(msg.build())
msg.add_arg(b"\x01\x02\x03")
bundle.add_content(msg.build())
sub_bundle=bundle.build()
# Now add the same bundle inside itself.bundle.add_content(sub_bundle)
# The bundle has 5 elements in total now.bundle=bundle.build()
# You can now send it via a client with the `.send()` method:client.send(bundle)

License?

Unlicensed, do what you want with it. (http://unlicense.org)

About

Open Sound Control server and client in pure python

Topics

Resources

Contributing

Stars

580 stars

Watchers

28 watching

Forks

Releases

Packages

Used by

Contributors

Languages