diff --git a/LICENSE b/LICENSE index f9aee0b..043075f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2026 Daniel Trujillo +Copyright (c) 2026 Daniel Joaquin Trujillo and GANTASMO Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 86f6be8..33ad0c0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,35 @@ ![SwayCommand](docs/media/banner.webp) -![license MIT](https://img.shields.io/badge/license-MIT-2de1fc?style=flat-square&labelColor=0b0f17) -![Electron 43](https://img.shields.io/badge/electron-43-2de1fc?style=flat-square&labelColor=0b0f17) -![three.js r185](https://img.shields.io/badge/three.js-r185-2de1fc?style=flat-square&labelColor=0b0f17) -![GLSL3](https://img.shields.io/badge/shaders-GLSL3-ff2d95?style=flat-square&labelColor=0b0f17) -![platform windows macos linux](https://img.shields.io/badge/platform-windows%20macos%20linux-2de1fc?style=flat-square&labelColor=0b0f17) +**by [GANTASMO](https://gantasmo.com)** + +[![Electron 43](https://img.shields.io/badge/Electron-43-2de1fc?style=flat-square&labelColor=0b0f17&logo=electron&logoColor=white)](https://www.electronjs.org) +[![three.js r185](https://img.shields.io/badge/three.js-r185-2de1fc?style=flat-square&labelColor=0b0f17&logo=threedotjs&logoColor=white)](https://threejs.org) +[![GLSL3 on WebGL2](https://img.shields.io/badge/shaders-GLSL3%20on%20WebGL2-2de1fc?style=flat-square&labelColor=0b0f17&logo=webgl&logoColor=white)](docs/SCENE_CONTRACT.md) +![Web Audio and AudioWorklet](https://img.shields.io/badge/audio-Web%20Audio%20%2B%20AudioWorklet-2de1fc?style=flat-square&labelColor=0b0f17) +[![16 procedural scenes](https://img.shields.io/badge/scenes-16%20procedural-ff2d95?style=flat-square&labelColor=0b0f17)](#scenes) + +[![hardware Audima Sway](https://img.shields.io/badge/hardware-Audima%20Sway-ff2d95?style=flat-square&labelColor=0b0f17)](https://audima.com.au) +![platform Windows macOS Linux](https://img.shields.io/badge/platform-Windows%20%2F%20macOS%20%2F%20Linux-2de1fc?style=flat-square&labelColor=0b0f17&logo=windows&logoColor=white) +[![companion theDAW](https://img.shields.io/badge/companion-theDAW-7C3AED?style=flat-square&labelColor=0b0f17&logo=github&logoColor=white)](https://github.com/gantasmo/theDAW) +[![license MIT](https://img.shields.io/badge/license-MIT-2de1fc?style=flat-square&labelColor=0b0f17)](LICENSE) +![status active development](https://img.shields.io/badge/status-active%20development-F4A261?style=flat-square&labelColor=0b0f17) + +[![Listen on Spotify](https://img.shields.io/badge/Listen-Spotify-1DB954?style=flat-square&labelColor=0b0f17&logo=spotify&logoColor=white)](https://open.spotify.com/artist/4q5n0QgK6mvyuw8FRzhuNA) +[![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?style=flat-square&labelColor=0b0f17&logo=youtube&logoColor=white)](https://www.youtube.com/@GANTASMO) +[![Follow @gantasmo on Instagram](https://img.shields.io/badge/Follow-%40gantasmo-E4405F?style=flat-square&labelColor=0b0f17&logo=instagram&logoColor=white)](https://www.instagram.com/gantasmo) +[![Follow @gantasmo on X](https://img.shields.io/badge/Follow-%40gantasmo-000000?style=flat-square&labelColor=0b0f17&logo=x&logoColor=white)](https://x.com/gantasmo) +[![Learn more at gantasmo.com](https://img.shields.io/badge/Learn%20More-gantasmo.com-7C3AED?style=flat-square&labelColor=0b0f17&logo=googlechrome&logoColor=white)](https://gantasmo.com) + +> **GANTASMO** is an amorphous entity by [Daniel Joaquin Trujillo](https://github.com/danieljtrujillo) +> and [Josh Valenzuela](https://github.com/StarskreamEXE) that defies conventional +> classification. We make thought provoking, highly technical, yet listenable music +> inspired by the underappreciated pioneers of modern music. Beyond musical composition +> and performance, GANTASMO is a powerhouse of research and development in the fields +> Artificial Intelligence, Augmented Reality, Virtual Reality, the democratization of +> musical tools and education, and the preservation and evolution of musical history +> and traditions predating modern recording infrastructure. + +--- SwayCommand is a desktop VJ instrument built around the Audima Labs Sway, a gesture MIDI controller whose sixteen infrared sensors read hand positions in @@ -316,10 +341,24 @@ header. ## Legal -SwayCommand is released under the [MIT license](LICENSE). "Sway" and "Audima -Labs" are the property of Audima Labs Pty Ltd. In accordance with Audima's terms +SwayCommand is released under the [MIT license](LICENSE), copyright 2026 Daniel +Joaquin Trujillo and GANTASMO. Derived files stay under their own licenses and +carry the upstream notice in their headers. "Sway" and "Audima Labs" are the +property of Audima Labs Pty Ltd. In accordance with Audima's terms and conditions the application bundles no Audima software: the Doctor downloads the official driver package and companion application directly from `cdn.audima.com.au` onto the local machine, and verifies the companion application against Audima's published minisign signature before opening the installer. + +--- + +[![Listen on Spotify](https://img.shields.io/badge/Listen-Spotify-1DB954?style=flat-square&labelColor=0b0f17&logo=spotify&logoColor=white)](https://open.spotify.com/artist/4q5n0QgK6mvyuw8FRzhuNA) +[![Watch on YouTube](https://img.shields.io/badge/Watch-YouTube-FF0000?style=flat-square&labelColor=0b0f17&logo=youtube&logoColor=white)](https://www.youtube.com/@GANTASMO) +[![Follow @gantasmo on Instagram](https://img.shields.io/badge/Follow-%40gantasmo-E4405F?style=flat-square&labelColor=0b0f17&logo=instagram&logoColor=white)](https://www.instagram.com/gantasmo) +[![Follow @gantasmo on X](https://img.shields.io/badge/Follow-%40gantasmo-000000?style=flat-square&labelColor=0b0f17&logo=x&logoColor=white)](https://x.com/gantasmo) +[![Learn more at gantasmo.com](https://img.shields.io/badge/Learn%20More-gantasmo.com-7C3AED?style=flat-square&labelColor=0b0f17&logo=googlechrome&logoColor=white)](https://gantasmo.com) + +Made by [Daniel Joaquin Trujillo](https://github.com/danieljtrujillo) and +[Josh Valenzuela](https://github.com/StarskreamEXE) as +[GANTASMO](https://gantasmo.com). diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 34a234a..4c2c3e3 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -153,6 +153,13 @@ Navigation and window creation are locked down for every web contents the applic | `synesthesia.live` | | `elektronauts.com` | | `indiegogo.com` | +| `gantasmo.com` | +| `spotify.com` | +| `youtube.com` | +| `instagram.com` | +| `x.com` | +| `electronjs.org` | +| `threejs.org` | The list covers the application's own endpoints plus every host cited by the bundled documentation, so a link followed in the documentation viewer resolves without widening the policy to arbitrary URLs. `cdn.audima.com.au` has no entry of its own: the subdomain rule admits it under `audima.com.au`. The same predicate guards the `shell:openExternal` IPC channel, which is the only path the viewer has to the system browser. diff --git a/docs/OVERVIEW.md b/docs/OVERVIEW.md index 24e7eef..cd982bf 100644 --- a/docs/OVERVIEW.md +++ b/docs/OVERVIEW.md @@ -100,7 +100,7 @@ The application fetches from Audima's hosts only: All requests to Audima hosts carry the User-Agent `SwayCommand/0.1 (Sway companion; +https://github.com/swaycommand)`; the CDN rejects generic tool User-Agents. Requests to any other host are refused by the download layer, and renderer navigation is disabled entirely. The application collects no telemetry and writes no data outside its own settings directory, the Downloads folder (user-initiated), the user's chosen project locations, and a driver cache under the settings directory. -Handing a link to the system browser is the second, user-initiated path outward. `shell.openExternal` accepts an `https` URL only when its hostname matches an entry in `EXTERNAL_ALLOW` in `src/main/main.js`, or is a subdomain of one: `audima.com.au`, `github.com`, `githubusercontent.com`, `nodejs.org`, `community.polyexpression.com`, `discord.com`, `vidvox.net`, `huggingface.co`, `unity.com`, `resolume.com`, `st3nd.com`, `serato.com`, `synesthesia.live`, `elektronauts.com`, `indiegogo.com`. The list covers the hosts cited by the bundled documentation, so links in the documentation modal resolve without widening the policy to arbitrary URLs. A link outside the list is refused; the modal then shows an inline notice naming the URL so the reader can open it manually. +Handing a link to the system browser is the second, user-initiated path outward. `shell.openExternal` accepts an `https` URL only when its hostname matches an entry in `EXTERNAL_ALLOW` in `src/main/main.js`, or is a subdomain of one: `audima.com.au`, `github.com`, `githubusercontent.com`, `nodejs.org`, `community.polyexpression.com`, `discord.com`, `vidvox.net`, `huggingface.co`, `unity.com`, `resolume.com`, `st3nd.com`, `serato.com`, `synesthesia.live`, `elektronauts.com`, `indiegogo.com`, `gantasmo.com`, `spotify.com`, `youtube.com`, `instagram.com`, `x.com`, `electronjs.org`, `threejs.org`. The list covers the hosts cited by the bundled documentation, so links in the documentation modal resolve without widening the policy to arbitrary URLs. A link outside the list is refused; the modal then shows an inline notice naming the URL so the reader can open it manually. ## Data locations diff --git a/docs/media/README.md b/docs/media/README.md index 622ea79..d203ede 100644 --- a/docs/media/README.md +++ b/docs/media/README.md @@ -38,10 +38,12 @@ The PNGs are then scaled and re-encoded to WebP at quality 0.80 (0.86 for the hero) through a canvas in the same Electron runtime. There is no native image dependency in this tree. -Cold-cache warning: on a GPU shader cache that has never seen these scenes, -`miraclemile` and `naturestomb` block the calling thread for one to two minutes -on their first draw. That is the open compile regression recorded in -[HANDOFF.md](../../HANDOFF.md), not a harness fault. A second run is fast. +The plan's `electronArgs` mirror the two switches `src/main/main.js` sets, +`--use-angle=gl` and `--gpu-program-cache-size-kb=524288`, so the stills render +on the backend the application actually uses. Both matter here: without them the +harness falls back to ANGLE's D3D11 path, where fxc unrolls the constant-trip +loops in the largest shaders and the first draw of `naturestomb` costs 135 s +against 5.2 s on GL, and `miraclemile` 103 s against 3.7 s. ## Replacing a still with a recording diff --git a/docs/media/banner.webp b/docs/media/banner.webp index fb7b0b1..2e737c4 100644 Binary files a/docs/media/banner.webp and b/docs/media/banner.webp differ diff --git a/docs/media/gallery.plan.json b/docs/media/gallery.plan.json index 3e3895e..a31315f 100644 --- a/docs/media/gallery.plan.json +++ b/docs/media/gallery.plan.json @@ -1,5 +1,9 @@ { - "_comment": "Scene-harness plan behind docs/media/scenes/*.webp. See docs/media/README.md. Shots whose name starts with an underscore only set up the state the next shot photographs; their own PNGs are discarded.", + "_comment": "Scene-harness plan behind docs/media/scenes/*.webp. See docs/media/README.md. electronArgs mirror the switches src/main/main.js sets, so the stills render on the backend the application actually uses. Shots whose name starts with an underscore only set up the state the next shot photographs; their own PNGs are discarded.", + "electronArgs": [ + "--gpu-program-cache-size-kb=524288", + "--use-angle=gl" + ], "width": 1280, "height": 720, "tier": "high", @@ -10,15 +14,41 @@ "frames": 260, "dt": 0.01667, "io": { - "palette": ["#ff2d95", "#7a0bc0", "#2de1fc", "#f9f871", "#ff6b35"], - "knobs": { "3": 0.55 }, + "palette": [ + "#ff2d95", + "#7a0bc0", + "#2de1fc", + "#f9f871", + "#ff6b35" + ], + "knobs": { + "3": 0.55 + }, "level": 0.62, - "bands": { "bass": 0.78, "mid": 0.52, "high": 0.44 }, + "bands": { + "bass": 0.78, + "mid": 0.52, + "high": 0.44 + }, "beat": 0.85, - "xy": { "x": 0.5, "y": 0.62 }, - "gestures": { "pulse": 0.4, "press": 0.15, "sway": 0.3 }, - "strikes": [2, 6, 11], - "transport": { "playing": true, "time": 8 } + "xy": { + "x": 0.5, + "y": 0.62 + }, + "gestures": { + "pulse": 0.4, + "press": 0.15, + "sway": 0.3 + }, + "strikes": [ + 2, + 6, + 11 + ], + "transport": { + "playing": true, + "time": 8 + } } }, { @@ -27,14 +57,34 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#4d1bff", "#00c2ff", "#ff2fb9", "#08f7fe", "#ffe66d"], + "palette": [ + "#4d1bff", + "#00c2ff", + "#ff2fb9", + "#08f7fe", + "#ffe66d" + ], "level": 0.6, - "bands": { "bass": 0.72, "mid": 0.5, "high": 0.4 }, + "bands": { + "bass": 0.72, + "mid": 0.5, + "high": 0.4 + }, "beat": 0.7, - "xy": { "x": 0.62, "y": 0.58 }, - "gestures": { "sway": 0.34, "press": 0.2, "pulse": 0.5 }, + "xy": { + "x": 0.62, + "y": 0.58 + }, + "gestures": { + "sway": 0.34, + "press": 0.2, + "pulse": 0.5 + }, "strike": 4, - "transport": { "playing": true, "time": 12 } + "transport": { + "playing": true, + "time": 12 + } } }, { @@ -43,13 +93,33 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#ff2d95", "#7a0bc0", "#2de1fc", "#f9f871", "#ff6b35"], + "palette": [ + "#ff2d95", + "#7a0bc0", + "#2de1fc", + "#f9f871", + "#ff6b35" + ], "level": 0.8, - "bands": { "bass": 0.82, "mid": 0.9, "high": 0.5 }, + "bands": { + "bass": 0.82, + "mid": 0.9, + "high": 0.5 + }, "beat": 0.7, - "xy": { "x": 0.5, "y": 0.55 }, - "gestures": { "sway": 0.12, "press": 0.62, "pulse": 0.6 }, - "transport": { "playing": true, "time": 14 } + "xy": { + "x": 0.5, + "y": 0.55 + }, + "gestures": { + "sway": 0.12, + "press": 0.62, + "pulse": 0.6 + }, + "transport": { + "playing": true, + "time": 14 + } } }, { @@ -57,7 +127,13 @@ "scene": "ribbons", "frames": 34, "dt": 0.01667, - "io": { "beat": 0.95, "strikes": [3, 11] } + "io": { + "beat": 0.95, + "strikes": [ + 3, + 11 + ] + } }, { "name": "voxels", @@ -65,14 +141,36 @@ "frames": 260, "dt": 0.01667, "io": { - "palette": ["#ffb300", "#ff6f00", "#8d5524", "#fff3c4", "#e63946"], + "palette": [ + "#ffb300", + "#ff6f00", + "#8d5524", + "#fff3c4", + "#e63946" + ], "level": 0.6, - "bands": { "bass": 0.8, "mid": 0.45, "high": 0.3 }, + "bands": { + "bass": 0.8, + "mid": 0.45, + "high": 0.3 + }, "beat": 0.9, - "xy": { "x": 0.62, "y": 0.55 }, - "gestures": { "press": 0.1, "pulse": 0.5 }, - "strikes": [3, 9], - "transport": { "playing": true, "time": 6 } + "xy": { + "x": 0.62, + "y": 0.55 + }, + "gestures": { + "press": 0.1, + "pulse": 0.5 + }, + "strikes": [ + 3, + 9 + ], + "transport": { + "playing": true, + "time": 6 + } } }, { @@ -81,14 +179,34 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#4d1bff", "#00c2ff", "#ff2fb9", "#08f7fe", "#ffe66d"], + "palette": [ + "#4d1bff", + "#00c2ff", + "#ff2fb9", + "#08f7fe", + "#ffe66d" + ], "level": 0.34, - "bands": { "bass": 0.4, "mid": 0.36, "high": 0.3 }, + "bands": { + "bass": 0.4, + "mid": 0.36, + "high": 0.3 + }, "beat": 0.2, - "xy": { "x": 0.5, "y": 0.5 }, - "gestures": { "sway": 0.55, "press": 0.12, "pulse": 0.15 }, + "xy": { + "x": 0.5, + "y": 0.5 + }, + "gestures": { + "sway": 0.55, + "press": 0.12, + "pulse": 0.15 + }, "strike": 6, - "transport": { "playing": true, "time": 22 } + "transport": { + "playing": true, + "time": 22 + } } }, { @@ -97,15 +215,40 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#4d1bff", "#00c2ff", "#ff2fb9", "#08f7fe", "#ffe66d"], - "knobs": { "3": 0.5, "4": 0.45, "5": 0.6, "6": 0.5, "7": 0.5 }, + "palette": [ + "#4d1bff", + "#00c2ff", + "#ff2fb9", + "#08f7fe", + "#ffe66d" + ], + "knobs": { + "3": 0.5, + "4": 0.45, + "5": 0.6, + "6": 0.5, + "7": 0.5 + }, "level": 0.55, - "bands": { "bass": 0.6, "mid": 0.5, "high": 0.45 }, + "bands": { + "bass": 0.6, + "mid": 0.5, + "high": 0.45 + }, "beat": 0.5, - "xy": { "x": 0.55, "y": 0.52 }, - "gestures": { "sway": 0.42, "press": 0.25 }, + "xy": { + "x": 0.55, + "y": 0.52 + }, + "gestures": { + "sway": 0.42, + "press": 0.25 + }, "strike": 0, - "transport": { "playing": true, "time": 16 } + "transport": { + "playing": true, + "time": 16 + } } }, { @@ -114,15 +257,38 @@ "frames": 280, "dt": 0.01667, "io": { - "palette": ["#ffffff", "#9bf6ff", "#4361ee", "#7209b7", "#f72585"], - "knobs": { "3": 0.55, "4": 0.62 }, + "palette": [ + "#ffffff", + "#9bf6ff", + "#4361ee", + "#7209b7", + "#f72585" + ], + "knobs": { + "3": 0.55, + "4": 0.62 + }, "level": 0.6, - "bands": { "bass": 0.55, "mid": 0.66, "high": 0.6 }, + "bands": { + "bass": 0.55, + "mid": 0.66, + "high": 0.6 + }, "beat": 0.7, - "xy": { "x": 0.58, "y": 0.55 }, - "gestures": { "sway": 0.35, "press": 0.12, "pulse": 0.5 }, + "xy": { + "x": 0.58, + "y": 0.55 + }, + "gestures": { + "sway": 0.35, + "press": 0.12, + "pulse": 0.5 + }, "strike": 5, - "transport": { "playing": true, "time": 9 } + "transport": { + "playing": true, + "time": 9 + } } }, { @@ -131,13 +297,35 @@ "frames": 90, "dt": 0.01667, "io": { - "palette": ["#39ff14", "#0affef", "#ff3131", "#cfff04", "#7df9ff"], - "knobs": { "3": 0.5, "4": 0.6, "5": 0.5, "6": 0.5, "7": 0.6 }, + "palette": [ + "#39ff14", + "#0affef", + "#ff3131", + "#cfff04", + "#7df9ff" + ], + "knobs": { + "3": 0.5, + "4": 0.6, + "5": 0.5, + "6": 0.5, + "7": 0.6 + }, "level": 0.35, - "bands": { "bass": 0.7, "mid": 0.25, "high": 0.12 }, + "bands": { + "bass": 0.7, + "mid": 0.25, + "high": 0.12 + }, "beat": 0.8, - "xy": { "x": 0.5, "y": 0.5 }, - "transport": { "playing": true, "time": 2 } + "xy": { + "x": 0.5, + "y": 0.5 + }, + "transport": { + "playing": true, + "time": 2 + } } }, { @@ -145,21 +333,45 @@ "scene": "spectra", "frames": 70, "dt": 0.01667, - "io": { "level": 0.7, "bands": { "bass": 0.4, "mid": 0.8, "high": 0.55 }, "beat": 0.3 } + "io": { + "level": 0.7, + "bands": { + "bass": 0.4, + "mid": 0.8, + "high": 0.55 + }, + "beat": 0.3 + } }, { "name": "_spectra_high", "scene": "spectra", "frames": 70, "dt": 0.01667, - "io": { "level": 0.5, "bands": { "bass": 0.85, "mid": 0.35, "high": 0.7 }, "beat": 0.9 } + "io": { + "level": 0.5, + "bands": { + "bass": 0.85, + "mid": 0.35, + "high": 0.7 + }, + "beat": 0.9 + } }, { "name": "spectra", "scene": "spectra", "frames": 60, "dt": 0.01667, - "io": { "level": 0.68, "bands": { "bass": 0.6, "mid": 0.62, "high": 0.5 }, "beat": 0.6 } + "io": { + "level": 0.68, + "bands": { + "bass": 0.6, + "mid": 0.62, + "high": 0.5 + }, + "beat": 0.6 + } }, { "name": "_vjshader_pick", @@ -167,14 +379,39 @@ "frames": 120, "dt": 0.01667, "io": { - "palette": ["#080416", "#00c2ff", "#ff2fb9", "#4d1bff", "#ffe66d"], - "knobs": { "3": 0.38, "4": 0.5, "5": 0.44, "6": 0.5, "7": 0.35 }, + "palette": [ + "#080416", + "#00c2ff", + "#ff2fb9", + "#4d1bff", + "#ffe66d" + ], + "knobs": { + "3": 0.38, + "4": 0.5, + "5": 0.44, + "6": 0.5, + "7": 0.35 + }, "level": 0.5, - "bands": { "bass": 0.55, "mid": 0.45, "high": 0.4 }, + "bands": { + "bass": 0.55, + "mid": 0.45, + "high": 0.4 + }, "beat": 0.4, - "xy": { "x": 0.5, "y": 0.5 }, - "strikes": [3, 12], - "transport": { "playing": true, "time": 11 } + "xy": { + "x": 0.5, + "y": 0.5 + }, + "strikes": [ + 3, + 12 + ], + "transport": { + "playing": true, + "time": 11 + } } }, { @@ -182,7 +419,14 @@ "scene": "vjshader", "frames": 220, "dt": 0.01667, - "io": { "gestures": { "sway": 0.3, "press": 0.28 }, "beat": 0.5, "level": 0.58 } + "io": { + "gestures": { + "sway": 0.3, + "press": 0.28 + }, + "beat": 0.5, + "level": 0.58 + } }, { "name": "ferrofluid", @@ -190,14 +434,34 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#12002a", "#ff2d95", "#2de1fc", "#7a0bc0", "#fff3c4"], + "palette": [ + "#12002a", + "#ff2d95", + "#2de1fc", + "#7a0bc0", + "#fff3c4" + ], "level": 0.72, - "bands": { "bass": 0.85, "mid": 0.6, "high": 0.62 }, + "bands": { + "bass": 0.85, + "mid": 0.6, + "high": 0.62 + }, "beat": 0.8, - "xy": { "x": 0.58, "y": 0.5 }, - "gestures": { "sway": 0.3, "press": 0.12, "pulse": 0.6 }, + "xy": { + "x": 0.58, + "y": 0.5 + }, + "gestures": { + "sway": 0.3, + "press": 0.12, + "pulse": 0.6 + }, "strike": 6, - "transport": { "playing": true, "time": 13 } + "transport": { + "playing": true, + "time": 13 + } } }, { @@ -206,14 +470,34 @@ "frames": 300, "dt": 0.01667, "io": { - "palette": ["#04121c", "#2de1fc", "#ff2d95", "#0f4c5c", "#e0fbfc"], + "palette": [ + "#04121c", + "#2de1fc", + "#ff2d95", + "#0f4c5c", + "#e0fbfc" + ], "level": 0.66, - "bands": { "bass": 0.6, "mid": 0.72, "high": 0.62 }, + "bands": { + "bass": 0.6, + "mid": 0.72, + "high": 0.62 + }, "beat": 0.65, - "xy": { "x": 0.5, "y": 0.55 }, - "gestures": { "sway": 0.4, "press": 0.18, "pulse": 0.45 }, + "xy": { + "x": 0.5, + "y": 0.55 + }, + "gestures": { + "sway": 0.4, + "press": 0.18, + "pulse": 0.45 + }, "strike": 10, - "transport": { "playing": true, "time": 15 } + "transport": { + "playing": true, + "time": 15 + } } }, { @@ -222,13 +506,33 @@ "frames": 420, "dt": 0.01667, "io": { - "palette": ["#3c1053", "#ffc371", "#a83279", "#ff5f6d", "#ffd9e8"], + "palette": [ + "#3c1053", + "#ffc371", + "#a83279", + "#ff5f6d", + "#ffd9e8" + ], "level": 0.55, - "bands": { "bass": 0.6, "mid": 0.48, "high": 0.38 }, + "bands": { + "bass": 0.6, + "mid": 0.48, + "high": 0.38 + }, "beat": 0.5, - "xy": { "x": 0.5, "y": 0.44 }, - "gestures": { "sway": 0.2, "press": 0.08, "pulse": 0.3 }, - "transport": { "playing": true, "time": 20 } + "xy": { + "x": 0.5, + "y": 0.44 + }, + "gestures": { + "sway": 0.2, + "press": 0.08, + "pulse": 0.3 + }, + "transport": { + "playing": true, + "time": 20 + } } }, { @@ -237,14 +541,34 @@ "frames": 400, "dt": 0.01667, "io": { - "palette": ["#4d1bff", "#00c2ff", "#ff2fb9", "#08f7fe", "#ffe66d"], + "palette": [ + "#4d1bff", + "#00c2ff", + "#ff2fb9", + "#08f7fe", + "#ffe66d" + ], "level": 0.6, - "bands": { "bass": 0.7, "mid": 0.55, "high": 0.48 }, + "bands": { + "bass": 0.7, + "mid": 0.55, + "high": 0.48 + }, "beat": 0.7, - "xy": { "x": 0.56, "y": 0.55 }, - "gestures": { "sway": 0.3, "press": 0.15, "pulse": 0.5 }, + "xy": { + "x": 0.56, + "y": 0.55 + }, + "gestures": { + "sway": 0.3, + "press": 0.15, + "pulse": 0.5 + }, "strike": 3, - "transport": { "playing": true, "time": 18 } + "transport": { + "playing": true, + "time": 18 + } } }, { @@ -253,12 +577,28 @@ "frames": 620, "dt": 0.01667, "io": { - "palette": ["#ffffff", "#9bf6ff", "#4361ee", "#7209b7", "#f72585"], + "palette": [ + "#ffffff", + "#9bf6ff", + "#4361ee", + "#7209b7", + "#f72585" + ], "level": 0.55, - "bands": { "bass": 0.6, "mid": 0.5, "high": 0.45 }, + "bands": { + "bass": 0.6, + "mid": 0.5, + "high": 0.45 + }, "beat": 0.6, - "xy": { "x": 0.5, "y": 0.5 }, - "transport": { "playing": true, "time": 0 } + "xy": { + "x": 0.5, + "y": 0.5 + }, + "transport": { + "playing": true, + "time": 0 + } } }, { @@ -268,12 +608,28 @@ "dt": 0.01667, "io": { "level": 0.65, - "bands": { "bass": 0.75, "mid": 0.55, "high": 0.5 }, + "bands": { + "bass": 0.75, + "mid": 0.55, + "high": 0.5 + }, "beat": 0.8, - "xy": { "x": 0.54, "y": 0.52 }, - "gestures": { "sway": 0.35, "press": 0.2, "pulse": 0.6 }, - "actions": ["hyperspace"], - "transport": { "playing": true, "time": 10 } + "xy": { + "x": 0.54, + "y": 0.52 + }, + "gestures": { + "sway": 0.35, + "press": 0.2, + "pulse": 0.6 + }, + "actions": [ + "hyperspace" + ], + "transport": { + "playing": true, + "time": 10 + } } }, { @@ -282,11 +638,28 @@ "frames": 60, "dt": 0.01667, "io": { - "palette": ["#0f4c5c", "#5bc0be", "#9bf6ff", "#3a506b", "#e0fbfc"], - "knobs": { "4": 0.1, "5": 0.02, "6": 0.3 }, + "palette": [ + "#0f4c5c", + "#5bc0be", + "#9bf6ff", + "#3a506b", + "#e0fbfc" + ], + "knobs": { + "4": 0.1, + "5": 0.02, + "6": 0.3 + }, "level": 0.5, - "bands": { "bass": 0.5, "mid": 0.45, "high": 0.4 }, - "transport": { "playing": true, "time": 1 } + "bands": { + "bass": 0.5, + "mid": 0.45, + "high": 0.4 + }, + "transport": { + "playing": true, + "time": 1 + } } }, { @@ -295,12 +668,25 @@ "frames": 420, "dt": 0.01667, "io": { - "knobs": { "4": 0.7, "5": 0.15, "6": 0.35 }, + "knobs": { + "4": 0.7, + "5": 0.15, + "6": 0.35 + }, "level": 0.6, - "bands": { "bass": 0.62, "mid": 0.55, "high": 0.45 }, + "bands": { + "bass": 0.62, + "mid": 0.55, + "high": 0.45 + }, "beat": 0.6, - "gestures": { "sway": 0.3 }, - "strikes": [2, 7] + "gestures": { + "sway": 0.3 + }, + "strikes": [ + 2, + 7 + ] } }, { @@ -308,7 +694,16 @@ "scene": "naturestomb", "frames": 300, "dt": 0.01667, - "io": { "knobs": { "4": 0.9 }, "level": 0.62, "beat": 0.7, "strikes": [4] } + "io": { + "knobs": { + "4": 0.9 + }, + "level": 0.62, + "beat": 0.7, + "strikes": [ + 4 + ] + } }, { "name": "_miraclemile_open", @@ -316,11 +711,27 @@ "frames": 90, "dt": 0.01667, "io": { - "palette": ["#2b0a1e", "#ffc371", "#ff5f6d", "#a83279", "#ffe9c9"], - "knobs": { "4": 0.3, "5": 0.05 }, + "palette": [ + "#2b0a1e", + "#ffc371", + "#ff5f6d", + "#a83279", + "#ffe9c9" + ], + "knobs": { + "4": 0.3, + "5": 0.05 + }, "level": 0.5, - "bands": { "bass": 0.55, "mid": 0.45, "high": 0.4 }, - "transport": { "playing": true, "time": 2 } + "bands": { + "bass": 0.55, + "mid": 0.45, + "high": 0.4 + }, + "transport": { + "playing": true, + "time": 2 + } } }, { @@ -329,11 +740,21 @@ "frames": 260, "dt": 0.01667, "io": { - "knobs": { "4": 0.7, "5": 0.62 }, + "knobs": { + "4": 0.7, + "5": 0.62 + }, "level": 0.6, - "bands": { "bass": 0.68, "mid": 0.5, "high": 0.42 }, + "bands": { + "bass": 0.68, + "mid": 0.5, + "high": 0.42 + }, "beat": 0.7, - "xy": { "x": 0.5, "y": 0.5 } + "xy": { + "x": 0.5, + "y": 0.5 + } } }, { @@ -341,7 +762,17 @@ "scene": "miraclemile", "frames": 150, "dt": 0.01667, - "io": { "beat": 0.9, "level": 0.68, "strikes": [4, 9], "gestures": { "press": 0.9 } } + "io": { + "beat": 0.9, + "level": 0.68, + "strikes": [ + 4, + 9 + ], + "gestures": { + "press": 0.9 + } + } } ] } diff --git a/docs/media/hero.webp b/docs/media/hero.webp index 46e28bc..b5454a2 100644 Binary files a/docs/media/hero.webp and b/docs/media/hero.webp differ diff --git a/docs/media/scenes/beams.webp b/docs/media/scenes/beams.webp index 572c391..74664c7 100644 Binary files a/docs/media/scenes/beams.webp and b/docs/media/scenes/beams.webp differ diff --git a/docs/media/scenes/chladni.webp b/docs/media/scenes/chladni.webp index eeb9315..ac73892 100644 Binary files a/docs/media/scenes/chladni.webp and b/docs/media/scenes/chladni.webp differ diff --git a/docs/media/scenes/cymatic.webp b/docs/media/scenes/cymatic.webp index 76f97f1..d05772a 100644 Binary files a/docs/media/scenes/cymatic.webp and b/docs/media/scenes/cymatic.webp differ diff --git a/docs/media/scenes/ferrofluid.webp b/docs/media/scenes/ferrofluid.webp index a13da2c..11fb4d7 100644 Binary files a/docs/media/scenes/ferrofluid.webp and b/docs/media/scenes/ferrofluid.webp differ diff --git a/docs/media/scenes/lattice.webp b/docs/media/scenes/lattice.webp index 7f80428..81ddd2d 100644 Binary files a/docs/media/scenes/lattice.webp and b/docs/media/scenes/lattice.webp differ diff --git a/docs/media/scenes/mandelbulb.webp b/docs/media/scenes/mandelbulb.webp index 800de1e..cec3c82 100644 Binary files a/docs/media/scenes/mandelbulb.webp and b/docs/media/scenes/mandelbulb.webp differ diff --git a/docs/media/scenes/miraclemile.webp b/docs/media/scenes/miraclemile.webp index bb52676..1834bbe 100644 Binary files a/docs/media/scenes/miraclemile.webp and b/docs/media/scenes/miraclemile.webp differ diff --git a/docs/media/scenes/naturestomb.webp b/docs/media/scenes/naturestomb.webp index ab670b9..ab6f839 100644 Binary files a/docs/media/scenes/naturestomb.webp and b/docs/media/scenes/naturestomb.webp differ diff --git a/docs/media/scenes/nebula.webp b/docs/media/scenes/nebula.webp index e804609..613cb87 100644 Binary files a/docs/media/scenes/nebula.webp and b/docs/media/scenes/nebula.webp differ diff --git a/docs/media/scenes/ribbons.webp b/docs/media/scenes/ribbons.webp index 0e46612..813ce88 100644 Binary files a/docs/media/scenes/ribbons.webp and b/docs/media/scenes/ribbons.webp differ diff --git a/docs/media/scenes/spectra.webp b/docs/media/scenes/spectra.webp index 8e6f0cc..5f36bcf 100644 Binary files a/docs/media/scenes/spectra.webp and b/docs/media/scenes/spectra.webp differ diff --git a/docs/media/scenes/swarm.webp b/docs/media/scenes/swarm.webp index f13f57c..9bf1b23 100644 Binary files a/docs/media/scenes/swarm.webp and b/docs/media/scenes/swarm.webp differ diff --git a/docs/media/scenes/valley.webp b/docs/media/scenes/valley.webp index bf4429b..3a8b6f6 100644 Binary files a/docs/media/scenes/valley.webp and b/docs/media/scenes/valley.webp differ diff --git a/docs/media/scenes/vjshader.webp b/docs/media/scenes/vjshader.webp index e81bbc1..551ae54 100644 Binary files a/docs/media/scenes/vjshader.webp and b/docs/media/scenes/vjshader.webp differ diff --git a/docs/media/scenes/voxels.webp b/docs/media/scenes/voxels.webp index 9f7bfe0..d5f1c38 100644 Binary files a/docs/media/scenes/voxels.webp and b/docs/media/scenes/voxels.webp differ diff --git a/docs/media/scenes/willidream.webp b/docs/media/scenes/willidream.webp index 6c2eac8..7406339 100644 Binary files a/docs/media/scenes/willidream.webp and b/docs/media/scenes/willidream.webp differ diff --git a/src/main/main.js b/src/main/main.js index 35bab2a..a76e90f 100644 --- a/src/main/main.js +++ b/src/main/main.js @@ -66,6 +66,14 @@ const EXTERNAL_ALLOW = [ 'synesthesia.live', 'elektronauts.com', 'indiegogo.com', + // Cited by README.md's masthead. + 'gantasmo.com', + 'spotify.com', + 'youtube.com', + 'instagram.com', + 'x.com', + 'electronjs.org', + 'threejs.org', ]; function allowedExternal(url) {