oscpy
1.0.0
CI 由 Github Checks 完成,查看目前提交的建置狀態。
python2/3 OSC 的現代實作。
OpenSoundControl 是一種基於 UDP 的網路協議,專為快速調度時間敏感訊息而設計,顧名思義,它被設計為 MIDI 的替代品,但也適用於其他情況。協定使用簡單,OSC位址看起來像http URL,並接受各種基本類型,例如字串、浮點數、整數等。
您可以在 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.' )
伺服器(非同步)(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 ))
客戶
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 字串採用位元組(編碼字串),而不是 unicode 字串。但是,您可以傳遞一個encoding
參數,讓字串自動編碼和解碼,這樣您的回呼將獲得 unicode 字串(python2 中為 unicode,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 檔案。