Compare commits
	
		
			3 Commits
		
	
	
		
			be60f25b16
			...
			a89cf3d414
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a89cf3d414 | ||
| 
						 | 
					aef92762b5 | ||
| 
						 | 
					93cbcfefd5 | 
							
								
								
									
										35
									
								
								LJ.conf
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								LJ.conf
									
									
									
									
									
								
							@ -1,8 +1,8 @@
 | 
			
		||||
[General]
 | 
			
		||||
lasernumber = 4
 | 
			
		||||
lasernumber = 1
 | 
			
		||||
debug = 0
 | 
			
		||||
ljayserverip = 0.0.0.0
 | 
			
		||||
wwwip = 192.168.2.44
 | 
			
		||||
wwwip = 127.0.0.1
 | 
			
		||||
nozoscip = 127.0.0.1
 | 
			
		||||
bhoroscip = 127.0.0.1
 | 
			
		||||
autostart = artnet
 | 
			
		||||
@ -12,7 +12,7 @@ wsport = 9001
 | 
			
		||||
[laser0]
 | 
			
		||||
color = -1
 | 
			
		||||
type = DS1000
 | 
			
		||||
ip = 192.168.2.3
 | 
			
		||||
ip = 127.0.0.1
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
@ -21,7 +21,7 @@ zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = -1
 | 
			
		||||
swapx = 1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
@ -36,8 +36,8 @@ ip = 192.168.2.5
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
zoomx = 80.0
 | 
			
		||||
zoomy = 80.0
 | 
			
		||||
zoomx = 50.0
 | 
			
		||||
zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
@ -72,7 +72,7 @@ warpdest = [[-1500., 1500.],
 | 
			
		||||
[laser3]
 | 
			
		||||
color = -1
 | 
			
		||||
type = LUKE400
 | 
			
		||||
ip = 192.168.2.4
 | 
			
		||||
ip = 192.168.1.5
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
@ -81,8 +81,8 @@ zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = 1
 | 
			
		||||
swapy = 1
 | 
			
		||||
swapx = -1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
	[ 1500., 1500.],
 | 
			
		||||
@ -92,23 +92,8 @@ warpdest = [[-1500., 1500.],
 | 
			
		||||
[plugins]
 | 
			
		||||
plugins = {
 | 
			
		||||
	"aurora": 		{"OSC": 8090, "command": "python3 plugins/aurora/aurora.py", "display": True},
 | 
			
		||||
	"nozoid":       {"OSC": 8003, "command": "python3 plugins/audio/nozoids3.py", "display": True},
 | 
			
		||||
	"glyph":	 	{"OSC": 8004, "command": "python3 plugins/laserglyph.py", "display": True},
 | 
			
		||||
	"planet":  		{"OSC": 8005, "command": "python3 plugins/planetarium/main.py", "display": True},
 | 
			
		||||
	"words":        {"OSC": 8006, "command": "python3 plugins/livewords3.py", "display": True},
 | 
			
		||||
	"cycl": 	    {"OSC": 8007, "command": "python3 plugins/textcycl.py", "display": True},
 | 
			
		||||
	"simu": 	    {"OSC": 8008, "command": "python plugins/pysimu.py", "display": False},
 | 
			
		||||
	"artnet": 	    {"OSC": 8009, "command": "python3 libs3/artnet.py", "display": False},
 | 
			
		||||
	"trckr": 	    {"OSC": 8017, "command": "python3 plugins/trckr.py", "display": False},
 | 
			
		||||
	"maxw": 	    {"OSC": 8012, "command": "python3 plugins/maxwell.py", "display": True},
 | 
			
		||||
	"square": 	    {"OSC": 8013, "command": "python3 plugins/square.py", "display": True},
 | 
			
		||||
	"custom1":		{"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True},
 | 
			
		||||
	"mitraille": 	{"OSC": 8015, "command": "python3 plugins/audio/mitraille.py", "display": True},
 | 
			
		||||
	"livecode": 	{"OSC": 8016, "command": "python3 plugins/livecoding.py", "display": True},
 | 
			
		||||
	"ljpong":       {"OSC": 8020, "command": "python plugins/games/ljpong/main.py", "display": True},
 | 
			
		||||
	"ljwars": 	    {"OSC": 8021, "command": "python plugins/games/ljsw/main.py", "display": True},
 | 
			
		||||
	"audiogen":		{"OSC": 8030, "command": "python3 plugins/audio/audiogen.py", "display": False},
 | 
			
		||||
	"midigen":		{"OSC": 8031, "command": "python3 plugins/audio/midigen.py", "display": False},
 | 
			
		||||
	"viewgen":		{"OSC": 8032, "command": "python3 plugins/audio/viewgen.py", "display": True}
 | 
			
		||||
	"custom1":		{"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										114
									
								
								LJ_template.conf
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								LJ_template.conf
									
									
									
									
									
								
							@ -1,114 +0,0 @@
 | 
			
		||||
[General]
 | 
			
		||||
lasernumber = 1
 | 
			
		||||
debug = 0
 | 
			
		||||
ljayserverip = 0.0.0.0
 | 
			
		||||
wwwip = 192.168.2.43
 | 
			
		||||
nozoscip = 127.0.0.1
 | 
			
		||||
bhoroscip = 127.0.0.1
 | 
			
		||||
autostart = artnet
 | 
			
		||||
wstype = ws
 | 
			
		||||
wsport = 9001
 | 
			
		||||
 | 
			
		||||
[laser0]
 | 
			
		||||
color = -1
 | 
			
		||||
type = DS1000
 | 
			
		||||
ip = 192.168.2.3
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
zoomx = 50.0
 | 
			
		||||
zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = 1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
	 [ 1500., 1500.],
 | 
			
		||||
	 [ 1500.,-1500.],
 | 
			
		||||
	 [-1500.,-1500.]]
 | 
			
		||||
 | 
			
		||||
[laser1]
 | 
			
		||||
color = -1
 | 
			
		||||
type = LOCAL
 | 
			
		||||
ip = 192.168.2.5
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
zoomx = 50.0
 | 
			
		||||
zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = -1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [ (1.0, 2),(0.25, 1), (0.75, 1), (1.0, 5)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
	 [ 1500., 1500.],
 | 
			
		||||
	 [ 1500.,-1500.],
 | 
			
		||||
	 [-1500.,-1500.]]
 | 
			
		||||
 | 
			
		||||
[laser2]
 | 
			
		||||
color = -1
 | 
			
		||||
type = LUKE400
 | 
			
		||||
ip = 192.168.2.6
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
zoomx = 50.0
 | 
			
		||||
zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = -1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
	[ 1500., 1500.],
 | 
			
		||||
	[ 1500.,-1500.],
 | 
			
		||||
	[-1500.,-1500.]]
 | 
			
		||||
 | 
			
		||||
[laser3]
 | 
			
		||||
color = -1
 | 
			
		||||
type = LUKE400
 | 
			
		||||
ip = 192.168.1.5
 | 
			
		||||
kpps = 25000
 | 
			
		||||
centerx = 0
 | 
			
		||||
centery = 0
 | 
			
		||||
zoomx = 50.0
 | 
			
		||||
zoomy = 50.0
 | 
			
		||||
sizex = 32000
 | 
			
		||||
sizey = 32000
 | 
			
		||||
finangle = 0.0
 | 
			
		||||
swapx = -1
 | 
			
		||||
swapy = -1
 | 
			
		||||
lsteps = [(1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]
 | 
			
		||||
warpdest = [[-1500., 1500.],
 | 
			
		||||
	[ 1500., 1500.],
 | 
			
		||||
	[ 1500.,-1500.],
 | 
			
		||||
	[-1500.,-1500.]]
 | 
			
		||||
 | 
			
		||||
[plugins]
 | 
			
		||||
plugins = {
 | 
			
		||||
	"aurora": 		{"OSC": 8090, "command": "python3 plugins/aurora/aurora.py", "display": True},
 | 
			
		||||
	"nozoid":       {"OSC": 8003, "command": "python3 plugins/audio/nozoids3.py", "display": True},
 | 
			
		||||
	"glyph":	 	{"OSC": 8004, "command": "python3 plugins/laserglyph.py", "display": True},
 | 
			
		||||
	"planet":  		{"OSC": 8005, "command": "python3 plugins/planetarium/main.py", "display": True},
 | 
			
		||||
	"words":        {"OSC": 8006, "command": "python3 plugins/livewords3.py", "display": True},
 | 
			
		||||
	"cycl": 	    {"OSC": 8007, "command": "python3 plugins/textcycl.py", "display": True},
 | 
			
		||||
	"simu": 	    {"OSC": 8008, "command": "python plugins/pysimu.py", "display": False},
 | 
			
		||||
	"artnet": 	    {"OSC": 8009, "command": "python3 libs3/artnet.py", "display": False},
 | 
			
		||||
	"trckr": 	    {"OSC": 8017, "command": "python3 plugins/trckr.py", "display": False},
 | 
			
		||||
	"maxw": 	    {"OSC": 8012, "command": "python3 plugins/maxwell.py", "display": True},
 | 
			
		||||
	"square": 	    {"OSC": 8013, "command": "python3 plugins/square.py", "display": True},
 | 
			
		||||
	"custom1":		{"OSC": 8014, "command": "python3 plugins/custom1.py", "display": True},
 | 
			
		||||
	"mitraille": 	{"OSC": 8015, "command": "python3 plugins/audio/mitraille.py", "display": True},
 | 
			
		||||
	"livecode": 	{"OSC": 8016, "command": "python3 plugins/livecoding.py", "display": True},
 | 
			
		||||
	"ljpong":       {"OSC": 8020, "command": "python plugins/games/ljpong/main.py", "display": True},
 | 
			
		||||
	"ljwars": 	    {"OSC": 8021, "command": "python plugins/games/ljsw/main.py", "display": True},
 | 
			
		||||
	"audiogen":		{"OSC": 8030, "command": "python3 plugins/audio/audiogen.py", "display": False},
 | 
			
		||||
	"midigen":		{"OSC": 8031, "command": "python3 plugins/audio/midigen.py", "display": False},
 | 
			
		||||
	"viewgen":		{"OSC": 8032, "command": "python3 plugins/audio/viewgen.py", "display": True}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								Pd/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Pd/.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										23
									
								
								Pd/LJsender.pd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								Pd/LJsender.pd
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
#N canvas 468 143 709 527 10;
 | 
			
		||||
#X msg 60 237 disconnect;
 | 
			
		||||
#X floatatom 27 294 0 0 0 0 - - -;
 | 
			
		||||
#X text 22 315 Outlet is nonzero if connection is open \, zero otherwise.
 | 
			
		||||
;
 | 
			
		||||
#X msg 37 60 send mytext trololo;
 | 
			
		||||
#X obj 28 267 netsend 1;
 | 
			
		||||
#X msg 51 125 send /pl/0/0 (150 2300 65280) (170 170 65280) (230 170
 | 
			
		||||
65280) (210 230 65280) (150 230 65280);
 | 
			
		||||
#X text 258 29 LJ Sender;
 | 
			
		||||
#X msg 46 84 send /pl/0/0 150 2300 65280 170 170 65280 230 170 65280
 | 
			
		||||
210 230 65280 150 230 65280;
 | 
			
		||||
#X msg 26 39 connect 127.0.0.1 8083;
 | 
			
		||||
#X msg 58 165 send /pl/0/0 [(150.0:230.0:65280) (170.0:170.0:65280)
 | 
			
		||||
(230.0:170.0:65280) (210.0:230.0:65280) (150.0:230.0:65280)];
 | 
			
		||||
#X text 444 174 <- le mieux;
 | 
			
		||||
#X connect 0 0 4 0;
 | 
			
		||||
#X connect 3 0 4 0;
 | 
			
		||||
#X connect 4 0 1 0;
 | 
			
		||||
#X connect 5 0 4 0;
 | 
			
		||||
#X connect 7 0 4 0;
 | 
			
		||||
#X connect 8 0 4 0;
 | 
			
		||||
#X connect 9 0 4 0;
 | 
			
		||||
							
								
								
									
										106
									
								
								Pd/ljpd.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								Pd/ljpd.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,106 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# -*- mode: Python -*-
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
LJPD
 | 
			
		||||
 | 
			
		||||
Udp server to redis
 | 
			
		||||
v0.1b
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
import traceback, time
 | 
			
		||||
import argparse
 | 
			
		||||
import socket
 | 
			
		||||
import _thread
 | 
			
		||||
import redis
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
print()
 | 
			
		||||
print ("LJPD")
 | 
			
		||||
print ("Arguments parsing if needed...")
 | 
			
		||||
argsparser = argparse.ArgumentParser(description="dumpUDP v0.1b help mode")
 | 
			
		||||
argsparser.add_argument("-i","--IP",help="IP to bind to (0.0.0.0 by default)", type=str)
 | 
			
		||||
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)", type=str)
 | 
			
		||||
argsparser.add_argument("-l","--lj",help="LJ IP address (127.0.0.1 by default)", type=str)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
args = argsparser.parse_args()
 | 
			
		||||
 | 
			
		||||
# LJ server IP name
 | 
			
		||||
if args.IP:
 | 
			
		||||
    ljIP = lj.IP
 | 
			
		||||
else:
 | 
			
		||||
    ljIP = "127.0.0.1"
 | 
			
		||||
 | 
			
		||||
# Server 
 | 
			
		||||
if args.IP:
 | 
			
		||||
    serverIP = args.IP
 | 
			
		||||
else:
 | 
			
		||||
    serverIP = "0.0.0.0"
 | 
			
		||||
 | 
			
		||||
# ORCA destination device
 | 
			
		||||
if args.port:
 | 
			
		||||
    UDPORT = int(args.port)
 | 
			
		||||
else:
 | 
			
		||||
    UDPORT = 8083
 | 
			
		||||
 | 
			
		||||
print("Connecting to Redis...")
 | 
			
		||||
 | 
			
		||||
r = redis.StrictRedis(host= ljIP, port=6379, db=0)
 | 
			
		||||
 | 
			
		||||
def GetTime():
 | 
			
		||||
  return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def udp_thread():
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
 | 
			
		||||
        payload, client_address = sock.recvfrom(1024)
 | 
			
		||||
        udpath = payload.decode('utf_8')
 | 
			
		||||
        print(GetTime(),"From", str(client_address),"got", udpath )
 | 
			
		||||
        #r.set('/pl/0/0', "/pl/"+str(clientnumber)+"/")
 | 
			
		||||
        #print(udpath[0:1], " ",udpath[1:2], " ",udpath[2:3], " ",udpath[3:4], " " )
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        # Reply to client
 | 
			
		||||
        bytesToSend = str.encode("ACK :"+str(payload))
 | 
			
		||||
        serverAddressPort   = (client_address, UDPORT)
 | 
			
		||||
        bufferSize          = 1024
 | 
			
		||||
        #sock.sendto(bytesToSend, serverAddressPort)
 | 
			
		||||
        sock.sendto(bytesToSend, client_address)
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        time.sleep(0.005)     
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def Start(serverIP, UDPORT):
 | 
			
		||||
    global sock
 | 
			
		||||
 | 
			
		||||
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
			
		||||
    server = ( serverIP,UDPORT)
 | 
			
		||||
    sock.bind(server)
 | 
			
		||||
    _thread.start_new_thread(udp_thread, ())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Launch server in another thread.
 | 
			
		||||
print("Launching UDP Server", serverIP,':', UDPORT)
 | 
			
		||||
Start(serverIP, UDPORT) 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Do something else
 | 
			
		||||
try:
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
        time.sleep(0.005)
 | 
			
		||||
 | 
			
		||||
except Exception:
 | 
			
		||||
    traceback.print_exc()
 | 
			
		||||
 | 
			
		||||
finally:
 | 
			
		||||
    print("")
 | 
			
		||||
    print("ljpd stopped.")
 | 
			
		||||
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
LJ v0.8.2
 | 
			
		||||
LJ v0.8.2 'fireandforget'
 | 
			
		||||
 | 
			
		||||
By Sam Neurohack, Loloster, Cocoa
 | 
			
		||||
 | 
			
		||||
@ -7,17 +7,26 @@ LICENCE : CC BY
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
A software laser framework with GUI, for up to 4 lasers live actions with ethedreams DACs. Think creative like Laser "battles", planetarium, sharing available lasers in demoparties for competition, ... 
 | 
			
		||||
LJ is like a video projector where you fire images and forget. Lasers are dangerous : you can really fire real world objects.
 | 
			
		||||
 | 
			
		||||
A software laser framework with webGUI, for up to 4 lasers live actions with ethedreams DACs. Think creative like Laser "battles", planetarium, sharing available lasers in demoparties for competition,... 
 | 
			
		||||
 | 
			
		||||
LJ has 5 main components : 
 | 
			
		||||
 | 
			
		||||
- "Plugins" are points generators (to one or more lasers). Lot examples comes with LJ : planetarium, 3D anaglyph animations,... See plugins directory.
 | 
			
		||||
- "Plugins" are "frames" generators to one or more lasers. Frames goes to different possible frames inputs of the "manager". With laser one frame = one polyline, like in LOGO. Lot examples comes with LJ : planetarium, 3D anaglyph animations,... See plugins directory.
 | 
			
		||||
- A "tracer" per etherdream/laser that take its given point list, correct geometry, recompute in laser controller coordinates, send it to its controller and report its status to the "manager".
 | 
			
		||||
- A "manager" that talk to all tracers (which client number point lists to draw, new geometry correction,...), handle IOs (webui functions, OSC commands,...) and plugins.
 | 
			
		||||
- A "manager" that talk to all tracers (which point lists to draw, new geometry correction,...), handle IOs (webui functions, OSC commands,...) and plugins.
 | 
			
		||||
- A web GUI in html, css, and vanilla js. This UI can be used in a tablet, computer, whatever. LJ does not come with an html server but absolutely can . This GUI has a (currently slow) simulator, but one can also use an etherdream/laser emulator (see nannou simulator below) to work without physical lasers !! 
 | 
			
		||||
- A network available database (redis). "Plugins" can send directly their pointlists to redis. Each "tracer" is instructed to get one of the avalaible pointlist in redis.
 | 
			
		||||
 | 
			
		||||
"Frames" (actually polylines) inputs are :
 | 
			
		||||
 | 
			
		||||
- OSC (port 8002)
 | 
			
		||||
- Websocket (port 9001)
 | 
			
		||||
- Cli pipe (see clitools)
 | 
			
		||||
- Redis keys
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Important : for best performance LJ is meant to run in a dedicated computer especially with multiple lasers and highly multitasked load : if you watch video, use live webcam face recognition, webui simulator,... and run LJ on the same computer, well you need a bunch of cores. If you don't, spread the load : you can use webui on a tablet, the livecam on a phone, run pointlists generators on another computer,...
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@ -384,6 +393,8 @@ python3 talk3.py -i etherdreamIP
 | 
			
		||||
 | 
			
		||||
- Switch to simu page. If you don't see anything : check redis server or your points in redis doesn't respect pointlist formatting (see command reference).
 | 
			
		||||
 | 
			
		||||
- Check Leds : for each IRL lasers the two sets of must be green at startup and laser should display their number or the pointlist you want.
 | 
			
		||||
 | 
			
		||||
- If talk3 works but you don't see your points : click on the Grid icon in Align page. This will override your pointlist and display squares. If Grid works : recomputed points by tracers are "bad" with given values in LJ.conf.
 | 
			
		||||
 | 
			
		||||
"Bad points" ?
 | 
			
		||||
@ -444,8 +455,6 @@ lsteps is a string like "[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]"
 | 
			
		||||
 
 | 
			
		||||
/scene/scenenumber/start 0 or 1 : tell all tracers to use given scene
 | 
			
		||||
 | 
			
		||||
/regen : regen webui index html page.
 | 
			
		||||
 | 
			
		||||
/scim : change webui simulated laser.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										84
									
								
								clitools/exports/toUDP.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								clitools/exports/toUDP.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# -*- mode: Python -*-
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
toUDP
 | 
			
		||||
v0.1.0
 | 
			
		||||
 | 
			
		||||
A basic exporter 
 | 
			
		||||
 | 
			
		||||
LICENCE : CC
 | 
			
		||||
 | 
			
		||||
by cocoa 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import argparse
 | 
			
		||||
import time 
 | 
			
		||||
import socket
 | 
			
		||||
import ast
 | 
			
		||||
 | 
			
		||||
argsparser = argparse.ArgumentParser(description="toUDP v0.1b help mode")
 | 
			
		||||
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
 | 
			
		||||
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
 | 
			
		||||
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)",default="9003",type=str)
 | 
			
		||||
args = argsparser.parse_args()
 | 
			
		||||
 | 
			
		||||
verbose             = args.verbose
 | 
			
		||||
ip                  = args.ip
 | 
			
		||||
port                = int(args.port)
 | 
			
		||||
verbose             = args.verbose
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
name    = "exports::toUDP"
 | 
			
		||||
 | 
			
		||||
def debug(*args, **kwargs):
 | 
			
		||||
    if( verbose == False ):
 | 
			
		||||
        return
 | 
			
		||||
    print(*args, file=sys.stderr, **kwargs)
 | 
			
		||||
 | 
			
		||||
def ClientStart(ip, port):
 | 
			
		||||
    global sockclient
 | 
			
		||||
 | 
			
		||||
    sockclient = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
 | 
			
		||||
 | 
			
		||||
def ClientSend(msgFromClient):
 | 
			
		||||
 | 
			
		||||
    bytesToSend         = str.encode(str(msgFromClient))
 | 
			
		||||
    serverAddressPort   = (ip, port)
 | 
			
		||||
    bufferSize          = 1024
 | 
			
		||||
 | 
			
		||||
    # Send to server using created UDP socket
 | 
			
		||||
    sockclient.sendto(bytesToSend, serverAddressPort)
 | 
			
		||||
 | 
			
		||||
    '''
 | 
			
		||||
    # If reply :
 | 
			
		||||
    msgFromServer = sockclient.recvfrom(bufferSize)
 | 
			
		||||
 | 
			
		||||
    msg = "Message from Server {}".format(msgFromServer[0])
 | 
			
		||||
    print(msg)
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
 | 
			
		||||
    ClientStart(ip, port)
 | 
			
		||||
    while True:
 | 
			
		||||
 | 
			
		||||
        line = sys.stdin.readline()
 | 
			
		||||
        if line == "":
 | 
			
		||||
            time.sleep(0.01)
 | 
			
		||||
        line = line.rstrip('\n')
 | 
			
		||||
        #pointsList = ast.literal_eval(line)
 | 
			
		||||
        debug(name,": "+line)
 | 
			
		||||
        ClientSend(line)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
except EOFError:
 | 
			
		||||
    debug("break")# no more information
 | 
			
		||||
 | 
			
		||||
@ -163,6 +163,7 @@ try:
 | 
			
		||||
      # Do the filter
 | 
			
		||||
      result = kaleidoscope( pointsList ) 
 | 
			
		||||
      print( result, flush=True )
 | 
			
		||||
 | 
			
		||||
      looptime = time.time() - start
 | 
			
		||||
      # debug(name+" looptime:"+str(looptime))
 | 
			
		||||
      if( looptime < optimal_looptime ):
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										126
									
								
								clitools/generators/fromOSC.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								clitools/generators/fromOSC.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,126 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# -*- mode: Python -*-
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
Forward /pl pointlist to cli
 | 
			
		||||
 | 
			
		||||
input OSC  in END points format : (x,y,color)
 | 
			
		||||
output CLI in CLI points format : [x,y,color]
 | 
			
		||||
 | 
			
		||||
/pl "[(150.0, 230.0, 255), (170.0, 170.0, 255), (230.0, 170.0, 255), (210.0, 230.0, 255), (150.0, 230.0, 255)]"
 | 
			
		||||
 | 
			
		||||
v0.1.0
 | 
			
		||||
 | 
			
		||||
LICENCE : CC
 | 
			
		||||
 | 
			
		||||
by Cocoa, Sam Neurohack 
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
from OSC3 import OSCServer, OSCClient, OSCMessage
 | 
			
		||||
import sys
 | 
			
		||||
from time import sleep
 | 
			
		||||
import argparse
 | 
			
		||||
import ast
 | 
			
		||||
 | 
			
		||||
argsparser      = argparse.ArgumentParser(description="fromOSC generator")
 | 
			
		||||
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
 | 
			
		||||
argsparser.add_argument("-p","--port",help="OSC port to bind to (9002 by default)",default=9002,type=str)
 | 
			
		||||
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
 | 
			
		||||
args = argsparser.parse_args()
 | 
			
		||||
 | 
			
		||||
verbose             = args.verbose
 | 
			
		||||
ip                  = args.ip
 | 
			
		||||
port                = int(args.port)
 | 
			
		||||
 | 
			
		||||
def debug(*args, **kwargs):
 | 
			
		||||
    if( verbose == False ):
 | 
			
		||||
        return
 | 
			
		||||
    print(*args, file=sys.stderr, **kwargs)
 | 
			
		||||
 | 
			
		||||
oscserver = OSCServer( (ip, port) )
 | 
			
		||||
oscserver.timeout = 0
 | 
			
		||||
run = 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)
 | 
			
		||||
 | 
			
		||||
# RAW OSC Frame available ? 
 | 
			
		||||
def OSC_frame():
 | 
			
		||||
    # clear timed_out flag
 | 
			
		||||
    oscserver.timed_out = False
 | 
			
		||||
    # handle all pending requests then return
 | 
			
		||||
    while not oscserver.timed_out:
 | 
			
		||||
        oscserver.handle_request()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# default handler
 | 
			
		||||
def OSChandler(oscpath, tags, args, source):
 | 
			
		||||
 | 
			
		||||
    oscaddress = ''.join(oscpath.split("/"))
 | 
			
		||||
    debug("fromOSC Default OSC Handler got oscpath", oscpath, "from"  + str(source[0]), ":", args)
 | 
			
		||||
    #print("OSC address", path)
 | 
			
		||||
    #print("find.. /bhoreal ?", path.find('/bhoreal'))
 | 
			
		||||
 | 
			
		||||
    if oscpath == "/pl" and len(args)==1:
 | 
			
		||||
            
 | 
			
		||||
        debug("correct OSC type :'/pl")
 | 
			
		||||
 | 
			
		||||
        if validate(args[0]) == True: 
 | 
			
		||||
 | 
			
		||||
            debug("new pl : ", args[0])
 | 
			
		||||
            line = args[0].replace("(",'[')
 | 
			
		||||
            line = line.replace(")",']')
 | 
			
		||||
            line = "[{}]".format(line)
 | 
			
		||||
            print(line, flush=True);
 | 
			
		||||
 | 
			
		||||
        else: 
 | 
			
		||||
            debug("Bad pointlist -> msg trapped.")
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
       debug("BAD OSC Message : " + oscpath +" " +args[0])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
oscserver.addMsgHandler( "default", OSChandler )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def validate(pointlist):
 | 
			
		||||
 | 
			
		||||
    state = True
 | 
			
		||||
 | 
			
		||||
    if len(pointlist)<9:
 | 
			
		||||
        debug("Not enough characters :", pointlist)
 | 
			
		||||
        state = False
 | 
			
		||||
 | 
			
		||||
    if pointlist.find("(") == -1:
 | 
			
		||||
        debug("Bad format : use () not [] for points", pointlist)
 | 
			
		||||
        state = False
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        pl = bytes(pointlist, 'ascii')
 | 
			
		||||
        check = ast.literal_eval(pl.decode('ascii'))
 | 
			
		||||
 | 
			
		||||
    except:
 | 
			
		||||
        debug("BAD POINTLIST :", pointlist)
 | 
			
		||||
        state = False
 | 
			
		||||
 | 
			
		||||
    return state
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# simulate a "game engine"
 | 
			
		||||
while run:
 | 
			
		||||
    # do the game stuff:
 | 
			
		||||
    sleep(0.01)
 | 
			
		||||
    # call user script
 | 
			
		||||
    OSC_frame()
 | 
			
		||||
 | 
			
		||||
oscserver.close()
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										84
									
								
								clitools/generators/fromUDP.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								clitools/generators/fromUDP.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,84 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# -*- mode: Python -*-
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
 
 | 
			
		||||
fromUDP
 | 
			
		||||
 | 
			
		||||
Udp server to cli
 | 
			
		||||
v0.1b
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
from __future__ import print_function
 | 
			
		||||
import traceback, time
 | 
			
		||||
import argparse
 | 
			
		||||
import socket
 | 
			
		||||
import _thread
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
name="generator::fromUDP"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def debug(*args, **kwargs):
 | 
			
		||||
    if( verbose == False ):
 | 
			
		||||
        return
 | 
			
		||||
    print(*args, file=sys.stderr, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
argsparser = argparse.ArgumentParser(description="fromUDP v0.1b help mode")
 | 
			
		||||
argsparser.add_argument("-v","--verbose",action="store_true",help="Verbose output")
 | 
			
		||||
argsparser.add_argument("-i","--ip",help="IP to bind to (0.0.0.0 by default)",default="0.0.0.0",type=str)
 | 
			
		||||
argsparser.add_argument("-p","--port",help="UDP port to bind to (9000 by default)",default=9000,type=str)
 | 
			
		||||
args = argsparser.parse_args()
 | 
			
		||||
 | 
			
		||||
verbose             = args.verbose
 | 
			
		||||
ip                  = args.ip
 | 
			
		||||
port                = int(args.port)
 | 
			
		||||
verbose             = args.verbose
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def udp_thread():
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
 | 
			
		||||
        payload, client_address = sock.recvfrom(1024)
 | 
			
		||||
        udpath = payload.decode('utf_8')
 | 
			
		||||
        debug(udpath[0:])
 | 
			
		||||
        print(udpath[0:], flush=True);
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
        # Reply to client
 | 
			
		||||
        bytesToSend = str.encode("ACK :"+str(payload))
 | 
			
		||||
        serverAddressPort   = (client_address, port)
 | 
			
		||||
        bufferSize          = 1024
 | 
			
		||||
        #sock.sendto(bytesToSend, serverAddressPort)
 | 
			
		||||
        sock.sendto(bytesToSend, client_address)
 | 
			
		||||
        '''
 | 
			
		||||
 | 
			
		||||
def StartUDP(serverIP, UDPORT):
 | 
			
		||||
    global sock
 | 
			
		||||
 | 
			
		||||
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
			
		||||
    server = ( serverIP,UDPORT)
 | 
			
		||||
    sock.bind(server)
 | 
			
		||||
    _thread.start_new_thread(udp_thread, ())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
StartUDP(ip, port) 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Do something else
 | 
			
		||||
try:
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
        time.sleep(0.005)
 | 
			
		||||
 | 
			
		||||
except Exception:
 | 
			
		||||
    traceback.print_exc()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								ethertools/receivebroadcast.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ethertools/receivebroadcast.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# -*- mode: Python -*-
 | 
			
		||||
 | 
			
		||||
# or tcpdump -i eth1 port 54545 -XX
 | 
			
		||||
 | 
			
		||||
import socket
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def find_LJ():
 | 
			
		||||
    """Listen for broadcast packets."""
 | 
			
		||||
 | 
			
		||||
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 | 
			
		||||
    s.bind(("0.0.0.0", 54545))
 | 
			
		||||
 | 
			
		||||
    while True:
 | 
			
		||||
        data, addr = s.recvfrom(1024)
 | 
			
		||||
        print(" %s " % (data, ))
 | 
			
		||||
        print("Packet from %s: " % (addr, ))
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
find_LJ()
 | 
			
		||||
@ -70,12 +70,9 @@ def OSCframe():
 | 
			
		||||
        oscserver.handle_request()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# OSC server Thread : handler, dacs reports and simulator points sender to UI.
 | 
			
		||||
def osc_thread():
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    #print("osc Thread launched")
 | 
			
		||||
    try:
 | 
			
		||||
        while True:
 | 
			
		||||
@ -92,8 +89,6 @@ def osc_thread():
 | 
			
		||||
        print("\n")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Properly close the system. Todo
 | 
			
		||||
def Stop():
 | 
			
		||||
    oscserver.close()
 | 
			
		||||
 | 
			
		||||
@ -399,6 +399,16 @@ def handler(oscpath, args):
 | 
			
		||||
                DAChecks()
 | 
			
		||||
                print("Done.")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            if oscpath[2] == "reset":
 | 
			
		||||
                import shutil
 | 
			
		||||
                print()
 | 
			
		||||
                shutil.copyfile(gstt.ljpath+'/templates/LJ_template.conf', gstt.ljpath+'/LJ.conf')
 | 
			
		||||
                print("templates/LJ_template.conf copied to LJ.conf.")
 | 
			
		||||
                print("** RESTART LJ **")
 | 
			
		||||
                #LJautokill()
 | 
			
		||||
 | 
			
		||||
            
 | 
			
		||||
            if oscpath[2] == "restart":
 | 
			
		||||
                print()
 | 
			
		||||
                print("Restarting", args[0], "...")
 | 
			
		||||
@ -597,7 +607,7 @@ def UpdateAllwww():
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/LJ.js")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/trckr/trckrcam1.html")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/simu.html")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/align.html")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/settings.html")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/auralls.html")
 | 
			
		||||
    Updatepage(gstt.ljpath+"/www/index.html")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1013,7 +1013,3 @@ def TextRGB(message, zpos, c, layer, xpos, ypos, resize, rotx, roty, rotz):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
