176 lines
4.7 KiB
Python
176 lines
4.7 KiB
Python
#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
# -*- mode: Python -*-
|
|
|
|
'''
|
|
UDPcom for jamidi v0.1b
|
|
|
|
UDPcom.Start(serverIP, UDPORT)
|
|
Handler : udp_thread()
|
|
|
|
Read below for :
|
|
|
|
- MIDI NOTES use ;nmonv
|
|
- MIDI CCs use ;cmnd
|
|
|
|
'''
|
|
|
|
import midi3
|
|
|
|
#import socket
|
|
import types, json
|
|
import socket
|
|
import _thread, time
|
|
import midi3
|
|
import WScom, OSCom
|
|
import gstt
|
|
import time
|
|
|
|
#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())
|
|
|
|
def udp_thread():
|
|
|
|
while True:
|
|
payload, client_address = sock.recvfrom(1024)
|
|
udpath = payload.decode('utf_8')
|
|
if gstt.debug > 1:
|
|
print(GetTime(),"UDP got", udpath, "from", str(client_address))
|
|
#print(udpath[0:1], " ",udpath[1:2], " ",udpath[2:3], " ",udpath[3:4], " " )
|
|
|
|
if udpath[0:1] == "n":
|
|
Note(udpath)
|
|
|
|
if udpath[0:1] == "c":
|
|
CC(udpath)
|
|
|
|
if udpath[0:1] == "f":
|
|
FullCC(udpath)
|
|
|
|
time.sleep(0.005)
|
|
|
|
|
|
|
|
def Start(serverIP, UDPORT):
|
|
global sock
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
server = ( serverIP,UDPORT)
|
|
sock.bind(server)
|
|
_thread.start_new_thread(udp_thread, ())
|
|
|
|
|
|
'''
|
|
|
|
MIDI NOTES use ;nmonv
|
|
|
|
m : midi channel 0-F (0-15)
|
|
o : octave 0-8
|
|
n : Note A-G. For note with # : a-g
|
|
v : velocity 0-Z will output (v/36)*127
|
|
|
|
'''
|
|
def Note(udpnote):
|
|
|
|
if gstt.debug>0:
|
|
print()
|
|
print(GetTime(),'UDPNote from ORCA received', udpnote, udpnote[1:1])
|
|
|
|
midichannel = int(udpnote[1:2],36)
|
|
octave = int(udpnote[2:3],36)
|
|
note = udpnote[3:4]
|
|
velocity = (int(udpnote[4:5],36)/36)*127
|
|
|
|
#if gstt.debug>0:
|
|
print(GetTime(),'UDPNote from ORCA received:','midichannel:',midichannel,'octave:',octave,'note:',note,'velocity:',velocity)
|
|
|
|
|
|
#if octave < 9 or midichannel < 16 or int(note,36) < 10 or int(note,36) > 16:
|
|
if octave < 9 and midichannel < 16 and int(note,36) >= 10 and int(note,36) <= 16:
|
|
|
|
if note.istitle() == True:
|
|
notename = str(note.upper())+ str(octave)
|
|
else:
|
|
notename = str(note.upper())+ "#"+ str(octave)
|
|
|
|
if gstt.debug > 0:
|
|
print(GetTime(),"Incoming note", notename, "=", midi3.note2midi(notename), "velocity", velocity, "for channel", midichannel)
|
|
|
|
|
|
for mididevice in midi3.findJamDevices(gstt.oscname):
|
|
midi3.NoteOn(midi3.note2midi(notename), int(velocity), mididevice, midichannel-1)
|
|
|
|
# if sending note back to WS users :
|
|
#WScom.sendWSall("/"+midi3.findJamName(gstt.oscname, midichannel)+"/noteon "+str(midi3.note2midi(notename)))
|
|
|
|
else:
|
|
print(GetTime(),"Note", midichannel, octave, note, velocity,"had offchart parameters.")
|
|
|
|
|
|
'''
|
|
MIDI CCs base 36 use ;cmnd
|
|
|
|
m : midi channel 0-F (0-15)
|
|
n : number 0-Z (0-35)
|
|
d : data 0-Z will output (d/36)*127
|
|
'''
|
|
def CC(udpcc):
|
|
|
|
print()
|
|
midichannel = int(udpcc[1:2],36)
|
|
#midichannel = base36.index(udpcc[1:2].upper())
|
|
ccvr = int(udpcc[2:3],36)
|
|
ccvl = int((int(udpcc[3:4],36)/36)*127)
|
|
|
|
if midichannel < 16:
|
|
|
|
if gstt.debug > 0:
|
|
print(GetTime(),"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(midichannel, ccvr, ccvl, mididevice)
|
|
#midi3.cc(gstt.Confs[gstt.oscname][0]["midichan"], ccvr, ccvl, mididevice)
|
|
WScom.sendWSall("/"+midi3.findJamName(mididevice, midichannel)+"/cc/"+str(ccvr)+" "+str(ccvl))
|
|
else:
|
|
print(GetTime(),"Bad midichannel")
|
|
|
|
'''
|
|
MIDI Full CCs all 128 channels and data use ;fmnndd
|
|
|
|
m : midi channel 0-F (0-15)
|
|
nn : number 0-3J (0-127)
|
|
dd : data 0-3J (0-127)
|
|
'''
|
|
def FullCC(udpcc):
|
|
|
|
print()
|
|
midichannel = int(udpcc[1:2],36)
|
|
#midichannel = base36.index(udpcc[1:2].upper())
|
|
ccvr = int(udpcc[2:4],36)
|
|
ccvl = int(udpcc[4:6],36)
|
|
|
|
if midichannel < 16:
|
|
|
|
if gstt.debug > 0:
|
|
print(GetTime(),"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(midichannel, ccvr, ccvl, mididevice)
|
|
WScom.sendWSall("/"+midi3.findJamName(mididevice, midichannel)+"/cc/"+str(ccvr)+" "+str(ccvl))
|
|
|
|
else:
|
|
print(GetTime(),"Bad midichannel")
|
|
|