Browse Source

extend FX-MODE spiral,left,top ... and FX-X for VPU-GRID

micha 2 years ago
parent
commit
121abf03fc
4 changed files with 479 additions and 15 deletions
  1. 91 6
      _LibreLightDesk.py
  2. 1 1
      _console.py
  3. 376 0
      lib/matrix.py
  4. 11 8
      vpu/vpu_live.py

+ 91 - 6
_LibreLightDesk.py

@@ -414,7 +414,8 @@ DELAY.val(0.2)
 
 fx_prm_move = {"SIZE":40,"SPEED":8,"OFFSET":100,"BASE":"0","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":0,"WING":2,"WIDTH":100}
 
-fx_prm      = {"SIZE":255,"SPEED":10,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":1,"SHUFFLE":0,"WING":2,"WIDTH":25}
+fx_prm      = {"SIZE":255,"SPEED":10,"OFFSET":100,"BASE":"-","START":0,"MODE":0,"MO":0,"DIR":1,"INVERT":1,"SHUFFLE":0,"WING":2,"WIDTH":25,"FX-X":1,"FX:MODE":0}
+fx_x_modes    = ["spiral","left","right","up","down","left_right","up_down"]
 
 fx_modes    = ["RED","GREEN","BLUE","MAG","YELLOW","CYAN"]
 fx_mo       = ["fade","on","rnd","ramp","ramp2","cosinus","sinus"]
@@ -574,6 +575,8 @@ def process_effect(wing_buffer,fx_name=""):
         coffset_move=0
     
         for fix in wing:
+            if fix not in FIXTURES.fixtures:
+                continue
             data = FIXTURES.fixtures[fix]
             for attr in data["ATTRIBUT"]:
                 jdata = {"MODE":"FX"}
@@ -784,6 +787,48 @@ def process_effect(wing_buffer,fx_name=""):
 
     return jdatas
 
+def process_matrix(xfixtures):
+    fix_count = len(xfixtures)
+    fx_x = fx_prm["FX-X"]
+    fx_mod = fx_x_modes[fx_prm["FX:MODE"]]
+    print("----",fx_x,fx_mod)
+    if fx_x > 1 and fix_count > fx_x:
+        try: 
+            from lib import matrix
+            w=fx_x
+            h=int(fix_count/fx_x)
+
+            if fx_mod == "spiral":
+                _map = matrix.spiral(w,h)
+            elif fx_mod == "up_down":
+                _map = matrix.up_down(w,h)
+            elif fx_mod == "left_right":
+                _map = matrix.left_right(w,h)
+            elif fx_mod == "left":
+                _map = matrix.left(w,h)
+            elif fx_mod == "right":
+                _map = matrix.right(w,h)
+            elif fx_mod == "up":
+                _map = matrix.up(w,h)
+            elif fx_mod == "down":
+                _map = matrix.down(w,h)
+            else:
+                return xfixtures # do nothing
+
+            matrix.mprint(xfixtures,w,h)
+            out = ["0"]*(w*h)
+            for i,f in enumerate(xfixtures):
+                if i < w*h:
+                    j = int(_map[i])
+                    print([i,f,j])
+                    out[j] = f
+
+            matrix.mprint(out,w,h)
+            xfixtures = out
+        except Exception as e:
+            print("matrix exception",e)
+
+    return xfixtures
 
 class Xevent_fx():
     """ global input event Handeler for short cut's ... etc
@@ -802,7 +847,7 @@ class Xevent_fx():
             cprint("FX:COLOR CHANGE",fx_prm,color="red")
             txt = "FX:RED" 
             fx_prm["MODE"] += 1
-            if fx_prm["MODE"] > len(fx_modes):
+            if fx_prm["MODE"] >= len(fx_modes):
                 fx_prm["MODE"]=0
             txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
 
@@ -815,6 +860,25 @@ class Xevent_fx():
                 fx_prm["MODE"]= len(fx_modes)-1
             txt = "FX:\n"+fx_modes[fx_prm["MODE"]]
             master.fx.elem["FX:RED"]["text"] = txt
+
+        if event.num == 4:
+            cprint("FX-X: CHANGE",fx_prm,color="red")
+            txt = "FX-X:" 
+            fx_prm["FX:MODE"] += 1
+            if fx_prm["FX:MODE"] >= len(fx_x_modes):
+                fx_prm["FX:MODE"]=0
+            txt = "FX:MODE\n"+fx_x_modes[fx_prm["FX:MODE"]]
+
+            master.fx.elem["FX:MODE"]["text"] = txt
+        elif event.num == 5:
+            cprint("FX-X: CHANGE",fx_prm,color="red")
+            txt = "FX-X:" 
+            fx_prm["FX:MODE"] -= 1
+            if fx_prm["FX:MODE"] < 0:
+                fx_prm["FX:MODE"]= len(fx_x_modes)-1
+            txt = "FX:MODE\n"+fx_x_modes[fx_prm["FX:MODE"]]
+            master.fx.elem["FX:MODE"]["text"] = txt
+
         elif event.num == 1:
             xfixtures = []
             fix_active =FIXTURES.get_active() 
@@ -828,7 +892,7 @@ class Xevent_fx():
                 return 0
             
             
-
+            xfixtures = process_matrix(xfixtures)
             wing_buffer = process_wings(xfixtures)
             process_effect(wing_buffer,fx_name=self.attr)
 
@@ -1014,6 +1078,25 @@ class Xevent_fx():
                     prm[k] =5
                 ct.elem[self.attr]["text"] = k+":\n{}".format(prm[k])
                 cprint(prm)
+            elif self.attr.startswith("FX-X:"):#SIN":
+                #global prm
+                k = "FX-X"
+                if event.num == 1:
+                    prm[k] = 1
+                elif event.num == 3:
+                    prm[k] = 2
+                elif event.num == 4:
+                    prm[k] += 1
+                elif event.num == 5:
+                    prm[k] -=1
+                if prm[k] > 100:
+                    prm[k] = 100
+                if prm[k] < 1:
+                    prm[k] =1
+                    
+                txt = prm[k] 
+                ct.elem[self.attr]["text"] = "FX-X:\n{}".format(prm[k])
+                cprint(prm)
             elif self.attr.startswith("WING:"):#SIN":
                 #global prm
                 k = "WING"
@@ -1848,7 +1931,7 @@ class GUI():
         self.fx = Elem_Container()
         self.fx.commands =[
                 "FX:DIM","FX:RED", "WIDTH:\n25","WING:\n2","DIR:\n1","INVERT:\n1","\n","SHUFFLE:\n0"
-                ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-" 
+                ,"SIZE:\n","SPEED:\n","START:\n","OFFSET:\n","BASE:\n-","FX-X:\n-","FX:MODE"
                 ]
         self.fx_generic = Elem_Container()
         self.fx_generic.commands =["FX:SIN","FX:COS","FX:RAMP","FX:RAMP2","FX:FD","FX:ON"] 
@@ -3102,6 +3185,8 @@ def draw_command(gui,xframe):
             b["text"] = "START:{:0.0f}".format(fx_prm["START"])
         if comm == "OFFSET:":
             b["text"] = "OFFSET:{:0.0f}".format(fx_prm["OFFSET"])
+        if comm == "FX-X:":
+            b["text"] = "FX-X:{}".format(fx_prm["FX-X"])
         if comm == "BASE:":
             b["text"] = "BASE:{}".format(fx_prm["BASE"])
         if comm:
@@ -5281,7 +5366,7 @@ if __run_main:
 
 
     name="ENCODER"
-    w = GUIWindow(name,master=0,width=620,height=113,left=L0+710,top=TOP+H1+HTB*2)
+    w = GUIWindow(name,master=0,width=620,height=113,left=L0+710,top=TOP+H1+15+HTB*2)
     _ENCODER_WINDOW = w
     draw_enc(master,w.tk)#Xroot)
 
@@ -5312,7 +5397,7 @@ if __run_main:
     window_manager.new(w,name)
 
     name="FX"
-    w = GUIWindow(name,master=0,width=415,height=260,left=L1+10+W1,top=TOP+302)#317)
+    w = GUIWindow(name,master=0,width=415,height=297,left=L1+10+W1,top=TOP+302)#317)
     #frame_fx = w.tk
     draw_fx(master,w.tk)
     window_manager.new(w,name)

+ 1 - 1
_console.py

@@ -657,7 +657,7 @@ class DMXCH(object):
 
 
 Bdmx = []
-for i in range(512*3):
+for i in range(512*5+1):
     Bdmx.append( DMXCH(i) )
     #print(type(dmx[i]))
 

+ 376 - 0
lib/matrix.py

@@ -0,0 +1,376 @@
+
+
+def mprint(data,w=4,h=4):
+    for i,v in enumerate(data):
+        if i % w ==0:
+            print()
+        print(v,end=",")
+    print()
+    print("----")
+
+sleep = 0
+if __name__ == "__main__":
+    sleep = 0.01321
+
+print("y--")
+class DIR():
+    def __init__(self,w=4,h=4,w_min=0,h_min=0):
+        self.d = 0
+        self.w= w
+        self.h= h
+
+        self.x_max= w
+        self.y_max= h
+
+        self.x_min= w_min
+        self.y_min= h_min
+        self.x = 0 #//2
+        self.y = 0 #//2
+        self.i = 0
+        self.i_max = self.x_max*self.y_max
+
+    def get(self):
+        if self.i >= self.i_max:
+            return None # end
+        out = self.x,self.y*self.w
+        self.i += 1
+        return out
+
+    def right_reset(self):
+        self.x = self.x_min
+    def left_reset(self):
+        self.x = self.x_max -1
+    def down_reset(self):
+        self.y = self.y_min
+    def up_reset(self):
+        self.y = self.y_max -1
+    def right(self):
+        if self.x < self.x_max-1:
+            self.x+=1
+            return 1
+    def down(self):
+        if self.y < self.y_max-1:
+            self.y+=1
+            return 1
+    def up(self):
+        if self.y > self.y_min:
+            self.y-=1
+            return 1
+    def left(self):
+        if self.x > self.x_min:
+            self.x-=1
+            return 1
+
+    def x(self):
+        return self.out
+ 
+data = [ "1A","1B" ,"1C","1D","2A","2B","2C","2D","3A","3B","3B","3D"]
+
+
+
+def right(w,h):
+    out = ["----"] *(w*h) #*w*h
+    d = DIR(w=w,h=h)
+    r = d.get()
+    i = 0
+    import time
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        #out[x+y] = i 
+        out[x+y] = "{:-4}".format(i) 
+        if sleep:
+            mprint(out,w,h)
+        r=d.right()
+        #print(r)
+        if not r:
+            d.right_reset()
+            d.down()
+
+        r = d.get()
+        i += 1
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 40
+    h = 30
+    #out = right(w,h)
+    #mprint(out,w,h)
+
+def left(w,h):
+    #mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #a+2
+    d = DIR(w=w,h=h)
+    #d.up_reset()
+    d.left_reset()
+    r = d.get()
+    i = 0
+    import time
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        #out[x+y] = i 
+        out[x+y] = "{:-4}".format(i) 
+        #mprint(out,w,h)
+        if sleep:
+            mprint(out,w,h)
+        r=d.left()
+        #print(r)
+        if not r:
+            d.left_reset()
+            #d.up()
+            d.down()
+
+        r = d.get()
+        i += 1
+        #time.sleep(.0151)
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 40
+    h = 30
+    #out = left(w,h)
+    #mprint(out,w,h)
+
+
+def up(w,h):
+    #mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #a+2
+    d = DIR(w=w,h=h)
+    #d.up_reset()
+    d.up_reset()
+    r = d.get()
+    i = 0
+    import time
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        #out[x+y] = i 
+        out[x+y] = "{:-4}".format(i) 
+        #mprint(out,w,h
+        if sleep:
+            mprint(out,w,h)
+        r=d.up()
+        #print(r)
+        if not r:
+            d.up_reset()
+            #d.up()
+            d.right()
+
+        r = d.get()
+        i += 1
+        #time.sleep(.0151)
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 40
+    h = 30
+    #out = up(w,h)
+    #mprint(out,w,h)
+
+
+
+
+def down(w,h):
+    #mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #a+2
+    d = DIR(w=w,h=h)
+    #d.up_reset()
+    d.down_reset()
+    r = d.get()
+    i = 0
+    import time
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        #out[x+y] = i 
+        out[x+y] = "{:-4}".format(i) 
+        #mprint(out,w,h)
+        if sleep:
+            mprint(out,w,h)
+
+        r=d.down()
+        #print(r)
+        if not r:
+            d.down_reset()
+            #d.up()
+            d.right() #left()
+
+        r = d.get()
+        i += 1
+        #time.sleep(.0151)
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 40
+    h = 30
+    #out = down(w,h)
+    #mprint(out,w,h)
+
+
+
+
+
+def spiral(w=10,h=4):
+    mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #*30 #*w*h+2
+    d = DIR(w=w,h=h)
+    d.up_reset()
+    d.left_reset()
+    r = d.get()
+    i = 0
+    import time
+    q = 0
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        out[x+y] = "{:-4}".format(i) 
+        #mprint(out,w,h)
+
+        if sleep:
+            mprint(out,w,h)
+        if q == 0:
+            m=d.left()
+            #print(m)
+            if not m:
+                q+=1
+                d.x_min += 1
+        if q == 1:
+            m=d.up()
+            if not m:
+                q+=1
+                d.y_min += 1
+        if q == 2:
+            m=d.right()
+            if not m:
+                q+=1
+                d.y_max -= 1
+        if q == 3:
+            m=d.down()
+            if not m:
+                d.left()
+                q=0
+                d.x_max -= 1
+            
+
+        r = d.get()
+        i += 1
+        #time.sleep(.01)
+    return out
+
+if __name__ == "__main__":
+    w = 10
+    h = 40
+    #out = spiral(w,h)
+    #mprint(out,w,h)
+
+
+
+
+
+
+def left_right(w=10,h=4):
+    mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #*30 #*w*h+2
+    d = DIR(w=w,h=h)
+    d.down_reset()
+    d.left_reset()
+    r = d.get()
+    i = 0
+    import time
+    q = 0
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        out[x+y] = "{:-4}".format(i) 
+
+        if sleep:
+            mprint(out,w,h)
+
+        if q == 0:
+            m=d.left()
+            #print(m)
+            if not m:
+                q+=1
+                d.down()
+        elif q == 1:
+            m=d.right()
+            if not m:
+                q=0
+                d.down()
+            
+
+        r = d.get()
+        i += 1
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 10
+    h = 40
+    out = left_right(w,h)
+    mprint(out,w,h)
+
+    #def dubble_spiral():
+    #    pass
+    #dubble_spiral()
+
+
+def up_down(w=10,h=4):
+    mprint(data,w,h)
+
+
+    out = ["----"] *(w*h) #*30 #*w*h+2
+    d = DIR(w=w,h=h)
+    d.up_reset()
+    d.left_reset()
+    r = d.get()
+    i = 0
+    import time
+    q = 0
+    while type(r) is not type(None):
+        x,y = r
+        #print("r",r,x,y, d.i)
+        out[x+y] = "{:-4}".format(i) 
+
+        if sleep:
+            mprint(out,w,h)
+
+        if q == 0:
+            m=d.up()
+            #print(m)
+            if not m:
+                q+=1
+                d.left()
+        elif q == 1:
+            m=d.down()
+            if not m:
+                q=0
+                d.left()
+            
+
+        r = d.get()
+        i += 1
+        time.sleep(sleep)
+    return out
+
+if __name__ == "__main__":
+    w = 40
+    h = 20
+    out = up_down(w,h)
+    mprint(out,w,h)
+

+ 11 - 8
vpu/vpu_live.py

@@ -69,6 +69,7 @@ pygame.init()
 main_size=(600,300)
 main_size=(1600,900)
 main_size=(600,300)
+main_size=(300,300)
 #window = pygame.display.set_mode(main_size,pygame.FULLSCREEN) #x left->right ,y top-> bottom
 #window = pygame.display.set_mode(main_size,pg.RESIZABLE|pygame.DOUBLEBUF,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
 window = pygame.display.set_mode(main_size,pg.RESIZABLE)#,32)#,pygame.FULLSCREEN) #x left->right ,y top-> bottom
@@ -114,21 +115,23 @@ while 1:
         #            col = [255,255,0,0]
         for i in range(12*8+1):
             dmx = i*4
+            #print(dmx)
             r[dmx:dmx+4] = [255,10,10,40] 
     #print(r)
-    ch = 0
+    ch = 4
     dmx = 1-1
     rgb = [255,255,255]
-    for x in range(12):
-        for y in range(8):
-            ch += 4
+    for y in range(8):
+        for x in range(12):
             #f = FIX(pos=[x*16,y*16])
-            if ch+4 < len(r):
-                rgb = [r[ch+1]*r[ch]/255,r[ch+2]*r[ch]/255,r[ch+3]*r[ch]/255]
+            if dmx+ch < len(r):
+                dim = r[dmx]/255
+                rgb = [r[dmx+1]*dim,r[dmx+2]*dim,r[dmx+3]*dim]
                 #print(rgb)
             pos=[x*16,y*16]
-            pygame.draw.rect(window,rgb,[pos[0],pos[1],15,15])
-            #f.draw()
+            pygame.draw.rect(window,rgb,[40+pos[0],40+pos[1],15,15])
+            dmx += ch
+
     pygame.display.flip()
     pg.time.wait(10)