• Stars
    star
    109
  • Rank 319,077 (Top 7 %)
  • Language
    Python
  • License
    MIT License
  • Created over 6 years ago
  • Updated 12 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An efficient OSC implementation compatible with python2.7 and 3.5+

OSCPy

Coverage Status CI is done by Github Checks, see the current commit for build status.

A modern implementation of OSC for python2/3.

What is OSC.

OpenSoundControl is an UDP based network protocol, that is designed for fast dispatching of time-sensitive messages, as the name suggests, it was designed as a replacement for MIDI, but applies well to other situations. The protocol is simple to use, OSC addresses look like http URLs, and accept various basic types, such as string, float, int, etc. You can think of it basically as an http POST, with less overhead.

You can learn more about OSC on OpenSoundControl.org

Goals

  • python2.7/3.6+ compatibility (can be relaxed more on the python3 side if needed, but nothing before 2.7 will be supported)
  • fast
  • easy to use
  • robust (returns meaningful errors in case of malformed messages, always do the right thing on correct messages, and by default intercept+log the exceptions raised by callbacks)
  • separation of concerns (message parsing vs communication)
  • sync and async compatibility (threads, asyncio, trio…)
  • clean and easy to read code

Features

  • serialize and parse OSC data types/Messages/Bundles
  • a thread based udp server to open sockets (INET or UNIX) and bind callbacks on osc addresses on them
  • a simple client

Install

pip install oscpy

Usage

Server (thread)

from oscpy.server import OSCThreadServer
from time import sleep

def callback(*values):
    print("got values: {}".format(values))

osc = OSCThreadServer()  # See sources for all the arguments

# You can also use an \*nix socket path here
sock = osc.listen(address='0.0.0.0', port=8000, default=True)
osc.bind(b'/address', callback)
sleep(1000)
osc.stop()  # Stop the default socket

osc.stop_all()  # Stop all sockets

# Here the server is still alive, one might call osc.listen() again

osc.terminate_server()  # Request the handler thread to stop looping

osc.join_server()  # Wait for the handler thread to finish pending tasks and exit

or you can use the decorator API.

Server (thread)

from oscpy.server import OSCThreadServer
from time import sleep

osc = OSCThreadServer()
sock = osc.listen(address='0.0.0.0', port=8000, default=True)

@osc.address(b'/address')
def callback(*values):
    print("got values: {}".format(values))

sleep(1000)
osc.stop()

Servers are also client, in the sense they can send messages and answer to messages from other servers

from oscpy.server import OSCThreadServer
from time import sleep

osc_1 = OSCThreadServer()
osc_1.listen(default=True)

@osc_1.address(b'/ping')
def ping(*values):
    print("ping called")
    if True in values:
        cont.append(True)
    else:
        osc_1.answer(b'/pong')

osc_2 = OSCThreadServer()
osc_2.listen(default=True)

@osc_2.address(b'/pong')
def pong(*values):
    print("pong called")
    osc_2.answer(b'/ping', [True])

osc_2.send_message(b'/ping', [], *osc_1.getaddress())

timeout = time() + 1
while not cont:
    if time() > timeout:
        raise OSError('timeout while waiting for success message.')

Server (async) (TODO!)

from oscpy.server import OSCThreadServer

with OSCAsyncServer(port=8000) as OSC:
    for address, values in OSC.listen():
       if address == b'/example':
            print("got {} on /example".format(values))
       else:
            print("unknown address {}".format(address))

Client

from oscpy.client import OSCClient

address = "127.0.0.1"
port = 8000

osc = OSCClient(address, port)
for i in range(10):
    osc.send_message(b'/ping', [i])

Unicode

By default, the server and client take bytes (encoded strings), not unicode strings, for osc addresses as well as osc strings. However, you can pass an encoding parameter to have your strings automatically encoded and decoded by them, so your callbacks will get unicode strings (unicode in python2, str in python3).

osc = OSCThreadServer(encoding='utf8')
osc.listen(default=True)

values = []