@ -15,7 +15,7 @@ from libs3 import gstt
 | 
			
		||||
import os
 | 
			
		||||
import subprocess
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
from socket import *
 | 
			
		||||
 | 
			
		||||
def Init(wserver):
 | 
			
		||||
    global WSserver
 | 
			
		||||
@ -177,6 +177,14 @@ def OSCsend(name, oscaddress, oscargs =''):
 | 
			
		||||
        #PluginStart(name)
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
def sendbroadcast():
 | 
			
		||||
 | 
			
		||||
    if gstt.debug > 0:
 | 
			
		||||
        print("Sending broadcast")
 | 
			
		||||
    cs = socket(AF_INET, SOCK_DGRAM)
 | 
			
		||||
    cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
 | 
			
		||||
    cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
 | 
			
		||||
    cs.sendto("LJ 0.8".encode(), ("255.255.255.255", 54545))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# for each plugin will automatically add /pluginame before oscpath to send like /aurora/scim 1, if oscpath = "/scim 1"
 | 
			
		||||
 | 
			
		||||
@ -447,9 +447,17 @@ class DAC(object):
 | 
			
		||||
			if order == 0:
 | 
			
		||||
				
 | 
			
		||||
				# USER point list
 | 
			
		||||
				self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
 | 
			
		||||
				
 | 
			
		||||
				#self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
 | 
			
		||||
				#print("Tracer : laser", self.mylaser, " order 0 : pl : ",len(self.pl))
 | 
			
		||||
 | 
			
		||||
				try:
 | 
			
		||||
					self.pl = ast.literal_eval(r.get(self.clientkey+str(self.mylaser)).decode('ascii'))
 | 
			
		||||
 | 
			
		||||
				except SyntaxError:
 | 
			
		||||
					print("BAD POINTLIST on Tracer : laser", self.mylaser, " order 0 : pl :",self.pl)
 | 
			
		||||
					self.pl = grid_points
 | 
			
		||||
 | 
			
		||||
			else:
 | 
			
		||||
	
 | 
			
		||||
				# Get the new EDH 
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										23
									
								
								main.py
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								main.py
									
									
									
									
									
								
							@ -36,12 +36,9 @@ print("")
 | 
			
		||||
import redis
 | 
			
		||||
import os
 | 
			
		||||
ljpath = r'%s' % os.getcwd().replace('\\','/')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
#sys.path.append('libs3/')
 | 
			
		||||
 | 
			
		||||
from libs3 import gstt, settings
 | 
			
		||||
gstt.ljpath = ljpath
 | 
			
		||||
 | 
			
		||||
@ -50,21 +47,21 @@ settings.Read()
 | 
			
		||||
 | 
			
		||||
# Arguments may alter .conf file so import settings first then cli
 | 
			
		||||
from libs3 import cli
 | 
			
		||||
 | 
			
		||||
settings.Write()
 | 
			
		||||
 | 
			
		||||
from multiprocessing import Process, set_start_method
 | 
			
		||||
import random, ast
 | 
			
		||||
 | 
			
		||||
from libs3 import plugins
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#from libs3 import lasytracer as tracer 
 | 
			
		||||
from libs3 import tracer3 as tracer 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
from libs3 import homographyp, commands, font1
 | 
			
		||||
 | 
			
		||||
#import subprocess
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
#import midi
 | 
			
		||||
 | 
			
		||||
from libs3 import OSC3 
 | 
			
		||||
from websocket_server import WebsocketServer
 | 
			
		||||
#import socket
 | 
			
		||||
