From 68b0e81a95695635b5428b4e0f29e7aace2d7610 Mon Sep 17 00:00:00 2001 From: leduc Date: Thu, 13 Dec 2018 12:05:32 +0100 Subject: [PATCH] First commit --- README.md | 459 ++++++++ cli.py | 163 +++ clients/framy.py | 114 ++ clients/nodeclient.js | 91 ++ clients/pyclient.py | 56 + clients/rebclient.r | 39 + clients/rebserver.py | 47 + clients/redclient.red | 8 + clients/redserver.py | 57 + gstt.py | 230 ++++ homographyp.py | 246 +++++ las.py | 230 ++++ mainy.conf | 84 ++ mainyservers.py | 534 ++++++++++ newdacp.py | 444 ++++++++ settings.py | 107 ++ websocket_server.py | 371 +++++++ webui/index.html | 800 ++++++++++++++ webui/knobs/Prophetic10.png | Bin 0 -> 11360 bytes webui/knobs/Prophetic5.png | Bin 0 -> 8003 bytes webui/knobs/bigbluetoggle.png | Bin 0 -> 16102 bytes webui/knobs/blackout.png | Bin 0 -> 4555 bytes webui/knobs/grid.png | Bin 0 -> 1720 bytes webui/knobs/lasergrid0.png | Bin 0 -> 7198 bytes webui/knobs/lasergrid1.png | Bin 0 -> 3056 bytes webui/knobs/lasergrid2.png | Bin 0 -> 6966 bytes webui/knobs/lasergrid3.png | Bin 0 -> 7416 bytes webui/knobs/leds.png | Bin 0 -> 3255 bytes webui/knobs/ljaylogo.png | Bin 0 -> 8168 bytes webui/knobs/mouse.png | Bin 0 -> 4866 bytes webui/knobs/simplegray.png | Bin 0 -> 227718 bytes webui/knobs/swapx.png | Bin 0 -> 16273 bytes webui/knobs/swapy.png | Bin 0 -> 17299 bytes webui/knobs/switch_toggle.png | Bin 0 -> 4469 bytes webui/webaudio-controls.js | 1875 +++++++++++++++++++++++++++++++++ webui/webcomponents-lite.js | 197 ++++ 36 files changed, 6152 insertions(+) create mode 100644 README.md create mode 100644 cli.py create mode 100644 clients/framy.py create mode 100644 clients/nodeclient.js create mode 100644 clients/pyclient.py create mode 100644 clients/rebclient.r create mode 100644 clients/rebserver.py create mode 100644 clients/redclient.red create mode 100644 clients/redserver.py create mode 100644 gstt.py create mode 100755 homographyp.py create mode 100644 las.py create mode 100644 mainy.conf create mode 100644 mainyservers.py create mode 100644 newdacp.py create mode 100644 settings.py create mode 100755 websocket_server.py create mode 100644 webui/index.html create mode 100644 webui/knobs/Prophetic10.png create mode 100644 webui/knobs/Prophetic5.png create mode 100644 webui/knobs/bigbluetoggle.png create mode 100644 webui/knobs/blackout.png create mode 100644 webui/knobs/grid.png create mode 100644 webui/knobs/lasergrid0.png create mode 100644 webui/knobs/lasergrid1.png create mode 100644 webui/knobs/lasergrid2.png create mode 100644 webui/knobs/lasergrid3.png create mode 100644 webui/knobs/leds.png create mode 100644 webui/knobs/ljaylogo.png create mode 100644 webui/knobs/mouse.png create mode 100755 webui/knobs/simplegray.png create mode 100644 webui/knobs/swapx.png create mode 100644 webui/knobs/swapy.png create mode 100755 webui/knobs/switch_toggle.png create mode 100755 webui/webaudio-controls.js create mode 100755 webui/webcomponents-lite.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..227a8b0 --- /dev/null +++ b/README.md @@ -0,0 +1,459 @@ +LJ v0.7.0 + +By Sam Neurohack, Loloster, Cocoa + +LICENCE : CC BY + + + +![LJ](http://www.teamlaser.fr/thsf/images/fulls/THSF9-33.jpg) + +A software server with gui for up to 4 lasers live actions. Think creative like Laser "battles", planetarium,... + +No .ild file here, you run your client that generate/send point lists to LJ. Any redis capable programming langage is fine. + +Needs at least : an etherdream DAC connected to an ILDA laser, RJ 45 IP network (gigabits only !! no wifi, 100 mpbs doesn't work well with several lasers) + +GUIs : WebUI, TouchOSC, Pure Data patch. You can build your own GUI and send/get commands to/from LJ through OSC. Attention : the Pure Data patch works with PD-extended 0.43. Any contribution for whatever "better" Pure Data version are welcome. + +Devices supported : Launchpad mini, LP8, enttec DMX PRO, bhoreal, nozoids, gamepad, smartphone & tablet (with OSC like gyroscopes) and any MIDI controller that is recognised by your OS. + +Nozosc : Semi modular synthetizers from Nozoids can send a lot of their inner sound curves and be displayed in many ways, i.e VCO 1 on X axis and LFO 2 on Y axis. + +You can also send OSC commands to a video, music,... external software to trigger what you want. + + +The server approach is based on redis. One process per etherdream is spawn to : retrieve the given point list from redis, warp, resample and manage the given etherdream DAC dialog. + + +# +# Features among many others. +# + +(Doc in progress) + +- Automatically hook to Midi devices IN & OUT seen by OS. Very cool : LJ can script or be scripted by a midi device : Triggering different musics at given moments,... or in opposite, you can make a midi file with an external midi sequencer to script/trigger laser effects. +- Automatic USB enttec PRO DMX interface detection. See mydmx.py +- OSC server. Very cool : LJ can also script or be scripted with an OSC sequencer like Vezer or score. +- OSC to midi bridge (see /note and /cc/number) +- OSC to DMX bridge (see /cc/number) +- Bhoreal and Launchpad device start animation +- Control all leds of Bhoreal and Launchpad Mini through midi. Notes on and off, velocity is color. +- Interactive (mouse style) warp correction for each laser. +- Interactive (mouse style) any shape correction. Imagine you project on a building and want to use the windows like in a pinball. You need to define rectangle corner points and align them to the window, that's a shape you can use. The shape point list must be defined in the given laser "screen". See configuration file mainy.conf example. +- Using python for client, you can use all bhorosc functions like control Resolume Arena video software through OSC : +import bhorosc +bhorosc.sendresol("/layer1/clip1/connect",1) + +- Web ui : In your browser open webui/index.html. Javascript is needed. +- Status every 0.5 seconds : every etherdream DAC state, number of buffer points sent,... +- "Optimisation" points automatically added, can be changed live for glitch art. See + + +# +# External devices +# + +(Doc in Progress) + +- LPD8 : A config file is included. +- enttec USB pro +- LaunchPad mini +- Bhoreal +- Joypads : Joypads are detected and read by pygame. You need to adapt the button mapping to your specific gamepad in the code. Search "joypad" in setexample.py + + + + +# +# Introduction +# + + +You need to update mainy.conf to your network/etherdreams IPs and Be sure to check command arguments : python mainyservers.py --help + +LJ is meant for Live, so a lot of parameters can be changed via OSC/midi, webUI,... + + +Program your own "Client" : +------------------------- + +- Read the Introduction part in this readme. +- Carefully read all comments in clients examples. +- Generate at least one point list array (say a square). +- Feed your point list string to redis server + + +If you need to receive data externally : + +use /nozoid/osc/number value : Get the new value in gstt.osc[number] (number : 0-255) +or program your own OSC commands in bhorosc.py + + + +Joypads : +--------- + +You need to decide what to do with joypads axis, hat, buttons. See joypads() in setexample.py. To adapt pygame button numbers to your gamepad use : + +python joys.py + + + + +"Shapes" : +---------- + +"Shapes" are mouse editable areas i.e you make a flipper on a building and want something happen with the building windows. "Shapes" are the list of points you see at the beginning of conf file. "Shapes" are grouped in "Screens" that will be displayed by a given laser. See curve 0 in setexample.py +Again "Shapes" are only mousely editable list of points : you can display them or not. + + + +# +# Install +# + +In terminal type : + +./install.sh + +Check the bind line in /etc/redis/redis.conf : + +- If client and laser servers computers are the same, use 127.0.0.1 +- Client and laser server are different, use the laser server computer IP. + +In webui/index.html change the ws ip adress to the server IP or 127.0.0.1 if client computer = laser server computer. + +Using the same idea check all ip address in mainy.conf. + +For network Gurus : bind to all network interface scheme is not working yet. + + + +# +# To run +# + +Always start the laser server first. + +Case 1 : the laser server computer is the same that the computer running a client : + +python mainyservers.py + +Open/reload in browser webui/index.html. (javascript must be enabled) + +Check in your client if the server IP is the good one + +Run your client + +to monitor redis server : + +redis-cli monitor + + +Case 2 : Server and Client computers are different : + + +Say the laser server computer (running LJ) IP is 192.138.1.13, the client computer is 192.168.1.52 + +On the server computer : +edit /etc/redis/redis.conf +python mainyservers.py -r 192.168.1.13 + +on the client computer for all features : + +to just generate and send list points +node testredis.js + +to monitor redis server : + + +redis-cli -h monitor + + + +# +# Todo +# + +(Doc in Progress) + +- Find 3D rotations matrices and 2 projections, test speed / normal algo with algotest.py +- Smaller cpu footprint (compute only when something has changed,...) +- kpps live modification for glitch art. +- Improve Bhoreal & LaunchPad inputs +- Tags for automatic laser load/ balancing +- Texts : multilasers support, more fonts. +- Improve WebUI with simulator. +- tomidi should not disable other targets. +- Warp corrections should not used warpdestinations default values in conf file. + + + +# +# LJ OSC commands : +# + +# General + +/noteon number velocity + : Note on sent to laser (see Midi below for notes effects). Noteon can also be send to midi targets if gstt.tomidi is True, but this disable all other targets for the moment. Todo. + +/noteoff number : Note off is sent only to midi targets. + + +/accxyz x y z : TouchOSC gyroscope x assigned to cc 1 and y assigned to cc 2. See Midi below for cc effects. + +/gyrosc/gyro x y z : Change 3D rotation angles with gyroscope float values. i.e for GyrOSC iOS app. At this time Z is ignored and Z rotation set to 0 + +/point x y z : Set point coordinates for "slave" curve. Need to be changed change to collections deque as in llstr.py + +/stop/rotation : Set all 3D rotations speed and 3D rotation angles to 0 + +/cc/number value : Change the cc with given value. Effect will depend on flags set to True : gstt.todmx (value is forwarded to dmx channel) , gstt.tomidi, gstt.tolaser (center align or curve mode). See cc effects below + +/number value : switch current displayed curve to value. + +/quit : Do nothing yet + + +# Laser Control + + +/display number : Select what point list (PL) is displayed by simulator + + +/swap/X/lasernumber value (0 or 1) + : switch on and off general X inversion on given laser + +/swap/Y/lasernumber value (0 or 1) + : switch on and off general Y inversion on given laser + + +/loffset/X/lasernumber value + : Move X center on given laser of value pixels + +/loffset/Y/lasernumber value + : Move Y center on given laser of value pixels + + +/scale/X/lasernumber value + : Stretch laser display of given laser of value + +/scale/Y/lasernumber value + : Stretch laser display of given laser of value + + +/ip/lasernumber IP + : Assign a new etherdream (by its IP adress) for given laser number + +/angle/lasernumber value + : Change geometric angle correction for given laser number by computing a new homgraphy + +/intens/lasernumber value + : Assign a new beam intensity for given laser (todo : if etherdream can actually change it) + +/grid/lasernumber value (0 or 1) + : Toggle a grid display for given laser + +/mouse/lasernumber value (0 or 1) + : Toggle the mapping function for given laser + + +# Colors + +For currently selected laser and in RGB Color mode (see below MIDI notes effects to switch Color mode and "current" laser selection) + +/red 0 : Switch off blue laser. + +/red 255 (or >0) Switch on blue laser + + +/green 0 : Switch off blue laser + +/green 255 (or >0) Switch on blue laser + + +/blue 0 : Switch off blue laser + +/blue 255 (or >0) Switch on blue laser + + + +# Bhoreal and Launchpad devices + +![Bhoreal](http://levfestival.com/13/wp-content/uploads/Bhoreal_2.jpg) + +/led led number color : Switch on given led with given color. + +/led/xy x y color Switch on led with x y position to given color. + +/xy x y + +/allcolorbhor : Switch all Bhoreal Leds with given colour (0-127) + +/clsbhor : Switch off all bhoreal leds + +/padmode : Code not available yet in LJay. Different modes available for Bhoreal and Launchpad. "Prompt" = 10 ; "Myxo" = 2 ; "Midifile" = 3 + + + + +# Nozoids synthetizers + +![Nozoid synthetizer](http://nozoid.com/wp-content/uploads/2017/05/OCS_previus-600x330.png) + + + +Functions originated by nozosc.py and executed in llstr.py (See Nozosc readme for complete OSC implementation and how to control Nozosc). A new firmware by loloster is mandatory for OCS 2 (https://github.com/loloster/ocs-2) and MMO3 (https://github.com/loloster/mmo-3). "curve" means on of the 4 curves managed by nozosc. setllstr.py as differents Set/Curve generator called by LJay that displays these 4 "curves"; + + +/nozoid/osc/number value : Store a new value for given oscillator/LFO/VCO + +/nozoid/X value curve : Use given oscillator/LFO/VCO number as X axis for given curve . See llstr.py + +/nozoid/Y value curve : use given oscillator/LFO/VCO number for Y axis for given curve. See llstr.py + +/nozoid/color r g b curve : set current laser color for given curve + +/nozoid/knob/number value : Not used yet + +/nozoid/mix/number value : Not used yet + +/nozoid/vco/number value : Not used yet + +/nozoid/lfo/number value : Not used yet + + + +# GUI + +![Advanced Gui](http://www.teamlaser.fr/mcontroller.png) + +/on : Accept a GUI with status widget. Automatically get its IP, send status,... + +/off : Disconnect the GUI + +/status text Display some text on status widget GUI + +TouchOSC GUI button matrix + +/clear : Clear status widget text. + +/enter : should validate previous chosen number + +/control/matrix/Y/X 0 or 1 + First screen ("Control") buttons toggle state : on or off + +/pad/rights/note 0 or 1 + "Pad" screen (launchpad mini simulator screen), right column : Send note on and note off + +/pad/tops/cc 0 or 1 + "Pad" screen top raw : Send CC 0/127 + + + +# +# Midi commands +# + +Midi Note : built in midi notes assignation. More : if you hook a midi led matrix like bhoreal, led are updated. See Noteon_Update() in bhorosc.py + +0-7 Curve choice. Note on 0 to set Curve O, Note on 1 for Curve 1,... + +8-15 Set choice. All happening Live, so as the new Set may not have the same Curve number, changing Set autoselect the builtin "black" curve (-1) as a fallback, so you can safely choose a new Curve in the new Set. +Example : to switch to Set 0, use note on 8. For Set 1 use note on 9,.... + +16-23 Laser choice. "Current laser" choice +Example : to switch to Laser 0, use note on 16. For Laser 1 use note on 17,.... + + +24-31 SimuPL choice. Example : to display PL 0 on simulator it's note on 24. To display PL 1 on simulator it's note on 25.... + +57 Color mode : Rainbow + +58 Color mode : RGB + + +Midi CC channel effects (0-127) built in assignation, *only* if you use built in 3D rotation and 2D projection in your code. You can assign any CC to any function you code. You can get current value in gstt.cc[ccnumber]. See setexample.py + +1 X position + +2 Y position + +5 X select for Lissa curves (set curve ) + +6 Y select for Lissa curves (set curve ) + + +21 3D projection : FOV + +22 3D projection : Distance + + +29 3D Rotation speed X + +30 3D Rotation speed Y + +31 3D Rotation speed Z + + +# +# Resolume Arena commands +# + +A dedicated OSC client is built in. To send OSC commands to resolume use something like + +bhorosc.sendresol("/layer1/clip1/connect",1) + +Remember to specify Resolume IP and port in the beginning of bhorosc.py + + + + +# +# Ether dream configuration +# + +![Etherdream Laser DAC](https://www.ether-dream.com/ed2-external.jpg) + +This program suppose that the ether dream is configured in a certain way especially for its IP address. For ether dream 1 : write an autoplay.txt file inside an SD Card within the ether dream DAC, with the following lines you can adjust i.e for pps or fps. Yes, there is a builtin DHCP client in the ether dream DAC but if you run multiple lasers, having a fixed dedicated network makes you focus on laser stuff. + +/net/ipaddr 192.168.1.3 + +/net/netmask 255.255.255.0 + +/net/gateway 192.168.1.1 + +/ilda/pps 25000 + +/ilda/fps 25 + +About hardware setup, especially if you have several lasers : ILDA cables are insanely expensive. You may consider the Power Over Ethernet 'POE' option. Buy a very small ILDA cable, a POE splitter and connect everything to the ether dream fixed near your laser. You can have then a simple and very long network cable and use a Power Over Ethernet injector or switch closed to the driving computer. Beware some vendors use 24V POE Injector : POE injectors and splitters must match. + + +# +# Coordinates if you use the proj() function +# + +3D points (x,y,z) has *0,0,0 in the middle* +A square centered around origin and size 200 (z =0 is added automatically) : +([-200, -200, 0], [200, -200, 0], [200, 200, 0], [-200, 200, 0], [-200, -200, 0]) + +Pygame screen points are 2D. *0,0 is top left* +with no 3D rotations + 3D -> 2D Projection + translation to top left: +[(300.0, 400.0), (500.0, 400.0), (500.0, 200.0), (300.0, 200.0), (300.0, 400.0)] + + +Pygame points with color is fed to laser renderer +[(300.0, 400.0, 0), (500.0, 400.0, 16776960), (500.0, 200.0, 16776960), (300.0, 200.0, 16776960), (300.0, 400.0, 16776960)] + + +Laser points traced + +Because of blanking many points are automatically added and converted in etherdream coordinates system -32765 to +32765 in x and y axis. + +16 (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 65280, 65280, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0), (-1500.0, 1500.0, 0, 0, 0) +8 (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0), (1500.0, 1500.0, 65280, 65280, 0) +8 (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0), (1500.0, -1500.0, 65280, 65280, 0) +8 (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0), (-1500.0, -1500.0, 65280, 65280, 0) diff --git a/cli.py b/cli.py new file mode 100644 index 0000000..744e25c --- /dev/null +++ b/cli.py @@ -0,0 +1,163 @@ +# coding=UTF-8 +""" +LJay/LJ + +v0.8 + +Command line arguments parser + +by Sam Neurohack +from /team/laser + +""" + + +import gstt +import argparse + + +def handle(): + + if gstt.debug > 2: + print "" + print "Arguments parsing if needed..." + #have to be done before importing bhorosc.py to get correct port assignment + argsparser = argparse.ArgumentParser(description="LJay") + argsparser.add_argument("-r","--redisIP",help="Redis computer IP address (gstt.LjayServerIP by default)",type=str) + argsparser.add_argument("-i","--iport",help="OSC port number to listen to (8001 by default)",type=int) + argsparser.add_argument("-o","--oport",help="OSC port number to send to (8002 by default)",type=int) + argsparser.add_argument("-x","--invx",help="Invert laser 0 X axis again",action="store_true") + argsparser.add_argument("-y","--invy",help="Invert laser 0 Y axis again",action="store_true") + argsparser.add_argument("-s","--set",help="Only for VJ version. Specify wich generator set to use (default is in gstt.py)",type=int) + argsparser.add_argument("-c","--curve",help="Only for VJ version. Specify with generator curve to use (default is in gstt.py)",type=int) + argsparser.add_argument("-a","--align",help="Reset laser 0 alignement values",action="store_true") + argsparser.add_argument("-d","--display",help="Point List number displayed in pygame simulator",type=int) + argsparser.add_argument("-v","--verbose",help="Debug mode 0,1 or 2.",type=int) + argsparser.add_argument("-L","--Lasers",help="Number of lasers connected.",type=int) + argsparser.add_argument("-b","--bhoroscIP",help="Computer IP running bhorosc ('127.0.0.1' by default)",type=str) + argsparser.add_argument("-n","--nozoscIP",help="Computer IP running Nozosc ('127.0.0.1' by default)",type=str) + + + + # Keep it ! if new features of cli.py is used in a monolaser program + # argsparser.add_argument("-l","--laser",help="Last digit of etherdream ip address 192.168.1.0/24 (4 by default). Localhost if digit provided is 0.",type=int) + + + args = argsparser.parse_args() + + + # Ports arguments + if args.iport: + iport = args.iport + gstt.iport = iport + else: + iport = gstt.iport + + if args.oport: + oport = args.oport + gstt.oport = oport + else: + oport = gstt.oport + + if gstt.debug > 0: + print "gstt.oport:",gstt.oport + print "gstt.iport:",gstt.iport + + + # X Y inversion arguments + if args.invx == True: + + gstt.swapX[0] = -1 * gstt.swapX[0] + gstt.centerx[0] = 0 + gstt.centery[0] = 0 + #WriteSettings() + print("laser 0 X new invertion Asked") + if gstt.swapX[0] == 1: + print ("X not Inverted") + else: + print ("X Inverted") + + if args.invy == True: + + gstt.swapY[0] = -1 * gstt.swapY[0] + gstt.centerx[0] = 0 + gstt.centery[0] = 0 + #WriteSettings() + print("laser 0 Y new invertion Asked") + if gstt.swapY[0] == 1: + print ("Y not Inverted") + else: + print("Y inverted") + + # Redis Computer IP + if args.redisIP != None: + gstt.LjayServerIP = args.redisIP + + + # Set / Curves arguments + if args.set != None: + gstt.Set = args.set + print "Set : " + str(gstt.Set) + + if args.curve != None: + gstt.Curve = args.curve + print "Curve : " + str(gstt.Curve) + + + # Point list number used by simulator + if args.display != None: + gstt.simuPL = args.display + print "Display : " + str(gstt.simuPL) + + + + # Verbose = debug + if args.verbose != None: + gstt.debug = args.verbose + + + # Lasers = number of laser connected + if args.Lasers != None: + gstt.LaserNumber = args.Lasers + + + if args.bhoroscIP != None: + gstt.oscIPin = args.bhoroscIP + else: + gstt.oscIPin = '127.0.0.1' + + if args.nozoscIP != None: + gstt.nozoscIP = args.nozoscIP + else: + gstt.nozoscIP = '127.0.0.1' + + # Etherdream target for mono laser program + ''' + if args.laser != None: + lstdgtlaser = args.laser + + if lstdgtlaser == 0: + etherIP = "127.0.0.1" + else: + etherIP = "192.168.1."+str(lstdgtlaser) + + else: + etherIP = "192.168.1.4" + + #print ("Laser 1 etherIP:",etherIP) + ''' + + # Reset alignment values + if args.align == True: + + gstt.centerx[0] = 0 + gstt.centery[0] = 0 + gstt.zoomx[0] = 15 + gstt.zoomy[0] = 15 + gstt.sizex[0] = 32000 + gstt.sizey[0] = 32000 + gstt.finangle[0] = 0.0 + gstt.swapx[0] = 1 + gstt.swapy[0] = 1 + #Settings.Write() + diff --git a/clients/framy.py b/clients/framy.py new file mode 100644 index 0000000..844ce78 --- /dev/null +++ b/clients/framy.py @@ -0,0 +1,114 @@ +# coding=UTF-8 + +''' +LJay v0.8.0 + + +LICENCE : CC +pclf, Sam Neurohack + +''' + +import math +import redis + +redisIP = '192.168.1.13' +r = redis.StrictRedis(host=redisIP, port=6379, db=0) + +point_list = [] +pl = [[],[],[],[]] + +def LineTo(xy, c, PL): + + pl[PL].append((xy + (c,))) + +def Line(xy1, xy2, c, PL): + LineTo(xy1, 0, PL) + LineTo(xy2, c , PL) + + +def PolyLineOneColor(xy_list, c, PL , closed ): + #print "--" + #print "c",c + #print "xy_list",xy_list + #print "--" + xy0 = None + for xy in xy_list: + if xy0 is None: + xy0 = xy + #print "xy0:",xy0 + LineTo(xy0,0, PL) + else: + #print "xy:",xy + LineTo(xy,c, PL) + if closed: + LineTo(xy0,c, PL) + + +# Computing points coordinates for rPolyline function from 3D and around 0,0 to pygame coordinates +def Pointransf(xy, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0): + + x = xy[0] * resize + y = xy[1] * resize + z = 0 + + rad = rotx * math.pi / 180 + cosaX = math.cos(rad) + sinaX = math.sin(rad) + + y2 = y + y = y2 * cosaX - z * sinaX + z = y2 * sinaX + z * cosaX + + rad = roty * math.pi / 180 + cosaY = math.cos(rad) + sinaY = math.sin(rad) + + z2 = z + z = z2 * cosaY - x * sinaY + x = z2 * sinaY + x * cosaY + + rad = rotz * math.pi / 180 + cosZ = math.cos(rad) + sinZ = math.sin(rad) + + x2 = x + x = x2 * cosZ - y * sinZ + y = x2 * sinZ + y * cosZ + + #print xy, (x + xpos,y+ ypos) + return (x + xpos,y+ ypos) + ''' + to understand why it get negative Y + + # 3D to 2D projection + factor = 4 * gstt.cc[22] / ((gstt.cc[21] * 8) + z) + print xy, (x * factor + xpos, - y * factor + ypos ) + return (x * factor + xpos, - y * factor + ypos ) + ''' + +# Send 2D point list around 0,0 with 3D rotation resizing and reposition around xpos ypos +#def rPolyLineOneColor(self, xy_list, c, PL , closed, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0): +def rPolyLineOneColor(xy_list, c, PL , closed, xpos = 0, ypos =0, resize =0.7, rotx =0, roty =0 , rotz=0): + xy0 = None + for xy in xy_list: + if xy0 is None: + xy0 = xy + LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),0, PL) + else: + LineTo(Pointransf(xy, xpos, ypos, resize, rotx, roty, rotz),c, PL) + if closed: + LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),c, PL) + + +# set all points for given laser. special behavior depends on GridDisplay flag +# 0: point list / 1: Grid +def LinesPL(PL): + + if r.set('/pl/'+str(PL), str(pl[PL])) == True: + return True + else: + return False + +def ResetPL(self, PL): + pl[PL] = [] diff --git a/clients/nodeclient.js b/clients/nodeclient.js new file mode 100644 index 0000000..cc40f91 --- /dev/null +++ b/clients/nodeclient.js @@ -0,0 +1,91 @@ +// Send points lists to redis server +// In compatible LJay string format (pythonic lists) + +var redis = require("redis"), +client = redis.createClient(6379,'192.168.1.13'); + + + +function rgb2int(r,g,b) { + // Generate color from r g b components + var color = hex(r) + hex(g) + hex(b); + return parseInt(color, 16) + } + +function hex(v) { + // Get hexadecimal numbers. + var hex = v.toString(16); + if (v < 16) { + hex = "0" + hex; + } + return hex; +} + +// add one dot to Laser 0 point list +function adddot0(dotdata){ + var dotstring = "(" + dotdata + "),"; + pl0 += dotstring; + } + +// add one dot to Laser 1 point list +function adddot1(dotdata){ + var dotstring = "(" + dotdata + "),"; + pl1 += dotstring; + } + +// Generate same square to laser 0 and laser 1 +function GenPoints() + { + var pt = {}; + + // direct colors, i.e red + pt.r = 255; + pt.g = 0; + pt.b = 0; + + // named colors + var white = rgb2int(255, 255, 255); + + pt.x = 100; + pt.y = 200; + adddot0([pt.x, pt.y, rgb2int(pt.r, pt.g, pt.b)]); + adddot1([pt.x, pt.y, rgb2int(pt.r, pt.g, pt.b)]); + + pt.x = 100; + pt.y = 300; + adddot0([pt.x, pt.y, white]); + adddot1([pt.x, pt.y, white]); + + pt.x = 200; + pt.y = 300; + adddot0([pt.x, pt.y, white]); + adddot1([pt.x, pt.y, white]); + + pt.x = 200; + pt.y = 200; + adddot0([pt.x, pt.y, white]); + adddot1([pt.x, pt.y, white]); + + pt.x = 100; + pt.y = 200; + adddot0([pt.x, pt.y, white]); + adddot1([pt.x, pt.y, white]); + } + +// Point lists strings +var pl0 = "["; +var pl1 = "["; +GenPoints(); +pl0 = pl0.slice(0,-1) + "]" +pl1 = pl1.slice(0,-1) + "]" + +console.log(pl0); +console.log(pl1); + +// Send points lists to redis server +client.set("/pl/0",pl0); +client.set("/pl/1",pl1); + +// Quit +client.quit() + diff --git a/clients/pyclient.py b/clients/pyclient.py new file mode 100644 index 0000000..b43eba6 --- /dev/null +++ b/clients/pyclient.py @@ -0,0 +1,56 @@ +# coding=UTF-8 + +''' +Multi Laser client example + +LICENCE : CC +''' + +import redis + +# IP defined in /etd/redis/redis.conf +redisIP = '127.0.0.1' + +r = redis.StrictRedis(host=redisIP, port=6379, db=0) + +# (x,y,color in integer) 65280 is color #00FF00 +# Green rectangular shape : +pl0 = [(100,300,65280),(200,300,65280),(200,200,65280),(100,200,65280)] + + +# If you want to use rgb for color : +def rgb2int(r,g,b): + return int('0x%02x%02x%02x' % (r,g,b),0) + +# White rectangular shape +pl1 = [(100,300,rgb2int(255,255,255)),(200,300,rgb2int(255,255,255)),(200,200,rgb2int(255,255,255)),(100,200,rgb2int(255,255,255))] + +# Send to laser 0 (see mainy.conf) +r.set('/pl/0', str(pl0)) + +# Send to laser 1 (see mainy.conf) +r.set('/pl/1', str(pl1)) + +r.set('/pl/2', str(pl1)) + +''' +You can also use PolyLineOneColor or rPolylineOneColor to stack n point lists to build a "frame" + +import framy + +# for laser0 : + +pl0 = [(100,300),(200,300),(200,200),(100,200)] +framy.PolyLineOneColor(pl0, rgb2int(255,255,255), 0 , closed = False) +# You can add as much polylineOneColor as you want = construct a "frame" +# Then send it to the laser server : +print "All one color lines sent to laser 0 :",framy.LinesPL(0) # Will be True is sent correctly + +# instead of PolyLineOneColor you can use rPolylineOneColor to send 2D point list around 0,0 with 3D rotation,resizing and repositioning at xpos ypos +# rPolylineOneColor is very useful to add different polylines to different position. Imagine different game elements. +# rPolyLineOneColor(xy_list, c, PL , closed, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0): +# Send the pl0 to laser 1 + +framy.rPolyLineOneColor((pl0, c = rgb2int(255,255,255), PL = 1, closed = False, xpos = 200, ypos = 250, resize = 1, rotx =0, roty =0 , rotz=0) +print "All one color lines sent to laser 1 :",framy.LinesPL(1) # Will be True is sent correctly +''' \ No newline at end of file diff --git a/clients/rebclient.r b/clients/rebclient.r new file mode 100644 index 0000000..881e137 --- /dev/null +++ b/clients/rebclient.r @@ -0,0 +1,39 @@ +REBOL [] + +outport: open/lines tcp://localhost:13857 +on: 1 +off: 0 + +pl0: "[(100,200, 0), (100,300, 65280), (200,300, 65280), (200,200, 65280), (100,200, 65280)]" + + +oscommand: to-string reduce ["pl/0 " pl0] +insert outport oscommand + +for counter 1 2 1 [ + ;; print counter + oscommand: to-string reduce ["/40h/clear " on] + insert outport oscommand + wait 0.3 + +] + +for counter 1 2 1 [ + for raw 0 7 1 [ + oscommand: to-string reduce ["/40h/led_row " raw " " on] + insert outport oscommand + wait 0.001 + ] + +] + +for counter 1 2 1 [ + ;; print counter + oscommand: to-string reduce ["/40h/frame 0 126 126 126 126 126 126 0"] + insert outport oscommand + + wait 0.3 + +] + +close outport \ No newline at end of file diff --git a/clients/rebserver.py b/clients/rebserver.py new file mode 100644 index 0000000..bf92910 --- /dev/null +++ b/clients/rebserver.py @@ -0,0 +1,47 @@ + +#!/usr/bin/env python +# coding=UTF-8 +""" + +TCP server for rebol links like from Amiga +Forward /pl/lasernumber pointslist to redis server + + +by Sam Neurohack +from /team/laser + +""" + +import socket, time,random, redis + + +r = redis.StrictRedis(host=gstt.LjayServerIP, port=6379, db=0) + + + +# TCP listener + +TCP_IP = '127.0.0.1' +TCP_PORT = 13857 +BUFFER_SIZE = 1024 # Normally 1024, but we want fast response + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.bind((TCP_IP, TCP_PORT)) +s.listen(1) +conn, addr = s.accept() +print 'Connection address:', addr + + +while 1: + data = conn.recv(BUFFER_SIZE) + if not data: break + #print "received data:", data + commands = data.split() + nb_oscargs = len(commands) + print commands + + #r.set('/pl/'+str(PL), str(something to code with commands, nb_oscargs)) + #conn.send(data) # echo + + +conn.close() \ No newline at end of file diff --git a/clients/redclient.red b/clients/redclient.red new file mode 100644 index 0000000..40056cf --- /dev/null +++ b/clients/redclient.red @@ -0,0 +1,8 @@ +Red [] + + +#https://github.com/red/red/wiki/[DOC]-Guru-Meditations#how-to-make-http-requests + +pl0: "[(100,200, 0), (100,300, 65280), (200,300, 65280), (200,200, 65280), (100,200, 65280)]" + +read http://127.0.0.1:13857/path?name="jones" \ No newline at end of file diff --git a/clients/redserver.py b/clients/redserver.py new file mode 100644 index 0000000..8bc226e --- /dev/null +++ b/clients/redserver.py @@ -0,0 +1,57 @@ + +#!/usr/bin/env python +# coding=UTF-8 +""" + +Http server for red 0.6.4 +Forward /pl/lasernumber pointslist to redis server + +by Sam Neurohack +from /team/laser + +""" + + +import redis + +r = redis.StrictRedis(host=gstt.LjayServerIP, port=6379, db=0) + +from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer + +PORT_NUMBER = 8080 + +#This class will handles any incoming request from +#the browser +class myHandler(BaseHTTPRequestHandler): + + #Handler for the GET requests + def do_GET(self): + self.send_response(200) + self.send_header('Content-type','text/html') + self.end_headers() + + # Send the html message + self.wfile.write("Hello World !") + + # r.set('/pl/'+str(PL), str(self.grid_points)) + + return + +try: + #Create a web server and define the handler to manage the + #incoming request + server = HTTPServer(('', PORT_NUMBER), myHandler) + print 'Started httpserver on port ' , PORT_NUMBER + + #Wait forever for incoming htto requests + server.serve_forever() + +except KeyboardInterrupt: + print '^C received, shutting down the web server' +server.socket.close() + + + + + + diff --git a/gstt.py b/gstt.py new file mode 100644 index 0000000..561ff49 --- /dev/null +++ b/gstt.py @@ -0,0 +1,230 @@ +# coding=UTF-8 +''' +Etat global (anciennement singleton de la classe GameState + autres VARIABLES nécessaires partout)" +''' + +#from globalVars import * + +#ConfigName = "setexample.conf" +ConfigName = "mainy.conf" + +debug = 0 + +anims= [[],[],[],[]] + +# How many lasers are connected. Different that "currentlaser" used by bhorosc +LaserNumber = 2 +screen_size = [800,600] +xy_center = [screen_size[0]/2,screen_size[1]/2] + +# Will be overriden by mainy.conf file data +LjayServerIP = '192.168.1.13' +oscIPin = '192.168.1.15' +nozoscip = '192.168.1.15' + +# gstt.Laser select to what laser modifcation will occur. +# Can be changed with /noteon 16-23 +Laser = 2 + +# gstt.simuPL select what point list number to display in pygame simulator +# Can be changed with /noteon 24-31 +simuPL = 1 + +# gstt.laserIPS. Will be overridden by the ConfigName (see below) file values +lasersIPS = ['192.168.1.5','192.168.1.6','192.168.1.3','192.168.1.4'] + + +# gstt.laserPLS : What point list is sent to what laser. +# ** Will be overridden by the ConfigName (see below) file values ** +lasersPLS = [0,1,2,0] + + +# gstt.kpps stores kpps for each laser. +# ** Will be overridden by the ConfigName (see below) file values ** +kpps = [25000,25000,25000,25000] + +# gstt.GridDisplay : if = 1 Curve points actually sent to PL are replaced by a grid +GridDisplay = [0,0,0,0] + +# with 4 laser available, 4 PL only are necessary +PL = [[],[],[],[]] + + +# Transformation Matrix for each laser +EDH = [[], [], [], []] + +# Laser states +# ipconn is initial newdac to its etherdream +lstt_ipconn = [[-1], [-1], [-1], [-1]] +# dacstt is dac light engine state +lstt_dacstt = [[-1], [-1], [-1], [-1]] +# store last dac answers ACK, not ACK +lstt_dacanswers = [[-1], [-1], [-1], [-1]] +# store last number of points sent to etherdreams buffer +lstt_points = [[0], [0], [0], [0]] + +swapX = [1,1,1,-1] +swapY = [1,1,1,-1] + +maxCurvesByLaser = 4 + + +# For glitch art : change position and decrease number of points added by newdac.py +# shortline for lines shorter than 4000 (in etherdream coordinates) +# i.e (0.25,3) means add 3 points at 25% on the line. +stepshortline = [ (1.0, 8)] +stepslongline = [ (0.25, 3), (0.75, 3), (1.0, 10)] + + +#curveColor = [255,0,0] * maxCurvesByLaser +#curveColor = [[0 for _ in range(3)] for _ in range(maxCurvesByLaser)] +curveColor = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)] +colorX = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)] +colorY = [[255 for _ in range(3)] for _ in range(maxCurvesByLaser)] +offsetX = [0] * maxCurvesByLaser +offsetY = [0] * maxCurvesByLaser +curveNumber = 0 +Curve = curveNumber +XTimeAxe=30000 +YTimeAxe=30000 + +#curveX = [255,255,255] * maxCurvesByLaser +#curveY = [255,255,255] * maxCurvesByLaser + +Mode = 5 + +point = [0,0,0] + +# gstt.colormode select what to display. Can be changed with /noteon 57-64 +colormode = 0 +color = [255,255,255] +newcolor = 0 + +surpriseoff = 10 +surpriseon = 50 +surprisey = -10 +surprisex = -10 + + +cc = [0] * 256 +lfo = [0] * 10 +osc = [0] * 255 +oscInUse = [0] * 255 +knob = [0] * 33 + +stars0=[] +stars1=[] +stars2=[] +#stars3=[] +# Viewer distance (cc 21) +cc[21]=60 +viewer_distance = cc[21] * 8 + +# fov (cc 22) +cc[22]= 60 +fov = 4 * cc[22] + + + +''' +Also vailable with args : -v Value + +if debug = 1 you get : + + +if debug = 2 you get : +- dac errors + +''' + + +JumpFlag =0 + + +# nice X (cc 5) Y (cc 6) curve at first +cc[5] = cc[6] = 60 + +# Dot mode start at middle screen +cc[1] = cc[2] = 63 + +note = 0 +velocity = 0 + +WingHere = -1 +BhorealHere = -1 +LaunchHere = -1 +BhorLeds = [0] * 64 + +oscx = 0 +oscy = 0 +oscz = 0 + + +# Ai Parameters + +aivelocity = 0.5 +aiexpressivity = 0.5 +aisensibility = 0.5 +aibeauty = 0.5 + + +# OSC ports +#temporaray fix hack : iport=nozoport +iport = 8001 #LJay (bhorosc) input port +oport = 8002 #LJay (bhorosc) output port +noziport=8003 #nozosc.py receiving commands port +nozoport=8001 #nozosc.py sending port to LJay (main.py) +nozuport=0 #linux serial usb port connecting nozoid devices ACM0 by default + + +X = [0] * maxCurvesByLaser +Y = [0] * maxCurvesByLaser + +# No rotation X (cc 29) Y (cc 30) Z (cc 31) at first +cc[29] = cc[30] = cc[31] = prev_cc29 = 0 +prev_cc29 = prev_cc30 = prev_cc31 = -1 + +angleX = 0 +angleY = 0 +angleZ = 0 + +tomidi = False # currently tomidi bypass all other directions +todmx = False +toled = False +tolaser = True +tosynth = False + +sernozoid = "" +nozoid = "" +serdmx = "" +newnumber = "" +oldnumber = "" + +''' +# will be overrided but settings.conf values. +# legacy one laser only values +centerx = LASER_CENTER_X +centery = LASER_CENTER_Y +zoomx = LASER_ZOOM_X +zoomy = LASER_ZOOM_Y +sizex = LASER_SIZE_X +sizey = LASER_SIZE_Y +finangle = LASER_ANGLE +''' + +# multilasers arrays +# will be overrided but settings.conf values. +centerX = [0,0,0,0] +centerY = [0,0,0,0] +zoomX = [0,0,0,0] +zoomY = [0,0,0,0] +sizeX = [0,0,0,0] +sizeY = [0,0,0,0] +finANGLE = [0,0,0,0] + +warpdest = [[[ 1. , 0. , 0.],[ 0. , 1. , 0.],[ 0. , 0. , 1.]], +[[ 1. , 0. , 0.],[ 0. , 1. , 0.],[ 0. , 0. , 1.]], +[[ 1. , 0. , 0.],[ 0. , 1. , 0.],[ 0. , 0. , 1.]], +[[ 1. , 0. , 0.],[ 0. , 1. , 0.],[ 0. , 0. , 1.]] +] + diff --git a/homographyp.py b/homographyp.py new file mode 100755 index 0000000..2270432 --- /dev/null +++ b/homographyp.py @@ -0,0 +1,246 @@ + +#!/usr/bin/python2.7 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + +''' + +LJay/LJ +v0.7.0 + +LICENCE : CC +Sam Neurohack + +Homographies for align + swap corrections and warp corrections + +Align + swap homography if found with 4 original points and corrected coordinates +Warp correction is disabled for the moment. Should be computed at warp edition : set 1 curve 1 + +Use the : + +######################################################################## +# Module to compute homographies # +# # +# Author : Alexis Mignon # +# email : alexis.mignon@info.unicaen.fr # +# date : 10/03/2010 # +######################################################################## + + Module to compute homographies between two sets of 2D points + + implemented functions : + - find_homography(points1,points2) : finds the homography between + two sets of 2D points + - find_affine_homography(points1,points2) : finds the affine + homography between two sets of 2D points + - apply_homography(H,points) : applies homography H to the set of + 2D points 'points' + + example : + >>> from homography import * + >>> + >>> points1 = np.array([[ 0., 0. ], + >>> [ 1., 0. ], + >>> [ 0., 1. ], + >>> [ 1., 1. ]]) + >>> + >>> points2 = np.array([[ 0. , 0. ], + >>> [ 1. , 0. ], + >>> [ 0.25, 1. ], + >>> [ 0.75, 1. ]]) + >>> + >>> points3 = np.array([[-1., 0.], + >>> [ 0.,-1.], + >>> [ 0., 1.], + >>> [ 1., 0.]]) + >>> + >>> H1 = find_homography(points1,points2) + >>> print H1 + >>> print apply_homography(H1,points1) + >>> H2 = find_affine_homography(points1,points3) + >>> print H2 + >>> print apply_homography(H2,points1) +''' + + +import numpy as np +import math +from scipy.linalg import svd,lstsq +import ast +import gstt +#from globalVars import xy_center +import redis + + +r = redis.StrictRedis(host=gstt.LjayServerIP, port=6379, db=0) + +def find(points1,points2): + if points1.shape[0] != points2.shape[0] : raise ValueError("The number of input and output points mismatches") + if points1.shape[1] == 2 : + p1 = np.ones((len(points1),3),'float64') + p1[:,:2] = points1 + elif points1.shape[1] == 3 : p1 = points1 + else : raise ValueError("Bad shape for input points") + + if points2.shape[1] == 2 : + p2 = np.ones((len(points2),3),'float64') + p2[:,:2] = points2 + elif points2.shape[1] == 3 : p2 = points2 + else : raise ValueError("Bad shape for output points") + + npoints = len(points1) + + A = np.zeros((3*npoints,9),'float64') + + for i in xrange(npoints): + p1i = p1[i] + x2i,y2i,w2i = p2[i] + xpi = x2i*p1i + ypi = y2i*p1i + wpi = w2i*p1i + + A[i*3 ,3:6] = -wpi + A[i*3 ,6:9] = ypi + A[i*3+1,0:3] = wpi + A[i*3+1,6:9] = -xpi + A[i*3+2,0:3] = -ypi + A[i*3+2,3:6] = xpi + + U,s,Vt = svd(A,full_matrices = False, overwrite_a = True) + del U,s + h = Vt[-1] + H = h.reshape(3,3) + return H + +def find_affine(points1,points2): + if points1.shape[0] != points2.shape[0] : raise ValueError("The number of input and output points mismatches") + if points1.shape[1] == 2 : + p1 = np.ones((len(points1),3),'float64') + p1[:,:2] = points1 + elif points1.shape[1] == 3 : p1 = points1 + else : raise ValueError("Bad shape for input points") + + if points2.shape[1] == 2 : + p2 = np.ones((len(points2),3),'float64') + p2[:,:2] = points2 + elif points2.shape[1] == 3 : p2 = points2 + else : raise ValueError("Bad shape for output points") + + npoints = len(points1) + + A = np.zeros((3*npoints,6),'float64') + b = np.zeros((3*npoints,1),'float64') + for i in xrange(npoints): + p1i = p1[i] + x2i,y2i,w2i = p2[i] + xpi = x2i*p1i + ypi = y2i*p1i + wpi = w2i*p1i + + A[i*3 ,3:6] = -wpi + A[i*3+1,0:3] = wpi + A[i*3+2,0:3] = -ypi + A[i*3+2,3:6] = xpi + + b[i*3 ] = -y2i*p1i[2] + b[i*3+1] = x2i*p1i[2] + + h = lstsq(A,b,overwrite_a = True, overwrite_b = True)[0] + H = np.zeros( (3,3) , 'float64' ) + H[:2,:] = h.reshape(2,3) + H[2,2] = 1 + return H + +def apply(H,points): + + p = np.ones((len(points),3),'float64') + p[:,:2] = points + pp = np.dot(p,H.T) + pp[:,:2]/=pp[:,2].reshape(len(p),1) + return pp[:,:2] + +# Align and axis swap corrections +# Reference points +pointsref = np.array([(300.0, 400.0), (500.0, 400.0), (500.0, 200.0), (300.0, 200.0)]) + +def EDpoint(mylaser,(pygamex,pygamey)): + + #print "current point : ", pygamex, pygamey + XX = pygamex - gstt.xy_center[0] + YY = pygamey - gstt.xy_center[1] + CosANGLE = math.cos(gstt.finANGLE[mylaser]) + SinANGLE = math.sin(gstt.finANGLE[mylaser]) + # Multilaser style + x = (gstt.xy_center[0] + ((XX * CosANGLE) - (YY * SinANGLE)) - gstt.xy_center[0]) * gstt.zoomX[mylaser] + gstt.centerX[mylaser] + y = (gstt.xy_center[1] + ((XX * SinANGLE) + (YY * CosANGLE)) - gstt.xy_center[1]) * gstt.zoomY[mylaser] + gstt.centerY[mylaser] + + if gstt.debug >0: + + #print "global center :", xy_center + + print "Laser :", mylaser, "center at : ", gstt.centerX[mylaser], gstt.centerY[mylaser] + ''' + print "swaps : ", (gstt.swapX[mylaser]), str(gstt.swapY[mylaser]) + print "zooms : ", gstt.zoomX[mylaser], gstt.zoomY[mylaser] + print "angles : ", gstt.finANGLE[mylaser] + ''' + print "result : ", x * gstt.swapX[mylaser] , y * gstt.swapY[mylaser] + return [x * gstt.swapX[mylaser] , y * gstt.swapY[mylaser]] + +''' +def EDpoint((pygamex,pygamey)): + + XX = pygamex - xy_center[0] + YY = pygamey - xy_center[1] + CosANGLE = math.cos(finangle) + SinANGLE = math.sin(finangle) + # Multilaser style + x = (xy_center[0] + ((XX * CosANGLE) - (YY * SinANGLE)) - xy_center[0]) * zoomx + centerx + y = (xy_center[1] + ((XX * SinANGLE) + (YY * CosANGLE)) - xy_center[1]) * zoomy + centery + + return [x*1, y*1] +''' + + +# New total homography from always the same reference points : ED (= align + swap) transform + warp transform. +# WARP IS DISABLED. Some bug tracking is needed ! +def newEDH(mylaser): + + EDpoints = [] + for point in xrange(4): + EDpoints.append(EDpoint(mylaser,pointsref[point])) + + # H matrix tansform pygame points in Etherdream system with align and swap correction, + H = find(pointsref, np.array(EDpoints)) + + # Computer Hwarp matrix with previously reference warped points in configuration file. + Hwarp = find(pointsref, gstt.warpdest[mylaser]) + #Hwarp = np.identity(3, dtype = float) + # EDH matrix + gstt.EDH[mylaser] = H + + # EDH matrix is H x Hwarp + #gstt.EDH[mylaser] = np.dot(H,Hwarp) + print "Laser",mylaser,"NEW EDH computed, sending to redis..." + r.set('/EDH/'+str(mylaser), np.array2string(gstt.EDH[mylaser], separator=',')) + + # Laser bit 0 = 0 and bit 1 = 1 : New EDH + order = r.get('/order') + print order + neworder = order & ~(1<< mylaser*2) + neworder = neworder | (1<< 1+mylaser*2) + r.set('/order', str(neworder)) + + if gstt.debug >1: + print "" + print "laser ", mylaser + print "reference points", pointsref + print "laser EDpoints :", EDpoints + print "-> Computed H :",H + #print "warped points coordinates ", gstt.warpdest[mylaser] + #print "-> Computed Hwarp", Hwarp + #print "laser ", mylaser, "warpd ",ast.literal_eval(gstt.warpdest[gstt.Laser]) + #print "laser ", mylaser, "Hwarp ", Hwarp + #print "" + print "-> new EDH :", gstt.EDH[mylaser] + diff --git a/las.py b/las.py new file mode 100644 index 0000000..f2a4e6f --- /dev/null +++ b/las.py @@ -0,0 +1,230 @@ +# coding=UTF-8 +""" + +LJ OSC handler +v0.7.0 + + +LICENCE : CC +by Sam Neurohack, Loloster, +from /team/laser + + +""" + +import types, time +import gstt + +#import colorify +import homographyp +import settings +#import alignp +import redis + + +r = redis.StrictRedis(host=gstt.LjayServerIP , port=6379, db=0) + +def GridOn(laser): + + print "Grid for laser ", laser + # Grid PL is Laser bit 0 = 1 and bit 1 = 1 + order = r.get('/order') + neworder = order | (1<0: + print "" + print "default handler" + print "Bhorosc said for laser",laser,": ", path, oscpath, args + + + # /grid/lasernumber value (0 or 1) + if oscpath[1] == "grid": + + if args[0] == "1": + print "Grid requested for laser ", laser + GridOn(laser) + else: + print "No grid for laser ", laser + UserOn(laser) + + + # /black/lasernumber value (0 or 1) + if oscpath[1] == "black": + + if args[0] == "1": + print "Grid requested for laser ", laser + BlackOn(laser) + else: + print "No grid for laser ", laser + UserOn(laser) + + + + # /ip/lasernumber value + if oscpath[1] == "ip": + print "New IP for laser ", laser + gstt.lasersIPS[laser]= args[0] + NewEDH(laser) + + # /kpps/lasernumber value + # Live change of kpps is not implemented in newdac.py. Change will effect next startup. + if oscpath[1] == "kpps": + print "New kpps for laser ", laser, " next startup", args[0] + gstt.kpps[laser]= int(args[0]) + NewEDH(laser) + + # /angle/lasernumber value + if oscpath[1] == "angle": + print "New Angle modification for laser ", oscpath[2], ":", args[0] + gstt.finANGLE[laser] += int(args[0]) + homographyp.newEDH(laser) + NewEDH(laser) + + + + # /intens/lasernumber value + if oscpath[1] == "intens": + print "New intensity requested for laser ", oscpath[2], ":", args[0] + print "Change not implemented yet" + + + + # /mouse/lasernumber value (0 or 1) + if oscpath[1] == "mouse": + + if args[0] == "1": + print "Mouse requested for laser ", oscpath[2] + gstt.Laser = oscpath[2] + else: + print "No mouse for laser ", oscpath[2] + + + # /swap/X/lasernumber value (0 or 1) + if oscpath[1] == "swap" and oscpath[2] == "X": + + if args[0] == "0": + print "swap X : -1 for laser ", laser + gstt.swapX[laser]= -1 + homographyp.newEDH(laser) + NewEDH(laser) + + else: + print "swap X : 1 for laser ", laser + gstt.swapX[laser]= 1 + homographyp.newEDH(laser) + NewEDH(laser) + + # /swap/Y/lasernumber value (0 or 1) + if oscpath[1] == "swap" and oscpath[2] == "Y": + if args[0] == "0": + print "swap Y : -1 for laser ", laser + gstt.swapY[laser]= -1 + homographyp.newEDH(laser) + NewEDH(laser) + else: + print "swap Y : 1 for laser ", laser + gstt.swapY[laser]= 1 + homographyp.newEDH(laser) + NewEDH(laser) + + # /loffset/X/lasernumber value + if oscpath[1] == "loffset" and oscpath[2] == "X": + print "offset/X laser ", laser, "modified : ", args[0] + gstt.centerX[laser] -= int(args[0]) + homographyp.newEDH(laser) + NewEDH(laser) + + # /loffset/Y/lasernumber value + if oscpath[1] == "loffset" and oscpath[2] == "Y": + print "offset/Y laser ", laser, "modified : ", args[0] + gstt.centerY[laser] -= int(args[0]) + homographyp.newEDH(laser) + NewEDH(laser) + + + # /scale/X/lasernumber value + if oscpath[1] == "scale" and oscpath[2] == "X": + print "scale/X laser ", laser , "modified : ", args[0] + gstt.zoomX[laser] += int(args[0]) + homographyp.newEDH(laser) + NewEDH(laser) + + # /scale/Y/lasernumber value + if oscpath[1] == "scale" and oscpath[2] == "Y": + print "scale/Y laser ", laser, "modified : ", args[0] + gstt.zoomY[laser] += int(args[0]) + homographyp.newEDH(laser) + NewEDH(laser) + +''' +For reference values of EDH modifier if assign to keyboard keys (was alignp) + + gstt.centerY[gstt.Laser] -= 20 + + gstt.centerY[gstt.Laser] += 20 + + gstt.zoomX[gstt.Laser]-= 0.1 + + gstt.zoomX[gstt.Laser] += 0.1 + gstt.zoomY[gstt.Laser] -= 0.1 + + gstt.zoomY[gstt.Laser] += 0.1 + + gstt.sizeX[gstt.Laser] -= 50 + + gstt.sizeX[gstt.Laser] += 50 + + gstt.sizeY[gstt.Laser] -= 50 + + gstt.sizeY[gstt.Laser] += 50 + + gstt.finANGLE[gstt.Laser] -= 0.001 + + gstt.finANGLE[gstt.Laser] += 0.001 +''' diff --git a/mainy.conf b/mainy.conf new file mode 100644 index 0000000..e0a7cdf --- /dev/null +++ b/mainy.conf @@ -0,0 +1,84 @@ +[General] +set = 5 +curve = 0 +lasernumber = 3 +ljayserverip = 127.0.0.1 +nozoscip = 127.0.0.1 +bhoroscip = 127.0.0.1 + +[laser0] +pl = 0 +color = -1 +ip = 192.168.1.4 +kpps = 25000 +centerx = 0 +centery = 0 +zoomx = 49.2 +zoomy = 49.0 +sizex = 31450 +sizey = 32000 +finangle = 0.0 +swapx = 1 +swapy = -1 +warpdest = [[-1500., 1500.], + [ 1500., 1500.], + [ 1500.,-1500.], + [-1500.,-1500.]] + +[laser1] +pl = 1 +color = -1 +ip = 192.168.1.5 +kpps = 25000 +centerx = 0 +centery = 0 +zoomx = 48.5 +zoomy = 50.1 +sizex = 32000 +sizey = 32000 +finangle = 0.0 +swapx = 1 +swapy = 1 +warpdest = [[-1500., 1500.], + [ 1500., 1500.], + [ 1500.,-1500.], + [-1500.,-1500.]] + +[laser2] +pl = 2 +color = -1 +ip = 192.168.1.6 +kpps = 25000 +centerx = 0 +centery = 0 +zoomx = 47.8 +zoomy = 39.3 +sizex = 30600 +sizey = 32000 +finangle = -0.008 +swapx = 1 +swapy = 1 +warpdest = [[-1500., 1500.], + [ 1500., 1500.], + [ 1500.,-1500.], + [-1500.,-1500.]] + +[laser3] +pl = 3 +color = -1 +ip = 192.168.1.3 +kpps = 25000 +centerx = 0 +centery = 0 +zoomx = 38.0 +zoomy = 26.0 +sizex = 32000 +sizey = 32000 +finangle = 0.0 +swapx = -1 +swapy = -1 +warpdest = [[-1500., 1500.], + [ 1500., 1500.], + [ 1500.,-1500.], + [-1500.,-1500.]] + diff --git a/mainyservers.py b/mainyservers.py new file mode 100644 index 0000000..57b2223 --- /dev/null +++ b/mainyservers.py @@ -0,0 +1,534 @@ +''' +LJ Servers v0.8 + +Laser server + webUI servers (ws + OSC) + +- get point list to draw : /pl/lasernumber +- for report /lstt/lasernumber /lack/lasernumber /cap/lasernumber + +todo : + +r.set('/resampler/0', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]') +r.set('/resampler/1', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]') +r.set('/resampler/2', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]') +r.set('/resampler/3', '[ (1.0, 8),(0.25, 3), (0.75, 3), (1.0, 10)]') + +''' +from __future__ import absolute_import +import time +import gstt +import redis + + +print "" +print "" +print "LJ Laser Servers" +print "v0.8.0" +print "" + +import settings +settings.Read() + +from multiprocessing import Process, Queue, TimeoutError +import random, ast + +import newdacp +import homographyp +import las + + +from OSC import OSCServer, OSCClient, OSCMessage +from websocket_server import WebsocketServer +#import socket +import types, thread, time + +r = redis.StrictRedis(host=gstt.LjayServerIP , port=6379, db=0) + +def dac_process(number, pl): + while True: + try: + d = newdacp.DAC(number,pl) + d.play_stream() + except Exception as e: + + import sys, traceback + if gstt.debug == 2: + print '\n---------------------' + print 'Exception: %s' % e + print '- - - - - - - - - - -' + traceback.print_tb(sys.exc_info()[2]) + print "\n" + pass + + except KeyboardInterrupt: + sys.exit(0) + + + +''' +def Laserver(): + + + + + #for laserid in range(0,4): + # r.set('/lack/'+str(laserid),0) + # r.set('/lstt/'+str(laserid),0) + + + + # Some random lists for all lasers at launch. + print "" + print "Creating startup point lists..." + + random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] + if r.set('/pl/0', str(random_points)) == True: + print "/pl/0 ", ast.literal_eval(r.get('/pl/0')) + + random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] + if r.set('/pl/1', str(random_points)) == True: + print "/pl/1 ", ast.literal_eval(r.get('/pl/1')) + + random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] + if r.set('/pl/2', str(random_points)) == True: + print "/pl/2 ", ast.literal_eval(r.get('/pl/2')) + + random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] + if r.set('/pl/3', str(random_points)) == True: + print "/pl/3 ", ast.literal_eval(r.get('/pl/3')) + + + # Order all lasers to show these random shapes at startup -> tell all 4 laser process to USER PLs + r.set('/order', "0") + + + # Launch one process (a newdacp instance) by etherdream + + print "" + dac_worker0= Process(target=dac_process,args=(0,0)) + print "Launching Laser 0 Process..." + dac_worker0.start() + + if lasernumber >0: + dac_worker1= Process(target=dac_process,args=(1,0)) + print "Launching Laser 1 Process..." + dac_worker1.start() + + if lasernumber >1: + dac_worker2= Process(target=dac_process,args=(2,0)) + print "Launching Laser 2 Process..." + dac_worker2.start() + + if lasernumber >2: + dac_worker3= Process(target=dac_process,args=(3,0)) + print "Launching Laser 3 Process..." + dac_worker3.start() + + # Main loop do nothing. Maybe do the webui server ? + try: + #while True: + + # Websocket startup + + server = WebsocketServer(wsPORT,host=serverIP) + # Launch OSC thread listening to Bhorosc + print "" + print "Launching webUI OSC Handler..." + thread.start_new_thread(osc_thread, ()) + # Default OSC handler for all incoming message from Bhorosc + oscserver.addMsgHandler("default", handler) + + #print server + print "" + print "Launching webUI Websocket server..." + print "at :", serverIP, "port :",wsPORT + server.set_fn_new_client(new_client) + server.set_fn_client_left(client_left) + server.set_fn_message_received(message_received) + server.run_forever() + print "" + print "Running..." + + except KeyboardInterrupt: + pass + + # Gently stop on CTRL C + + finally: + + dac_worker0.join() + if lasernumber >0: + dac_worker1.join() + if lasernumber >1: + dac_worker2.join() + if lasernumber >2: + dac_worker3.join() + + + for laserid in range(0,lasernumber+1): + print "reset redis values for laser",laserid + r.set('/lack/'+str(laserid),64) + r.set('/lstt/'+str(laserid),64) + r.set('/cap/'+str(laserid),0) + + print "Fin des haricots" +''' + + +# +# webUI server +# + + +serverIP = gstt.LjayServerIP +print "Redis IP :", serverIP + +bhoroscIP = gstt.oscIPin +print "Bhorosc IP :", bhoroscIP + +nozoscIP = gstt.nozoscip +print "Nozosc IP :", nozoscIP + +debug = gstt.debug +print "Debug :", debug + +lasernumber = gstt.LaserNumber -1 +print "Lasers requested :", gstt.LaserNumber + + +# Websocket listening port +wsPORT = 9001 + +# With Bhorosc +# OSC Server : relay OSC message from Bhorosc outport 8002 to UI +#oscIPin = "192.168.1.10" +bhoroscIPin = serverIP +bhoroscPORTin = 8002 + +# OSC Client : relay message from UI to Bhorosc inport 8001 +bhoroscIPout = bhoroscIP +bhoroscPORTout = 8001 + + +# With Nozosc +# OSC Client : relay message from UI to Nozosc inport 8003 +NozoscIPout = nozoscIP +NozoscPORTout = 8003 + + +# +# OSC part +# + +print "" +print "Launching Bhorosc commands receiver..." +print "at", bhoroscIPin, "port",str(bhoroscPORTin) +oscserver = OSCServer( (bhoroscIPin, bhoroscPORTin) ) +oscserver.timeout = 0 +OSCRunning = True + + +def handle_timeout(self): + self.timed_out = True + +oscserver.handle_timeout = types.MethodType(handle_timeout, oscserver) + +osclientbhorosc = OSCClient() +oscmsg = OSCMessage() +osclientbhorosc.connect((bhoroscIPout, bhoroscPORTout)) + +# send UI string as OSC message to Bhorosc 8001 +# sendbhorosc(oscaddress, [arg1, arg2,...]) + +def sendbhorosc(oscaddress,oscargs=''): + + oscmsg = OSCMessage() + oscmsg.setAddress(oscaddress) + oscmsg.append(oscargs) + + #print ("sending to bhorosc : ",oscmsg) + try: + osclientbhorosc.sendto(oscmsg, (bhoroscIPout, bhoroscPORTout)) + oscmsg.clearData() + except: + print ('Connection to bhorosc refused : died ?') + sendWSall("/on 0") + sendWSall("/status NoLJay") + pass + #time.sleep(0.001) + + +# send UI string as OSC message to Nozosc 8003 +# sendnozosc(oscaddress, [arg1, arg2,...]) + +def sendnozosc(oscaddress,oscargs=''): + + oscmsg = OSCMessage() + oscmsg.setAddress(oscaddress) + oscmsg.append(oscargs) + + #print ("sending to nozosc : ",oscmsg) + try: + osclientnozosc.sendto(oscmsg, (NozoscIPout, NozoscPORTout)) + oscmsg.clearData() + except: + print ('Connection to nozosc refused : died ?') + sendWSall("/on 0") + sendWSall("/status No Nozosc ") + pass + #time.sleep(0.001) + +# NOT USED see las.py +# OSC default path handler : send OSC message from Bhorosc 8002 to UI via websocket 9001 +def handler(path, tags, args, source): + + oscpath = path.split("/") + pathlength = len(oscpath) + if debug >0: + print "" + print "default handler" + print "Bhorosc said : ", path, oscpath, args + sendWSall(path + " " + str(args[0])) + + ''' + # /lstt/number value + if oscpath[1] == "lstt": + sendWSall(path + " " + str(args[0])) + # /status string + if oscpath[1] == "status": + sendWSall(path + " " + str(args[0])) + ''' + + +# 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() + + + +# OSC Thread. Bhorosc handler and Automated status sender to UI. +def osc_thread(): + + print "Launching Automatic Dac status and bhorosc forwarder." + print "Will use Redis server IP ", serverIP + + ''' + r = redis.StrictRedis(host=serverIP, port=6379, db=0) + print "Connection to redis server.." + print "Running..." + ''' + + while True: + try: + while True: + + time.sleep(1) + osc_frame() + + + for laserid in range(0,lasernumber): # Laser not used -> led is not lit + + lstt = r.get('/lstt/'+ str(laserid)) + #print "laserid", laserid,"lstt",lstt + if lstt == "0": # Dac IDLE state(0) -> led is blue (3) + sendWSall("/lstt/" + str(laserid) + " 3") + if lstt == "1": # Dac PREPARE state (1) -> led is cyan (2) + sendWSall("/lstt/" + str(laserid) + " 2") + if lstt == "2": # Dac PLAYING (2) -> led is green (1) + sendWSall("/lstt/" + str(laserid) + " 1") + + # This is used not working : lack never change. Todo : retest. + lack= r.get('/lack/'+str(laserid)) + #print "laserid", laserid,"lack",lack + if lack == 'a': # Dac sent ACK ("a") -> led is green (1) + sendWSall("/lack/" + str(laserid) +" 1") + if lack == 'F': # Dac sent FULL ("F") -> led is orange (5) + sendWSall("/lack/" + str(laserid) +" 5") + if lack == 'I': # Dac sent INVALID ("I") -> led is yellow (4) + sendWSall("/lack/" + str(laserid)+" 4") + #print lack + + if lack == "64" or lack =="35": # no connection to dac -> leds are red (6) + sendWSall("/lack/" + str(laserid) + " 0") + sendWSall("/lstt/" + str(laserid) + " 0") + #sendWSall("/lstt/" + str(laserid) + " 0") + sendWSall("/points/" + str(laserid) + " 0") + + else: + # last number of points sent to etherdream buffer + sendWSall("/points/" + str(laserid) + " " + str(r.get('/cap/'+str(laserid)))) + + #sendWSall("/plframe/" + str(laserid) ) # + " " + str(r.get('/pl/'+str(laserid)))) + + # WIP Too much packets -> flood webUI : Draw all PL point lists in JS canvas in WebUI + + ''' + for pl in range(0,1): + bhorosc.sendosc("/plframe/" + str(pl),"") + for plpoint in range(0,len(gstt.PL[pl])): + bhorosc.sendosc("/plpoint/" + str(pl),"") + ''' + + + + except Exception as e: + import sys, traceback + print '\n---------------------' + print 'Exception: %s' % e + print '- - - - - - - - - - -' + traceback.print_tb(sys.exc_info()[2]) + print "\n" + + + +# +# Websocket part +# + +# Called for every WS client connecting (after handshake) +def new_client(client, server): + print("New WS client connected and was given id %d" % client['id']) + sendWSall("/status Hello %d" % client['id']) + +# Called for every WS client disconnecting +def client_left(client, server): + print("WS Client(%d) disconnected" % client['id']) + + +# Called when a WS client sends a message +def message_received(client, server, message): + if len(message) > 200: + message = message[:200]+'..' + if debug >0: + print("WS Client(%d) said: %s" % (client['id'], message)) + oscpath = message.split(" ") + + # current UI has no dedicated off button so /on 0 trigs /off to bhorosc + if oscpath[0] == "/on": + if oscpath[1] == "1": + sendbhorosc("/on") + else: + sendbhorosc("/off") + else: + print "sending to bhorosc",oscpath[0],oscpath[1] + sendbhorosc(oscpath[0],oscpath[1]) + + # if needed a loop back : WS Client -> server -> WS Client + #sendWSall("ws"+message) + + +def handle_timeout(self): + self.timed_out = True + + +def sendWSall(message): + if debug >0: + print("WS sending %s" % (message)) + server.send_message_to_all(message) + + + +# Some random lists for all lasers at launch. +print "" +print "Creating startup point lists..." + +random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] +if r.set('/pl/0', str(random_points)) == True: + print "/pl/0 ", ast.literal_eval(r.get('/pl/0')) + +random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] +if r.set('/pl/1', str(random_points)) == True: + print "/pl/1 ", ast.literal_eval(r.get('/pl/1')) + +random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] +if r.set('/pl/2', str(random_points)) == True: + print "/pl/2 ", ast.literal_eval(r.get('/pl/2')) + +random_points = [(300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 0), (500.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280), (500.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 400.0+random.randint(-100, 100), 65280), (300.0+random.randint(-100, 100), 200.0+random.randint(-100, 100), 65280)] +if r.set('/pl/3', str(random_points)) == True: + print "/pl/3 ", ast.literal_eval(r.get('/pl/3')) + + +# Order all lasers to show these random shapes at startup -> tell all 4 laser process to USER PLs +r.set('/order', "0") + + +# Launch one process (a newdacp instance) by etherdream + +print "" +dac_worker0= Process(target=dac_process,args=(0,0)) +print "Launching Laser 0 Process..." +dac_worker0.start() + +if lasernumber >0: + dac_worker1= Process(target=dac_process,args=(1,0)) + print "Launching Laser 1 Process..." + dac_worker1.start() + +if lasernumber >1: + dac_worker2= Process(target=dac_process,args=(2,0)) + print "Launching Laser 2 Process..." + dac_worker2.start() + +if lasernumber >2: + dac_worker3= Process(target=dac_process,args=(3,0)) + print "Launching Laser 3 Process..." + dac_worker3.start() + +# Main loop do nothing. Maybe do the webui server ? +try: + #while True: + + # Websocket startup + + server = WebsocketServer(wsPORT,host=serverIP) + # Launch OSC thread listening to Bhorosc + print "" + print "Launching webUI OSC Handler..." + thread.start_new_thread(osc_thread, ()) + # Default OSC handler for all incoming message from Bhorosc + oscserver.addMsgHandler("default", las.handler) + + #print server + print "" + print "Launching webUI Websocket server..." + print "at :", serverIP, "port :",wsPORT + server.set_fn_new_client(new_client) + server.set_fn_client_left(client_left) + server.set_fn_message_received(message_received) + server.run_forever() + print "" + print "Running..." + +except KeyboardInterrupt: + pass + +# Gently stop on CTRL C + +finally: + + dac_worker0.join() + if lasernumber >0: + dac_worker1.join() + if lasernumber >1: + dac_worker2.join() + if lasernumber >2: + dac_worker3.join() + + + for laserid in range(0,lasernumber+1): + print "Redis Etherdream",laserid,"feedback reset." + r.set('/lack/'+str(laserid),64) + r.set('/lstt/'+str(laserid),64) + r.set('/cap/'+str(laserid),0) + +print "Fin des haricots" + + + + + diff --git a/newdacp.py b/newdacp.py new file mode 100644 index 0000000..676ccbc --- /dev/null +++ b/newdacp.py @@ -0,0 +1,444 @@ +#!/usr/bin/python2.7 +# -*- coding: utf-8 -*- +# -*- mode: Python -*- + +''' +LJay v0.8.0 + +newdacp.py +Unhanced version (redis and process style) of the etherdream python library from j4cDAC. + +LICENCE : CC +Sam Neurohack, pclf + +Conversion in etherdream coordinates, geometric corrections,... +Init call with a laser number and which point list to draw. Etherdream IP is found in conf file for given laser number + +Uses redis keys value for live inputs/outputs +These redis keys are read and set at each main loop. + +Live inputs : +/pl/lasernumber [(x,y,color),(x1,y1,color),...] A string of list of pygame points list. +/resampler/lasernumber [(1.0,8), (0.25,3),(0.75,3),(1.0,10)] : a string for resampling rules. + the first tuple (1.0,8) is for short line < 4000 in etherdream space + (0.25,3),(0.75,3),(1.0,10) for long line > 4000 + i.e (0.25,3) means go at 25% position on the line, send 3 times this position to etherdream + +Live ouputs : +/lstt/lasernumber value etherdream last_status.playback_state (0: idle 1: prepare 2: playing) +/cap/lasernumber number of empty points sent to fill etherdream buffer (up to 1799) +/lack/lasernumber value "a": ACK "F": Full "I": invalid. 64 or 35 for no connection. +Geometric corrections : + + + + +''' + +import socket +import time +import struct +from gstt import debug, PL +import gstt +import math +from itertools import cycle +#from globalVars import * +import pdb +import ast +import redis + +import homographyp +import numpy as np + +black_points = [(278.0,225.0,0),(562.0,279.0,0),(401.0,375.0,0),(296.0,454.0,0),(298.0,165.0,0)] +grid_points = [(300.0,200.0,0),(500.0,00.0,65280),(500.0,400.0,65280),(300.0,400.0,65280),(300.0,200.0,65280),(200.0,100.0,0),(600.0,100.0,65280),(600.0,500.0,65280),(200.0,500.0,65280),(200.0,100.0,65280)] + +r = redis.StrictRedis(host=gstt.LjayServerIP, port=6379, db=0) + + +def pack_point(x, y, r, g, b, i = -1, u1 = 0, u2 = 0, flags = 0): + """Pack some color values into a struct dac_point. + + Values must be specified for x, y, r, g, and b. If a value is not + passed in for the other fields, i will default to max(r, g, b); the + rest default to zero. + """ + + if i < 0: + i = max(r, g, b) + + return struct.pack("> 16) & 0xFF) << 8, ((c >> 8) & 0xFF) << 8, (c & 0xFF) << 8 + #print '' + return (position[0][0], position[0][1], ((c >> 16) & 0xFF) << 8, ((c >> 8) & 0xFF) << 8, (c & 0xFF) << 8) + + + def read(self, l): + """Read exactly length bytes from the connection.""" + while l > len(self.buf): + self.buf += self.conn.recv(4096) + + obuf = self.buf + self.buf = obuf[l:] + return obuf[:l] + + def readresp(self, cmd): + """Read a response from the DAC.""" + data = self.read(22) + response = data[0] + #print "laser response", self.mylaser, response + gstt.lstt_dacanswers[self.mylaser] = response + cmdR = data[1] + status = Status(data[2:]) + r.set('/lack/'+str(self.mylaser), response) + + if cmdR != cmd: + raise ProtocolError("expected resp for %r, got %r" + % (cmd, cmdR)) + + if response != "a": + raise ProtocolError("expected ACK, got %r" + % (response, )) + + self.last_status = status + return status + + def __init__(self, mylaser, PL, port = 7765): + """Connect to the DAC over TCP.""" + socket.setdefaulttimeout(2) + + #print "init" + self.mylaser = mylaser + #print "DAC", self.mylaser, "Handler process, connecting to", gstt.lasersIPS[mylaser] + self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.connstatus = self.conn.connect_ex((gstt.lasersIPS[mylaser], port)) + #print "Connection status for", self.mylaser,":", self.connstatus + #print 'debug', debug, gstt.debug + # ipconn state is -1 at startup (see gstt) and modified here + r.set('/lack/'+str(self.mylaser), self.connstatus) + gstt.lstt_ipconn[self.mylaser] = self.connstatus + + self.buf = "" + # Upper case PL is the Point List number + self.PL = PL + + # Lower case pl is the actual point list coordinates + self.pl = ast.literal_eval(r.get('/pl/'+str(self.mylaser))) + #if self.mylaser ==0: + print "DAC Init Laser", self.mylaser + #print "pl :", self.pl + #print "EDH/"+str(self.mylaser),r.get('/EDH/'+str(self.mylaser)) + if r.get('/EDH/'+str(self.mylaser)) == None: + print "Laser",self.mylaser,"NO EDH !! Computing one..." + homographyp.newEDH(self.mylaser) + else: + gstt.EDH[self.mylaser] = np.array(ast.literal_eval(r.get('/EDH/'+str(self.mylaser)))) + print "Laser",self.mylaser,"found its EDH in redis" + #print gstt.EDH[self.mylaser] + + ''' + d =homographyp.apply(gstt.EDH[self.mylaser],np.array([(300,400)])) + print '' + print "d",d + print "d0",d[0] + #print "d1",len(d[1]) + print " " + ''' + + self.xyrgb = self.xyrgb_prev = (0,0,0,0,0) + self.newstream = self.OnePoint() + + print "Connection status for", self.mylaser,":", self.connstatus + #print 'debug', debug + if self.connstatus != 0: + print "" + print "Connection ERROR",self.connstatus,"with laser", str(mylaser),":",str(gstt.lasersIPS[mylaser]) + #print "first 10 points in PL",self.PL, self.GetPoints(10) + + # Reference points + # Read the "hello" message + first_status = self.readresp("?") + first_status.dump() + position = [] + + + def begin(self, lwm, rate): + cmd = struct.pack("H", self.rfile.read(2))[0] + elif payload_length == 127: + payload_length = struct.unpack(">Q", self.rfile.read(8))[0] + + masks = self.read_bytes(4) + message_bytes = bytearray() + for message_byte in self.read_bytes(payload_length): + message_byte ^= masks[len(message_bytes) % 4] + message_bytes.append(message_byte) + opcode_handler(self, message_bytes.decode('utf8')) + + def send_message(self, message): + self.send_text(message) + + def send_pong(self, message): + self.send_text(message, OPCODE_PONG) + + def send_text(self, message, opcode=OPCODE_TEXT): + """ + Important: Fragmented(=continuation) messages are not supported since + their usage cases are limited - when we don't know the payload length. + """ + + # Validate message + if isinstance(message, bytes): + message = try_decode_UTF8(message) # this is slower but ensures we have UTF-8 + if not message: + logger.warning("Can\'t send message, message is not valid UTF-8") + return False + elif sys.version_info < (3,0) and (isinstance(message, str) or isinstance(message, unicode)): + pass + elif isinstance(message, str): + pass + else: + logger.warning('Can\'t send message, message has to be a string or bytes. Given type is %s' % type(message)) + return False + + header = bytearray() + payload = encode_to_UTF8(message) + payload_length = len(payload) + + # Normal payload + if payload_length <= 125: + header.append(FIN | opcode) + header.append(payload_length) + + # Extended payload + elif payload_length >= 126 and payload_length <= 65535: + header.append(FIN | opcode) + header.append(PAYLOAD_LEN_EXT16) + header.extend(struct.pack(">H", payload_length)) + + # Huge extended payload + elif payload_length < 18446744073709551616: + header.append(FIN | opcode) + header.append(PAYLOAD_LEN_EXT64) + header.extend(struct.pack(">Q", payload_length)) + + else: + raise Exception("Message is too big. Consider breaking it into chunks.") + return + + self.request.send(header + payload) + + def read_http_headers(self): + headers = {} + # first line should be HTTP GET + http_get = self.rfile.readline().decode().strip() + assert http_get.upper().startswith('GET') + # remaining should be headers + while True: + header = self.rfile.readline().decode().strip() + if not header: + break + head, value = header.split(':', 1) + headers[head.lower().strip()] = value.strip() + return headers + + def handshake(self): + headers = self.read_http_headers() + + try: + assert headers['upgrade'].lower() == 'websocket' + except AssertionError: + self.keep_alive = False + return + + try: + key = headers['sec-websocket-key'] + except KeyError: + logger.warning("Client tried to connect but was missing a key") + self.keep_alive = False + return + + response = self.make_handshake_response(key) + self.handshake_done = self.request.send(response.encode()) + self.valid_client = True + self.server._new_client_(self) + + @classmethod + def make_handshake_response(cls, key): + return \ + 'HTTP/1.1 101 Switching Protocols\r\n'\ + 'Upgrade: websocket\r\n' \ + 'Connection: Upgrade\r\n' \ + 'Sec-WebSocket-Accept: %s\r\n' \ + '\r\n' % cls.calculate_response_key(key) + + @classmethod + def calculate_response_key(cls, key): + GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' + hash = sha1(key.encode() + GUID.encode()) + response_key = b64encode(hash.digest()).strip() + return response_key.decode('ASCII') + + def finish(self): + self.server._client_left_(self) + + +def encode_to_UTF8(data): + try: + return data.encode('UTF-8') + except UnicodeEncodeError as e: + logger.error("Could not encode data to UTF-8 -- %s" % e) + return False + except Exception as e: + raise(e) + return False + + +def try_decode_UTF8(data): + try: + return data.decode('utf-8') + except UnicodeDecodeError: + return False + except Exception as e: + raise(e) diff --git a/webui/index.html b/webui/index.html new file mode 100644 index 0000000..f2ca6be --- /dev/null +++ b/webui/index.html @@ -0,0 +1,800 @@ + + + + + + LJay + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + +
+
/on
+
+
+ + +
+ +
+
+
S
+
C
+ +
0
+
+
+
+ +
1
+
+
+
+ +
2
+
+
+
+ + +
3
+
+
+
+
+ +
+
Laser
+
+
+
Set
+
+
Curve
+
+
Simu
+
+
+
+
+
+ + +
+
+ + + + + +
+
+ +
+
+ + +
+ + +
+ +
+
+ +
+
+
+ + + + + + + + +
+ +
+ +
+
+
kPPS
+
Points
+
+
+
+
+
+
+
Offset X
+
Offset Y
+
+
+
+
+
+
+
Scale X
+
Scale Y
+
+
+
+
+
Angle
+
Intens.
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + +
+ +
+
+
+
kPPS
+
Points
+
+
+
+
+
+
+
Offset X
+
Offset Y
+
+
+
+
+
+
+
Scale X
+
Scale Y
+
+
+
+
+
Angle
+
Intens.
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + +
+ +
+
+
+
kPPS
+
Points
+
+
+
+
+
+
+
Offset X
+
Offset Y
+
+
+
+
+
+
+
Scale X
+
Scale Y
+
+
+
+
+
Angle
+
Intens.
+
+
+ + +
+ +
+
+ +
+
+
+ + + + + + + + +
+ +
+
+
+
kPPS
+
Points
+
+
+
+
+
+
+
Offset X
+
Offset Y
+
+
+
+
+
+
+
Scale X
+
Scale Y
+
+
+
+
+
Angle
+
Intens.
+
+
+
+ + +
+ + + +
+
With AI +
+
+
+
+
+
+
Velocity
+
Express.
+
+
+
+
+
+
+
Sens.
+
Beauty
+
+
+
+
+
+
+
CC 1
+
CC 2
+
+
+ + + +
+
LISSA +
+
+ +
+
+
+
+
Select X
+
Select Y
+
+
+
+
+
+
+
FOV
+
Dist
+
+
+
+
+
+
+
Offset X
+
Offset Y
+
+
+ + +
+
+
3D ROT
+
+
+
+
+
+
+
+
+
+
+
X
+
Y
+
Z
+
+ + +
+ + +
+
+ +
+
+
+ + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + diff --git a/webui/knobs/Prophetic10.png b/webui/knobs/Prophetic10.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3c8972d00fbf323d54b20b38f17c9949ad3842 GIT binary patch literal 11360 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 literal 0 HcmV?d00001 diff --git a/webui/knobs/Prophetic5.png b/webui/knobs/Prophetic5.png new file mode 100644 index 0000000000000000000000000000000000000000..900d880c52b44801fc88df9b6c642befda4bf315 GIT binary patch literal 8003 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 Hmf`;a=)aA$ literal 0 HcmV?d00001 diff --git a/webui/knobs/bigbluetoggle.png b/webui/knobs/bigbluetoggle.png new file mode 100644 index 0000000000000000000000000000000000000000..e9131a63b7181d0489af637d5083cba368aa438f GIT binary patch literal 16102 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 literal 0 HcmV?d00001 diff --git a/webui/knobs/blackout.png b/webui/knobs/blackout.png new file mode 100644 index 0000000000000000000000000000000000000000..9c66b38c701dc1349ff0f294b6d065654420ac44 GIT binary patch literal 4555 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 literal 0 HcmV?d00001 diff --git a/webui/knobs/grid.png b/webui/knobs/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..da415a28bf41549def8d3c09e34681f518c25245 GIT binary patch literal 1720 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 literal 0 HcmV?d00001 diff --git a/webui/knobs/lasergrid1.png b/webui/knobs/lasergrid1.png new file mode 100644 index 0000000000000000000000000000000000000000..288d464919fe6524cf33c5f96dd4278fd1411ac1 GIT binary patch literal 3056 zcmbVO3sjRw77p@KQR}uUwepBzi&cRTLIMd1X$WZ123$a)P)$P!8XynzAPEGJRTt}v zb}dLnl0|t)MWKLXfk;BP7%>rKu^=EA4-zWj5ye1AA@t|v_TlO7+5g=0&&-{BzkBD- zojddSzL4E(SHHI!1OlxM{wOdEXhk591$m_n(5u?o8VWR-x;J&D0V z3$Ty{Tr|+1XG0<21rcr{7P9D66mcJzz+_Xw2oJbB#S;btBat33Zv+wva|3&M!n~lK z03qFB-e?38?d1br`XGQcc3eCzs9!&OOC=7){&0~0Z zxdRgJ93g{C7PvDwF3SjkR1SqrV{vIr26!Hk9LwZ!u@J!1#U;>LMB-~;24^WyK**p1 zG7Adx@PyLo^XpoW=5WKP|8e7u(wqn(iwX^+a+o|e1=x>xmt|!jc7JSWUJ&pG9m=Kw zn?g4*Gtl|;_(i%bvw$3&@4ilcVDS3*P#M6PVFQO_{CwF45NM@S za3DTH&@TFwUKxj#b;++!!&Wj6L1^;9HpV`^&ej*ECU@hqig| z3>If4!VIPwHd2g@TQZ?(DheaX-0<**W#g+fU#&x^s=ob9?9EAx%r6ZakI*x?N7X^W z0~t@LtI&mY{EPMe+R3X%>;yrn%FHgEQQ_(;(|4)z$77+aDH%^NHKN&bT4xNviqY7ri1^ZMuf{RrU@co}A_{dv?9-Uq4ux zd$cHC%uf`LGu^f#lV6E2zSF|olGkCUoBO+|^zE`0dU%Ka_$L4L6Qr7sw;Id4 zzrr;D{+Px`qW}n!S_eRUpR_C5);K|F^nQkniFFD920U1zoi4*^!tpZi7-{{)&F@S~ zihrI-nU{F4X(IE~lXuzqqWG5EALu}B%+$uB%5>$*?9oea>m$!rb`_BP(^d?;IzA-X z>0A|o?uN->>}}tn6%*H~L-w8HA&wa0wF7$l5;O1qo-}Ws-n%fmNuF!k_CjhHc-Y=? zBEc#nQT_f&Lw3okI)$VDBwsWvv5MN^oFKy00w}4EN;h=!&EAEV6r}EvQ?~}a3r{O{ z*Ey7QoY=8KF00Fu0-R{Y;rRH@qNhp;ig@ixs?jfenw=N&&NpjhHQV`@_MOxyH+BLu z0s20772maV)&5nDx2e-T&%6tFG-Y&DVVsLoc8E=iiIRp%alL8wFF1O7MYZ;lQnf{@6H2HD8 z<)IXZsTCg=YpQ{Pb^qk)UQ>km)RA)!{_F(L%}#IG-Bj)uC+y$brmX9`urB>sod5pk zd0O2}`@7f0$-SlW8}+5rbH_q|Y|C+0+NRkU9qo+p3gT>bc}=k7it@$DnqpxT$Ui7` z*lsjTbK#TzqcLZ763JSTmue_~^wSeK{ziQZ9a$Exkv@ICNzj$Q;e*WOV(SB|)o$^mO zCs@DiFjfR&@QoTH<(2az;t4Q`7jNVl5qy5rCC3$B8sWIe` zXu4bFKLx7U8iPTVJE)`Fv^qq>xtBMfZwxEUQv>|Au)YT#(jY0 zj>D*lDAS!wO`#4)yRY?iVWz~|&Xnj$b^TVY>EVm|HD)8wAoHbp~6 zXl&~#VXAuS-zN(6(mdYuNV|wBulw54@8q`P7GLeCy~19efvhevq-4npBL#+b*MswS z)$7aY7m4x492ownBN>0}Orm9!`odfyNZy_Ha0wwaq@mrRQ+%l@qj{<_KGCMlUeVWP zoEvN-^+v;u%<#E)Ku({{J`6ereQrqEJxFGZNQ4kS`mfXX*SF>yyt177pDx_1lQ;_- Zkk;?Lgd$P@@%cA+a8O9#&4ADT`ZM;TZBhUL literal 0 HcmV?d00001 diff --git a/webui/knobs/lasergrid2.png b/webui/knobs/lasergrid2.png new file mode 100644 index 0000000000000000000000000000000000000000..dea8ab1f7fde2b08dfa8dc6bafc002f7534ca97f GIT binary patch literal 6966 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 G>;DUdXS&e< literal 0 HcmV?d00001 diff --git a/webui/knobs/lasergrid3.png b/webui/knobs/lasergrid3.png new file mode 100644 index 0000000000000000000000000000000000000000..12ada9c0e1a2138100ee3f745221f8f6c381a8c7 GIT binary patch literal 7416 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 mIlEvOiT^t(#|v&}n5fN zV<#krHbF{bH5cL-BZyl9#8F})O9(+4Q530tsMHr;K$Va{ed$9lqEf1cDpKu8eJE8) zLrACqV>KkTf;Va;VjR-N#tHU%XS`SM%$aj$`~SwXzO0>HQ}KYRj`ZoAxqb7U^Zn0n zzhlc%+2Ql~7EG4qWw!KQ=_nS9l3MNnM-=T(@X}*wx8mG^-Gu!eFTCM6j!rMqv(&op zl||5tmw%1ckJdtK!yNC6G8zVZiF1Aq&Ri$ds$~vNDT-1+n_1#Scuo|UhL?V^e*Jo7 zW@hFsazKad4WS7y{l;^ULtC;u&gaOeU%HmfW`B0%$dOi>Cpt=z{0OE|1bAr9@AsR# zckkZPjDzk^O-+4y?b@}QLI_U7LmP_4VlUXX{d1Z#*A-rVoWd_zdwctqjT<*^rtrzo zzjw!u9rw}DaG%jLnM`I6UX8esc=JII%z1Ob8yXs#Ez4S#`o_k_O=!j_5_$$vY{YpG zmM*2(@ov&2I;Lq#7}hc;7{Y=yyyvabbjaR~n@eAqo}T`a94$4>%jD8$0)fDEsb7kO zg!BTXksObYkKcqAijhd9g>E7ncW&Rl{aHy;^bCdB9W$;ru2 zac#7GRgma#*e|~L;yIj~3&X)nNm3$OKP*6PDJt*F?$_xW?rFPr?fU(R6DJG`a={5j zLsG73I`wIaUBi{CE1rRKzGSQ1F|Qi;F8IwNi4u}6v46u zSc;_VpiiVdTXEnc%g$x#YdF;M3m8r#njd0l9cVXr44Hskf&Cd1oRU__yL43Qa!=05 zmwWK?OEh-0IxK^JX%PhoR_ZuxN8aNvNr`Z77tBI-n_C6Eknt1*Mke#fU`#p>KD#4T2s zuu_)6a)x0Xsy%jKG&2yNUOFc~fXz_^K4i681e@q(t6J@eQw*52*T3FR70{PjNz8!7%b?j@rS0Z};Q=jO((Ic_&lzqxh zh#b!eMc4HvPfO`iikoQ?l^P{aLlE`;_U}Zal2A>FE2cz!yH?w$HK~5BUM0HC6$%B} z6XU{gD2*0PBFzC^$YX8UlH%PIB?yo*iyi?B$ z>|t&QOXMBbV>le1D;FCH=|P?s>f9}pHJ+atxP4fX#*O?g_n{mg(cVp-$;DZor-Vb? z*}Qpkasf)7lfNLmF46&|k+Kj@*e63#)$fy~qMZ~bIVi*#v$I?Se*>?+`f98MCD+Me zvER5DxO$p|L^_}}a$V%rh)RkrI;JCRT{z@`Gah;Bsi$uC^z`IQP+CwdNf}C%lgZ?h zqywZ;r!3GUdKlG6_Hgi7e}6wgdlt*ZStffrAmzcv=O6pz%9Sez6Ny9iSy>S`$P$X)U1IRKR8 zJ8~c}rA2BDITQqx6jo%+;hBsgOf&3o{`C00n|xa)CYM7A4m>EychpE^BGA&3tl75B z^fxy0jwBbTYT^H6Vg4UzQ`?~Mn+VQ=6>fN8W_wS@SKah?v zdwS}WNF;J1pQ`|+bv1b!f!O)j!DQyeasLu-NVKHl1PCj25N+O?E&0Dt^CUM}(qrK9{ zGg%i(wv`=8estjs`*%DqQmM*NA{|f~DGT;Y;-ngl`tiG36nfGm2ki4W2a04Ba6IoUyw@X>Y+Af)ZUQkq(f?s!-~3B&c6BPn^)lA3#ydhU=d2IZJ53?l>VDasT@k* zuu7@xsK=CZ@|r58y-!#RmC~iNOQCemgOU$WQUE0lP*MOT8BlTnB^yw303`t^jQ~o! z%b|46gAyF58lV&cl)`{g5K!^~N;aT`-%zUnC|MqqY5}FpYEVK1gzO+0NIH+1F1)^8)UMYDFUXii;3Sje88_|qlkp46zGX^YWuzfQv5$346H$5=! zn;b3MzQKVDC2|l6s}n8v1d`jnU1K(H^gF8J2z$fa(KN>(~EzkQR!t8CxG>r|a0AO~&t zZ|{gU?sR|Nbp3kg<44EXbRu*rF(Y!he1+{>4YqGI1d1RUZIcw0NvL}y>PPCFeNEW9 z)YnznzR@Jo9L!(J!L-s}2RucuVf$9V_H8yLtXx`->BgAE#jI=8$F*StTf2OOz313bASS}m^6e* z4&vjCWpj7gzCp?clz5tiL^_}}>W0WeGcJ@&Y~OJ1kONj}`)28ThoD3kN~8m%u_~0X z=A0F42U1>hr3456)7!V=I}a@~rKd8Kob#QPw{LJz9ZJ2GpwzPjN*bV411JRmB^glS zfKnb%Vt|qWluiIjZl<}Z604N<>4N8cB z9CWug@Z*oP_BE`V|C>_Av}0#KPV^66&!lc}Kq>D*X<%&S_AML&ln?j`|0_ z=RzrU`) z&4HVChr#CmrbPX!1WUU{{d9p18(BcftOlh5pfqJNOyWQ_RDP*&`SJl{^!l29)yEpadOI8Yv5jw0$yK>p>|4D8T`YW#{Pljq^|jL zOTN6eKXhAr7yr;LU0U)NKhMD{vJX&_0VNGkl07ID0VNJ72|&pKl*R$2E#*+U>_G_* zA}XL10F-I~CBL6o!F3KOS%8uSC@~L82LPq`YEVK17GhNd=S;!LxACwtag?FmlFCpi!Kh#Bpi)u+C3P)O@_Cg~4waIomHv%VlJ^>*u2kQ1}LL2c4!FF&DIfZfVM>icn+ZD0RVh1XCpJLnYI?p z9^)o#``1U<-_7GM2|!-a-^1446^(`1p&gyw6*zWU+BqQ3CdT(GVR9REzp zOj{44it$22B!$I=?4hEf5Gg5PQ3**YDN#X)7*teD1bWk?ghVA^l2R}+X~@4Wj+3ETYG2szXtw)Ahfk%NOy0nt-C!MiBRCU;ShFqM!{6oMI~g# z#Sp4evdW^OYBI{=Qfe|XlFF*8>MD||lH&iyA~5zoZfJMxzp<$Q#j5>R>|ZgsdE7)s zpuL=Z(I|B#0z*bEN9aZLowKCap>OkA^1*q+L2b!fJ*(iEgwO{84ABnNs~%o-Z1Lv`wRUIx0Ove9yXxKUi+JI zw8r^6XIN}2oE&PM9O{qzn6|zNvL2R@WEIL_er!S&a}}1IRav&UadP!*M{d2fYSqwF zUEOVLm6*6t3a_j5Ss2uX6N3A(Mc5U3J~mt@rwi{|-~(quVsRvP>96rtNFv*vS)yqY zBZnC;6^~e6#Dr&bgjAM3@cI+&_^mzgJkcP@S$AYADCD`7|8jsWAN{AO+8M1%iDi}$ z-dxv%w6mv|zWqm6V?C{)&JpSoE@TRt@g3<^scIjS5tw%MQC3MDUWxDqs^ndfH3^Z9%0>uX^x3D0z5Hb1mKT^tw4N=(USyWr9Nf=D7qLrW&j7^4G;${ zu+v9{8QAsJj3!gREiZ*}rZ)M5u;;lrB@`YANFJP84v5m@NToC9$%eeZ6N`iJeyOE- z%(={;NT9s?#EazBq-yiNJuOCL`A4IY(hoHrC9vM7*ZJM9T9BKn^ppti^>s`KQ>d`1bG_0RZ_T+5GXWoSNO~+tC);?xWCMV}>o_2ojroSZNKZ*G>f4?He#ve0#9D?4BW+U9{qZvSBa`x`WtZi>2E+5KzX-^dgqU^a+<4EHWga~ z7z|O-E%cn*l@8hF=9fJ=^mZ&H>kNI)#ZAjC`K8P~y~?)iIcd zl_-&=2-kT0ys!hjeluh3BTD9^rk}T3i;KBOGut%=?c%i9k?EQ{5=-Yz1 zbo*Y1y=SqZU><6mgZ+|Hx`*3+eTS0fX#)E>$cfUUhn;xndT+{cK?Y}@M6gxAJPB*B z5{X|Il$#QJ^M`p3;|qurW29HA*(=_dx2!DLZedRppz;9$HW%fA|l ziWNo>`qB`xA2yKoF+lgp$Dv4?0$Rw|0i*Ew(np`UHjQIc@2jwrcDNd_r-A&XPWRBwPW@X2$oI&KCymdGPV<`i1$_MLN|pOdV{RF)vv~8*Mu=V#!Byf%!p->{ zUWw|0^ z!dPKyZwJ;okKz^8s5vn zY2IwY3+`G6|DdyFCNhLl5m=3%X z6w9mboRuq#x!Q)b*%v;sh1sU+1rp)gR^_=Q{Og$czfPThPETYSX7>&r2hQrNtX+^1 zH@%nN{m@SMY&!Y-oiBRlaC|&&ns1L!gA@m9B|f4(eaq{wWHslAL#DSCvR@ru6A?=@ z8Jm9+x3D5?=Nt<7>fRVP1kyP*nARdpU5LW@5!Q$ zOgTl~J~FMc;&E@!=xT%8bVOeP&vZoN8#nz0pGLM1!w=FrpPA4LQw*I&&YsmjG8+e} zOL3-LT8gJ4IB*VpGdd9RCseq*f^hu`9QAAs(We5f4&zeuxfa_wxnTWNgqrw=xV0&V zxyM_4heAX4in}?xZ^NL12?Q=`XT4taPogt>7Ej<>K%+zP>+^%Dyg%zZltc8~&E#P{ zKZs>ztkm9n3JIjd<#+;k?y{PPj{@b$>1H6elQIp8syp%8q9Q+B{7~OSujQnQrlasG znP;*AP`J3JiK+12+JdYn$s#@W<6$It!s2vaZ%1j)gi0E=3p7Yc*;y!+GY6ozxBX}n zW>2d17^|4`2SF?32wT95Jo56KtTRyqa~xcg|H1O zP<{_SPjA96_K!l5d$^3#?z% z;;abJqsr79%s5yy6>f9!Wqu|J58;ScQ8J}bZxYl6dj@jYJHfw}#v)wY42{2o>vfJcD}A1Ib}m>Zy2_^6g(aU{|x|?Hf%8HhDMP5;Ym6%gU)p|Q7jpuSW==xz-U-xbic-mRDjGFmeu;%31 zZE@icVoeF}jrE_oG#A!C4?Ug@eY)heOz=*Z%A_CfF8)W2`5!dsH+OO})p-eqhKbXs zB3|I%_FuhF<@N0$mX@S|Hi3|Y!-}2^PhVP1x4Dm%@8kwA{UTx#v4)HI1Mz=+w~2~2 zb9aXFf)7EE{ApWwL^x)cyNEa`yjdMzq0~$Lu}1(!4dEMNC1tU&Lh^~S*?Nz}1ojQW54R zARCaVsl;b0x+zk;l=Ti`vrQlfup-5M@vh)UE?%c+1?Z8yL(HT6>+SKnmFo{dCx^B? zPkAZ-%w6%4i{In2ARKOZQ=V+u{nQ=PZSR4{5Bp=bJcySbx^?}bnyM9isllQFMkA!m zFeHbDAcZtANSk-xgZH_N`>`29*|_X?A2EGIjj;ty-9<2=YHHhtG+(~0i5 zgwHmR6t2FXUi%ZsN5F<#$Y=c+LhB<`MvCzM#9VV}608ctNh8~gc*OmFsR`7>2s&(z zB<(J8{m;@c+Dl01+m}i3ClO%V*oOqQvD-jrOb>tS@zUqnu3fAOZ0_RREN>cFB&q-p znZtTv*HOf;JGSa4T70Wo)(+*q^q*|m1w?G9>i}vEIwVR{D$~CUzvRWEZ85t;7o5ts ztI{OgK3;u%hXPbl7&NyVM;rvw9OtCsV-XDN=@dFm;cyB_TVA`t*^)2(Vedg%DKop+*9&pbLwzpJnNNI?}x(oj>8 z&#xHlLA$46H1alt*5hBC3ViSL8NVi18>vBgc=}d`6!Zmzc-x*uJTS&nqWvuyG+c*I zZha5u@sy%2s(9UqTq7~OK_TCSU+qiDZQePq2;s(0WBMLIcRY|@prG0-N?Wd`gR;sp zF}i(qagOkVC$vL7$^|jrgrXaehfXx4J&Tsr>r{v+nbn zuA4F;uM<5P2#Xph-xd(a_ckUhF(x};{jM)X^QE6gElrdI=&O?csk*y0#eVSk~&fH0teG#hTl^^Pp-5TTNKFGs)mUsk!sIaD5XqvQD&VS_PQ`{4`qqL$1vRs2R}Gpj}(0+(v&89!rCI z$uNZ<^XAnCDD|!iacTIs4E*Sfkw^VuAPN0gk&2DjVa2(|*jOO%#~#GDJ0*#&!{67s zhyVOud02NuZB1}>V$rv*gtC>rs+@MOq{s`$-PXX2@As14r9U_ATrcOrwQ(Fiq&

w}20<>2p1YR-(CUDAQ2P_Id2UCo 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 C9`Yvu literal 0 HcmV?d00001 diff --git a/webui/knobs/mouse.png b/webui/knobs/mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..5000744bad54f8d0fc892654490a67a3c746047e GIT binary patch literal 4866 zcmV+d6aDOoP)$8Re3(=_MLvs3^TK{ zvu}1`Sy&!YJQaLISwND-fW}}dX!$D3!Uv*;B2ckXRz;~;V)@n-Q4?dO5)%TJ5)_R> z6)NSHiXtm4?2}zsc3}r*w`ZoG_nv(Jz5nU^&!xL(`ZYaU+qdekzCCmAIp_b*|2*eE zGy3M6Z&oMr<){<<>I2XRpbtPFfIa|y08Ze`?M9=|OqUt~p5}Ya-|5q5qN@n<>b$Sl z4JFNz1fUMnD?rzPwt&v$?}Gw>0lu#=0Q56zXcDvw^b64cfcElpM)m_RdJjMy#wS3x zg8rHrPBOCzW>U}7>`Kttpld;&1>Fz23AD3T-|Yb5c7geKf+)cl1ErX8>SsUbInYti zG0^Fti}{_$K-)pXpb^j-&_)5&pMjnNeGPPDy>YYxgxf*pX|R9KgFT6L{SfHuJcD~< z&tC!hDc^q{^zGR1*K%7Q1HFQO_F>R#K$kIyz3~EdX8vzLuLX^RvY=Z)=YsyJ2J>`X zAnrHU`2Dk>Z*d!c37Qq}J zoqJd<9^>!lfbMO=`*bx9AYHzk86!*n7oY4gl%id93>fdXUFFDWb-8 zy#OG|!AhoyprqbR*Heu~*M4z7)(ZfJn8rAPX|_MV&d(Pbot9bvt)sbsVE|m|isreV z=Yf;-yph9Na&3PaivSmLB^r3AMau@$tO5(2fy0~^T+8+&?lyl8+Ht(B2 zkJr)Zw;yjyVp=R{EcAMbWBD7z&nS!BK*3xS?Ua|&iqIH?xnTjIy6nQFt{)Ov;X=UN z%~9Zz0pPk;!ccL2gGn84DsbFioss~u+~4EnEWHThp5(0Z!leShL!6o}=H+z)0B4Cw zQZv`UQnCU1c(nojy}>>JeE|9Z^a1Dt&biH4-QK-=5C3ls6&`SVl zo9o*`EN@)|<_YMF`2H>xE1&H}BuKTq1-}0W)q$nz1{ZC;eMx-3eJO;(R2FwzOeDv< zz&tIz->1SIX}bOq^ypH_1!z|8=6foep#r8=9b}#gFn*)LU1hqcj-VqOF`Z0?XoGYc z->(PlQ&CZ5JJ+jKScG*Rf8PUo(^Aa_spQ30eWqAssR;6v7TTifum4bCVYDrRdYo-c zZm9x5VdS(wJ3thjE#qg?9q=*^kAwOcMfnQw_X;CzPj4ky3c?xEdKNRZo(D#= zo~LIpiyBg3+5{jQwCnq4g+FyX?srz$ANyQ}@9innSs}q*GZK&jL!-{j%qMiQxP`6u z3XaN#xRb~@X}u>HfHCpkwd-C7xV;Pj*c3vacuw@;@+_akNf@n9uE4l&(fRx}42au| z1Vpo|brPLkr%R=G0`-qU?{>3fIPAJyZqyjZIjDVKY0n!su6syGNQ$H&<}P&|pKhcJ zWhO1TFj#AX2VM6iG0qhKei_pcnEw#Qy;W=dWfQ5aZpI5#-HOR%ZUmCwg7Ntx0J#mF zKOro;uBwLCyTdoVH7a~2%@JNo*px)fz{Uaah36>qvsTv~z|OK43$*|++&Jk^5ey$tnasxl!WTfFQR(#GLK0?$yDJ5j*m1&@8Q&k} zK`m3!Swib72O5Z@wAdvkU#P$UsU(1YilxuGS=SnCF#lmpz~x~6hhYAn#rVpq&RL{- zZqOQ(QP%sFu)doCz-NPzrqdq;2)|($nOUMs*?Ev6PA+mvm1u&2B%&%dqy%MhL9N2~RV0;Xe5`AiX52ZkB zBg8Z8+i|8~SDr;bJHQm#lpJD=eazGx>Cv;ZTbcRqgZXbTI8&TC<{3zDAvVAoCkq12 zggp>N>Tp!0QtyKwUN7{}#skA_g;!%Rr#gkg6%faTtpk`jsu@O?o;L#EHUPlakk$87 zsR!`6n`d!WxHu0#|AW!`Q?OU}i=Q83Rk2d!2sJRZRKO8pDJdl^vE7d=b4L!V$~b3t z8z3ET#-J~Hxw0Wn(7FWjFjx;BgWTFM`}G;j_6!D-P$7}Nzw8_mCg5=}Nrvrd6`nVk zWM++Uxz>o5gc{kLp)BG7U(FH6D7Lq8eI{nPO{@_mj2(&m2I%1pU}~*kdIloA9RuHm zS;}$zuqx=cQW=9f1)cCw&xYN9|@YPRL<5jGdBieuC+9r zR?O`rW|%wyMuDFzN|)=t%=bq@#gGU!4ZmnbPcb+n%n&jE0St6ab+(ephoQ3%vmO?? zoe6Gt6e2zp1^s@O@5tu75Rl^(@%|2K198YjFo16e#_0Rw1hhXi^cCSQJt2{4CMm5p zXD~tnyjl`K-!l;7%ORo{VCMFiMB)f$??u)pnG_KNbZUGJjL^HP%xj&;41Es_JjqMu zQ~dmJzyN|7xT}ltd=&u9^m@$ha=iBwy!R5nXP3T40Ok~=WG~*kE|3NoRNTK8&wo|e zqG_JQFn2L#7;UZu(5nN09cLSi^g}`|w3GlXLSPp!z6A|j1tT=q+&a#^{@~#4{4BZ1 zRhXSEcy2Q@U&5g7#&g?w9q=Fnmu3(qoP7S(l6heWv-CT(|0_0Nhgf7Y0T@~r(e`&S z`|k+CZO=OyQgJmT`}VLn`)nutVD>z3UDfcVQaizz4~aW1_#L^; zN@W!!?j2RD@*LpwNe;UU28GO?HV`y`S zFo@NtFb+UyEF9+r42}*p{(%@~pHUQfci{HG{40a#j2cKJ4nRzQ#|xhOc?OTE=Yib2pk1C4}-20 z-pm)S{3zd7WK`(Jmb5F}p%O3Kgva{RY&A!>q91tgfk%195A)0&W6+W!U0p~ijVsi!=)XrL9t?aZY+}RBDdrFfbCgur9pZ7v_YOVNw%FhoLAh%De)kom|e3saJgE*37fRWM|3nijs`( zC|Agda5k%=Kgw1XnQBqQ38q$`&2EiF3#JsZS~1qTBBCxYhPI5x7E;bu5fbFrNYdo8 zyNWG_CRCF(gKi4|=vdMu@2k)8imnAXFhq#=Cp8-=7_TuHvXLM!@VsRrd_E%5VPCYR zV@us}d(vpNsiOeM4yDnutFfcZKw3pd?89|A`2Ju$&+{m*7=k~)AQosHftx!b;`x(= zJF_cHcC|NAXJWd(GZc2Dwd^d(asD(L&yoyIq1FQkcYlolW(`8uGdOYDi(uwy zetsDw0kYJ6SDz&F#(7hP&b%iaz|k#mlFn0SK|k*Ll7K?)&`1V_Dh@< zhTG)EjMNBP+(7)bp1}JKo=x@|fT{!_ES=D~+#6b6{4W+a6SX-O-R>;5Qx9<5Uad;N z+@Jy?9jqIKv4LFDUT96hLiYQk-Ds`Lf$Ox9Xd5*G?WjPNK|?FJ>GW=1&U%J(f>Hy? zspZ$>6u$=82(AqlUW>&|Fr+;Lz{HlBH7`<x0cMi5WIDByP0yO~q6X@QfrNn&&Im-ECYq z&p=sS3}y#Rd9lKYMmnElDI$rY{lN8Le6ucn#zO0Y7vD!OT{%@ipxO(4otXPCow@ zt5Swej=3&Xu^nar^6Un?3V=0)Bx*TEe+W`=AH2ZH%JWVoRd8l!ulKXr{{jfnfv0fA z*cLDaWi(*i7eS7l^$aslI!|S|>(J&#YLne9S^h&NlcB#?@GOtvSS#Y+Dgagr$P>KC zvy}nE|KiNd+{9H|S=_(dq|^V$2P?){3SLxE4S}@SR^RQ++of+RoIDRwwH0k9+3)Aj z*T1Uhzt`C^-f}Ad)H*S;(6H1VRk79Lr+`ia;~xzCbk&I^4*IFoPx1LQi)v0vK@5OQ z)!q62S}=a4mS+yMp7I9=@5Cn=-o0vW$$ZoL-wpsWIoIfZ&VAZB z3~6`*USlV~cwWt|BMbrX{pEOX6X>jvBqgB+yT z|M{~H9^qoRtZPNgE_w|PPfS;fBuKpJxf+KgDAa|G`4PaQ(%olx)(^)-zvcgJ(C*Pz zU${kI7)UxOL4ndA$!!J4Ucx$Io4#aKSlicNYV=XOzYWa)oEav4Kg1$`RET{$|Jb4Z zzaT+=9oD?8<{r1pvt^!yi+mpR3q|LD=)?zAi&KGh2tahGfsz{NI32)L0|SpkRrc~M oA7Ppl0Z&jq!+p0k{{I(X0CV(YrPbaAy8r+H07*qoM6N<$f(}$AVgLXD literal 0 HcmV?d00001 diff --git a/webui/knobs/simplegray.png b/webui/knobs/simplegray.png new file mode 100755 index 0000000000000000000000000000000000000000..9c570101b11cdf1aee6288a331150a522a89c5c3 GIT binary patch literal 227718 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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 F{{zC!p|t=2 literal 0 HcmV?d00001 diff --git a/webui/knobs/swapy.png b/webui/knobs/swapy.png new file mode 100644 index 0000000000000000000000000000000000000000..71620cb75e483d0fa8dd0d7dbdb870227cef5c1f GIT binary patch literal 17299 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 wUN2y#FXyS>- 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 Hu0mjfKr*L? literal 0 HcmV?d00001 diff --git a/webui/webaudio-controls.js b/webui/webaudio-controls.js new file mode 100755 index 0000000..d9fdb43 --- /dev/null +++ b/webui/webaudio-controls.js @@ -0,0 +1,1875 @@ +/* * + * + * WebAudio-Controls is based on + * webaudio-knob by Eiji Kitamura http://google.com/+agektmr + * webaudio-slider by RYoya Kawai https://plus.google.com/108242669191458983485/posts + * webaudio-switch by Keisuke Ai http://d.hatena.ne.jp/aike/ + * Integrated and enhanced by g200kg http://www.g200kg.com/ + * + * Copyright 2013 Eiji Kitamura / Ryoya KAWAI / Keisuke Ai / g200kg(Tatsuya Shinyagaito) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * */ +if(window.customElements){ + let styles=document.createElement("style"); + styles.innerHTML= +`#webaudioctrl-context-menu { + display: none; + position: absolute; + z-index: 10; + padding: 0; + width: 100px; + color:#eee; + background-color: #268; + border: solid 1px #888; + box-shadow: 1px 1px 2px #888; + font-family: sans-serif; + font-size: 11px; + line-height:1.7em; + text-align:center; + cursor:pointer; + color:#fff; + list-style: none; +} +#webaudioctrl-context-menu.active { + display: block; +} +.webaudioctrl-context-menu__item { + display: block; + margin: 0; + padding: 0; + color: #000; + background-color:#eee; + text-decoration: none; +} +.webaudioctrl-context-menu__title{ + font-weight:bold; +} +.webaudioctrl-context-menu__item:last-child { + margin-bottom: 0; +} +.webaudioctrl-context-menu__item:hover { + background-color: #b8b8b8; +} +`; + document.head.appendChild(styles); + let midimenu=document.createElement("ul"); + midimenu.id="webaudioctrl-context-menu"; + midimenu.innerHTML= +`
  • MIDI Learn
  • +
  • Learn
  • +
  • Clear
  • +
  • Close
  • +`; + let opt={ + useMidi:0, + midilearn:0, + mididump:0, + outline:0, + knobSrc:null, + knobSprites:0, + knobWidth:0, + knobHeight:0, + knobDiameter:64, + knobColors:"#e00;#000;#000", + sliderSrc:null, + sliderKnobsrc:null, + sliderWidth:0, + sliderHeight:0, + sliderKnobwidth:0, + sliderKnobheight:0, + sliderDitchlength:0, + sliderColors:"#e00;#000;#fcc", + switchWidth:0, + switchHeight:0, + switchDiameter:24, + switchColors:"#e00;#000;#fcc", + paramWidth:32, + paramHeight:16, + paramColors:"#fff;#000", + xypadColors:"#e00;#000;#fcc", + }; + if(window.WebAudioControlsOptions) + Object.assign(opt,window.WebAudioControlsOptions); + class WebAudioControlsWidget extends HTMLElement{ + constructor(){ + super(); + this.addEventListener("keydown",this.keydown); + this.addEventListener("mousedown",this.pointerdown,{passive:false}); + this.addEventListener("touchstart",this.pointerdown,{passive:false}); + this.addEventListener("wheel",this.wheel); + this.addEventListener("mouseover",this.pointerover); + this.addEventListener("mouseout",this.pointerout); + this.addEventListener("contextmenu",this.contextMenu); + this.hover=this.drag=0; + document.body.appendChild(midimenu); + this.basestyle=` +.webaudioctrl-tooltip{ + display:inline-block; + position:absolute; + margin:0 -1000px; + z-index: 999; + background:#eee; + color:#000; + border:1px solid #666; + border-radius:4px; + padding:5px 10px; + text-align:center; + left:0; top:0; + font-size:11px; + opacity:0; + visibility:hidden; +} +.webaudioctrl-tooltip:before{ + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -8px; + border: 8px solid transparent; + border-top: 8px solid #666; +} +.webaudioctrl-tooltip:after{ + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -6px; + border: 6px solid transparent; + border-top: 6px solid #eee; +} +`; + } + sendEvent(ev){ + let event; + event=document.createEvent("HTMLEvents"); + event.initEvent(ev,false,true); + this.dispatchEvent(event); + } + getAttr(n,def){ + let v=this.getAttribute(n); + if(v==""||v==null) return def; + switch(typeof(def)){ + case "number": + if(v=="true") return 1; + v=+v; + if(isNaN(v)) return 0; + return v; + } + return v; + } + showtip(d){ + function valstr(x,c,type){ + switch(type){ + case "x": return (x|0).toString(16); + case "X": return (x|0).toString(16).toUpperCase(); + case "d": return (x|0).toString(); + case "f": return x.toFixed(c); + case "s": return x.toString(); + } + return ""; + } + function numformat(s,x){ + if(typeof(x)=="undefined") + return; + let i=s.indexOf("%"); + let c=[0,0],type=0,m=0,r="",j=i+1; + for(;j=0){ + type=s[j]; + break; + } + if(s[j]==".") + m=1; + else + c[m]=c[m]*10+parseInt(s[j]); + } + if(typeof(x)=="number") + r=valstr(x,c[1],type); + else + r=valstr(x.x,c[1],type)+","+valstr(x.y,c[1],type); + if(c[0]>0) + r=(" "+r).slice(-c[0]); + r=s.replace(/%.*[xXdfs]/,r); + return r; + } + let s=this.tooltip; + if(this.drag||this.hover){ + if(this.valuetip){ + if(s==null) + s=`%.${this.digits}f`; + else if(s.indexOf("%")<0) + s+=` : %.${this.digits}f`; + } + if(s){ + this.ttframe.innerHTML=numformat(s,this.convValue); + this.ttframe.style.display="inline-block"; + this.ttframe.style.width="auto"; + this.ttframe.style.height="auto"; + this.ttframe.style.transition="opacity 0.5s "+d+"s,visibility 0.5s "+d+"s"; + this.ttframe.style.opacity=0.9; + this.ttframe.style.visibility="visible"; + let rc=this.getBoundingClientRect(),rc2=this.ttframe.getBoundingClientRect(),rc3=document.documentElement.getBoundingClientRect(); + this.ttframe.style.left=((rc.width-rc2.width)*0.5+1000)+"px"; + this.ttframe.style.top=(-rc2.height-8)+"px"; + return; + } + } + this.ttframe.style.transition="opacity 0.1s "+d+"s,visibility 0.1s "+d+"s"; + this.ttframe.style.opacity=0; + this.ttframe.style.visibility="hidden"; + } + pointerover(e) { + this.hover=1; + this.showtip(0.6); + } + pointerout(e) { + this.hover=0; + this.showtip(0); + } + contextMenu(e){ + if(window.webAudioControlsMidiManager && this.midilearn) + webAudioControlsMidiManager.contextMenuOpen(e,this); + e.preventDefault(); + e.stopPropagation(); + } + setMidiController(channel, cc) { + if (this.listeningToThisMidiController(channel, cc)) return; + this.midiController={ 'channel': channel, 'cc': cc}; + console.log("Added mapping for channel=" + channel + " cc=" + cc + " tooltip=" + this.tooltip); + } + listeningToThisMidiController(channel, cc) { + const c = this.midiController; + if((c.channel === channel || c.channel < 0) && c.cc === cc) + return true; + return false; + } + processMidiEvent(event){ + const channel = event.data[0] & 0xf; + const controlNumber = event.data[1]; + if(this.midiMode == 'learn') { + this.setMidiController(channel, controlNumber); + webAudioControlsMidiManager.contextMenuClose(); + this.midiMode = 'normal'; + } + if(this.listeningToThisMidiController(channel, controlNumber)) { + if(this.tagName=="WEBAUDIO-SWITCH"){ + switch(this.type){ + case "toggle": + if(event.data[2]>=64) + this.setValue(1-this.value,true); + break; + case "kick": + this.setValue(event.data[2]>=64?1:0); + break; + case "radio": + let els=document.querySelectorAll("webaudio-switch[type='radio'][group='"+this.group+"']"); + for(let i=0;i +${this.basestyle} +webaudio-knob{ + display:inline-block; + position:relative; + margin:0; + padding:0; + cursor:pointer; + font-family: sans-serif; + font-size: 11px; +} +.webaudio-knob-body{ + display:inline-block; + position:relative; + margin:0; + padding:0; + vertical-align:bottom; +} + +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.knobSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=+v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=+v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=+v;this.redraw()}}); + this._sprites=this.getAttr("sprites",opt.knobSprites); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._width=this.getAttr("width",opt.knobWidth); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",opt.knobHeight); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._diameter=this.getAttr("diameter",opt.knobDiameter); Object.defineProperty(this,"diameter",{get:()=>{return this._diameter},set:(v)=>{this._diameter=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.knobColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.sensitivity=this.getAttr("sensitivity",1); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + this.coltab=["#e00","#000","#000"]; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + } + disconnectedCallback(){} + setupImage(){ + this.kw=this.width||this.diameter; + this.kh=this.height||this.diameter; + if(!this.src){ + if(this.colors) + this.coltab = this.colors.split(";"); + if(!this.coltab) + this.coltab=["#e00","#000","#000"]; + let svg= +` + + +`; + for(let i=0;i<101;++i){ + svg += ``; + svg += ``; + } + svg += ""; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svg)+")"; +// this.elem.style.backgroundSize = "100% 10100%"; + this.elem.style.backgroundSize = `${this.kw}px ${this.kh*101}px`; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + if(!this.sprites) + this.elem.style.backgroundSize = "100% 100%"; + else{ +// this.elem.style.backgroundSize = `100% ${(this.sprites+1)*100}%`; + this.elem.style.backgroundSize = `${this.kw}px ${this.kh*(this.sprites+1)}px`; + } + } + this.elem.style.outline=this.outline?"":"none"; + this.elem.style.width=this.kw+"px"; + this.elem.style.height=this.kh+"px"; + this.style.height=this.kh+"px"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.elem.style; + let sp = this.src?this.sprites:100; + if(sp>=1){ + let offset = ((sp * (this.value - this.min) / range) | 0); + style.backgroundPosition = "0px " + (-offset*this.kh) + "px"; + style.transform = 'rotate(0deg)'; + } else { + let deg = 270 * ((this.value - this.min) / range - 0.5); + style.backgroundPosition="0px 0px"; + style.transform = 'rotate(' + deg + 'deg)'; + } + } + _setValue(v){ + if(this.step) + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v) && f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + ev.preventDefault(); + ev.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-knob already defined"); +} + +try{ + customElements.define("webaudio-slider", class WebAudioSlider extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.knob=this.elem.childNodes[0]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.sliderSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._knobsrc=this.getAttr("knobsrc",opt.sliderKnobsrc); Object.defineProperty(this,"knobsrc",{get:()=>{return this._knobsrc},set:(v)=>{this._knobsrc=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=v;this.redraw()}}); + this._sprites=this.getAttr("sprites",0); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._direction=this.getAttr("direction",null); Object.defineProperty(this,"direction",{get:()=>{return this._direction},set:(v)=>{this._direction=v;this.setupImage()}}); + this._width=this.getAttr("width",opt.sliderWidth); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",opt.sliderHeight); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + if(this._direction=="horz"){ + if(this._width==0) this._width=128; + if(this._height==0) this._height=24; + } + else{ + if(this._width==0) this._width=24; + if(this._height==0) this._height=128; + } + this._knobwidth=this.getAttr("knobwidth",opt.sliderKnobwidth); Object.defineProperty(this,"knobwidth",{get:()=>{return this._knobwidth},set:(v)=>{this._knobwidth=v;this.setupImage()}}); + this._knobheight=this.getAttr("knbheight",opt.sliderKnobheight); Object.defineProperty(this,"knobheight",{get:()=>{return this._knobheight},set:(v)=>{this._knobheight=v;this.setupImage()}}); + this._ditchlength=this.getAttr("ditchlength",opt.sliderDitchlength); Object.defineProperty(this,"ditchlength",{get:()=>{return this._ditchlength},set:(v)=>{this._ditchlength=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.sliderColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.sensitivity=this.getAttr("sensitivity",1); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.dr=this.direction; + this.dlen=this.ditchlength; + if(!this.width){ + if(this.dr=="horz") + this.width=128; + else + this.width=24; + } + if(!this.height){ + if(this.dr=="horz") + this.height=24; + else + this.height=128; + } + if(!this.dr) + this.dr=(this.width<=this.height)?"vert":"horz"; + if(this.dr=="vert"){ + if(!this.dlen) + this.dlen=this.height-this.width; + } + else{ + if(!this.dlen) + this.dlen=this.width-this.height; + } + this.knob.style.backgroundSize = "100% 100%"; + this.elem.style.backgroundSize = "100% 100%"; + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.style.height=this.height+"px"; + this.kwidth=this.knobwidth||(this.dr=="horz"?this.height:this.width); + this.kheight=this.knobheight||(this.dr=="horz"?this.height:this.width); + this.knob.style.width = this.kwidth+"px"; + this.knob.style.height = this.kheight+"px"; + if(!this.src){ + let r=Math.min(this.width,this.height)*0.5; + let svgbody= +` +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgbody)+")"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + } + if(!this.knobsrc){ + let svgthumb= +` + +`; + this.knob.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgthumb)+")"; + } + else{ + this.knob.style.backgroundImage = "url("+(this.knobsrc)+")"; + } + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.knob.style; + if(this.dr=="vert"){ + style.left=(this.width-this.kwidth)*0.5+"px"; + style.top=(1-(this.value-this.min)/range)*this.dlen+"px"; + this.sensex=0; this.sensey=1; + } + else{ + style.top=(this.height-this.kheight)*0.5+"px"; + style.left=(this.value-this.min)/range*this.dlen+"px"; + this.sensex=1; this.sensey=0; + } + } + _setValue(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + if(this.conv) + this.convValue=eval(this.conv)(this._value); + else + this.convValue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + this.redraw(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.touches) + e = e.touches[0]; + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-slider already defined"); +} + +try{ + customElements.define("webaudio-switch", class WebAudioSwitch extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=this.elem.childNodes[0]; + + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",null); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this.type=this.getAttr("type","toggle"); + this.group=this.getAttr("group",""); + this._width=this.getAttr("width",0); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",0); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._diameter=this.getAttr("diameter",0); Object.defineProperty(this,"diameter",{get:()=>{return this._diameter},set:(v)=>{this._diameter=v;this.setupImage()}}); + this.invert=this.getAttr("invert",0); + this._colors=this.getAttr("colors",opt.switchColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.valuetip=0; + this.tooltip=this.getAttr("tooltip",null); + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + let w=this.width||this.diameter||opt.switchWidth||opt.switchDiameter; + let h=this.height||this.diameter||opt.switchHeight||opt.switchDiameter; + if(!this.src){ + this.coltab = this.colors.split(";"); + let mm=Math.min(w,h); + let svg= +` + + + + +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svg)+")"; + this.elem.style.backgroundSize = "100% 200%"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + if(!this.sprites) + this.elem.style.backgroundSize = "100% 200%"; + else + this.elem.style.backgroundSize = `100% ${(this.sprites+1)*100}%`; + } + this.elem.style.width=w+"px"; + this.elem.style.height=h+"px"; + this.style.height=h+"px"; + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + let style = this.elem.style; + if(this.value^this.invert) + style.backgroundPosition = "0px -100%"; + else + style.backgroundPosition = "0px 0px"; + } + setValue(v,f){ + this.value=v; + this.checked=(!!v); + if(this.value!=this.oldvalue){ + this.redraw(); + this.showtip(0); + if(f){ + this.sendEvent("input"); + this.sendEvent("change"); + } + this.oldvalue=this.value; + } + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(e)=>{ + e.preventDefault(); + e.stopPropagation(); + return false; + } + let pointerup=(e)=>{ + this.drag=0; + this.showtip(0); + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + if(this.type=="kick"){ + this.value=0; + this.checked=false; + this.redraw(); + this.sendEvent("change"); + } + this.sendEvent("click"); + e.preventDefault(); + e.stopPropagation(); + } + let preventScroll=(e)=>{ + e.preventDefault(); + } + switch(this.type){ + case "kick": + this.setValue(1); + this.sendEvent("change"); + break; + case "toggle": + if(e.ctrlKey || e.metaKey) + this.value=defvalue; + else + this.value=1-this.value; + this.checked=!!this.value; + this.sendEvent("change"); + break; + case "radio": + let els=document.querySelectorAll("webaudio-switch[type='radio'][group='"+this.group+"']"); + for(let i=0;i +${this.basestyle} +webaudio-param{ + display:inline-block; + user-select:none; + margin:0; + padding:0; + font-family: sans-serif; + font-size: 8px; + cursor:pointer; + position:relative; + vertical-align:baseline; +} +.webaudio-param-body{ + display:inline-block; + position:relative; + text-align:center; + border:1px solid #888; + background:none; + border-radius:4px; + margin:0; + padding:0; + font-family:sans-serif; + font-size:11px; + vertical-align:bottom; +} + +
    +`; + this.elem=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.enable=this.getAttr("enable",1); + this._value=this.getAttr("value",0); Object.defineProperty(this,"value",{get:()=>{return this._value},set:(v)=>{this._value=v;this.redraw()}}); + this.defvalue=this.getAttr("defvalue",0); + this._fontsize=this.getAttr("fontsize",9); Object.defineProperty(this,"fontsize",{get:()=>{return this._fontsize},set:(v)=>{this._fontsize=v;this.setupImage()}}); + this._src=this.getAttr("src",null); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this.link=this.getAttr("link",""); + this._width=this.getAttr("width",32); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",20); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._colors=this.getAttr("colors","#fff;#000"); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.fromLink=((e)=>{ + this.setValue(e.target.convValue.toFixed(e.target.digits)); + }).bind(this); + this.elem.onchange=()=>{ + this.value=this.elem.value; + let le=document.getElementById(this.link); + if(le) + le.setValue(+this.elem.value); + } + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.elem.style.color=this.coltab[0]; + if(!this.src){ + this.elem.style.backgroundColor=this.coltab[1]; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + this.elem.style.backgroundSize = "100% 100%"; + } + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.elem.style.fontSize=this.fontsize+"px"; + this.elem.style.outline=this.outline?"":"none"; + let l=document.getElementById(this.link); + if(l&&typeof(l.value)!="undefined"){ + this.setValue(l.value.toFixed(l.digits)); + l.addEventListener("input",(e)=>{this.setValue(l.value.toFixed(l.digits))}); + } + this.redraw(); + } + redraw() { + this.elem.value=this.value; + } + setValue(v,f){ + this.value=v; + if(this.value!=this.oldvalue){ + this.redraw(); + this.showtip(0); + if(f){ + let event=document.createEvent("HTMLEvents"); + event.initEvent("change",false,true); + this.dispatchEvent(event); + } + this.oldvalue=this.value; + } + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches) + e = ev.touches[0]; + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.redraw(); + } + }); +} catch(error){ + console.log("webaudio-param already defined"); +} + +try{ + customElements.define("webaudio-keyboard", class WebAudioKeyboard extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.cv=root.childNodes[2]; + this.ttframe=root.childNodes[3]; + this.ctx=this.cv.getContext("2d"); + this._values=[]; + this.enable=this.getAttr("enable",1); + this._width=this.getAttr("width",480); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",128); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=+v;this.redraw()}}); + this._keys=this.getAttr("keys",25); Object.defineProperty(this,"keys",{get:()=>{return this._keys},set:(v)=>{this._keys=+v;this.setupImage()}}); + this._colors=this.getAttr("colors","#222;#eee;#ccc;#333;#000;#e88;#c44;#c33;#800"); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.midilearn=this.getAttr("midilearn",0); + this.midicc=this.getAttr("midicc",null); + this.press=0; + this.keycodes1=[90,83,88,68,67,86,71,66,72,78,74,77,188,76,190,187,191,226]; + this.keycodes2=[81,50,87,51,69,82,53,84,54,89,55,85,73,57,79,48,80,192,222,219]; + this.addEventListener("keyup",this.keyup); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) + window.webAudioControlsMidiManager.addWidget(this); + } + disconnectedCallback(){} + setupImage(){ + this.cv.style.width=this.width+"px"; + this.cv.style.height=this.height+"px"; + this.bheight = this.height * 0.55; + this.kp=[0,7/12,1,3*7/12,2,3,6*7/12,4,8*7/12,5,10*7/12,6]; + this.kf=[0,1,0,1,0,0,1,0,1,0,1,0]; + this.ko=[0,0,(7*2)/12-1,0,(7*4)/12-2,(7*5)/12-3,0,(7*7)/12-4,0,(7*9)/12-5,0,(7*11)/12-6]; + this.kn=[0,2,4,5,7,9,11]; + this.coltab=this.colors.split(";"); + this.cv.width = this.width; + this.cv.height = this.height; + this.cv.style.width = this.width+'px'; + this.cv.style.height = this.height+'px'; + this.style.height = this.height+'px'; + this.cv.style.outline=this.outline?"":"none"; + this.bheight = this.height * 0.55; + this.max=this.min+this.keys-1; + this.dispvalues=[]; + this.valuesold=[]; + if(this.kf[this.min%12]) + --this.min; + if(this.kf[this.max%12]) + ++this.max; + this.redraw(); + } + redraw(){ + function rrect(ctx, x, y, w, h, r, c1, c2) { + if(c2) { + let g=ctx.createLinearGradient(x,y,x+w,y); + g.addColorStop(0,c1); + g.addColorStop(1,c2); + ctx.fillStyle=g; + } + else + ctx.fillStyle=c1; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x+w, y); + ctx.lineTo(x+w, y+h-r); + ctx.quadraticCurveTo(x+w, y+h, x+w-r, y+h); + ctx.lineTo(x+r, y+h); + ctx.quadraticCurveTo(x, y+h, x, y+h-r); + ctx.lineTo(x, y); + ctx.fill(); + } + this.ctx.fillStyle = this.coltab[0]; + this.ctx.fillRect(0,0,this.width,this.height); + let x0=7*((this.min/12)|0)+this.kp[this.min%12]; + let x1=7*((this.max/12)|0)+this.kp[this.max%12]; + let n=x1-x0; + this.wwidth=(this.width-1)/(n+1); + this.bwidth=this.wwidth*7/12; + let h2=this.bheight; + let r=Math.min(8,this.wwidth*0.2); + for(let i=this.min,j=0;i<=this.max;++i) { + if(this.kf[i%12]==0) { + let x=this.wwidth*(j++)+1; + if(this.dispvalues.indexOf(i)>=0) + rrect(this.ctx,x,1,this.wwidth-1,this.height-2,r,this.coltab[5],this.coltab[6]); + else + rrect(this.ctx,x,1,this.wwidth-1,this.height-2,r,this.coltab[1],this.coltab[2]); + } + } + r=Math.min(8,this.bwidth*0.3); + for(let i=this.min;i=0) + rrect(this.ctx,x,1,this.bwidth,h2,r,this.coltab[7],this.coltab[8]); + else + rrect(this.ctx,x,1,this.bwidth,h2,r,this.coltab[3],this.coltab[4]); + this.ctx.strokeStyle=this.coltab[0]; + this.ctx.stroke(); + } + } + } + _setValue(v){ + if(this.step) + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._value=Math.min(this.max,Math.max(this.min,v)); + if(this._value!=this.oldvalue){ + this.oldvalue=this._value; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setValue(v,f){ + if(this._setValue(v) && f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e){} + keydown(e){ + let m=Math.floor((this.min+11)/12)*12; + let k=this.keycodes1.indexOf(e.keyCode); + if(k<0) { + k=this.keycodes2.indexOf(e.keyCode); + if(k>=0) k+=12; + } + if(k>=0){ + k+=m; + if(this.currentKey!=k){ + this.currentKey=k; + this.sendEventFromKey(1,k); + this.setNote(1,k); + } + } + } + keyup(e){ + let m=Math.floor((this.min+11)/12)*12; + let k=this.keycodes1.indexOf(e.keyCode); + if(k<0) { + k=this.keycodes2.indexOf(e.keyCode); + if(k>=0) k+=12; + } + if(k>=0){ + k+=m; + this.currentKey=-1; + this.sendEventFromKey(0,k); + this.setNote(0,k); + } + } + pointerdown(ev){ + this.cv.focus(); + if(this.enable) { + ++this.press; + } + let pointermove=(ev)=>{ + if(!this.enable) + return; + let r=this.getBoundingClientRect(); + let v=[],p; + if(ev.touches) + p=ev.targetTouches; + else if(this.press) + p=[ev]; + else + p=[]; + if(p.length>0) + this.drag=1; + for(let i=0;i=0&&py=this.min&&k<=this.max) + v.push(k); + } + } + v.sort(); + this.values=v; + this.sendevent(); + this.redraw(); + } + + let pointerup=(ev)=>{ + if(this.enable) { + if(ev.touches) + this.press=ev.touches.length; + else + this.press=0; + pointermove(ev); + this.sendevent(); + if(this.press==0){ + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + } + this.redraw(); + } + this.drag=0; + ev.preventDefault(); + } + let preventScroll=(ev)=>{ + ev.preventDefault(); + } + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + pointermove(ev); + ev.preventDefault(); + ev.stopPropagation(); + } + sendEventFromKey(s,k){ + let ev=document.createEvent('HTMLEvents'); + ev.initEvent('change',true,true); + ev.note=[s,k]; + this.dispatchEvent(ev); + } + sendevent(){ + let notes=[]; + for(let i=0,j=this.valuesold.length;i=0) this.dispvalues.splice(n,1); + } + } + setNote(state,note) { + this.setdispvalues(state,note); + this.redraw(); + } + }); +} catch(error){ + console.log("webaudio-keyboard already defined"); +} + +try{ + customElements.define("webaudio-xypad", class WebAudioXYPad extends WebAudioControlsWidget { + constructor(){ + super(); + } + connectedCallback(){ + let root; +// if(this.attachShadow) +// root=this.attachShadow({mode: 'open'}); +// else + root=this; + root.innerHTML= +` +
    +`; + this.elem=root.childNodes[2]; + this.knob=this.elem.childNodes[0]; + this.ttframe=root.childNodes[3]; + + this.enable=this.getAttr("enable",1); + this._src=this.getAttr("src",opt.sliderSrc); Object.defineProperty(this,"src",{get:()=>{return this._src},set:(v)=>{this._src=v;this.setupImage()}}); + this._knobsrc=this.getAttr("knobsrc",opt.sliderKnobsrc); Object.defineProperty(this,"knobsrc",{get:()=>{return this._knobsrc},set:(v)=>{this._knobsrc=v;this.setupImage()}}); + this._x=this.getAttr("x",50); Object.defineProperty(this,"x",{get:()=>{return this._x},set:(v)=>{this._x=v;this.redraw()}}); + this._y=this.getAttr("y",50); Object.defineProperty(this,"y",{get:()=>{return this._y},set:(v)=>{this._y=v;this.redraw()}}); + this.defx=this.getAttr("defx",50); + this.defy=this.getAttr("defy",50); + this._min=this.getAttr("min",0); Object.defineProperty(this,"min",{get:()=>{return this._min},set:(v)=>{this._min=v;this.redraw()}}); + this._max=this.getAttr("max",100); Object.defineProperty(this,"max",{get:()=>{return this._max},set:(v)=>{this._max=v;this.redraw()}}); + this._step=this.getAttr("step",1); Object.defineProperty(this,"step",{get:()=>{return this._step},set:(v)=>{this._step=v;this.redraw()}}); + this._sprites=this.getAttr("sprites",0); Object.defineProperty(this,"sprites",{get:()=>{return this._sprites},set:(v)=>{this._sprites=v;this.setupImage()}}); + this._width=this.getAttr("width",128); Object.defineProperty(this,"width",{get:()=>{return this._width},set:(v)=>{this._width=v;this.setupImage()}}); + this._height=this.getAttr("height",128); Object.defineProperty(this,"height",{get:()=>{return this._height},set:(v)=>{this._height=v;this.setupImage()}}); + this._knobwidth=this.getAttr("knobwidth",28); Object.defineProperty(this,"knobwidth",{get:()=>{return this._knobwidth},set:(v)=>{this._knobwidth=v;this.setupImage()}}); + this._knobheight=this.getAttr("knbheight",28); Object.defineProperty(this,"knobheight",{get:()=>{return this._knobheight},set:(v)=>{this._knobheight=v;this.setupImage()}}); + this._colors=this.getAttr("colors",opt.sliderColors); Object.defineProperty(this,"colors",{get:()=>{return this._colors},set:(v)=>{this._colors=v;this.setupImage()}}); + this.outline=this.getAttr("outline",opt.outline); + this.valuetip=this.getAttr("valuetip",1); + this.tooltip=this.getAttr("tooltip",null); + this.conv=this.getAttr("conv",null); + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.midilearn=this.getAttr("midilearn",opt.midilearn); + this.midicc=this.getAttr("midicc",null); + this.midiController={}; + this.midiMode="normal"; + if(this.midicc) { + let ch = parseInt(this.midicc.substring(0, this.midicc.lastIndexOf("."))) - 1; + let cc = parseInt(this.midicc.substring(this.midicc.lastIndexOf(".") + 1)); + this.setMidiController(ch, cc); + } + this.setupImage(); + this.digits=0; + if(window.webAudioControlsMidiManager) +// window.webAudioControlsMidiManager.updateWidgets(); + window.webAudioControlsMidiManager.addWidget(this); + this.elem.onclick=(e)=>{e.stopPropagation()}; + } + disconnectedCallback(){} + setupImage(){ + this.coltab = this.colors.split(";"); + this.dr=this.direction; + this.dlen=this.ditchlength; + if(!this.width) + this.width=256; + if(!this.height) + this.height=256; + this.knob.style.backgroundSize = "100% 100%"; + this.elem.style.backgroundSize = "100% 100%"; + this.elem.style.width=this.width+"px"; + this.elem.style.height=this.height+"px"; + this.kwidth=this.knobwidth||(this.width*0.15|0); + this.kheight=this.knobheight||(this.height*0.15|0); + this.knob.style.width = this.kwidth+"px"; + this.knob.style.height = this.kheight+"px"; + if(!this.src){ + let r=Math.min(this.width,this.height)*0.02; + let svgbody= +` +`; + this.elem.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgbody)+")"; + } + else{ + this.elem.style.backgroundImage = "url("+(this.src)+")"; + } + if(!this.knobsrc){ + let svgthumb= +` + +`; + this.knob.style.backgroundImage = "url(data:image/svg+xml;base64,"+btoa(svgthumb)+")"; + } + else{ + this.knob.style.backgroundImage = "url("+(this.knobsrc)+")"; + } + this.elem.style.outline=this.outline?"":"none"; + this.redraw(); + } + redraw() { + this.digits=0; + if(this.step && this.step < 1) { + for(let n = this.step ; n < 1; n *= 10) + ++this.digits; + } + if(this.valuethis.max){ + this.value=this.max; + return; + } + let range = this.max - this.min; + let style = this.knob.style; + style.left=(this.width-this.kwidth)*(this._x-this.min)/(this.max-this.min)+"px"; style.top=(this.height-this.kheight)*(1-(this._y-this.min)/(this.max-this.min))+"px"; + this.sensex=0; this.sensey=1; + } + _setX(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._x=Math.min(this.max,Math.max(this.min,v)); + if(this._x!=this.oldx){ + this.oldx=this._x; + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + _setY(v){ + v=(Math.round((v-this.min)/this.step))*this.step+this.min; + this._y=Math.min(this.max,Math.max(this.min,v)); + if(this._y!=this.oldy){ + this.oldy=this._y; + if(this.conv){ + this.convValue={x:eval(this.conv)(this._x),y:eval(this.conv)(this._y)}; + } + else + this.convValue={x:this._x,y:this._y}; + this.redraw(); + this.showtip(0); + return 1; + } + return 0; + } + setX(v,f){ + if(this._setX(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + setY(v,f){ + if(this._setY(v)&&f) + this.sendEvent("input"),this.sendEvent("change"); + } + wheel(e) { + let delta=(this.max-this.min)*0.01; + delta=e.deltaY>0?-delta:delta; + if(!e.shiftKey) + delta*=5; + if(Math.abs(delta) < this.step) + delta = (delta > 0) ? +this.step : -this.step; + this.setValue(+this.value+delta,true); + e.preventDefault(); + e.stopPropagation(); + this.redraw(); + } + pointerdown(ev){ + if(!this.enable) + return; + let e=ev; + if(ev.touches){ + e = ev.changedTouches[0]; + this.identifier=e.identifier; + } + else { + if(e.buttons!=1 && e.button!=0) + return; + } + this.elem.focus(); + this.drag=1; + this.showtip(0); + let pointermove=(ev)=>{ + let e=ev; + if(ev.touches){ + for(let i=0;i{ + let e=ev; + if(ev.touches){ + for(let i=0;;){ + if(ev.changedTouches[i].identifier==this.identifier){ + break; + } + if(++i>=ev.changedTouches.length) + return; + } + } + this.drag=0; + this.showtip(0); + this.startPosX = this.startPosY = null; + window.removeEventListener('mousemove', pointermove); + window.removeEventListener('touchmove', pointermove, {passive:false}); + window.removeEventListener('mouseup', pointerup); + window.removeEventListener('touchend', pointerup); + window.removeEventListener('touchcancel', pointerup); + document.body.removeEventListener('touchstart', preventScroll,{passive:false}); + this.sendEvent("change"); + } + pointermove(ev); + let preventScroll=(e)=>{ + e.preventDefault(); + } + if(e.touches) + e = e.touches[0]; + if(e.ctrlKey || e.metaKey) + this.setValue(this.defvalue,true); + else { + this.startPosX = e.pageX; + this.startPosY = e.pageY; + this.startVal = this.value; + window.addEventListener('mousemove', pointermove); + window.addEventListener('touchmove', pointermove, {passive:false}); + } + window.addEventListener('mouseup', pointerup); + window.addEventListener('touchend', pointerup); + window.addEventListener('touchcancel', pointerup); + document.body.addEventListener('touchstart', preventScroll,{passive:false}); + e.preventDefault(); + e.stopPropagation(); + return false; + } + }); +} catch(error){ + console.log("webaudio-xypad already defined"); +} + + + + // FOR MIDI LEARN + class WebAudioControlsMidiManager { + constructor(){ + this.midiAccess = null; + this.listOfWidgets = []; + this.listOfExternalMidiListeners = []; + this.updateWidgets(); + this.initWebAudioControls(); + } + addWidget(w){ + this.listOfWidgets.push(w); + } + updateWidgets(){ +// this.listOfWidgets = document.querySelectorAll("webaudio-knob,webaudio-slider,webaudio-switch"); + } + initWebAudioControls() { + if(navigator.requestMIDIAccess) { + navigator.requestMIDIAccess().then( + (ma)=>{this.midiAccess = ma,this.enableInputs()}, + (err)=>{ console.log("MIDI not initialized - error encountered:" + err.code)} + ); + } + } + enableInputs() { + let inputs = this.midiAccess.inputs.values(); + console.log("Found " + this.midiAccess.inputs.size + " MIDI input(s)"); + for(let input = inputs.next(); input && !input.done; input = inputs.next()) { + console.log("Connected input: " + input.value.name); + input.value.onmidimessage = this.handleMIDIMessage.bind(this); + } + } + midiConnectionStateChange(e) { + console.log("connection: " + e.port.name + " " + e.port.connection + " " + e.port.state); + enableInputs(); + } + + onMIDIStarted(midi) { + this.midiAccess = midi; + midi.onstatechange = this.midiConnectionStateChange; + enableInputs(midi); + } + // Add hooks for external midi listeners support + addMidiListener(callback) { + this.listOfExternalMidiListeners.push(callback); + } + getCurrentConfigAsJSON() { + return currentConfig.stringify(); + } + handleMIDIMessage(event) { + this.listOfExternalMidiListeners.forEach(function (externalListener) { + externalListener(event); + }); + if(((event.data[0] & 0xf0) == 0xf0) || ((event.data[0] & 0xf0) == 0xb0 && event.data[1] >= 120)) + return; + for(let w of this.listOfWidgets) { + if(w.processMidiEvent) + w.processMidiEvent(event); + } + if(opt.mididump) + console.log(event.data); + } + contextMenuOpen(e,knob){ + if(!this.midiAccess) + return; + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.style.left=e.pageX+"px"; + menu.style.top=e.pageY+"px"; + menu.knob=knob; + menu.classList.add("active"); + menu.knob.focus(); +// document.activeElement.onblur=this.contextMenuClose; + menu.knob.addEventListener("keydown",this.contextMenuCloseByKey.bind(this)); + } + contextMenuCloseByKey(e){ + if(e.keyCode==27) + this.contextMenuClose(); + } + contextMenuClose(){ + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.knob.removeEventListener("keydown",this.contextMenuCloseByKey); + menu.classList.remove("active"); + let menuItemLearn=document.getElementById("webaudioctrl-context-menu-learn"); + menuItemLearn.innerHTML = 'Learn'; + menu.knob.midiMode = 'normal'; + } + contextMenuLearn(){ + let menu=document.getElementById("webaudioctrl-context-menu"); + let menuItemLearn=document.getElementById("webaudioctrl-context-menu-learn"); + menuItemLearn.innerHTML = 'Listening...'; + menu.knob.midiMode = 'learn'; + } + contextMenuClear(e){ + let menu=document.getElementById("webaudioctrl-context-menu"); + menu.knob.midiController={}; + this.contextMenuClose(); + } + } + if(window.UseWebAudioControlsMidi||opt.useMidi) + window.webAudioControlsMidiManager = new WebAudioControlsMidiManager(); +} diff --git a/webui/webcomponents-lite.js b/webui/webcomponents-lite.js new file mode 100755 index 0000000..d3e7beb --- /dev/null +++ b/webui/webcomponents-lite.js @@ -0,0 +1,197 @@ +(function(){/* + + Copyright (c) 2016 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt +*/ +'use strict';var p,q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};function ca(){ca=function(){};q.Symbol||(q.Symbol=da)}var da=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}(); +function ea(){ca();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ba(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return fa(this)}});ea=function(){}}function fa(a){var b=0;return ha(function(){return b"+this.innerHTML+""},set:function(a){if(this.parentNode){J.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();J.body.firstChild;)l.call(a, +J.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};na(a.prototype);aa(a.prototype);a.J=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d]/g, +U=function(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case "\u00a0":return" "}}}if(c||eb){a.ca=function(a,b){var c=f.call(a,!1);this.D&&this.D(c);b&&(l.call(c.content,f.call(a.content,!0)),fb(c.content,a.content));return c};var fb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,x={La:function(a,b){a.href&&a.setAttribute("href",x.Y(a.getAttribute("href"),b));a.src&&a.setAttribute("src",x.Y(a.getAttribute("src"),b));if("style"===a.localName){var c=x.ta(a.textContent,b,Ca);a.textContent=x.ta(c,b,Da)}},ta:function(a,b,c){return a.replace(c, +function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=x.Y(a,b));return c+"'"+a+"'"+e})},Y:function(a,b){if(void 0===x.ba){x.ba=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";x.ba="http://a/c%20d"===c.href}catch(Lg){}}if(x.ba)return(new URL(a,b)).href;c=x.Ba;c||(c=document.implementation.createHTMLDocument("temp"),x.Ba=c,c.ma=c.createElement("base"),c.head.appendChild(c.ma),c.la=c.createElement("a"));c.ma.href=b;c.la.href=a;return c.la.href||a}},na={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a= +a.split(",");var d=a[1];d=-1e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},aa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent); +k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.s(a)})};k.prototype.s=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.h(a))}else this.b++,this.a[c]="pending",na.load(c,function(a,d){a=b.Sa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.L()},function(){b.a[c]=null;b.b--;b.L()})};k.prototype.Sa=function(a,b){if(!a)return document.createDocumentFragment();aa&&(a=a.replace(Ea,function(a,b,c){return-1=== +a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=x.Y(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"]'); +var d=0;n(c,function(a){h(a);x.La(a,b);a.setAttribute("import-dependency","");"script"===a.localName&&!a.src&&a.textContent&&(a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n"))),a.textContent="",d++)});return a};k.prototype.L=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}), +a.Pa()))};this.Ua(function(){c=!0;d()});this.Ta(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Ta=function(a){function b(e){if(e]/g;function hc(a){switch(a){case "&":return"&";case "<":return"<";case ">":return">";case '"':return""";case "\u00a0":return" "}}function ic(a){for(var b={},c=0;c";break a;case Node.TEXT_NODE:g=g.data;g=k&&kc[k.localName]?g:g.replace(gc,hc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g), +Error("not implemented");}}c+=g}return c};var B={},D=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),E=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function mc(a){var b=[];D.currentNode=a;for(a=D.firstChild();a;)b.push(a),a=D.nextSibling();return b}B.parentNode=function(a){D.currentNode=a;return D.parentNode()};B.firstChild=function(a){D.currentNode=a;return D.firstChild()};B.lastChild=function(a){D.currentNode=a;return D.lastChild()};B.previousSibling=function(a){D.currentNode=a;return D.previousSibling()}; +B.nextSibling=function(a){D.currentNode=a;return D.nextSibling()};B.childNodes=mc;B.parentElement=function(a){E.currentNode=a;return E.parentNode()};B.firstElementChild=function(a){E.currentNode=a;return E.firstChild()};B.lastElementChild=function(a){E.currentNode=a;return E.lastChild()};B.previousElementSibling=function(a){E.currentNode=a;return E.previousSibling()};B.nextElementSibling=function(a){E.currentNode=a;return E.nextSibling()}; +B.children=function(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b};B.innerHTML=function(a){return lc(a,function(a){return mc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var nc=Object.getOwnPropertyDescriptor(Element.prototype,"innerHTML")||Object.getOwnPropertyDescriptor(HTMLElement.prototype,"innerHTML"),oc=document.implementation.createHTMLDocument("inert"),pc=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),qc={parentElement:{get:function(){var a=this.__shady&&this.__shady.parentNode;a&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:B.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=this.__shady&&this.__shady.parentNode; +return void 0!==a?a:B.parentNode(this)},configurable:!0},nextSibling:{get:function(){var a=this.__shady&&this.__shady.nextSibling;return void 0!==a?a:B.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=this.__shady&&this.__shady.previousSibling;return void 0!==a?a:B.previousSibling(this)},configurable:!0},className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0},nextElementSibling:{get:function(){if(this.__shady&& +void 0!==this.__shady.nextSibling){for(var a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return B.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){if(this.__shady&&void 0!==this.__shady.previousSibling){for(var a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return B.previousElementSibling(this)},configurable:!0}},rc={childNodes:{get:function(){if(vb(this)){if(!this.__shady.childNodes){this.__shady.childNodes= +[];for(var a=this.firstChild;a;a=a.nextSibling)this.__shady.childNodes.push(a)}var b=this.__shady.childNodes}else b=B.childNodes(this);b.item=function(a){return b[a]};return b},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=this.__shady&&this.__shady.firstChild;return void 0!==a?a:B.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=this.__shady&&this.__shady.lastChild;return void 0!==a?a:B.lastChild(this)}, +configurable:!0},textContent:{get:function(){if(vb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&a.push(d.textContent);return a.join("")}return B.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:for(;this.firstChild;)this.removeChild(this.firstChild);(0b.__shady.assignedNodes.length&&(b.__shady.ia=!0)}b.__shady.ia&&(b.__shady.ia=!1,od(this,b))}a=this.o;b=[];for(c=0;cb.indexOf(d))||b.push(d);for(a=0;a "+b}))}a=a.replace(Df,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Ka:b,stop:f}}function Bf(a,b){a=a.split(Ef);a[0]+=b;return a.join(Ef)} +function Af(a,b){var c=a.match(Ff);return(c=c&&c[2].trim()||"")?c[0].match(Gf)?a.replace(Ff,function(a,c,f){return b+f}):c.split(Gf)[0]===b?c:Hf:a.replace(wf,b)}function If(a){a.selector===Jf&&(a.selector="html")}hf.prototype.c=function(a){return a.match(zf)?this.b(a,Kf):Bf(a.trim(),Kf)};q.Object.defineProperties(hf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}}); +var uf=/:(nth[-\w]+)\(([^)]+)\)/,Kf=":not(.style-scope)",sf=",",xf=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gf=/[[.:#*]/,wf=":host",Jf=":root",zf="::slotted",vf=new RegExp("^("+zf+")"),Ff=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cf=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Df=/(.*):dir\((?:(ltr|rtl))\)/,qf=".",Ef=":",mf="class",Hf="should_not_match",W=new hf;function Lf(a,b,c,d){this.w=a||null;this.b=b||null;this.ja=c||[];this.G=null;this.P=d||"";this.a=this.u=this.B=null}function X(a){return a?a.__styleInfo:null}function Mf(a,b){return a.__styleInfo=b}Lf.prototype.c=function(){return this.w};Lf.prototype._getStyleRules=Lf.prototype.c;var Nf,Of=window.Element.prototype;Nf=Of.matches||Of.matchesSelector||Of.mozMatchesSelector||Of.msMatchesSelector||Of.oMatchesSelector||Of.webkitMatchesSelector;var Pf=navigator.userAgent.match("Trident");function Qf(){}function Rf(a){var b={},c=[],d=0;af(a,function(a){Sf(a);a.index=d++;a=a.i.cssText;for(var c;c=Ve.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a} +function Sf(a){if(!a.i){var b={},c={};Tf(a,c)&&(b.v=c,a.rules=null);b.cssText=a.parsedCssText.replace(Ye,"").replace(Te,"");a.i=b}}function Tf(a,b){var c=a.i;if(c){if(c.v)return Object.assign(b,c.v),!0}else{c=a.parsedCssText;for(var d;a=Te.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}} +function Uf(a,b,c){b&&(b=0<=b.indexOf(";")?Vf(a,b,c):ff(b,function(b,e,f,h){if(!e)return b+h;(e=Uf(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Uf(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""} +function Vf(a,b,c){b=b.split(";");for(var d=0,e,f;d *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(R&&!b.m&&(b.m=rf(W,b,W.b,a?qf+a:"",e)),c=b.m||e),d({Xa:c,Qa:g,hb:h})}} +function Yf(a,b){var c={},d={},e=b&&b.__cssBuild;af(b,function(b){Xf(a,b,e,function(e){Nf.call(a.b||a,e.Xa)&&(e.Qa?Tf(b,c):Tf(b,d))})},null,!0);return{Wa:d,Oa:c}} +function Zf(a,b,c,d){var e=V(b),f=pf(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).w;var g=$f(e,d);return nf(b,e,function(b){var e="";b.i||Sf(b);b.i.cssText&&(e=Vf(a,b.i.cssText,c));b.cssText=e;if(!R&&!cf(b)&&b.cssText){var k=e=b.cssText;null==b.ra&&(b.ra=We.test(e));if(b.ra)if(null==b.W){b.W=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.W.push(n))}else{for(n=0;n=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));R?f.a?(f.a.textContent=e,d=f.a):e&&(d=df(e,g,a.shadowRoot,f.b)):d?d.parentNode|| +(Pf&&-1