LJ/plugins/aurora/maxwell.py

1099 lines
28 KiB
Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
'''
maxwell interactive
Quoi pour debut fin ?
LICENCE : CC
Sam Neurohack
LINK
- bpm
- beatnumber -> Event
MIDI
- cc : channel = layer / ccnumber = steps / ccvalue = stepmax -> /maxwell/cc channel ccnumber ccvalue
- notes
if midi.sync :
- midix.bpm
- start -> /maxwell/start
- stop -> /maxwell/stop
- clock -> /maxwell/clock
OSC
- /maxwell/rawcc layer encoder value (to change given encoder parameter ie 0 = steps)
- /maxwell/cc layer steps stepmax
- /maxwell/fx/layernumber fxname ('ScanH', 'ScanV', 'Circle', 'Wave')
- /maxwell/x/layernumber coord (0-1)
- /maxwell/xcoord layernumber coord
- /maxwell/y/layernumber coord (0-1)
- /maxwell/ycoord layernumber coord
Scale 98
- /maxwell/scale layer value
- /maxwell/linesize layer value
- /maxwell/color/layername colorname
X 100 Y 104 Z 108
- /maxwell/rotspeed layernumber axe speed
X 114 Y 118 Z 122
- /maxwell/transamt layernumber axe maxposition
X 102 Y 106 Z 110
- /maxwell/rotdirec layernumber axe rotdirec
- /maxwell/bpm
- /maxwell/clock
- /maxwell/start
- /maxwell/stop
- /maxwell/noteon layer note velocity
- /maxwell/noteoff layer note
- /maxwell/part partname
- /maxwell/intensity layernumber intensity
- /maxwell/radius layernumber value
- /maxwell/type layer side axe value
- /maxwell/freq layer side axe freq
- /maxwell/amp layer side axe amp
- /maxwell/inv layer side axe inv
to code
/maxwell/scandots layernumber value
/maxwell/cu/freq layernumber axe frequency
/maxwell/cu/phaseoffset layernumber axe phaseoffset
curvetype
mode ALIGN
mode LIVE
mode SONG
trigger / layer / size / speed
trigger / layer / stepmax / steps
Layer : Xsteps, Ysteps, Sizesteps, rotXsteps,...
'''
import math
import numpy as np
import pdb
from datetime import datetime
from random import randrange
import redis
import sys
import ast
import os
import time,traceback
import midix, anim
ljpath = r'%s' % os.getcwd().replace('\\','/')
# import from shell
sys.path.append(ljpath +'/../../libs/')
sys.path.append(ljpath +'/../libs/')
#import from LJ
sys.path.append(ljpath +'/libs/')
sys.path.append('../libs')
sys.path.append(ljpath +'/../../libs')
import gstt
is_py2 = sys.version[0] == '2'
if is_py2:
from OSC import OSCServer, OSCClient, OSCMessage
else:
from OSC3 import OSCServer, OSCClient, OSCMessage
import lj
import argparse
print ("")
print ("maxwell v0.1b")
OSCinPort = 8090
ljscene = 0
# 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)
screen_size = [700,700]
xy_center = [screen_size[0]/2,screen_size[1]/2]
width = 800
height = 600
centerX = width / 2
centerY = height / 2
# 3D to 2D projection parameters
fov = 256
viewer_distance = 2.2
inv = math.pi/2
print ("")
print ("Arguments parsing if needed...")
argsparser = argparse.ArgumentParser(description="maxwell for LJ")
argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str)
argsparser.add_argument("-m","--myIP",help="Local IP (127.0.0.1 by default) ",type=str)
argsparser.add_argument("-s","--scene",help="LJ scene number (0 by default)",type=int)
argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",type=int)
argsparser.add_argument("-L","--Lasers",help="Number of lasers connected (1 by default).",type=int)
argsparser.add_argument('-song',help="Run according to external (LIVE is default)", dest='song', action='store_true')
argsparser.set_defaults(song=False)
argsparser.add_argument('-nolink',help="Disable Ableton Link (enabled by default)", dest='link', action='store_false')
argsparser.set_defaults(link=True)
args = argsparser.parse_args()
if args.verbose:
debug = args.verbose
else:
debug = 0
if args.scene:
ljscene = args.scene
else:
ljscene = 0
# Redis Computer IP
if args.redisIP != None:
redisIP = args.redisIP
else:
redisIP = '127.0.0.1'
# myIP
if args.myIP != None:
gstt.myIP = args.myIP
else:
gstt.myIP = '127.0.0.1'
# Lasers = number of laser connected
if args.Lasers != None:
gstt.lasernumber = args.Lasers
else:
gstt.lasernumber = 1
# with Ableton Link
if args.link == True:
import alink
alink.Start()
linked = True
else:
print("Link DISABLED")
linked = False
# Mode song
if args.song == True:
print("Mode SONG")
mode = "song"
else:
print("Mode LIVE")
mode = "live"
lj.Config(redisIP, ljscene, "maxwell")
ccs =[[0] * 140] *4
# Animation parameters for each layer
Layer = [{'scandots': 10, 'mixer': 0, 'color': red, 'scale': 1,'intensity': 255}] * 3
LayerX = [{'coord': 250, 'rotspeed': 0, 'transpeed': 0, 'transamt': 250, "rotdirec": 0}] *3
LayerY = [{'coord': 250, 'rotspeed': 0, 'transpeed': 0, 'transamt': 250, "rotdirec": 0}] *3
LayerZ = [{'coord': 0, 'rotspeed': 0, 'transpeed': 0, 'transamt': 0, "rotdirec": 0}] *3
# Maxwell Style
# sin:0/saw:33/squ:95/lin:127
CurveLX= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3
CurveLY= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': np.pi/2}] * 3
CurveLZ= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3
CurveRX= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3
CurveRY= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3
CurveRZ= [{'type': 0, 'freq': 1, 'amp': 150, 'phasemod': 0, 'phaseoffset': 0, 'inv': 0}] * 3
# Destination : name, number, active, layer , scene, laser)
Dest000 = lj.DestObject('FX0', 0, True, 0 , 0, 0)
#Dest101 = lj.DestObject('FX1', 1, True, 1 , 0, 1)
#Dest202 = lj.DestObject('FX2', 2, True, 2 , 0, 2)
# RelativeObject name, active, intensity, xy, color, red, green, blue, layer , closed, xpos , ypos , scale , rotx , roty , rotz
FX0Form = lj.RelativeObject('FX0', True, 255, [], Layer[0]['color'], 255, 0, 0, 0 , False, 250 , 250, 1 , 0 , 0 , 0)
FX1Form = lj.RelativeObject('FX1', True, 255, [], Layer[1]['color'], 255, 0, 0, 1 , False, 250 , 250, 1 , 0 , 0 , 0)
FX2Form = lj.RelativeObject('FX2', True, 255, [], Layer[2]['color'], 255, 0, 0, 2 , False, 250 , 250, 1 , 0 , 0 , 0)
#
# OSC
#
oscserver = OSCServer( (gstt.myIP, OSCinPort) )
oscserver.timeout = 0
#oscrun = True
# this method of reporting timeouts only works by convention
# that before calling handle_request() field .timed_out is
# set to False
def handle_timeout(self):
self.timed_out = True
# funny python's way to add a method to an instance of a class
import types
oscserver.handle_timeout = types.MethodType(handle_timeout, oscserver)
# /maxwell/ljscene
def OSCljscene(path, tags, args, source):
print("maxwell OSC : got /maxwell/ljscene with value", args[0])
lj.WebStatus("maxwell to virtual "+ str(args[0]))
ljscene = args[0]
lj.ljscene(ljscene)
# default handler
def OSChandler(path, tags, args, source):
oscaddress = ''.join(path.split("/"))
print("maxwell default OSC Handler from Client :" + str(source[0]),)
print("OSC address", path)
print('Incoming OSC with path', path[8:])
if len(args) > 0:
print("with args", args)
# /maxwell/fx/layer FXname
if path.find('/maxwell/fx') == 0:
layer = int(path[11:12])
fx = args[0]
FXs[layer] = "anim."+fx
print("maxwell OSC Got new OSC FX generator for layer", layer,":", FXs[layer])
# /maxwell/color/layer colorname
if path.find('/maxwell/color') == 0:
if args[1] =='1':
layer = int(path[14:15])
color = args[0]
print("color was",Layer[layer]["color"] )
Layer[layer]["color"] = eval(color)
print("maxwell OSC :", color ,"for layer", layer)
# /maxwell/x/layer coord
if path.find('/maxwell/x') == 0:
layer = int(path[10:11])
value = float(args[0])
print("xdefault layer", layer, "value", value)
LayerX[layer]['coord'] = value * LayerX[layer]['transamt']
print("maxwell default OSC Got new X coord for layer", layer,":", LayerX[layer]['coord'])
# /maxwell/y/layer coord
if path.find('/maxwell/y') == 0:
layer = int(path[10:11])
value = float(args[0])
print("ydefault layer", layer, "value", value)
LayerY[layer]['coord'] = value * LayerY[layer]['transamt']
print("maxwell default OSC Got new Y coord for layer", layer,":", LayerY[layer]['coord'])
# /maxwell/color/layernumber color
def OSCcolor(path, tags, args, source):
print("maxwell OSC : color got", path, args)
if args[1] == '1':
layer = int(path[14:15])
color = args[0]
Layer[layer]["color"] = eval(color)
print("maxwell OSC :", color ,"for layer", layer)
# /maxwell/intensity layernumber intensity
def OSCintensity(path, tags, args, source):
print("maxwell OSC : intensity got",path, args)
layer = int(args[0])
i = int(args[1])
intensity[layer] = i
# /maxwell/rotspeed layernumber axe speed
def OSCrotspeed(path, tags, args, source):
print("maxwell OSC : rotspeed got", path, args)
layer = int(args[0])
axe = args[1]
speed = int(args[2])
if axe =="X":
LayerX[layer]['rotspeed'] = ccs[layer][100] = speed
if axe =="Y":
LayerY[layer]['rotspeed'] = ccs[layer][104] = speed
if axe =="Z":
LayerZ[layer]['rotspeed'] = ccs[layer][108] = speed
# /maxwell/transamt layernumber axe maxposition
def OSCtransamt(path, tags, args, source):
print("maxwell OSC : transamt got", path, args)
layer = int(args[0])
axe = args[1]
maxpos = int(args[2])
if axe =="X":
LayerX[layer]['transamt'] = ccs[layer][114] = maxpos
if axe =="Y":
LayerY[layer]['transamt'] = ccs[layer][118] = maxpos
if axe =="Z":
LayerZ[layer]['transamt'] = ccs[layer][122] = maxpos
# /maxwell/transpeed layernumber axe transpeed
def OSCtranspeed(path, tags, args, source):
print("maxwell OSC : transspeed got", path, args)
layer = int(args[0])
axe = args[1]
speed = int(args[2])
if axe =="X":
LayerX[layer]['transpeed'] = ccs[layer][112] = speed
if axe =="Y":
LayerY[layer]['transpeed'] = ccs[layer][116] = speed
if axe =="Z":
LayerZ[layer]['transpeed'] = ccs[layer][120] = speed
# /maxwell/part partname
def OSCpart(path, tags, args, source):
print("maxwell part got", path, args)
gstt.maxwellpart = args[0]
# /maxwell/bpm set current bpm
def OSCbpm(path, tags, args, source):
pass
#gstt.currentbpm = int(args[0])
#print("maxwell OSC New BPM :", int(args[0]))
#/maxwell/clock
def OSClock(path, tags, args, source):
pass
#print("maxwell OSC Got MIDI clock")
#/maxwell/mixer/value layernumber value
def OSCmixervalue(path, tags, args, source):
print("maxwell OSC : got Mixer Value", path, args)
layer = int(args[0])
value = int(args[1])
Layer[layer]['mixer'] = value
ccs[layer][90] = value
# /maxwell/start
def OSCstart(path, tags, args, source):
print("maxwell OSC Got MIDI start")
for l in range(3):
Layer[l]['run'] = True
# /maxwell/stop layer
def OSCstop(path, tags, args, source):
print("maxwell OSC Got MIDI stop for layer", int(args[0]))
Layer[int(args[0])]['run'] = False
#for l in range(3):
# Layer[l]['run'] = not Layer[l]['run']
# 33 (B0) ScanH / 35 (B0) ScanV / 24 (C0) Wave / 26 (D0) Circle
#fxs = ["anim.ScanH", "anim.ScanV", "anim.Wave", "anim.Circle"]
# /maxwell/noteon note velocity
def OSCnoteon(path, tags, args, source):
#print("maxwell OSC Got MIDI noteon")
l = int(args[0])
note = int(args[1])
velocity = int(args[2])
# A0
if note == 33:
FXs[l] = beatstepfxs[0]
# B0
if note == 35:
FXs[l] = beatstepfxs[1]
# C0
if note == 24:
FXs[l] = beatstepfxs[2]
# D0
if note == 26:
FXs[l] = beatstepfxs[3]
print ("maxwell OSC Got new MIDI FX generator for layer", l, ":", FXs[l])
# /maxwell/noteoff layer notenumber
def OSCnoteoff(path, tags, args, source):
print("maxwell OSC Got MIDI noteoff")
l = int(args[0])
note = int(args[1])
# /maxwell/cc channel CC value
# /maxwell/cc layer steps stepmax
def OSCcc(path, tags, args, source):
#global step, steps, stepmax, stepvals
print("maxwell OSC Got CC")
channel = int(args[0])
ccnumber = int(args[1])
ccvalue = int(args[2])
Layer[channel]['step'] = 0
Layer[channel]['steps'] = ccnumber * 5
Layer[channel]['stepmax'] = ccvalue * 5
Layer[channel]['stepvals'] = anim.sbilinear(Layer[channel]['steps'], 0, Layer[channel]['stepmax'])
'''
0 type LX
1 freq LX
3 amp LX
11 inv LX
12 type LY
13 freq LY
15 amp LY
23 inv LY
24 type LZ
25 freq LZ
27 amp LZ
35 inv LZ
36 type RX
37 freq RX
39 amp RX
47 inv RX
48 type RY
49 freq RY
51 amp RY
59 inv RY
60 type RZ
61 freq RZ
63 amp RZ
71 inv RZ
100 rotspeedX[
104 rotspeedY
108 rotspeedZ
114 transamtX
118 transamtY
122 transamtZ
112 transpeedX
116 transpeedY
120 transpeedZ
Encoders :
LX freq amp phasemod transamt RX freq amp phasemod rotdire
LY freq amp phasemod transamt RL freq amp phasemod rotdire
'''
# /maxwell/rawcc layer encoder value Maxwell maxwell style
encoders = ['steps', 'stepmax','lineSize','radius']
def OSCrawcc(path, tags, args, source):
#global step, steps, stepmax, stepvals
layer = int(args[0])
number = int(args[1])
value = int(args[2])
midix.SendUI('/beatstep/'+ "m" +str(layer)+ str(number+1) + '/value', [format(value, "03d")])
ccs[layer][number] = value
print(encoders[number],": value", value, "steps", Layer[layer]['steps'],"stepmax", Layer[layer]['stepmax'], "lineSize", Layer[layer]['lineSize'])
#print("maxwell OSC Got rawCC for layer", layer, "encoder", encoders[number], "value", value)
#print(value, Layer[layer]['stepmax'])
if value * 2 < Layer[layer]['stepmax']:
Layer[layer][encoders[number]] = value * 5
Layer[layer]['stepvals'] = anim.sbilinear(Layer[layer]['steps'], 0, Layer[layer]['stepmax'])
'''
# /maxwell/rawcc layer encoder value maxwell style
encoders = ['steps', 'stepmax','lineSize','radius']
def OSCrawcc(path, tags, args, source):
#global step, steps, stepmax, stepvals
layer = int(args[0])
number = int(args[1])
value = int(args[2])
midix.SendUI('/beatstep/'+ "m" +str(layer)+ str(number+1) + '/value', [format(value, "03d")])
ccs[layer][number] = value
print(encoders[number],": value", value, "steps", Layer[layer]['steps'],"stepmax", Layer[layer]['stepmax'], "lineSize", Layer[layer]['lineSize'])
#print("maxwell OSC Got rawCC for layer", layer, "encoder", encoders[number], "value", value)
#print(value, Layer[layer]['stepmax'])
if value * 2 < Layer[layer]['stepmax']:
Layer[layer][encoders[number]] = value * 5
Layer[layer]['stepvals'] = anim.sbilinear(Layer[layer]['steps'], 0, Layer[layer]['stepmax'])
'''
# /maxwell/rotdirec layer axe direc
def OSCrotdirec(path, tags, args, source):
layer = int(args[0])
axe = args[1]
direc = int(args[2])
if axe =="X":
LayerX[layer]['rotdirec'] = ccs[layer][102] = direc
if axe =="Y":
LayerY[layer]['rotdirec'] = ccs[layer][106] = direc
if axe =="Z":
LayerZ[layer]['rotdirec'] = ccs[layer][110] = direc
#
# /maxwell/xcoord layer value
def OSCXcoord(path, tags, args, source):
Layer[layer]['run'] = False
LayerX[int(args[0])]['coord'] = int(args[1])
#layer = int(path[10:11])
#value = float(args[0])
#LayerX[layer]['coord'] = value * LayerX[layer]['lineSize']
print("maxwell OSC Got new Xcoord for layer", layer,":", LayerX[layer]['coord'])
# /maxwell/ycoord layer value
def OSCYcoord(path, tags, args, source):
Layer[layer]['run'] = False
LayerX[int(args[0])]['coord'] = int(args[1])
print("maxwell OSC Got new Ycoord for layer", layer,":", LayerY[layer]['coord'])
# [0-1] ?
# /maxwell/scale layer value
def OSCcale(path, tags, args, source):
layer = int(args[0])
value = int(args[1])
Layer[int(args[0])]['scale'] = float(args[1])*200
ccs[layer][98] = value * 200
# /maxwell/scandots layernumber value
def OSCandots(path, tags, args, source):
Layer[int(args[0])]['scandots'] = int(args[1])
# ccs[layer][98] = value 2/11
# /maxwell/radius layernumber radius
def OSCradius(path, tags, args, source):
Layer[int(args[0])]['radius'] = int(args[1])
# L/R X/Y/Z sin:0/saw:33/squ:95/lin:127
# /maxwell/curvetype layer side axe type
def OSCurvetype(path, tags, args, source):
layer = int(args[0])
side = args[1]
axe = args[2]
value = args[3]
if side == 'L':
if axe =="X":
CurveLX[layer]['type'] = ccs[layer][0] = value
if axe =="Y":
CurveLY[layer]['type'] = ccs[layer][12] = value
if axe =="Z":
CurveLZ[layer]['type'] = ccs[layer][24] = value
else:
if axe =="X":
CurveRX[layer]['type'] = ccs[layer][36] = value
if axe =="Y":
CurveRY[layer]['type'] = ccs[layer][48] = value
if axe =="Z":
CurveRZ[layer]['type'] = ccs[layer][60] = value
# /maxwell/freq layer side axe type
def OSCfreq(path, tags, args, source):
layer = int(args[0])
side = args[1]
axe = args[2]
value = args[3]
if side == 'L':
if axe =="X":
CurveLX[layer]['freq'] = ccs[layer][1] = value
if axe =="Y":
CurveLY[layer]['freq'] = ccs[layer][13] = value
if axe =="Z":
CurveLZ[layer]['freq'] = ccs[layer][25] = value
else:
if axe =="X":
CurveRX[layer]['freq'] = ccs[layer][37] = value
if axe =="Y":
CurveRY[layer]['freq'] = ccs[layer][49] = value
if axe =="Z":
CurveRZ[layer]['freq'] = ccs[layer][61] = value
# /maxwell/amp layer side axe type
def OSCamp(path, tags, args, source):
layer = int(args[0])
side = args[1]
axe = args[2]
amp = args[3]
if side == 'L':
if axe =="X":
CurveLX[layer]['amp'] = ccs[layer][3] = amp
if axe =="Y":
CurveLY[layer]['amp'] = ccs[layer][15] = amp
if axe =="Z":
CurveLZ[layer]['amp'] = ccs[layer][27] = amp
else:
if axe =="X":
CurveRX[layer]['amp'] = ccs[layer][39] = amp
if axe =="Y":
CurveRY[layer]['amp'] = ccs[layer][51] = amp
if axe =="Z":
CurveRZ[layer]['amp'] = ccs[layer][63] = amp
# L/R X/Y/Z 0/1
# /maxwell/inv layer side axe
def OSCurveinv(path, tags, args, source):
layer = int(args[0])
side = args[1]
axe = args[2]
value = args[3]
if side == 'L':
if axe =="X":
CurveLX[layer]['inv'] = ccs[layer][11] = value * inv
if axe =="Y":
CurveLY[layer]['inv'] = ccs[layer][23] = value * inv
if axe =="Z":
CurveLZ[layer]['inv'] = ccs[layer][35] = value * inv
else:
if axe =="X":
CurveRX[layer]['inv'] = ccs[layer][47] = value * inv
if axe =="Y":
CurveRY[layer]['inv'] = ccs[layer][59] = value * inv
if axe =="Z":
CurveRZ[layer]['inv'] = ccs[layer][71] = value * inv
'''
To code : what curve ?
# CC : X 7 Y 21 Z 11
# /maxwell/cu/phaseoffset layernumber axe phaseoffset
def OSCphaseoffset((path, tags, args, source):
layer = int(args[0])
value = int(args[1])
if axe =="X":
LayerX[layer]['phaseoffset'] = ccs[layer][102] = direc
if axe =="Y":
Y[layer]['phaseoffset'] = ccs[layer][106] = direc
if axe =="Z":
LayerZ[layer]['phaseoffset'] = ccs[layer][110] = direc
Layer = [{'scandots': 100, 'radius': 150, 'color': red,
CurveL= [{'type': 64, 'freq': 1, 'phaseoffset': 0}] * 3
CurveR= [{'type': 64, 'freq': 1, 'phaseoffset': 0}] * 3
'''
# /maxwell/linesize layer value
def OSClinesize(path, tags, args, source):
#Layer[layer]['run'] = False
Layer[int(args[0])]['lineSize'] = float(args[1])*200
#Layer[int(args[0])]['lineSize'] = float(args[1])
'''
/osc/left/X/curvetype is Artnet 0 MIDI Channel 1 CC 0
/osc/left/Y/curvetype is Artnet 12 MIDI Channel 1 CC 12
/osc/left/Z/curvetype is Artnet 24 MIDI Channel 1 CC 24
/osc/right/X/curvetype is Artnet 36 MIDI Channel 1 CC 36
/osc/right/Y/curvetype is Artnet 48 MIDI Channel 1 CC 48
/osc/right/Z/curvetype is Artnet 60 MIDI Channel 1 CC 60
"sin": 0, "saw": 33, "squ": 95, "lin": 127
'''
#
# OSC Audio
#
# /maxwell/audioR value
def OSCaudioR(path, tags, args, source):
global audioR
audioR = abs(float(args[0])* audiosize)
#print("maxwell OSC Got audioR value", audioR )
# /maxwell/audioL value
def OSCaudioL(path, tags, args, source):
global audioL
audioL = abs(float(args[0]) * audiosize)
#print("maxwell OSC Got audioR value", audioL )
# OSC FX selection
# /maxwell/fx/layer FXname
def OSCfx(path, tags, args, source):
layer = int(path[11:12])
fx = args[0]
FXs[layer] = "anim."+fx
print("maxwell OSC Got new WS FX generator for layer", layer,":", FXs[layer])
'''
layer = int(args[0])
fx = args[1]
FXs[layer] = "anim."+fx
print("maxwell OSC Got new WS FX generator for layer", layer,":", FXs[layer])
'''
#
# OSC Beatstep
#
beatstepfxs = ["anim.ScanH", "anim.ScanV", "anim.Wave", "anim.Circle"]
def beatstepUI():
midix.SendUI('/beatstep', [1])
midix.SendUI('/beatstep/on', [1])
midix.SendUI('/status', ["maxwell"])
if linked:
midix.SendUI('/bpm', alink.bpm)
for l in range(4):
# First encoder line
midix.SendUI('/beatstep/'+ "m1" + str(l+1) + '/line1', '')
midix.SendUI('/beatstep/'+ "m1" + str(l+1) + '/line2', encoders[l])
midix.SendUI('/beatstep/'+ "m1" + str(l+1) + '/value', [format(0, "03d")])
midix.SendUI('/beatstep/'+ "m1" + str(4+l+1) + '/line1', '')
midix.SendUI('/beatstep/'+ "m1" + str(4+l+1) + '/line2', encoders[l])
midix.SendUI('/beatstep/'+ "m1" + str(4+l+1) + '/value', [format(0, "03d")])
# First pad line
fxname = beatstepfxs[l].split('.')
print(fxname)
midix.SendUI('/beatstep/'+ "m3" + str(l+1) + '/line1', fxname[0])
midix.SendUI('/beatstep/'+ "m3" + str(l+1) + '/line2', fxname[1])
midix.SendUI('/beatstep/'+ "m3" + str(4+l+1) + '/line1', fxname[0])
midix.SendUI('/beatstep/'+ "m3" + str(4+l+1) + '/line2', fxname[1])
#
# Color functions
#
def hex2rgb(hexcode):
return tuple(map(ord,hexcode[1:].decode('hex')))
def rgb2hex(rgb):
return int('0x%02x%02x%02x' % tuple(rgb),0)
#
# Compute animations speed
#
def animSpeeds():
print("Compute animations speed...")
for l in range(3):
Layer[l]['stepvals'] = anim.sbilinear(Layer[l]['steps'], 0, Layer[l]['stepmax'])
#print(Layer[l]['stepvals'])
#
# ALl FXs points generation
#
def AllFX():
global step, shapestep
for l in range(3):
if AllFXDisplay[l]: #and 0 <= x0 < screen_size[0] - 2 and 0 <= y0 < screen_size[1] - 2:
LAY = Layer[l]
#print(LAY)
dots = []
dotsL = anim.Maxwell(LAY, CurveLX[l], CurveLY[l], CurveLZ[l], LayerX[l], LayerY[l], LayerZ[l])
dotsR = anim.Maxwell(LAY, CurveRX[l], CurveRY[l], CurveRZ[l], LayerX[l], LayerY[l], LayerZ[l])
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))
lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = FX0Form.closed, xpos = LayerX[l]['transamt'] + LAY['stepvals'][LAY['step']] - (LAY['lineSize']/2), ypos = LayerY[l]['transamt'], resize = LAY['scale'] * audioR, rotx = LayerX[l]['rotdirec'], roty = LayerY[l]['rotdirec'], rotz = LayerZ[l]['rotdirec'])
#lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = FX0Form.closed, xpos = FX0Form.xpos + LAY['stepvals'][LAY['step']] - (LAY['lineSize']/2), ypos = FX0Form.ypos, resize = LAY['scale'] * audioR, rotx = X[l]['rotdirec'], roty = Y[l]['rotdirec'], rotz = Z[l]['rotdirec'])
# OSC cc Audio reactive audioR -> size
if LAY['run']:
if LAY['step'] < LAY['steps']-1:
LAY['step'] +=1
else:
LAY['step'] = 0
# print("stepmax", LAY['stepmax'], 'step', LAY['step'])
if shapestep < shapesteps-1:
shapestep +=1
else:
shapestep =0
'''
# morphing
gstt.patchnumber[layer] = number
for ccnumber in range(len(maxwell['ccs'])):
gstt.morphCCinc[ccnumber] = (getPatchValue(gstt.patchnumber[layer], ccnumber) - gstt.ccs[layer][ccnumber]) / gstt.morphsteps
gstt.morphCC[ccnumber] = gstt.ccs[layer][ccnumber]
print("CC", ccnumber, "was", gstt.ccs[layer][ccnumber],"will be", getPatchValue(gstt.patchnumber[layer], ccnumber), "so inced is", gstt.morphCCinc[ccnumber])
gstt.morphing = 0
'''
#X0 = anim.COORDobject("X0",0, 0, 0, 0)
#L0 = LAYERobject("0", "saw", 100, 150, red, True, 0, 500, 200, [], 300, 255)
# Update Pose webUI
def UpdatemaxwellUI():
lj.WebStatus("Maxwell say sthng")
print('Loading Maxwell...')
lj.WebStatus("Loading Maxwell...")
print("Starting OSC server at", gstt.myIP, "port", OSCinPort, "...")
oscserver.addMsgHandler("/maxwell/ljscene", OSCljscene)
oscserver.addMsgHandler("/maxwell/noteon", OSCnoteon)
#oscserver.addMsgHandler("/maxwell/fx", OSCfx)
oscserver.addMsgHandler("/maxwell/noteoff", OSCnoteoff)
#oscserver.addMsgHandler("/maxwell/color", OSCcolor)
oscserver.addMsgHandler("/maxwell/bpm", OSCbpm)
oscserver.addMsgHandler("/maxwell/clock", OSClock)
oscserver.addMsgHandler("/maxwell/start", OSCstart)
oscserver.addMsgHandler("/maxwell/stop", OSCstop)
oscserver.addMsgHandler("/maxwell/part", OSCpart)
oscserver.addMsgHandler("/maxwell/rawcc", OSCrawcc)
oscserver.addMsgHandler("/maxwell/cc", OSCcc)
oscserver.addMsgHandler("/maxwell/audioR", OSCaudioR)
oscserver.addMsgHandler("/maxwell/autioL", OSCaudioL)
oscserver.addMsgHandler("/maxwell/xcoord", OSCXcoord)
oscserver.addMsgHandler("/maxwell/ycoord", OSCYcoord)
oscserver.addMsgHandler("/maxwell/linesize", OSClinesize)
oscserver.addMsgHandler("/maxwell/scale", OSCcale)
oscserver.addMsgHandler("/maxwell/scandots", OSCandots)
oscserver.addMsgHandler("/maxwell/intensity", OSCintensity)
oscserver.addMsgHandler("/maxwell/rotspeed", OSCrotspeed)
oscserver.addMsgHandler("/maxwell/transamt", OSCtransamt)
oscserver.addMsgHandler("/maxwell/rotdirec", OSCrotdirec)
# Add OSC generic layerugins commands : 'default", /ping, /quit, /pluginame/obj, /pluginame/var, /pluginame/adddest, /pluginame/deldest
lj.addOSCdefaults(oscserver)
oscserver.addMsgHandler( "default", OSChandler )
#anim.prepareSTARFIELD()
beatstepUI()
#beatstep.UpdatePatch(beatstep.patchnumber)
print("Updating maxwell UI...")
UpdatemaxwellUI()
midix.check()
animSpeeds()
audioR = 1
audioL = 1
audiosize = 1.1
'''
steps = 500
step = 0
stepmax = 200
stepvals = anim.sbilinear(steps, 0, stepmax)
'''
shapesteps = 50
shapestep = 0
shapemax = 2
shapevals = anim.ssquare(shapesteps, 1, 0, shapemax)
def Run():
try:
while lj.oscrun:
# If you want an idea
# t0 = time.time()
lj.OSCframe()
if linked:
alink.BeatEvent()
AllFX()
time.sleep(0.002)
#t1 = time.time()
# looptime = t1 - t0
# 25 frames/sec -> 1 frame is 0.04 sec long
# if looptime is 0.01 sec
# 0.04/0.01 = 4 loops with the same anim
# so speedanim is 1 / 4 = 0.25
# speedanim = 1 / (0.04 / looptime)
lj.DrawDests()
#print("Took %f" % (t1 - t0, ))
#except KeyboardInterrupt:
# pass
except Exception:
traceback.print_exc()
# Gently stop on CTRL C
finally:
lj.WebStatus("maxwell Exit")
print("Stopping OSC...")
lj.OSCstop()
print ("maxwell Stopped.")
Run()