CI는 Github Checks에 의해 수행됩니다. 빌드 상태는 현재 커밋을 참조하세요.
Python2/3용 OSC의 최신 구현입니다.
OpenSoundControl은 UDP 기반 네트워크 프로토콜로, 이름에서 알 수 있듯이 시간에 민감한 메시지를 빠르게 전달하도록 설계되었으며 MIDI를 대체하도록 설계되었지만 다른 상황에도 잘 적용됩니다. 프로토콜은 사용하기 간단하며, OSC 주소는 http URL처럼 보이고 string, float, int 등과 같은 다양한 기본 유형을 허용합니다. 기본적으로 오버헤드가 적은 http POST로 생각할 수 있습니다.
OpenSoundControl.org에서 OSC에 대해 자세히 알아볼 수 있습니다.
pip install oscpy
서버(스레드)
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
또는 데코레이터 API를 사용할 수 있습니다.
서버(스레드)
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 ()
서버는 클라이언트이기도 합니다. 즉, 메시지를 보내고 다른 서버의 메시지에 응답할 수 있습니다.
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.' )
서버(비동기) (해야 할 일!)
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 ))
고객
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 ])
기본적으로 서버와 클라이언트는 osc 주소와 osc 문자열에 대해 유니코드 문자열이 아닌 바이트(인코딩된 문자열)를 사용합니다. 그러나 encoding
매개변수를 전달하여 문자열을 자동으로 인코딩하고 디코딩할 수 있으므로 콜백은 유니코드 문자열(python2의 경우 유니코드, python3의 경우 str)을 가져옵니다.
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
을 추가했습니다).
OSCPy는 디버깅을 돕기 위해 "oscli" 유틸리티를 제공합니다.
oscli dump
oscli send
서버에 메시지나 번들을 보냅니다. 자세한 내용은 oscli -h
참조하세요.
None
값은 직렬화에 허용되지 않습니다.기여 가이드를 확인하고 자유롭게 OSCPy를 개선해 보세요.
OSCPy는 MIT 라이선스 조건에 따라 출시됩니다. LICENSE.txt 파일을 참조하세요.