@ -264,14 +261,16 @@ def osc_thread():
 | 
			
		||||
 | 
			
		||||
                #print("Sending simu frame from",'/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser))
 | 
			
		||||
                #print(r.get('/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)))
 | 
			
		||||
                sendWSall("/simul" +" "+ str(r.get('/pl/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)).decode('ascii')))
 | 
			
		||||
                sendWSall("/simul" +" "+ str(r.get('/po/'+str(gstt.SceneNumber)+'/'+str(gstt.Laser)).decode('ascii')))
 | 
			
		||||
                if random.randint(0,100)>95:
 | 
			
		||||
                    plugins.sendbroadcast()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            import sys, traceback
 | 
			
		||||
            print('\n---------------------')
 | 
			
		||||
            print('Exception: %s' % e)
 | 
			
		||||
            print('- - - - - - - - - - -')
 | 
			
		||||
            print('\n--------------------------')
 | 
			
		||||
            print('OSC Thread Exception: %s' % e)
 | 
			
		||||
            print('- - - - - - - - - - - - - - ')
 | 
			
		||||
            traceback.print_tb(sys.exc_info()[2])
 | 
			
		||||
            print("\n")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -181,7 +181,7 @@ log.infog("Aurora v0.1b")
 | 
			
		||||
OSCinPort = 8090
 | 
			
		||||
ljscene = 0
 | 
			
		||||
 | 
			
		||||
StartFXs = ["anim.Maxwell","anim.Starfield","anim.Starfield", "anim.Word"]
 | 
			
		||||
StartFXs = ["anim.Starfield","anim.Starfield","anim.Starfield", "anim.Word"]
 | 
			
		||||
 | 
			
		||||
# Useful variables init.
 | 
			
		||||
white = lj.rgb2int(255,255,255)
 | 
			
		||||
@ -1125,9 +1125,9 @@ def AllFX():
 | 
			
		||||
           dots = eval(LAY['FX']+"(LAY)")
 | 
			
		||||
           if LAY['FX'] != "Zero" or lent(dots) != 0:
 | 
			
		||||
                #print(dots, LAY['color'])
 | 
			
		||||
                for cc in range(15):
 | 
			
		||||
                    ccmidi[cc] = int(lj.fromKey("/midi/cc/1/"+str(cc)))
 | 
			
		||||
                    #print(ccmidi)
 | 
			
		||||
                #for cc in range(15):
 | 
			
		||||
                #    ccmidi[cc] = int(lj.fromKey("/midi/cc/1/"+str(cc)))
 | 
			
		||||
                #    #print(ccmidi)
 | 
			
		||||
                lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] + LAY['stepvals'][LAY['step']] - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'], resize = LAY['scale'] * audioR, rotx = LAY['Xrotdirec'], roty = LAY['Yrotdirec'], rotz = LAY['Zrotdirec'])
 | 
			
		||||
                #lj.rPolyLineOneColor(dots, c = LAY['color'], layer = l, closed = LAY['closed'], xpos = LAY['Xcoord'] - (ccmidi[0]-64)*4 - (LAY['lineSize']/2), ypos = Layer[l]['Ycoord'] + (ccmidi[1]-64)*4, resize = LAY['scale'] * audioR * (ccmidi[2])/50, rotx = LAY['Xrotdirec']+(ccmidi[3]*3), roty = LAY['Yrotdirec']+(ccmidi[3]*3), rotz = LAY['Zrotdirec']+(ccmidi[3]*3))
 | 
			
		||||
           else:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										937
									
								
								www/align.html
									
									
									
									
									
								
							
							
						
						
									
										937
									
								
								www/align.html
									
									
									
									
									
								
							@ -1,937 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <title>Align Rack</title>
 | 
			
		||||
        <meta charset="utf-8" />
 | 
			
		||||
        <meta name="apple-mobile-web-app-title" content="Align">
 | 
			
		||||
        <meta name="apple-mobile-web-app-capable" content="yes">
 | 
			
		||||
        <link rel="apple-touch-startup-image" href="/launch.png">
 | 
			
		||||
        <link rel="apple-touch-icon" href="touch-icon-iphone.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="152x152" href="touch-icon-ipad.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="180x180" href="touch-icon-iphone-retina.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="167x167" href="touch-icon-ipad-retina.png">
 | 
			
		||||
        
 | 
			
		||||
        <!-- Page specific styles -->
 | 
			
		||||
 | 
			
		||||
        <style>
 | 
			
		||||
 | 
			
		||||
        </style>
 | 
			
		||||
 | 
			
		||||
        <!-- Web audio buttons defaults -->
 | 
			
		||||
        <script  type="application/javascript" src="webcomponents-lite.js"></script>
 | 
			
		||||
        <script  type="application/javascript" src="config.js"></script>
 | 
			
		||||
        <script>
 | 
			
		||||
        WebAudioControlsOptions={
 | 
			
		||||
          useMidi:1,
 | 
			
		||||
          knobSrc:"knobs/simplegray.png",
 | 
			
		||||
          knobSprites:100,
 | 
			
		||||
          switchSrc:"knobs/switch_toggle.png",
 | 
			
		||||
          sliderSrc:"knobs/vsliderbody.png",
 | 
			
		||||
          sliderKnobsrc:"knobs/vsliderknob.png",
 | 
			
		||||
        }
 | 
			
		||||
        </script>
 | 
			
		||||
        <script src="webaudio-controls.js"></script>
 | 
			
		||||
        <!-- link rel="stylesheet" href="LJgrid.css" / -->
 | 
			
		||||
        <link rel="stylesheet" type="text/css" href="selector.min.css">
 | 
			
		||||
        <script type="application/javascript" src="selector.min.js"></script>
 | 
			
		||||
 | 
			
		||||
        <link rel="stylesheet" href="css/common.css" />
 | 
			
		||||
    </head>
 | 
			
		||||
 | 
			
		||||
    <body style="background-color:#222;">
 | 
			
		||||
    <div class="Rackcontent">
 | 
			
		||||
  <!--
 | 
			
		||||
     Navigation Rack
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
   <div class="content">
 | 
			
		||||
    <div class="buttons-7container">
 | 
			
		||||
 | 
			
		||||
        <a href="index.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Index
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
        <a href="align.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Align
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a href="auralls.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Aurora
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a href="trckr/trckrcam1.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Lasercam
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
          
 | 
			
		||||
        <a href="simu.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Simu
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart lj" >
 | 
			
		||||
            restrt LJ
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart aurora" >
 | 
			
		||||
            restrt AU
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Display Rack
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="TopRackGrid"> 
 | 
			
		||||
        <div>
 | 
			
		||||
          <h2>
 | 
			
		||||
          /TL Align
 | 
			
		||||
          <span class="shade"> </span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="knobs/switch1.png">
 | 
			
		||||
          </webaudio-switch>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" id="line1" class="busled"> 
 | 
			
		||||
          Align Rack
 | 
			
		||||
          </div>
 | 
			
		||||
          <div align="center" id="status" class="busled"> 
 | 
			
		||||
          /team/laser
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
            <div class="etherled" style="margin-left: 30px;margin-top: 1px;">
 | 
			
		||||
              Stt
 | 
			
		||||
              <webaudio-knob id="lstt/0" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lstt/1" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lstt/2" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lstt/3" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="etherled" style="margin-left: 30px;margin-top: 1px;">
 | 
			
		||||
              Ack
 | 
			
		||||
              <webaudio-knob id="lack/0" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lack/1" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lack/2" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
              <webaudio-knob id="lack/3" src="knobs/leds.png" height="17" width="17" diameter="17" min="0" max="6" value="0" sprites="6"></webaudio-knob>
 | 
			
		||||
            </div>
 | 
			
		||||
 | 
			
		||||
          </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Scene choice Rack
 | 
			
		||||
    -->
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="Settingrid"> 
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
        <h2>Scene</h2>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut" align="center" style="width: 83px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;"  onclick="onSubmit(this.id)" id="scene/0/start 1" >
 | 
			
		||||
            0
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut" align="center" style="width: 83px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;"  onclick="onSubmit(this.id)" id="scene/1/start 1" >
 | 
			
		||||
            1
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut" align="center" style="width: 83px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;"  onclick="onSubmit(this.id)" id="scene/2/start 1" >
 | 
			
		||||
            2
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut" align="center" style="width: 83px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;"  onclick="onSubmit(this.id)" id="scene/3/start 1" >
 | 
			
		||||
            3
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div> </div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Settings Rack
 | 
			
		||||
    
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="Settingrid"> 
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
        <h2>Settings</h2>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled" style="border: 1px solid #222;"> 
 | 
			
		||||
          Lasers
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
             <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
                <select name="settings/lasers" class = "submitalign" onchange = "onSubmit(this.id)" type="text" id="settings/lasers">
 | 
			
		||||
                  <option value="1" selected>1</option>
 | 
			
		||||
                  <option value="2">2</option>
 | 
			
		||||
                  <option value="3">3</option>
 | 
			
		||||
                  <option value="4">4</option>
 | 
			
		||||
                </select>
 | 
			
		||||
            </form>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="webaudiobut" align="center" style="width: 83px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020; text-align: middle;"  onclick="onSubmit(this.id)" id="settings/rescan" >
 | 
			
		||||
            Rescan
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        <div>
 | 
			
		||||
             <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
                <select name="settings/debug" class = "submitalign" onchange = "onSubmit(this.id)" type="text" id="settings/debug">
 | 
			
		||||
                  <option value="0" selected>0</option>
 | 
			
		||||
                  <option value="1">1</option>
 | 
			
		||||
                  <option value="2">2</option>
 | 
			
		||||
                </select>
 | 
			
		||||
            </form>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled" style="border: 1px solid #222;"> 
 | 
			
		||||
          Debug
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
      <div>
 | 
			
		||||
        <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
          <input class = "submite" onchange = "onSubmit(this.id)" type="text" id="settings/IP">
 | 
			
		||||
        </form>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut" align="center"  style="width: 73px;">
 | 
			
		||||
          <button type="button" class="navled" style="border: 1px solid #002020;"  onclick="onSubmit(this.id)" id="settings/regen" >
 | 
			
		||||
            Regen
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div> </div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Align Rack
 | 
			
		||||
    -->
 | 
			
		||||
    <div class="content" style="height: 500px">
 | 
			
		||||
 | 
			
		||||
    <div class="TextGrid">
 | 
			
		||||
 | 
			
		||||
    <div class="mgalign" style="margin-left:0px;">
 | 
			
		||||
      
 | 
			
		||||
   <!-- 
 | 
			
		||||
    Laser 0 
 | 
			
		||||
  -->
 | 
			
		||||
   <div class="laserbox" align="center">
 | 
			
		||||
    <!-- IP laser 0 -->
 | 
			
		||||
    <div>
 | 
			
		||||
      <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
      <input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/0">
 | 
			
		||||
      </form>
 | 
			
		||||
    </div>
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
     <!-- Laser type 
 | 
			
		||||
      <div class="spacer" style="height: 10px;"></div>
 | 
			
		||||
    <div >
 | 
			
		||||
       
 | 
			
		||||
          <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
            <select name="lasertype" class = "submite" onchange = "onSubmit(this.id)" type="text" id="lasertype/0">
 | 
			
		||||
              <option value="DS1000" selected>DS1000</option>
 | 
			
		||||
              <option value="Luke400">Luke400</option>
 | 
			
		||||
              <option value="Spectra">Spectra</option>
 | 
			
		||||
              <option value="Fire500">Fire500</option>
 | 
			
		||||
            </select>
 | 
			
		||||
          </form>
 | 
			
		||||
    </div>
 | 
			
		||||
    -->
 | 
			
		||||
    <div class="spacer" style="height: 8px;"></div>
 | 
			
		||||
 | 
			
		||||
        <div>
 | 
			
		||||
      <!-- Align Icons -->
 | 
			
		||||
        <webaudio-switch id="grid/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="mouse/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
 | 
			
		||||
        <!-- Blackout icon -->
 | 
			
		||||
        <webaudio-switch id="black/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
 | 
			
		||||
        <!-- Swap Icons -->
 | 
			
		||||
        <webaudio-switch id="swap/X/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="swap/Y/0" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div class="spacer" style="height: 6px;"></div>
 | 
			
		||||
 | 
			
		||||
    <!-- kpps knob -->
 | 
			
		||||
    <div><webaudio-knob id="kpps/0" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Lasergrid 0 -->
 | 
			
		||||
    <div class="lasergrid" style="background-image: url(knobs/lasergrid0.png);">
 | 
			
		||||
       <!-- kPPS & Points-->
 | 
			
		||||
       <div></div>
 | 
			
		||||
        <div><webaudio-param id="kpps/0" link="kpps/0" ></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param id="points/0" link="points/0"></webaudio-param></div>
 | 
			
		||||
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="lasertext">kPPS</div>
 | 
			
		||||
        <div class="lasertext">Buffer</div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Angle, Offset X, Offset Y -->
 | 
			
		||||
        <div><webaudio-knob id="angle/0" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/X/0" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/Y/0" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext">Angle</div>
 | 
			
		||||
        <div class="lasertext">Offset X</div>
 | 
			
		||||
        <div class="lasertext">Offset Y</div>
 | 
			
		||||
        <div><webaudio-param link="angle/0" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/X/0" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/Y/0" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Max global intensity, Scale X, Scale Y -->
 | 
			
		||||
        <div><webaudio-knob id="intens/0" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/X/0" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/Y/0" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext"style="color: #ddd;">Intens</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
         <div><webaudio-param link="intens/0" value="255"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/X/0" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/Y/0" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Red green blue % Intensity for color balancing -->
 | 
			
		||||
        <div><webaudio-knob id="red/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="green/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="blue/0" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext" style="color: #cbb;">Red</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bcb;">Green</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bbc;">Blue</div>
 | 
			
		||||
    </div>
 | 
			
		||||
   </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   <!-- 
 | 
			
		||||
    Laser 1 
 | 
			
		||||
  -->
 | 
			
		||||
   <div class="laserbox" align="center">
 | 
			
		||||
    <!-- IP laser 1 -->
 | 
			
		||||
    <div>
 | 
			
		||||
      <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
      <input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/1">
 | 
			
		||||
      </form>
 | 
			
		||||
     </div>
 | 
			
		||||
      <div class="spacer" style="height: 8px;"></div>
 | 
			
		||||
    <div >
 | 
			
		||||
 | 
			
		||||
      <!-- Align Icons -->
 | 
			
		||||
        <webaudio-switch id="grid/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="mouse/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
 | 
			
		||||
      
 | 
			
		||||
        <!-- Blackout icon -->
 | 
			
		||||
        <webaudio-switch id="black/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
 | 
			
		||||
      
 | 
			
		||||
        <!-- Swap Icons -->
 | 
			
		||||
        <webaudio-switch id="swap/X/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="swap/Y/1" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
 | 
			
		||||
    </div>
 | 
			
		||||
     <div class="spacer" style="height: 6px;"></div>
 | 
			
		||||
 | 
			
		||||
    <!-- kpps knob -->
 | 
			
		||||
    <div><webaudio-knob id="kpps/1" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Lasergrid 1 -->
 | 
			
		||||
    <div class="lasergrid" style="background-image: url(knobs/lasergrid1.png);">
 | 
			
		||||
 | 
			
		||||
       <!-- kPPS & Points-->
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div><webaudio-param id="kpps/1" link="kpps/1"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param id="points/1" link="points/1"></webaudio-param></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="lasertext">kPPS</div>
 | 
			
		||||
        <div class="lasertext">Buffer</div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Angle, Offset X, Offset Y -->
 | 
			
		||||
        <div><webaudio-knob id="angle/1" diameter="60" min="0" max="360"value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/X/1" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/Y/1" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext">Angle</div>
 | 
			
		||||
        <div class="lasertext">Offset X</div>
 | 
			
		||||
        <div class="lasertext">Offset Y</div>
 | 
			
		||||
        <div><webaudio-param link="angle/1" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/X/1" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/Y/1" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Max global intensity, Scale X, Scale Y -->
 | 
			
		||||
        <div><webaudio-knob id="intens/1" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/X/1" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/Y/1" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext"style="color: #ddd;">Intens</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
         <div><webaudio-param link="intens/1" value="255"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/X/1" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/Y/1" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Red green blue % Intensity for color balancing -->
 | 
			
		||||
        <div><webaudio-knob id="red/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="green/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="blue/1" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext" style="color: #cbb;">Red</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bcb;">Green</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bbc;">Blue</div>
 | 
			
		||||
    </div>
 | 
			
		||||
   </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   <!-- 
 | 
			
		||||
    Laser 2 
 | 
			
		||||
  -->
 | 
			
		||||
   <div class="laserbox" align="center">
 | 
			
		||||
    <!-- IP laser 2 -->
 | 
			
		||||
    <div>
 | 
			
		||||
      <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
      <input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/2">
 | 
			
		||||
      </form>
 | 
			
		||||
    </div>
 | 
			
		||||
     <div class="spacer" style="height: 8px;"></div>
 | 
			
		||||
    <div>
 | 
			
		||||
      
 | 
			
		||||
      <!-- Align Icons -->
 | 
			
		||||
        <webaudio-switch id="grid/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="mouse/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
 | 
			
		||||
      
 | 
			
		||||
        <!-- Blackout icon -->
 | 
			
		||||
        <webaudio-switch id="black/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
 | 
			
		||||
      
 | 
			
		||||
        <!-- Swap Icons -->
 | 
			
		||||
        <webaudio-switch id="swap/X/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="swap/Y/2" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="spacer" style="height: 6px;"></div>
 | 
			
		||||
        <!-- kpps knob -->
 | 
			
		||||
 | 
			
		||||
    <div><webaudio-knob id="kpps/2" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
 | 
			
		||||
 | 
			
		||||
    <!-- Laser 2 grid -->
 | 
			
		||||
    <div class="lasergrid" style="background-image: url(knobs/lasergrid2.png)">
 | 
			
		||||
        
 | 
			
		||||
        <!-- kPPS & Points-->
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div><webaudio-param id="kpps/2" link="kpps/2"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param id="points/2" link="points/2"></webaudio-param></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="lasertext">kPPS</div>
 | 
			
		||||
        <div class="lasertext">Buffer</div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Angle, Offset X, Offset Y -->
 | 
			
		||||
        <div><webaudio-knob id="angle/2" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/X/2" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/Y/2" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext">Angle</div>
 | 
			
		||||
        <div class="lasertext">Offset X</div>
 | 
			
		||||
        <div class="lasertext">Offset Y</div>
 | 
			
		||||
        <div><webaudio-param link="angle/2" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/X/2" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/Y/2" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Max global intensity, Scale X, Scale Y -->
 | 
			
		||||
        <div><webaudio-knob id="intens/2" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/X/2" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/Y/2" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext"style="color: #ddd;">Intens</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
         <div><webaudio-param link="intens/2" value="255"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/X/2" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/Y/2" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Red green blue % Intensity for color balancing -->
 | 
			
		||||
        <div><webaudio-knob id="red/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="green/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="blue/2" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext" style="color: #cbb;">Red</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bcb;">Green</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bbc;">Blue</div>
 | 
			
		||||
    </div>
 | 
			
		||||
   </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   <!-- 
 | 
			
		||||
    Laser 3 
 | 
			
		||||
  -->
 | 
			
		||||
   <div class="laserbox" align="center">
 | 
			
		||||
    <!-- IP laser 3 -->
 | 
			
		||||
    <div>
 | 
			
		||||
      <form onsubmit="onSubmit(); return false;">
 | 
			
		||||
      <input class = "submite" onchange = "onSubmit(this.id)" type="text" id="ip/3">
 | 
			
		||||
      </form>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="spacer" style="height: 8px;"></div>
 | 
			
		||||
    <div>
 | 
			
		||||
      
 | 
			
		||||
      <!-- Align Icons -->
 | 
			
		||||
        <webaudio-switch id="grid/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/grid.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="mouse/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/mouse.png"></webaudio-switch>
 | 
			
		||||
        
 | 
			
		||||
        <!-- Blackout icon -->
 | 
			
		||||
        <webaudio-switch id="black/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/blackout.png"></webaudio-switch>
 | 
			
		||||
        
 | 
			
		||||
        <!-- Swap Icons -->
 | 
			
		||||
        <webaudio-switch id="swap/X/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapx.png"></webaudio-switch>
 | 
			
		||||
        <webaudio-switch id="swap/Y/3" value="0" height="25" width="25" tooltip="Switch-B" src="knobs/swapy.png"></webaudio-switch>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="spacer" style="height: 6px;"></div>
 | 
			
		||||
 | 
			
		||||
    <!-- kpps knob -->
 | 
			
		||||
    <div><webaudio-knob id="kpps/3" diameter="60" min="100" max="40000" value="25000"></webaudio-knob></div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Laser 3 grid -->
 | 
			
		||||
    <div class="lasergrid" style="background-image: url(knobs/lasergrid3.png)">
 | 
			
		||||
 | 
			
		||||
        <!-- kPPS & Points-->
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div><webaudio-param id="kpps/3" link="kpps/3" ></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param id="points/3" link="points/3"></webaudio-param></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="lasertext">kPPS</div>
 | 
			
		||||
        <div class="lasertext">Buffer</div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Angle, Offset X, Offset Y -->
 | 
			
		||||
        <div><webaudio-knob id="angle/3" diameter="60" min="0" max="360" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/X/3" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="loffset/Y/3" diameter="60" min="-27000" max="27000" value="0"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext">Angle</div>
 | 
			
		||||
        <div class="lasertext">Offset X</div>
 | 
			
		||||
        <div class="lasertext">Offset Y</div>
 | 
			
		||||
        <div><webaudio-param link="angle/3" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/X/3" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="loffset/Y/3" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
        <div class="spacer" style="height: 5px;"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Max global intensity, Scale X, Scale Y -->
 | 
			
		||||
        <div><webaudio-knob id="intens/3" diameter="60" min="0" max="255" value="255"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/X/3" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="scale/Y/3" diameter="60" min="0" max="200" value="50"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext"style="color: #ddd;">Intens</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
        <div class="lasertext">Scale X</div>
 | 
			
		||||
         <div><webaudio-param link="intens/3" value="255"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/X/3" value="0"></webaudio-param></div>
 | 
			
		||||
        <div><webaudio-param link="scale/Y/3" value="0"></webaudio-param></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
        <div class="spacer"></div>
 | 
			
		||||
 | 
			
		||||
        <!-- Red green blue % Intensity for color balancing -->
 | 
			
		||||
        <div><webaudio-knob id="red/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="green/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div><webaudio-knob id="blue/3" diameter="60" min="0" max="100" value="100"></webaudio-knob></div>
 | 
			
		||||
        <div class="lasertext" style="color: #cbb;">Red</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bcb;">Green</div>
 | 
			
		||||
        <div class="lasertext" style="color: #bbc;">Blue</div>
 | 
			
		||||
    </div>
 | 
			
		||||
   </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   </div>  
 | 
			
		||||
 | 
			
		||||
   </div>  
 | 
			
		||||
 | 
			
		||||
   </div>  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Encoders Line
 | 
			
		||||
  
 | 
			
		||||
      # /aurora/radius       layernumber radius [0-1] 
 | 
			
		||||
      # /aurora/rotdirec layer axe direc
 | 
			
		||||
      # /aurora/linesize layer value
 | 
			
		||||
      # /aurora/rotdirec layer axe direc
 | 
			
		||||
      # /aurora/rotspeed layernumber axe speed
 | 
			
		||||
      # /aurora/transpeed layernumber axe transpeed
 | 
			
		||||
      # /aurora/transamt layernumber axe maxposition
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
  JS 
 | 
			
		||||
  -->
 | 
			
		||||
  
 | 
			
		||||
    <!-- LJ style WS : A nettoyer ! -->
 | 
			
		||||
 | 
			
		||||
      <script type="text/javascript">
 | 
			
		||||
      var LJ = websocket_uri
 | 
			
		||||
 | 
			
		||||
            var _WS = {
 | 
			
		||||
            uri: LJ,
 | 
			
		||||
            ws: null,
 | 
			
		||||
        
 | 
			
		||||
            init : function (e) {
 | 
			
		||||
              _WS.s = new WebSocket(_WS.uri);
 | 
			
		||||
              _WS.s.onopen = function (e) { _WS.onOpen(e); };
 | 
			
		||||
              _WS.s.onclose = function (e) { _WS.onClose(e); };
 | 
			
		||||
              _WS.s.onmessage = function (e) { _WS.onMessage(e); };
 | 
			
		||||
              _WS.s.onerror = function (e) { _WS.onError(e); };
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onOpen: function () {
 | 
			
		||||
            _WS.showstatus("Connected to "+LJ);
 | 
			
		||||
            document.getElementById("on").value = 1;
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onClose: function () {
 | 
			
		||||
              _WS.showline1('<span style="color: red;">LJ DISCONNECTED</span> ');
 | 
			
		||||
              document.getElementById("on").value = 0;
 | 
			
		||||
              document.getElementById("lstt/0").value = 0;
 | 
			
		||||
              document.getElementById("lstt/1").value = 0;
 | 
			
		||||
              document.getElementById("lstt/2").value = 0;
 | 
			
		||||
              document.getElementById("lstt/3").value = 0;
 | 
			
		||||
              document.getElementById("lack/0").value = 0;
 | 
			
		||||
              document.getElementById("lack/1").value = 0;
 | 
			
		||||
              document.getElementById("lack/2").value = 0;
 | 
			
		||||
              document.getElementById("lack/3").value = 0;
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onMessage: function (e) {
 | 
			
		||||
              var res = e.data.split(" ");
 | 
			
		||||
              //console.log(e.data)
 | 
			
		||||
              //console.log(res[0].substring(0,6))
 | 
			
		||||
              //console.log(res)
 | 
			
		||||
              //console.log(res[0].slice(1))
 | 
			
		||||
              var divtext = document.getElementById('status');
 | 
			
		||||
              var divtextp = document.getElementById('players');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
              switch (res[0].substring(0,6)) {
 | 
			
		||||
                
 | 
			
		||||
                case "/statu":
 | 
			
		||||
                        _WS.showline1("connected to "+LJ);
 | 
			
		||||
                      if (res[2]==="Disconnected"){
 | 
			
		||||
                         _WS.showstatus(res[1]+" "+'<span style="color: red;">'+ res[2]+'</span> ');
 | 
			
		||||
                        }
 | 
			
		||||
                      else{
 | 
			
		||||
                        _WS.showstatus(res[1]+" "+res[2]);
 | 
			
		||||
                        }
 | 
			
		||||
                      break;
 | 
			
		||||
                
 | 
			
		||||
                case "/redst":
 | 
			
		||||
                      //console.log("red"+res[1]+" "+res[2]);
 | 
			
		||||
                      _WS.showstatus('<span style="color: red;">'+res[1]+" "+ res[2]+'</span> ');
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/line1":
 | 
			
		||||
                      //divtext.innerHTML="connected to "+LJ;
 | 
			
		||||
                      divtext1.innerHTML=res[1]+" "+res[2];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/redline1":
 | 
			
		||||
                      //divtext.innerHTML="connected to "+LJ;
 | 
			
		||||
                      divtext1.innerHTML='<span style="color: red;">'+ res[1]+" "+res[2]+'</span>';
 | 
			
		||||
                      break;
 | 
			
		||||
      
 | 
			
		||||
                case "/lack/":
 | 
			
		||||
                      console.log("/lack "+res[1])
 | 
			
		||||
                      document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/lstt/":
 | 
			
		||||
                      console.log("/lstt "+res[1])
 | 
			
		||||
                      document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    //console.log("test "+res[0].slice(1)+" "+res[1]);
 | 
			
		||||
                    document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                    //_WS.showstatus(e.data);
 | 
			
		||||
                    break
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onError: function (e) {
 | 
			
		||||
              _WS.showstatus('<span style="color: red;">ERROR:</span> ' + e.data);
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showin: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showout: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showstatus: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showline1: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('line1');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            send: function (message) {
 | 
			
		||||
              if (!message.length) {
 | 
			
		||||
                alert('Empty message not allowed !');
 | 
			
		||||
              } else {
 | 
			
		||||
                _WS.showstatus(message);
 | 
			
		||||
                _WS.s.send(message);
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
        
 | 
			
		||||
            close: function () {
 | 
			
		||||
              _WS.showstatus('GOODBYE !');
 | 
			
		||||
              _WS.s.close();
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        
 | 
			
		||||
          window.addEventListener('load', _WS.init, false);    
 | 
			
		||||
          
 | 
			
		||||
        //
 | 
			
		||||
        // Forms submits
 | 
			
		||||
        //
 | 
			
		||||
        
 | 
			
		||||
          function onSubmit(clicked_id) {
 | 
			
		||||
            var input = document.getElementById(clicked_id);
 | 
			
		||||
            console.log("/" + clicked_id + " " + input.value);
 | 
			
		||||
            _WS.send("/" + clicked_id + " " + input.value);
 | 
			
		||||
            }
 | 
			
		||||
        
 | 
			
		||||
        </script>
 | 
			
		||||
 | 
			
		||||
      <!-- 
 | 
			
		||||
        web audio encoders scripts 
 | 
			
		||||
      -->
 | 
			
		||||
      
 | 
			
		||||
      <script type="text/javascript">
 | 
			
		||||
        var message="";
 | 
			
		||||
        var log=[];
 | 
			
		||||
        var knobs = document.getElementsByTagName('webaudio-knob');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < knobs.length; i++){
 | 
			
		||||
            knobs[i].addEventListener("input",Dump,false);
 | 
			
		||||
            knobs[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
        var sliders = document.getElementsByTagName('webaudio-slider');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < sliders.length; i++){
 | 
			
		||||
            sliders[i].addEventListener("input",Dump,false);
 | 
			
		||||
            sliders[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
        var switches = document.getElementsByTagName('webaudio-switch');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < switches.length; i++) {
 | 
			
		||||
            switches[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        function newlaser(id) {
 | 
			
		||||
 | 
			
		||||
          console.log("newlaser")
 | 
			
		||||
          nolaser();
 | 
			
		||||
          nofx();
 | 
			
		||||
 | 
			
		||||
          laserid = "noteon "+(24-id);
 | 
			
		||||
          console.log("laserid "+laserid);
 | 
			
		||||
        
 | 
			
		||||
          var x = document.getElementById(laserid);
 | 
			
		||||
          x.value = 1 ;
 | 
			
		||||
          console.log("laser "+id);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
        function nofx0() {
 | 
			
		||||
          console.log("nofx0")
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 ScanH");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 ScanV");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 Wave");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 Circle");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 Starfield");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 Word");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/fx/0 Trckr");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          }
 | 
			
		||||
          
 | 
			
		||||
      
 | 
			
		||||
        function nocolor0() {
 | 
			
		||||
          console.log("nocolor0")
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 red");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 yellow");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 green");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 blue");
 | 
			
		||||
           x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 cyan");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("aurora/color/0 white");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        function Dump(e) {
 | 
			
		||||
            var str="";
 | 
			
		||||
            str=e.type + " : " + e.target.id + " : " + e.target.value + " ";
 | 
			
		||||
            console.log(str);
 | 
			
		||||
            log.unshift(str);
 | 
			
		||||
            log.length=1;
 | 
			
		||||
            str="";
 | 
			
		||||
            
 | 
			
		||||
            for(var i=19;i>=0;--i) {
 | 
			
		||||
                if(log[i])
 | 
			
		||||
                    str+=log[i]+"<br/>";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _WS.send("/" + e.target.id + " " +  e.target.value);
 | 
			
		||||
 | 
			
		||||
          var res = e.target.id.split(" "); 
 | 
			
		||||
 | 
			
		||||
          // on off
 | 
			
		||||
          if (e.target.id === "on" && e.type === "change") {   
 | 
			
		||||
            window.location.reload();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          // Go to index
 | 
			
		||||
          if (e.target.id === "index" && e.type === "change") {   
 | 
			
		||||
            window.location.assign("index.html");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          // Fx
 | 
			
		||||
          if (res[0].substring(7,9) === "fx" && e.type === "change") {   
 | 
			
		||||
 | 
			
		||||
            var layer = res[0].substring(10,12);  
 | 
			
		||||
            nofx0();  
 | 
			
		||||
            var x = document.getElementById(e.target.id);
 | 
			
		||||
            x.value = 1 ;
 | 
			
		||||
            _WS.showstatus(e.target.id);
 | 
			
		||||
            
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          // Colors
 | 
			
		||||
          if (res[0].substring(7,9) === "co" && e.type === "change") {  
 | 
			
		||||
 | 
			
		||||
              var layer = res[0].substring(13,14);  
 | 
			
		||||
              console.log(layer)
 | 
			
		||||
              nocolor0();
 | 
			
		||||
              var x = document.getElementById(e.target.id);
 | 
			
		||||
              x.value = 1 ;
 | 
			
		||||
              _WS.showstatus(e.target.id);
 | 
			
		||||
              }
 | 
			
		||||
      
 | 
			
		||||
        }
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
@ -59,10 +59,10 @@
 | 
			
		||||
        </div>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
        <a href="align.html">
 | 
			
		||||
        <a href="settings.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Align
 | 
			
		||||
          Settings
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
@ -93,8 +93,8 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart lj" >
 | 
			
		||||
            rstrt LJ
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/reset" >
 | 
			
		||||
            Reset
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -101,15 +101,15 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Align Rack
 | 
			
		||||
    Settings Rack
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
  <a href="align.html">
 | 
			
		||||
  <a href="settings.html">
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="TopRackGrid"> 
 | 
			
		||||
        <div>
 | 
			
		||||
          <h2>
 | 
			
		||||
          Align
 | 
			
		||||
          Settings
 | 
			
		||||
          <span class="shade"> </span>
 | 
			
		||||
          </h2>
 | 
			
		||||
          <webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="knobs/switch1.png">
 | 
			
		||||
@ -117,7 +117,7 @@
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="busled"> 
 | 
			
		||||
          Align
 | 
			
		||||
          Settings
 | 
			
		||||
          </div>
 | 
			
		||||
          <div align="center"  class="busled"> 
 | 
			
		||||
           
 | 
			
		||||
 | 
			
		||||
@ -56,10 +56,10 @@
 | 
			
		||||
        </div>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
        <a href="align.html">
 | 
			
		||||
        <a href="settings.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled">
 | 
			
		||||
          Align
 | 
			
		||||
          Settings
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
@ -90,8 +90,8 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart lj" >
 | 
			
		||||
            rstrt LJ
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/reset" >
 | 
			
		||||
            reset
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,680 +0,0 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
	<head>
 | 
			
		||||
		<title>LASERCam 1</title>
 | 
			
		||||
		<meta charset="utf-8">
 | 
			
		||||
		<link href="./styles/bootstrap.min.css" rel="stylesheet" type="text/css">
 | 
			
		||||
        <meta name="apple-mobile-web-app-title" content="Tracker">
 | 
			
		||||
        <meta name="apple-mobile-web-app-capable" content="yes">
 | 
			
		||||
        <link rel="apple-touch-startup-image" href="../launch.png">
 | 
			
		||||
        <link rel="apple-touch-icon" href="../touch-icon-iphone.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="152x152" href="../touch-icon-ipad.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="180x180" href="../touch-icon-iphone-retina.png">
 | 
			
		||||
        <link rel="apple-touch-icon" sizes="167x167" href="../touch-icon-ipad-retina.png">
 | 
			
		||||
        
 | 
			
		||||
		<script  type="application/javascript" src="../config.js"></script>
 | 
			
		||||
		<style>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		</style>
 | 
			
		||||
		<script>
 | 
			
		||||
			// getUserMedia only works over https in Chrome 47+, so we redirect to https. Also notify user if running from file.
 | 
			
		||||
			if (window.location.protocol == "file:") {
 | 
			
		||||
				alert("You seem to be running this example directly from a file. Note that these examples only work when served from a server or localhost due to canvas cross-domain restrictions.");
 | 
			
		||||
			} else if (window.location.hostname !== "localhost" && window.location.protocol !== "https:"){
 | 
			
		||||
				window.location.protocol = "http";
 | 
			
		||||
				//window.location.protocol = "https";
 | 
			
		||||
			}
 | 
			
		||||
		</script>
 | 
			
		||||
		<!-- 
 | 
			
		||||
		<script type="text/javascript">
 | 
			
		||||
 | 
			
		||||
			var _gaq = _gaq || [];
 | 
			
		||||
			_gaq.push(['_setAccount', 'UA-32642923-1']);
 | 
			
		||||
			_gaq.push(['_trackPageview']);
 | 
			
		||||
 | 
			
		||||
			(function() {
 | 
			
		||||
				var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
 | 
			
		||||
				ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
 | 
			
		||||
				var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 | 
			
		||||
			})();
 | 
			
		||||
 | 
			
		||||
		</script>
 | 
			
		||||
		 -->
 | 
			
		||||
		<!-- Web audio buttons defaults -->
 | 
			
		||||
        <script  type="application/javascript" src="../webcomponents-lite.js"></script>
 | 
			
		||||
        <script>
 | 
			
		||||
        WebAudioControlsOptions={
 | 
			
		||||
          useMidi:1,
 | 
			
		||||
          knobSrc:"knobs/simplegray.png",
 | 
			
		||||
          knobSprites:100,
 | 
			
		||||
          switchSrc:"knobs/switch_toggle.png",
 | 
			
		||||
          sliderSrc:"knobs/vsliderbody.png",
 | 
			
		||||
          sliderKnobsrc:"knobs/vsliderknob.png",
 | 
			
		||||
        }
 | 
			
		||||
        </script>
 | 
			
		||||
        <script src="../webaudio-controls.js"></script>
 | 
			
		||||
        <!-- link rel="stylesheet" href="LJgrid.css" / -->
 | 
			
		||||
        <link rel="stylesheet" type="text/css" href="../selector.min.css">
 | 
			
		||||
        <script type="application/javascript" src="../selector.min.js"></script>
 | 
			
		||||
 | 
			
		||||
        <link rel="stylesheet" href="../css/common.css" />
 | 
			
		||||
 | 
			
		||||
	</head>
 | 
			
		||||
	<body style="background-color:#222;">
 | 
			
		||||
		<script src="./js/libs/utils.js"></script>
 | 
			
		||||
		<script src="../build/clmtrackr.js"></script>
 | 
			
		||||
		<script src="./js/libs/Stats.js"></script>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
    Top Rack
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div align="center">
 | 
			
		||||
    <a href="index.html"><img height="25" width="21" src="../knobs/indexs.png"></a>
 | 
			
		||||
    </div>
 | 
			
		||||
    -->
 | 
			
		||||
 | 
			
		||||
    <div class="Rackcontent">
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
     Navigation Rack
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
   <div class="content">
 | 
			
		||||
    <div class="buttons-7container">
 | 
			
		||||
 | 
			
		||||
        <a href="../index.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Index
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
        <a href="../align.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Align
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a href="../auralls.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Aurora
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
        <a href="trckrcam1.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Lasercam
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
          
 | 
			
		||||
        <a href="../simu.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Simu
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart lj" >
 | 
			
		||||
            rstrt LJ
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart aurora" >
 | 
			
		||||
            rstrt AU
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
     Lasers & colors Rack
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="TopRackGrid"> 
 | 
			
		||||
        <div>
 | 
			
		||||
         <h2>
 | 
			
		||||
          /TL RGY 1
 | 
			
		||||
          <span class="shade"> </span>
 | 
			
		||||
         </h2>
 | 
			
		||||
          <webaudio-switch id="on" value="1" tooltip="Switch-B" height="35" width="85" src="../knobs/switch1.png">
 | 
			
		||||
          </webaudio-switch>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div style="border : #242424 1px solid;background: #000;">
 | 
			
		||||
         <div align="center" id="line1" class="busled"> 
 | 
			
		||||
          LASERcam 1 : Allow to use your webcam + start
 | 
			
		||||
         </div>
 | 
			
		||||
         <div align="center" id="status" class="busled"> 
 | 
			
		||||
          /team/laser
 | 
			
		||||
         </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
        <div>
 | 
			
		||||
			<div style="margin-top : 30px;">
 | 
			
		||||
			</div>
 | 
			
		||||
			<div>
 | 
			
		||||
      		</div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
    <!--
 | 
			
		||||
    Colors Rack
 | 
			
		||||
    -->
 | 
			
		||||
    <div class="content">
 | 
			
		||||
      <div class="Rackgrid"> 
 | 
			
		||||
        <div>
 | 
			
		||||
        <h2>
 | 
			
		||||
          Colors 
 | 
			
		||||
          
 | 
			
		||||
        </h2>
 | 
			
		||||
        </div>
 | 
			
		||||
        
 | 
			
		||||
          <div class="webaudiobut"><webaudio-switch id="noteon 24" value="1" tooltip="Switch-B" height="64" width="64" src="../knobs/big0.png"></webaudio-switch></div>
 | 
			
		||||
          <div class="webaudiobut"><webaudio-switch id="noteon 25" value="0" tooltip="Switch-B" height="64" width="64" src=" ../knobs/big1.png"></webaudio-switch></div>
 | 
			
		||||
          <div class="webaudiobut"><webaudio-switch id="noteon 26" value="0" tooltip="Switch-B" height="64" width="64" src="../knobs/big2.png"></webaudio-switch></div>
 | 
			
		||||
          <div class="webaudiobut"><webaudio-switch id="noteon 27" value="0" tooltip="Switch-B" height="64" width="64" src="../knobs/big3.png"></webaudio-switch></div>
 | 
			
		||||
          <div></div>
 | 
			
		||||
        <div class="webaudiobut"><webaudio-switch id="trckr/color/0 red" value="1" tooltip="Switch-B" height="64" width="64" src="knobs/red.png"></webaudio-switch></div>
 | 
			
		||||
        <div class="webaudiobut"><webaudio-switch id="trckr/color/0 yellow" value="0" tooltip="Switch-B" height="64" width="64" src="knobs/yellow.png"></webaudio-switch></div>
 | 
			
		||||
        <div class="webaudiobut"><webaudio-switch id="trckr/color/0 green" value="0" tooltip="Switch-B" height="64" width="64" src="knobs/green.png"></webaudio-switch></div>
 | 
			
		||||
        <div></div>
 | 
			
		||||
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
      Webcam Rack
 | 
			
		||||
	-->
 | 
			
		||||
	 <div class="content" style="background-image: linear-gradient(174deg,  #111,#030303);">
 | 
			
		||||
		<video id="videoel"  class="webaudiobut" width="400" height="300" preload="auto" loop playsinline autoplay>
 | 
			
		||||
		</video>
 | 
			
		||||
		<canvas id="overlay" width="400" height="300"></canvas>
 | 
			
		||||
		<input class="btn" type="button" value="wait" style="margin-left: 150px;" disabled="disabled" onclick="startVideo()" id="startbutton"></input>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
     Big Display Rack
 | 
			
		||||
  -->
 | 
			
		||||
 | 
			
		||||
	 <div class="content">
 | 
			
		||||
		<div id="text" class="busled" style="font-size:1.5em;border : #242424 1px solid;background: #000;-webkit-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);-moz-box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);box-shadow: 4px 6px 10px -1px rgba(0,0,0,0.72);">
 | 
			
		||||
			<div id="gum" class="gum">
 | 
			
		||||
				<p>To try it out:
 | 
			
		||||
					<ol>
 | 
			
		||||
						<li>Allow the page to use your webcamera</li>
 | 
			
		||||
						<li>Make sure that your face is clearly visible in the video, and click start</li>
 | 
			
		||||
						<li>See the model fitted to your face</li>
 | 
			
		||||
					<ol>
 | 
			
		||||
				</p>
 | 
			
		||||
			</div>
 | 
			
		||||
			<div id="nogum" class="nogum">
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
	</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
  JS 
 | 
			
		||||
  -->
 | 
			
		||||
        
 | 
			
		||||
		<script>
 | 
			
		||||
			var vid = document.getElementById('videoel');
 | 
			
		||||
			var vid_width = vid.width;
 | 
			
		||||
			var vid_height = vid.height;
 | 
			
		||||
			var overlay = document.getElementById('overlay');
 | 
			
		||||
			var overlayCC = overlay.getContext('2d');
 | 
			
		||||
 | 
			
		||||
			/*********** Setup of video/webcam and checking for webGL support *********/
 | 
			
		||||
 | 
			
		||||
			function enablestart() {
 | 
			
		||||
				var startbutton = document.getElementById('startbutton');
 | 
			
		||||
				startbutton.value = "start";
 | 
			
		||||
				startbutton.disabled = null;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var insertAltVideo = function(video) {
 | 
			
		||||
				// insert alternate video if getUserMedia not available
 | 
			
		||||
				if (supports_video()) {
 | 
			
		||||
					if (supports_webm_video()) {
 | 
			
		||||
						video.src = "./media/cap12_edit.webm";
 | 
			
		||||
					} else if (supports_h264_baseline_video()) {
 | 
			
		||||
						video.src = "./media/cap12_edit.mp4";
 | 
			
		||||
					} else {
 | 
			
		||||
						return false;
 | 
			
		||||
					}
 | 
			
		||||
					return true;
 | 
			
		||||
				} else return false;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			function adjustVideoProportions() {
 | 
			
		||||
				// resize overlay and video if proportions of video are not 4:3
 | 
			
		||||
				// keep same height, just change width
 | 
			
		||||
				var proportion = vid.videoWidth/vid.videoHeight;
 | 
			
		||||
				vid_width = Math.round(vid_height * proportion);
 | 
			
		||||
				vid.width = vid_width;
 | 
			
		||||
				overlay.width = vid_width;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			function gumSuccess( stream ) {
 | 
			
		||||
				// add camera stream if getUserMedia succeeded
 | 
			
		||||
				if ("srcObject" in vid) {
 | 
			
		||||
					vid.srcObject = stream;
 | 
			
		||||
				} else {
 | 
			
		||||
					vid.src = (window.URL && window.URL.createObjectURL(stream));
 | 
			
		||||
				}
 | 
			
		||||
				vid.onloadedmetadata = function() {
 | 
			
		||||
					adjustVideoProportions();
 | 
			
		||||
					vid.play();
 | 
			
		||||
				}
 | 
			
		||||
				vid.onresize = function() {
 | 
			
		||||
					adjustVideoProportions();
 | 
			
		||||
					if (trackingStarted) {
 | 
			
		||||
						ctrack.stop();
 | 
			
		||||
						ctrack.reset();
 | 
			
		||||
						ctrack.start(vid);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			function gumFail() {
 | 
			
		||||
				// fall back to video if getUserMedia failed
 | 
			
		||||
				insertAltVideo(vid);
 | 
			
		||||
				document.getElementById('gum').className = "hide";
 | 
			
		||||
				document.getElementById('nogum').className = "nohide";
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
 | 
			
		||||
			window.URL = window.URL || window.webkitURL || window.msURL || window.mozURL;
 | 
			
		||||
 | 
			
		||||
			// set up video
 | 
			
		||||
			if (navigator.mediaDevices) {
 | 
			
		||||
				navigator.mediaDevices.getUserMedia({video : true}).then(gumSuccess).catch(gumFail);
 | 
			
		||||
			} else if (navigator.getUserMedia) {
 | 
			
		||||
				navigator.getUserMedia({video : true}, gumSuccess, gumFail);
 | 
			
		||||
			} else {
 | 
			
		||||
				insertAltVideo(vid);
 | 
			
		||||
				document.getElementById('gum').className = "hide";
 | 
			
		||||
				document.getElementById('nogum').className = "nohide";
 | 
			
		||||
				alert("Your browser does not seem to support getUserMedia, using a fallback video instead.");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			vid.addEventListener('canplay', enablestart, false);
 | 
			
		||||
 | 
			
		||||
			/*********** Code for face tracking *********/
 | 
			
		||||
 | 
			
		||||
			var ctrack = new clm.tracker();
 | 
			
		||||
			ctrack.init();
 | 
			
		||||
			var trackingStarted = false;
 | 
			
		||||
			var counter = 0;
 | 
			
		||||
			var layer = 0;
 | 
			
		||||
 | 
			
		||||
			function startVideo() {
 | 
			
		||||
				// start video
 | 
			
		||||
				vid.play();
 | 
			
		||||
				// start tracking
 | 
			
		||||
				ctrack.start(vid);
 | 
			
		||||
				trackingStarted = true;
 | 
			
		||||
				// start loop to draw face
 | 
			
		||||
				drawLoop();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			function drawLoop() {
 | 
			
		||||
				requestAnimFrame(drawLoop);
 | 
			
		||||
				overlayCC.clearRect(0, 0, vid_width, vid_height);
 | 
			
		||||
				//psrElement.innerHTML = "score :" + ctrack.getScore().toFixed(4);
 | 
			
		||||
				var positions = ctrack.getCurrentPosition();
 | 
			
		||||
				// do something with the positions ...
 | 
			
		||||
				// print the positions
 | 
			
		||||
				var positionString = "";
 | 
			
		||||
				var positionFace = 'trckr/frame '+layer+" "+counter+" ";
 | 
			
		||||
				if (positions) {
 | 
			
		||||
					ctrack.draw(overlay);
 | 
			
		||||
					for (var p = 0;p < 71;p++) {
 | 
			
		||||
						positionString += "featurepoint "+p+" : ["+positions[p][0].toFixed(2)+","+positions[p][1].toFixed(2)+"]<br/>";
 | 
			
		||||
						positionFace += positions[p][0].toFixed(2)+" "+positions[p][1].toFixed(2)+" ";
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
					//document.getElementById('positions').innerHTML = positionString;
 | 
			
		||||
					_WS.s.send(positionFace);
 | 
			
		||||
					counter +=1;
 | 
			
		||||
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			/*********** Code for stats **********/
 | 
			
		||||
 | 
			
		||||
			stats = new Stats();
 | 
			
		||||
			stats.domElement.style.position = 'absolute';
 | 
			
		||||
			stats.domElement.style.top = '0px';
 | 
			
		||||
			document.getElementById('container').appendChild( stats.domElement );
 | 
			
		||||
 | 
			
		||||
			// update stats on every iteration
 | 
			
		||||
			document.addEventListener('clmtrackrIteration', function(event) {
 | 
			
		||||
				stats.update();
 | 
			
		||||
			}, false);
 | 
			
		||||
 | 
			
		||||
		 </script>
 | 
			
		||||
 | 
			
		||||
      <!-- LJ style WS : A nettoyer ! -->
 | 
			
		||||
 | 
			
		||||
      <script type="text/javascript">
 | 
			
		||||
 | 
			
		||||
      var LJ = 'ws://192.168.2.43:9001/'
 | 
			
		||||
 | 
			
		||||
            var _WS = {
 | 
			
		||||
            uri: LJ,
 | 
			
		||||
            ws: null,
 | 
			
		||||
        
 | 
			
		||||
            init : function (e) {
 | 
			
		||||
              _WS.s = new WebSocket(_WS.uri);
 | 
			
		||||
              _WS.s.onopen = function (e) { _WS.onOpen(e); };
 | 
			
		||||
              _WS.s.onclose = function (e) { _WS.onClose(e); };
 | 
			
		||||
              _WS.s.onmessage = function (e) { _WS.onMessage(e); };
 | 
			
		||||
              _WS.s.onerror = function (e) { _WS.onError(e); };
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onOpen: function () {
 | 
			
		||||
            _WS.showstatus("Connected to "+LJ);
 | 
			
		||||
              document.getElementById("on").value = 1;
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onClose: function () {
 | 
			
		||||
              _WS.showline1('<span style="color: red;">LJ DISCONNECTED</span> ');
 | 
			
		||||
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            onMessage: function (e) {
 | 
			
		||||
              var res = e.data.split(" ");
 | 
			
		||||
              //console.log(e.data)
 | 
			
		||||
              //console.log(res[0].substring(0,6))
 | 
			
		||||
              //console.log(res)
 | 
			
		||||
              //console.log(res[0].slice(1))
 | 
			
		||||
              var divtext = document.getElementById('status');
 | 
			
		||||
              var divtextp = document.getElementById('players');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
              switch (res[0].substring(0,6)) {
 | 
			
		||||
                
 | 
			
		||||
                case "/statu":
 | 
			
		||||
 | 
			
		||||
                      if (res[2]==="Disconnected"){
 | 
			
		||||
                         _WS.showstatus(res[1]+" "+'<span style="color: red;">'+ res[2]+'</span> ');
 | 
			
		||||
                        }
 | 
			
		||||
                      else{
 | 
			
		||||
                        _WS.showstatus(res[1]+" "+res[2]);
 | 
			
		||||
                        }
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/redst":
 | 
			
		||||
                      //console.log("red"+res[1]+" "+res[2]);
 | 
			
		||||
                      _WS.showstatus('<span style="color: red;">'+res[1]+" "+ res[2]+'</span> ');
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/line1":
 | 
			
		||||
                      //divtext.innerHTML="connected to "+LJ;
 | 
			
		||||
                      divtext1.innerHTML=res[1]+" "+res[2];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/redline1":
 | 
			
		||||
                      //divtext.innerHTML="connected to "+LJ;
 | 
			
		||||
                      divtext1.innerHTML='<span style="color: red;">'+ res[1]+" "+res[2]+'</span>';
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/laser":
 | 
			
		||||
                      console.log("/laser "+res[1])
 | 
			
		||||
                      newlaser(res[1])
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/lack/":
 | 
			
		||||
                      console.log("/lack "+res[1])
 | 
			
		||||
                      document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                case "/lstt/":
 | 
			
		||||
                      console.log("/lstt "+res[1])
 | 
			
		||||
                      document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                      break;
 | 
			
		||||
 | 
			
		||||
                default:
 | 
			
		||||
                    //console.log("test "+res[0].slice(1)+" "+res[1]);
 | 
			
		||||
                    document.getElementById(res[0].slice(1)).value = res[1];
 | 
			
		||||
                    //_WS.showstatus(e.data);
 | 
			
		||||
                }
 | 
			
		||||
              },
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
            showline1: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('line1');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            onError: function (e) {
 | 
			
		||||
              _WS.showstatus('<span style="color: red;">ERROR:</span> ' + e.data);
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showin: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showout: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
        
 | 
			
		||||
            showstatus: function (message) {
 | 
			
		||||
                var divtext = document.getElementById('status');
 | 
			
		||||
                divtext.innerHTML="";
 | 
			
		||||
                divtext.innerHTML= message.toString();
 | 
			
		||||
              },
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
            send: function (message) {
 | 
			
		||||
              if (!message.length) {
 | 
			
		||||
                alert('Empty message not allowed !');
 | 
			
		||||
              } else {
 | 
			
		||||
                _WS.showstatus(message);
 | 
			
		||||
                _WS.s.send(message);
 | 
			
		||||
              }
 | 
			
		||||
            },
 | 
			
		||||
        
 | 
			
		||||
            close: function () {
 | 
			
		||||
              _WS.showstatus('GOODBYE !');
 | 
			
		||||
              _WS.s.close();
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        
 | 
			
		||||
          window.addEventListener('load', _WS.init, false);   
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Forms submits
 | 
			
		||||
        //
 | 
			
		||||
        
 | 
			
		||||
          function onSubmit(clicked_id) {
 | 
			
		||||
            var input = document.getElementById(clicked_id);
 | 
			
		||||
            console.log("/" + clicked_id + " " + input.value);
 | 
			
		||||
            _WS.send("/" + clicked_id + " " + input.value);
 | 
			
		||||
            }
 | 
			
		||||
        
 | 
			
		||||
        </script>
 | 
			
		||||
 | 
			
		||||
      <!-- 
 | 
			
		||||
        web audio encoders scripts 
 | 
			
		||||
      -->
 | 
			
		||||
      
 | 
			
		||||
      <script type="text/javascript">
 | 
			
		||||
        var message="";
 | 
			
		||||
        var log=[];
 | 
			
		||||
        var knobs = document.getElementsByTagName('webaudio-knob');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < knobs.length; i++){
 | 
			
		||||
            knobs[i].addEventListener("input",Dump,false);
 | 
			
		||||
            knobs[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
        var sliders = document.getElementsByTagName('webaudio-slider');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < sliders.length; i++){
 | 
			
		||||
            sliders[i].addEventListener("input",Dump,false);
 | 
			
		||||
            sliders[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
        var switches = document.getElementsByTagName('webaudio-switch');
 | 
			
		||||
        
 | 
			
		||||
        for(var i = 0; i < switches.length; i++) {
 | 
			
		||||
            switches[i].addEventListener("change",Dump,false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        function newlaser(id) {
 | 
			
		||||
 | 
			
		||||
          console.log("newlaser " +id)
 | 
			
		||||
          var laserid = 24+ parseInt(id,10);
 | 
			
		||||
          laser = "noteon "+laserid;
 | 
			
		||||
          console.log("laser "+laser);
 | 
			
		||||
          nolaser();
 | 
			
		||||
          nofx();
 | 
			
		||||
 | 
			
		||||
          var x = document.getElementById(laser);
 | 
			
		||||
          x.value = 1 ;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        function nolaser() {
 | 
			
		||||
          //console.log("nolaser")
 | 
			
		||||
          var x = document.getElementById("noteon 24");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("noteon 25");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("noteon 26");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("noteon 27");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
      
 | 
			
		||||
        // RGB Colors
 | 
			
		||||
        function nocolor() {
 | 
			
		||||
          //console.log("nocolor0")
 | 
			
		||||
          var x = document.getElementById("trckr/color/ red");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("trckr/color/ yellow");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("trckr/color/ green");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("trckr/color/ blue");
 | 
			
		||||
           x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("trckr/color/ cyan");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          var x = document.getElementById("trckr/color/ white");
 | 
			
		||||
            x.value = 0 ;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        // RGY Colors
 | 
			
		||||
        //function nocolor() {
 | 
			
		||||
          //var x = document.getElementById("trckr/color/ red");
 | 
			
		||||
          //  x.value = 0 ;
 | 
			
		||||
          //var x = document.getElementById("trckr/color/ yellow");
 | 
			
		||||
          //  x.value = 0 ;
 | 
			
		||||
          //var x = document.getElementById("trckr/color/ green");
 | 
			
		||||
          //  x.value = 0 ;
 | 
			
		||||
          //}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        function Dump(e) {
 | 
			
		||||
            var str="";
 | 
			
		||||
            str=e.type + " : " + e.target.id + " : " + e.target.value + " ";
 | 
			
		||||
            console.log(str);
 | 
			
		||||
            log.unshift(str);
 | 
			
		||||
            log.length=1;
 | 
			
		||||
            str="";
 | 
			
		||||
            
 | 
			
		||||
            for(var i=19;i>=0;--i) {
 | 
			
		||||
                if(log[i])
 | 
			
		||||
                    str+=log[i]+"<br/>";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            _WS.send("/" + e.target.id + " " +  e.target.value);
 | 
			
		||||
 | 
			
		||||
          var res = e.target.id.split(" "); 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          // on off
 | 
			
		||||
          if (e.target.id === "on" && e.type === "change") {   
 | 
			
		||||
            window.location.reload();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          // Go to index
 | 
			
		||||
          if (e.target.id === "index" && e.type === "change") {   
 | 
			
		||||
            window.location.assign("../index.html");
 | 
			
		||||
            }
 | 
			
		||||
          // Fx
 | 
			
		||||
          if (res[0].substring(7,9) === "fx" && e.type === "change") {   
 | 
			
		||||
 | 
			
		||||
            var layer = res[0].substring(10,12);  
 | 
			
		||||
            nofx0();  
 | 
			
		||||
            var x = document.getElementById(e.target.id);
 | 
			
		||||
            x.value = 1 ;
 | 
			
		||||
            _WS.showstatus(e.target.id);
 | 
			
		||||
            
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Colors
 | 
			
		||||
            if (res[0].substring(7,9) === "co" && e.type === "change") {  
 | 
			
		||||
  
 | 
			
		||||
                nocolor();
 | 
			
		||||
                _WS.send("/"+res[0]+laser+ " "+ res[1]+ " " +  e.target.value);
 | 
			
		||||
                var x = document.getElementById(e.target.id);
 | 
			
		||||
                x.value = 1 ;
 | 
			
		||||
                //_WS.showstatus("Laser "+laser+ " "+ res[1]);
 | 
			
		||||
                console.log("colors sending "+res[0]+laser+ " "+ res[1]+ " " +  e.target.value);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // Lasers
 | 
			
		||||
            if (res[0] === "noteon" && e.type === "change") {  
 | 
			
		||||
                //console.log(e.target.id);
 | 
			
		||||
                //console.log(res);
 | 
			
		||||
                //console.log(res[1] - 24)
 | 
			
		||||
                newlaser(res[1] - 24);
 | 
			
		||||
                _WS.send("/" + e.target.id + " " +  e.target.value);
 | 
			
		||||
 | 
			
		||||
                //nolaser();
 | 
			
		||||
                //nofx(); 
 | 
			
		||||
                //_WS.send("/" + e.target.id + " " +  e.target.value);
 | 
			
		||||
                //var x = document.getElementById(e.target.id);
 | 
			
		||||
                //x.value = 1 ;
 | 
			
		||||
                //laser = res[1] - 24;
 | 
			
		||||
                //console.log("laser "+laser);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          }
 | 
			
		||||
    	</script>
 | 
			
		||||
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
@ -93,10 +93,10 @@
 | 
			
		||||
        </div>
 | 
			
		||||
      </a>
 | 
			
		||||
 | 
			
		||||
        <a href="../align.html">
 | 
			
		||||
        <a href="../settings.html">
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <div align="center" class="navled"> 
 | 
			
		||||
          Align
 | 
			
		||||
          Settings
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        </a>
 | 
			
		||||
@ -127,8 +127,8 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <div class="webaudiobut">
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/restart lj" >
 | 
			
		||||
            rstrt LJ
 | 
			
		||||
          <button type="button" class="navled" style="border : #222222 1px;"  onclick="onSubmit(this.id)" id="settings/reset" >
 | 
			
		||||
            Reset
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user