208 lines
5.2 KiB
Python
208 lines
5.2 KiB
Python
|
#!/usr/bin/python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
# -*- mode: Python -*-
|
||
|
|
||
|
'''
|
||
|
OSCcom for jamidi v0.1b
|
||
|
|
||
|
OSCom.Start(serverIP, OSCPORT)
|
||
|
default handler : handler(path, tags, args, source)
|
||
|
register particular OSC command in Start(): i.e oscserver.addMsgHandler( "/n", Note)
|
||
|
|
||
|
Launch
|
||
|
|
||
|
print("Launching OSC Server", serverIP,':', OSCPORT)
|
||
|
OSCom.Start(serverIP, OSCPORT)
|
||
|
|
||
|
'''
|
||
|
|
||
|
from . import midi3
|
||
|
|
||
|
#import socket
|
||
|
import types, json
|
||
|
from .OSC3 import OSCServer, OSCClient, OSCMessage
|
||
|
import _thread, time
|
||
|
from . import gstt
|
||
|
import WScom, UDPcom
|
||
|
from . import midi3
|
||
|
|
||
|
#base36 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
|
||
|
|
||
|
|
||
|
def GetTime():
|
||
|
return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())
|
||
|
|
||
|
# this method of reporting timeouts only works by convention
|
||
|
# that before calling handle_request() field .timed_out is
|
||
|
# set to False
|
||
|
def handle_timeout(self):
|
||
|
self.timed_out = True
|
||
|
|
||
|
|
||
|
def Start(serverIP, OSCPORT):
|
||
|
global oscserver
|
||
|
|
||
|
#print(GetTime(),gstt.oscname, gstt.Confs[gstt.oscname][0]["midichan"])
|
||
|
#print(gstt.Confs)
|
||
|
#print(gstt.Confs[gstt.oscname])
|
||
|
for i in range(len(gstt.Confs[gstt.oscname])):
|
||
|
print((GetTime(),gstt.oscname, gstt.Confs[gstt.oscname][i]["midichan"]))
|
||
|
|
||
|
oscserver = OSCServer( (serverIP, OSCPORT) )
|
||
|
oscserver.timeout = 0
|
||
|
# funny python's way to add a method to an instance of a class
|
||
|
import types
|
||
|
oscserver.handle_timeout = types.MethodType(handle_timeout, oscserver)
|
||
|
|
||
|
oscserver.addMsgHandler( "default", handler )
|
||
|
oscserver.addMsgHandler( "/n", Note)
|
||
|
oscserver.addMsgHandler( "/c", CC)
|
||
|
oscserver.addMsgHandler( "/p", PB)
|
||
|
_thread.start_new_thread(osc_thread, ())
|
||
|
|
||
|
|
||
|
# RAW OSC Frame available ?
|
||
|
def OSCframe():
|
||
|
# clear timed_out flag
|
||
|
oscserver.timed_out = False
|
||
|
# handle all pending requests then return
|
||
|
while not oscserver.timed_out:
|
||
|
oscserver.handle_request()
|
||
|
|
||
|
|
||
|
# OSC server Thread : handler, dacs reports and simulator points sender to UI.
|
||
|
def osc_thread():
|
||
|
|
||
|
#print("osc Thread launched")
|
||
|
try:
|
||
|
while True:
|
||
|
|
||
|
time.sleep(0.005)
|
||
|
OSCframe()
|
||
|
|
||
|
except Exception as e:
|
||
|
import sys, traceback
|
||
|
print('\n---------------------')
|
||
|
print(('Exception: %s' % e))
|
||
|
print('- - - - - - - - - - -')
|
||
|
traceback.print_tb(sys.exc_info()[2])
|
||
|
print("\n")
|
||
|
|
||
|
|
||
|
# Properly close the system. Todo
|
||
|
def Stop():
|
||
|
oscserver.close()
|
||
|
|
||
|
|
||
|
# default handler
|
||
|
def handler(path, tags, args, source):
|
||
|
|
||
|
oscaddress = ''.join(path.split("/"))
|
||
|
print()
|
||
|
print(("Jamidi Default OSC Handler got from " + str(source[0]),"OSC msg", path, "args", args))
|
||
|
#print("OSC address", path)
|
||
|
#print("find.. /bhoreal ?", path.find('/bhoreal'))
|
||
|
if len(args) > 0:
|
||
|
#print("with args", args)
|
||
|
pass
|
||
|
|
||
|
'''
|
||
|
# for example
|
||
|
if path == '/truc':
|
||
|
arg1 = args[0]
|
||
|
arg2 = args[1])
|
||
|
'''
|
||
|
|
||
|
'''
|
||
|
MIDI NOTES
|
||
|
=n in ORCA
|
||
|
/n in OSC
|
||
|
ORCA OSC
|
||
|
=nmonv /n m o n v
|
||
|
m : midi channel (0-15 / ORCA 0-F)
|
||
|
o : octave (0-8 / ORCA 0-7)
|
||
|
n : Note A to G
|
||
|
v : velocity 0-Z will output (v/36)*127
|
||
|
|
||
|
'''
|
||
|
def Note(path, tags, args, source):
|
||
|
|
||
|
#print('Note from ORCA received',args)
|
||
|
|
||
|
midichannel = int(args[0],36)
|
||
|
octave = int(args[1],36)
|
||
|
note = args[2]
|
||
|
velocity = int((int(args[3],36)/36)*127)
|
||
|
|
||
|
if note.istitle() == True:
|
||
|
notename = str(note)+ str(octave)
|
||
|
else:
|
||
|
notename = str(note)+ "#"+ str(octave)
|
||
|
|
||
|
if gstt.debug > 0:
|
||
|
print(("incoming note", note, octave, notename, midi3.note2midi(notename) ))
|
||
|
|
||
|
for mididevice in midi3.findJamDevices(gstt.oscname):
|
||
|
midi3.NoteOn(midi3.note2midi(notename), velocity, mididevice)
|
||
|
#midi3.NoteOn(int(wspath[1]), int(wspath[2]), gstt.Confs[wscommand[1]][0]["mididevice"])
|
||
|
|
||
|
|
||
|
'''
|
||
|
CC
|
||
|
=c in ORCA
|
||
|
/c in OSC
|
||
|
|
||
|
ORCA OSC
|
||
|
=cmcd /c m n d
|
||
|
m : midi channel
|
||
|
n : number (0-35 / ORCA 0-Z)
|
||
|
d : data 0-Z will output (d/36)*127
|
||
|
'''
|
||
|
def CC(path, tags, args, source):
|
||
|
|
||
|
midichannel = int(args[0],36)
|
||
|
ccvr = int(args[1],36)
|
||
|
ccvl = int((int(args[2],36)/36)*127)
|
||
|
|
||
|
if gstt.debug > 0:
|
||
|
print(("ccvr=%d/ccvl=%d"%(ccvr,ccvl)))
|
||
|
if gstt.oscname == "ocs2":
|
||
|
gstt.crtvalueOCS2[ccvr]=ccvl
|
||
|
else:
|
||
|
gstt.crtvalueMMO3[ccvr]=ccvl
|
||
|
|
||
|
for mididevice in midi3.findJamDevices(gstt.oscname):
|
||
|
midi3.cc(gstt.Confs[gstt.oscname][0]["midichan"], ccvr, ccvl, mididevice)
|
||
|
|
||
|
|
||
|
|
||
|
def PB(path, tags, args, source):
|
||
|
|
||
|
#print("Pitch number",ccnumber, value)
|
||
|
midichannel = int(args[0])
|
||
|
ccnumber = int(args[1])
|
||
|
ccdata = int(args[3])
|
||
|
|
||
|
'''
|
||
|
# If needed to send some OSC
|
||
|
def SendOSC(ip,port,oscaddress,oscargs=''):
|
||
|
|
||
|
oscmsg = OSCMessage()
|
||
|
oscmsg.setAddress(oscaddress)
|
||
|
oscmsg.append(oscargs)
|
||
|
|
||
|
osclient = OSCClient()
|
||
|
osclient.connect((ip, port))
|
||
|
|
||
|
if gstt.debug == True :
|
||
|
print("sending OSC message : ", oscmsg, "to", ip, ":", port)
|
||
|
|
||
|
try:
|
||
|
osclient.sendto(oscmsg, (ip, port))
|
||
|
oscmsg.clearData()
|
||
|
return True
|
||
|
except:
|
||
|
print ('Connection to', ip, 'refused : died ?')
|
||
|
return False
|
||
|
'''
|