#!/usr/bin/python3 # -*- coding: utf-8 -*- # -*- mode: Python -*- ''' Aurora Animations points generators LICENCE : CC Sam Neurohack "ScanH", "ScanV", "Wave", "Circle", "Dot00", "Zero", "Maxwell", "Starfield", "Trckr", "Word", "Poses" ''' import time, math, sys, os import numpy as np from scipy import signal from random import randrange, randint, random import live ljpath = r'%s' % os.getcwd().replace('\\','/') # import from shell sys.path.append(ljpath +'/../../libs3/') sys.path.append(ljpath +'/../../libs3') sys.path.append(ljpath +'/../libs3/') #import from LJ sys.path.append(ljpath +'/libs3/') sys.path.append('../libs3') import lj import gstt # link currentBeat = 0.0 currentBPM = 0 screen_size = [700,700] xy_center = [screen_size[0]/2,screen_size[1]/2] width = 700 height = 700 centerX = width / 2 centerY = height / 2 # 3D to 2D projection parameters fov = 256 viewer_distance = 2.2 # Useful variables init. white = lj.rgb2int(255,255,255) red = lj.rgb2int(255,0,0) blue = lj.rgb2int(0,0,255) green = lj.rgb2int(0,255,0) cyan = lj.rgb2int(255,0,255) yellow = lj.rgb2int(255,255,0) lifenb = 10 ''' # Animation parameters for each layer X = [{'coord': 0, 'rotspeed': 0, 'transpeed': 0, 'transmax': 0}] *3 Y = [{'coord': 0, 'rotspeed': 0, 'transpeed': 0, 'transmax': 0}] *3 Z = [{'coord': 0, 'rotspeed': 0, 'transpeed': 0, 'transmax': 0}] *3 Layer = [{'scandots': 100, 'radius': 150, 'color': red, "run": True, "step":0, 'steps': 500, 'stepmax': 200, 'stepvals': [], 'lineSize': 300, 'intensity': 255}] * 3 Xacc = 0.01 Yacc = 0.01 Zacc = 0.00 ''' # # Useful functions # def remap(s,min1,max1, min2, max2): a1, a2 = min1, max1 b1, b2 = min2, max2 return b1 + ((s - a1) * (b2 - b1) / (a2 - a1)) minred = 0 mingreen = 0 minblue = 0 maxz=50 z = 20 col = (255,255,255) def z2color(z, color): rgbcolor = int2rgb(color) #print() #print("z2color : z =", z, "color =",color,"rgb :", rgbcolor) newcolor = (z2range(z, rgbcolor[0], minred), z2range(z, rgbcolor[1], mingreen), z2range(z, rgbcolor[2], minblue)) #print("newcolor :", newcolor) return rgb2int(newcolor) def rgb2int(rgb): return int('0x%02x%02x%02x' % tuple(rgb),0) def int2rgb(intcode): #hexcode = hex(intcode)[2:] hexcode = '{0:06X}'.format(intcode) return tuple(int(hexcode[i:i+2], 16) for i in (0, 2, 4)) #return tuple(map(ord,hexcode[1:].decode('hex'))) def z2range(z,color, mincolor): #print("z2range : z=", z, "maxz :",maxz,"component =",color, "mincolor =",mincolor) if color < mincolor: return mincolor a1, a2 = maxz,0 b1, b2 = mincolor, color #print ("color component :", round(b1 + ((z - a1) * (b2 - b1) / (a2 - a1)))) return round(b1 + ((z - a1) * (b2 - b1) / (a2 - a1))) def cc2range(s,min,max): a1, a2 = 0,127 b1, b2 = min, max return b1 + ((s - a1) * (b2 - b1) / (a2 - a1)) def range2cc(s,min,max): a1, a2 = min, max b1, b2 = 0,127 return b1 + ((s - a1) * (b2 - b1) / (a2 - a1)) def Proj(x, y, z, angleX, angleY, angleZ): rad = angleX * math.pi / 180 cosa = math.cos(rad) sina = math.sin(rad) y2 = y y = y2 * cosa - z * sina z = y2 * sina + z * cosa rad = angleY * math.pi / 180 cosa = math.cos(rad) sina = math.sin(rad) z2 = z z = z2 * cosa - x * sina x = z2 * sina + x * cosa rad = angleZ * math.pi / 180 cosa = math.cos(rad) sina = math.sin(rad) x2 = x x = x2 * cosa - y * sina y = x2 * sina + y * cosa """ Transforms this 3D point to 2D using a perspective projection. """ factor = fov / (viewer_distance + z) x = x * factor + centerX y = - y * factor + centerY return (x,y) def ssawtooth(samples, freq, phase, scale = 1): samparray = [0] * samples t = np.linspace(0+phase, 1+phase, samples) for ww in range(samples): samparray[ww] = signal.sawtooth(2 * np.pi * freq * t[ww]) * scale return samparray def ssquare(samples, freq, phase, scale = 1): samparray = [0] * samples t = np.linspace(0+phase, 1+phase, samples) for ww in range(samples): samparray[ww] = signal.square(2 * np.pi * freq * t[ww]) * scale return samparray def ssine(samples, freq, phase, scale = 1): samparray = [0] * samples t = np.linspace(0+phase, 1+phase, samples) for ww in range(samples): samparray[ww] = np.sin(2 * np.pi * freq * t[ww]) * scale return samparray #xsteps = ssine(LAY['scandots'], Cux['freq'], Cux['phaseoffset'] + Cux['inv'], Cux['amp']) def scos(samples, freq, phase, scale = 1): samparray = [0] * samples t = np.linspace(0+phase, 1+phase, samples) for ww in range(samples): samparray[ww] = np.cos(2 * np.pi * freq * t[ww]) * scale return samparray def slinear(samples, min, max): return np.linspace(min, max, samples) Range =0 def rangelinear(samples, min, max): global Range samparray = [] samparray.append(min) for sample in range(samples-2): samparray.append(Range+sample) samparray.append(max) if Range + samples-2 > max: Range = min Range += 1 return sorted(samparray) def randlinear(samples, min, max): samparray = [] for sample in range(samples): samparray.append(randrange(max)) return sorted(samparray) # as randlinear but first min and last is max def randlinear2(samples, min, max): samparray = [] samparray.append(min) for sample in range(samples-2): samparray.append(randrange(int(max))) samparray.append(max) return sorted(samparray) ''' def slinear(samples, min, max): linearray = [0] * samples linearinc = (max-min)/samples for ww in range(samples): if ww == 0: linearray[ww] = min else: linearray[ww] = linearray[ww-1] + linearinc print ('linear :',linearray) return linearray ''' def sbilinear(samples, min, max): samparray = [0] * samples half = round(samples/2) # UP : min -> max part = np.linspace(min,max, half) for ww in range(half): samparray[ww] = part[ww] # Down : max -> min part = np.linspace(max,min, half) for ww in range(half): samparray[half+ww] = part[ww] #print('linear min max', min, max) #print ('linear',samparray) return samparray ''' lj.fromKey("/midi/cc/1/0") Linkbeat = lj.fromKey("/beat") if Linkbeat != currentbeat: currentbeat = Linkbeat Linkbpm = lj.fromKey("/bpm") if Linkbpm != currentbpm: currentbpm = Linkbpm ''' # # FXs # ''' Beatstep memory 2 Aurora simplex ''' def ScanV(LAY): ccmidi0= int(lj.fromKey("/midi/cc/1/0")) dots = [] arr = randlinear2(LAY['scandots'],0, LAY['lineSize']*ccmidi0/100) #arr = slinear(LAY['scandots'], LAY['lineSize'], 0) #print(arr) for y in arr: #print(y, LAY['lineSize'] ) dots.append((0 + LAY['lineSize']/2, y - LAY['lineSize']/2, 0)) return dots ''' Original def ScanV(LAY): dots = [] arr = randlinear2(LAY['scandots'],0, LAY['lineSize']) #arr = slinear(LAY['scandots'], LAY['lineSize'], 0) #print(arr) for y in arr: #print(y, LAY['lineSize'] ) dots.append((0 + LAY['lineSize']/2, y - LAY['lineSize']/2, 0)) return dots ''' def ScanH(LAY): dots = [] #print(slinear(LAY['scandots'], 0, LAY['lineSize'])) for x in sbilinear(LAY['scandots']*2, LAY['lineSize'],0): dots.append((x , 0, 0)) #print(dots) return dots def Wave(LAY): global currentBeat currentBPM =lj.fromKey("/bpm") LinkBeat = lj.fromKey("/beat") # New Beat ? if LinkBeat != currentBeat: currentBeat = LinkBeat dots = [] x = slinear(round(LAY['lineSize']), 0, LAY['lineSize']) y = ssine(round(LAY['lineSize']), LAY['wavefreq'], 0) for ww in range(round(LAY['lineSize'])): dots.append((50+x[ww], 50+y[ww] * LAY['radius'], 0)) return dots ''' Original def Wave(LAY): dots = [] x = slinear(round(LAY['lineSize']), 0, LAY['lineSize']) y = ssine(round(LAY['lineSize']), LAY['wavefreq'], 0) for ww in range(round(LAY['lineSize'])): dots.append((50+x[ww], 50+y[ww] * LAY['radius'], 0)) return dots ''' def Circle(LAY): dots = [] for angle in slinear(LAY['scandots'], 0, 360): rad = angle * math.pi / 180 x = LAY['radius'] * math.cos(rad) y = LAY['radius'] * math.sin(rad) dots.append((x+LAY['lineSize']/2, y, 0)) return dots def Word(LAY): lj.Text(LAY['word'], zpos=0, c = LAY['color'], layer = LAY['number'], xpos = 300, ypos = 300, resize = LAY['scale']*0.6, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #lj.Text(LAY['word'], c = LAY['color'], layer = LAY['number'], xpos = LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*10, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #lj.rPolyLineOneColor([(x/2,y/2),((x+1)/2,(y+1)/2)], c = LAY['color'], layer = l, xpos = 0, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #lj.rPolyLineOneColor([(x/2,y/2,0),((x+1)/2,(y+1)/2,0)], c = z2color(Field['stars'][starnumber][2], LAY['color']), layer = LAY['number'], closed = False, xpos = -200, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) def Dot00(LAY): dots = [] dots.append((0, 0, 0)) return dots def Zero(LAY): dots = [] return dots # # Starfields # def Onefield(LAY, Field, hori=0,verti=0): # starpoints = [] #print(Field['displayedstars'], 'stars displayed') # Increase number of if Field['displayedstars'] < Field['num_stars'] and Field['starfieldcount'] % 15 == 0: Field['displayedstars'] += 1 #if displayedstars == num_stars and starfieldcount % 10 == 0: # starspeed += 0.005 #print starspeed for starnumber in range(0, Field['displayedstars']): # The Z component is decreased on each frame. Field['stars'][starnumber][2] -= Field['starspeed'] * 3 # If the star has past the screen (I mean Z<=0) then we # reposition it far away from the screen (Z=max_depth) # with random X and Y coordinates. if Field['stars'][starnumber][2] <= 0: Field['stars'][starnumber][0] = randrange(-25,25) Field['stars'][starnumber][1] = randrange(-25,25) Field['stars'][starnumber][2] = Field['max_depth'] # Convert the 3D coordinates to 2D using perspective projection. k = 128.0 / Field['stars'][starnumber][2] # Move Starfield origin. # if stars xpos/ypos is same sign (i.e left stars xpos is <0) than (joystick or code) acceleration (hori and verti moves the star field origin) if np.sign(Field['stars'][starnumber][0]) == np.sign(hori): x = int(Field['stars'][starnumber][0] * k + xy_center[0] + (hori*600)) else: x = int(Field['stars'][starnumber][0] * k + xy_center[0] + (hori*500)) if np.sign(Field['stars'][starnumber][1]) == np.sign(verti): y = int(Field['stars'][starnumber][1] * k + xy_center[1] + (verti*600)) else: y = int(Field['stars'][starnumber][1] * k + xy_center[1] + (verti*500)) # Add star to pointlist PL 0 if field display flag is true if 0 <= x < screen_size[0] - 2 and 0 <= y < screen_size[1] - 2: # print("adding star", str(x0)+","+str(y0), "to fields 0") #lj.PolyLineOneColor([(x0,y0),((x0+1),(y0+1))], c = Stars0Form.color, layer = Stars0Form.layer, closed = Stars0Form.closed) # print((x/2,y/2),((x+1)/2,(y+1)/2)) #print( int2rgb(z2color(Field['stars'][starnumber][2], LAY['color']))) #lj.rPolyLineOneColor([(x/2,y/2),((x+1)/2,(y+1)/2)], c =LAY['color'], layer = LAY['number'], closed = False, xpos = 0, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor([(x/2,y/2,0),((x+1)/2,(y+1)/2,0)], c = z2color(Field['stars'][starnumber][2], LAY['color']), layer = LAY['number'], closed = False, xpos = -200, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) # # Maxwell # ''' Beatstep Encoders 3 : LX freq amp phasemod transamt RX freq amp phasemod rotdire LY freq amp phasemod transamt RL freq amp phasemod rotdire ''' # sin:0/saw:33/squ:95/lin:127 def MaxOneSide(LAY, Cux, Cuy, Cuz): #sines = ssine(LAY['scandots'], Cu['freq'], Cu['phasemod'], scale = Cu['amp']) #cosines = scos(LAY['scandots'], Cu['freq'], Cu['phasemod'], scale = Cu['amp']) #sines = ssine(LAY['scandots'], Cux['freq'], Cux['phaseoffset'], scale = Cux['amp']) #cosines = ssine(LAY['scandots'], Cux['freq'], Cux['phaseoffset'], scale = Cux['amp']) ''' cosines = scos(LAY['scandots'], Cu['freq'], Cu['phase'], scale = Cu['amp']) saws = ssawtooth(LAY['scandots'], Cu['freq'], Cu['phase'], scale = Cu['amp']) sqrs = ssquare(LAY['scandots'], Cu['freq'], Cu['phase'], scale = Cu['amp']) ''' dots = [] print("X", LAY['scandots'],Cux['type'], Cux['phaseoffset'], Cux['inv'], Cux['amp']) if Cux['type'] ==0: xsteps = ssine(LAY['scandots'], Cux['freq'], Cux['phaseoffset'] + Cux['inv'], Cux['amp']) if Cux['type'] ==33: xsteps = ssawtooth(LAY['scandots'], Cux['freq'], Cux['phaseoffset'] + Cux['inv'], Cux['amp']) if Cux['type'] == 95: xsteps = ssquare(LAY['scandots'], Cux['freq'], Cux['phaseoffset'] + Cux['inv'], Cux['amp']) if Cux['type'] == 127: xsteps = slinear(LAY['scandots'], 0, Cux['amp']) print("Y", LAY['scandots'], Cuy['type'], Cuy['phaseoffset'], Cuy['inv'], Cuy['amp']) if Cuy['type'] ==0: ysteps = ssine(LAY['scandots'], Cuy['freq'], Cuy['phaseoffset'] + Cuy['inv'], Cuy['amp']) if Cuy['type'] ==33: ysteps = ssawtooth(LAY['scandots'], Cuy['freq'], Cuy['phaseoffset'] + Cuy['inv'], Cuy['amp']) if Cuy['type'] == 95: ysteps = ssquare(LAY['scandots'], Cuy['freq'], Cuy['phaseoffset'] + Cuy['inv'], Cuy['amp']) if Cuy['type'] == 127: ysteps = slinear(LAY['scandots'], 0, Cuy['amp']) #print("xsteps", xsteps) #print("ysteps", ysteps) for step in range(LAY['scandots']): # Cu['type'] sin:0/saw:33/squ:95/lin:127 x = xsteps[step] y = ysteps[step] #x = sines[step] #y = cosines[step] dots.append((x, y, 0)) return dots CurveLX = [{'type': 0, 'freq': 1, 'amp': 100, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3 CurveLY = [{'type': 0, 'freq': 1, 'amp': 100, 'phasemod': 0, 'phaseoffset': 0, 'inv': np.pi/2}] * 3 #CurveLY = [{'type': 0, 'freq': 1, 'amp': 100, 'phasemod': 0, 'phaseoffset': 0, 'inv': np.pi/2}] * 3 CurveLZ = [{'type': 0, 'freq': 1, 'amp': 1, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 1 CurveRX = [{'type': 0, 'freq': 1, 'amp': 100, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3 CurveRY = [{'type': 0, 'freq': 1, 'amp': 100, 'phasemod': 0, 'phaseoffset': 0, 'inv': np.pi/2}] * 3 CurveRZ = [{'type': 0, 'freq': 1, 'amp': 1, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3 def Maxwell(LAY): l =0 mixer = 0 dots = [] dotsL = MaxOneSide(LAY, CurveLX[l], CurveLY[l], CurveLZ[l]) dotsR = MaxOneSide(LAY, CurveRX[l], CurveRY[l], CurveRZ[l]) for dot in range(LAY['scandots']): dotX = (dotsL[dot][0]*(100-mixer)/100) + (dotsR[dot][0]*mixer/100) #+ transX.values[point] dotY = (dotsL[dot][1]*(100-mixer)/100) + (dotsR[dot][1]*mixer/100) #+ transY.values[point] dotZ = (dotsL[dot][2]*(100-mixer)/100) + (dotsR[dot][2]*mixer/100) #+ transZ.values[point] dots.append((dotX, dotY, dotZ)) return dots ''' for dot in range(LAY['scandots']): dotX = (dotsL[dot][0]*(100-LAY['mixer'])/100) + (dotsR[dot][0]*LAY['mixer']/100) #+ transX.values[point] dotY = (dotsL[dot][1]*(100-LAY['mixer'])/100) + (dotsR[dot][1]*LAY['mixer']/100) #+ transY.values[point] dotZ = (dotsL[dot][2]*(100-LAY['mixer'])/100) + (dotsR[dot][2]*LAY['mixer']/100) #+ transZ.values[point] dots.append((dotX, dotY, dotZ)) ''' # # Trckr # # get absolute face position points def getPART(TrckrPts, pose_points): dots = [] for dot in pose_points: dots.append((TrckrPts[dot][0], TrckrPts[dot][1],0)) return dots # Face keypoints def face(TrckrPts): pose_points = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14] return getPART(TrckrPts, pose_points) def browL(TrckrPts): pose_points = [15,16,17,18] return getPART(TrckrPts, pose_points) def browR(TrckrPts): pose_points = [22,21,20,19] return getPART(TrckrPts, pose_points) def eyeR(TrckrPts): pose_points = [25,64,24,63,23,66,26,65,25] return getPART(TrckrPts, pose_points) def eyeL(TrckrPts): pose_points = [28,67,29,68,30,69,31,28] return getPART(TrckrPts, pose_points) def pupR(TrckrPts): pose_points = [27] return getPART(TrckrPts, pose_points) def pupL(TrckrPts): pose_points = [32] return getPART(TrckrPts, pose_points) def nose1(TrckrPts): pose_points = [62,41,33] return getPART(TrckrPts, pose_points) def nose2(TrckrPts): pose_points = [40,39,38,43,37,42,36,35,34] return getPART(TrckrPts, pose_points) def mouth(TrckrPts): pose_points = [50,49,48,47,46,45,44,55,54,53,52,51,50] return getPART(TrckrPts, pose_points) def mouthfull(TrckrPts): pose_points = [50,49,48,47,46,45,44,55,54,53,52,51,50,59,60,61,44,56,57,58,50] return getPART(TrckrPts, pose_points) def Trckr(LAY, TrckrPts): #lj.rPolyLineOneColor([(x/2,y/2),((x+1)/2,(y+1)/2)], c = LAY['color'], layer = l, closed = False, xpos = 0, ypos = 0, resize = LAY['scale'], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #print(LAY['scale']) #print("browL", browL(), "browR", browR(), "nose1", nose1(), "mouth", mouth()) lj.rPolyLineOneColor(browL(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(eyeL(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(browR(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(eyeR(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(pupL(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(pupR(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(nose1(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(nose2(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(mouthfull(TrckrPts), c = LAY['color'], layer = LAY['number'], closed = False, xpos = -200 +LAY['Xcoord'], ypos = LAY['Ycoord'], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) # # Poses # # 0.25 : each frame will be repeated 4 times. animspeed = 0.1 anims =[[]]*19 def preparePoses(currentPose): lj.WebStatus("Checking anims...") print("Init Poses...") print("Reading available Poses anims...") # anim format (name, xpos, ypos, resize, currentframe, totalframe, count, speed) # 0 1 2 3 4 5 6 7 # total frames is fetched from directory by lengthPOSE() anims[0] = ['boredhh' , -100, 30, 550, 0, 0, 0, animspeed] anims[1] = ['belka4' , -70, 380, 680, 0, 0, 0, animspeed] anims[2] = ['belka3' , -100, 360, 700, 0, 0, 0, animspeed] anims[3] = ['hhhead' , -100, 300, 600, 0, 0, 0, animspeed] anims[4] = ['hhhead2', -100, 300, 600, 0, 0, 0, animspeed] anims[5] = ['hhhead4', -100, 280, 600, 0, 0, 0, animspeed] anims[6] = ['hhred' , -250, 220, 550, 0, 0, 0, animspeed] anims[7] = ['hhred2' , -200, 200, 550, 0, 0, 0, animspeed] anims[8] = ['lady1' , -100, 300, 600, 0, 0, 0, animspeed] anims[9] = ['lady1' , -100, 280, 600, 0, 0, 0, animspeed] anims[10] = ['lady2' , -100, 280, 600, 0, 0, 0, animspeed] anims[11] = ['lady3' , -100, 300, 600, 0, 0, 0, animspeed] anims[12] = ['lady4' , -100, 300, 600, 0, 0, 0, animspeed] anims[13] = ['mila6' , -100, 280, 600, 0, 0, 0, animspeed] anims[14] = ['mila5' , -100, 280, 600, 0, 0, 0, animspeed] anims[15] = ['idiotia1', -100, 300, 600, 0, 0, 0, animspeed] anims[16] = ['idiotia1', -100, 300, 600, 0, 0, 0, animspeed] anims[17] = ['belka4', -100, 280, 600, 0, 0, 0, animspeed] anims[18] = ['belka3', -100, 280, 600, 0, 0, 0, animspeed] #for laseranims in anims: for anim in anims: #print(anim) anim[5] = lengthPOSE(anim[0]) lj.WebStatus("Checking "+ anim[0] +"...") if debug > 0: print('plugins/aurora/poses/' + anim[0], "length :", anim[5], "frames") print("Current Poses anim is",anims[currentPose][0],"("+str(currentPose)+")") #lj.RelativeObject('anim', True, 255, [], white, red, green, blue, 0 ,False, centerX, centerY, 1, Xrot, Yrot, Zrot) def Poses(LAY): anim = anims[currentPose] #anim = anims[LAY['poses']] #print(anim) #dots = [] # increase current frame [4] of speed [7] frames # print(anim[4],anim[7],anim[4]+anim[7]) # print("frame", anim[4]) anim[4] = anim[4]+anim[7] # print("animspeed",anim[7], "newframe", anim[4], "maximum frame", anim[5] ) # compare to total frame [5] if anim[4] >= anim[5]: anim[4] = 0 posename = 'plugins/aurora/poses/' + anim[0] + '/' + anim[0] +'-'+str("%05d"%int(anim[4]))+'.json' # print(posename) posefile = open(posename , 'r') posedatas = posefile.read() pose_json = json.loads(posedatas) #WebStatus("Frame : "+str("%05d"%int(anim[4]))) # Draw Face for people in range(len(pose_json['people'])): ''' #lj.rPolyLineOneColor(face(pose_json, people), c = white, PL = laser closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(browL(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(browR(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(eyeR(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) #lj.rPolyLineOneColor(pupR(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(eyeL(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) #lj.rPolyLineOneColor(pupL(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(nose(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) lj.rPolyLineOneColor(mouth(pose_json, people), c = white, PL = laser, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3]) ''' lj.rPolyLineOneColor(browL(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(eyeL(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(browR(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(eyeR(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #lj.rPolyLineOneColor(pupL(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) #lj.rPolyLineOneColor(pupR(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = LAY['scale']*0.8, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(nose1(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(nose2(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) lj.rPolyLineOneColor(mouthfull(pose_json, people), c = LAY['color'], layer = LAY['number'], closed = False, xpos = anim[1] +LAY['Xcoord'], ypos = LAY['Ycoord'] + anim[2], resize = anim[3], rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) import json #CurrentPose = 1 # Get frame number for pose path describe in PoseDir def lengthPOSE(pose_dir): if debug > 0: print("Checking directory",'plugins/aurora/poses/' + pose_dir) if os.path.exists('plugins/aurora/poses/' + pose_dir): numfiles = sum(1 for f in os.listdir('plugins/aurora/poses/' + pose_dir) if os.path.isfile(os.path.join('plugins/VJing/poses/' + pose_dir + '/', f)) and f[0] != '.') if debug > 0: print(numfiles, 'frames') return numfiles else: if debug > 0: print("but it doesn't even exist!") return 0 # # Butterfly # entities = [] for lifes in range(0,lifenb,1): # 0: random posX, 1: random posY, 2: wing position, 3: Color, 4: XDirection entities.append([randint(100,width-100), randint(100,height-100), random(), randint(45,16700000), randint(-2,2)]) #print("Butterlfy entities :", entities) wingpos = random() # One wing vertices vertices = [ ( 0.0 , 0.3603683 , 0.7174169 ), #1 ( 0.0 , -4.39773 , 0.09228338 ), #2 ( wingpos , 0.3603683 , 0.3174169 ), #3 ( 0.0 , 0.3603683 , 0.7174169 ), #4 ( -wingpos , 0.4115218 , 0.1858825 ), #7 ( 0.0 , -4.39773 , 0.09228338 ) #2 ] ''' vertices = [ ( 0.0 , -4.39773 , 0.7174169 ), # 1 ( 0.0 , 4.39773 , 0.09228338 ), # 2 ( wingpos , 0.3603683 , 0.3174169 ), # 3 ( 0.0 , 0.3603683 , 0.7174169 ), # 4 ( wingpos , -4.39773, 0.7174169 ), # 5 ( 0.0 , -4.39773 , 0.7174169 ), # 6 = 1 ( -wingpos ,-4.39773 , 0.1858825 ), #7 ( 0.0 , 0.3603683 , 0.7174169 ), # 8 ( -wingpos , 0.3603683 , 0.3174169 ), # 9 ( 0.0 , 4.39773 , 0.09228338 ), # 10 ] ''' fov = 256 viewer_distance = 70.2 angleX = 0 angleY = 120 angleZ = 0 color = 0x101010 speed = 0 def Butterfly(LAY): global angleX, angleY, angleZ #angleX += 0.0 #angleY += 0.0 #angleZ += 0.0 for entity in entities: #print(entity) entity[0] += entity[4] + randint(-1,1) # change X/Y pos (Xdirection and little chaos) if randint(0,20) > 15: entity[1] += randint(-2,2) centerX = entity[0] centerY = entity[1] # remember : z position is overall zoom entity[2] += 1 # wings animation if entity[2] > 10: entity[2] = 0.0 wingpos = entity[2] angleX = angleX # entity rotated in Z to follow Xdirection angleY = angleY if entity[4] > 0: angleZ = (angleZ + entity[4]*18) else: angleZ = -(angleZ + entity[4]*18) color = entity[3] dots = [] verticecounter = 0 for v in vertices: x = v[0] y = v[1] z = v[2] if verticecounter == 2: x = wingpos if verticecounter == 4: x = - wingpos #print(x,y,z) dots.append(Proj(x+entity[0], y+entity[1], z, angleX, angleY, angleZ)) verticecounter +=1 #print(dots) lj.rPolyLineOneColor(dots, c = LAY['color'], layer = LAY['number'], closed = False, xpos = -300 +LAY['Xcoord'], ypos = -300+LAY['Ycoord'], resize = LAY['scale']*1.3, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec']) ''' OBJECT Style name, scandots, radius, color, run, step, steps, stepmax, stepvals, lineSize, intensity L0 = LAYERobject("0", "saw", 100, 150, red, True, 0, 500, 200, [], 300, 255) L0.name = name L0.scandots = 100 L0.radius = 150 L0.color = red L0.run = True L0.step = 0, L0.steps = 500, L0.stepmax = 200 L0.stepvals =[] L0.lineSize = 300 L0.intensity = 255 class LAYERobject: def __init__(self, name, scandots, radius, color, run, step, steps, stepmax, stepvals, lineSize, intensity) self.name = name self.scandots = scandots self.radius = radius self.color = color self.run = run self.step = step self.steps = steps self.stepmax = stepmax self.stepvals = stepvals self.lineSize = lineSize self.intensity = intensity name, coord, rotspeed, ranspeed, transmax X0 = COORDobject("X0",0, 0, 0, 0) X0.name = "0" X0.coord = 0 X0.rotspeed = 0 X0.transpeed = 0 X0.transmax = 0 class COORDobject: def __init__(self, name, coord, rotspeed, ranspeed, transmax) self.name = name self.coord = coord, self.rotspeed = rotspeed self.transpeed = transpeed self.transmax = transmax # # OLD STUFF not used # def AudioLissa(): global Xrot, Yrot, Zrot levels = lj.fromRedis('/audiogen/levels') # levels = r.get('/audiogen/levels') #PL = 0 dots = [] amp = 200 nb_point = 60 Xrot += Xacc * 25 Yrot += Yacc * 25 Zrot += Zacc * 0 # scale = (380-viewgenbands2scrY(levels[0]))/300 #scale = (380 - (levels[0] * 4))/300 LissaObj.scale = float(levels[0]) / 55 print(type(float(levels[0])),levels[0], LissaObj.scale) #print ("scale",scale) #print ("scale",scale) for t in range(0, nb_point+1): y = 1 - amp*math.sin(2*math.pi*2*(float(t)/float(nb_point))) x = 1 - amp*math.cos(2*math.pi*3*(float(t)/float(nb_point))) #y = 1 - amp*math.sin(2*PI*cc2range(gstt.cc[5],0,24)*(float(t)/float(nb_point))) #x = 1 - amp*math.cos(2*PI*cc2range(gstt.cc[6],0,24)*(float(t)/float(nb_point))) dots.append((x,y)) # These points are generated in pygame coordinates space (0,0 is top left) defined by screen_size in globalVars.py #lj23.PolyLineOneColor( dots, c = white, PL = PL, closed = False ) lj.rPolyLineOneColor(dots, c = LissaObj.color, PL = LissaObj.PL, closed = False , xpos = LissaObj.xpos, ypos = LissaObj.ypos, scale = LissaObj.scale, rotx = LissaObj.rotx, roty = LissaObj.roty , rotz = LissaObj.rotz) # /X/0/coord # /Layer/0/color if path.find('/X') == 0: command = path.split("/") eval(command[0]+'['+str(command[1])+']['+command[2]+']='+args[0]) # increase/decrease a CC. Value can be positive or negative def changeCC(value, path): MaxwellCC = FindCC(path) print(MaxwellCC, "CC :", FindCC(path),"was", gstt.ccs[gstt.lasernumber][MaxwellCC]) if gstt.ccs[gstt.lasernumber][MaxwellCC] + value > 127: gstt.ccs[gstt.lasernumber][MaxwellCC] = 127 if gstt.ccs[gstt.lasernumber][MaxwellCC] + value < 0: gstt.ccs[gstt.lasernumber][MaxwellCC] = 0 if gstt.ccs[gstt.lasernumber][MaxwellCC] + value < 127 and gstt.ccs[gstt.lasernumber][MaxwellCC] + value >0: gstt.ccs[gstt.lasernumber][MaxwellCC] += value print("maxwellccs changeCC in maxwellccs : path =", path, "CC :", FindCC(path), "is now ", gstt.ccs[gstt.lasernumber][MaxwellCC], "for laser", gstt.lasernumber) cc(MaxwellCC, gstt.ccs[gstt.lasernumber][MaxwellCC] , dest ='to Maxwell 1') def EncoderPlusOne(value, path = current["path"]): if value < 50: changeCC(1, path) def EncoderMinusOne(value, path = current["path"]): if value > 90: changeCC(-1, path) def EncoderPlusTen(value, path = current["path"]): if value < 50: changeCC(10, path) def EncoderMinusTen(value, path = current["path"]): if value > 90: changeCC(-10, path) '''