2020-04-21 13:06:01 +00:00
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
'''
Jamidi Server v0 .1 b
2020-04-22 15:44:30 +00:00
wserver = WebsocketServer ( wsPORT , host = serverIP )
wserver . set_fn_new_client ( new_client )
wserver . set_fn_client_left ( client_left )
wserver . set_fn_message_received ( message_received )
wserver . run_forever ( )
wserver . send_message_to_all ( message )
2020-05-05 20:42:22 +00:00
ORCA :
CTRL K pour rentrer une commande
CTRL K ip : 127.0 .0 .1
CTRL K osc : 8082
CTRL K cc : 0
CTRL K udp : udport
/ p
Pitch bend
2020-04-22 15:44:30 +00:00
2020-04-21 13:06:01 +00:00
'''
print ( " " )
print ( " " )
print ( " Jamidi Server " )
print ( " v0.1b " )
import sys
import traceback
import os
import time
from rtmidi . midiconstants import ( CHANNEL_PRESSURE , CONTROLLER_CHANGE , NOTE_ON , NOTE_OFF ,
PITCH_BEND , POLY_PRESSURE , PROGRAM_CHANGE )
2020-04-22 15:44:30 +00:00
sys . path . append ( ' libs/ ' )
2020-04-21 13:06:01 +00:00
import midi3
#import socket
2020-04-21 23:05:50 +00:00
import types , json
2020-04-21 13:06:01 +00:00
import argparse
2020-05-05 20:42:22 +00:00
import _thread , time
2020-04-22 15:44:30 +00:00
2020-05-05 20:42:22 +00:00
from midi3 import note2midi
from midi3 import GetTime
import OSCom
import WScom
import UDPcom
import gstt
2020-04-21 13:06:01 +00:00
print ( " " )
print ( " Arguments parsing if needed... " )
argsparser = argparse . ArgumentParser ( description = " Jamidi Server v0.1b commands help mode " )
argsparser . add_argument ( " -s " , " --servername " , help = " Servername: ' local ' , ' llstrvpn ' (local by default) " , type = str )
2020-05-05 20:42:22 +00:00
argsparser . add_argument ( " -d " , " --device " , help = " midi device for incoming ORCA via UDP (mmo3 by default) " , type = str )
argsparser . add_argument ( ' -nothrough ' , help = " Disable the builtin midithrough from any midi IN to --device enabled by default " , dest = ' nothrough ' , action = ' store_true ' )
argsparser . set_defaults ( nothrough = False )
argsparser . add_argument ( ' -nocurrent ' , help = " Do not send all current CC values to all new client (enabled by default) " , dest = ' current ' , action = ' store_false ' )
2020-04-21 13:06:01 +00:00
argsparser . set_defaults ( current = True )
2020-05-05 20:42:22 +00:00
argsparser . add_argument ( ' -nobroadcast ' , help = " Do not broadcast all incomings commands to all client (enabled by default) " , dest = ' broadcast ' , action = ' store_false ' )
2020-04-21 13:06:01 +00:00
argsparser . set_defaults ( broadcast = True )
2020-05-05 20:42:22 +00:00
argsparser . add_argument ( ' -noreset ' , help = " Do not broadcast all incomings commands to all client (enabled by default) " , dest = ' reset ' , action = ' store_false ' )
argsparser . set_defaults ( reset = True )
argsparser . add_argument ( ' -verbose ' , help = " Enable debug mode (disabled by default) " , dest = ' verbose ' , action = ' store_true ' )
argsparser . set_defaults ( verbose = False )
2020-04-21 13:06:01 +00:00
args = argsparser . parse_args ( )
2020-05-02 00:38:06 +00:00
# Server name
2020-04-21 13:06:01 +00:00
if args . servername :
servername = args . servername
else :
servername = " local "
2020-05-05 20:42:22 +00:00
# ORCA destination device
if args . device :
gstt . oscname = args . device
else :
gstt . oscname = " mmo3 "
2020-04-21 13:06:01 +00:00
# Broadcast commands to all clients ?
if args . broadcast == False :
print ( " Broadcast disabled " )
2020-05-05 20:42:22 +00:00
gstt . broadcast = False
2020-04-21 13:06:01 +00:00
else :
print ( " Broadcast enabled " )
2020-05-05 20:42:22 +00:00
gstt . broadcast = True
2020-04-21 13:06:01 +00:00
# Send current values to all new client ?
if args . current == False :
print ( " Do not send current values at startup disabled " )
2020-05-05 20:42:22 +00:00
gstt . current = False
2020-04-21 13:06:01 +00:00
else :
print ( " Current values update at startup disabled " )
2020-05-05 20:42:22 +00:00
gstt . current = True
2020-04-21 13:06:01 +00:00
2020-04-22 15:44:30 +00:00
# Reset at startup ?
if args . reset == False :
print ( " Reset at startup disabled " )
2020-05-05 20:42:22 +00:00
gstt . startreset = False
2020-04-22 15:44:30 +00:00
else :
print ( " Reset at startup enabled " )
2020-05-05 20:42:22 +00:00
gstt . startreset = True
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
# Debug/verbose mode ?
if args . verbose == False :
print ( " Debug mode disabled " )
gstt . debug = 0
else :
print ( " Debug mode enabled " )
gstt . debug = 1
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
# nomidithrough mode ?
if args . nothrough == False :
print ( " Midi through mode " )
gstt . nothrough = False
else :
print ( " No midi through mode " )
gstt . nothrough = True
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
#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"}
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
'''
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 }
transpose =
" 0 " : None , " 1 " : None , " 2 " : None , " 3 " : , None , " 4 " : , None , " 5 " : , " 6 " : , " 7 " : , " 8 " : , " 9 " : , " A " : " A0 " , " B " : B0 ,
C , " C0 " , D : " D0 " , " E " : " E0 " F G H I J K L M N
" C0 " " D0 " " E0 " " F0 " " G0 " " A0 " " B0 " " C1 " " D1 " " E1 " " F1 " " G1 "
O P Q R S T U V W X Y Z
" A1 " " B1 " " C2 " " D2 " " E2 " " F2 " " G2 " " A2 " " B2 " " C3 " " D3 " " E3 "
'''
2020-04-21 23:05:50 +00:00
2020-04-21 13:06:01 +00:00
#
# Settings from jamidi.json
#
2020-04-22 15:44:30 +00:00
# Load midi definitions in jamidi.json
2020-04-21 13:06:01 +00:00
def LoadConfs ( ) :
if os . path . exists ( ' jamidi.json ' ) :
f = open ( " jamidi.json " , " r " )
s = f . read ( )
2020-05-05 20:42:22 +00:00
gstt . Confs = json . loads ( s )
#print(GetTime(),gstt.Confs)
2020-04-21 13:06:01 +00:00
2020-04-22 15:44:30 +00:00
# return midi confname number for given type
2020-04-21 13:06:01 +00:00
def findConfs ( confname , conftype ) :
#print("searching", midiconfname,'...')
position = - 1
2020-05-05 20:42:22 +00:00
for counter in range ( len ( gstt . Confs [ conftype ] ) ) :
if confname == gstt . Confs [ conftype ] [ counter ] [ ' name ' ] :
2020-04-21 13:06:01 +00:00
#print(confname, "is ", counter)
position = counter
return position
2020-05-05 20:42:22 +00:00
LoadConfs ( )
2020-04-21 13:06:01 +00:00
#
2020-05-05 20:42:22 +00:00
# Midi part
2020-04-21 13:06:01 +00:00
#
2020-05-05 20:42:22 +00:00
print ( " Midi Configuration... " )
# print("Midi Destination", nozmidi)
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
midi3 . check ( )
2020-05-02 00:38:06 +00:00
2020-05-05 20:42:22 +00:00
def GetTime ( ) :
return time . strftime ( " %a , %d % b % Y % H: % M: % S " , time . localtime ( ) )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
# /cc cc number value
def cc ( midichannel , ccnumber , value , mididest ) :
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
if gstt . debug > 0 :
print ( GetTime ( ) , " Jamidi Sending Midi channel " , midichannel , " cc " , ccnumber , " value " , value , " to " , mididest )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
midi3 . MidiMsg ( [ CONTROLLER_CHANGE + midichannel - 1 , ccnumber , value ] , mididest )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
# /reset nozoids with "default" values
def reset ( nozoid ) :
2020-04-21 13:06:01 +00:00
print ( " " )
2020-05-05 20:42:22 +00:00
print ( GetTime ( ) , " reseting " , nozoid )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
if nozoid == " mmo3 " :
for ccnumber in range ( 0 , 32 ) :
midi3 . MidiMsg ( [ CONTROLLER_CHANGE + gstt . Confs [ " mmo3 " ] [ 0 ] [ " midichan " ] - 1 , ccnumber , gstt . resetMMO3 [ ccnumber ] ] , gstt . Confs [ " mmo3 " ] [ 0 ] [ " mididevice " ] )
WScom . sendWSall ( " /mmo3/cc/ " + str ( ccnumber ) + " " + str ( gstt . resetMMO3 [ ccnumber ] ) )
gstt . crtvalueMMO3 [ ccnumber ] = gstt . resetMMO3 [ ccnumber ]
else :
for ccnumber in range ( 0 , 32 ) :
midi3 . MidiMsg ( [ CONTROLLER_CHANGE + gstt . Confs [ " ocs2 " ] [ 0 ] [ " midichan " ] - 1 , ccnumber , gstt . resetOCS2 [ ccnumber ] ] , gstt . Confs [ " ocs2 " ] [ 0 ] [ " mididevice " ] )
WScom . sendWSall ( " /ocs2/cc/ " + str ( ccnumber ) + " " + str ( gstt . resetOCS2 [ ccnumber ] ) )
gstt . crtvalueOCS2 [ ccnumber ] = gstt . resetOCS2 [ ccnumber ]
print ( GetTime ( ) , " End of reset for " , nozoid )
print ( " " )
2020-04-21 13:06:01 +00:00
2020-04-21 23:05:50 +00:00
#
# Running...
#
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
serverIP = gstt . Confs [ servername ] [ 0 ] [ " IP " ]
wsPORT = gstt . Confs [ servername ] [ 0 ] [ " port " ]
OSCPORT = gstt . Confs [ servername ] [ 0 ] [ " oscport " ]
UDPORT = gstt . Confs [ servername ] [ 0 ] [ " udport " ]
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
print ( )
print ( GetTime ( ) , " Launching servers... " )
print ( GetTime ( ) , " Launching OSC Server " , serverIP , ' : ' , OSCPORT )
OSCom . Start ( serverIP , OSCPORT )
2020-04-21 13:06:01 +00:00
2020-05-08 16:29:51 +00:00
print ( GetTime ( ) , " Launching UDP Server " , serverIP , ' : ' , wsPORT )
2020-05-05 20:42:22 +00:00
UDPcom . Start ( serverIP , UDPORT )
2020-05-08 16:29:51 +00:00
print ( GetTime ( ) , " Launching WS Server " , serverIP , ' : ' , UDPORT )
2020-05-05 20:42:22 +00:00
WScom . Start ( serverIP , wsPORT )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
if gstt . startreset == True :
print ( GetTime ( ) , " resetting nozoids... " )
reset ( " mmo3 " )
reset ( " ocs2 " )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
# Main
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
try :
print ( GetTime ( ) , " Jamidi running forever... " )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
WScom . runforever ( )
2020-04-21 13:06:01 +00:00
2020-04-22 15:44:30 +00:00
except Exception :
traceback . print_exc ( )
2020-04-21 13:06:01 +00:00
2020-05-05 20:42:22 +00:00
finally :
OSCom . Stop ( )
2020-04-21 13:06:01 +00:00
# Gently stop on CTRL C
print ( " Fin de Jamidi. " )