@osc.address(u'/encoded')
def encoded(*val):
    for v in val:
        assert not isinstance(v, bytes)
    values.append(val)

send_message(
    u'/encoded',
    [u'hello world', u'ééééé ààààà'],
    *osc.getaddress(), encoding='utf8')

(u literals added here for clarity).

CLI

OSCPy provides an "oscli" util, to help with debugging:

  • oscli dump to listen for messages and dump them
  • oscli send to send messages or bundles to a server

See oscli -h for more information.

GOTCHAS

  • None values are not allowed in serialization
  • Unix-type sockets must not already exist when you listen() on them

TODO

  • real support for timetag (currently only supports optionally dropping late bundles, not delaying those with timetags in the future)
  • support for additional argument types
  • an asyncio-oriented server implementation
  • examples & documentation

Contributing

Check out our contribution guide and feel free to improve OSCPy.

License

OSCPy is released under the terms of the MIT License. Please see the LICENSE.txt file.

More Repositories

1

kivy

Open source UI framework written in Python, running on Windows, Linux, macOS, Android and iOS
Python
17,477
star
2

python-for-android

Turn your Python application into an Android APK
Python
8,263
star
3

buildozer

Generic Python packager for Android and iOS
Python
1,708
star
4

plyer

Plyer is a platform-independent Python wrapper for platform-dependent APIs
Python
1,589
star
5

pyjnius

Access Java classes from Python
Python
1,384
star
6

kivy-designer

UI designer for Kivy - DEPRECATED
Python
815
star
7

kivy-ios

Toolchain for compiling Python / Kivy / other libraries for iOS
Python
771
star
8

kivent

KivEnt is an entity-based game engine for Kivy
Python
573
star
9

audiostream

Audio API for streaming raw data to speakers
Python
190
star
10

pyobjus

Access Objective-C classes from Python
Python
177
star
11

kivy-website

Website of kivy.org
HTML
166
star
12

kivy-remote-shell

Remote SSH + Python interactive shell in Kivy
Python
110
star
13

kivy-launcher

Reboot of the older Kivy launcher
Python
107
star
14

pythonar

python auto reloader
Python
44
star
15

kivy-sdk-packager

Scripts for Kivy SDK generation on Windows, OS X and Linux
Python
38
star
16

kivy-berkelium

Berkelium extension for Kivy - DEPRECATED, use https://github.com/kivy-garden/garden.cefpython instead.
Python
25
star
17

p4a-cloud

Build cloud for Python for android - DEPRECATED
HTML
22
star
18

piki

kivy games for raspberry pi
Python
18
star
19

aprofiler

Simple tool that allow you to emit start/end event, and marks
Python
17
star
20

kivy-server

Docker configuration for the Kivy server
Shell
12
star
21

pycon2013

pycon 2013 kivy presentation
JavaScript
9
star
22

kivy-ideas

Various ideas related to the Kivy project.
9
star
23

condiment

Conditionally include or remove code, according to the environment variables
Python
7
star
24

kivy-translations

This is the repository where Kivy translations are managed - DEPRECATED
Python
7
star
25

plyer_demo

an android app to showcase all plyer features
Python
4
star
26

kivy-design

Graphical elements used by the Kivy Organization
4
star
27

ncis

Python
4
star
28

angle-builder

Build and releases ANGLE binaries for different platforms
Python
4
star
29

ncis-inspector

A Kivy app to interact with the NCIS module in Kivy apps
Python
3
star
30

p4a-pygame-bootstrap-components

The jni components of the python-for-android pygame bootstrap
C
3
star
31

kivy_pong_demo

Demo kivy pong-game app
Python
3
star
32

templates

This is a template repository, supposed to help developers with getting a quick setup of a kivy app repository that uses GitHub actions to build packages for various platforms.
Python
2
star
33

ncis-kivy

an ncis module to inspect kivy applications
Python
1
star
34

ncis-python

Python
1
star
35

kivy-website-docs

1
star
36

mcnotify

GitHub App that comments on predefined issues after certain events
JavaScript
1
star