From 66ba694bdc6a783e712519096807f8283606a006 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 11 Oct 2020 01:24:51 +0200 Subject: [PATCH] Start animation --- libs/__pycache__/midix.cpython-38.pyc | Bin 14840 -> 19753 bytes libs/midix.py | 245 ++++++++++++++++++++++---- 2 files changed, 209 insertions(+), 36 deletions(-) diff --git a/libs/__pycache__/midix.cpython-38.pyc b/libs/__pycache__/midix.cpython-38.pyc index 7337f112a9a37be05325e7dd7d53a516b7f95b71..6dce2c7f6bd739daf7bb96b59cf524808a91359b 100644 GIT binary patch delta 9468 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 delta 4935 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 diff --git a/libs/midix.py b/libs/midix.py index 346f8b9..9fa5ba6 100644 --- a/libs/midix.py +++ b/libs/midix.py @@ -110,6 +110,20 @@ STATUS_MAP = { 'channelpressure': CHANNEL_PRESSURE } +PadLeds = [0] * 64 +PadTops= [0] * 8 +PadRights= [0] * 8 +LaunchLedMatrix = [(0,1,2,3,4,5,6,7),(16,17,18,19,20,21,22,23),(32,33,34,35,36,37,38,39),(48,49,50,51,52,53,54,55),(64,65,66,67,68,69,70,71),(80,81,82,83,84,85,86,87),(96,97,98,99,100,101,102,103),(112,113,114,115,116,117,118,119)] +LaunchRight = (8,24,40,56,72,88,104,120) +# CC +LaunchTop = (104,105,106,107,108,109,110,111) +PadTop = [0,0,0,0,0,0,0,0] +PadRight = [0,0,0,0,0,0,0,0] +PadMatrix = [0] * 64 +matrix1 = [1,1] +matrix2 = [1,1] +matrix3 = [1,1] +TopSelection = [0] *8 def SendOSC(oscaddress,oscargs=''): @@ -146,6 +160,8 @@ def SendUI(oscaddress,oscargs=''): log.err('Connection to Aurora UI refused : died ?') pass #time.sleep(0.001 + + # Ask redis for a given key def fromKey(keyname): @@ -159,11 +175,14 @@ def toKey(keyname,keyvalue): # Store encoded data in Redis return r.set(keyname,keyvalue) + def toKeyevent(eventname): print("redis midi event key :", eventname) r.publish("/midi/last_event", eventname) + + def GetTime(): return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime()) @@ -283,6 +302,7 @@ def MidinProcess(inqueue, portname): last_clock = None while True: + time.sleep(0.001) msg = inqueue_get() #print("") @@ -296,24 +316,18 @@ def MidinProcess(inqueue, portname): MidiNote = msg[1] MidiVel = msg[2] print() - #print(debug) print("NOTE ON :", "Channel", MidiChannel, "note :", MidiNote, 'velocity :', MidiVel ) - NoteOn(MidiNote, MidiVel, "pads" , midichannel=MidiChannel) # redis key : "/midi/noteon/midichannel" value : "note/velocity" if r.set("/midi/noteon/"+str(MidiChannel), str(MidiNote)+"/"+str(MidiVel))==True: - if debug == "True": - print("redis :", "/midi/noteon/"+str(MidiChannel)+" : "+ str(MidiNote)+"/"+str(MidiVel)) + print("redis :", "/midi/noteon/"+str(MidiChannel)+" : "+ str(MidiNote)+"/"+str(MidiVel)) - # to Key redis pubsub feed - toKeyevent("/midi/noteon/"+str(MidiChannel)+"/"+str(MidiNote)+"/"+str(MidiVel)) + NoteOn(MidiNote, MidiVel, "pads" , midichannel=MidiChannel) # OSC : /midi/noteon midichannel note velocity - #SendOSC("/midi/noteon",[MidiChannel, msg[1], msg[2]]) - #print("osc :","/midi/noteon/",[MidiChannel, msg[1], msg[2]]) - - - + SendOSC("/midi/noteon",[MidiChannel, msg[1], msg[2]]) + print("osc :","/midi/noteon/",[MidiChannel, msg[1], msg[2]]) + toKeyevent("/midi/noteon/"+str(MidiChannel)+"/"+str(MidiNote)+"/"+str(MidiVel)) ''' # Sampler mode : note <63 launch snare.wav / note > 62 kick.wav if MidiNote < 63 and MidiVel >0: @@ -340,45 +354,36 @@ def MidinProcess(inqueue, portname): MidiChannel = msg[0]-144 else: MidiChannel = msg[0]-128 - MidiNote = msg[1] print("NOTE_off channel :", MidiChannel, "note :", MidiNote) NoteOff(MidiNote, "pads" , midichannel=MidiChannel) # redis key : "/midi/noteon/midichannel" value : "note" if r.set("/midi/noteoff/"+str(MidiChannel), str(MidiNote)) ==True: - if debug == "True": - print("redis :", "/midi/noteoff/"+str(MidiChannel)+" : "+ str(MidiNote)) - - # to Key redis pubsub feed - #toKeyevent("/midi/noteoff/"+str(MidiChannel)+"/"+str(MidiNote)) + print("redis :", "/midi/noteoff/"+str(MidiChannel)+" : "+ str(MidiNote)) # OSC : /midi/noteoff midichannel note SendOSC("/midi/noteoff",[MidiChannel, msg[1]]) - if debug == "True": - print('osc :', "/midi/noteoff",[MidiChannel, msg[1]]) + print('osc :', "/midi/noteoff",[MidiChannel, msg[1]]) # # CC on all Midi Channels if CONTROLLER_CHANGE -1 < msg[0] < 192: MidiChannel = msg[0]-175 - - #print("channel", MidiChannel, "CC :", msg[1], msg[2]) - print("CC channel : "+str(msg[0]-175-1)+" CC :"+str(msg[1])+" value : "+str(msg[2])) cc(MidiChannel, msg[1], msg[2], "pads" ) - # redis key : "/midi/cc/midichannel/ccnumber" value : "ccvalue" - if r.set("/midi/cc/"+str(MidiChannel)+"/"+str(msg[1]),str(msg[2]))==True: - if debug == "True": - print("redis :", "/midi/cc/"+str(MidiChannel)+"/"+str(msg[1]), ":", str(msg[2])) - - # to Key redis pubsub feed + #print("channel", MidiChannel, "CC :", msg[1], msg[2]) + print("CC channel : "+str(msg[0]-175-1)+" CC :"+str(msg[1])+" value : "+str(msg[2])) toKeyevent("/midi/cc/"+str(MidiChannel)+"/"+str(msg[1])+"/"+str(msg[2])) + # redis key : "/midi/cc/midichannel/ccnumber" value : "ccvalue" + if r.set("/midi/cc/"+str(MidiChannel)+"/"+str(msg[1]),str(msg[2]))==True: + print("redis :", "/midi/cc/"+str(MidiChannel)+"/"+str(msg[1]), ":", str(msg[2])) + # OSC : /midi/cc midichannel ccnumber value - #SendOSC("/midi/cc",[msg[0]-175-1, msg[1], msg[2]]) - #print("osc :","/midi/cc",[msg[0]-175-1, msg[1], msg[2]] ) + SendOSC("/midi/cc",[msg[0]-175-1, msg[1], msg[2]]) + print("osc :","/midi/cc",[msg[0]-175-1, msg[1], msg[2]] ) if msg[0] == TIMING_CLOCK: @@ -424,8 +429,7 @@ def MidinProcess(inqueue, portname): # OSC : /midi/start SendOSC("/midi/stop",[]) - if debug =="True": - print("osc : /midi/stop") + print("osc : /midi/stop") print() ''' # other midi message @@ -455,12 +459,12 @@ def NoteOn(note, color, mididest, midichannel=0): elif mididest == "all" and midiname[port].find(mididest) != 0: midiport[port].send_message([NOTE_ON+midichannel, note, color]) + elif mididest == "pads" and midiname[port].find("Launchpad") > -1: midiport[port].send_message([NOTE_ON+midichannel, note, color]) - def NoteOff(note, mididest, midichannel=0): global MidInsNumber @@ -473,12 +477,12 @@ def NoteOff(note, mididest, midichannel=0): # To All elif mididest == "all" and midiname[port].find(mididest) == -1: - midiport[port].send_message([NOTE_OFF, note, 0]) + midiport[port].send_message([NOTE_OFF, note, 0]) + elif mididest == "pads" and midiname[port].find("Launchpad") > -1: midiport[port].send_message([NOTE_OFF, note, 0]) - # Generic call back : new msg forwarded to queue class AddQueue(object): @@ -554,6 +558,14 @@ def OutConfig(): #print "New OutDevice [%i] %s" % (port, name)) OutDevice.append(OutObject(name, "generic", port)) + + # Search for a LaunchPad + if name.find("Launchpad") == 0: + + OutDevice.append(OutObject(name, "launchpad", port)) + print("Launchpad mini start animation") + Start() + time.sleep(0.2) #print "") print(len(OutDevice), "Out devices") @@ -684,6 +696,8 @@ def InConfig(): #midinputs[port].set_callback(AddQueue(name)) #genericnumber += 1 InDevice[InObject.counter-1].rtmidi.set_callback(AddQueue(name,port)) + if name.find("Launch") > -1: + Cls() except Exception: traceback.print_exc() @@ -746,7 +760,7 @@ def MidiMsg(midimsg, mididest): desterror = -1 - print("midi3 got midimsg", midimsg, "for", mididest) + print("miredis got midimsg", midimsg, "for", mididest) for port in range(len(OutDevice)): # To mididest @@ -758,6 +772,7 @@ def MidiMsg(midimsg, mididest): elif mididest == "pads" and midiname[port].find("Launchpad") > -1: midiport[port].send_message(midimsg) + desterror = 0 if desterror == -1: print("mididest",mididest, ": ** This midi destination doesn't exists **") @@ -778,6 +793,164 @@ def NoteOn(note, velocity, mididest): if midiname[port].find(mididest) == 0: midiport[port].send_message([NOTE_ON, note, velocity]) ''' +# +# launchpad +# + + +def PadNoteOn(note,color): + (x,y) = BhorIndex(note) + #print('PadNoteon', note, x, y, color) + PadNoteOnXY(x,y,color) + + +def PadNoteOff(note): + (x,y) = BhorIndex(note) + #print('PadNoteOFF', note, x, y) + PadNoteOffXY(x,y) + +def PadNoteOnXY(x,y,color): + msg= [NOTE_ON, PadNoteXY(x,y), color] + #print(msg) + MidiMsg(msg,"Launchpad") + PadLeds[BhorNoteXY(x,y)]=color + + +def PadNoteOffXY(x,y): + msg= [NOTE_OFF, PadNoteXY(x,y), 0] + #print(msg) + MidiMsg(msg,"Launchpad") + PadLeds[BhorNoteXY(x,y)]=0 + +def PadNoteXY(x,y): + note = LaunchLedMatrix[int(y-1)][int(x-1)] + return note + +def PadIndex(note): + y=note/16 + x=note%16 + return int(x+1),int(y+1) + +def BhorIndex(note): + y=note/8 + x=note%8 + #print "Note : ",note + #print "BhorIndex : ", x+1,y+1 + return int(x+1),int(y+1) + +def BhorNoteXY(x,y): + note = (x -1)+ (y-1) * 8 + return note + +# top raw and right column leds are numbered humanly 1-8. So -1 is for pythonic arrays position 0-7 +def PadTopOn(number, color): + msg= [CONTROLLER_CHANGE, LaunchTop[number-1], color] + MidiMsg(msg,"Launchpad") + PadTops[number-1]=color + +def PadTopOff(number): + msg= [CONTROLLER_CHANGE, LaunchTop[number-1], 0] + MidiMsg(msg,"Launchpad") + PadTops[number-1]=0 + +def PadRightOn(number, color): + msg= [NOTE_ON, LaunchRight[number-1], color] + MidiMsg(msg,"Launchpad") + PadRights[number-1] = color + #UpdateAllCCs(number-1) + +def PadRightOff(number): + msg= [NOTE_OFF, LaunchRight[number-1], 0] + MidiMsg(msg,"Launchpad") + PadRights[number-1] = 0 + +def TopUpdate(button, color): + #print(PadTop) + PadTop = [0,0,0,0,0,0,0,0] + PadTop[button] = color + for pad in range(7): + PadTopOn(pad+1, PadTop[pad]) + +def RightUpdate(): + for pad in range(8): + print(pad,PadRight[pad]) + PadRightOn(pad, PadRight[pad]) + if PadRight[pad] == 0: + SendOSCUI('/pad/r'+ str(pad) +'/button', [0]) + else: + SendOSCUI('/pad/r'+ str(pad) +'/button', [1]) + +def MatrixUpdate(): + for pad in range(64): + PadNoteOn(pad, PadMatrix[pad]) + +def MatrixSelect(): + MatrixUpdate() + return + + + + +# AllColor for launchpad on given port +def AllColorPad(color): + + print('AllColorPad') + for led in range(0,64,1): + PadNoteOn(led,color) + ''' + for line in LaunchLedMatrix: + for led in line: + midiport[port].send_message([NOTE_ON, led, color]) + ''' + for rightled in range(8): + PadRightOn(rightled+1, color) + for topled in range(8): + PadTopOn(topled+1,color) + #midiport[port].send_message([CONTROLLER_CHANGE, topled, color]) + +def ClsMatrix(): + for led in range(0,64,1): + PadNoteOff(led) + +def ClsTop(): + for topled in range(8): + PadTopOff(topled+1) + +def ClsRight(): + + for rightled in range(8): + PadRightOff(rightled+1) + + + +def Cls(): + + ClsMatrix() + ClsTop() + ClsRight() + + + +def Start(): + + #ClsPad(port) + #time.sleep(0.3) + ClsTop() + ClsRight() + #AllColorPad(20) + time.sleep(1) + + for color in range(64,128,1): + #AllColorPad(color) + PadNoteOn(color-64, color) + #print("color", color) + time.sleep(0.5) + AllColorPad(127) + time.sleep(0.5) + Cls() + #time.sleep(0.3) + #UpdateDisplay() + def listdevice(number):