├── LXStudio ├── code │ ├── lxstudio-0.4.1.jar │ └── p4lx-0.4.1-jar-with-dependencies.jar ├── Patterns.pde ├── Fixtures │ └── Helix.lxf ├── LXStudio.pde └── Projects │ └── Example.lxp ├── .gitignore ├── README.md └── LICENSE /LXStudio/code/lxstudio-0.4.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heronarts/LXStudio-P4/HEAD/LXStudio/code/lxstudio-0.4.1.jar -------------------------------------------------------------------------------- /LXStudio/code/p4lx-0.4.1-jar-with-dependencies.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heronarts/LXStudio-P4/HEAD/LXStudio/code/p4lx-0.4.1-jar-with-dependencies.jar -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | applet 3 | application.linux32 4 | application.linux64 5 | application.windows32 6 | application.windows64 7 | application.macosx 8 | .lxproject 9 | .lxpreferences 10 | 11 | -------------------------------------------------------------------------------- /LXStudio/Patterns.pde: -------------------------------------------------------------------------------- 1 | // In this file you can define your own custom patterns 2 | 3 | // Here is a fairly basic example pattern that renders a plane that can be moved 4 | // across one of the axes. 5 | @LXCategory("Form") 6 | public static class PlanePattern extends LXPattern { 7 | 8 | public enum Axis { 9 | X, Y, Z 10 | }; 11 | 12 | public final EnumParameter axis = 13 | new EnumParameter("Axis", Axis.X) 14 | .setDescription("Which axis the plane is drawn across"); 15 | 16 | public final CompoundParameter pos = new CompoundParameter("Pos", 0, 1) 17 | .setDescription("Position of the center of the plane"); 18 | 19 | public final CompoundParameter wth = new CompoundParameter("Width", .4, 0, 1) 20 | .setDescription("Thickness of the plane"); 21 | 22 | public PlanePattern(LX lx) { 23 | super(lx); 24 | addParameter("axis", this.axis); 25 | addParameter("pos", this.pos); 26 | addParameter("width", this.wth); 27 | } 28 | 29 | public void run(double deltaMs) { 30 | float pos = this.pos.getValuef(); 31 | float falloff = 100 / this.wth.getValuef(); 32 | float n = 0; 33 | for (LXPoint p : model.points) { 34 | switch (this.axis.getEnum()) { 35 | case X: n = p.xn; break; 36 | case Y: n = p.yn; break; 37 | case Z: n = p.zn; break; 38 | } 39 | colors[p.index] = LXColor.gray(max(0, 100 - falloff*abs(n - pos))); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /LXStudio/Fixtures/Helix.lxf: -------------------------------------------------------------------------------- 1 | { 2 | "fixtureType": "Helix", 3 | 4 | "strips": [ 5 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 0, "z": 0, "yaw": 0 }, 6 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 10, "z": 0, "yaw": 20 }, 7 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 20, "z": 0, "yaw": 30 }, 8 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 30, "z": 0, "yaw": 45 }, 9 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 40, "z": 0, "yaw": 60 }, 10 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 50, "z": 0, "yaw": 75 }, 11 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 60, "z": 0, "yaw": 90 }, 12 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 70, "z": 0, "yaw": 105 }, 13 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 80, "z": 0, "yaw": 120 }, 14 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 90, "z": 0, "yaw": 135 }, 15 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 100, "z": 0, "yaw": 150 }, 16 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 110, "z": 0, "yaw": 165 }, 17 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 120, "z": 0, "yaw": 180 }, 18 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 130, "z": 0, "yaw": 195 }, 19 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 140, "z": 0, "yaw": 210 }, 20 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 150, "z": 0, "yaw": 225 }, 21 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 160, "z": 0, "yaw": 240 }, 22 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 170, "z": 0, "yaw": 255 }, 23 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 180, "z": 0, "yaw": 270 }, 24 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 190, "z": 0, "yaw": 285 }, 25 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 200, "z": 0, "yaw": 300 }, 26 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 210, "z": 0, "yaw": 315 }, 27 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 220, "z": 0, "yaw": 330 }, 28 | { "numPoints": 40, "spacing": 1, "x": 0, "y": 230, "z": 0, "yaw": 345 } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /LXStudio/LXStudio.pde: -------------------------------------------------------------------------------- 1 | /** 2 | * By using LX Studio, you agree to the terms of the LX Studio Software 3 | * License and Distribution Agreement, available at: http://lx.studio/license 4 | * 5 | * Please note that the LX license is not open-source. The license 6 | * allows for free, non-commercial use. 7 | * 8 | * HERON ARTS MAKES NO WARRANTY, EXPRESS, IMPLIED, STATUTORY, OR 9 | * OTHERWISE, AND SPECIFICALLY DISCLAIMS ANY WARRANTY OF 10 | * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR A PARTICULAR 11 | * PURPOSE, WITH RESPECT TO THE SOFTWARE. 12 | */ 13 | 14 | // --------------------------------------------------------------------------- 15 | // 16 | // Welcome to LX Studio! Getting started is easy... 17 | // 18 | // (1) Quickly scan this file 19 | // (2) Move on to "Patterns" to write your animations 20 | // 21 | // --------------------------------------------------------------------------- 22 | 23 | // Reference to top-level LX instance 24 | heronarts.lx.studio.LXStudio lx; 25 | 26 | void settings() { 27 | size(960, 800, P3D); 28 | pixelDensity(displayDensity()); 29 | } 30 | 31 | void setup() { 32 | heronarts.lx.studio.LXStudio.Flags flags = new heronarts.lx.studio.LXStudio.Flags(this); 33 | flags.useGLPointCloud = true; 34 | flags.startMultiThreaded = true; 35 | flags.resizable = true; 36 | lx = new heronarts.lx.studio.LXStudio(this, flags); 37 | } 38 | 39 | void initialize(LX lx) { 40 | // Add custom components or output drivers here 41 | } 42 | 43 | void initializeUI(final heronarts.lx.studio.LXStudio lx, heronarts.lx.studio.LXStudio.UI ui) { 44 | // Modify the UI theme if you like 45 | } 46 | 47 | void onUIReady(heronarts.lx.studio.LXStudio lx, heronarts.lx.studio.LXStudio.UI ui) { 48 | // Add custom UI components here 49 | } 50 | 51 | void draw() { 52 | // Nothing needs to happen here, this method just needs to exist for Processing 53 | // to run a draw loop. You should not need to do anything here. 54 | } 55 | 56 | // Helpful global constants 57 | final static float INCHES = 1; 58 | final static float IN = INCHES; 59 | final static float FEET = 12 * INCHES; 60 | final static float FT = FEET; 61 | final static float CM = IN / 2.54; 62 | final static float MM = CM * .1; 63 | final static float M = CM * 100; 64 | final static float METER = M; 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | END OF LIFECYCLE NOTICE 2 | === 3 | 4 | LX Studio has been superceded by the [Chromatik](https://chromatik.co/) Digital Lighting Workstation, which uses the same underlying [LX](https://github.com/heronarts/LX) libraries with a new, modern UI layer. [Chromatik](https://chromatik.co/) continues in the tradition of LX Studio as an open and extensible framework for custom development. It is available for macOS, Windows, and Linux. More information can be found on the website. 5 | 6 | --- 7 | 8 | **BY DOWNLOADING OR USING THE LX STUDIO SOFTWARE OR ANY PART THEREOF, YOU AGREE TO THE TERMS AND CONDITIONS OF THE [LX STUDIO SOFTWARE LICENSE AND DISTRIBUTION AGREEMENT](http://lx.studio/license).** 9 | 10 | Please note that LX Studio is not open-source software. The license grants permission to use this software freely in non-commercial applications. Commercial use is subject to a total annual revenue limit of $25K on any and all projects associated with the software. If this licensing is obstructive to your needs or you are unclear as to whether your desired use case is compliant, contact me to discuss proprietary licensing: mark@heronarts.com 11 | 12 | --- 13 | 14 | ![LX Studio](https://raw.github.com/heronarts/LXStudio/master/assets/screenshot.jpg) 15 | 16 | [LX Studio](http://lx.studio/) is a digital lighting workstation, bringing concepts from digital audio workstations and modular synthesis into the realm of LED lighting control. Generative patterns, interactive inputs, and flexible parameter-driven modulation — a rich environment for lighting composition and performance. 17 | 18 | ### Getting Started ### 19 | 20 | LX Studio runs on top of Processing 4. [Download and install Processing 4 →](https://processing.org/download/) 21 | 22 | Download LXStudio-P4 either via git clone in Terminal: 23 | ``` 24 | $ cd ~/Documents/Processing 25 | $ git clone https://github.com/heronarts/LXStudio-P4.git 26 | ``` 27 | 28 | Or via direct download: https://github.com/heronarts/LXStudio-P4/archive/master.zip 29 | 30 | Next, open the LXStudio.pde project in Processing 4 and click Run. 31 | 32 | Documentation is available on the [LX Studio Wiki →](https://github.com/heronarts/LXStudio/wiki) 33 | 34 | Consult the [LX Studio API reference →](http://lx.studio/api/) 35 | 36 | More and better documentation is coming soon! 37 | 38 | ### Contact and Collaboration ### 39 | 40 | Building a big cool project? I'm probably interested in hearing about it! Want to solicit some help, request new framework features, or just ask a random question? Open an issue on the project or drop me a line: mark@heronarts.com 41 | 42 | --- 43 | 44 | HERON ARTS MAKES NO WARRANTY, EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, AND SPECIFICALLY DISCLAIMS ANY WARRANTY OF MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THE SOFTWARE. 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2013-2022 Mark C. Slee, Heron Arts LLC 2 | 3 | LX STUDIO SOFTWARE LICENSE AND DISTRIBUTION AGREEMENT 4 | 5 | This Software License and Distribution Agreement (the "Agreement") is entered 6 | into by and between Heron Arts LLC, with offices at 7 Heron Street, San 7 | Francisco, CA 94103 ("Heron Arts") and you ("Licensee"). By downloading or 8 | using the Software (as defined below), you agree to the following terms: 9 | 10 | 1. Definitions. 11 | 12 | 1.1. "Application" means a Licensee installation or project that includes the 13 | Software, in object code or executable form only. 14 | 15 | 1.2. "Effective Date" means the date you first obtain a copy of the Software. 16 | 17 | 1.3. "Revenue Limit" means the gross revenue accrued by Licensee in connection 18 | with all Licensee Applications, taken together, for any 12-month period during 19 | the term of this Agreement, with no deductions. 20 | 21 | 1.4. "Software" means the Heron Arts LX software libraries, including all 22 | Updates supplied by Heron Arts under this Agreement. 23 | 24 | 1.5. "Update" means any correction, update, upgrade, patch or other 25 | modification or addition to the Software made available to Licensee by Heron 26 | Arts. 27 | 28 | 2. License. 29 | 30 | 2.1. Grant. Subject to the limitations of this Section 2, Heron Arts hereby 31 | grants to Licensee a nonexclusive, worldwide, non-transferable, 32 | non-sublicenseable license, during the term of this Agreement: (i) to modify 33 | the Software to create Applications that add substantial value to the Software; 34 | (ii) to distribute copies of the Software, in object code form only, only as 35 | part of Applications in accordance with this Section 2; (iii) to use the 36 | Software to run Applications, including to provide a service consisting of 37 | display of the Applications; and (iv) to reproduce copies of the Software, 38 | solely as necessary to exercise the rights granted in clauses (i) through (iv). 39 | Licensee may not sublicense any of these rights or licenses to any third party. 40 | Licensee shall not provide any third party with access to the source code for 41 | the Software without Heron Arts' prior written permission. 42 | 43 | The license granted in this Section 2.1 is subject to a Revenue Limit of 44 | $25,000 and is only valid for Applications that fall within such Revenue Limit. 45 | The license granted herein is royalty free, in consideration of the Revenue 46 | Limit being a condition of the license granted herein. 47 | 48 | 2.2. End User Licensing. If the Application is distributed, provided or sold 49 | pursuant to an agreement between Licensee and an end user, Licensee shall 50 | distribute each copy of the Software with an end user license agreement on the 51 | same licensing terms applicable to the remainder of the Application, but that 52 | is at least as favorable to Heron Arts as this Agreement. 53 | 54 | 2.3. Proprietary Notices. On each Software copy, Licensee shall reproduce all 55 | copyright or other proprietary notices contained on the Software, as provided 56 | by Heron Arts. Licensee shall not alter or remove or in any other way obscure 57 | or hide from display any Heron Arts or LX Studio logo or proprietary notice 58 | from the Application user interface or in the Software. 59 | 60 | 2.4. Third Party Open Source Software. Notwithstanding Section 2.1, Licensee 61 | acknowledges that certain components of the Software may be covered by 62 | so-called "open source" software licenses ("Open Source Components"), which 63 | means any software licenses approved as open source licenses by the Open Source 64 | Initiative or any substantially similar licenses. To the extent required by the 65 | licenses covering Open Source Components, the terms of such licenses will apply 66 | to such Open Source Components in lieu of the terms of this Agreement. To the 67 | extent the terms of the licenses applicable to Open Source Components prohibit 68 | any of the restrictions in this Agreement with respect to such Open Source 69 | Component, such restrictions will not apply to such Open Source Component. To 70 | the extent the terms of the licenses applicable to Open Source Components 71 | require Licensor to make an offer to provide source code or related information 72 | in connection with the Open Source Components, such offer is hereby made. 73 | 74 | 3. Ownership. As between the parties, Heron Arts will retain all right, title, 75 | and interest in the Software, and all intellectual property rights therein. 76 | 77 | 4. Use of Heron Arts Trademarks. Licensee shall state that the Application 78 | includes the Software and may use such applicable trademarks, trade names and 79 | logos of Heron Arts (including the LX Studio trademarks) as required to do so 80 | (collectively, the "Heron Arts Trademarks"). Any and all good will arising from 81 | Licensee's use of the Heron Arts Trademarks will inure solely to the benefit of 82 | Heron Arts. Licensee shall not assert any claim to the Heron Arts Trademarks 83 | (or any confusingly similar mark) or such good will. Licensee shall not 84 | register any Heron Arts Trademark, or any mark confusingly similar to any Heron 85 | Arts Trademark, in any jurisdiction. 86 | 87 | 5. Heron Arts Portfolio. (i) Licensee hereby grants to Heron Arts the right to 88 | publicize Licensee's use of the Software and (ii) Heron Arts may use Licensee's 89 | logo on the LX Studio website in areas naming licensees of the software, and in 90 | LX Studio portfolios or marketing presentations listing licensees of the 91 | Software. 92 | 93 | 6. Term and Termination. 94 | 95 | 6.1. Term. This Agreement will commence on the Effective Date and continue 96 | unless and until terminated as described herein. 97 | 98 | 6.2. Default. If Licensee defaults in the performance of any of its material 99 | obligations hereunder this Agreement and the licenses granted herein will 100 | automatically terminate. 101 | 102 | 6.3. Insolvency. This Agreement and the licenses granted herein will 103 | automatically terminate, (i) upon the institution by Licensee of insolvency, 104 | receivership or bankruptcy proceedings or any other proceedings for the 105 | settlement of its debts, (ii) upon the institution of such proceedings against 106 | Licensee, which are not dismissed or otherwise resolved in its favor within 60 107 | days thereafter, (iii) upon Licensee making a general assignment for the 108 | benefit of creditors, or (iv) upon Licensee's dissolution or ceasing to conduct 109 | business in the ordinary course. 110 | 111 | 6.4. Survival. The parties' rights and obligations of Sections 1, 3, 4, 5, 6.4, 112 | 7, 8 and 9 will survive any termination or expiration of this Agreement. Upon 113 | expiration or termination of this Agreement, all of Licensee's rights and 114 | licenses with respect to the Software will terminate, except each Software end 115 | user license properly granted as part of an Application before the effective 116 | date of termination will survive in accordance with its terms. 117 | 118 | 7. Warranty Disclaimer. 119 | 120 | 7.1. DISCLAIMER. HERON ARTS MAKES NO WARRANTY, EXPRESS, IMPLIED, STATUTORY, OR 121 | OTHERWISE, AND SPECIFICALLY DISCLAIMS ANY WARRANTY OF MERCHANTABILITY, 122 | NON-INFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE, WITH RESPECT TO THE 123 | SOFTWARE. 124 | 125 | 8. LIMITATION OF LIABILITY. HERON ARTS'S LIABILITY ARISING OUT OF THIS 126 | AGREEMENT WILL NOT EXCEED $50. HERON ARTS WILL NOT BE LIABLE FOR LOST PROFITS 127 | OR ANY CONSEQUENTIAL, SPECIAL, INCIDENTAL, OR INDIRECT DAMAGES, HOWEVER CAUSED 128 | AND ON ANY THEORY OF LIABILITY, ARISING OUT OF THIS AGREEMENT. LICENSEE 129 | ACKNOWLEDGES THAT THE ROYALTY-FREE NATURE OF THE LICENSE HEREIN IS BASED IN 130 | PART UPON THESE LIMITATIONS, AND THAT THESE LIMITATIONS WILL APPLY 131 | NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. 132 | 133 | 9. General. This Agreement is the entire agreement between the parties on the 134 | subject matter hereof. No amendment or modification hereof will be valid or 135 | binding upon the parties unless made in writing and signed by the duly 136 | authorized representatives of both parties. The relationship of the parties 137 | hereunder is that of independent contractors, and this Agreement will not be 138 | construed to imply that either party is the agent, employee, or joint venturer 139 | of the other. In the event that any provision of this Agreement is held to be 140 | unenforceable, this Agreement will continue in full force and effect and will 141 | be interpreted to reflect the original intent of the parties. This Agreement 142 | will be governed by the laws of the State of California, without regard to its 143 | conflict of laws principles. The parties consent to the personal and exclusive 144 | jurisdiction of courts located in San Francisco, California. Licensee may not 145 | assign this Agreement (by operation of law or otherwise) without the prior 146 | written consent of Heron Arts, and any prohibited assignment will be null and 147 | void. Heron Arts may assign this Agreement without consent in its sole 148 | discretion. This Agreement will be binding upon and will inure to the benefit 149 | of the parties permitted successors and assignees. Waiver by either party of a 150 | breach of any provision of this Agreement or the failure by either party to 151 | exercise any right hereunder will not operate or be construed as a waiver of 152 | any subsequent breach of that right or as a waiver of any other right. 153 | -------------------------------------------------------------------------------- /LXStudio/Projects/Example.lxp: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "timestamp": 1590707100932, 4 | "model": { 5 | "id": 2, 6 | "class": "heronarts.lx.structure.LXStructure", 7 | "internal": { 8 | "modulationColor": 0 9 | }, 10 | "parameters": { 11 | "label": "LX", 12 | "syncModelFile": false 13 | }, 14 | "children": {}, 15 | "output": { 16 | "id": 3, 17 | "class": "heronarts.lx.structure.LXStructure$Output", 18 | "internal": { 19 | "modulationColor": 0 20 | }, 21 | "parameters": { 22 | "label": "Output", 23 | "enabled": true, 24 | "fps": 0.0, 25 | "gamma": 1.0, 26 | "brightness": 1.0 27 | }, 28 | "children": {} 29 | }, 30 | "fixtures": [ 31 | { 32 | "jsonFixtureType": "Helix", 33 | "jsonParameters": {}, 34 | "id": 46, 35 | "class": "heronarts.lx.structure.JsonFixture", 36 | "internal": { 37 | "modulationColor": 0 38 | }, 39 | "parameters": { 40 | "label": "Helix 1", 41 | "x": 0.0, 42 | "y": 0.0, 43 | "z": 0.0, 44 | "yaw": 0.0, 45 | "pitch": 0.0, 46 | "roll": 0.0, 47 | "selected": true, 48 | "enabled": false, 49 | "brightness": 1.0, 50 | "identify": false, 51 | "mute": false, 52 | "solo": false, 53 | "fixtureType": "Helix", 54 | "scale": 1.0 55 | }, 56 | "children": {} 57 | } 58 | ] 59 | }, 60 | "engine": { 61 | "id": 1, 62 | "class": "heronarts.lx.LXEngine", 63 | "internal": { 64 | "modulationColor": 0 65 | }, 66 | "parameters": { 67 | "label": "Engine", 68 | "multithreaded": true, 69 | "channelMultithreaded": false, 70 | "networkMultithreaded": false, 71 | "framesPerSecond": 60.0, 72 | "speed": 1.0 73 | }, 74 | "children": { 75 | "palette": { 76 | "id": 4, 77 | "class": "heronarts.lx.color.LXPalette", 78 | "internal": { 79 | "modulationColor": 0 80 | }, 81 | "parameters": { 82 | "label": "Color Palette", 83 | "transitionEnabled": false, 84 | "transitionTimeSecs": 5.0, 85 | "transitionMode": 1 86 | }, 87 | "children": { 88 | "swatch": { 89 | "id": 5, 90 | "class": "heronarts.lx.color.LXSwatch", 91 | "internal": { 92 | "modulationColor": 0 93 | }, 94 | "parameters": { 95 | "label": "Swatch", 96 | "recall": false 97 | }, 98 | "children": {}, 99 | "colors": [ 100 | { 101 | "id": 6, 102 | "class": "heronarts.lx.color.LXDynamicColor", 103 | "internal": { 104 | "modulationColor": 0 105 | }, 106 | "parameters": { 107 | "label": "LX", 108 | "mode": 0, 109 | "period": 30.0, 110 | "primary/brightness": 100.0, 111 | "primary/saturation": 100.0, 112 | "primary/hue": 0.0, 113 | "secondary/brightness": 100.0, 114 | "secondary/saturation": 100.0, 115 | "secondary/hue": 120.0 116 | }, 117 | "children": {} 118 | } 119 | ] 120 | } 121 | }, 122 | "swatches": [] 123 | }, 124 | "tempo": { 125 | "id": 8, 126 | "class": "heronarts.lx.Tempo", 127 | "internal": { 128 | "modulationColor": 0 129 | }, 130 | "parameters": { 131 | "label": "Tempo", 132 | "clockSource": 0, 133 | "period": 500.0, 134 | "bpm": 120.0, 135 | "tap": false, 136 | "nudgeUp": false, 137 | "nudgeDown": false, 138 | "beatsPerMeasure": 4, 139 | "trigger": false, 140 | "enabled": false 141 | }, 142 | "children": { 143 | "nudge": { 144 | "id": 9, 145 | "class": "heronarts.lx.modulator.LinearEnvelope", 146 | "internal": { 147 | "modulationColor": 0 148 | }, 149 | "parameters": { 150 | "label": "LENV", 151 | "running": false, 152 | "trigger": false, 153 | "loop": false, 154 | "tempoSync": false, 155 | "tempoMultiplier": 5, 156 | "tempoLock": true 157 | }, 158 | "children": {}, 159 | "basis": 0.0 160 | } 161 | } 162 | }, 163 | "clips": { 164 | "id": 11, 165 | "class": "heronarts.lx.clip.LXClipEngine", 166 | "internal": { 167 | "modulationColor": 0 168 | }, 169 | "parameters": { 170 | "label": "LX", 171 | "focusedClip": 0.0 172 | }, 173 | "children": {} 174 | }, 175 | "mixer": { 176 | "id": 12, 177 | "class": "heronarts.lx.mixer.LXMixerEngine", 178 | "internal": { 179 | "modulationColor": 0 180 | }, 181 | "parameters": { 182 | "label": "Mixer", 183 | "scene-1": false, 184 | "scene-2": false, 185 | "scene-3": false, 186 | "scene-4": false, 187 | "scene-5": false, 188 | "crossfader": 0.5, 189 | "crossfaderBlendMode": 0, 190 | "focusedChannel": 0, 191 | "cueA": false, 192 | "cueB": false, 193 | "viewCondensed": false 194 | }, 195 | "children": { 196 | "master": { 197 | "id": 20, 198 | "class": "heronarts.lx.mixer.LXMasterBus", 199 | "internal": { 200 | "modulationColor": 0 201 | }, 202 | "parameters": { 203 | "label": "Master", 204 | "arm": false, 205 | "selected": false 206 | }, 207 | "children": {}, 208 | "effects": [], 209 | "clips": [] 210 | } 211 | }, 212 | "channels": [ 213 | { 214 | "id": 34, 215 | "class": "heronarts.lx.mixer.LXChannel", 216 | "internal": { 217 | "modulationColor": 0, 218 | "controlsExpanded": true 219 | }, 220 | "parameters": { 221 | "label": "Pattern", 222 | "arm": false, 223 | "selected": true, 224 | "enabled": true, 225 | "cue": false, 226 | "fader": 1.0, 227 | "crossfadeGroup": 0, 228 | "blendMode": 0, 229 | "midiMonitor": false, 230 | "midiChannel": 16, 231 | "autoCycleEnabled": false, 232 | "autoCycleMode": 0, 233 | "autoCycleTimeSecs": 60.0, 234 | "transitionEnabled": false, 235 | "transitionTimeSecs": 5.0, 236 | "transitionBlendMode": 0, 237 | "focusedPattern": 0 238 | }, 239 | "children": {}, 240 | "effects": [], 241 | "clips": [], 242 | "patternIndex": 0, 243 | "patterns": [ 244 | { 245 | "id": 48, 246 | "class": "heronarts.lx.pattern.color.GradientPattern", 247 | "internal": { 248 | "modulationColor": 0, 249 | "expanded": true, 250 | "modulationExpanded": false, 251 | "autoCycleEligible": true 252 | }, 253 | "parameters": { 254 | "label": "Gradient", 255 | "xAmount": 0.6666666977107525, 256 | "yAmount": 0.4333333522081375, 257 | "zAmount": 0.0, 258 | "xOffset": 0.0, 259 | "yOffset": 0.0, 260 | "zOffset": 0.0, 261 | "colorMode": 1, 262 | "blendMode": 1, 263 | "gradient": 259.1999942064285, 264 | "fixedColor/brightness": 100.0, 265 | "fixedColor/saturation": 100.0, 266 | "fixedColor/hue": 0.0, 267 | "xMode": 0, 268 | "yMode": 0, 269 | "zMode": 0, 270 | "paletteIndex": 1, 271 | "paletteStops": 5 272 | }, 273 | "children": { 274 | "modulation": { 275 | "id": 49, 276 | "class": "heronarts.lx.modulation.LXModulationEngine", 277 | "internal": { 278 | "modulationColor": 0 279 | }, 280 | "parameters": { 281 | "label": "Modulation" 282 | }, 283 | "children": {}, 284 | "modulators": [], 285 | "modulations": [], 286 | "triggers": [] 287 | } 288 | }, 289 | "deviceVersion": -1 290 | } 291 | ] 292 | } 293 | ] 294 | }, 295 | "modulation": { 296 | "id": 21, 297 | "class": "heronarts.lx.modulation.LXModulationEngine", 298 | "internal": { 299 | "modulationColor": 0 300 | }, 301 | "parameters": { 302 | "label": "Modulation" 303 | }, 304 | "children": {}, 305 | "modulators": [ 306 | { 307 | "id": 50, 308 | "class": "heronarts.lx.modulator.VariableLFO", 309 | "internal": { 310 | "modulationColor": 0 311 | }, 312 | "parameters": { 313 | "label": "LFO", 314 | "running": true, 315 | "trigger": false, 316 | "loop": true, 317 | "tempoSync": false, 318 | "tempoMultiplier": 5, 319 | "tempoLock": true, 320 | "clockMode": 0, 321 | "periodFast": 13686.227444543054, 322 | "periodSlow": 10000.0, 323 | "wave": 0, 324 | "skew": 0.0, 325 | "shape": 0.0, 326 | "phase": 0.0, 327 | "exp": 0.0 328 | }, 329 | "children": {}, 330 | "basis": 0.5398763070545498 331 | } 332 | ], 333 | "modulations": [ 334 | { 335 | "source": { 336 | "id": 50, 337 | "path": "/modulation/modulator/1" 338 | }, 339 | "target": { 340 | "componentId": 48, 341 | "parameterPath": "xAmount", 342 | "path": "/mixer/channel/1/pattern/1/xAmount" 343 | }, 344 | "id": 51, 345 | "class": "heronarts.lx.modulation.LXCompoundModulation", 346 | "internal": { 347 | "modulationColor": 0 348 | }, 349 | "parameters": { 350 | "label": "LX", 351 | "enabled": true, 352 | "Polarity": 0, 353 | "Range": -0.6500000339001417 354 | }, 355 | "children": {} 356 | } 357 | ], 358 | "triggers": [] 359 | }, 360 | "output": { 361 | "id": 22, 362 | "class": "heronarts.lx.LXEngine$Output", 363 | "internal": { 364 | "modulationColor": 0 365 | }, 366 | "parameters": { 367 | "label": "Output", 368 | "enabled": true, 369 | "fps": 0.0, 370 | "gamma": 1.0, 371 | "brightness": 1.0 372 | }, 373 | "children": {} 374 | }, 375 | "midi": { 376 | "id": 24, 377 | "class": "heronarts.lx.midi.LXMidiEngine", 378 | "internal": { 379 | "modulationColor": 0 380 | }, 381 | "parameters": { 382 | "label": "LX", 383 | "computerKeyboardEnabled": false 384 | }, 385 | "children": {}, 386 | "inputs": [], 387 | "surfaces": [], 388 | "mapping": [] 389 | }, 390 | "audio": { 391 | "id": 25, 392 | "class": "heronarts.lx.audio.LXAudioEngine", 393 | "internal": { 394 | "modulationColor": 0 395 | }, 396 | "parameters": { 397 | "label": "Audio", 398 | "enabled": false, 399 | "mode": 0 400 | }, 401 | "children": { 402 | "input": { 403 | "id": 26, 404 | "class": "heronarts.lx.audio.LXAudioInput", 405 | "internal": { 406 | "modulationColor": 0 407 | }, 408 | "parameters": { 409 | "label": "Input", 410 | "device": 0 411 | }, 412 | "children": {} 413 | }, 414 | "output": { 415 | "id": 27, 416 | "class": "heronarts.lx.audio.LXAudioOutput", 417 | "internal": { 418 | "modulationColor": 0 419 | }, 420 | "parameters": { 421 | "label": "Output", 422 | "file": "", 423 | "trigger": false, 424 | "looping": false, 425 | "play": false 426 | }, 427 | "children": {} 428 | }, 429 | "meter": { 430 | "id": 28, 431 | "class": "heronarts.lx.audio.GraphicMeter", 432 | "internal": { 433 | "modulationColor": 0 434 | }, 435 | "parameters": { 436 | "label": "Meter", 437 | "running": false, 438 | "trigger": false, 439 | "gain": 0.0, 440 | "range": 48.0, 441 | "attack": 10.0, 442 | "release": 100.0, 443 | "slope": 4.5, 444 | "band-1": 0.0, 445 | "band-2": 0.0, 446 | "band-3": 0.0, 447 | "band-4": 0.0, 448 | "band-5": 0.0, 449 | "band-6": 0.0, 450 | "band-7": 0.0, 451 | "band-8": 0.0, 452 | "band-9": 0.0, 453 | "band-10": 0.0, 454 | "band-11": 0.0, 455 | "band-12": 0.0, 456 | "band-13": 0.0, 457 | "band-14": 0.0, 458 | "band-15": 0.0, 459 | "band-16": 0.0 460 | }, 461 | "children": {} 462 | } 463 | } 464 | }, 465 | "osc": { 466 | "id": 29, 467 | "class": "heronarts.lx.osc.LXOscEngine", 468 | "internal": { 469 | "modulationColor": 0 470 | }, 471 | "parameters": { 472 | "label": "OSC", 473 | "receiveHost": "0.0.0.0", 474 | "receivePort": 3030, 475 | "receiveActive": false, 476 | "transmitHost": "localhost", 477 | "transmitPort": 3131, 478 | "transmitActive": false 479 | }, 480 | "children": {} 481 | }, 482 | "snapshots": { 483 | "id": 30, 484 | "class": "heronarts.lx.snapshot.LXSnapshotEngine", 485 | "internal": { 486 | "modulationColor": 0 487 | }, 488 | "parameters": { 489 | "label": "Snapshots", 490 | "recallMixer": true, 491 | "recallModulation": true, 492 | "transitionEnabled": false, 493 | "transitionTimeSecs": 5.0 494 | }, 495 | "children": {}, 496 | "snapshots": [] 497 | } 498 | } 499 | }, 500 | "externals": { 501 | "ui": { 502 | "audioExpanded": true, 503 | "paletteExpanded": true, 504 | "cameraExpanded": true, 505 | "clipViewVisible": false, 506 | "modulatorExpanded": { 507 | "50": true 508 | }, 509 | "preview": { 510 | "mode": 0, 511 | "animation": false, 512 | "animationTime": 1000.0, 513 | "projection": 0, 514 | "perspective": 60.0, 515 | "depth": 1.0, 516 | "phiLock": true, 517 | "centerPoint": false, 518 | "camera": { 519 | "active": false, 520 | "radius": 348.3938660909729, 521 | "theta": -0.16303157852962613, 522 | "phi": 0.007763408590108156, 523 | "x": 0.0, 524 | "y": 115.0, 525 | "z": 0.0 526 | }, 527 | "cue": [ 528 | { 529 | "active": false, 530 | "radius": 348.3938660909729, 531 | "theta": -0.16303157852962613, 532 | "phi": 0.007763408590108156, 533 | "x": 0.0, 534 | "y": 115.0, 535 | "z": 0.0 536 | }, 537 | { 538 | "active": false, 539 | "radius": 120.0, 540 | "theta": 0.0, 541 | "phi": 0.0, 542 | "x": 0.0, 543 | "y": 0.0, 544 | "z": 0.0 545 | }, 546 | { 547 | "active": false, 548 | "radius": 120.0, 549 | "theta": 0.0, 550 | "phi": 0.0, 551 | "x": 0.0, 552 | "y": 0.0, 553 | "z": 0.0 554 | }, 555 | { 556 | "active": false, 557 | "radius": 120.0, 558 | "theta": 0.0, 559 | "phi": 0.0, 560 | "x": 0.0, 561 | "y": 0.0, 562 | "z": 0.0 563 | }, 564 | { 565 | "active": false, 566 | "radius": 120.0, 567 | "theta": 0.0, 568 | "phi": 0.0, 569 | "x": 0.0, 570 | "y": 0.0, 571 | "z": 0.0 572 | }, 573 | { 574 | "active": false, 575 | "radius": 120.0, 576 | "theta": 0.0, 577 | "phi": 0.0, 578 | "x": 0.0, 579 | "y": 0.0, 580 | "z": 0.0 581 | } 582 | ], 583 | "focus": 0, 584 | "pointCloud": { 585 | "pointSize": 3.0 586 | }, 587 | "grid": { 588 | "visible": false, 589 | "spacing": 100.0, 590 | "planes": 1, 591 | "size": 10, 592 | "x": 0.0, 593 | "y": 0.0, 594 | "z": 0.0 595 | } 596 | } 597 | } 598 | } 599 | } --------------------------------------------------------------------------------