From df39d16b61da39b44efe7bfd4278b2901af485cf Mon Sep 17 00:00:00 2001 From: Z User Date: Mon, 26 Oct 2026 21:01:39 +0000 Subject: [PATCH] =?UTF-8?q?Restore=20folder-tree=20Presets=20page=20(Tasks?= =?UTF-8?q?=209-11)=20from=20user's=20Google=20Drive=20archive=20=E2=80=94?= =?UTF-8?q?=20tree=20UI,=20folders/export/import=20APIs,=2095=20embedded?= =?UTF-8?q?=20presets,=20randomize,=20Save/Save=20As?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent-ctx/10-presets-ui.md | 86 ++ db/custom.db | Bin 32768 -> 176128 bytes prisma/schema.prisma | 33 +- .../Amp Picks/D&L - Life Is Violated.avs | Bin 0 -> 1599 bytes ... Retrowall (Yathosho's Supermicrocosm).avs | Bin 0 -> 1747 bytes .../Amp Picks/Degnic-Adrealine rush.avs | Bin 0 -> 4652 bytes .../embedded/Amp Picks/Duo - Alien Heart.avs | Bin 0 -> 1436 bytes .../embedded/Amp Picks/Duo - Brainstorm.avs | Bin 0 -> 2141 bytes .../EL-VIS - Molecules (S_KuPeRS Remix).avs | Bin 0 -> 5691 bytes .../Amp Picks/L1quid - Take the Veil.avs | Bin 0 -> 1252 bytes .../embedded/Amp Picks/Nic01 - Rototronik.avs | Bin 0 -> 1436 bytes .../S_KuPeRS - ...hidden track....avs | Bin 0 -> 3778 bytes .../Amp Picks/S_KuPeRS - Arctic Rainbow.avs | Bin 0 -> 4167 bytes .../embedded/Amp Picks/S_KuPeRS - Chinook.avs | Bin 0 -> 2872 bytes .../Amp Picks/S_KuPeRS - Hexual Healing.avs | Bin 0 -> 5178 bytes .../Amp Picks/S_KuPeRS - Inverse Kinetics.avs | Bin 0 -> 5305 bytes .../embedded/Amp Picks/S_KuPeRS - Kingish.avs | Bin 0 -> 3125 bytes ...- Spirit Realm (Degnic's Plasmoid RMX).avs | Bin 0 -> 4478 bytes .../Amp Picks/S_KuPeRS - Texering 002.avs | Bin 0 -> 6562 bytes .../Amp Picks/S_KuPeRS - Upward Current.avs | Bin 0 -> 2713 bytes .../Amp Picks/Tuggummi - Aqua-fumes.avs | Bin 0 -> 2120 bytes ...mi - Club Seizure (color enhanced mix).avs | Bin 0 -> 2621 bytes .../Amp Picks/Tuggummi - Electro blobs.avs | Bin 0 -> 12989 bytes .../Amp Picks/Tuggummi - Kaleidofied.avs | Bin 0 -> 1958 bytes .../Amp Picks/Tuggummi - Magma Flow II.avs | Bin 0 -> 3314 bytes .../Amp Picks/Tuggummi - Multiple Orgasms.avs | Bin 0 -> 3811 bytes .../Amp Picks/Tuggummi - Pina Colada.avs | Bin 0 -> 3000 bytes .../Tuggummi - Scope in Spotlight II.avs | Bin 0 -> 3097 bytes .../Amp Picks/Tuggummi - Solero Shots.avs | Bin 0 -> 11374 bytes .../Amp Picks/Tuggummi - Square Minded.avs | Bin 0 -> 1640 bytes .../Tuggummi - Worm-O-Rama (Raz Remix).avs | Bin 0 -> 16368 bytes .../Amp Picks/UnConeD - Zero-G Maze.avs | Bin 0 -> 3807 bytes .../Amp Picks/UnConeD - Cartoon Trip.avs | Bin 0 -> 3287 bytes .../Amp Picks/UnConeD - Containment.avs | Bin 0 -> 7489 bytes .../Amp Picks/UnConeD - Cubic Flower.avs | Bin 0 -> 2477 bytes .../Amp Picks/UnConeD - Jello Cube.avs | Bin 0 -> 25119 bytes .../embedded/Amp Picks/UnConeD - Mercury.avs | Bin 0 -> 2408 bytes .../Amp Picks/UnConeD - Neon Coaster.avs | Bin 0 -> 5094 bytes .../embedded/Amp Picks/UnConeD - Plankton.avs | Bin 0 -> 3763 bytes .../Amp Picks/UnConeD - Reflectocube.avs | Bin 0 -> 3819 bytes .../Amp Picks/UnConeD - Speeder 3K.avs | Bin 0 -> 19073 bytes .../Amp Picks/UnConeD - TC Plasma.avs | Bin 0 -> 2578 bytes .../Amp Picks/UnConeD - Tie Tunnel SSC.avs | Bin 0 -> 58521 bytes .../Amp Picks/UnConeD - Zero-G Maze II.avs | Bin 0 -> 4016 bytes .../Amp Picks/UnConeD -Zero-G Maze III.avs | Bin 0 -> 6840 bytes .../amphirion - nebulous (skupers remix).avs | Bin 0 -> 1493 bytes ...l-vis - soundscape III (skupers remix).avs | Bin 0 -> 2611 bytes ...heckers with metaballs (skupers remix).avs | Bin 0 -> 3690 bytes .../horse-fly - jinx (skupers remix).avs | Bin 0 -> 3364 bytes ...t quite a bendy tunnel (skupers remix).avs | Bin 0 -> 4060 bytes .../Amp Picks/justin - newpoop (for wa5).avs | Bin 0 -> 663 bytes ...the landscape is killing me (wa5remix).avs | Bin 0 -> 1134 bytes .../embedded/Amp Picks/mig - Dragonscales.avs | Bin 0 -> 935 bytes .../embedded/Amp Picks/mig - Encapsulade.avs | Bin 0 -> 754 bytes .../embedded/Amp Picks/mig - Freekwyrms.avs | Bin 0 -> 970 bytes .../root/embedded/Amp Picks/mig - Lilypod.avs | Bin 0 -> 1158 bytes .../embedded/Amp Picks/mig - Mist Wisps.avs | Bin 0 -> 615 bytes .../mig - Nebulating - Hypercolorspace.avs | Bin 0 -> 645 bytes .../Amp Picks/mig - Reverb - Deep Net.avs | Bin 0 -> 1193 bytes .../embedded/Amp Picks/mig - Slyde - Tri.avs | Bin 0 -> 482 bytes .../embedded/Amp Picks/mig - Solar Flaire.avs | Bin 0 -> 750 bytes .../mig - Spintronics - Backspin.avs | Bin 0 -> 2036 bytes .../embedded/Amp Picks/mig - Starslappin.avs | Bin 0 -> 1240 bytes .../mig - Street Art - Fire Inside.avs | Bin 0 -> 1139 bytes .../embedded/Amp Picks/mig - Swoo - Slow.avs | Bin 0 -> 1023 bytes .../nixa - smell of music (skupers remix).avs | Bin 0 -> 3310 bytes .../root/embedded/Amp Picks/p-k - bumpy.avs | Bin 0 -> 2528 bytes .../root/embedded/Amp Picks/splendora.avs | Bin 0 -> 10562 bytes .../root/embedded/Amp Picks/zxe-Urantia.avs | Bin 0 -> 1281 bytes ...namic duo - tentaclism (fake hboy rmx).avs | Bin 0 -> 3518 bytes ...ntaclism (sky of contempt mix by drew).avs | Bin 0 -> 3942 bytes ... (microdee's grandpa was a tentaclist).avs | Bin 0 -> 8932 bytes ...(cathode ray mix by onionring of doom).avs | Bin 0 -> 4609 bytes ...s (glowy mix by meaningless-existance).avs | Bin 0 -> 5301 bytes ...dynamic duo - tentaclism (midas remix).avs | Bin 0 -> 2820 bytes ...o - tentaclism (raz remix - ugly edit).avs | Bin 0 -> 2946 bytes ...uo - tentaclism (the y.m.o. rework #1).avs | Bin 0 -> 2303 bytes ...sm (kans of kansis mix by drew - edit).avs | Bin 0 -> 3474 bytes ... - the pacifist (duo's underworld mix).avs | Bin 0 -> 5778 bytes ...duo - biofeedback (hboy's organic mix).avs | Bin 0 -> 3946 bytes .../04 zamuz - roll-on mojo (duo remix).avs | Bin 0 -> 3228 bytes ...(vanish's wicked jungle massive remix).avs | Bin 0 -> 3832 bytes ...upers - incantation (duo remix - edit).avs | Bin 0 -> 3558 bytes .../07 duo - miraculous flow (nemo remix).avs | Bin 0 -> 2351 bytes .../08 duo - warm freeform (mykal remix).avs | Bin 0 -> 2338 bytes .../09 zxe - pleasure point (duo remix).avs | Bin 0 -> 3564 bytes ...- heart dynamics (duo's high dose mix).avs | Bin 0 -> 5729 bytes ...ild here (duo's building blocks remix).avs | Bin 0 -> 2979 bytes ...ssive (yathosho's cartographic re-rub).avs | Bin 0 -> 4302 bytes ...y i love you (duo's pulsedriver remix).avs | Bin 0 -> 1384 bytes ...conjuring sands (skupers remix - edit).avs | Bin 0 -> 4123 bytes ...ggummi - multiple overdose (duo remix).avs | Bin 0 -> 4795 bytes ...- warm freeform (ya-tho-sho treatment).avs | Bin 0 -> 2749 bytes src/app/api/folders/route.ts | 131 ++ src/app/api/presets/[id]/route.ts | 35 +- src/app/api/presets/export/route.ts | 69 + src/app/api/presets/import/route.ts | 125 ++ src/app/api/presets/route.ts | 134 +- src/app/page.tsx | 19 +- src/components/ava/presets-tab.tsx | 1134 ++++++++++++++--- src/components/ava/script-tab.tsx | 215 +++- src/lib/ava/embedded-presets.ts | 739 +++++++++++ src/lib/ava/engine.ts | 28 +- src/lib/ava/expression.ts | 195 ++- src/lib/ava/script.ts | 13 +- src/lib/server/preset-tree.ts | 89 ++ src/lib/store.ts | 183 ++- tool-results/ava-restored-final.png | Bin 0 -> 95991 bytes tool-results/ava-restored-initial.png | Bin 0 -> 85021 bytes tool-results/ava-restored-mobile.png | Bin 0 -> 59218 bytes tools/convert-avs.ts | 1038 +++++++++++++++ tools/convert-report.json | 497 ++++++++ .../Amp Picks/D&L - Life Is Violated.ava | 53 + ... Retrowall (Yathosho's Supermicrocosm).ava | 25 + .../Amp Picks/Degnic-Adrealine rush.ava | 25 + .../embedded/Amp Picks/Duo - Alien Heart.ava | 29 + .../embedded/Amp Picks/Duo - Brainstorm.ava | 25 + .../EL-VIS - Molecules (S_KuPeRS Remix).ava | 25 + .../Amp Picks/L1quid - Take the Veil.ava | 29 + .../embedded/Amp Picks/Nic01 - Rototronik.ava | 39 + .../S_KuPeRS - ...hidden track....ava | 25 + .../Amp Picks/S_KuPeRS - Arctic Rainbow.ava | 29 + .../embedded/Amp Picks/S_KuPeRS - Chinook.ava | 29 + .../Amp Picks/S_KuPeRS - Hexual Healing.ava | 25 + .../Amp Picks/S_KuPeRS - Inverse Kinetics.ava | 31 + .../embedded/Amp Picks/S_KuPeRS - Kingish.ava | 25 + ...- Spirit Realm (Degnic's Plasmoid RMX).ava | 25 + .../Amp Picks/S_KuPeRS - Texering 002.ava | 39 + .../Amp Picks/S_KuPeRS - Upward Current.ava | 25 + .../Amp Picks/Tuggummi - Aqua-fumes.ava | 25 + ...mi - Club Seizure (color enhanced mix).ava | 25 + .../Amp Picks/Tuggummi - Electro blobs.ava | 29 + .../Amp Picks/Tuggummi - Kaleidofied.ava | 29 + .../Amp Picks/Tuggummi - Magma Flow II.ava | 25 + .../Amp Picks/Tuggummi - Multiple Orgasms.ava | 31 + .../Amp Picks/Tuggummi - Pina Colada.ava | 31 + .../Tuggummi - Scope in Spotlight II.ava | 29 + .../Amp Picks/Tuggummi - Solero Shots.ava | 25 + .../Amp Picks/Tuggummi - Square Minded.ava | 31 + .../Tuggummi - Worm-O-Rama (Raz Remix).ava | 25 + .../Amp Picks/UnConeD - Zero-G Maze.ava | 24 + .../Amp Picks/UnConeD - Cartoon Trip.ava | 25 + .../Amp Picks/UnConeD - Containment.ava | 29 + .../Amp Picks/UnConeD - Cubic Flower.ava | 25 + .../Amp Picks/UnConeD - Jello Cube.ava | 29 + .../embedded/Amp Picks/UnConeD - Mercury.ava | 29 + .../Amp Picks/UnConeD - Neon Coaster.ava | 25 + .../embedded/Amp Picks/UnConeD - Plankton.ava | 25 + .../Amp Picks/UnConeD - Reflectocube.ava | 25 + .../Amp Picks/UnConeD - Speeder 3K.ava | 25 + .../Amp Picks/UnConeD - TC Plasma.ava | 25 + .../Amp Picks/UnConeD - Tie Tunnel SSC.ava | 29 + .../Amp Picks/UnConeD - Zero-G Maze II.ava | 29 + .../Amp Picks/UnConeD -Zero-G Maze III.ava | 25 + .../amphirion - nebulous (skupers remix).ava | 31 + ...l-vis - soundscape III (skupers remix).ava | 25 + ...heckers with metaballs (skupers remix).ava | 28 + .../horse-fly - jinx (skupers remix).ava | 25 + ...t quite a bendy tunnel (skupers remix).ava | 29 + .../Amp Picks/justin - newpoop (for wa5).ava | 25 + ...the landscape is killing me (wa5remix).ava | 25 + .../embedded/Amp Picks/mig - Dragonscales.ava | 29 + .../embedded/Amp Picks/mig - Encapsulade.ava | 29 + .../embedded/Amp Picks/mig - Freekwyrms.ava | 25 + .../root/embedded/Amp Picks/mig - Lilypod.ava | 29 + .../embedded/Amp Picks/mig - Mist Wisps.ava | 29 + .../mig - Nebulating - Hypercolorspace.ava | 25 + .../Amp Picks/mig - Reverb - Deep Net.ava | 31 + .../embedded/Amp Picks/mig - Slyde - Tri.ava | 25 + .../embedded/Amp Picks/mig - Solar Flaire.ava | 29 + .../mig - Spintronics - Backspin.ava | 31 + .../embedded/Amp Picks/mig - Starslappin.ava | 25 + .../mig - Street Art - Fire Inside.ava | 25 + .../embedded/Amp Picks/mig - Swoo - Slow.ava | 31 + .../nixa - smell of music (skupers remix).ava | 29 + .../root/embedded/Amp Picks/p-k - bumpy.ava | 29 + .../root/embedded/Amp Picks/splendora.ava | 29 + .../root/embedded/Amp Picks/zxe-Urantia.ava | 31 + ...namic duo - tentaclism (fake hboy rmx).ava | 25 + ...ntaclism (sky of contempt mix by drew).ava | 25 + ... (microdee's grandpa was a tentaclist).ava | 27 + ...(cathode ray mix by onionring of doom).ava | 25 + ...s (glowy mix by meaningless-existance).ava | 24 + ...dynamic duo - tentaclism (midas remix).ava | 31 + ...o - tentaclism (raz remix - ugly edit).ava | 25 + ...uo - tentaclism (the y.m.o. rework #1).ava | 29 + ...sm (kans of kansis mix by drew - edit).ava | 29 + ... - the pacifist (duo's underworld mix).ava | 31 + ...duo - biofeedback (hboy's organic mix).ava | 31 + .../04 zamuz - roll-on mojo (duo remix).ava | 29 + ...(vanish's wicked jungle massive remix).ava | 25 + ...upers - incantation (duo remix - edit).ava | 40 + .../07 duo - miraculous flow (nemo remix).ava | 25 + .../08 duo - warm freeform (mykal remix).ava | 25 + .../09 zxe - pleasure point (duo remix).ava | 29 + ...- heart dynamics (duo's high dose mix).ava | 29 + ...ild here (duo's building blocks remix).ava | 29 + ...ssive (yathosho's cartographic re-rub).ava | 29 + ...y i love you (duo's pulsedriver remix).ava | 25 + ...conjuring sands (skupers remix - edit).ava | 33 + ...ggummi - multiple overdose (duo remix).ava | 28 + ...- warm freeform (ya-tho-sho treatment).ava | 25 + worklog.md | 272 ++++ 203 files changed, 7278 insertions(+), 276 deletions(-) create mode 100644 agent-ctx/10-presets-ui.md create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/D&L - Life Is Violated.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Degnic-Adrealine rush.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Alien Heart.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Brainstorm.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/L1quid - Take the Veil.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Nic01 - Rototronik.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - ...hidden track....avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Chinook.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Kingish.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Texering 002.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Upward Current.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Electro blobs.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Kaleidofied.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Magma Flow II.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Pina Colada.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Solero Shots.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Square Minded.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cartoon Trip.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Containment.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cubic Flower.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Jello Cube.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Mercury.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Neon Coaster.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Plankton.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Reflectocube.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Speeder 3K.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - TC Plasma.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD -Zero-G Maze III.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/horse-fly - jinx (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/justin - newpoop (for wa5).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Dragonscales.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Encapsulade.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Freekwyrms.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Lilypod.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Mist Wisps.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Reverb - Deep Net.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Slyde - Tri.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Solar Flaire.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Spintronics - Backspin.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Starslappin.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Street Art - Fire Inside.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/mig - Swoo - Slow.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/nixa - smell of music (skupers remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/p-k - bumpy.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/splendora.avs create mode 100644 public/avs-originals/embedded/root/embedded/Amp Picks/zxe-Urantia.avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).avs create mode 100644 public/avs-originals/embedded/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/06 skupers - incantation (duo remix - edit).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/07 duo - miraculous flow (nemo remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/08 duo - warm freeform (mykal remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/09 zxe - pleasure point (duo remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).avs create mode 100644 public/avs-originals/embedded/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).avs create mode 100644 src/app/api/folders/route.ts create mode 100644 src/app/api/presets/export/route.ts create mode 100644 src/app/api/presets/import/route.ts create mode 100644 src/lib/ava/embedded-presets.ts create mode 100644 src/lib/server/preset-tree.ts create mode 100644 tool-results/ava-restored-final.png create mode 100644 tool-results/ava-restored-initial.png create mode 100644 tool-results/ava-restored-mobile.png create mode 100644 tools/convert-avs.ts create mode 100644 tools/convert-report.json create mode 100644 tools/converted/root/embedded/Amp Picks/D&L - Life Is Violated.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).ava create mode 100644 tools/converted/root/embedded/Amp Picks/Degnic-Adrealine rush.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Duo - Alien Heart.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Duo - Brainstorm.ava create mode 100644 tools/converted/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/L1quid - Take the Veil.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Nic01 - Rototronik.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - ...hidden track....ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Chinook.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Kingish.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Texering 002.ava create mode 100644 tools/converted/root/embedded/Amp Picks/S_KuPeRS - Upward Current.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Electro blobs.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Kaleidofied.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Magma Flow II.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Pina Colada.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Solero Shots.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Square Minded.ava create mode 100644 tools/converted/root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Cartoon Trip.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Containment.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Cubic Flower.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Jello Cube.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Mercury.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Neon Coaster.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Plankton.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Reflectocube.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Speeder 3K.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - TC Plasma.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.ava create mode 100644 tools/converted/root/embedded/Amp Picks/UnConeD -Zero-G Maze III.ava create mode 100644 tools/converted/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/horse-fly - jinx (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/justin - newpoop (for wa5).ava create mode 100644 tools/converted/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Dragonscales.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Encapsulade.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Freekwyrms.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Lilypod.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Mist Wisps.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Reverb - Deep Net.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Slyde - Tri.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Solar Flaire.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Spintronics - Backspin.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Starslappin.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Street Art - Fire Inside.ava create mode 100644 tools/converted/root/embedded/Amp Picks/mig - Swoo - Slow.ava create mode 100644 tools/converted/root/embedded/Amp Picks/nixa - smell of music (skupers remix).ava create mode 100644 tools/converted/root/embedded/Amp Picks/p-k - bumpy.ava create mode 100644 tools/converted/root/embedded/Amp Picks/splendora.ava create mode 100644 tools/converted/root/embedded/Amp Picks/zxe-Urantia.ava create mode 100644 tools/converted/root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).ava create mode 100644 tools/converted/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).ava create mode 100644 tools/converted/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).ava create mode 100644 tools/converted/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).ava create mode 100644 tools/converted/root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).ava create mode 100644 tools/converted/root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).ava create mode 100644 tools/converted/root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).ava create mode 100644 tools/converted/root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).ava create mode 100644 tools/converted/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).ava create mode 100644 tools/converted/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).ava create mode 100644 tools/converted/root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).ava create mode 100644 tools/converted/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).ava create mode 100644 tools/converted/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).ava create mode 100644 tools/converted/root/embedded/Envision/06 skupers - incantation (duo remix - edit).ava create mode 100644 tools/converted/root/embedded/Envision/07 duo - miraculous flow (nemo remix).ava create mode 100644 tools/converted/root/embedded/Envision/08 duo - warm freeform (mykal remix).ava create mode 100644 tools/converted/root/embedded/Envision/09 zxe - pleasure point (duo remix).ava create mode 100644 tools/converted/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).ava create mode 100644 tools/converted/root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).ava create mode 100644 tools/converted/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).ava create mode 100644 tools/converted/root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).ava create mode 100644 tools/converted/root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).ava create mode 100644 tools/converted/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).ava create mode 100644 tools/converted/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).ava diff --git a/agent-ctx/10-presets-ui.md b/agent-ctx/10-presets-ui.md new file mode 100644 index 0000000..6d3a676 --- /dev/null +++ b/agent-ctx/10-presets-ui.md @@ -0,0 +1,86 @@ +# Task 10 — Presets UI (folder/file tree manager + Script tab save targets) + +Task ID: 10 +Agent: full-stack-developer (Presets UI) +Status: COMPLETE — lint clean, tsc clean on touched files, verified end-to-end in a headless browser. + +## What was built + +### 1. `src/components/ava/presets-tab.tsx` — complete rewrite + +**Left column (58% on sm+, full width on mobile): the folder/file tree** +- Built from `store.folders` + `store.presets`. Defensive: presets whose + `folderPath` has no Folder row synthesize their node + ancestors + (`buildTree`). Folders sorted alphabetically per level (segment-wise + compare, parents before children); presets alphabetically inside folders. +- Folder row: chevron button (size-9 hit area, rotates ChevronRight) is the + ONLY expand/collapse control; clicking the row selects the folder + (`selectFolder` — also updates the randomize scope). FolderOpen/Folder + icon swaps with expansion. Subtree preset count badge (font-mono, + tooltip "N presets in this folder and below"). +- Default expansion: `expandedFolders[path] ?? path.split('/').length <= 2` + (same rule as the store) — root, root/embedded, root/user created open. +- Preset row: FileText icon; single click selects, double-click loads. + Running preset (`activePresetId`): emerald Play icon + emerald-300 name + + `bg-emerald-400/10`. Selected row: emerald left border + `bg-zinc-800/70`. +- `originalFile` rows get a .avs download anchor (title "Download original + Winamp .avs"), always visible on mobile, hover-visible on `sm+`. +- Empty folders show an italic "(empty)" hint row. Tree body scrolls + (`max-h-[420px] lg:max-h-[480px]`, thinScrollbar). `role="tree"` / + `treeitem` / `group`, aria-expanded/selected/level throughout. + +**Right column (42%): context-sensitive management panel** +- Header: icon + name + font-mono full path (+ "N presets · M subfolders" + for folders). +- Preset context: LOAD PRESET (emerald; applyScriptText → toast → + setActivePresetId + setEditTarget; compile error → destructive toast + + switch to script tab), RENAME, DELETE. +- Folder context: CREATE PRESET (POST STARTER_TEMPLATE → refresh → + editTarget + editor + engine + select + `setTab('script')` + toast + "created — now edit and Save"), NEW SUBFOLDER (POST → expand parent + + select new), RENAME (PATCH folder / PUT preset; selection, randomScope + and editTarget follow the renamed paths), DELETE (AlertDialog with + client-side blast radius — "removes N presets in M folders", empty-folder + and preset variants), EXPORT .ZIP (asChild anchor to + `/api/presets/export?path=…` with download attr; root exports + everything), IMPORT .ZIP (hidden .zip input → FormData POST → summary + toast with duplicates-skipped / folders-created). +- PROTECTED_FOLDERS (root, root/embedded, root/user created): Rename + + Delete disabled with "Protected folder" tooltip. Import/export allowed. +- All 409/400/404/500 responses → destructive toasts with the server + message. Empty names → inline dialog validation. +- RANDOMIZE section (border-t): Checkbox + delay input (3–60 s; invalid + input shows a red hint and reverts to the committed store value on + blur), scope line ("Random from: ") with amber + "no presets in this folder yet" hint, pulsing emerald "ON · every Ns" + badge while active. The timer runs in the store; the UI only wires it. +- NameDialog is fully controlled (parent owns value/error) — this was + needed to pass the `react-hooks/set-state-in-effect` lint rule. + +### 2. `src/components/ava/script-tab.tsx` — edits +- "Saving to: root/…/Name" chip (middle-truncated path, emerald, X button + clears the target) shown while `editTarget` is set. +- Save button (emerald, editTarget only): PUT `/api/presets/[id]` + {content, author from validateScript meta} → refresh + toast + `Saved to "Name"`; disabled while saving. +- Save As… button (editTarget only): Dialog prefilled with current name → + POST same folder → setEditTarget(new) + refresh + toast; 409 handled. +- New button also clears the edit target. + +## Verification performed (headless browser + curl) +- Tree structure/counts/expansion/selection; Load (toast, chip appears, + Save PUT returns 200); Save As (copy created server-side, chip + retargeted); delete preset + folder (blast-radius + empty wording); + create preset (editor + tab switch); new subfolder; rename folder + (paths follow); import .zip end-to-end; randomize persistence + (localStorage `ava.randomize`), scope line, invalid-delay revert, ON + badge in DOM with pulse animation. Zero page/console errors. +- Library restored to pristine state after testing (95 presets / 7 folders). + +## Notes for future agents +- Do NOT re-add setState-in-effect in NameDialog — the react-hooks v6 rule + forbids it; keep it controlled. +- `setRandomIntervalSec` is typed `(sec: number)`; convert with `Number()` + before calling (the store would tolerate strings at runtime). +- agent-browser `find … dblclick` does not exist — double-click was + verified through the identical Load Preset code path. diff --git a/db/custom.db b/db/custom.db index da8abda2e879132b90196fec442dc88bc0efec51..76317ffa7e3e0eefc706c120b072120548bc1abe 100755 GIT binary patch literal 176128 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 Vl9o!|3weNDvKPMn@tu3&+#e|3M4bQt delta 1115 zcmd5*OHUI~6rMZNDSdK5VvvVnY}4?lLTg*vMr9H=#znCx(P$!Mm`>?f=#+Lk&}tN@ zMu?#iyI@BOA#tHG=qy}FNQiMkQ2zoXhK&Z5goOztdZz<|;t%j9b29gQ=R5h%;|{MG zhKKRTHRVF_cFLk6mIjOBmfOunpcxfFiF~uv0`k+Q z`uw8NhTHM{hOw!VKw^rTNc02XwxUf3wGxC_j5 zEx--cKI+9$h&?MjVf7@*_Dg)LPwI1^;}lYZUboNVNQD`f{AKPnsS?+V#P#t`P|STT z*RfBGN(xgU4l?eTH=JbUBP(+nsz_M_NLdMCK$e7241R*|;8Qpbqc9+s2mP??I6;G= zf}xP)LwQ=2L~PiTmNq=iO&aMsI@>*A*2~oFEIw5T0G;d=7l8U2Hj71Xj<;!ywAG%y WnDg(yhQ33KC`(dKV=7Xi&a+7pbB$!FYN~TFxdIVRV z!i{V33SK~O;33-Yt4@Yddjtz!>iySyufEFj)3R*pycLgMz7R)7H@X$kd~wU!cO2*2 zCCAzO1SSkmOmUo=UKm{|ZKjh>y1MfVZ`P&BbkalWDfN`5lQ3M@<>|2&b)F+5-Mg7^ z#j0*x;|X7^L2B*U(4Lm2sQ$Dt&8jYIBi3nos+;M=XeA58yf#`_(v5?H88R4UnlARz%#a3mTXMLtL2Ie}h4T^Ztz-`0Tt@h!V2K9Eq3X)kiSnRh4X6k@a`2I^Nh{^X zQRD^72qTCVG_cv72DZD?z=r=aI3G}1B_Bjlf}?_HzD$rgnnTPeMhU{A`Tb?Gk_$L( z%fFzk|1AnV?kFj70AObiwApOzegpiKK{vzxll)D5jF7^JnNS8JQ4kansuJf7j5*{S zMhhwMKohL{Ck4I>0xHaO+NxsB*p|U1yjx1lOZ=(U^P3Z`afMX#gjfW^CGO8`K<_mi z$Lr;ER4G;KxK=YxOto7>lnh78yNS&!=ke0E2zT2yTjyf?<0`*=o*dSt(p7ZuP&}zC zKGU|SEAg}_TW#p~19U!yx(PqS+QnZTjl(|59QC*^;z#@Wee}I(AM=kfqr9s&`i%Mx z{ACdRUxB!;gAPHPcj%j#!0Y6t;9hxe+gE7_U|v6dWMB`#_0ojOrmA-Z{M*I0%!yg*t2#14gCWBt2smf literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).avs new file mode 100644 index 0000000000000000000000000000000000000000..4a9e8c5952b73ae7ce45848266a7b8c3b3200349 GIT binary patch literal 1747 zcmd5+zi-n(6uuUOAfkW}NEOpbE!44z<8uIkqLYePSc;I45KC3u`kI)!b~!uLHUkxO zXNG|VG4UTTFthP5bY(+g$9&I;OIzqbv+$zt?!9}zzWWj18-!sJucrL=!w3AnR*6cv zW4o6oE;7d60dIk&rA3|$Hk4iuR&=})C+mE1ajG%Z;1F>u?ekT&tOuUXx$8Kc+7s)b z7erpjH->fRv`Tfn>4o7OU(WdxFNzdj^YZ>$JS?TvdXOo9PO95HwnBtgnI z`?<=M9qS%AFbnKTU?Rkj%iKzW$SAyKcdC&InVGJcTi|OHw4$Z93a{;wQ)ZSy4&5|; zD|xC@BRBIVMNt)l%KUa^!pubFq`U$_%tpUL8b!-?ZZ@q#bPKX-lUfuW7QB()6YLsg z2&uiuH^hx*TR2X)aQEAkbsz*;*xm@IF%xQ=W|E&}S$=}C1=lPFQvNEGFbg~fCKfPc zGB7(W(aog;&dcFINxNh9R2nBMhI7?+1mISur~Cshm)zv)X{915*eMiDW!iFV=Q>oz zjsuZ&*(7Fa4Vu+V6f~_7g?vOIt0?F{+UznIw%Jc_mqSHepxjUn>wFgO7Er!G_j6Eu ziQ6|aGqdOcbcflau|D1_urC1h7V03fsbKXAso)tHzVzF!NpH(Pq}+K#(Jk&3Dl-FA zyiP#DV>R8XV;xqrxr_zc9@+gL?-fa9-Z@-G5UTVBX@fHXq@M9N83HdUSpoeZ}u)@Z=jPjfv=TTvKg#@ fBYmr6pQnf4)B2BEg^ULJ&i=3K^p@$39|L{?Km+^h literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Degnic-Adrealine rush.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Degnic-Adrealine rush.avs new file mode 100644 index 0000000000000000000000000000000000000000..c0f33352fb9b2f5e3a3e344dd01c9a1b8bc16115 GIT binary patch literal 4652 zcmd^C&2Jk;6d$(*fr|@5z@eb(9nyT*@n)USMATYHl?stV5o$s?pekAKj_r}xGt17b zKdMSKH?I5#IUsSQMFh!Euuiyb>y6qPIKq=KbD#^X9#` z@rQ8`XjM0GKxbtoe4L#+?I75j4<=3L(wo^cKL=TIgHLO0|Q zxYCDMdP*W2g(BA%t~7HHCRbsl>P%C}mXHlF3Q!GrDh>k*fi+7D;1iLpu?j+NbZtPX+G5>)rL0O89Jo{)lF<}LX&*$s~9|2 zq6s%h)e2)-)@`m;5F4Q+C{zl|w%tQYB?7MT*iA&O+KG!1_f)&hCHjaCL4c6-u;_`; z4fhg7=pg!$xGt5@eLPECuY;fiptr{K!EH3qZ7mQ#n@T4B3WGXTD~W~Y25rltImss&@e9K@t;Yw+ABUUNGr1nuF+K-eU_)lFA-#$8 z1`_EX5e4&WRQ7p}6=nvwL3G?8zzotAoaDa2N$kWW>z!)kh+-&;72CF}zT+u99~D>Z zk}1VkSL~uyS*RBBy_8=vrf4lM6n$j%9WCU1G|swLNyJDUvKNZh3h5|XZzmdh#e0n@ZK-8z;+bk$4rS!Hv@1 zyuFBjq~==HERUGh%A!?StR!sqD#}X-TS_$)j!S0Cm4)PrDLNQQd@}ac{tvlr-b-^U z;XM5S0vs7n-qW2OL$Dn!+Ssk@uFtJnJ7kRLe==Ugb3PiLm7@L9#JL~;bU(MD0_-@q z+>@g62-6wc1ABf9OW~$6fZT(pB0nZ};*`qm$;Iihdl~E=oSWY6?)mAl>lv`$KR3PI zhf`vy{=UsK_6gqA`Z{BeuQ0~PZj`E%WF`~fS?0ftK3B=_2iSG-Jj{3WXOWrri}RH- zbx?nyWUW$nLRvd=w9zsB-TmCHI4~j%#7RAgN`p#<%&j3M<}Tx;=k%}vmn<8bA~o&) zX!WNlGBYxDmg;C^jWi?1u>V#So;9!Oh{xsi`V=uET~rg00lRx)`n+DxfQ1ZLmH~T^;fu9D1@>dQq~Um$ zzak?a={@e}MO?pyL^=Blei{Ma^dHy@NWbEmC>%6%8^hnHTlD)B_a+C)|3=>r99NO( Hb3)?}>#lH* literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Alien Heart.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Alien Heart.avs new file mode 100644 index 0000000000000000000000000000000000000000..3fa7554ece070036a5912d737986e284af69752f GIT binary patch literal 1436 zcmZ`(%Wl&^6m@_ih=@Q47O=rWUHB0{#z`cKnMHq~LaM~xcAPfgB(BFPGqWKdzyh)0 z6Zi&}Z1^k)=h{iCzHW79?i?TA$M`l!%c2mANo^i}I5yu`xyWlX^rM%?bHgxx0N(*K z2)y>syUlvtheU?ZMAU-Y2yb{+%i)wl@ohOBv zEoQTPUcWW&qN)eL3xJIFXF!Jz8{7K-*6Z~lxRr6o*nizPTgl~}UbqKPpjW^XfQ)zo z1^NbOh2wq-0?v&_;%$ZRHVO+n1viYn)jrlwKxc$S@-Xgo6`wkh$KX}@m;>H)Vx8o* zDD%wnSwHMYHkNZ|WJ813THC`m=TVH-5Exjm)&Lyrt2JTO)J`cs0-Yfixl5*+?!c5@h%n@?k`+G=Pw*&@uUc%*hFkkW$=34l5$5r$dWQP9$3wHwYc=K z*OiQyC{K8$a%4sYwnXL4NdRIpYo{3Tg$l!i{a!s#UA4 zx;Q8~c@5)m7JP*0k1jBh%YU}5O_;fUx|UeKe4j#^&b!fVQt=EdSO@&OHq=?!SZCY_v z-$+<1Y4vnKS+Q||M#krShyg-fA#L=pV^ZjLPtX1X5AQZN literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Brainstorm.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Duo - Brainstorm.avs new file mode 100644 index 0000000000000000000000000000000000000000..421a551826405f45890c9ae64f96f89e0e9ef6ca GIT binary patch literal 2141 zcmdT_O^+ir5Oro*v>TKI5^z8u^`ZgwN7B>onILu}OJs&K;!AKu>2_zgrA~L&-3j)J zL$s&8@*_BK1wP(@pG zUJ|G8_TFZU{Q~(J5__4Nm37-SYBA^!`iq$?yh7*Isx8+=WxRQ#$U&2rMQ6NqQ>_+- z_pviAt4E$ESIzh57oVEhlctID23~$BGT=|TZu#is1k??-eOX`AL%&K%V)L3>Fvaz&;HzQw_o06Y=Z+I(}(1y)&uB6UW43YcQ?oAUqX5f zKDj8vWf`UuPcB3}o(%e0EHg8T&!8Hy4*mEv0uYRrnFgc^DL4Vqx>{KaEV}8cR4;jTtf_t(3ZQ_jn5hr5%pT!v==HHGGdyeR(p4!XRp|4~eM9aAj z!Z^i?NaJSAe#Y!(^tq6D=e) z(?qI~4<(GbgAHIqc|@?;!wRqhtO!=v5a#R!Hq4NybH8|s;^1fbuv&D%Fw1L5vjgr&59rmo;|l2}MzLEKsrJtzO&;Y&v2g%8wJ$58E3Uyaz!!vt^1()l1|tVN^0me}JCGl;YHO{U1>7 zILOvS4*mI2@80ni%I0!n*U=)9KIAP3ZA9bO5A+WY^pBvE9ocL*_*^y`zXPGVO8Ty) z_Zi#C4x^repo0B7j5n-zbW9O%AiG9Rc8(-;O6s2g^nQh+xiFTAAQEwisF+4Nq)a7| zc^IErDjP1ewFI|_R?gDgVEK%T_NnT8%|rYf`X^>;q4|l=qh~y@iQ|fats$W;*z~Jl zZZNTl?o8NsIP-tc5aK*#&finS=E7&>`c+)NJ+T@6-0yjOKw$d_^boJ2>LDY*iT$Ht G3Hu9-5cVbj literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..42c2a0f1ae75e449db7f46fe4326a49b93b87bff GIT binary patch literal 5691 zcmeHLy^rHW6!+e(IEZ9HgHECvp#{ax+8HNncK582I4uoGhweCOMe8Kv%?N)nc0x=6 zOGV57KtW4Mf%pTc=#XfU=uV=dLWJM5W9@1$OF@K0;fcoc=FNLE?_=cn_ugN`agjwO zdwBkoJ=U_2CFAbswY^sj!}w;;Fuq1-!=cmsoZFh&dnw6cIbFoEFnjDqn^a83&Qfhz zDkQW@Ib&fuV_GI^1sd|jM~htQEee@d7b*>7HqDYmrsV^(XZGHy(lAj|_9$CQVltJo zLQXU6DWeDnuvir(_J#CqF8n8av-e)6FC;sEHZ3#FK6sWDhb+=r!XAR1mhi+id-Jl) z9}I`ND&|Tr+?iaeFfBt}x^U9$ZTN4`voZ-)+%Vrgd%`@<{n62}=No^m*X!SqvM-RX zgG&(9w>7LA2k2j-?{PdTF|w881uMY=vp0zsQiPMDU#PUNY=01G%L=rd3D2Rmz_6hc zX%T5GO#*bGqJB6*;QN>ya_bO-!(HxyHeRfyCjxiM*aw}8xp4<0nL&-lm(gk0_2-zI zAT&&wiJ8q^Kfv^=ku-Jk_GhSF8pgc?JpR$!KGx~zyFcE!Jiw^2!`>4RE3wK4eQhht zCU0}Z!5({7P>HJLPqX5RZ}#dqxW1!o6JX3sMTpM8?@C z{b_kPLRfsx5s^TLGof+W`$(QO^tqh}%VooX)DYZYm5XFGST1X`AP8$R$VEuU zItWcZ5+j#P&d0(#;lrFPgP_+s(ClL8*ttnnJ9d%3mW?j*-JS2=Hk@~Fo9;c|{lj+u zu-&(f*L_uXUzOeWJfY7HNdX*=2pj?nZb4E5K&oE|T@lEN^h$(;Ua4bZpK!|>j$QA_ z^G|{0d|>)WSJ!2#Z8E^ZPP;{E0eSNy!oeF}Wp8-K>zgwHKD`mpe+7s*J`PGzIz>>3 z0-C43aUW6zfyWbqll(2a0lYp60@PXK)EQ?XK zc@#Ey_IaW2QOh6?$fLFqeHZ=r7u;>mwPLr9R37?-n^TZrKvMZUwn8^2U;0rDeEQo$Rk3?eZUR? zm*0PZuzO}AzgMf(x66bqL2u&+(X<@-h!8B2^bTVBGRxH1(zk`N^ti6FB6qaw=g8&v ztF6~{DOJUu9b(|DE~mDrEBdM^tM801`9TT%A* zO<;rIV=k)aW47rxK{-Ag4s@OC^aKyB%n9=wT?uw%PU=-7~x+rR~q z8FMohUD&kB854a@?t-Thr<}T+XSo=s5C%?v@i2hy0dNw(0$~YSd+7xDG%R<^NB^G0 zc#HcGWL2f35>5}NQJEbR2*L!Lm$EdZwXJ%PCC?F-1CcmGpwkJpK@z#V|^ z&9$_?KzNqF^@Ox*01CjP1pr*w`xOA%P)6W2{6HCBV@?H~)0oORy#4}|1u6?py5N-P z#X*xgq!Bd}r6hz&jKc}rHj@WP(BKJlTFD?`ETm6qAGe6YaB$a@%OQGfpI;p7o5i7M H`osPJ3q8zK literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Nic01 - Rototronik.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Nic01 - Rototronik.avs new file mode 100644 index 0000000000000000000000000000000000000000..ecce5cf9b16328f2e64d41009f3edac1610ab62b GIT binary patch literal 1436 zcmd^<&u-K(5XQYNaH!N1oH*@)O3vTfR&%m^-~|v868AQnR*^zC*t^2^i7Su7i|{nO z!}5(cp+bl(`UM@Ie>`o_2#Y?b`ji3$2&MUAI}gmh(|ws3yxrEv`yYiY)gO4=2MPG=Vfxn(C$- z)}Q!THUcL_-4uA+2ENvCRe6bERgif|??7P{!sfoMB4(%Ke(4HYw(xspqRN9Sa5S_U z8EDy3q~OSptE)V=Rlw{t-IA6CZ6-h7?2;?Q%XC1h**-tB-O5mgJKJ^ls2bU=nJT)! zz7*Ia9R~b+Wty>K4qda}SYOzc*ESd%U7;MqC!D+8EGeC+^XRz`&|E?eRM$DDzVoP4r)uWWEKPNBSn|7{ zJ>id))UxF6z<=+`yNogG8e`WnIOvNtk+7ouHS_=G&K~Fc#@!h|E02T0V3NeK%z3H8 z=m;X&5W%d$Y-4XZ0*q?@B+O%}_=DM0D%}_&94&&j=q82rwsz-rxV1sc%6NH>&(n>K zJM=gHkwnY)ZW4{OF>5hTTfoj-q!!d6I|ObPyF8msOO`baE^=hkG{A#(9f*fg8@t zFe;JxVR1T@3wL}^$*`311%0=2GoR0IbA4nQauCboBt#@tQW9(HeS0J1mssXu^Dq%xXTxp-}I((i-rGg1wYD*IiF7ogp$}VqG$?})kw!|UQ=QA3uTJ*^6!Hcb-C}l z!_&3LVP9~}?4Og9lSfw=TQYX#IzGglOTZX#2h2CG;0I<21&z~0KpNLEz9s$vK9xvp zzwZULaD&cXB)on&(w5P69h@WBDI~XRy94(C5G7*~VIHM3X_&D>kAY*a!JUE|OpLvQ zk&6S@4W@|*qe5GKuNyGrXL7*i%={MQ4>3-@hMpWy9+(=UY}Z6c8^a(wU}8}Pm8g+< z92j4OY+Jky`At%`$N~S?tH2!rStX)!qAI8pQ9HWErYcb-cC_f%iLDoqYm)WCfgF(> z3o42JN|jb+S59r$U1yAaDG`=o?pt-Q>JrQo27`}PIaP*Af~%c6>zZYMciG#ndktW? z3-Gr9-vE@i3P|32#xcSwzoqqz8o5C~Z0UWY_e~xm-j6*8AD=!$f(qp*&r!akNUY3$ zRo9ODR3|~_Xe3juFr7|9k)a~7XZt;`Ya8Bg@k7H0ETeLJqVk-|Q$g*C+H-1f2$7i> z6|CLCt)OnidL<&GY@IwdnstL108{_Wt};~ACMCf0JkW>8UV>YkRAY0)x@u;DhGjHmA-C7tS_4NMK{okCUvl5PmDb@ zqzc$?Xml+`c~M%L>VvWig*Vai-0r^Tx_xt5ZO?1wR#A(3p%U2Z*{q4zUS?*q z_KAEHJ_1LMd=VrhJ^?pQgx?$6yWYe>ZKFtxGWPSE_kQoq@6DU+vqh4~Y@*oV%NOie zaLE<32F|C($A)1z+lDc~WEkJogFdP;tc5pw@9r=*)NogDD#SxER`HlU58^b;mSj%@ zF6H_tg#x_t>UXy3a!gf9%Zu`PnA5lYS4_oioUzEyK~6qf-6<9 zFpwzTB*~U>dO}JZsy>?q5ogO-O<9mK9>t1B>|%!J~3Q_`Zgj+0ss<2u1B%NfNX)tze{f`6> zsHp8-Sivlp%L67)b$bpXeijFaB-8-RZS0-Tf;d@OKB6mXifRo~t~Ts8vTIPY5^s^C zd4WSPRcMw}i7Z*AaxFuLNum$WI72JYfeT}WVI?My{cmL&J#2=_QX!&Gv0vfvv7gK!E`Zi;yX|`m`X@*c7 zZHg$85N8F_(H8|eJdK9vKOzZjwPN*>uqtpvxP@AG#$D!EmV23dWOGfKjejmKF1Ft_ zjC1@4eLxSIZDR|{`87wrKS&<>!-nJiU^fGA}5 z+EG3?BZq=G2;xw%%Rw9jaW{iF2;#nB5Vzim+qRQS0bI}cmdLaH9DB5dSJ-}mtwF-B zH3hld^{`zn7m%@K+mDDc;R)LpAdRHTLfGA*<6#XZqGt{EDgE5>bL`FmyyF+x6eJK@ z!aD?C$^~S=JAUMVEPy(`09_aN^P&zBM((5jW@KYNQ;)pYSV+J z7HbrsMT=szXo<5ny{2h%E7%F@(1L-Qv}iTAUmIt0nn=e3@X?tktvbm|jso80g z+#K)Y<1oz|Fz%c`fP93xML*bcKkhkubZMX@`}^kE z5DifeLQVaVW!!;)YsR?HD|q6MUcR4uhJ4WBYmEi@h!vK}8o=we>{1ltcF;6kHYk$R%G(eK*nBYcrvbI=uT zLve0wZ9h2I0v;`cK>C9x{o~%-^ZeUe`ql-cromaeawGho^>xG44Md0ZUslvz AM*si- literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Chinook.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Chinook.avs new file mode 100644 index 0000000000000000000000000000000000000000..59d52d5b3be56e4365df77c289da263caf20f654 GIT binary patch literal 2872 zcmcIlZExd55OxtSA`l@R2NL&bKAceAn%YiVpvKabexZUxCo0{ilh8KaG^VyU?5-P| zFO9%aSfc7D-Lt zrV#&QA?QHxuh!{M<)JNvJ3B{ zGE3DB#WS|mG}DNxg_VT3Rw?!z({oW?N=i$bi5pnOP_Nw=VtPI1+<%nQ>co+ZD2a`g zS)5&+w9E8dWVuLapT5sC4$z~+6aNe9w{4Ve?;4MnGP%J#UE~>$RgWeo6Mxrnx5`ab zTg(IAbY{iW(s?#hyJ-;Jd(~%Jq6X1D1Gk1*E|(`{uB%BLNAe~Xh@|Zpm2Q`bWGdpM zv3$nQ&|IZ*oJqT5x079~G!6TJHCmK9zM5OiMP{{1npEzs&}ouX4LVhkB)my<8QWAW z48>VJ73)cu3my=e(R5qVRE~DvF`_(6q%mY{Rd$8e*UQ+T%^6K@UhL`)jhxz8Wn+4g zNC6XJu8Hs(rm-=QBic-9Nx4CXBeRkgxRiPzFf?^qm>GppUQdaQG0Nw(jBzHqif?2K zZbX+knunGuPonw(NaAZuzM|_)EonJd2qgiGDAlB64%bl(7v?}|;v!)To2tIXG#A`r z9^kHf(?0pGJ9)kK$mX7FcK%+iR{5Ue{J!VxJ^cWGmA9a~7HphHpbtUJ^WyL4pvP|$Li#jr?Gu5wtWLAO)Ix4mLe z49h{;4|FK3$oyV0!lv8Np&n{4h{EWg=MAI&z=yC1r^@u8@cV;J=8@MAsM{$+7HAwr zPx=Eki-wWUNFrIxMd*%?kB7C%;ZPq|EFTf3&go z{G$M82(P47X4*qFjz;bXU|$A&#>rhkh`zP=8+$&+bgOV11+w3Yy+(}m>t5pi`WnRZ V#yk_x4zG6K)e^@Uf#JU7^$$RalgR)8 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.avs new file mode 100644 index 0000000000000000000000000000000000000000..2c508f5601bd156e114ac3e57ff17fbea5ae652a GIT binary patch literal 5178 zcmds4OOx9~5SBxDZL!6p-~guq67buSoZYZ-DL`@{0YYuDDNd~KZW_V~nGJ2pT^1cGyAStwi+BfK64RyD%{L{>&GXek zB;nKxI6I8QT8eXQoq1s#QTmi1g_f}`Bok3=$CQT<+=>0Pjct0)7{Q_=g!f{}eWVbv zA!qky9!y>D@X&K+e%z%ZeaszIS{KH?Cu1JM|CQ=_T#IbsO4`VEJG5P!b=d8hxHpSD z$$^N(9z`KLn1!s)cCP4`S);mm{kY2GsR)no%7n4)#O!8x7_Fzl*r|8sy5K0MdkS)w zZszm(6(%PN(p{Gyc{U=6xQj}z?VSg<=a-i65Uq`)fOkV4ui33-S1C;?KEfJJQ{j!q zF#s0EBJ#^rPOZ?pzQ4TrE>|cSdNBYdaX;7Y?AQhbI1ib#Dro?qtq~$)v(V>K(q*Qy zN4VHxP8UmgrR82y54`V_Q>XxW7hsWK0f~LX-!+;t9yYS z)Hk&nlw|zGIZeA?tJN+nprF2~k?||&FQSwDIC{~}LwEzdm|H9sYKrWrQIN0kzF*VM zU06V%zNyiI3+V5m*Ivd$TEj4k>#{M}-byTekXl|x@9qpV>`#lW7z2F=qNY&}p=D~= zi^`93Aa~EAzlMJN8T6Dixxp)MMTRu0qm!3&+T#mKVjsQsDjtdDHO-EJ;Ps;>qPNf+ z&E1Q;z1>rip*ToJFS9`bR5s+-BEOW@%I`nhQq{>-a`N1olT&h`EmaFsczFT(XV9yS zN?sgdRZlXde(5np{TW3QBg3)*);e_znp3YO%_gJ<9hDfF)oHVwHk(G*T$=Q&CjHW+ z50l(WW?1Cf)H{YgNN8X#2PqBuYOqH)!*H#{XgX;pGnz7mCd)N4Z9(IZCN*6vg`B{~ zZOVjklo~%t~@K0uGqnYMr+gr9j9ou9)w%%y#ZKKf)P;{dw z?}@mMZ6`(x8%qt^YKB>pY!FRw*HVrkj|Awv91Z;$UkRbJRNGy?bL=r)YAVz?|-rhi@mPk7yg*t^gE!3GMvX020&Y;eedS~DymJ`XkNE!o~ zSnAS1bkba#LYwAVh)$MkGibA13sD;)QOaP%<48JnKn7LTO%$bPAXg+&&h*!2kOwL$ z+vW7-a(cIo3=yVe8SNUPNH7Etv!f5Do@G6G0%HfC!68u!mBC_zG3l&sCRJDsrKS zrgWih*~Dnm<(ruKtKXhnYN!Z_HECiAVx^Ga5K_q>{2u=M)+g;re@Pv6qeH`_DPT+idYctZJ--vbSH=-R38(3M;$^tP!hbV}4`q*3M zD^AFQ1~kS%`&{K;LH`;r&=x9lYs^5q_*-tEOau{#(Wy|#9#M!v+_T%pJRNI=M4m@V zRq7x@QJ;T;I9qm-iw;ry;dl4^b^6Q8ZrP{7obEn-&#R4m(C>}uQ=^X`^S?Hzu#Zau=e{ito`C4*3$Vd&|klyX&3Q6#^6hQNDfF|{;d28a_yHt bwFc?XwZ*Y^^?ednjr4{6N}JpN*ZRKzV=*)r literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.avs new file mode 100644 index 0000000000000000000000000000000000000000..448639d43697f1a70880a0e6219f6d3248e9ea30 GIT binary patch literal 5305 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 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).avs new file mode 100644 index 0000000000000000000000000000000000000000..03db3ca51f24bb949ffae699648f62a2a2e882c2 GIT binary patch literal 4478 zcmd^CPjB2*5O??^LDT?3aN+cXBC)&Pb@op}n`~WL1u6xag4#lbR8+k7+w5a)zvVq| z);0&i5hOkVH`Eg+#HmM)969g}_yT+a%5QA1_fIwm8dXBVitX8%c{B57=J&?AIre=m z`w_eL(QWpD;+jXSX|-Q7UNsEk+vg19YupFS6JGd6#3oJ{u}CscGAESLfGgJb<%B67 zh?w=b>x?yL2W;RRb0~$JX~_a7OqlGmXdoeUd|z?LOX?)z@yM5odysK9a@=9A9EpHy zc<>kxJxIqRa+*7d20}Afwx(_%(M|#jPQ*rBX&J&r0;w;C9Bil`bCs}Q><;QIkUD~N z8Y=m9C1TKZHjpFE5;@KniikOyO}Ot{Y-4?6{eE_BtT*1~N1!+*_zW{N!}|%SSbc`Kd-&sJFPJ9zYK+Xv5(Qot{nT2@B#;;9N#_O2k6MC z17ITtg~lb2Xd%O?ubUiRl#d3{>`;V)&{-HosF4F~$uSNCY@_E(cZj$h6$v1L*nvFe z1cy2k{cL|Y3~+vAkQCtdpmRXr42O)6=D~}W0nUq&a1pH}nPz#w7Uk;}&k;uFfiHB# zL+lc0o27i8$E?Aw3#B854YIp(Ou<*!_TEmDRp(V_i-;=gGDkeYUI`-yML!7paxo0X z&TN)_9GMX|z8bQHnaO0b$Mi76vgPq(fx{Xlv5>cgz4O2keyMqtPX7T?Z-qQs&|8RZ zE;S|j1amY>aIOv_AS;ZN^vh7r%+NL8&wA079%c+CM^8k7GtzlGm#u`!q;dEIKJF}~ z0k1Efgp7?tpKG)vAcnMOlWrm~y$T=}gEFh3284kdi+$j8hX$M;G8#mI&>5Zzw2d`k znnoevB%g<6SQb0PT*{f~evCh$VZX;oRe%AViHdVl3@k| zI`D!)*=Iq5a5CU$BXtYNpdWXTpxLQMM>~~D>V|> zgGNFc8|#ig8aSla+L?)3r9$b1 zcGYZEYtXA%J0{esTOH_8I+qpAw$8ZLZwpDDZSawxns|582mD(ybRZ5fuDQit@_hQ$L^HxG)b)0t&NH@v3 zNTyD5E=V`cxhc45&IM`wkjJTPd{0R2R!}e0tl37gw=U%&&&hV@WLdPcWhhU%48hL? zJEfqtgDuTTItvnPtl{)@r3~a^Dc-I&V0@=*ypCu?yA2$TgzXTF8t4ZR+nugR?Cq{d zZD;|A8IA#CP=@i~=U>+D@R+OY*Xjo&EH7Mtyfqo%Ge*AIXkN5>!N|bh|L=MpTQ-Z_ zybSunQVJe6e_DGN-+p2!*&aLm@W!2k>jyXPymM<#?3#V7=WF})zZ5%k&dTd= zC?uW9RL|)}c5pNszph2gCZ{TY`zBjIo@4FF3y<&j({rr7dXBa19BWT5oMXR_x%Mh* zbnt~?G>S@obKfxTfq>HKD`Lxg!AQQ_%HKcM9f;tt MYp1%fo$1#80^rKRSO5S3 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Texering 002.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Texering 002.avs new file mode 100644 index 0000000000000000000000000000000000000000..bb8a53f46bda7fdc07e3b5c46bfa7c8d6deccbb6 GIT binary patch literal 6562 zcmeHLOK;@H5$47|Bmx9q93aT44naIGambP6+4X>k*LDDJj12^9y?G$Ofn}#cv=S}9o$TEc5o}uDo^zP()7sfo zXt}hlxwYCb(;8VTZqHhQVXM`W8l#Oy%V;Lkiq69{7Mk8EGNH}NM8jSst5I)~wfDXge81uiOE(CI2W|43 zGM4FudJWW{6(*;UQW=Q>89C1qK}b18i3n55>YC3LnVDKpJ`-g!@Ti zQHxY8s6CqN(=!#QfJlol7ct>$IY$v~eK86CCBhhF%*t5k7SgP&iKZMMpd69fh)=0Y zXDB|1gyxC}V9up6e2Aw4=ME7YuA?xmP$W9%vtCz>b<3rP3e{wZKm~!&16oMLL6`Cx z<=dJY(6q>zX%GBw`8!}!k7B<{QS6JE!d8MyQP(9kui%c|#qc>8q6iq6+oib^b!mjF zb{jXRgAU_G{O&k+-v1HCmtMg94|g0#2eOyR-e?jBu|GLHSo#6*=;&@Qo>YDiDO1l& zKk&dlJShD*DE(fvJgWSjS%Oy86tnDu5?RV94nXZi<+v;>N72>`o~O_fj&Lu38(5>bU+w*uHPNNP;V&*Wf%Nv55IyX@GIt* zLD}ofh6|n_9)w9Y3t3|-618B9{gHbz@VWzU;IoJp@tPg`gH!ijcVM-KSb5#y2tt<{ z=XOVIye)PDv1w9>9jVi8sk;;Bk4R4J2Xo{g_WPde-5uQRPIMXQvad@u(N&L!8zXIAcR(D+;RZOd)PP) zPQ6JcgOHEo5jF!JzI!@mH0rU$>BIuBCBNVSuk9O_nUY(IeJ}a#djKI431zQ{n@r|kKtJwz?-kVcl*=dIxpIP zG-AikdWf67t>>RVS^YcdNs_(##2dNOdFF)ny(RbUUVIPX{cDBI?9)$Pc$5DHLl493 zGs6BWH_muggPpTFK86l`@OK`*^uxA3`ps9@EpMTFb_?CkEp&f*3#{J1h3=off^L)4 s4=x?&W8{keX8QOC7+0C@?qrA2DN%`^Z)<= literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Upward Current.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/S_KuPeRS - Upward Current.avs new file mode 100644 index 0000000000000000000000000000000000000000..0a5a4a00de29024b2ef60f7a1eedf11635459897 GIT binary patch literal 2713 zcmd5-KX21e5PyL}OKA{7pdy5Xkuo@TllZv}ZLmC`&OoICGfwQb5wR1Voz@xI{ zNLp3D#cnXh-htnOrCO~r{8j!(#pO%=-jOA2snr+4@q*&AG(pWs@?Z3Oj_^;~e5d2I z0>_q4bLxure%rG;QmgB_NO7P29SjEI0%I{=vP28ye3~;4N5o_SeCLLy|A%WEHXtW#Ki1&EM)njhVRO^wh!vEF5> zu}$bQRvJa5|A{VQm@?8Wfq!F9OrvN8OhkS}cfna4?KAx^2$@U`rCVOOiiO%CxIvAg z`N{5(j+=r*D-1A10n--tGz&4|Ruh-3#8K%q9f`6u$tGR$y8J!Mmyr37FKuD56hliq zjp)!dFkM=ry!_$2y0G2tbcOWL>J7~&)~^`VS!`ycGwEA@S*lK&GM7`IH2vSt5c_6^ z*xn4WJ2S*;GsMP=XaCO6&ln5nB$t$MfWK+>4NZGOay(!^9y9ieWCl5)bvltgJ16fk u4|)O+jmel5ilsOau;eI1BRzZZ>caMc<#|p=+C6CRq2?1rL+8)=q52;Xxwd!! literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.avs new file mode 100644 index 0000000000000000000000000000000000000000..ed66c2e29eca2030b747ab3b0fe75c449161f99b GIT binary patch literal 2120 zcmd5-&2G~`5Z=%pDvLl5a6zgxR2Af}mYXP|Kk^||ilF>efZ$j;@g`Zt@w(o16Q9VD zBL~DQa3}{Jg9AuB02khXCm_r?Nt*^*(S`#fjd%B(`DVY(+LOnT=PB9HPI@0B#54_Rfb*)UO1`29YDs58HC!uHx-|-+ADsF_b1Izb) zUmiGGNdM+CWt~ImUfQU59;$FTbVH#v_n{WUPSkEY@PMl}?iRM4NI}LyzpYV6 z5F-nQ?AMK4}4p*4cAXae<)AvHvXK-yp}+zAWYO|GS?XYl1LSOtqJ z6w6cs_c@NOpNyfpqu5b|NCCkr;8<^ruNBL<6aFB{ld)?!l26+l0t@K#qd;afpJVg= z6`b#&re zx-xNv5O#Jsppizv0U;qInpGq`&$TBzMA@YeQKS{G1*ELtxcJfIw9@0Y+U>-i z3%T$MIB@08l_Ng_4&3-Hgs`8)Rr^#ZX!8x9VYY9l%~ z5|QRCZrDfF>1o717Ue0tnbW8$nIA#&w92w-y_N{(u@H)_j1Uabu5~I`4a2uprC>#5 zY{~QrA0f*=R6<3kf;GA_OrPhhQno2)2#CTv-V#1E#yG#mj*PPkn8QLN8|56Co_ z?=44DgXH;(AfRA^a28GpNCxEg9~lsk3|ymZTZEm5W#?e(P!6sP59Z5>6Ci5OdkZt? z`^x}_nUo*AhqaJAqMXda5%SsQ9k=Q7|6j=M;(wZ3^}{E3KF}%^d9e489qIf`tBM$e zJ(db|MfdevcOSI>w+8i9f6v=zlDzG!ZB1Jje`WV)^xsQf1%#O30j6VuH?XOBjV?LZ zU$))av@cM!{(DZKccPp_1a#r;40bOdpn2OMBP!(Yi6p+mrsQ$1txqjA91vrGBo?z^ z9tNG;a!cYmzay4OY^jk!Dxi|gPS9XIUGxZZ4G}*_v_#TlvTGRQFdp$&&dbwpU~~6!6_E%ne0sxFfhQ2wQ@qaBq=i+cJc4Rfs*|P(i$p=?da)Yz$8+y(v$T zmtZ*|a!<#5E!QmpxH;&qsgCFeL3=7#n*AUd4O(eZu}?66qW9PEKmkr_+g0DBvF^0m z^4db&{zEKpEHtINu=@FDb@b~@Zxh12&tQ!V&cinA;hwX&QZ`#k1a%c}A9pWvN<1iU z-(tGFonf=#=_HCvAHTrGEJQ_3nlW{gE7na&Kap4{eeQ246#S(&;}AuSE_g7VZALRn z_W?y#hpr{Njtn^+(!L;7;r&h6<%+iO+m1d=TGOw7-g#0fD+?uCR_jq$D_sL!(;t#) BO@aUb literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Electro blobs.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Electro blobs.avs new file mode 100644 index 0000000000000000000000000000000000000000..dca6334cea598118d2a4729e572ecdbf948227fe GIT binary patch literal 12989 zcmeHO&u<$=6rKc-iosHgS|I_4Q4|T=YrDHnoivJ85Gs%YqC{$-sz8d?yJKgSwRgKa zCcEZh)C8el^OGBVI~0+ST(37?W0x3XUo0?o0D0FFwhVpV^88j*EbLB^iiKj~ zrrX=>2E56I~FzP@%^t*iN9ana(AP^4U+FGJw zQ#89y^mr@b@AvojE&hRs_R(CpZ}lTyvS8WicRKxU*DV(d?+M}Y zb|?gwKJWUD+fKM2@_r}z(ftZzLr}3y50aA-C}Ph+&OsK( z1vI=pI2P_ei48NZgudh(JTc5=L?eRPk7;>NF0NPz_D`*U7&+ z;YZz%;0BO&9c3QE19Zk{q8Y?;EEn-6q5Nce37Iz_Wd8%?5f{JXO}zYxH_0o|UxrXh z>m#CnEHU=w0$W@j!a;IUBET}_S11d0D6tvEV3nAO5~YN~F>SK6yuL7NO6_1e_e`BV z0Ae7`fz&X@CMH9K9K~~>;)&Sv7^Hv`8EG-X&%qHW0z+Ct**Gv`#S(#&z)T)y&<#~n zjG9m@+~|+8(EJ%$Y}<6(C9CCsE=smt6+Ne1)vLCx8D*4LPI0?$dF0f~)tX(k$$@f& zn{=&cAr?<*wX7;(Aw?pzO=WBtY6hzwo?ye!QnmpB*_bbi>jn+!ku&+X6XT_6sG=Yv zb_=ccOiVEzxTZzxr8XW2*$~-MDYaG_<;xA727@q-y56{|x~WrHMCzDPEn{LEGXu{N z>xVh(r_cJQAY(e#D>Som-sgO^&%pai&inj-z=+E#JSN{{H>5>G$u3o)bU+ANpB{r^C4{ zzv%N7Kl&qis^_$`5TEtPE+>9YiO+gwmlHpy#AiLU%ZZ;;;7U$f{ol!5mSeh|w=XU3h*;27vL_`@7qT8p zhi}P#XSe0b#;zoAv)<|kkCiwJnHMogx(-Qc@_OUQ!q`{0zhAiKd$>jWq4lKbJQ&|w zO|P#4dyc~W0_3hf#B=&Yb=|u#oE``SVS^0qZfC&i8L;OwV1HhlJy!Q;#HQq2Q_7J2 zvc%Zeqz{kSH?K4Hol=k3<(s$*37zgk9$$vfvYoE>evG@>LrmpmJpS`)Zx#OMAv8dG zUxZM46+*UD(nXdAf+p+JEV6G=km{XCYLTIT?ELC*!u<3qwSCx}9s5HD?7a-wyBV-S o2JChQtUe<)W%CY{bOHS}HeR5A^q5G`@?xTSN_Xk$4-Tb&01A6XC;$Ke literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Kaleidofied.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Kaleidofied.avs new file mode 100644 index 0000000000000000000000000000000000000000..bb5dc04806852108f5792d8d89d686c9f16a1764 GIT binary patch literal 1958 zcmeHHUuzRV5Z_u64F-MC2MfYjDkiz+dY3eq;SS}skK+2_Z>9dU6qcOBVgwmEvP=_N0-9Zrdg>i}SPRqWGg9ygc^gXRc zu-=hzEX@EqQGn0gbz**122>C1K$@alVg*A1nMyRMvlwQ8*@TnC zLa5>w7V8*i7=^VARD>H%I}PFxx=|oU6bzvZkrLQq1D8F=Gq{b4N5KA^pP#Ry@tv{N zjS@OeQI`pkH&B0~u8i@Kat{t5uhfgFmKEUTTS#Zb{};tdC*m+QunLu z7OtsSY%G62K>Hc3zoDPn#=`MA6(SZw#2wU}_ymm!_uRc5Dmvw9Z9+!Iv)UvNpvcAO zr?~#L;G^Aq)DX3hHX4}SZ8!f%!D6!?4buw#Mi#D-_S2Uh; zrR7)ajTVj9^YZZ_WjRz7ap~>g%EdNTw$TWASeq#PN)AAC?Pxn~oodz9T8O3O2VSR1 z=Z?&>LyV&s?z?-w6P%a|(I>WA&4ZV=K*+@MiFGE^=CtM7Vm`yZ;&#+rUsz?j70>lI zv9s2uM;+$3jQX3S4McrJU4M?_E*H3$hZD&S)nP@Z`8$V$afvNZp<K)CUlC6KmWfi Cu!w8` literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Magma Flow II.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Magma Flow II.avs new file mode 100644 index 0000000000000000000000000000000000000000..ef68862acd3ad929c4025ce4ab36c9f2cc32a9be GIT binary patch literal 3314 zcmd5-&2QsG6rU^~LI#TpvEoBo7_C;qiJPqBG+I`bMO#XtpcbTE0k>T@u^kh~&Uz+_ zeL)f8z>)ueGZ(Z+4jlK2)Eg%x&Yb!eZ1}x#tR__|Wm6&TNN;A|d%ySQ&6}Aw$D=3` zi7)x?*Z25WsV6+it%m(ByUrN-;$3ot_&9o@fx@%QOta*p2wG2*6L10l&GIdTu|A1AdeXFY<2^@)=fspliEP z#5+mX>mqc(> z?9`3Byc4;mG-(t%12dpey?Z@j?R1SfKfI-+F_C&f(AkJlKh_?To(M})DF z)iPn5nXK|{o)@CLmP3@2NY^qaGesuNP9h9a019}sTC*CKO@Q3V&0P2eg1o^J)Wi?^1YuI&>A*rNI_`!}G zazlwjeo8sAB%Cc%rBm7}0QdwRsdem`yrt5amp~+G4v2)$fY|X2=u3xkY#MW+*=_a< zot+epk>Y+BO{-b0x2W_Z{--P-l=o7LUZS@7IT5PNOoGT#}U1?J# zE~Fg}dwS@jY{b#jS{y`)00wlSPH+7qSbFHq$@bY1l?bW!VU zyG=`P(T}5Rsgs(LeFsFjjsNwVval$lcrK~oMMZ|bI2Ib|)QK*(RVw5^RL&Ngs*o>3 zW_>bQ)U3#n%Z)48p6yRoTxk(T>z?jU7KJNvWczr3vLbpBruMtHzU|rW`nIQQ+HUYC z?CGnF4Q5;U?Ji?KtNDcedcSzq?BSICjaTz8yk9lvk$L@O}VV*~3GL{WR0I>Tq)vB6j?4kEf+j=sADT#ls)4WGJ}rVrK#y zS99|XT##wXC=^4U>?e6t%|`gFq+)2ji9J$r4C}3diw-6&G~E0F9S&-cO<|HM%5;_onfin!ckb7 zRq)btD1Z3Jy)7-(GOCaI}J4pjjS+9-S0SIh2Jfi@izJuc1AvLWnyuQhgR0_ zNXs`_B0%ul9=M}Ot4TDp(W&dbb~Jcx{z7;FB5a8t3VXZP>27)*2k{u7%3r4FFH)c!mMq2bEb>5vYROUvWT6MgyG*fU zDeJ$r&mTc1Iwid3ZmQS8v(NdF{PNlA$5|3asn`F2Ze}SeBG+-2(r%pSNV4r8AYS(( zV-?1=55JkOM=f8*v%I>5YK!XqD8EPTH^0g}_bS*Y`3ro24fv1m+%SKEyzdP$Jtuzh zDf?0bU#o%dpC4Wx^Q?jI{RY0%2EKcj^sP^mvo)K|9@ca%f1dyR>VB{L<^_QM7XU$Q Aw*UYD literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Pina Colada.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Pina Colada.avs new file mode 100644 index 0000000000000000000000000000000000000000..ac4747384ffe14ce6c3791afe48ae1342c8b6e23 GIT binary patch literal 3000 zcmds3-;3Ku5MCdJHZF!zau7lSLpZ1v?ES> z32qe=}V#gPtt#&mzk9=Anbqp z1P*hlB!V??Zi;Oo#P=;Bo|7F$i4O;9?1z4*eY{5Nv^(vmQL;bJU<5LZu+xSB%w|43lxjwK^O;{L==$V2DyGw7K97t}`%5WfnB-CdrZ7*#Xi`C%L!l&O zevSE)YjE=2Pxe>pM(&^el%w? zgi%OKe7p!S5PzMYpWpsahy|U<4tH$J8l9Brk^Q_SM60AhX?rE?b=sv@n%3ans9%{1 zdn!u0rKw7EdLEB)T{1(IFP=Qclfth{)OMd5JFJF5_;EyM()p>v@So!iS94 z`e|O#oNzs-O?$(-0O%T~=Fp}aA4O_>QZ{jp1sDt8`V&)gagJD&}gC zD|;1l6)3LJeWYqoA+5WDZz>x!Mn9JtUwQKbA--#gt(^ryY|9!4*&#b6Yq`{wURPJx zv5dZL@g22aS9v)kZV>Iw0}pmBI%?AyI3q%Y_?Rs5Yzy`v@GL-bKyzWok_4z4UOxE2^`B9{1nS z^G>I=ygtK!=sEggd+SJ+GN*d3YQVSrQhRwHi|H{&$H-J?FrH^ZcS`q{*8YDd{G>R| z_RgOD)}sGV=uh+`KU=ZoU-{F$+&& zWCQNY>kHoc+Kp@V`+IQ1Cey>25HDyvc<_gqQm|iW?EG{t_HGIBCyn_v|NCdg@B4q% F{|eX#A7cOj literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.avs new file mode 100644 index 0000000000000000000000000000000000000000..1d34b8244d937c73652b9b43515e5914c5d494fc GIT binary patch literal 3097 zcmeHIPjBNy6rWI5Ad83-7cRUlMe8Jual8#-g)Fudt+b%BNJYSH<=B&C6x-wVjJI(v zWN&-~j(iLb9QMeC?|{SyKzsqp?>P;$s~jl3fYc{F&&>P(JbpiaR;8)Y6HA9*p3vu| zG}4mq1#gNsgb+Wrg!ln`66->e%IT!gHdWJ^rH2pO&f_ak+i5#rsr)c2Xh#8Jun$x)g z?T#x;iO%m>)KS#%LM=0$BG9_iC{HL(BbBi;B`SeQWH$jk@yFTO*)i^Kg}dD22lF<9 zjp%|aFz>}7coCX~r4OhMV_w_N!iEdmTc8CTpbL%4-G%LR4_E-BFxCcwuI~*y-9Ws> zL97X<(rOdCzUL42@d)^Fw*#wyQ#A=)tS^Ii#Lj9D>m!!$;;{%-H|P&ILA?p2IKXh< z=MY2j8m#irJSnYv+UefKX-zL-;a>0#n)P+;@ALT^$lt~$2@?dkH|oRJO*okU9_J~; zvd0>KT^=kOYTgTW-#+=db)-{V>2Xw?>t0-bLh_x>M6GtTh9 zm+15&u`v?^?swppgNG>+^p2F`0Zx~Ywzgqyd-WQ20m|o~3-}y%PuIZ6vbuQ>gVC@% zV`1A7jD?K9>&^o1Y~Z6cQ<% Q|34@G9ellvSUk{w0`xynZvX%Q literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Solero Shots.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Solero Shots.avs new file mode 100644 index 0000000000000000000000000000000000000000..086b3e6957378e3739cdc285cbc814c8e68af1d8 GIT binary patch literal 11374 zcmeHNy^q{P6!!&+XwfPu_>d6AC<=5XUJ$N0^AZ^riX+@B{& znNKyl^U*f@P{~qi<`0H1I?p+d^X-P?d;{3d6RC2xy_4&*-FkSA(r&d|AII69v|uA9 zMXcK`)@KjqDwBfc(F48_i4RM!-Cn&t~&9jlFhjOUeZ5OUZN&?L|DTS+3Z;l&px9E-_=K zcj9uXE^$S>lGXWKv3x&c3qsjrD&Q5n z&FX;H>~_0V@v2)^x?9GXTL+yw4Z4%ObgNF44!e~OJyUf`t%$qkb+@b=?&^rUHrzFF zQ?=w4yxddTMdemrmoByE;ogczI?9G_)vM8Mw?x1Np#yGiBDm;$lIN+>Ndz5{c7-;B zcKpG}$g3qyrJb;=8fsVNx|tG9MtL34$INK1oTk(uYQqvG#ZJWi!7b-|n55tZM!rR| zWg+-X>avg%*B|&n57n^ed!YM%Xhzo@=Bf}8w^^l!=#ZVtq3MR`hSW8zwdSx@ZCGot z0;or1w=lY%9{@|Ru8`1mz0K2c+eRc7ivrjAg4uCfV z`(|a|tneLZ-&gHdfc>`e?YEWvVzqeyq>4_bQEYa_W>;*^3OPiZ2}DwSCGBeSt2S#* zxn`TSw*La`9~S%H%Ko=9{}F9|)#g`iepR@~|4`dM*Z=8xfGdc|mjQ>L;+>VwbkX4` ztW&g3m*ngBFWt=(Au~UGgKg&7qdb}GIM3LYIiW`qKLJ+He4HNT{1`gKfa7K6bNi$; z;jb>}Cux5tcary?^ck3X0JZ(dyX$=!>~KK>W7 zSKqn#eSg`yxa=2iT};+llrM4pF*)XcL!om#bed-+F8(+8=b?!UAl;VweTBf8pff`- QFL9(WEn3=nXfYA~Po;g{$p8QV literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Square Minded.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/Tuggummi - Square Minded.avs new file mode 100644 index 0000000000000000000000000000000000000000..52afb5c6e0d4230a70b7c0322e02ba2cac326114 GIT binary patch literal 1640 zcmb7E%Z}496wUD1RI0>=4XZ1JM4C*4lWB(;MqX4%2=Nw!K!^p(ByMUojf3ORW(R8) zZ21R%i7(&_STWq|)-x541*sh0$2r&6Cw8B-W!b2yfyv8bc&0@o46rD<=3VtX@AHo5 zeZq14u1&Ro$Fj;r-tWErkEh@3_g=|rvZ!GUBA2G$gCSK?8Zwm&8UASitrl>7QYkYN8eR(B!SNz3OL#VU{^Ip@qWniIZ~MIoa_y>1EsYTsoOJM@ozGKv zD4IDgt>ZZXy>JC`~mNQjiq4k#2Du=90<$}nN%N!x8aRnl87eC7- z9QakdpQop%U(oru<6XS*0RuGt_7K>|LBtE*}avGfG_2^Aohgx{1%h+$)x-xN8IVY?(+60zIZlr4_?-lv_QGB!7g;)6eO z#X7f5@xJ4kLAiJ#OjC=@XS?{Lk};L5IW?g(uJI)MacmP5F_xj4%-7j2i`c=2L~zuJ z`)dM=2g9)~#~7t>Rj*#XuB2Y_ z-kAkK6z;~x8}Geq+?@`hL2Ni1otN2PCnqPb++b|Z7+a@*RL;8|1MqQ_%P21u1i|-> z#+@+e55`XSHREe2w}wGHm=f7fD8&1)>olJFb(m_anq;ZAs+D}zSM@S@ zU6yKJ#H(bf`dKu{fIn|ayEWG508lyaBB9EFYJhdXK5JkyFQAe5N!)ZcHVyCUmDEpV zoBasVoMz&-dfz2Lq zZ`PmsQ!(zF9qt9wsy&;K1jx0GQj%mXd*CEdu9U|Odp6--KRg^i3LnNU`G^N&4|e18 zI6+yC2>ljDBp&WfhkN^v#9ALzGI1}JjJZM6*ak(*rSWzKL3n5a(vnPRY?-r3OKRGT zCVkGmq{f+?;RGb-Ou$KMw(L(~`E|;=FAhTKk-R0?gQV4bQ0KZzw$A zBeh&;*A@@G+VY{-%jw`G=s;UDUuDPTE!S~4+{>Y1V1e^749+NjTJUPLuqU8s4?X*v z&>o82Lwl&+Lvd5md+5UMs`pTRm)CcB{T#aZ2&k23s`pTx1yai&`9DURom@*K)j1z06IQO4NwDAYeXIx4VvWudxz3Ak^Oe1gQMrn%of^FSbP zLs&(wAV@QUu60_GSWt(zp-M$w14<4u)@V33M_ldW$+?&vMzTRbGQtEb&@M@ug1T6cG|iipFv5sVk*Ov~ zE6)(!vJZ7Y5Dg3SV-%!84GZgsWc+AY7(dKyPil#d9l{xgsmyWf+96hZm;jc~O_5{@ zo#hmnM2lduFZ}3WYKDm=5^l+6TGW{(paXQ4ROK=Yvb|$>+9s%DQ(`%9IUCTQy$#2X z{TRJ1aK>`=@Ht>|8Pw}y79}?KUy+f+65i@M_)qw_L)_3Ee}xRU726#r z_chngv*&=#XOYNBKrvb_T01x(b*^6Nr4l6_#*n`vIArcUy-cDo3F4yl$FGk%>>9R& zx(dZ;t=P>~DEANAPmH2an+m0{(e>T0>y6uC5KfJ4G08z^{vRVFlaey&QhX$14aK>9 zvvC+sN5)7@HhRH`XqH`y*LY%e-pShPyubVloqvCN^>M#gftPGaHa~vyrZW99^Df|t z>FX7FDFpcC9+Qqn8M~j~VXRHkZ!z{dZeHlJ>mPp1-p5_r7W& z&iqy-=N@iqN)E|Xa@a9jE(Z!Jefq3l%6aqEO3n}S<#M21DTijE^x0{S~ WNv-_iG>?L-`Xc;k_$vKNVEP-o#Lb8R literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze.avs new file mode 100644 index 0000000000000000000000000000000000000000..67e6e487c63a1c6a98bd756fd4c68b746aeed829 GIT binary patch literal 3807 zcmd5;TaV+m8P)dkGN@CaXn{6Qd`J*kwluapvpb0(U8Vo+GrAgG!J=gwzTb=1u;WIw z%&7z031b-7>d@9K=B!b6%#PA-nB53gi@n{Xm1=8grGlDlJzgD_f_?M}TWPiPz)EUk z*}!=Z=I^p!cf7KVn|d#6Y|(C{VegFD2cqH!BZ47S3kLg^OISB*C)g6&wNlzlg9P6R z&B5C+tC+FefrODzBZ9KELK{&LJEm41vxl}7jmg+&O2Jw^Wy^zQ(z2sEG&S4t?S*eL z&>GP=W*T)Anw;Wtlnb_e#^g0_oJV8c6IL-U`FwMyah~ z4?;U1X;HJoew5kiK1ItX*Yj9Z#dlXOPmviRCr9MP@nMD`bl5QM9!o$eUHh*X1emm9G`D6Oty(UQ`n4 zbmT-QoB^PS(f?CVTpPTs;Z&9Zg|T`yAf!&21elr0f0Ew%INA3?T4xrAF*rp zsTB_h|L4+D<&LhtL{kv*9-S9ii=?IOcsyq3=~tv5->-aXkJ2D(3RI~Hu&*ICl(!Hm zrExfb6x9t52+hOs~-aQr}>@d4#9c|-ouzCL-hPa^NWq%g6-(4;vv$Ugbfd&#w41* z%=m@r3&XH6FQ7Z~+oY|YUJU)1{?qd_yg%`y$4`vmkNhWY<|_<3MADTq$?_C6 zGP=4Oc{0nM712F#Oi^8w%Kxz}ehFi3 zdHWx$0wO*{r!f35dfkWNAB6uIABQk>6o%VZgn{b*RdG14{d*vWrT@Q3{1ls}9(n#3 zMBp_H&x#NZhM%Hz z>TX`vXtO@8(Plj%&LgHrBLeqGUII<3F0K2-bOiMQGU(kN3*OQKmLTOIl_$n|v49zL zHL!}X?Y!hm6UXU1Rc?G;yPP@?s9eQMf!|8;cAfy8&c;(O_$W8s&b@5@XrY6JZZV*b z7V-q>rG-Imx((hIj~04Z=!1pD1&2if^wPp0H{Ax=a)&e7zq|uuGCbYUFeiy&3>af< zPj-mSBH5;@E2Kj-a~ius_9fiVm;#L|U&Xl0coT1FuhUd^(@O|GQt1fxR&hAIC@=f( zixc8b6l6CE{-v7)=dz!8&$vat(KeP{0vYKN2*^H>J#pvFe#6WBy2h1r<5_aLkLc}^ zJbN~#iwC$X&$zq9gFcw@C4P~{emceG=EOB*JYY!pZ0d)eaP$lnjw1>;WDfJXD|I)~ zouZp>kx*IN>$k_lAfJts6Dxv=xOSy>6YUf%K!cVou9mY(9#n#*#XRWrrS2!X4>~YX z4VOtbF3iwa7*;Oa8V=}i!C+YR0Y%tMADYld5Twf(AF#JWu)qossA+eGdV=6t_a{gN zj}`$Q^i=Rh$l?SAR|Gv9py&&n2XF>^bg$pxT3>_+t=l*y7Ct<$S_dUs@4vr}$j|fJ zBKi%iTb#;B$sA4#1Umeu8w(SBaK2!fehbh}3GiP~BE)}TepZ}sO1k;zJ)LUwpPugk DI*2#p literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cartoon Trip.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cartoon Trip.avs new file mode 100644 index 0000000000000000000000000000000000000000..60849e4209f673d282026d2da02aa04d8a8b7886 GIT binary patch literal 3287 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 N?l)`v(e~s!<=-u@IEDZK literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cubic Flower.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Cubic Flower.avs new file mode 100644 index 0000000000000000000000000000000000000000..5d474efb5dade8292328e0879bfb1860a8cfd7b5 GIT binary patch literal 2477 zcmb7EU60#D6!lWR6cGUhBtU>h2(+;sJGQf7i!4j6T7mWf1S-&ng2cq0B%?TZ;dCzg2 zUvD|i&yYtep0Aa4xwv2fyT6;uoPAZQz0ku!@IRm7U^w_;B@M%mv$+rpQLx>XT?%ca zs+d}^dL>xCn+x`!t@sADzEPKABdR)N7pIqk@uEP?LM_K^zN^_@)+?kc5vc^gDx65k9%u4OqMrrZf26)X>l?(LEIEZEo*`RYu*GyW*%~s?! zE9DwFD|WAxqGI<~Xm75#E)Z3p8df1OXIk*mk}_tzDgf31&66EBD`Zra2zz3|PG0Ze zyRhfeZ)l-*Rn1YNUZEqjzvV;$mUbUR-ht`OfoWR=4Dwp&U?EFrt@QJLZ3F*6pqOXCt&7^Q&i_xteK@)v4xbg^Kq+Tqm9iiq18fj+3Ge*Csv z*OHguR%x7|BEBn%&`j;CgO?%W7KzQ+CIkDs5+fnCso93hl5H&Mds&tU0VOiGIV-fR zSs|*nPpQR|oiKGjNEiK4ps6*Hj^fmvVVm|?mSzR5=4#t&xm=+Z4vQ}Z9X~Z-4;h0i ztGwLNkmhQ$Ek!M`o#QV0eTFWP;oQPKdmR!%==taB>gx81<2;4_5xq!Wd|mWabyO7oN`?N&;}CF{`6#rYeXH7aKEEK2PruyWoy2yN{8a~liV^!4YsX|(;6N`8!>lRuy|ne@Ut zL3oz7$c?5&kr`QyYF{f~dI|R8hclmZ*p^y|>R?^|$2u=};$WQLY$Ojq4mL=SGQLgc z6F81tVjOJNK@>)_l=F;pFAC37=WF0t#;I04A8{196TG}H!sJf6yb+z>ggWmdRh6AZ zlq#agB#ctHo`sR~5^P5z>H8+cg=~)Xg$*r(ptoHK9Iaek_@PqH$l;PrXi=U zhfL!G$}QAPkqKTcyb{l})~&}(3%3L&VCy*Jb2AzRu{$Z+#3d-X1~pR)O|L;+4`pfxskcsLi!KvVx~%9384fUDixK`icsW{+*ReYeWCLlbMEjg=>W*QO z9a)NO!Afberkc*R4Vhg!HBuj(u>F^dbFf z8uu|>raNDE&&R;?5Hr0VgYr}-KMYXgrl#o!2x{K;V+HQaVXUC$U5|n{)AhcVLTn6w zD~Wpky}Hi+0c$lcBrO zU@vlwdk5O%aCV-8%l_LCNdG<>cLHX*oaoU4_Ki*mv2P@g?46@~#|}dJQJ^~i0vA!2 AP5=M^ literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Jello Cube.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Jello Cube.avs new file mode 100644 index 0000000000000000000000000000000000000000..ff7840a3bb18fc7fb539237742c827f004cc3308 GIT binary patch literal 25119 zcmeHQPjBQ%6?bM<0!2i#LPA=>fjZ2JZg<*o+1=@6ElV>RKnwx|+GSVb=CA!-9B8K+e-VTR=1iT0qJaI6`v1EF#}9 z3=)+;D#&yh#U)9X5N70PPdFc6Ov=V=Os1x*%|jYX%0A3>E1Kg~i?MDxUp4f07!u(_65qaBuuH41}ySR9g< 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 P@49~*61wBtd7l3QjpE&- literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Mercury.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Mercury.avs new file mode 100644 index 0000000000000000000000000000000000000000..ac0560e9edfc0fb47d8b712b9066f0a9c90e39b0 GIT binary patch literal 2408 zcma)7OOM+&5Y{Gr04{uMQM4#f9@4HJw$_wvxTzqZZF0$>MS(o_Q1l>6v@Jvy9g<#) z0s`!@$RFvg|DfmopkCXg-_TBW)8r7rBtH&^GaqM$^iR8{(Q;|n_mA$gpOw(Uut}VJ z?tS8U-i@1{_xy(EvGa9NK9)}B5gW4~g(`Q-4hQ3R|AvF%;9Q(G4b!GjhV5&!W@asz zD70m=6`Fk;#O%Sk)@*y=0n|#v3eAe@qG(G|5vDy7ozf$=*co<@HSz*WByZ{`ySifK zTEQR_%cUp{(-Jz5#n!MIzcwZ&51_m#bX~Gj(XQ%NoU(;j*X_Z~aU=YbQKNR+SawG? zQZ0*0u!x-(MkrRw&7y7#Q_D7HKUlWYb-Q8@TaXa!0Wq+0$CRjcr6Au%vI3Oba?RwD z>3yvl%T}teOs|Wr&~$pyl20X0HF$3XTh?u@L2SkJZedhWn)*VpZJ{*+R)BB8_KwW5 zZiv%TDo1*&#jcX$^zJbV?$qy|t%K%p@UXpubKGTT?7k5fAa`CHBU(Ki{DM4^ypx#Slp6jnB(Kwc1XgnJ{jE>3n{DC8d=#JpT@bm^9>+ciV3JN-Fa3pRc4pW3lWbtmrYQJ;j` zW__9ily(fEwh@oNfll2Mvtofq#_!Y7BnCHrMu_NjZ!UIeSofnY$n2YIHo;n0EJya` zsd4hqhb$e(vmje3A=1mNC~3!c*0YFB%ku>93aip zgkzl23eSpVzCT-gzdJTEKavJzkPhPn#IA%fzY_P?#L1PollcZjC-Ed5Q4nypAP9B6 zBJwhD=3ZB@R|NsPlY3?==n0s^^>4yIC^eKAJ`v8q@ zGsz;fKLJjD1E^e(D5%t`z!mW^%0XBm^)B`VhXW|TEdOKmTj;C2Fh!gAmP&<`s<2uD zs9Z%#0vz)P8&OxnqI0EaYRe!**ii<5fs4t_7!jL|D^rJYN;O+89ly#%M8hD4G*%{@ z#3>#CC6OGSMDdh#O%6R6;IqhCNQi{Ym5k_Yvno;w!;yl9_yxxkOR2-aj@BPDUerBQ#1Vee|w#jF;ZYhqo>rK=+o93|`-O T9bbRri6+fSAGXmSKAQgrK;MmU literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Neon Coaster.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Neon Coaster.avs new file mode 100644 index 0000000000000000000000000000000000000000..027a28dde4a285f9dd51de0ed58e34f6745681c8 GIT binary patch literal 5094 zcmbVQ%Z}^D5moH01`x8!CaYfLBI0xSoRKa~B*yi^MhwI7T-%Ev3yMRDJwvi-K1L*0 z`51ptvdDkr4{lC1NsT1y25<(D)U58VK2>$9x;WpoSyqc(!#@Avfqh#gbEKn56K1iisquIW+y$ zMj7Anq-Iggnlxd#s2iy=<8jnrlhjbhqD)xwl2mUQZ`dK>`?O}fU{S*&mL}0l&%D2y z>_M2_;4gx?ZF$x((c-g%xjg3$e@R%K z>~k{gEz5X87>h?1^D52~7FBU=jw+M7#bz=#7Xmgs0$3w}D;7n=i&nHSjZS*Cehcek z7Pl1+!A8s$^-fgzyq7%D90X}7l9=33MLZ)9RifRetQL8~00RzTFIXTdmPd%r==%s% zVR4kjZ3Y*PevP9%siHsCtQ0kj12M>$N;DBYNMv6XG6D(Yy=Yk)0bE0|s*)&!H)A0( zojq~{bZ#TWGxOME)Yp;-@H%_@tL!&OL@=U?#Z~eMzU4_>M|&AsUc^~T>t^NS z@j8n#QS6z_shoUUG~g^&5e>$eC<`6Q{abu~gU@Ojf3o=WAAiL7pTC3rv*lv()P>Jo z@HB+aL-5>%ybGR(kPpG~Cgq`#@*pk4Ra$Dc^2UXbhg@}SbM0Wfy!n~g$Tx$14Sqw= z+9AhJ2{o$e2W20cz7dOh#Z}vMd_@X}(3wYPD{52X7y?BH?p9^2*SuJ@m@$3L^!2h+2*Wt_3nY5kV;Z)~ zorH4SY0%Dr4kG(pq{Y#`OLP*_5uk5c&Iv#{8MIE=+OXa|!)ZYF>oFSk2{3O2CPaC~ zZ4$~6*v9nkPJqeD(RrSK>OJG=K2I}kA8t5vpl6t#I{E3`d4{c#L6+;D0Q4om2fB6M zp{7Tu=wByz`2HGT3GoQnw#>~bVmUjx(!4u^JUQ~0XkAG>8B(A+4Ygt3ZyaOgs`XFR zs&y2@nMW#~RMU1~`H=v3(u|Ry>^oc>%@u!-fM4;urgMsaoW5?rtIt8a&4tTnBQ)Fe zHk3b?rW|RD;P|$8g8TkRT=rO9C5bIjzJm5mdvijQar!D~a=Pmq=K2z^H#uDc`3Wun zoqAsG+hF6Fhu0FRduOpPlZ4b=a}C5o+hwe`H0O> zZQY%wi*3E~?u+ZZ8_jyP^8P$o#_6lPlVy{F<+$rhb0+4gjz%s4?29nXoOLP5juEo$ z%MekGx)K^kqI?CtG4K5o>W$MA^+1C);s0MTab3eUE$SnN?$rx8hJ~zFB}rtVq)QgWI6Ct|Hn3OP*Se$z zn7rDDWv}AK&3A^U<36($=m>Csm)$6S+4vknHT%p28|`U`#qMT=?k}_TFs4)Pkn?whjC-B z$E$>v!E^Z0qb4ex6(5Y}LFb+E+$lPd{=|dU%uUK@Y*C1hRH@{6d9%&hBs5wl*jGtX zphW==>fSo-iS((CtM>*9#9%xPirU(!NuBZ3VTgNkZCMso3&$rM zGkn)Vuc+uN*)tkkLBuDM>GmZUibf-eLrzt*gIA-OWbn3EKu;gl2&zXv8Bd8WQlV3-?`+_2Hfl+;?H#1^YhC=_&8R&P61GToSdl^`0Je zk2Xp+rzO%1>hbI7d8h9|mJHOE>(3{9ecxjeET_GB)UDujThBoo`t1}2cZH3e7gLT7 z532_`DO>pQIAr%|z_tVR_G4#01~1yyt9@s5iY7=!fmIb z`B&pg1Cghcm}Pq@lld}>woZgs0~mC0WCo71BRdp8_m8gu5Q8PQBwmy>sU(k8|y(sFLVtE*&rp` zu$f*Z<1UnS3bd?=D=1SK#{DP-AM1XUVi*sj6d7L+qZC7=z7^nw)ehoH3ey&`rwb~G z_me<#ObZm7q}y5QQ4={y58>f9r8izHKxW~q51k-w!?Z=JTE3d^78YKfe`epwe+13{ z9b@n5|1$v_SMEoyfn~%q+X@yB*i(ew+6wT>8b)L*U2$-(MXtpcy%fXI@>>d|1W|+} c--VM(^M2F`YQOP<#V1fp@Ae-)e2~BY1p~{(#Q*>R literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Plankton.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Plankton.avs new file mode 100644 index 0000000000000000000000000000000000000000..e52b1b0c47dbb7cb286b1614dce82f89822b6e07 GIT binary patch literal 3763 zcmeHI%Z}u>71d-0Srk&RH`!zpE@ogoN*YP^>W&~Fv9sxoVPg^-NRWj}VpRz(i2})* z7VU*+VfYgac$Iy=B7lF#-{A4NRH>#rZUb3nk?NL2-g|jp=aBsP)HF)$HT%p0F=PaWq=Jf9zn@>W=ro6lItK52^XR*P;v3;+Ayd^Vqb$d7ebF@3BR z>&IY) z68DAFb=kn-spnFaqUY@HSeHk3EEL-}qP(rU18d+<{ej)Ucf~7KBc2$8@dCD_X1zc_ zq(BOe#3bU?qJuHQwc<7Tsk_D5eOugeMUEOFZsFh-DYQk?Fd+{`SF2V<>=iFXS2boq z9?w~qLNx5Ic+Eq*27YYN4|uTkQ$wn zLW?hiXt|6C-J7vDHiI4E0fc+eDO9ka7Tex+!nT_aWeuzk3_UG?Fsf$lN!6wGG@t#o z`$%;B&+H|8rNNGleO_zLJ2jvEo!9}%ABmGu2fl{v?(QzSO#eZ-xHo%d#0iP3BcX^E zp+oOzXQ={&3?KrC0;H)sS|ORZ>(1mv!zD;n-lEs!tStR~UZ}jZ#&TyLkC=bhTswQ&sAxQF@Kxa&?_} z>;>Db*UL>dpFu^YDVdU9RZBmKRy15C+wDWsC7F_bJDO5}?ed{bl2dqi)<>Jei17K2J|Bjl6w1{{&yUub+2_Uts_rI% zwW;@RvBQ4CTe-vDTO{6M*u(75xgq9$im8WqSpLA)jJ9U7#T>SHQ*LD1^^0b(i_J7O zXMHo|!#VAq^Dedn{T&yx@%XA3-a zo$K0ea9EQ-CP$z!0O+3q&$x8*rH*0Q@AI0QuOsQM@Dw5>So!krH77`j1mv&%_+$YFCj#9IwYUc1dD!A9DBHj-_NA~)xBGW3eZ&WYNe-B&c)fxw|W|lV7aJgSNaZ7lX$CJszd8?bD<-dV$K{WkG7^ z2Fby}foq{kH(uZmaK_Z8NfxaxQY0J2K$br13`Nlg*?@6)F4XxAoYF(T`&6Rq^WRVH zt@-Tv8z|{{>_>~H>(g;Udwu>B!YAKCF(4GqdfZQ8MEin{YofwU?nB57Jm9we qKV<)Nki7@!LOgH30)+2lKxcFmU(rEKUr5FuZOLgbFED;~mj48vm+}n& literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Reflectocube.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Reflectocube.avs new file mode 100644 index 0000000000000000000000000000000000000000..eda5859810135efd33b4d4a2977235724fce578d GIT binary patch literal 3819 zcmb7GO^@qH6?Fqb5D_840Maa=K!cv+ueOs;dK$|Tqj^X?i9v`rythCsDix5)0P+1s>;?6DQp>fF@GKRk!ZFb?>>SK7P9^3ayrgee~uv`(2gm z+^{$rzkl@u$8rAlb;tQD8hg9qVy&#s8y2$P=gT4&Mv2`#9}dE={u>U4gO8Rbuh>G# z@}8NzHoGck8@}Dr_~j=rbiiIQvr@bJm0_=5ETGA>+T>3U2a6#C}!o zWu?kZUYg#G)T~s7adxlNg2_eB**q6~r*kF^Q)SVxLaDWeCskm~#ID*mOz)~C7rBn2 zh#gi^tQZ`vc(q_gQ5d4gc?H{pG%GlN`AJ0i{8}CIeV0;M*_HUMs=?5dsLL3$)p?QXBRbDOVq37?8ucEOTUMPVwmNDhE2`o&aN~ zPypMWs#XCXvx?ZK@QH%&3PTYBSIsoQZ34EDRRuL#Fk-(sBlL@r&Gb_R4{M8I&b36& zgp1S$mDx$XLePA%KujC~fLcNo@V1miL5inT0yf`aWph~qLR589LdyjyN~V@e_F`V- z<>CclMD_*O2Do?Od{z1l2Y)C(R%QN@U9;B)H7nU$X-r<~;oy%v$0v&kAHzull0kk%`*8Cn0!K+dfJJLHj?;Hn=7YfC;^xQOnzcgF` z>T;2k@EIr0k15 zXaEZbnAk7n`X1U(&?sN}(LA*i78qG949REstF!yuC@qk8G!5b)ri{EQ9S)ky8UM+o z^LUp$5C@IFgZ3F3#rW{>;C$~W!>9jI zE`LG0`ZoUREJmT?^#9gm_CIPeOaE(4W~uWdEc2x`Nu6(Ds?3tqAjwPkA$Got_H(p% ze@3XJcnlT2?ngPEem*)sh0@hOP_-s&JiY|vkCiewC0WHAj23m0)t+d>#?vj08yf4@ zZy>beaR!+u>M-$iO_H{g=-MZ-^)bod#}iG6Nl#n9qy?F7e3A*0J<1ZNv&Ko=?Laz3 zAzmk$>#8=COP9~pK6haNiUfy65FQqz(KW`zN@$Krv$@c0o@q8G%?WAN7n=3tsn2?H z^qFmV?NVDO!FoIj){_yIl64lU+F#TYZ=K2p10>RnY0zTO+N{=4BmnswJALWqpYM3# zuE|3n8(0LghLaKbBV3=WCB0e;k5)|;HXJw&U_pkw*sgeX;XO>^80f^oJTKJ2RRw_Z z#@4#YthR6eJ=Y#U&B(W3gyBUuaQG;AA$GVO-sa zDRvC*9u$}$7U<6_mooBg2Z48;ElEJ#GHeOQ=#iJcf=N5n)Jd z`*|o^PtVCGK)|^$_aP7@SYr)OaI3(N3OFseRj`6OTYEx;s_?WRg$83Se2fK+E%;f2 z(t_1odz7GuZ8q}Ak@HWSl-=!_%zQ)l zOu9AMmafyuaXcKT+Fp@c<3-7M0vfCCI<^9gT6<^HD85T9H313i5zKYJK3HR`1D zWudOBxS1+jNEz<=;u7c!s#>dL*mnY&A`A zGxt`v7+f0NB-69e2{8qRgHiBeBk09V@Wot^12k)^*=AMi<8|QE3Ka3Q4>(Ga+ovnf zrZ(J|C@8u&PX$iv4r%I&#-dtbTj>sN>WU8Q3foGz78~jg2Xm9nvF2UMm)Yw207<#e zTs$B2HWx0Q4hRPaxnJ%rNVPpK<6whOlfW(aVZlKjoQ4I@%00{vi_ASN{2D@_iYEqS zsOkysJ|RjpzD3o&30*aUTNP}uRC602b)T5Vvtt#k=?#EMtmXV{Ilr(pcvFFwx6hoA z-3jRUZZ575Ja O9&PmGqyDL(>-+~lh&bZ_ literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Speeder 3K.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Speeder 3K.avs new file mode 100644 index 0000000000000000000000000000000000000000..eb4c78d814df568b63100cae2545df7f7a8932f9 GIT binary patch literal 19073 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 DMp3f0 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.avs new file mode 100644 index 0000000000000000000000000000000000000000..8a49451fa48a5acb0093ffc4f688ceb3d424dba3 GIT binary patch literal 4016 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 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..5fea8c8065df3cd67f7912e1a08d0890723d233e GIT binary patch literal 1493 zcmb7DU2oGc6mn5U;sxhu~oO^xmJ+_aX_lrE&<*DIEpFi=BN@{6%7{t%n6UNxD4r4!nptW~9 zj2H4`k(Ue29euHwOQpGzv#fG^UH)%7skuJhwB4xQGB)c3sl3c4g_$T5Ov~BL`z?vA zrujl=mvXaRep;&kWUw^LteDK^d<+?u^K5#dZ$wh6>6|0}$K z7l06A*xvHs%9e*nvES?U`e=`_6-xUw5Ox`!67zwla5^90RHE{OFdln4E1cSkJty+X ztxW2=eq~%QPI}#1)PJigs)`4;!B*8xRj#`gLcu9dQn z{CA+U#Gpjxje_VP8XtP`XkZfF>sI2@o0i&9!_k3nTq~^_K(A54Yvf48HfQTlg!3wy z3Y+pq6rL$53y}?i5rUI^Aw|RK`Vs45X(Nmesp14aWA}kV9E4$FM7WuvQ{rHhWw(HP zz+DPpkAd3&)olB(o4D=WR_YmYPSb;r?cLwszoI796NsDM+?--+Ohr1RXZA%om0!(V zFATG0*AVJpdsl81*xi!#j(z+|wxzk@+2g42{ hq6femVEqlmBx@=LDQ#}E7ACB~-bX({@yQ9C@79 z-U~f(Mj&xoapRvr;t$}!f5U+j<@?5I;!TroK#cOn_WXGBneTg%3{tga#0jq>KURqr7S;CaH8V&_OHfGL|DPVx=e79xAe`+y^K$U`P%?QR%GXXG=)E=i_La@+X(>gwwA zcManbn_8ucY+gaq>%qUhqsQD?y+p%4Y+j+kChTq9*}h!G^BC50QB{Fwi8a?R15_*R zoX3GDZ3@(6M11Yfbosi0*#39FEZd z+4C&;tO4;!ALF$RW0uZyoVj%06Wxo&bk2m$>364aO|}}1$h1^rk}2k`T9>xPn3O3LWll5Y{(4}=yjh1L|XKV`GL`k%2iE1?dvGfqMWOVnjq z(SE`3R)Ok`qOCVX+q?<3sb!n|GkWX#FMAzq$9|;0r&9hG8NVagZ%D6R$_OIIJX?Hc7gi(bfktmu)DC2=mUjjKY;1k)DZ`<1&Q!> zvvkq)E3EYes?rTg&?>XC%&O~lFstA3D>rbFnH327IACAu)3;2m5+49_d#2lciD5xC zel_lquQb3I9Jbvujqr4R<73?%1v##B)AgKA4;c-wo40n+R>?>>ve`nH!v?JNKB{tj f6;*Ta3*QW00=wa1A!u_t((UC#wp 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 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/justin - newpoop (for wa5).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/justin - newpoop (for wa5).avs new file mode 100644 index 0000000000000000000000000000000000000000..36813bab03546e79317de385bdafb6745583140b GIT binary patch literal 663 zcmZ`$J#X7E5T%+y0puo2oTwlUD<)rK@i|1Q@-2)L9)y8Rc1|zgh*Kyx@7Nf z$zP0el$&&E3BJ2`hvVZNIj@A!@`r)5$9uRdQKNxyH2Ku~$Qb+3W9)_eRizCtUh*~NouM@h=z_|8qig`){x3vB_%Gw z*p3jExa4VKC}BraD3w5c^43p4cdiRr2d=ZA2IQ*ii}YOQMsASOuCp7Py|iung9 zk=exF)*tr=;b;8LD=s{;5wUlJoK8s)lJ;|ry6|FyzrFO z4NoIr2XvK+N!0Khy|5p#{Vt>YaYSS{lpPHIfZY3lmJbQ%HfITaMNAl+Qp;J1Sj3$j VOh(@*vk(==)=)g%snePF^$KM~myrMf literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..294375abb1f50f368025dcec0d99c5a4fc69a3fc GIT binary patch literal 1134 zcmZuvO>fjN5cPrzQlx-{#DShhqK8ekn@x7RrEO#+R23*v5dy>of#j^ciPR`oAL9!UzVj&a|^G&e1Z>J7-1of#=GPxA>>bwkl#4JE*s9Q z;4oJj)@=IC_ZG6|3<_qzs7ipbT4e&}n+VRKlnb$qV5^o;$-J;oD;xPw534G7@w3w-?5;eyZr8HL5Cvc(iHIp!ev(4~StuwVn3g1&&=CWobXu)_T zP8@c@xBy#71M5PT0#pqQKdGCN)dDNB&butPzK1>q)7-h(LV(x`1N}nOGe;l*j~B8m zWu5yT-l}2R2K&$z-Uw|JW-hlbSG@pfp;T&Ne2-P^C&qxBx0g1SY2>P{LZ7zkP7@cA z31flbmnoEEnv6H&INpckVBQ!|+V_l#;59=HG#DW&1ISV;gAzNP)!fzTdtyEpvyOZC zZfUHn$=|E1tDSpeFcuRN(?s)qx#WWa>@m5Hak_VWfrt8rmL5YZy0Oe}` zkI_DJ`(KFn(csj`y3YfYBu)l1W%@cy4g)MTPEycRyMsyE2BUjB9HE;b&P!)M!i7^T z-&OAna*D{NqYfuQxE@W$NI9OS;50AX*5%?ZQHS~-r`#ztXi3mYQnHIQ?G|Xq4Fi}& z$w4wb9v$IXH=g6~9B1zdE}SyU+>P1%MT^5gy{c>ke#@5a0Fx@eflP8N>hp literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Dragonscales.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Dragonscales.avs new file mode 100644 index 0000000000000000000000000000000000000000..3dce1a1f594b070a1c1a02e65cf9a4863d040a91 GIT binary patch literal 935 zcmb7CO-sW-5Z!3~Kq`tS5f4+WkfbIw(NdulRzy4~A_$(vCMkv5LXtvn=HhSgkNDF( z8{e!=Og}6*@Um}bX5Y?C_HNYgN5dedi^m7L5B#8&5nUfXl|0q?7Jgo&j~+A(rzH@UYd%A&Ydr z8;K@0NhQ^r4KlJiLe7YK16`eP+(JsOWRYEO&FWe75gg2~- z(8|?B5quVyYF_^TA@H!OfEv~Y$QU!R#vnhI4V8DtKnY-9_Od~9OTaAP3D9ov34O1v mzhGw038?8B78b*FF`^}*Zs_}iHWFI&+#mUhL2TM)fBH9@xpBh) literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Encapsulade.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Encapsulade.avs new file mode 100644 index 0000000000000000000000000000000000000000..3f3bfb1ccd6c1ce50ca86c32cff4409a17747277 GIT binary patch literal 754 zcmb_a&r8EF6i%6Fk*UR#h=(UsNUI5J=Rh07xe?v&zS2G+XdITOF-M#x<~Gxb#lEQ^*x+10O|$qY=fkfP)Z?jib&Aou;3iA zAQ^WkKwiQH-JR_meYws@*t9aM`vfUHr;axPt<%=*+aR^H3QTLs0HdW3vecrb@M1jW zJQx0;AGTyiYiS!nZKLOVFHePxOpiPd0vxq6t3n{v1DqC?T%`$r#s$$CXcz|qE(l`` zI?9!rCJ4JUoXnMBtJ6N&TV2;L;1zS4eq{)jU(DQo#hCtIVtH{&y)08tCEbpTl5S?x gY& z;$X?IXLtefC)A6fggoSs+bleGSfue(B(OZ+26wwX+a9d1C5TD5!(u#3g%0-mg&W?Y zf_v60$0E>S_tXS>CpKDrlD>&1{RGdDimYZ!83n9@OhWMc_tw`v1k80;pkP=hgj}X0 z95n#ls`yLgCPL|oiOgrwSFf<>VgB2ru^q6mIKZ7PM@LefIJGA{fUf6#?1 z>p9a7MUAz3;mn-e_q|CjyUk|Ou6N|*_C~JaD2Y0rDkj@i7e5HL#0?a@Q!w+Qm;pM9l2;E9XV~c>WzCHw)`cS1zr%G zLT~dRvgE%7mXK^4VEjD5NncTvlfU66%ogaAlTZoo5ws4RTbjl$VQymlZ}u=J6XUb& ztLUu?3?9*A1*9is>B+7*a@S5A=}TVxKwMnj{(-oqmBl_h`r0FDv>Z5p^FW%RaB70W zNafVBYS8h~@ue^_6kQs|`M^vs z=B@qo?e4&LZsgB5Pk;JS%>OWa8lEYx0&oUc0ggDTm7NEy$KM0Z2W|nEn-9>?%Hn+- zMXfRvC8;*Mk!FbbEd08kp-PptY^R#w$PhhK`1jw3YqbHr)&&s0`9cq5C}vlD;%wJ| Vb&O-eY&7{C6?0BCrCF{i_5t<*lZyZV literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Mist Wisps.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Mist Wisps.avs new file mode 100644 index 0000000000000000000000000000000000000000..16952bc8b44c6d0b7c0498c980fd359b262c8047 GIT binary patch literal 615 zcmZ`$!AiqG5S><05ydDTL_Cbp!zMMMjTD7aP^1S@q#$?}n@uUi7LxSbTs-)feuQV& zH)~h1=qzvNW#-LncJ^+TWyLft`SRhO2e~eE$*m|pq+=pF0-V(r8kX&XTaR3SE1S;DSgdA4lg+?x(39mV7%dO1_#-((%YvZ7tQx zjT?Zy@j8h7XlUoPq$FBHL|((aSP1?I)NZilI_arr45)nq8pM7G=LfM2=Ks_v*Lu=} SpvzC$Ok0L#zs;TNhVlt}NK&K# literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.avs new file mode 100644 index 0000000000000000000000000000000000000000..bfa47832bf353edb7107d5d1e6f59ae2160bbb59 GIT binary patch literal 645 zcmaJ;%SyvQ6um)wP^^jw6?Jg~1&xp(1raHsQ#bBJ5nL6)lF?02N!qpfgZ_y>;Ggs- z+_-Y#cy5wuVv$~QIA`wTOlIb49LMR)UGX|VclRD zU+(3C9iTo>@ZVTam-+enO6eh968k_KkhM}KXGq$4zwCW9iaf4H$wmC>HEP!D4L*C* zX3_f^eyi48uTfPm5i0{T*>5np?;nEgV?fR#gZeSX+<-H3mfMmL{1;*-KPU&uUuqRX xUdoRks<4Olk-7jJ5s8k%hhcgIW}kyo53k$lHXBcg*3TibT^`0`ovX^KRKKhbJX8Px literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Reverb - Deep Net.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Reverb - Deep Net.avs new file mode 100644 index 0000000000000000000000000000000000000000..4dca3943dcb8187fe9de7672e598e427201b4881 GIT binary patch literal 1193 zcmcgrOH0E*5Z=`Kz_)@T;$egqHZ6@wABuz=#JebhXQgeRP+CYUw7pn=fgb&#o{is^ zc4?I=c&G!D`7*Qf+MT(2Y&JXXuqzjLw{jiTJN2%(PVvw>R!SX#EilQ*cL0NTpRhpmV_S6O!%#L=s4~-O&0Z{cCP4eto8#}?Lip^Vczq*fev#e$18gk z`=qMQVWJfLrv?s%g)4ZOO{1EqN*WGU%g|FO~`|CAAIbR#0?ZznXjzMDcFf z82U=2sWFWjdDjPEUL8&(ch9pf*j(qo+2hgM|CoQyc7*@6|9RLsqIqyKqMHCUJZufq z>6~Fs@IN753yCiG;Kbz;z_@7fq##&SQ6GS?78A^`xHV^N{U>vB0q?Om>de}h9WyT8)rym2>5qV*Nf`T z_#NgL@I0*9hW+|me`>fj26=+l!Z{EK(FC^p@AMQ+VvB?Jv3kLs~f; literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Solar Flaire.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Solar Flaire.avs new file mode 100644 index 0000000000000000000000000000000000000000..52fb0f2e0cab78156714eba7ddcb6492481b1f12 GIT binary patch literal 750 zcma)4O-sW-5Zzc&5yjw11Yr(6Y*G`NfFhPaL_GO{Ab1wdrbJ>3oAhih{%zx%P2)$X z)q%G&v-4)zeX}>SJTIncNoV(WbgNaNN*em%zStE)*nkDJRw3vC8vyUubuA?Ps>yp5 z@9zQ3u_+b=&wHmp+xOpkY}3;Izv>j*OZykqcW}>Vpnk>st`Q^@Q9>@sfIK2uWD`jm zd2mDyoIhmmjJ7v5h?)j-icGi~ej|Z`1B!gfRT6|0ZZ&99afVvm%onT9w7J}2k|^4PsTrn P$~=LlWxjUh<(%;Wc!5)0 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Spintronics - Backspin.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Spintronics - Backspin.avs new file mode 100644 index 0000000000000000000000000000000000000000..99c23c31dc209a22f261ce632f96fb0df84f36fe GIT binary patch literal 2036 zcmd5-U2D`p6uoJym1=b#3auh|#XcmvW}Hcl7Q#YBd{I$BP#?AVC=0t;NK$B@%)9^6 z-_Yl-=Vmu6>n__CQt-mby)*Y~=43MYaNO_b!=&I>Uq17vEY9PCwelWV=cCc+mqk<( z(XKoMiv%%52Sif9Q~Mo$lO%Ci@cUj~@atik^p2{uJJs{=!-lyAtkRA0F7y^4b5akz z=@zs|9k)hSDRVo(D$rskhL*V!kh!b)xwSn1LO-{b_U8rudsyQOVDuCFybmMdE=SyE zql_PLhEc{HRtBzF5mp`p4*{`7YJCP{eLO|d;R#T6xCujQMib{))oF8!IYH=2wV0P! z%qd2v7^(efwq(}X9oWBREbn8yaF?SZ*xac16c+Rqz65m=Y|6k@z_t?<^?*HPo*Uoc zXB`4U2GyCiF6w}e-)NGfU$uKp#+R#uR_l**3?YJkdc zn2#Aw9eRh7m#1)ZBb}#Ldw3x@u$~{#qe;1WiUXF^OH$pxZmMt3Qr($5wci?~8syaH zyv_eD=ZDwLxpfie4IS_4O#!OkHgLQfJ>7C0%O6VqR3a|$9kAp>%;KnP4{-mPr!d=| i<3c%Y57*if*HIS7X%_(jANG&q%0jVOsr%v`RPqO4U?vv; literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Starslappin.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Starslappin.avs new file mode 100644 index 0000000000000000000000000000000000000000..48acd17a259ff50259c4aac4b9569ad4371bb1cb GIT binary patch literal 1240 zcmcgsO>Yx15OrE8sG=g`gb)WKrINkzrfVmKR4Yq?ic=9nLgGxbA5o-qBX&0>^uk^^ z@pm~B-Z;A=K*)guBaLS~Gk!B;&+hBRY*x(El0Sdow#H7 zemlI6{ax^0ZNCrcgIAwX990x^%VX~G-kCWKj}GgwwP>m*fQMiLYx9xog!CSmVmAGJ z)ZXbIwfP@@x`i*msaR{TQ#l387W&s)psqV$*YzDJ)U_XP$-s6#CpArU488@XdPJ@7 zvxACqT)@~mhmzZAD#j{MLQK8*T6+DS9_Z6EPn)6ait@xr8SDBTu5RxUrYxLQrh!uaN;4U%RBqZ2nPXN*k#}hCIGjs3rNZ zxSR=XR3=q_!!RJjQ!y5sDT8zUL%`^sSU!3o%lM;tl*SeOpc#Pzb`o|>JHco z6q{Kc1SmFe;SueE@QSQdnhE2~q3Hf5hz82AL7_pVYsE-7Nl&L}PXkMvp94Gm+r0k& zd0NsuEm7T?+?>|>0VI7O&FnP4g4*pwg_XX__u$qAmOP2AxWe0N1r_(}LrBk{;~lO^ Xo+Oz?K*-0lMdCDo{Yp(eO^rVQ)0(rS literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Street Art - Fire Inside.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Street Art - Fire Inside.avs new file mode 100644 index 0000000000000000000000000000000000000000..d105a6ef16e6cfd0feb846a53ec0ee991dfd97da GIT binary patch literal 1139 zcmah|O>5gg5M9wGbs9=bPbJM^LR?tcmAb1aIaCN-NFb-QrI34K$)(`fAlqP_qJNb? z)4+99o@foh6F(FeXTIGR*Nxu1&Y+Y@S9}w~ zWJz@f|KYg>p+M|*fqUX1qQMSOr%4^2k^X|I`7Y!uz&XY;kLO)2Iy)OB+8W~`!F{tx z&=_+74k_kw{*03P2w%w@Pw{C6njPVs<{O9g>pz~Ne z>Iq^y*5TAS1XHzR@@J%TjED`epr{xZ-`GYg`s0b7-zwxw1vX2a!_NT4A7H2~4yNEW zq>j+vo^L~ro_vu$+r*w}VaRDUmI3b;hE<2OFxtI4#bNI=3Y;*SiKSIFvE~ literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Swoo - Slow.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/mig - Swoo - Slow.avs new file mode 100644 index 0000000000000000000000000000000000000000..bda397b17a345886ad024c723dcf95921d78d580 GIT binary patch literal 1023 zcmb7D!AiqG5Z$0?k&4BWh=&n+*rX<;X#<5)h-eR@NTJ|aZPHSxEhOnttOxxOf6=q? z&9< zTX@RPN{iV+r~vSp!Tu4z#gxbs1k3U6!v2RRuaukr8}F4UH-8f^QRg;L5ZY|D)+9-m z&w2*W-?z^5cQR6bwKoVa#bSR|EEDH8pxM~Mz;DT?;aFDB;2Mr@!svzr0R~|Zj9WN1 z>2Wj-l!uJ$V&y*orTjabrMODl2v3$FanddRfkky)=sgZlc>kCbNgMHPsVtEFKv1zFUPYC`)9IH{G zcE2C=V!9bdF8f`1wAh3RK*rNyua_kebdEk}eL>QDNt4h6sa E8_>FY#sB~S literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/nixa - smell of music (skupers remix).avs b/public/avs-originals/embedded/root/embedded/Amp Picks/nixa - smell of music (skupers remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..6c50626bcd5026a9da040faa17670e883904562c GIT binary patch literal 3310 zcmdT`OONA35bm(N6cIoxxU7)qg<jRXf=oW}RU;&1^~4U0q$Tu4=pb%XOY>b!PbI-+sfts-%{NPe$Pb z_AX=WuO4H60!MrJtOK|%WS(<%#*4MiQts&GdL=8(D_LZr^ff#ibIeSyzM{4CZ)*t%2f8&xf-?ufVHbERfG zwOo~RUPwdd(4aLpi`ei*jI_5V$r8s=c%drE=dv`pgpe$xW`A$D+Yer4?1Hi05e6bU z;Wcm_;LCRR-o+8-Ux2-jFswy_GdpWHs)dtz;c?)OA4iSI&Ybly7}_NpLa>rEQO(BT zbQ;YoDN8Z0>>|n6QY5*hOR*V0_7e6n$wM5GJK^*b7aErqN&ajBLB?JJ;&Wm+kew;O zUy0{p=nU{Ud;x;=UxXm9l$v6`jdK4+=gIiD|<&a z?`EJK_wzOay^rtbZ6LwDcCt<30qA#t^pAaI$ES%Jf)9*=y*?57Y7vXLh}iqIDnNRZ z(WxI7Ddr%;3>ML+5u>(3j4%Rm7|01Zehc^^aQi*hXj^P1X5JL@GaxZS>TEw_{-MYE zM;9OnyMTm`fMljeCvTqiuqpc41e_Kqh*E^lbs7rlAdbT}DJPB6MiS@&5V)X*B59qV|^oGH`;x8h;sDa?r0tY~nI>>fv$Y`X-2GB3E-q ze^(i&_G-WJ8rO3IUuUIbLf3WK7jSL@VaV7iG}>EfLSe`zIAO~f^p}CKE>GdPtgxCj5Fqyc+DG>IDtITU(F<_2q2j_v8gDPRS3W7MKg011dT;RzC oCkXPO2An*n!KnVLOvI_u4op0~Fz4At!8kEjE_8JMA}RVR1kZW58lav}$z6BF6iez)lr@(Qx3JEk_*bvlvS zJFv|ArXHGxnv1kfrA=!gkH~q?aZEQXSvr#X;Xn8S_uo^>`F_8@<8qN$axxlY($tFyhMzdkVtqL$Bcm|@ z^iID`KL%9y{E@=NH?2iB#no+J*Yg0oPAVyN`lV9cbdA4D?wR@&ZJ?E z#utc6*?7DhM}xK-@ZoFzn4eJdHLC8BJdJhDufy!iEyWxx{FV5&?Z(EC z_A+4VX4whD?a(ZJww?pnmO8JW`7k$+dmy<6HWQ@Je_b)$$T+xO4gKcY)m+DN+tr5c z488svF_!r|h+Xzg(^d5?hi9?ZBlfV}H7g#DY1!OTJYx&cXA7%2AD1l7SCL~Y!CCC_ z?P<-Gtws*!&wdXecER$^OK3MaJI?v^HLJOx>nL8Es*zmW!B*<#d$ERCESD_2`(9rX zxig78C!_e9EhPA;d_OLt1IN;rSC&PdOYtuFypi}EmlD<=plfkoKD`xpCNMeAJeW9K z_|S;3dF3KzL>!BJ@}kHQV)(y@Cf+3m&*v*5zohm#r!{;GnAP@WYUixJBSuv=29?#u9y1|EN#GGViNanb zh9l4DO+wVhb9^VYAF@Q=CyqtVK81dWA-~~=?OUu_&FjEfFQHq)$ literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/splendora.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/splendora.avs new file mode 100644 index 0000000000000000000000000000000000000000..05d612998257aec28f45a9b7ae8946208bcae7e2 GIT binary patch literal 10562 zcmeI2&u;5P6vo|q`KLk!iwgn-;viLRoH!; zqHK5qUV$x7$AT5*J5G}pC8~9++^js+sqL9F=XideS~=-=K8|B0`=?%1u%ALfQ6N0(%ZzjwDN5&_p%+k3h=ihqMl%WpuGz<C;pXU2 zrCv6Sg*qe^N~t5Hk^MfVpHY%$$ppusVIn3J$_Z&nfuu;|o@FXB4&NJVxDQ3DIqH0A z4_0tM{V2(U45a3nSu_YWQoQVIEaQy0TZi7=0NMEu{3f0vr6a7&VV#u8?a}_^PA^5z5{y?#tk_P0mq%+agw=F zwb`h)Z0E>npVrcGcW-y;0bzS9)bZpif49#3$s{0|nSPb>zv2ZJneNsn6 zv+66j4>IgkbfU|#kM24%5wKq?@60`oKXE5RH|kfsp1c+nZ8hx^)2aYWQ0bU8IN1%S zZ4J#XX|>|#^;Bgbv{ZiO3XW~dZZz9g!^Ess4HGS`FfkpkOq?e;ZJ4!ICr@EvF-Y;y zv1M9y8zE{O1h;7zpTH9L$mx==T>G?3S8gM}FT2?WaDav3Vdh7M9hR_{PxDn_f3^x6 z;IRq#NjoL)O>gcsyqhKO*Y`46!@E`T-YV~-lJ{15w@cnz<$YZ8-YV~tlJ{15cS_z{ z<&BEx@z38;S?@f#-uZk@y)&;aA1QcB;P+n_ylR2D4tQaOSpwfI@WK+a1io3|g*9dg ze6zp{i_8-EW`P%0nI-Ve0xv8xOW>OYURYh zPVCO3Z^7#%8)IhUb^v<; zn_qvu?C0w*VJtjY_%4ntJzPB78peC)Sh s=axs(Zey8+BQK)kblK9IzjnS2y(AGaU4&6zFGucASig45LN>Jj00Sg2Z~y=R literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Amp Picks/zxe-Urantia.avs b/public/avs-originals/embedded/root/embedded/Amp Picks/zxe-Urantia.avs new file mode 100644 index 0000000000000000000000000000000000000000..ab87d900c713f857e17d82555aec5ea96ecd2751 GIT binary patch literal 1281 zcmaJ=%Wl&^6rBP^5C|Xy0#z*TqJ%u%I#q=VGKhx|l@O{Z4+&P2c;bxe*u^tx?Gjv9zA6qO&@gP(vonC{aC~D&KKPB2g?9 z3$Ihvc#+7+YRT?0`Ehh3?;~0pU1K<=sHHk_qHtRe8?A>j(@{X1+ICT=sHdY+Po}gX z!@e@yRk83y8>=Ga-=g~=ce5&6Es6RDy^;y7=)iDQS%x9CV_zBCOti%bYGt$>%0$yM zZRHyBI{3V?t~RF*OUrl9hTo@IUv7gBK^wuo) z2f)-hn9S4FX2ZQ*ETrCiUciP+Bd;mYo0taBr`Z0rCH{Qc5j!8hi{Q&|!Pgv;O82F* z|440q+ZFFW|I8(S?0yhIFqAq8Ilh)VKM%YC2Jg`29T4C1t6?0t^JTx%Nb_dXs(G7O z_%-b1w9@bq&b;hUIIAFt^TWj*k1+#&Y2+VN3|pun9&pZqfn>wzsBBp(_0n29HbX~- z>s{&PU1X(f&UKb5`OK|n8_xV9&K|7swY>8h@60E^{5pJ|0_QIRXMxF8f-`P=yL9D{ z4o~eWaC-8<1V00Q4PfoBc+oNVck&lLgFk(bYq~JLCtHRmTu$ej)!`84ns76?`54>^ ze9VR4r|B%^Z{U0Q&nf$L=O$;0g~Us07Hl{!K881RtA5Q{;56QcKWaEM*R2J1ZV}bi z^{iXN7;8b22U^y1#a&be)(e!4O}p$YR5$95%cfb~;M;;^KZnRDhbqpofa5~oVEPSk K22W%RQ1K6=$3Z-K^P(UGoqS)<*38cAMAlis6#c4ReXriDSJm%T z)oZ)`{vZi5<%KtIC|jvN@H0hg8BbNt3nAVG?SnEu&YWI997IYzaBlg^O*bi&G|C&b zYOQK$+Lhayaa%XpOVV&VjGex+Gd8w1RbH!A-9qt-*onfP;_W6JpZZalE5K>9R=pL* zou9Joo=iv3LdJsOQZJT1gK6;W9o!XMJ2QX#l01lMA;F00D*An<#c@=7?!lxs;G zgxjUsV`V+9IKlG|({5F)5*|)vGu*Nh)M4cz&?#|h$O&EsRnDQx?QmUdb*#c(*VVly zcHRTDc8=430)wt!?QW&XcIrf2 zv_I$uN#Z&wqFw90g$R#!x?BBS#QLD?>f&2-DlEr zEt|^)tPh(*QCV3AI`D@bDyM0anS1f;3y&PakInKd{ATM1n)ug+N|!(Tereq=PM~|| z1iC+edv>Y4;zHj)e{N~rUpIbPYOmyv`4|iWU3|AcM#$fNLkLE-EIi1F&&S$>fS-kL z%-q9eh|V*hzd+JwCgTJe4xr z&6v;RQ(ITv3|yw$8Q8R0clCAGXb>{&%os!Fy4!A8;sz#!Iv*C$)n&FL-8-5_$T$j_ zN1^sCB=ADQ!$h;>y2_RdzX0MBhrHZ~PZ2J6?v6&)KSm>oL0oR)b7*02v(atdP#=Mq zi#-69OJF?P^_rgQ=FMDni)MkaNo_aPn<+vK9q|bU1*vX>R2P+nAjOl_XfmMDXJ`hg z0Xc#b734ai7(?`fA!YOisfi&bhnSYjl$glPv57Y1ZOYr0%QTwE5$c?x19^w?j^%o@ zGjxy)%svPwS#apiLnhF}qnBYRm}Ep_qdiU=xG)_&!8)@TrWFbXdgI3-?P1DUEeSp;HO2Jx(D)>^vVDL literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).avs b/public/avs-originals/embedded/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).avs new file mode 100644 index 0000000000000000000000000000000000000000..46859ad4cf05f7bf4151c7402dd0897429ed95fd GIT binary patch literal 3942 zcmcIn&5zqu5P#Wj(Kd8Ng^G$02Ul7kABxvbVpP^x3R+rKf})iw6(PdGj_qB8KZ5NI z_6Z+XNL-Nk4>jxnZ#KLCrd<;VKKbs|rwMIWU?U<-r5k1cN)3!anI zH>;wV`nu-~1oJQubl()r(E3D#zAZ_wwxk=aj=Wh#_aKgkJKNhMCo+Oq^sSivGairs zT4OB3KwH!h7g2?jJ;o^0ws@l{+_Y_L5DRZRQ7r5RzU}Piu*-QnYqlW11+H90lW0y$ z5*0PoT5@yLK&dLb1bwW<&`SzL#x8<=O_3PVVi!om#{9=9jZ-1hX~<-ykWVA*i(m@> zD_#jDMU`xT|3sg-3Hb|fI$G(i-To{L2Kb#T#`XWK+wsMSVL63_ZjK zkoxaB*d4?Eo_o0O_)%XUMSaiGeL+bSabVle0!|?~QOX&ZCVYTSG^!D5SkvuBu|EeHtcP(w_%qxxd|6} z>e8OLbl}n6T1StLUu(p%+n(%b(ML@6GpjU32s(l zXg|)-nHjp0glZ^-0-bVNhv86L4Fe&x^;6wiY{i(-*&g^fTTgWnJ$W0x;(Wx0T+fbx2J%YO`L zfX@*x!y?$qasf>Nl^x*q_rK>SVRuKk=a^O?ylJ_5IyVNL>wH4!g&lo-Yi&1hgHX7m z59j>m#U8#x^j&%iJYBz6DF*3!g9jH1ga7~l literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).avs b/public/avs-originals/embedded/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).avs new file mode 100644 index 0000000000000000000000000000000000000000..6e5a049f551f9344bc1ff4e892b1eedd488ced27 GIT binary patch literal 8932 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 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).avs b/public/avs-originals/embedded/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).avs new file mode 100644 index 0000000000000000000000000000000000000000..9c13dbfce39b1403cb22c8e0e8290d29aa9f55bb GIT binary patch literal 4609 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 Jc}{dFKLEccXAS@W literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).avs b/public/avs-originals/embedded/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).avs new file mode 100644 index 0000000000000000000000000000000000000000..bab3906d10a96982ce2181625e9f48637c256e04 GIT binary patch literal 3474 zcmeHK%}>-o6rUAPL{Q^LM59TKn7}Sux;3lF+5|%|CW;{%KMs4auw7^2D=H*f);93xkgLusHk&vsox?LMCDI;SgMJeLYklfCMY`h!V(a{YQ zJn9LocR#ysI#$iFl}i&8kX6TOaMQ7+8>Yn#mt=ZjfNT&7Ajb+`vKM^Oi@BY~?R+6m zu@`i*7xJPPb32XO`AK;?%Or4WqB`q33$DIQhc>+GL(|rmSE{pCW5Kk&D)OO9H(#Ew z*Y`u7A{t*R#wen%fw^;N5Q9QkscE&bVb8ROLp5KL%Ogb6K&XXUYMT-215MZt$H1VQkc1`%&!7D0nsO}1m1gvn z zXhbqmNg<%GP!lNlAS0j;!&~6{?oVAa4U3yAmKhh;cs|)ug3(^rAR8y-U8B~Rr-Gam zi)bp#{~?ak5jf%^u=NaMDoZHB_>f-S;veBJdc2gP$4mdfP!l4ANf3fjKe_kE%WlhQ za!t@tK&d3IkEKuZ-qT-Fm*Ve(>2=pK=ng9B&pVz$_fZC2Kc#N`GsEB-Ero07ypx#PVdHLL${@p IU!u3;A6dIvhX4Qo literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).avs b/public/avs-originals/embedded/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).avs new file mode 100644 index 0000000000000000000000000000000000000000..425e8fd42e94b2b2d4e5812f5cb0d3e0e54d80ea GIT binary patch literal 5778 zcmdrPU2oe|^d?kL+65*ALQJ6DszFMeCAG6wuoO$#rd1#@Kn#sa6B=pkBu0*%IybE| z4K471cq{*aNk}{l9(dwqL-4l2Z$PNxg-QeZ0%9ORIOjS}9LFj16#~Smj(vUZIp^N< zoxad9&9+@*^yK+-^d(1c>x{~U;t}!)A>>e!kXgV*T4}Z#hGWPEc*Pq%7z+L8Rh^E_D-T%ucs zRj14@(P~5A(oIvRb9wHIs%cn2b0$x|h%TG_13M1_^fBDkV5o4&=-s|x=`1xjB*t0{ zgI&<{Eu&(wio*(3yGj1&_xlU8g!CXc()d7(f&>!FgkVw?3s2|hnOaS+GWtBG%xT-I z8Femph(AXU{5}i_IY)MOcF6qvJgOn{fR6*B-iHA12gJ+3UC14HBR&Z05@7!d@I3(w zP1U6Kro%F>0lcWMvh$N5F3jpQ!QFeT2M~AgOc@2#8T2YF-+Y-2_b3 z;Nhx22eZt`=9M%=S_vD`k{` z8eq(V2J$GL#8f5kG7UB2vdfp`Nxr424pc;@h=(eiBTOMPz-XyO9u;nSug@ca=6ng5 zcmp+|Imai>Ssq<^(wv~NLxU7K${^0lO~TF;Ws)G$B|Z_=k5px4PqP$tP>{G!-S1-!bIGm zJce=SY25JLwCu$_=!p1kT0SW5)9n{e<3ZGOV8!o%iFdd;ZoX|;8JA@xe0L=*QI7=6 zF3Uol3~G~8fg)AyHZ&RB^+;UCXLM8$J@^RIF?eA*KXX8T4Big|B5iST5uPK!GQ16#I0Fw?bs_avVPZhmWBDkmvIGNe ztcY+L;E>mFZaJ!xb8J{t%vPhK0*x%ABBtVmJ%NSf4>&$mPhdHD6vtK_8+jZXSQT;- zz9Pjy}I_5ux#eTYr?XWo)fnBj=Cl+ z`^A-yV&8co5QS^7##ZvFpFD#-Y%cyl4zR;a`}gU0lh-!}UV-1+KJdIoM`zY=#`YO1 zL815h;L1`yAs0^`^yozin4^c_K?D(Uj37?FS2OL_?q-vn-iWE;b$$I_y&v;l z)vKA;*P>{ch)jF=tv9tdQano%51{HK6<(sP-Wqz8e~iL1;KDi}l>~lVQ`>0SnhRhGEyr-7YZ)!W{_HvYqY(_S1jySDy9+omny6`R5L_RaQ7u>TAdautecrUFx!&e-AFp+ZcEa;8%ZbW zV!am)-tD=v(n^*8gL*jI>M`NmwH^ydHxboF9qX5RbElIiNwwE{1682lYjpfJ4>BcB z`S%BRb^mmWJjS~y9)3?8=1VvCXI~Xj*Sc#1KO6n#BhZfmVFWz zAN`Q{f4V*#%MK%31HC9C`qrB}mqY=N?aoV-)yqk=mW4^IoeiUmr?m7JP+1g3bq$Ij9>?C17<=v&#(oAqpZvj|czep6P7gz;RwGj5p$`5jgd#vjG>%WvC5;vH(N={u31{44nW1b12#Jny#N3J literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).avs b/public/avs-originals/embedded/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..c4ef188bf2a56ddf71577e8682f04c5dab249757 GIT binary patch literal 3228 zcmd^B&x;&Y5Pltkgn?0s20=tSxRCxa)7#U#y(Bw4k`NLNqAVB;CJ5U--Ltm#PETIH zHQjy5VxkG;;!(*(@a8G;5C|TUTyn}Ge?Sg`Lco&{4}pN|S3T3i?7D~SOwfZhyjS(= z)%Uulx~lqpuolN@(v|Abk3LkFM3{zBwJqm$WglbgEXHY!dTnPvk;HK`>8Y#9XNjr> zYe}k#a5c)*q^o)ZQLoq7437R7Lvb+W+-}!v8ILe`xYlY$Mx-0oAs1^A2E5Z=5nAO$a?YEJmkpFu8 zi2b+>VT?#$IMtV+2E!Xw3j03|u=u+)c zU61|;6(tC0e*PUNzZP|35L;o4jsH^!!!){P)Du-+r ziqfIEc^5|zRS}`~QMQnwj`oP+pI4N3lQ;-__S~X+Ea`ob#A`A_b3GBoG8AO<5TlAJ zt)B-~=T&^`ng8s91B=SO;#+Y$UGD~fGG#vwR1QKYI3*Uc!>}mS^vTGKVw5}(bJ^UK zJI%mswb|FePLMjz^GzMf9QxY9ldYLEOq}f#hPuvxD6mzskUSn}s!!@kWqleDaxM(5 zWx4w7Og}Ol#4F>0;kdI}U@Vvp6-2-@%&;9$btG}BaEiael=Y>repilmK2NM(C>PaJ zVHOJYB--IP$#GxCH~xq6)=*F!aY<>v0q${hgtQ-aG_-?;<+^Abu8E$8hDo7nls29* zkGvgZI9-hf7bG;gs0cIeK|@jw=~=EV*M|jLyr@n+dVxHxXScZk)Nn?&sxlG?D&lu$SGd?!m(y($5^e Q#vUz>OiO|E|JF6+Z@j5q4*&oF literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).avs b/public/avs-originals/embedded/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..956c25ad711d6185afcc72083eca31267ebb3318 GIT binary patch literal 3832 zcmd5;&2QsG6nDD2Vu`j|gakqyV33NM*tPRf3R~J#K`TBEfRK>5pp|g!aXMSaHZx9Y z?}hXNhy(uuT)1-tapBD0fCPUD<@d&M>vYrIrjZa&dNc36ncw@G@gyIQ!%)RR%HH|x zQ}&7Eil?mYbYHH$U>L@CYliVPcz=JN3BhdUJIdh>3jl(~{BexQa|6!&%|baA-VyiN z!*MhW`KDqcS1B>!OpY>kaB#3*CttA?LlL(I}&h`1oMMZqVWgbUx zJ=d7Tm8q)k_eZMO;>Agh_8rdE>f$_-;_!}L#g5Uflt1`aF-vOp1iXV~L*nTp`6{&b)ETuml()sRxfG>m5~dowY3hpx9ZQ>ZU5r74uv= z`j&`r&V#-Nc4p&H`y*F`jvN~nZsZT(+Upp6)?>C8tA=knyG@fuwzpoFFiU0!k`&`5 zY=qcjfwTtFZUoYF+MT9e+r-*{))f;0yFq}9!afu#W%uJK z5JL^SQw2k&0Cy363VDMD;ze}b05{<5Hn>cb8b5(j8$-y@G9{u$Zf;vikl9k%jm(su zotsiMo6KyWch+F2Os9kXS(({^VTXF214>7hX=rXq&myR@0QD9?^Ac(tAuxggkI_m7 z8M7OZaGG>PFp_JGSjzQMK3iI^CxKp~j0j^o+k}t`Rw^S2wCX{n)U;~6PvH;*cZn{= zn{9n5s08x=xD~!(9r9Eq+-tOPnL16=>C$a^<;)dbo&ru%0fD5uOr3si#+c@)0S%{Z z+;~`@ZeZR6>(@E!3A1Z=sIk2X>av{Ox3E?aE}#+hIy(lQZyjQ4^z}?G_R01lh6OHm z$$vqQ`M||H^Koe!_VQ`uXO(1SB}=EVz{iui(J#94#BQLHmD6}iHx{LFv63sMaTkY1 z<(z(n(w>3f_wXv-gK$pe7ajigQ|*H|^m)|Yew*H!NgR&#Pt-8l=AhXSD%P}ZEk`ow{O4vYwdm<;`j3-H-Wy0ex@%D zM1E#;o3Ld5``2$u+fp-Oe_sLn;|kd63fM1J!1h{W1;N}YUDA}((GNp0=c#uSF{!9=vE ygKKRj_m@xPx-VZf_ACWGU1qQD`7h01|;-40mdhjoWzaR1d literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/06 skupers - incantation (duo remix - edit).avs b/public/avs-originals/embedded/root/embedded/Envision/06 skupers - incantation (duo remix - edit).avs new file mode 100644 index 0000000000000000000000000000000000000000..fc151ca0f3d7fbb71df195a331ac8e7fee6c853b GIT binary patch literal 3558 zcmd^B&5ImG6z^H1gvA9BMG+4rCej}>J>4@q`PimmLx?1xVKG533rSCZ%rw)}-B$N* zss<0ED0ufI9?btCc=qI3ym|E^f@jy?tDf1JY*sP57r`1{RlVQ)s8=;r@Ach-EUSv7 zW;Z^($M$$!#Wi#6-W#n~HBI{jBtTo6HcRs`$m^g^i=64KnjDlduUH*S(tO0iBCmOo zF&+jh zTxfqD9UXoBoTkkY!zJo|2A$Sg1nz1YZK7viv)HX9iNl(`msT~qS>#DNQf4oze$~B< z=}RDGkMRZ29Atrh0obAih3gATAC4;1b_N5>cASA>R%x#5k;$Xnu%xMDvM%krgVMzlyz8C$JWp#Yl0Tm@VB&{xjr|8VWpFE9-6#T-kTWgf#EUX3%9Gg z*330j1f&?$!6K9_n&yS1s^rL~5_=eP{|z%jb6ctQn3M8rbP=AgIzO`k7vz)1la25Tpwrg;C%cn={tZu;|JKg_9xp~b zm@;fSuJ)6n7zVuOIL`h@X&y|={k`m9l;+iba9Hh6;~-~!(YM1Sc?agNfGE`4pC6%L zHF~_?T-3BrTiV8@IdG!&w%nf@cc1<7>TpKqw4t@;dtdz8x)DwaJCExfc0U#|XLs(b zuZG9{e8Vqt*MqFQ^1yNJ;k3lf#P9#umj8i+&FB8uD^ow9ciV9dPXtxzPmxZ>-A8Tk za>+mHj*0&rHe!n8ICU)$_aqpQ1>&BVs(b)}VLJ9Ugo=l(;dvY-K6Ms4?u~dH=ZW78 zmKwM>%nstjSG`3&_c#)Wu(&8Zj=Ui)E-{<=d}i?(%?eBltatsY7YdbuRN@p!#g$M2 z9P^=E$tB6#j*~ARQ_n$I)Ir7H=C(Aiv=bOpX(7 zYF=~9{BqvS+b#%s7KztS%`!E6UUaNx)Amqt?B2kdKm|3Dt_?T04Ko6ds;3SboJoSz zyndZrp`Ix{!bxF?lZObE%nWB8>6+C{`A|qTvw(yO=|w1C@F+SnC<$`7fGU9s2mv6` zCp&1#4y0x!No|2u(jqKWSn8t`LSpqPG~uU-9t?}axWRBxuF-}wbC$M+VbXKxh$%GX zshSdgp(zcM9!f`&=GJDAmE(Z)hjCUsQl5MEHqKR@A5?HXe5GWfh);~J-dAOuUWQ=+ z>mWc1kFLc+anjYdm6CcHPiU!IwNh(*HIHgd@5_&q*3BX-ID0?%yS(=UN)1)bWro1? zBF!n|vOSN6XKqxz9&eo8_Tlc?ZFkRM%g$l@I5>OE^K;lfJfrRMPc<~@w1KA)}=Wn zM9a2rq(0|%pZ!y&4QI<2^%mxDg4X?l)&2lLUob>JUFfxLj)OdpGj?yBCN(LXX!!Kf JzJ*ir^A~&9akl^f literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/07 duo - miraculous flow (nemo remix).avs b/public/avs-originals/embedded/root/embedded/Envision/07 duo - miraculous flow (nemo remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..c1891ef9379d4ccdac536d0404a5f671d788a239 GIT binary patch literal 2351 zcmdT_!EV$r5KR&4VIhD794H)os303}(j?n0RFMxzTzV-;h~79fiIWCpH))b>W1!Oh zA$$TyPJ9B(n`9SST8Z9Dt&BZ>p0UR>`f^vSu@A>*0hJ3rX7OD zpjXrUS;dNOHO}(9lo1ffi%Ca-6>|_a}+ee$MCf@2i?N!@=u1I$|zrD*)F)pFt~Y=o(>f z`+84_)Xc2Rv#NAr6mi)1wL4e^CqTRiLZ4}jkRTK|Gcra_f5UYgpH0M&w}|UN>po;A z0&pg554|U{4bRtZ0H(9&vu-?NgX(N(uE2&9vg4sCbS9c`N<$D))uGQBY|LJY&xHDizFMhNw#%ClFjFBvQd&<;#!n`bgiY=!T$Hx z`byFI^p9vEqpw@IE^)8+kzA*EafImy#j8TsxT5iyas|DHMl_Z|e_Z97n>;b?=Y77I zy1b@o9}m$Rae841@h-HKP~0G-ftHnYD&V2Al&4MNR$lLETR65BHK(1R9*dYKvaSjl z8n!pUhyONSW+jr!w6}*oOGE|`>Q#{I>b`wN0PeEiH@$=aneb;DC?mhvt@*Yf7 z3i3q}mvqOdX=jaTcswfmyoeh(X_Hn|yQ2QAsO5@?%&0LV#iI?^9zwPhB{WN4+ra_Y z0{_bf6%wHYW7;mARKyCf0;~vDOSlX~Q3i1Hi&m(F5H<_289ipy)-*Qc;dDPUf^d+H z>;51JCm`PK8k8gu$Sgl50jEE(plo`Bwg7u5$s@tXn;*r&BwKH@xz5R!gBrA@i4dz2nFTuHUO~1e*u#V3nKsk literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/08 duo - warm freeform (mykal remix).avs b/public/avs-originals/embedded/root/embedded/Envision/08 duo - warm freeform (mykal remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..e5fea86c4b6f7f473ef341d1a98d85cddbfe1aef GIT binary patch literal 2338 zcmd5+&2G~`5Z;u6ibX^a;=*Z#O0g5i*oIVXgQcPh#G#-{NL-PB*2$`l*Ihel%!P^* zN5muW1l-|*IP(TP1ZNI}8K)sh(-yUn5F5>A=9|CuH)}uZMo}ulj6QtvobE`LvW%LB zeY13f5W-4?xFDT;*WE5Fl683BykAyM{?Wg#*<2pdTy*I^PunyT)E7xkvo=p@QXEGw zD}jjbWHc1A1*e0Mh`BvRT^hR`MkNbFCRyyWQ+k(`lqDJKcuZ2;G*?dvop#})M=vGw zgp4i%wZVy4*ORZI|zMX(CuA^Ns1$qgGLBSjh-jkGpZ^$_&eqUxUHm%_1QO zK>9LnD90@r1|ge-V0+tGtIV@F$RNLlCjt+cCfst%cgTMZZcmZ$VbFumhxB3X*9_y*q)DBY_ID^ zs^{xgL(}V4L-+ier8TLv(Ce{C?4uV77AGVZAv1RDCIL1{!Pdc`_`eGF3drC!;Fm$k zoxEn4&}_7dXfW`<267FQ(k3W@6I4?kt9jL~C1GEy`XW{Pg^_Dj!>R?yj3et9gd)?r z^tEBEVUYl8K%N6qOT2zv1*HnDk*g%k0nY)?5zogsz<^3bp+`Y}>R@%WZKS|=@F0g~ zSs@RwkJoo3+vY3&C+Q${t45{}3@Ep#rr~j;;#;EP;%C(Wh4FiHHIg zoA);GiuXj+&A5o^V;*HpV*YoKQC+lg;dqW)C*jA%{tN7+^Neuh0xydXQc_?8Vqx$w zA%dUiB%B>1xsDD`I`E!})K^V-iQwe|aF(W{w9VXNyql)6HonD^Ro?D}r7aN&NuRn& zQGa&(3{SEM@TIY93A^H;D-{C6ks`M7fa+;?;2CUfNO%#mx(kz1J~_s8wC^L%S! bqHWLz146#S)%sHC!|&xp2mv?5{Ga%5c5+H! literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/09 zxe - pleasure point (duo remix).avs b/public/avs-originals/embedded/root/embedded/Envision/09 zxe - pleasure point (duo remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..ed854eba9ddc061876f82364d9166834b2a80ac3 GIT binary patch literal 3564 zcmd5;&2Jl35PuE{R2GJ+0)dJUqsp}Fb-ebvwVF0s2m}tP3Pc2`1VZ%LyS7(Z@4CCs z&MpU7ae^D-#09~BK)G?`f|N5?4xsW6aOQyd&2F5yQ4ZL?bdq^*X7SX*@1s0i^JbPauc!4p|;ZvLI>Uk zm}uz9#Pxf0;Ho~>IW%zn%L5tHSb8HT;;2f++is*B-?4Af>mEn5C);g_^)2{rtA`kJBu{8#t1NJU_ z%WPyD^}4DqpUVvTj92_ul^kXvY;SP*G$;cK z&0!h?&kWO;4;|9 z>AU&z-ZzEqz(eZ1C5NXKkNEq@0Y1o?jh$nfQ{&HH9P%oA zbu-I0X1@FEl32U{K&0uGD82fdxPBoo>Re@YU{+epr}B1|1WiWfoi zPZT?4WT!myaZG`ujV+^$&U;l>(b1Pc0fO>rD-Niv|J}~u7c(s<|W{B zK!$17aJHCW3ZH^NVz(o1m9)6t)bnnp-UOR~&H5R$0-m!Mjh5ClZdAJ=nzy{EvMqG} zn!RpZZ}F1Q3ahG`Wql2+GPS%FVoT`Hj18T8G5!-4yyyLpX;yox-l}N|mCR&A%CwYO zMW_ElZfJGGYFpK`+&e^K2L^h|>NzTiI+}4+AFmrG4^4f{Mtb4#H%N}YVHJOC XA9Y`-o^^C!4;KbLI7U7&hUxqtj^*=r literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).avs b/public/avs-originals/embedded/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).avs new file mode 100644 index 0000000000000000000000000000000000000000..91951f3dd7b142ec26f0151c8761c74969c897ef GIT binary patch literal 5729 zcmeGgO^X~wv}Ur4%i^jCih7Vz7t$X)J>4@qx@KtIut`Y3k3ftkG4w~xPHRthr@Lp< zGawF#5U(D@i$w4TxZZ+BQ4tRw1<4)+FCIb;l6dkE9N(*%-kD5hakuu8uh+clSFhfy zdawG`tLl2K?fXgCNa^7>PtlVxOIS*Et@0Fkj1Uq4z61CYrA=nVDRn!6)$*KVVIEj^ zhjy)2yUQyZUSfwSWtro*6K{iYX46}5Qa4N(ZFw2z#0)6rqORKxIm=}ZYuPNO2lZw0 zZ@=HaJV!_mMqR`LaT*kmxk?C{UC~xldbH7CPD)?#l9aB6LBm_;Y7g>qR7gP102WE1 zck)A{c-VP2)B=_sqHnMaj5u*(B#YGFd>}$Lmd~Up@PcNyBEr&ASh6kO=e3(P?%vvP zDz+WOc??XWeiYtOX1bXgW%Y%5+cpy~kfe2%CJ}QaeF+}9WXL65(^q7WupCo5r#59p z)Af}aGA#34xmkY>I&w2JwgOi&bh&KkdPy_Nl|iSrtxC3{RpqxqEHfpos^BECeI&7fELdmuz2sp^l?8hc;?{6PU+*W3k((9O#lneLJ^y>DkZT}!TrcJ zUB%FFr?dR1X_+NgHOM@Q$EFplNn9t7L(KxETXsj_j{pu&1aWds9|m3>u>U@^Jq<*M znpBFFWx2cQhG*kca^;d%MZp2&-QXLo{~54w8j9E$neQ54{qtoBT+r1qcWSk= zBxyCiO~*y9WcrvKL$w22v2X`QxX zvOnbS2e7{!C;LHuao9esZ701++1=DJE1y4mu(%fbVN74Oq8*ejp+Psp9NKXJaO?G7 z@wI2bE|2Ttx=$3pMicf7IPTVkOX9j;Tol&5xDVY=_o2J`<#$3h!yg)1S|g-9Hp_jW zkw4kt?abdxjF0)X9pm(^@5k6A)IJ-a~19MH);40p5oH-|gi14Dgy@zsxPX;XYP%nj-n@DL=8eCsr_-uP6}$8GeRi*u zl~m04!uLDx7>049V;I-bPbG`%$#lrZvXqC1xttY68Ra9u8b8TLES?rgR%7?6+jK+YU?BFaKVN_wQ3%uk91`;-$rtP9vs zMnjfBL-+zq;Eo?os<=>IE){rWB4@EIS#Z-~q3`#MKhMw4pIkGH$9qQSU~!6j7ll1B3D+R$?SoHJ6F$JNR)s7#MGYkc)7@!0QhXwmFb50ZC4P!}Po{rUJ4N|5sby zddilNU2V)yWZ?XwF;_>0V)KttSu;H|Dw^kcqe8*kL}e3><#MURL5ci5I3DkHUOQL< zu+XVd+}idciTo~vP%`U_&v5;Mzpxw2yVbX<$tVYYH7{&0 z?BC)}K-tpWZ)mrCP)Ad;X^1%7CT+zz>Gnr3_7y(0&IpK~kl`A0p{F&Wpm$bC|KrPq2V z>JyP4i8(9}9oMYgfb#)k)e7SUPE8D1AVSNmt=fjkEDJ@@u2vPUnF({HO%`xBgGx9N z=Ue1P>yhgPWWZ%6w`GD>k8I5YyA0z4ZC&qbn?l%xTdLzojwC1UI+AeI$dNyycizU( z2>4Nv4gx+T!1$2RN;JxDVj?K9Q1*hrCPr}th9={4u$^qRj zJ$jS7+TYl#3;h~>o4cek-JlcUV}x3I+zz{Iy7E7Ogtx1EumnK;a-$7;)A7H5yC}DA ztoNTUS7jed-F~|kcJ7X&JeN~;pI-2murt33_>aBS`MZhS8nFbuty@dHoCk!U-ZB8( zwEt?v%aA~ia{F#|0bei-?^)aE3`&TvP{2C(01U;@3cS94okeMzWo6CNlDla}L5+k< z?{&$oAteHqNl~>+WlNrVe81ngA@%4>>0k$to-T5uoum`JhY$30)JjIY~kV$l_U1SJLc#!tLE9 zRV&m4$Vs!OS)DYq)2t#rE^SIP_@n|IWx;p?E6YgGN62B%T4y{&)^1H{=dFJ1@6==PAU=uU9E{M(4fU!LP<~r%AZychbNMf2 C6NA72 literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).avs b/public/avs-originals/embedded/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).avs new file mode 100644 index 0000000000000000000000000000000000000000..1d8dd15c485f1501f5610421517dd3ea628df255 GIT binary patch literal 4302 zcmd5q*P1!BLRwp)Ji2%>p0Jew~lR| zoiye`xbY=Gd<5=r;J|?sp8>wX9yt+y=FQ9-kCV>_t{eJx z#O~hzf;9yXdBhC8`d03mqA15XMX@oq@>_W}r$>*{JIfT2-xX%ibF3NvwE7&!P6HSG zp~F4T++~$8VjXVrewzzcHH;b=N}Y8I?+d5vc&5vOsnZ3^v^n6cGw=(n9n+k`&eaP~ z9qS4291py%%ll>+IzwJyg7=*fp@ydCguN6{@bX+3n^DgXd$5~QSj3T9opLqBUo3l3 z6ddmDJ?+Ij=DIJsiiV8;fRWq5qr>XV^21_B)elN4J=yK8yZ~3QvMp$%ya_!l>&zBf zTa=5oP<5kHN@NAd+9Y%AVq5GQyTbH3#Y&~LS22vTZd6tMW^JmPm#PN4&9I)*WlS_A zp$rnb^X1XT$G+R)o^kV#-FG_NXCH9ajHM#x*D$31Cf5HSC0peqIu3`R{-}^{8A%~g2xR|RE^LF_Z%aNSZjjOmZ3TN^SLPP&iI(2l?TUab8=?K`mKi`#o zZU2yZ&CquTk>h*pL&uG{AjA!N;}_5~S5jwrJ`*q#Nc|VBC+*64m3``N_YPZ4K_Bxz z1BtF?ip7)z~=lU0<-z%mDjU^gDdK z3<33~8EumL#5=k2J-q}MCJOu4>)EkQD?2v0mL2=&8rYM^+0Xsyo$T0V#yr!dzKc&` z12cVw{=o0S--rpK`=8JN|C5KrS&-zDPMTf@{{PiR(s8a@%h!E5C!|ZfzmdqZWD>i| z?nQZIYmGKS{|Mf|NV}B$vH|Zrt>l+kE4c#w86~ZRe*UsGUM*z}?2iw#zgmxPWXCqv tzy{md&uy-O4ZhBH?#Zl8B%h$hSosTovl#At8@~#umeTYxw28C)`4Fom?TtR2w<_GVH(q^)Qd1zI0(2@G_U8p2o;?Qk;_DYI4bM1+V6)g=XY3#k-5IC7R1f|g3AbF^n@ zjyY*I+wG0HLAp_oj(q>{W;^81dcFRQ>$xK2?mjlF+`4degq#s#?{>sa`t*D@LwoeC zRGPlY(wUsQynAlnZu?NrA+0CaD(+7@ZNrz?3lZ}G-+2Mr_|iL>Y?Ah%rErovHgN+J zav%Btvi=O*8cjjtvD5LkfX!+0?1VpId})!r{VO=E?5-xzeb4@H!XGHudWFq!>5W)0 z446Nj)ZIl{!sYeA&^IGP_t+84X;KPD40(;--gSiLL-4IO>xU#(s9 zT=lD9Vz}uW+>6bq0$#ZW$M8hx2?Lven`_K87(GcEt;Cbdbv-8-q;4h| PAnYcDuv*p+Fdpndf`cL=FKY5n zd2wDDJ5JzPA;0+AW#0D9zzn$}YmZ6~GRD4uUWdwyvU#kOOXbqO9rV1Ahr7OMmP>pt z!PW7|^n*NPc<$R{-*yK)=(_y_Q=V@RY`5$1vva4jychHS*vqeA_U(}1xEt@%QQm%k{yJ6+jA{@kb2&mC&NAsJp&c% zIA0E=7d@wMx=Le{i2I&14sFlnFW63K`b2*i&cdI@|Aw5xBD5y;i$eGc^st!6@fO!P z$#@k`mo__X-y8VdAw9GibS%&7b$v}yl+Noo#o?&acE&i*pwrzCIzzMT@mw`9z_`U8hcldXXl>LZFU(>TV-#b= zuE4?XySk6Osx;Thp%>}4Rq2_I_f7><8`}Ct9pFalqAKg>R7J@g-P{ZnjZZ32T-h#*pbAAwuTXXE{#(FusPV5TuB@D5V-J&E15Mkza?nL}iY zFf_|vg9>PrVyBoiX@B^$bkVr#$*vi0@>k8s^!d&XCUf%HEKf}b_2Ei)JTT?naFlcS zADbvw%+=Lqi-)lCdCl`_jX{DOPmtqDi$_6vS?H=@V5FBM8^mHJ#!M_`Xpo4Rga%>; z1C8S1g3Ry2vr3EODlG!Z0pMG(4Bf7-jqECRUoJ&zx($P_QLJJ{tE(^*HQj0oN17g~ z)hMXPXpI(!qo$J`)Cf ztI$b)qJEgIlP-9|hKkOj3hE-BFHrx*oQQi^{|LY*ppQYtK1Ba33}Jt?XGziQr!Qet9mfOJ(&FaF2^|)Esd~ z1-R`3T%`bawE*{*Tg$&I${!(5!nl6(Hv9c)#>TMmJIlH@V;{^M_AX~1&opc|8T&fL zr|h9Ov+o=>nKEgcv7ZPB_nYS#`z$27Shv&l8T;y)gRub5g?RKV zSx(Pkb|>+pYA=1v*r(|mMk=pOus71Yh)t*c*76@S^!24cr|;s0Jpd!pqq-t1%~q_( znE@~p5sOAADHzvq%NA~DS}^GH-S}?#WTd#n{j>mgQh@tb0q#}-E-%1k1-L)n{AXuG ZMS^nWV>&R1PX7aPawjiVF6@ae^q+;l7T*8> literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).avs b/public/avs-originals/embedded/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).avs new file mode 100644 index 0000000000000000000000000000000000000000..e4a1bc36db784e013343b13dffffbf89989ab774 GIT binary patch literal 4795 zcmcInO>7%Q6dspWtz0Y$5=az*MpY&3b!?n<4QbOwi3*|WKLSy1)!I9Dwps7EJL6=x z7eY^PECSRMl@Jmf;ewD5B2^D?gCmE+0dcB0a703C_}<#1*s0w%PCM3{pZ7EGXXZW6 zp6LdGl1$+V2E{pN(3sYO7rK!WLRCo6DZ} z!})fH*SPR}oy+nPKO=c#(G6Qdm5JeOVgv*F`mEavW(u&I_*NeU~<`S2?BzPjb5tl0=?-SG%uXi=~WcZ?n9i0SH zuw_vqn0-&((BqB3_1h%OJ>LV1tIY-o&ej~xW!vVoYaiDFgtAp!-po;y%CFRhlolFj4k);J)Tcw#A}cDf1>GCkZXKSI&q_2TJna(#9~)6*>Vmr~ZX~8sCQo*Wzuv`NS@Cgnk=yA9wHdi>c+wG3 ze=9^rgcoJPkECwkT)nP*sUE?)24aePEy=xHmOX~6ya%ugK@8-Vrq7|U3gc#daP z%7Qa>V3Yb@HKAX!%PE=HWnD;C@MNWfvqhT=!=PEe>?mnso!!Vh1X6#H?i!m+mPLJYI41E+mMYX zlr_O!O((1Da*S(7^VM}`?oUcW2NFBVR@jHf82cUby;pCuUy42ckN>#CK3_1Ly>TAH z9DWB%jD3swyY@A926vnGKYHUo_E){fXL`b~uivfrQQ+@D(QA)0_I`%#Jh%$Q1fyCS zggM6O@5e6B6#47D%5jPc#4#B*{Z=Z5y@pyID@uSJ2;)JFKL9dqbjqoRQs-5H5;$>u z%PvjRG<4yCqlb-+^8l;5=?AkBN>ISrcBgRbb!TKF#rod$4$9}4AP z7EX1RJp+ZIvq-YFB1#6=j>aZ-4S2?$1$2DJZAg_bO~W9N%>stQV1PLha^fc86uKcN z;teN~Aty@9RynOx56_jAhvmvQLy>JQJ0aR)+|Xy8Cbp262-_+1xi z#2NGqf2bE}T=ef}_fxQWAK49{Mv1Ws2)_R$b6f_V2rJbilugSr=xSeve8CU2h`_>b z0gN22x6gS%DCQF@NoNHdGM)mZ2rIiM=2>|g^@83Du`WWkP>i%q zT@}ozHP|UCSY9#KRjXVpK?(4QL!}_aCp|pW&a&IE3@76NkbX0@VoPY%5sf^`%GC5! zB`syD>XQm6KLzRLB_fmtEJ&sTvML8n`KV`4Xy zUD>fKbC3`OrVScF%Guo39}~|*43DnVQQD6_6lnASrtQTfcFMKcggS#A8cAgHR`jhw z_*VxwA8@P9;h>{f1w6?2#?NUe26W;Jh|Hip*p=NAzunJWKQXcF+Gmr?#@qO2`0n`R z-welpdg1O!4uy5}f`tD0w=!|8zS`#Z##QKFTU$%7-j|ruEAvf!>e4fr+O6}w(e#hv V8^G*M<97Bpc|iA<+HSxq;D3$s6LSCn literal 0 HcmV?d00001 diff --git a/public/avs-originals/embedded/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).avs b/public/avs-originals/embedded/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).avs new file mode 100644 index 0000000000000000000000000000000000000000..0a7466352d98aae6ec3d43a0dd7cb518fce11c53 GIT binary patch literal 2749 zcmcIl-EQkd5Z;6zK}5xm00}P8UQ`@Aaa`LyLA1qE5juzqges5@5{gv$XPsDbyg6&9 zjjxD!1jH>b!7b0gtMCYf`J8Oyqyf$$>PWLYGyBcY&U)A1%(ASINy$Hd`W?Sgq7Wr_ zZ12O?dyKKCEylhjKI$BG_#IteH?`Y9O?aY&NF)hH74*xo>=$FnOC^GGBJ$E)1khZcn>>F`hmecc-liP76Dq%}CVt*}{%U@n) zY(ZT<#sJ<&)P2S-8N=~-_NP7mBuPY6@~_jPM~g1uY^Y%h*!{*$=%GYxY;?RtIp;;2*k_SxAP36aeFG%-a!}cu4a!t!7b}h#woDwl`%C%@Drxjo=0|U^AzQNqDN7BML3K;{(JaHWdDZ=W$iOL1aTcP@QjnGZNR|?*x?Drqq zU&$;MxpR7sPyI$_voe)A|1!-=p@9DYjoWqn4_zM@{J_vPX}vi&*I)->*0R=hTs^}M z(z^C(=3625kDSa;&WBe@j#MzgrbRJKqznT^PoOjWo*uc$ba<7`=(#I~!A&t#B1=Vb zeL6q2qa?vq|BbT#)NZwo7ZeS=OQ;HO1G{|jH|C*E2<03?FCF6i0>0?oK_{di>1NIa zDcHbk#2*oZ@J1xWEu0kHC%W%+F&Tc*)8zi`W$$AlTwlEP^}K)a2(*{pB`aQVZ116t z_}?xC^6GUxlc^@Gfk91K>l&};8c2iIwGZ^?Ax@x!ju<}zG_)>y{evL2riW^-j{i@y gZU!ERT@32PS4K { + const folders = await tx.folder.findMany({ where: subtreeFolderFilter(folder.path) }) + const presets = await tx.preset.findMany({ + where: subtreeFilter(folder.path), + select: { id: true, folderPath: true }, + }) + for (const f of folders) { + const target = f.path === folder.path ? newPath : newPath + f.path.slice(folder.path.length) + await tx.folder.update({ where: { path: f.path }, data: { path: target } }) + } + for (const p of presets) { + await tx.preset.update({ + where: { id: p.id }, + data: { folderPath: newPath + p.folderPath.slice(folder.path.length) }, + }) + } + return { folders: folders.length, presets: presets.length } + }) + + return NextResponse.json({ renamed: folder.path, to: newPath, ...result }) + } catch (err) { + if ((err as { code?: string })?.code === 'P2002') { + return NextResponse.json({ error: 'A folder with that name already exists' }, { status: 409 }) + } + console.error('PATCH /api/folders failed:', err) + return NextResponse.json({ error: 'Failed to rename folder' }, { status: 500 }) + } +} + +/** Delete a folder subtree. Query: ?path=root/a/b */ +export async function DELETE(req: NextRequest) { + try { + const raw = new URL(req.url).searchParams.get('path') + const folder = normalizeFolderPath(raw) + if (!folder) { + return NextResponse.json({ error: 'Invalid folder path' }, { status: 400 }) + } + if (PROTECTED_FOLDERS.has(folder.path)) { + return NextResponse.json( + { error: `"${folder.segments[folder.segments.length - 1]}" is a protected folder and cannot be deleted` }, + { status: 400 }, + ) + } + const row = await db.folder.findUnique({ where: { path: folder.path } }) + if (!row) { + return NextResponse.json({ error: 'Folder not found' }, { status: 404 }) + } + const deletedPresets = await db.preset.deleteMany({ where: subtreeFilter(folder.path) }) + const deletedFolders = await db.folder.deleteMany({ where: subtreeFolderFilter(folder.path) }) + return NextResponse.json({ + deleted: true, + folders: deletedFolders.count, + presets: deletedPresets.count, + }) + } catch (err) { + console.error('DELETE /api/folders failed:', err) + return NextResponse.json({ error: 'Failed to delete folder' }, { status: 500 }) + } +} diff --git a/src/app/api/presets/[id]/route.ts b/src/app/api/presets/[id]/route.ts index d897573..80a8fd3 100755 --- a/src/app/api/presets/[id]/route.ts +++ b/src/app/api/presets/[id]/route.ts @@ -1,8 +1,10 @@ import { NextRequest, NextResponse } from 'next/server' import { db } from '@/lib/db' +import { isValidName } from '@/lib/server/preset-tree' export const dynamic = 'force-dynamic' +/** Update a preset (content, author, description, or rename within its folder). */ export async function PUT(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -11,14 +13,29 @@ export async function PUT(req: NextRequest, { params }: { params: Promise<{ id: if (!preset) { return NextResponse.json({ error: 'Preset not found' }, { status: 404 }) } - if (preset.isBuiltIn) { - return NextResponse.json({ error: 'Built-in presets cannot be modified' }, { status: 403 }) - } + const data: Record = {} - if (typeof body.name === 'string' && body.name.trim()) data.name = body.name.trim() - if (typeof body.content === 'string') data.content = body.content - if (typeof body.author === 'string') data.author = body.author.trim() - if (typeof body.description === 'string') data.description = body.description.trim() + if (typeof body?.name === 'string' && body.name.trim() && body.name.trim() !== preset.name) { + const name = isValidName(body.name) + if (!name) { + return NextResponse.json({ error: 'Invalid preset name' }, { status: 400 }) + } + const clash = await db.preset.findFirst({ + where: { folderPath: preset.folderPath, name }, + select: { id: true }, + }) + if (clash && clash.id !== id) { + return NextResponse.json( + { error: `A preset named "${name}" already exists in ${preset.folderPath}` }, + { status: 409 }, + ) + } + data.name = name + } + if (typeof body?.content === 'string') data.content = body.content + if (typeof body?.author === 'string') data.author = body.author.trim().slice(0, 120) + if (typeof body?.description === 'string') data.description = body.description.trim().slice(0, 500) + const updated = await db.preset.update({ where: { id }, data }) return NextResponse.json({ preset: updated }) } catch (err) { @@ -27,6 +44,7 @@ export async function PUT(req: NextRequest, { params }: { params: Promise<{ id: } } +/** Delete a preset (any preset — the tree is fully user-manageable). */ export async function DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -34,9 +52,6 @@ export async function DELETE(_req: NextRequest, { params }: { params: Promise<{ if (!preset) { return NextResponse.json({ error: 'Preset not found' }, { status: 404 }) } - if (preset.isBuiltIn) { - return NextResponse.json({ error: 'Built-in presets cannot be deleted' }, { status: 403 }) - } await db.preset.delete({ where: { id } }) return NextResponse.json({ deleted: true }) } catch (err) { diff --git a/src/app/api/presets/export/route.ts b/src/app/api/presets/export/route.ts new file mode 100644 index 0000000..5e6071d --- /dev/null +++ b/src/app/api/presets/export/route.ts @@ -0,0 +1,69 @@ +import { NextRequest, NextResponse } from 'next/server' +import JSZip from 'jszip' +import { db } from '@/lib/db' +import { normalizeFolderPath, subtreeFilter, subtreeFolderFilter } from '@/lib/server/preset-tree' + +export const dynamic = 'force-dynamic' + +/** + * Export a folder (and everything below it) as a .zip that preserves the + * directory structure from the virtual root — e.g. exporting + * "root/user created/My Fav Presets" produces entries under + * "root/user created/My Fav Presets/.ava" so the zip can be + * re-imported anywhere with the same tree. + * + * GET /api/presets/export?path=root%2Fembedded%2FAmp%20Picks + */ +export async function GET(req: NextRequest) { + try { + const raw = new URL(req.url).searchParams.get('path') ?? 'root' + const folder = normalizeFolderPath(raw) + if (!folder) { + return NextResponse.json({ error: 'Invalid folder path' }, { status: 400 }) + } + if (folder.path !== 'root') { + const row = await db.folder.findUnique({ where: { path: folder.path } }) + if (!row) { + return NextResponse.json({ error: 'Folder not found' }, { status: 404 }) + } + } + + const [folders, presets] = await Promise.all([ + db.folder.findMany({ where: subtreeFolderFilter(folder.path), select: { path: true } }), + db.preset.findMany({ + where: subtreeFilter(folder.path), + select: { name: true, content: true, folderPath: true }, + }), + ]) + + // folder set = stored rows ∪ every ancestor of every preset's path + const folderSet = new Set(folders.map((f) => f.path)) + for (const p of presets) { + const segs = p.folderPath.split('/') + for (let i = 1; i <= segs.length; i++) folderSet.add(segs.slice(0, i).join('/')) + } + + const zip = new JSZip() + for (const fp of folderSet) zip.folder(fp) + for (const p of presets) zip.file(`${p.folderPath}/${p.name}.ava`, p.content) + + const data = await zip.generateAsync({ type: 'uint8array' }) + // copy into a plain ArrayBuffer-backed view (BodyInit/BlobPart typing) + const body = new Uint8Array(data.byteLength) + body.set(data) + const label = folder.segments[folder.segments.length - 1] ?? 'root' + const safeLabel = label.replace(/["\u0000-\u001f\u007f]/g, '').trim() || 'root' + return new NextResponse(body, { + status: 200, + headers: { + 'Content-Type': 'application/zip', + 'Content-Disposition': `attachment; filename="AVA presets - ${safeLabel}.zip"`, + 'Content-Length': String(data.length), + 'Cache-Control': 'no-store', + }, + }) + } catch (err) { + console.error('GET /api/presets/export failed:', err) + return NextResponse.json({ error: 'Failed to export presets' }, { status: 500 }) + } +} diff --git a/src/app/api/presets/import/route.ts b/src/app/api/presets/import/route.ts new file mode 100644 index 0000000..b8e05a9 --- /dev/null +++ b/src/app/api/presets/import/route.ts @@ -0,0 +1,125 @@ +import { NextRequest, NextResponse } from 'next/server' +import JSZip from 'jszip' +import { db } from '@/lib/db' +import { ensureFolderRows, isValidName, normalizeFolderPath } from '@/lib/server/preset-tree' + +export const dynamic = 'force-dynamic' + +const MAX_ZIP_BYTES = 50 * 1024 * 1024 + +interface ImportEntry { + folderPath: string + name: string + content: string +} + +/** + * Import a .zip of presets, preserving its directory tree. Entries stored + * under "root/…" land at exactly that path; anything else is placed inside + * the target folder selected in the UI. Only .ava (and .txt) script files + * are imported — other files are counted and skipped. + * + * POST /api/presets/import (multipart/form-data: file, targetPath) + */ +export async function POST(req: NextRequest) { + try { + const form = await req.formData() + const file = form.get('file') + if (!(file instanceof File)) { + return NextResponse.json({ error: 'Attach a .zip file to import' }, { status: 400 }) + } + if (file.size > MAX_ZIP_BYTES) { + return NextResponse.json({ error: 'That zip is too large (50 MB limit)' }, { status: 413 }) + } + const target = normalizeFolderPath(form.get('targetPath') ?? 'root/user created') + if (!target) { + return NextResponse.json({ error: 'Invalid target folder' }, { status: 400 }) + } + + const zip = await JSZip.loadAsync(await file.arrayBuffer()) + + const entries: ImportEntry[] = [] + let skippedOther = 0 + for (const entry of Object.values(zip.files)) { + if (entry.dir) continue + const rawPath = entry.name.replace(/\\/g, '/') + if (rawPath.includes('__MACOSX') || rawPath.split('/').some((s) => s.startsWith('.'))) continue + if (!/\.(ava|txt)$/i.test(rawPath)) { + skippedOther++ + continue + } + const segs = rawPath + .split('/') + .map((s) => s.trim()) + .filter((s) => s.length > 0 && s !== '.' && s !== '..') + if (segs.length === 0) continue + const fileName = segs[segs.length - 1] + const name = isValidName(fileName.replace(/\.(ava|txt)$/i, '')) + if (!name) { + skippedOther++ + continue + } + const dirSegs = segs.slice(0, -1) + const joined = dirSegs.length > 0 ? dirSegs.join('/') : null + const folderPath = joined + ? joined === 'root' || joined.startsWith('root/') + ? joined + : `${target.path}/${joined}` + : target.path + const norm = normalizeFolderPath(folderPath) + if (!norm) { + skippedOther++ + continue + } + const content = await entry.async('string') + entries.push({ folderPath: norm.path, name, content }) + } + + if (entries.length === 0) { + return NextResponse.json( + { error: 'No .ava preset files found in that zip' }, + { status: 400 }, + ) + } + + const foldersCreated = await ensureFolderRows([...new Set(entries.map((e) => e.folderPath))]) + + let imported = 0 + let skipped = 0 + for (const e of entries) { + const clash = await db.preset.findFirst({ + where: { folderPath: e.folderPath, name: e.name }, + select: { id: true }, + }) + if (clash) { + skipped++ + continue + } + const author = + /^author:\s*(.+)$/m + .exec(e.content)?.[1] + ?.replace(/^["']|["']$/g, '') + .trim() + .slice(0, 120) ?? '' + await db.preset.create({ + data: { + name: e.name, + content: e.content, + author, + folderPath: e.folderPath, + isBuiltIn: false, + }, + }) + imported++ + } + + return NextResponse.json({ imported, skipped, skippedOther, foldersCreated }) + } catch (err) { + const message = err instanceof Error ? err.message : String(err) + if (message.includes('corrupted') || message.includes('zip')) { + return NextResponse.json({ error: 'That file is not a valid zip archive' }, { status: 400 }) + } + console.error('POST /api/presets/import failed:', err) + return NextResponse.json({ error: 'Failed to import presets' }, { status: 500 }) + } +} diff --git a/src/app/api/presets/route.ts b/src/app/api/presets/route.ts index c182056..0cfd7b1 100755 --- a/src/app/api/presets/route.ts +++ b/src/app/api/presets/route.ts @@ -1,42 +1,86 @@ import { NextRequest, NextResponse } from 'next/server' import { db } from '@/lib/db' import { BUILTIN_PRESETS } from '@/lib/ava/presets' +import { EMBEDDED_LIBRARY } from '@/lib/ava/embedded-presets' +import { ensureFolderRows, isValidName, normalizeFolderPath } from '@/lib/server/preset-tree' export const dynamic = 'force-dynamic' -/** Seed the built-in presets on first run. */ +/** The structural backbone of the tree, created on first run. */ +const BASE_FOLDERS = [ + 'root', + 'root/embedded', + 'root/user created', + 'root/embedded/Synth-C', + 'root/embedded/Amp Picks', + 'root/embedded/Dynamics', + 'root/embedded/Envision', +] + +/** + * One-time seed: folder backbone + the full embedded library + * (5 hand-ported classics + 90 auto-ported Winamp AVS presets from the + * user's Google Drive collection, organized exactly as the drive folders + * were: Synth-C / Amp Picks / Dynamics / Envision). + */ async function ensureSeeded(): Promise { - const count = await db.preset.count() - if (count > 0) return - for (const p of BUILTIN_PRESETS) { - await db.preset.create({ - data: { - name: p.name, - author: p.author, - description: p.description, - content: p.content, - isBuiltIn: true, - }, + const folderCount = await db.folder.count() + if (folderCount > 0) return + try { + await db.folder.createMany({ data: BASE_FOLDERS.map((path) => ({ path })) }) + // Migrate legacy pre-folder databases: old built-ins sat at the top level. + await db.preset.deleteMany({ where: { isBuiltIn: true } }) + await db.preset.createMany({ + data: [ + ...BUILTIN_PRESETS.map((p) => ({ + name: p.name, + author: p.author, + description: p.description, + content: p.content, + originalFile: p.originalFile ?? null, + isBuiltIn: true, + folderPath: 'root/embedded/Synth-C', + })), + ...EMBEDDED_LIBRARY.map((p) => ({ + name: p.name, + author: p.author, + description: p.description, + content: p.content, + originalFile: p.originalFile ?? null, + isBuiltIn: true, + // the converter recorded the download nesting — normalize to the + // clean tree ("root/embedded/root/embedded/Amp Picks" → "root/embedded/Amp Picks") + folderPath: p.folder.replace('root/embedded/root/embedded/', 'root/embedded/'), + })), + ], }) + } catch (err) { + // Two first requests racing → unique violation: the other request seeded. + if ((err as { code?: string })?.code !== 'P2002') throw err } } export async function GET() { try { await ensureSeeded() - const presets = await db.preset.findMany({ - orderBy: [{ isBuiltIn: 'desc' }, { createdAt: 'asc' }], - select: { - id: true, - name: true, - author: true, - description: true, - content: true, - isBuiltIn: true, - updatedAt: true, - }, - }) - return NextResponse.json({ presets }) + const [presets, folders] = await Promise.all([ + db.preset.findMany({ + orderBy: [{ folderPath: 'asc' }, { name: 'asc' }], + select: { + id: true, + name: true, + author: true, + description: true, + content: true, + isBuiltIn: true, + folderPath: true, + originalFile: true, + updatedAt: true, + }, + }), + db.folder.findMany({ orderBy: { path: 'asc' }, select: { path: true } }), + ]) + return NextResponse.json({ presets, folders: folders.map((f) => f.path) }) } catch (err) { console.error('GET /api/presets failed:', err) return NextResponse.json({ error: 'Failed to load presets' }, { status: 500 }) @@ -46,32 +90,36 @@ export async function GET() { export async function POST(req: NextRequest) { try { const body = await req.json() - const name = typeof body.name === 'string' ? body.name.trim() : '' - const content = typeof body.content === 'string' ? body.content : '' - const author = typeof body.author === 'string' ? body.author.trim() : '' - const description = typeof body.description === 'string' ? body.description.trim() : '' + const name = isValidName(body?.name) + const content = typeof body?.content === 'string' ? body.content : '' + const author = typeof body?.author === 'string' ? body.author.trim().slice(0, 120) : '' + const description = typeof body?.description === 'string' ? body.description.trim().slice(0, 500) : '' + const folder = normalizeFolderPath(body?.folderPath ?? 'root/user created') if (!name || !content) { return NextResponse.json({ error: 'name and content are required' }, { status: 400 }) } - - const existing = await db.preset.findUnique({ where: { name } }) - if (existing?.isBuiltIn) { + if (!folder) { + return NextResponse.json({ error: 'Invalid folder path' }, { status: 400 }) + } + const folderRow = await db.folder.findUnique({ where: { path: folder.path } }) + if (!folderRow) { + // tolerate missing ancestor rows (e.g. very old data) by creating them + await ensureFolderRows([folder.path]) + } + const clash = await db.preset.findFirst({ + where: { folderPath: folder.path, name }, + select: { id: true }, + }) + if (clash) { return NextResponse.json( - { error: `'${name}' is a built-in preset — save under a different name` }, - { status: 409 } + { error: `A preset named "${name}" already exists in ${folder.path}` }, + { status: 409 }, ) } - if (existing) { - const updated = await db.preset.update({ - where: { id: existing.id }, - data: { content, author, description }, - }) - return NextResponse.json({ preset: updated, updated: true }) - } const preset = await db.preset.create({ - data: { name, content, author, description, isBuiltIn: false }, + data: { name, content, author, description, folderPath: folder.path, isBuiltIn: false }, }) - return NextResponse.json({ preset, created: true }) + return NextResponse.json({ preset, created: true }, { status: 201 }) } catch (err) { console.error('POST /api/presets failed:', err) return NextResponse.json({ error: 'Failed to save preset' }, { status: 500 }) diff --git a/src/app/page.tsx b/src/app/page.tsx index 4a2bbc9..8246215 100755 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -23,7 +23,9 @@ import { lsGetString, readStoredBandConfig, readStoredBeatConfig, + restoreRandomSettings, useAvaStore, + type PresetItem, } from '@/lib/store' /** @@ -89,8 +91,10 @@ function useInitialLoad() { if (cancelled) return const store = useAvaStore.getState() - const presetsList = (presetsRes?.presets ?? []) as { content?: string }[] + const presetsList = (presetsRes?.presets ?? []) as PresetItem[] if (presetsRes?.presets) store.setPresets(presetsRes.presets) + const folders: string[] = presetsRes?.folders ?? [] + if (folders.length) store.setFolders(folders) const settings = (settingsRes ?? {}) as { defaultScript?: string | null @@ -103,12 +107,21 @@ function useInitialLoad() { const beat = isBeatConfig(settings.beatConfig) ? settings.beatConfig : readStoredBeatConfig() if (beat) store.applyBeatConfig(beat) - // startup script: saved default → localStorage backup → first preset → template + // startup script: saved default → localStorage backup → first classic → template let text: string | null = typeof settings.defaultScript === 'string' ? settings.defaultScript : null if (!text) text = lsGetString('ava.defaultScript') - if (!text) text = presetsList[0]?.content ?? null + let startupPreset: PresetItem | undefined + if (!text) { + startupPreset = + presetsList.find((p) => p.folderPath === 'root/embedded/Synth-C') ?? presetsList[0] + text = startupPreset?.content ?? null + } if (!text) text = STARTER_TEMPLATE applyScriptText(text) + if (startupPreset) store.setActivePresetId(startupPreset.id) + + // club mode: bring back the random-preset timer if it was on + restoreRandomSettings(folders.length ? folders : store.folders) })() return () => { cancelled = true diff --git a/src/components/ava/presets-tab.tsx b/src/components/ava/presets-tab.tsx index f0824a1..a794aad 100755 --- a/src/components/ava/presets-tab.tsx +++ b/src/components/ava/presets-tab.tsx @@ -1,146 +1,644 @@ -// AVA — Presets tab: load/delete preset scripts, download the original .avs -// binaries for the built-ins, save the current editor script as a preset. +// AVA — Presets tab: folder/file tree manager (Task 10 redesign). +// +// Left column: the preset library tree — folders expand/collapse (chevron +// only), rows select, double-clicking a preset runs it, the running preset +// is flagged emerald, and originals download straight from the row. +// Right column: context-sensitive management (load / create / rename / +// delete / export .zip / import .zip) plus the club-mode randomizer — the +// timer itself lives in the store, this tab only wires the controls. 'use client' -import { useEffect, useState } from 'react' -import { Download, FilePlus2, Play, Save, Trash2 } from 'lucide-react' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { + ChevronRight, + Download, + FilePlus2, + FileText, + Folder, + FolderOpen, + FolderPlus, + Pencil, + Play, + Trash2, + Upload, +} from 'lucide-react' +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from '@/components/ui/alert-dialog' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' import { Input } from '@/components/ui/input' -import { originalFileUrl, STARTER_TEMPLATE } from '@/lib/ava/presets' -import { validateScript } from '@/lib/ava/script' +import { Label } from '@/components/ui/label' +import { STARTER_TEMPLATE } from '@/lib/ava/presets' import { refreshPresets, useAvaStore, type PresetItem } from '@/lib/store' import { applyScriptText } from '@/components/ava/audio-source' -import { modeOfScript, thinScrollbar } from '@/components/ava/shared' +import { thinScrollbar } from '@/components/ava/shared' import { useToast } from '@/hooks/use-toast' import { cn } from '@/lib/utils' -function PresetCard({ preset }: { preset: PresetItem }) { +/** The tree backbone — the backend refuses to rename or delete these. */ +const PROTECTED_FOLDERS = new Set(['root', 'root/embedded', 'root/user created']) + +/** Same default-expansion rule as the store: paths with ≤ 2 segments open. */ +function defaultOpen(path: string): boolean { + return path.split('/').length <= 2 +} + +function plural(n: number, word: string): string { + return `${n} ${word}${n === 1 ? '' : 's'}` +} + +// --------------------------------------------------------------------------- +// tree construction +// --------------------------------------------------------------------------- + +interface FolderNode { + path: string + name: string + depth: number + children: FolderNode[] + presets: PresetItem[] + /** Presets in this folder and every folder below it. */ + subtreeCount: number +} + +/** Segment-wise alphabetical compare (a parent always sorts before its children). */ +function comparePaths(a: string, b: string): number { + const sa = a.split('/') + const sb = b.split('/') + const shared = Math.min(sa.length, sb.length) + for (let i = 0; i < shared; i++) { + const c = sa[i].toLowerCase().localeCompare(sb[i].toLowerCase()) + if (c !== 0) return c + } + return sa.length - sb.length +} + +/** + * Build the tree from folder rows + presets. Defensive: a preset whose + * folderPath has no Folder row still gets a node (and its ancestors). + */ +function buildTree(folders: string[], presets: PresetItem[]): FolderNode[] { + const pathSet = new Set(folders) + for (const p of presets) { + const segs = p.folderPath.split('/') + for (let i = 1; i <= segs.length; i++) pathSet.add(segs.slice(0, i).join('/')) + } + const paths = [...pathSet].sort(comparePaths) + + const nodes = new Map() + for (const path of paths) { + const segs = path.split('/') + nodes.set(path, { + path, + name: segs[segs.length - 1] || path, + depth: segs.length - 1, + children: [], + presets: [], + subtreeCount: 0, + }) + } + const roots: FolderNode[] = [] + for (const path of paths) { + const node = nodes.get(path) + if (!node) continue + const slash = path.lastIndexOf('/') + const parent = slash >= 0 ? nodes.get(path.slice(0, slash)) : undefined + if (parent) parent.children.push(node) + else roots.push(node) + } + for (const p of presets) nodes.get(p.folderPath)?.presets.push(p) + for (const node of nodes.values()) { + node.presets.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())) + } + const countSubtree = (node: FolderNode): number => { + node.subtreeCount = node.presets.length + for (const child of node.children) node.subtreeCount += countSubtree(child) + return node.subtreeCount + } + roots.forEach(countSubtree) + return roots +} + +// --------------------------------------------------------------------------- +// shared load action (Load Preset button + tree double-click) +// --------------------------------------------------------------------------- + +function useLoadPreset() { const { toast } = useToast() - const setTab = useAvaStore((s) => s.setTab) - const [confirmingDelete, setConfirmingDelete] = useState(false) - const [deleting, setDeleting] = useState(false) + return useCallback( + (preset: PresetItem) => { + const result = applyScriptText(preset.content) + const st = useAvaStore.getState() + if (result.ok) { + st.setActivePresetId(preset.id) + st.setEditTarget({ id: preset.id, name: preset.name, folderPath: preset.folderPath }) + toast({ title: 'Preset loaded', description: `"${preset.name}" is now running.` }) + } else if (result.error) { + toast({ + title: 'Preset failed to compile', + description: `[${result.error.section}] line ${result.error.line}: ${result.error.message}`, + variant: 'destructive', + }) + st.setTab('script') + } + }, + [toast], + ) +} - useEffect(() => { - if (!confirmingDelete) return - const t = setTimeout(() => setConfirmingDelete(false), 3000) - return () => clearTimeout(t) - }, [confirmingDelete]) +// --------------------------------------------------------------------------- +// tree rows +// --------------------------------------------------------------------------- - const load = () => { - const result = applyScriptText(preset.content) - if (result.ok) { - toast({ title: 'Preset loaded', description: `"${preset.name}" is now running.` }) - } else if (result.error) { - toast({ - title: 'Preset failed to compile', - description: `[${result.error.section}] line ${result.error.line}: ${result.error.message}`, - variant: 'destructive', - }) - setTab('script') - } - } - - const remove = async () => { - setDeleting(true) - try { - const res = await fetch(`/api/presets/${preset.id}`, { method: 'DELETE' }) - if (!res.ok) throw new Error(`HTTP ${res.status}`) - await refreshPresets() - toast({ title: 'Preset deleted', description: `"${preset.name}" removed.` }) - } catch { - toast({ title: 'Delete failed', description: 'Could not remove that preset.', variant: 'destructive' }) - } finally { - setDeleting(false) - setConfirmingDelete(false) - } - } - - const original = preset.isBuiltIn ? originalFileUrl(preset.name) : undefined +function TreeFolder({ node }: { node: FolderNode }) { + const isOpen = useAvaStore((s) => s.expandedFolders[node.path] ?? defaultOpen(node.path)) + const selected = useAvaStore((s) => s.selectedFolder === node.path) return ( -
-
-
-

{preset.name}

-

by {preset.author || 'unknown'}

-
-
- - {modeOfScript(preset.content)} - +
+
+ + +
+ {isOpen && ( +
+ {node.children.map((child) => ( + + ))} + {node.presets.map((p) => ( + + ))} + {node.children.length === 0 && node.presets.length === 0 && ( +

+ (empty) +

+ )}
-
- -

{preset.description}

- -
- - {original && ( - - )} - {!preset.isBuiltIn && ( - - )} -
+ )}
) } -function SavePresetSection() { - const { toast } = useToast() - const scriptText = useAvaStore((s) => s.scriptText) - const [name, setName] = useState('') - const [saving, setSaving] = useState(false) +function TreePreset({ preset, depth }: { preset: PresetItem; depth: number }) { + const loadPreset = useLoadPreset() + const selected = useAvaStore((s) => s.selectedPresetId === preset.id) + const running = useAvaStore((s) => s.activePresetId === preset.id) - const save = async () => { - const trimmed = name.trim() + return ( +
+ + {preset.originalFile && ( + + + + )} +
+ ) +} + +// --------------------------------------------------------------------------- +// small rename/create dialog shared by the three name-requiring actions +// --------------------------------------------------------------------------- + +/** + * Fully controlled name prompt shared by the three name-requiring actions + * (create preset / new subfolder / rename). The parent owns the input value + * and error so each open starts clean without mount tricks. + */ +function NameDialog({ + open, + onOpenChange, + title, + description, + placeholder, + value, + onChange, + error, + onError, + submitLabel, + busy, + onSubmit, +}: { + open: boolean + onOpenChange: (open: boolean) => void + title: string + description: string + placeholder: string + value: string + onChange: (value: string) => void + error: string | null + onError: (error: string | null) => void + submitLabel: string + busy: boolean + /** Return true to close the dialog (server errors keep it open). */ + onSubmit: (name: string) => Promise +}) { + const submit = async () => { + const trimmed = value.trim() if (!trimmed) { - toast({ title: 'Name required', description: 'Give the preset a name before saving.', variant: 'destructive' }) + onError('Enter a name first.') return } - const v = validateScript(scriptText) - setSaving(true) + const ok = await onSubmit(trimmed) + if (ok) onOpenChange(false) + } + + return ( + + + + {title} + {description} + +
+ onChange(e.target.value)} + placeholder={placeholder} + autoFocus + aria-label={title} + className="h-9 border-zinc-700 bg-zinc-900 font-mono text-xs" + onFocus={(e) => e.currentTarget.select()} + onKeyDown={(e) => { + if (e.key === 'Enter') void submit() + }} + /> + {error &&

{error}

} +
+ + + + +
+
+ ) +} + +// --------------------------------------------------------------------------- +// the tab +// --------------------------------------------------------------------------- + +type DialogKind = 'createPreset' | 'newFolder' | 'rename' | null + +interface DeleteTarget { + kind: 'folder' | 'preset' + name: string + /** Folder path (folder delete) or preset id (preset delete). */ + path: string + presetCount: number + folderCount: number +} + +export function PresetsTab() { + const { toast } = useToast() + const loadPreset = useLoadPreset() + + const presets = useAvaStore((s) => s.presets) + const folders = useAvaStore((s) => s.folders) + const selectedFolder = useAvaStore((s) => s.selectedFolder) + const selectedPresetId = useAvaStore((s) => s.selectedPresetId) + const randomize = useAvaStore((s) => s.randomize) + const randomIntervalSec = useAvaStore((s) => s.randomIntervalSec) + const randomScope = useAvaStore((s) => s.randomScope) + + const [dialog, setDialog] = useState(null) + const [nameValue, setNameValue] = useState('') + const [nameError, setNameError] = useState(null) + const [busy, setBusy] = useState(false) + const [deleteTarget, setDeleteTarget] = useState(null) + const [delayText, setDelayText] = useState(String(randomIntervalSec)) + const [delayError, setDelayError] = useState(false) + const importInputRef = useRef(null) + + // freshness refresh whenever the tab mounts (initial seed happens on app load) + useEffect(() => { + void refreshPresets() + }, []) + + // keep the delay input in sync when the store value changes elsewhere + useEffect(() => { + setDelayText(String(randomIntervalSec)) + }, [randomIntervalSec]) + + const tree = useMemo(() => buildTree(folders, presets), [folders, presets]) + const selectedPreset = useMemo( + () => presets.find((p) => p.id === selectedPresetId) ?? null, + [presets, selectedPresetId], + ) + const folderProtected = PROTECTED_FOLDERS.has(selectedFolder) + const folderName = selectedFolder.split('/').pop() ?? selectedFolder + const folderPrefix = `${selectedFolder}/` + const folderPresetCount = presets.filter( + (p) => p.folderPath === selectedFolder || p.folderPath.startsWith(folderPrefix), + ).length + const childFolderCount = folders.filter( + (f) => f.startsWith(folderPrefix) && !f.slice(folderPrefix.length).includes('/'), + ).length + const scopeCount = presets.filter( + (p) => randomScope === 'root' || p.folderPath === randomScope || p.folderPath.startsWith(`${randomScope}/`), + ).length + const scopeLabel = randomScope === 'root' ? 'all presets' : (randomScope.split('/').pop() ?? randomScope) + + // ----------------------------------------------------------------- + // actions + // ----------------------------------------------------------------- + + const submitCreatePreset = async (name: string): Promise => { + setBusy(true) try { const res = await fetch('/api/presets', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - name: trimmed, - content: scriptText, - author: v.meta?.author || 'you', - description: v.meta?.description || '', - }), + body: JSON.stringify({ name, content: STARTER_TEMPLATE, folderPath: selectedFolder }), }) - const data = (await res.json().catch(() => null)) as { error?: string; updated?: boolean } | null + const data = (await res.json().catch(() => null)) as { preset?: PresetItem; error?: string } | null + if (!res.ok || !data?.preset) { + toast({ + title: 'Preset not created', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return false + } + await refreshPresets() + const st = useAvaStore.getState() + st.setEditTarget({ id: data.preset.id, name: data.preset.name, folderPath: data.preset.folderPath }) + st.setScriptText(STARTER_TEMPLATE) + applyScriptText(STARTER_TEMPLATE) + st.setActivePresetId(data.preset.id) + st.selectPreset(data.preset.id) + st.setTab('script') + toast({ + title: 'Preset created', + description: `"${data.preset.name}" created — now edit and Save.`, + }) + return true + } catch { + toast({ + title: 'Preset not created', + description: 'Network error while creating the preset.', + variant: 'destructive', + }) + return false + } finally { + setBusy(false) + } + } + + const submitNewFolder = async (name: string): Promise => { + const path = `${selectedFolder}/${name}` + setBusy(true) + try { + const res = await fetch('/api/folders', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ path }), + }) + const data = (await res.json().catch(() => null)) as { folder?: { path: string }; error?: string } | null + if (!res.ok || !data?.folder) { + toast({ + title: 'Folder not created', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return false + } + await refreshPresets() + const st = useAvaStore.getState() + st.toggleFolder(selectedFolder, true) + st.selectFolder(data.folder.path) + toast({ title: 'Folder created', description: `"${name}" added under ${selectedFolder}.` }) + return true + } catch { + toast({ + title: 'Folder not created', + description: 'Network error while creating the folder.', + variant: 'destructive', + }) + return false + } finally { + setBusy(false) + } + } + + const submitRename = async (name: string): Promise => { + setBusy(true) + try { + if (selectedPreset) { + const res = await fetch(`/api/presets/${selectedPreset.id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name }), + }) + const data = (await res.json().catch(() => null)) as { preset?: PresetItem; error?: string } | null + if (!res.ok || !data?.preset) { + toast({ + title: 'Rename failed', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return false + } + await refreshPresets() + const st = useAvaStore.getState() + if (st.editTarget?.id === selectedPreset.id) { + st.setEditTarget({ + id: data.preset.id, + name: data.preset.name, + folderPath: data.preset.folderPath, + }) + } + toast({ + title: 'Preset renamed', + description: `"${selectedPreset.name}" is now "${data.preset.name}".`, + }) + return true + } + // folder rename — everything below moves with it + const res = await fetch('/api/folders', { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ path: selectedFolder, newName: name }), + }) + const data = (await res.json().catch(() => null)) as { to?: string; error?: string } | null + if (!res.ok || !data?.to) { + toast({ + title: 'Rename failed', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return false + } + await refreshPresets() + const st = useAvaStore.getState() + st.selectFolder(data.to) + if ( + st.editTarget && + (st.editTarget.folderPath === selectedFolder || st.editTarget.folderPath.startsWith(folderPrefix)) + ) { + st.setEditTarget({ + ...st.editTarget, + folderPath: data.to + st.editTarget.folderPath.slice(selectedFolder.length), + }) + } + toast({ title: 'Folder renamed', description: `Now at ${data.to}.` }) + return true + } catch { + toast({ + title: 'Rename failed', + description: 'Network error while renaming.', + variant: 'destructive', + }) + return false + } finally { + setBusy(false) + } + } + + const openDialog = (kind: Exclude, initialName: string) => { + setDialog(kind) + setNameValue(initialName) + setNameError(null) + } + + const openPresetDelete = () => { + if (!selectedPreset) return + setDeleteTarget({ + kind: 'preset', + name: selectedPreset.name, + path: selectedPreset.id, + presetCount: 1, + folderCount: 0, + }) + } + + const openFolderDelete = () => { + const presetCount = presets.filter( + (p) => p.folderPath === selectedFolder || p.folderPath.startsWith(folderPrefix), + ).length + const folderCount = folders.filter((f) => f.startsWith(folderPrefix)).length + setDeleteTarget({ kind: 'folder', name: folderName, path: selectedFolder, presetCount, folderCount }) + } + + const confirmDelete = async () => { + if (!deleteTarget || busy) return + setBusy(true) + try { + const isFolder = deleteTarget.kind === 'folder' + const res = await fetch( + isFolder ? `/api/folders?path=${encodeURIComponent(deleteTarget.path)}` : `/api/presets/${deleteTarget.path}`, + { method: 'DELETE' }, + ) + const data = (await res.json().catch(() => null)) as { deleted?: boolean; error?: string } | null if (!res.ok) { toast({ - title: 'Save failed', + title: 'Delete failed', description: data?.error ?? `Server responded ${res.status}.`, variant: 'destructive', }) @@ -148,98 +646,374 @@ function SavePresetSection() { } await refreshPresets() toast({ - title: data?.updated ? 'Preset updated' : 'Preset saved', - description: `"${trimmed}" is available in the list above.`, + title: isFolder ? 'Folder deleted' : 'Preset deleted', + description: isFolder + ? `"${deleteTarget.name}" and everything inside it removed.` + : `"${deleteTarget.name}" removed.`, }) - setName('') } catch { - toast({ title: 'Save failed', description: 'Network error while saving the preset.', variant: 'destructive' }) + toast({ + title: 'Delete failed', + description: 'Network error while deleting.', + variant: 'destructive', + }) } finally { - setSaving(false) + setBusy(false) + setDeleteTarget(null) } } - return ( -
-

Save current editor script as preset

-

- Saved under the script's editor content — reuse it any time from this list. -

-
- setName(e.target.value)} - placeholder="Preset name" - className="h-9 border-zinc-700 bg-zinc-900 font-mono text-xs" - onKeyDown={(e) => { - if (e.key === 'Enter') void save() - }} - /> - -
-
- ) -} + const importZip = async (file: File) => { + setBusy(true) + try { + const form = new FormData() + form.append('file', file) + form.append('targetPath', selectedFolder) + const res = await fetch('/api/presets/import', { method: 'POST', body: form }) + const data = (await res.json().catch(() => null)) as + | { imported?: number; skipped?: number; foldersCreated?: number; error?: string } + | null + if (!res.ok || !data) { + toast({ + title: 'Import failed', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return + } + await refreshPresets() + useAvaStore.getState().toggleFolder(selectedFolder, true) + let summary = `Imported ${data.imported ?? 0} presets` + if ((data.skipped ?? 0) > 0) summary += `, ${data.skipped} duplicates skipped` + if ((data.foldersCreated ?? 0) > 0) summary += ` — ${data.foldersCreated} folders created` + toast({ title: 'Import complete', description: `${summary}.` }) + } catch { + toast({ + title: 'Import failed', + description: 'Network error while importing.', + variant: 'destructive', + }) + } finally { + setBusy(false) + } + } -export function PresetsTab() { - const presets = useAvaStore((s) => s.presets) - const setScriptText = useAvaStore((s) => s.setScriptText) - const setTab = useAvaStore((s) => s.setTab) + // ----------------------------------------------------------------- + // randomizer controls (timer runs in the store) + // ----------------------------------------------------------------- - // freshness refresh whenever the tab mounts (initial seed happens on app load) - useEffect(() => { - void refreshPresets() - }, []) + const onDelayChange = (raw: string) => { + setDelayText(raw) + const result = useAvaStore.getState().setRandomIntervalSec(Number(raw)) + setDelayError(!result.ok) + if (result.ok && result.value !== undefined) setDelayText(String(result.value)) + } - const builtIns = presets.filter((p) => p.isBuiltIn) - const customs = presets.filter((p) => !p.isBuiltIn) + const onDelayBlur = () => { + // invalid / partial input never persists — revert to the committed value + if (delayError) setDelayText(String(randomIntervalSec)) + } + + // ----------------------------------------------------------------- + // render + // ----------------------------------------------------------------- return ( -
+

- {presets.length} preset{presets.length === 1 ? '' : 's'} — classics adapted from the original Winamp AVS - files. + {presets.length} presets ·{' '} + {folders.length} folders

- +

double-click a preset to run it

- {/* long-list handling: capped height + styled scrollbar */} -
- {builtIns.map((p) => ( - - ))} - {customs.length > 0 && ( -
Custom
- )} - {customs.map((p) => ( - - ))} - {presets.length === 0 && ( -
- Loading presets… +
+ {/* LEFT — folder/file tree */} +
+
+ {tree.map((node) => ( + + ))} + {presets.length === 0 && ( +

Loading presets…

+ )}
- )} +
+ + {/* RIGHT — management panel */} +
+
+ {selectedPreset ? ( + + ) : ( + + )} +
+

+ {selectedPreset ? selectedPreset.name : folderName} +

+

+ {selectedPreset ? selectedPreset.folderPath : selectedFolder} +

+ {!selectedPreset && ( +

+ {plural(folderPresetCount, 'preset')} · {plural(childFolderCount, 'subfolder')} +

+ )} +
+
+ +
+ {selectedPreset ? ( + <> + +
+ + +
+ + ) : ( + <> + + +
+ + +
+
+ + +
+ + )} +
+ + {/* randomize (club mode) — timer runs in the store */} +
+
+ useAvaStore.getState().setRandomize(v === true)} + aria-label="Randomize presets" + className="size-4 data-[state=checked]:border-emerald-400 data-[state=checked]:bg-emerald-400 data-[state=checked]:text-zinc-950" + /> + +
+ onDelayChange(e.target.value)} + onBlur={onDelayBlur} + inputMode="numeric" + aria-label="Random switch delay in seconds" + className="h-8 w-16 border-zinc-700 bg-zinc-900 px-2 text-center font-mono text-xs tabular-nums" + /> + sec +
+
+ {delayError && ( +

Delay must be between 3 and 60 seconds.

+ )} +

+ Random from: {scopeLabel} + {scopeCount === 0 && — no presets in this folder yet} +

+ {randomize && ( +
+ + + ON · every {randomIntervalSec}s + +
+ )} +
+
- + {/* name dialogs */} + setDialog(o ? 'createPreset' : null)} + title="Create preset" + description={`New preset from the starter template inside ${selectedFolder}.`} + placeholder="Preset name" + value={nameValue} + onChange={setNameValue} + error={nameError} + onError={setNameError} + submitLabel="Create" + busy={busy} + onSubmit={submitCreatePreset} + /> + setDialog(o ? 'newFolder' : null)} + title="New subfolder" + description={`Created inside ${selectedFolder}.`} + placeholder="Folder name" + value={nameValue} + onChange={setNameValue} + error={nameError} + onError={setNameError} + submitLabel="Create" + busy={busy} + onSubmit={submitNewFolder} + /> + setDialog(o ? 'rename' : null)} + title={selectedPreset ? 'Rename preset' : 'Rename folder'} + description={ + selectedPreset + ? `Currently "${selectedPreset.name}" in ${selectedPreset.folderPath}.` + : `Currently "${folderName}" — everything inside moves with it.` + } + placeholder="New name" + value={nameValue} + onChange={setNameValue} + error={nameError} + onError={setNameError} + submitLabel="Rename" + busy={busy} + onSubmit={submitRename} + /> + + {/* delete confirmation */} + !o && setDeleteTarget(null)}> + + + + {deleteTarget?.kind === 'folder' + ? `Delete "${deleteTarget.name}"?` + : `Delete preset "${deleteTarget?.name ?? ''}"?`} + + + {deleteTarget?.kind === 'folder' + ? deleteTarget.presetCount > 0 || deleteTarget.folderCount > 0 + ? `Delete "${deleteTarget.name}" and everything inside it? This removes ${plural(deleteTarget.presetCount, 'preset')}${deleteTarget.folderCount > 0 ? ` in ${plural(deleteTarget.folderCount, 'folder')}` : ''}. This cannot be undone.` + : `Delete "${deleteTarget.name}"? The folder is empty. This cannot be undone.` + : `Delete preset "${deleteTarget?.name ?? ''}"? This cannot be undone.`} + + + + Cancel + { + e.preventDefault() + void confirmDelete() + }} + className="h-9 bg-rose-500 text-zinc-50 hover:bg-rose-400" + > + {busy ? 'Deleting…' : 'Delete'} + + + + + + {/* hidden zip import picker */} + { + const file = e.target.files?.[0] + if (file) void importZip(file) + e.target.value = '' + }} + />
) } diff --git a/src/components/ava/script-tab.tsx b/src/components/ava/script-tab.tsx index 8a8411a..f559a97 100755 --- a/src/components/ava/script-tab.tsx +++ b/src/components/ava/script-tab.tsx @@ -1,28 +1,48 @@ // AVA — Script tab: the custom visualization script editor. // -// Toolbar: Apply, Save as Default, Save to File, Load from File, New, Help. -// Editor: line-number gutter + monospace textarea (synced scroll, Tab inserts -// two spaces), error lines flagged in the gutter. Status line under the editor -// shows compile status or runtime errors. +// Toolbar: Apply, Save (to the preset picked in the Presets tab, when a save +// target is set), Save As…, Save as Default, Save to File, Load from File, +// New, Help. Editor: line-number gutter + monospace textarea (synced scroll, +// Tab inserts two spaces), error lines flagged in the gutter. Status line +// under the editor shows compile status or runtime errors. 'use client' import { useEffect, useMemo, useRef, useState } from 'react' -import { Check, CircleHelp, Download, FilePlus2, FolderOpen, Play, Save, X } from 'lucide-react' +import { Check, CircleHelp, Copy, Download, FilePlus2, FolderOpen, Play, Save, X } from 'lucide-react' import { Button } from '@/components/ui/button' +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog' +import { Input } from '@/components/ui/input' import { STARTER_TEMPLATE } from '@/lib/ava/presets' import { validateScript } from '@/lib/ava/script' -import { useAvaStore, persistDefaultScript } from '@/lib/store' +import { refreshPresets, useAvaStore, persistDefaultScript, type PresetItem } from '@/lib/store' import { applyScriptText } from '@/components/ava/audio-source' import { HelpPanel } from '@/components/ava/help-panel' import { sanitizeFileName } from '@/components/ava/shared' import { useToast } from '@/hooks/use-toast' import { cn } from '@/lib/utils' +/** Middle-truncated save-target path for the chip: "root/embedded/…/Name". */ +function formatSavePath(folderPath: string, name: string): string { + const full = `${folderPath}/${name}` + if (full.length <= 36) return full + const segs = folderPath.split('/') + return `${segs.slice(0, 2).join('/')}/…/${name}` +} + export function ScriptTab() { const { toast } = useToast() const scriptText = useAvaStore((s) => s.scriptText) const setScriptText = useAvaStore((s) => s.setScriptText) + const editTarget = useAvaStore((s) => s.editTarget) + const setEditTarget = useAvaStore((s) => s.setEditTarget) const runtimeError = useAvaStore((s) => s.stats?.error ?? null) const textareaRef = useRef(null) @@ -31,6 +51,11 @@ export function ScriptTab() { const [validation, setValidation] = useState | null>(null) const [helpOpen, setHelpOpen] = useState(false) + const [saving, setSaving] = useState(false) + const [saveAsOpen, setSaveAsOpen] = useState(false) + const [saveAsName, setSaveAsName] = useState('') + const [saveAsBusy, setSaveAsBusy] = useState(false) + const [saveAsError, setSaveAsError] = useState(null) // debounced live validation (compile is cheap, scripts are small) useEffect(() => { @@ -78,6 +103,88 @@ export function ScriptTab() { }) } + /** Overwrite the target preset (picked in the Presets tab) with the editor script. */ + const saveToTarget = async () => { + if (!editTarget || saving) return + setSaving(true) + try { + const v = validateScript(scriptText) + const body: Record = { content: scriptText } + if (v.meta?.author) body.author = v.meta.author + const res = await fetch(`/api/presets/${editTarget.id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }) + const data = (await res.json().catch(() => null)) as { preset?: PresetItem; error?: string } | null + if (!res.ok) { + toast({ + title: 'Save failed', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return + } + await refreshPresets() + toast({ title: `Saved to "${editTarget.name}"`, description: 'The preset now holds the current editor script.' }) + } catch { + toast({ title: 'Save failed', description: 'Network error while saving the preset.', variant: 'destructive' }) + } finally { + setSaving(false) + } + } + + const openSaveAs = () => { + if (!editTarget) return + setSaveAsName(editTarget.name) + setSaveAsError(null) + setSaveAsOpen(true) + } + + /** Save a copy of the editor script under a new name in the same folder. */ + const saveAsCopy = async () => { + if (!editTarget) return + const trimmed = saveAsName.trim() + if (!trimmed) { + setSaveAsError('Enter a name first.') + return + } + setSaveAsBusy(true) + try { + const v = validateScript(scriptText) + const res = await fetch('/api/presets', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + name: trimmed, + content: scriptText, + folderPath: editTarget.folderPath, + author: v.meta?.author || 'you', + }), + }) + const data = (await res.json().catch(() => null)) as { preset?: PresetItem; error?: string } | null + if (!res.ok || !data?.preset) { + toast({ + title: 'Save failed', + description: data?.error ?? `Server responded ${res.status}.`, + variant: 'destructive', + }) + return + } + await refreshPresets() + setEditTarget({ id: data.preset.id, name: data.preset.name, folderPath: data.preset.folderPath }) + setSaveAsOpen(false) + toast({ + title: 'Copy saved', + description: `"${data.preset.name}" created in ${data.preset.folderPath}.`, + }) + } catch { + toast({ title: 'Save failed', description: 'Network error while saving the copy.', variant: 'destructive' }) + } finally { + setSaveAsBusy(false) + } + } + const saveToFile = () => { const meta = validateScript(scriptText).meta const base = sanitizeFileName(meta?.name && meta.name !== 'Untitled' ? meta.name : 'untitled') @@ -148,6 +255,25 @@ export function ScriptTab() { return (
+ {/* save-target chip — which preset "Save" writes into */} + {editTarget && ( +
+ + + Saving to: {formatSavePath(editTarget.folderPath, editTarget.name)} + + +
+ )} + {/* toolbar */}
+ {editTarget && ( + + )} + {editTarget && ( + + )} @@ -252,6 +403,54 @@ export function ScriptTab() { {/* help panel */} {helpOpen && } + {/* save-a-copy dialog */} + { + setSaveAsOpen(o) + if (o) setSaveAsError(null) + }} + > + + + Save a copy + + Saves the current editor script as a new preset in {editTarget?.folderPath ?? ''}. + + +
+ { + setSaveAsName(e.target.value) + setSaveAsError(null) + }} + placeholder="Preset name" + autoFocus + aria-label="New preset name" + className="h-9 border-zinc-700 bg-zinc-900 font-mono text-xs" + onFocus={(e) => e.currentTarget.select()} + onKeyDown={(e) => { + if (e.key === 'Enter') void saveAsCopy() + }} + /> + {saveAsError &&

{saveAsError}

} +
+ + + + +
+
+ = {} + /** +1 native (y up) / -1 AVS-ported presets (y down). Applied when reading points. */ + private ysign = 1 + + constructor() { + // AVS-eel compatibility hooks — the expression engine reads audio/time + // through these (getspec/getosc/gettime). Headless tests can override. + AVA_HOOKS.spectrumAt = (pos) => this.audio.getSpectrum(pos) + AVA_HOOKS.waveAt = (pos) => this.audio.getWave(pos) + AVA_HOOKS.now = () => this.env.time ?? 0 + } private points = new Float32Array(MAX_POINTS * POINT_STRIDE) private lastNow = 0 @@ -85,7 +96,9 @@ export class AvaEngine { setScript(script: AvaScript): void { this.script = script this.scriptError = null + this.ysign = script.meta.ysign === -1 ? -1 : 1 this.env = { n: 400, t: 0, time: 0, frame: 0, beats: 0 } + resetEelBuffers() try { script.initProg?.exec(this.env) } catch (err) { @@ -200,7 +213,7 @@ export class AvaEngine { this.script.pointProg.exec(env) const o = k * POINT_STRIDE pts[o] = env.x - pts[o + 1] = env.y + pts[o + 1] = env.y * this.ysign pts[o + 2] = env.red pts[o + 3] = env.green pts[o + 4] = env.blue @@ -227,11 +240,9 @@ export class AvaEngine { ctx.lineCap = 'round' ctx.lineJoin = 'round' for (let pass = 0; pass < 2; pass++) { - const lw = (pass === 0 ? 3.2 : 1) * meta.linewidth * scale const gain = pass === 0 ? 0.22 : 0.9 - ctx.lineWidth = lw let pen = false - let pr = 0, pg = 0, pb = 0, pa = 0, pxp = 0, pyp = 0 + let pr = 0, pg = 0, pb = 0, pa = 0, pxp = 0, pyp = 0, plw = 0 for (let k = 0; k < n; k++) { const o = k * POINT_STRIDE const skip = pts[o + 5] @@ -241,19 +252,22 @@ export class AvaEngine { const g = Math.max(0, Math.min(1, pts[o + 3])) const b = Math.max(0, Math.min(1, pts[o + 4])) const a = Math.max(0, Math.min(1, pts[o + 7])) + // per-point line width (AVS linesize) — falls back to meta.linewidth + const lw = Math.max(0.3, pts[o + 6] > 0 ? pts[o + 6] : meta.linewidth) * (pass === 0 ? 3.2 : 1) * scale if (skip) { pen = false - pr = r; pg = g; pb = b; pa = a; pxp = x; pyp = y + pr = r; pg = g; pb = b; pa = a; pxp = x; pyp = y; plw = lw continue } if (pen) { ctx.strokeStyle = `rgba(${(((pr + r) / 2) * 255) | 0},${(((pg + g) / 2) * 255) | 0},${(((pb + b) / 2) * 255) | 0},${(((pa + a) / 2) * gain).toFixed(3)})` + ctx.lineWidth = (plw + lw) / 2 ctx.beginPath() ctx.moveTo(pxp, pyp) ctx.lineTo(x, y) ctx.stroke() } - pr = r; pg = g; pb = b; pa = a; pxp = x; pyp = y + pr = r; pg = g; pb = b; pa = a; pxp = x; pyp = y; plw = lw pen = true } } diff --git a/src/lib/ava/expression.ts b/src/lib/ava/expression.ts index cc7ddc1..4cf50c0 100755 --- a/src/lib/ava/expression.ts +++ b/src/lib/ava/expression.ts @@ -7,6 +7,10 @@ // - functions: sin cos tan asin acos atan atan2 abs sqrt sqr pow exp log log10 // floor ceil round int frac sign min max rand lerp clamp // above below equal band bor bnot inrange sigmoid if +// invsqrt rnd (AVS rand) +// AVS-eel compat: getspec getosc gettime getkbmouse +// loop(count, body) megabuf(i)/gmegabuf(i) (+ array writes) +// single '&' '|' bitwise operators, x/0 === 0 // - constants: pi, tau, e // // `if(cond, a, b)` and the ternary only evaluate the taken branch (lazy), @@ -16,6 +20,38 @@ export type Env = Record export type Node = (env: Env) => number +// --------------------------------------------------------------------------- +// AVS-eel compatibility hooks +// --------------------------------------------------------------------------- +// The Winamp AVS expression language (eel) exposes audio data through +// getspec()/getosc()/gettime(). The render engine injects its implementations +// here once (headless smoke tests can substitute their own). + +export const AVA_HOOKS = { + /** Spectrum magnitude at position 0..1 → 0..1 (AVS getspec). */ + spectrumAt: (pos: number): number => 0, + /** Waveform sample at position 0..1 → -1..1 (AVS getosc). */ + waveAt: (pos: number): number => 0, + /** Seconds since the visualization started (AVS gettime). */ + now: (): number => 0, +} + +// eel per-preset / global array buffers (megabuf has 1M slots in AVS) +const EEL_BUF_SIZE = 1 << 20 +const MEGABUF = new Float64Array(EEL_BUF_SIZE) +const GMEGABUF = new Float64Array(EEL_BUF_SIZE) + +/** Clear megabuf/gmegabuf — called when a new script loads (AVS semantics). */ +export function resetEelBuffers(): void { + MEGABUF.fill(0) + GMEGABUF.fill(0) +} + +function eelRead(buf: Float64Array, idx: number): number { + const k = idx | 0 + return k >= 0 && k < EEL_BUF_SIZE ? buf[k] : 0 +} + export class ExpressionError extends Error { line: number constructor(message: string, line: number) { @@ -32,7 +68,7 @@ interface Token { } const TWO_CHAR_OPS = new Set(['<=', '>=', '==', '!=', '&&', '||']) -const ONE_CHAR_OPS = new Set(['+', '-', '*', '/', '%', '^', '<', '>', '=', '!', '?', ':', '(', ')', ',', ';']) +const ONE_CHAR_OPS = new Set(['+', '-', '*', '/', '%', '^', '<', '>', '=', '!', '?', ':', '(', ')', ',', ';', '&', '|']) const CMP_OPS = new Set(['==', '!=', '<', '<=', '>', '>=']) export const CONSTANTS: Record = { @@ -63,7 +99,19 @@ function fn3(f: (x: number, y: number, z: number) => number): FuncDef { return { minArgs: 3, maxArgs: 3, build: (a) => (env) => f(a[0](env), a[1](env), a[2](env)) } } +const clamp01 = (x: number): number => (x < 0 ? 0 : x > 1 ? 1 : x) + const FUNCTIONS: Record = { + // --- AVS-eel audio/time compatibility --------------------------------- + getspec: fn3((a, _w, _ch) => AVA_HOOKS.spectrumAt(clamp01(a))), + getosc: fn3((a, _w, _ch) => AVA_HOOKS.waveAt(clamp01(a))), + gettime: fn1(() => AVA_HOOKS.now()), + getkbmouse: fn1(() => 0), + invsqrt: fn1((x) => 1 / Math.sqrt(x)), + // AVS rand(max): random INTEGER in 0..max-1 (non-deterministic). + rnd: fn1((n) => Math.floor(Math.random() * Math.max(0, Math.floor(n)))), + megabuf: fn1((i) => eelRead(MEGABUF, i)), + gmegabuf: fn1((i) => eelRead(GMEGABUF, i)), sin: fn1(Math.sin), cos: fn1(Math.cos), tan: fn1(Math.tan), @@ -112,13 +160,18 @@ function tokenize(src: string, baseLine: number): Token[] { let i = 0 let line = baseLine let depth = 0 // paren depth — newlines inside parens are not separators + // Kind of each open paren ('loop' vs 'expr') — newlines directly inside a + // loop( body ARE statement separators (AVS-eel loop semantics). + const parenKinds: ('loop' | 'expr')[] = [] const n = src.length while (i < n) { const c = src[i] if (c === '\n') { line++ i++ - if (depth === 0) tokens.push({ type: 'op', value: ';', line }) + if (depth === 0 || parenKinds[parenKinds.length - 1] === 'loop') { + tokens.push({ type: 'op', value: ';', line }) + } continue } if (c === '\r' || c === ' ' || c === '\t') { @@ -156,8 +209,15 @@ function tokenize(src: string, baseLine: number): Token[] { i += 2 continue } - if (c === '(') depth++ - if (c === ')') depth = Math.max(0, depth - 1) + if (c === '(') { + const prev = tokens[tokens.length - 1] + parenKinds.push(prev && prev.type === 'ident' && prev.value === 'loop' ? 'loop' : 'expr') + depth++ + } + if (c === ')') { + parenKinds.pop() + depth = Math.max(0, depth - 1) + } if (ONE_CHAR_OPS.has(c)) { tokens.push({ type: 'op', value: c, line }) i++ @@ -209,7 +269,8 @@ class Parser { } /** Assignment expression — also valid inside function args and ternary - * branches (AVS-style: if(cond, x = 1, x = 2)). Right-associative. */ + * branches (AVS-style: if(cond, x = 1, x = 2)). Right-associative. + * Also handles AVS array writes: megabuf(i) = value / gmegabuf(i) = value. */ private parseAssignExpr(): Node { const t = this.peek() if (t && t.type === 'ident') { @@ -221,6 +282,28 @@ class Parser { const name = t.value return (env) => (env[name] = value(env)) } + if ((t.value === 'megabuf' || t.value === 'gmegabuf') && eq && eq.type === 'op' && eq.value === '(') { + const save = this.pos + this.next() // ident + this.next() // '(' + const idx = this.parseExpr() + if (this.atOp(')')) { + this.next() + if (this.atOp('=')) { + this.next() + const value = this.parseAssignExpr() + const buf = t.value === 'megabuf' ? MEGABUF : GMEGABUF + return (env) => { + const k = idx(env) | 0 + const v = value(env) + if (k >= 0 && k < EEL_BUF_SIZE) buf[k] = v + return v + } + } + } + // not an array write after all — rewind and parse as a plain expression + this.pos = save + } } return this.parseExpr() } @@ -242,23 +325,47 @@ class Parser { } private parseOr(): Node { - let l = this.parseAnd() + let l = this.parseBitOr() while (this.atOp('||')) { this.next() - const r = this.parseAnd() + const r = this.parseBitOr() const lc = l l = (env) => (lc(env) !== 0 ? 1 : r(env) !== 0 ? 1 : 0) } return l } + /** AVS-eel single '|' — bitwise or on truncated ints. */ + private parseBitOr(): Node { + let l = this.parseAnd() + while (this.atOp('|')) { + this.next() + const r = this.parseAnd() + const lc = l + l = (env) => ((lc(env) | 0) | (r(env) | 0)) + } + return l + } + private parseAnd(): Node { - let l = this.parseCmp() + let l = this.parseBitAnd() while (this.atOp('&&')) { + this.next() + const r = this.parseBitAnd() + const lc = l + l = (env) => (lc(env) !== 0 && r(env) !== 0 ? 1 : 0) + } + return l + } + + /** AVS-eel single '&' — bitwise and on truncated ints. */ + private parseBitAnd(): Node { + let l = this.parseCmp() + while (this.atOp('&')) { this.next() const r = this.parseCmp() const lc = l - l = (env) => (lc(env) !== 0 && r(env) !== 0 ? 1 : 0) + l = (env) => ((lc(env) | 0) & (r(env) | 0)) } return l } @@ -304,7 +411,19 @@ class Parser { this.next() const r = this.parseUnary() const lc = l - l = t.value === '*' ? (e) => lc(e) * r(e) : t.value === '/' ? (e) => lc(e) / r(e) : (e) => lc(e) % r(e) + // AVS-eel semantics: division / modulo by zero yields 0 (no Infinity) + l = + t.value === '*' + ? (e) => lc(e) * r(e) + : t.value === '/' + ? (e) => { + const d = r(e) + return d === 0 ? 0 : lc(e) / d + } + : (e) => { + const d = r(e) + return d === 0 ? 0 : lc(e) % d + } } return l } @@ -341,6 +460,38 @@ class Parser { private parsePrimary(): Node { const t = this.next() if (!t) throw new ExpressionError('Unexpected end of expression', this.lastLine()) + // AVS-eel loop(count, body) — repeats the body statement list. The count + // is evaluated once; the body may contain assignments and nested loops. + if (t.type === 'ident' && t.value === 'loop' && this.atOp('(')) { + this.next() // '(' + const count = this.parseAssignExpr() + if (!this.atOp(',')) { + throw new ExpressionError('loop(count, body) — expected a body after the count', t.line) + } + this.next() + const body: Node[] = [] + for (;;) { + while (this.atOp(';')) this.next() + if (this.atOp(')')) break + if (!this.peek()) throw new ExpressionError('Unterminated loop body', t.line) + body.push(this.parseAssignExpr()) + const after = this.peek() + if (after && !(after.type === 'op' && (after.value === ';' || after.value === ')'))) { + throw new ExpressionError(`Unexpected '${after.value}' in loop body — separate statements with ';'`, after.line) + } + } + this.expectOp(')') + return (env) => { + let c = count(env) + if (!Number.isFinite(c) || c < 0) c = 0 + if (c > 100000) c = 100000 + let last = 0 + for (let k = 0; k < c; k++) { + for (let s = 0; s < body.length; s++) last = body[s](env) + } + return last + } + } if (t.type === 'num') { const v = parseFloat(t.value) if (Number.isNaN(v)) throw new ExpressionError(`Bad number '${t.value}'`, t.line) @@ -379,9 +530,27 @@ class Parser { } } if (t.type === 'op' && t.value === '(') { - const inner = this.parseExpr() - this.expectOp(')') - return inner + // Parenthesized group. AVS-eel allows statement sequences as + // expressions: (a = 1; b = 2; a + b) evaluates to the last statement. + const stmts: Node[] = [] + for (;;) { + while (this.atOp(';')) this.next() + if (this.atOp(')') || this.atOp(',')) break + if (!this.peek()) throw new ExpressionError('Missing closing \')\'', t.line) + stmts.push(this.parseAssignExpr()) + const after = this.peek() + if (after && !(after.type === 'op' && (after.value === ';' || after.value === ',' || after.value === ')'))) { + throw new ExpressionError(`Unexpected '${after.value}' — separate statements with ';'`, after.line) + } + } + if (this.atOp(')')) this.next() + if (!stmts.length) throw new ExpressionError('Empty parentheses', t.line) + if (stmts.length === 1) return stmts[0] + return (env) => { + let last = 0 + for (let k = 0; k < stmts.length; k++) last = stmts[k](env) + return last + } } throw new ExpressionError(`Unexpected token '${t.value}'`, t.line) } diff --git a/src/lib/ava/script.ts b/src/lib/ava/script.ts index 97cc2cd..104c05c 100755 --- a/src/lib/ava/script.ts +++ b/src/lib/ava/script.ts @@ -26,6 +26,8 @@ export interface ScriptMeta { blend: BlendMode persist: number linewidth: number + /** +1 (default, y is up) or -1 (AVS convention, y is down — used by auto-ported presets). */ + ysign: number } export interface ScriptError { @@ -54,7 +56,7 @@ export interface AvaScript { } const SECTION_NAMES = new Set(['init', 'frame', 'beat', 'point']) -const HEADER_KEYS = new Set(['name', 'author', 'description', 'mode', 'blend', 'persist', 'linewidth']) +const HEADER_KEYS = new Set(['name', 'author', 'description', 'mode', 'blend', 'persist', 'linewidth', 'ysign']) const MODES = new Set(['lines', 'dots', 'solid']) const BLENDS = new Set(['additive', 'alpha']) @@ -66,6 +68,7 @@ const DEFAULT_META: ScriptMeta = { blend: 'additive', persist: 0.85, linewidth: 2, + ysign: 1, } /** Parse + compile a script. Throws AvaScriptError on the first problem found. */ @@ -169,6 +172,14 @@ function tryParse(text: string): { script: AvaScript | null; meta?: ScriptMeta; meta.linewidth = Math.min(Math.max(v, 0.5), 16) break } + case 'ysign': { + const v = parseInt(value, 10) + if (v !== 1 && v !== -1) { + return { script: null, meta: { ...meta }, error: { message: `ysign must be 1 or -1 (got '${value}')`, section: 'header', line: lineNo } } + } + meta.ysign = v + break + } } } flushSection() diff --git a/src/lib/server/preset-tree.ts b/src/lib/server/preset-tree.ts new file mode 100644 index 0000000..d4f0dbb --- /dev/null +++ b/src/lib/server/preset-tree.ts @@ -0,0 +1,89 @@ +// AVA — server-side preset folder-tree helpers. +// +// The preset library is a virtual file tree rooted at "root" with two +// structural areas: "root/embedded" (the shipped Winamp AVS ports) and +// "root/user created" (the user's own space). Every folder below those is +// fully manageable (create / rename / delete / export / import). + +import { db } from '@/lib/db' + +export const MAX_DEPTH = 8 +export const MAX_SEGMENT = 80 + +/** Folders that anchor the tree — they can never be renamed or deleted. */ +export const PROTECTED_FOLDERS = new Set(['root', 'root/embedded', 'root/user created']) + +export interface ParsedPath { + path: string + segments: string[] +} + +/** + * Validate + normalize a folder path ("root/a/b"). Returns null when the path + * is malformed (wrong root, too deep, bad characters, empty segments). + */ +export function normalizeFolderPath(raw: unknown): ParsedPath | null { + if (typeof raw !== 'string') return null + const trimmed = raw.trim().replace(/\/+$/, '') + if (!trimmed) return null + const parts = trimmed + .split('/') + .map((s) => s.trim()) + .filter((s) => s.length > 0) + if (parts.length === 0 || parts.length > MAX_DEPTH) return null + if (parts[0] !== 'root') return null + for (const seg of parts) { + if (seg.length > MAX_SEGMENT) return null + if (/[\u0000-\u001f\u007f]/.test(seg)) return null + if (seg === '.' || seg === '..') return null + } + return { path: parts.join('/'), segments: parts } +} + +/** Validate a preset / folder display name (no separators, sane length). */ +export function isValidName(raw: unknown, maxLen = 120): string | null { + if (typeof raw !== 'string') return null + const name = raw.trim() + if (!name || name.length > maxLen) return null + if (/[/\u0000-\u001f\u007f]/.test(name)) return null + return name +} + +/** Parent path of a segment list: ["root","a","b"] → "root/a". */ +export function parentOf(segments: string[]): string { + return segments.slice(0, -1).join('/') +} + +/** Prisma where-clause matching presets in a folder and every folder below it. */ +export function subtreeFilter(path: string) { + return { + OR: [{ folderPath: path }, { folderPath: { startsWith: `${path}/` } }], + } +} + +/** Same, but for Folder rows (their column is `path`). */ +export function subtreeFolderFilter(path: string) { + return { + OR: [{ path }, { path: { startsWith: `${path}/` } }], + } +} + +/** + * Ensure Folder rows exist for the given paths AND all of their ancestors. + * Returns how many rows were created. + */ +export async function ensureFolderRows(paths: string[]): Promise { + const wanted = new Set() + for (const p of paths) { + const segs = p.split('/') + for (let i = 1; i <= segs.length; i++) wanted.add(segs.slice(0, i).join('/')) + } + const existing = await db.folder.findMany({ + where: { path: { in: [...wanted] } }, + select: { path: true }, + }) + for (const e of existing) wanted.delete(e.path) + if (wanted.size === 0) return 0 + await db.folder.createMany({ data: [...wanted].map((path) => ({ path })) }) + return wanted.size +} diff --git a/src/lib/store.ts b/src/lib/store.ts index b2860f1..783bea0 100755 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -12,6 +12,8 @@ import { getEngine } from '@/lib/ava/engine' import type { TapResult } from '@/lib/ava/beat' import type { BandConfig, BeatConfig, BeatSource } from '@/lib/ava/types' import { DEFAULT_BAND_CONFIG, DEFAULT_BEAT_CONFIG } from '@/lib/ava/types' +import { validateScript } from '@/lib/ava/script' +import { toast } from '@/hooks/use-toast' export interface PresetItem { id: string @@ -20,9 +22,20 @@ export interface PresetItem { description: string content: string isBuiltIn: boolean + /** Full path from the virtual root, e.g. "root/embedded/Synth-C". */ + folderPath: string + /** Path of the original Winamp .avs binary in /public, when shipped. */ + originalFile: string | null updatedAt: string } +/** The preset file the Script tab "Save" button writes into. */ +export interface EditTarget { + id: string + name: string + folderPath: string +} + export type AudioSourceState = 'idle' | 'demo' | 'mic' | 'file' | 'link' /** EngineStats augmented with the beat counter (read alongside the callback). */ @@ -43,6 +56,7 @@ export interface BeatFlash { const LS_BAND = 'ava.bandConfig' const LS_BEAT = 'ava.beatConfig' const LS_SCRIPT = 'ava.defaultScript' +const LS_RANDOM = 'ava.randomize' function lsGetJSON(key: string): T | null { try { @@ -169,6 +183,22 @@ interface AvaState { bandConfig: BandConfig beatConfig: BeatConfig presets: PresetItem[] + /** All folder paths in the preset tree ("root", "root/embedded", …). */ + folders: string[] + /** Folder selected in the tree (drives the management buttons + randomize scope). */ + selectedFolder: string + /** Preset selected in the tree (drives Load / Rename / Delete preset). */ + selectedPresetId: string | null + /** Which tree folders are expanded (missing key → depth-based default). */ + expandedFolders: Record + /** The preset the Script tab "Save" writes into (null = untitled draft). */ + editTarget: EditTarget | null + /** Preset currently running on the engine (tree indicator). */ + activePresetId: string | null + /** Timed random preset switching (club mode). */ + randomize: boolean + randomIntervalSec: number + randomScope: string tab: string setStats: (s: AvaStats) => void @@ -188,9 +218,89 @@ interface AvaState { resetBandConfig: () => void resetBeatConfig: () => void setPresets: (p: PresetItem[]) => void + setFolders: (f: string[]) => void + toggleFolder: (path: string, open?: boolean) => void + selectFolder: (path: string) => void + selectPreset: (id: string | null) => void + setEditTarget: (t: EditTarget | null) => void + setActivePresetId: (id: string | null) => void + setRandomize: (on: boolean) => void + /** Validate + set the random delay (3–60 s). Returns ok:false when invalid. */ + setRandomIntervalSec: (sec: number) => { ok: boolean; value?: number; error?: string } setTab: (t: string) => void } +// --------------------------------------------------------------------------- +// random preset timer (club mode) — module-level, survives tab switches +// --------------------------------------------------------------------------- + +let randomTimer: ReturnType | null = null + +export function stopRandomTimer(): void { + if (randomTimer) { + clearInterval(randomTimer) + randomTimer = null + } +} + +/** + * Pick a random preset inside the current scope and run it on the engine. + * Deliberately does NOT touch the editor text — random switching must never + * destroy unsaved script edits. + */ +function loadRandomPreset(): void { + const s = useAvaStore.getState() + const scope = s.randomScope + const pool = s.presets.filter( + (p) => scope === 'root' || p.folderPath === scope || p.folderPath.startsWith(`${scope}/`), + ) + if (pool.length === 0) return + for (let attempt = 0; attempt < Math.min(4, pool.length); attempt++) { + const pick = pool[Math.floor(Math.random() * pool.length)] + const v = validateScript(pick.content) + if (v.ok && v.script) { + getEngine().setScript(v.script) + useAvaStore.getState().setActivePresetId(pick.id) + toast({ title: 'Random preset', description: `Now playing "${pick.name}".` }) + return + } + } +} + +/** (Re)start or stop the timer according to the current store state. */ +export function syncRandomTimer(): void { + stopRandomTimer() + const s = useAvaStore.getState() + if (!s.randomize) return + randomTimer = setInterval(loadRandomPreset, s.randomIntervalSec * 1000) +} + +function persistRandomSettings(): void { + const s = useAvaStore.getState() + lsSetJSON(LS_RANDOM, { + enabled: s.randomize, + intervalSec: s.randomIntervalSec, + scope: s.randomScope, + }) +} + +/** Restore the persisted randomize settings after presets first load. */ +export function restoreRandomSettings(folders: string[]): void { + const saved = lsGetJSON<{ enabled?: boolean; intervalSec?: number; scope?: string }>(LS_RANDOM) + if (!saved) return + const intervalOk = + typeof saved.intervalSec === 'number' && saved.intervalSec >= 3 && saved.intervalSec <= 60 + const scope = saved.scope === 'root' || folders.includes(saved.scope ?? '') ? saved.scope : 'root' + useAvaStore.setState({ + randomIntervalSec: intervalOk ? Math.round(saved.intervalSec ?? 10) : 10, + randomScope: scope ?? 'root', + }) + if (saved.enabled) { + useAvaStore.setState({ randomize: true }) + syncRandomTimer() + } +} + let flashSeq = 0 export const useAvaStore = create()((set, get) => ({ @@ -205,6 +315,15 @@ export const useAvaStore = create()((set, get) => ({ bandConfig: { ...DEFAULT_BAND_CONFIG }, beatConfig: { ...DEFAULT_BEAT_CONFIG }, presets: [], + folders: ['root', 'root/embedded', 'root/user created'], + selectedFolder: 'root', + selectedPresetId: null, + expandedFolders: {}, + editTarget: null, + activePresetId: null, + randomize: false, + randomIntervalSec: 10, + randomScope: 'root', tab: 'presets', setStats: (s) => set({ stats: s }), @@ -300,20 +419,78 @@ export const useAvaStore = create()((set, get) => ({ setPresets: (p) => set({ presets: p }), + setFolders: (f) => set({ folders: f }), + + toggleFolder: (path, open) => + set((s) => ({ expandedFolders: { ...s.expandedFolders, [path]: open ?? !(s.expandedFolders[path] ?? path.split('/').length <= 2) } })), + + selectFolder: (path) => { + set({ selectedFolder: path, selectedPresetId: null, randomScope: path }) + persistRandomSettings() + syncRandomTimer() + }, + + selectPreset: (id) => set({ selectedPresetId: id }), + + setEditTarget: (t) => set({ editTarget: t }), + + setActivePresetId: (id) => set({ activePresetId: id }), + + setRandomize: (on) => { + set({ randomize: on }) + persistRandomSettings() + syncRandomTimer() + }, + + setRandomIntervalSec: (sec) => { + const n = Math.round(Number(sec)) + if (!Number.isFinite(n) || n < 3 || n > 60) { + return { ok: false, error: 'Delay must be between 3 and 60 seconds.' } + } + set({ randomIntervalSec: n }) + persistRandomSettings() + syncRandomTimer() + return { ok: true, value: n } + }, + setTab: (t) => set({ tab: t }), })) // --------------------------------------------------------------------------- -// preset list fetching (shared by Presets tab + initial load) +// preset tree fetching (shared by Presets tab + initial load) // --------------------------------------------------------------------------- export async function refreshPresets(): Promise { try { const res = await fetch('/api/presets') if (!res.ok) throw new Error(`HTTP ${res.status}`) - const data = (await res.json()) as { presets?: PresetItem[] } + const data = (await res.json()) as { presets?: PresetItem[]; folders?: string[] } const presets = data.presets ?? [] - useAvaStore.getState().setPresets(presets) + const folders = + data.folders && data.folders.length ? data.folders : ['root', 'root/embedded', 'root/user created'] + const s = useAvaStore.getState() + s.setPresets(presets) + s.setFolders(folders) + + // prune selections that no longer exist (after delete / import / rename) + const patch: Partial = {} + if (!folders.includes(s.selectedFolder)) patch.selectedFolder = 'root' + if (s.selectedPresetId && !presets.some((p) => p.id === s.selectedPresetId)) { + patch.selectedPresetId = null + } + if (s.activePresetId && !presets.some((p) => p.id === s.activePresetId)) { + patch.activePresetId = null + } + if (s.editTarget && !presets.some((p) => p.id === s.editTarget?.id)) { + patch.editTarget = null + } + const scope = s.randomScope + if (scope !== 'root' && !folders.includes(scope)) { + patch.randomScope = s.selectedFolder + persistRandomSettings() + syncRandomTimer() + } + if (Object.keys(patch).length > 0) useAvaStore.setState(patch) return presets } catch { return [] diff --git a/tool-results/ava-restored-final.png b/tool-results/ava-restored-final.png new file mode 100644 index 0000000000000000000000000000000000000000..be976dda2def8429f41b6d8c58a3a5cd374d0f89 GIT binary patch literal 95991 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�j2~{A=|e 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 literal 0 HcmV?d00001 diff --git a/tool-results/ava-restored-mobile.png b/tool-results/ava-restored-mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..f7975a8c9e68bb181e71f4447db5965d859617e0 GIT binary patch literal 59218 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 literal 0 HcmV?d00001 diff --git a/tools/convert-avs.ts b/tools/convert-avs.ts new file mode 100644 index 0000000..c21572a --- /dev/null +++ b/tools/convert-avs.ts @@ -0,0 +1,1038 @@ +// AVA — .avs (Winamp AVS binary preset) → .ava auto-converter +// +// Parses the legacy .avs binary format (reverse-engineered against the +// vis_avs reference source), extracts the primary SuperScope / Texer II +// point program plus any AVSTrans #define macros and Jheriko Global +// register-setter code, translates it to the AVA script dialect, validates +// and smoke-runs every generated script through the real engine parser, and +// emits src/lib/ava/embedded-presets.ts. +// +// Run: bun tools/convert-avs.ts [inputRoot] (inputRoot defaults to /tmp/avsdrive/raw) +// +// Format reference (per grandchild/vis_avs source): +// magic "Nullsoft AVS Preset 0.2\x1a" (24 bytes) +// byte clearFlag +// effects: [int32 id] [if id>=0x4000: 32-byte apeId] [int32 len] [blob] +// id 36 SuperScope: [byte ver==1][point][frame][beat][init][int chsrc] +// [int ncolors][colors...][int drawmode] +// id -2 EffectList: [byte mode0|0x80][byte mode0][byte in][byte out] +// [byte extsize][ext ints while pos= 4) { + const v = r.int32() + if (r.pos > ext - 4) break + void v + } + const children: Effect[] = [] + while (r.remaining > 8) { + const id = r.int32() + let apeId: string | null = null + if (id >= 0x4000) apeId = latin1(r.bytes(32)).split('\0')[0] + const len = r.int32() + if (len < 0 || len > r.remaining) break + const childBlob = r.bytes(len) + // special case: the v2.81+ codeable EffectList's own init/frame code + // section, stored as a child entry with the Effect List APE id. + if (id >= 0x4000 && apeId === 'AVS 2.8+ Effect List Config') { + const cr = new Reader(childBlob) + if (cr.remaining >= 4) cr.int32() // use_code + const gv = { init: cr.lpString(), frame: cr.lpString(), beat: '' } + if (gv.init.trim() || gv.frame.trim()) { + children.push({ id, apeId, kind: 'globalvars', enabled: true, gv }) + } + continue + } + children.push(parseEffect(id, apeId, childBlob)) + } + return { enabled, children } +} + +function parseEffect(id: number, apeId: string | null, blob: Uint8Array): Effect { + const base = { id, apeId, enabled: true } as Effect + if (id === ID_SUPERSCOPE) { + const r = new Reader(blob) + const code = { init: '', frame: '', beat: '', point: '' } + let spectrumSource = false + let drawMode = 1 + const colors: number[] = [] + const ver = r.byte() + if (ver === 1) { + code.point = r.lpString() + code.frame = r.lpString() + code.beat = r.lpString() + code.init = r.lpString() + } else { + // ancient fixed 1024-byte block + if (blob.length >= 1025) { + const buf = latin1(blob.subarray(1, 1025)) + code.point = buf.slice(0, 256).split('\0')[0] + code.frame = buf.slice(256, 512).split('\0')[0] + code.beat = buf.slice(512, 768).split('\0')[0] + code.init = buf.slice(768, 1024).split('\0')[0] + } + } + if (r.remaining >= 4) { + const chsrc = r.int32() + spectrumSource = (chsrc & 0b100) !== 0 + if (r.remaining >= 4) { + const ncolors = r.int32() + if (ncolors <= 16) { + for (let i = 0; i < ncolors && r.remaining >= 4; i++) colors.push(r.int32() >>> 0) + } + if (r.remaining >= 4) drawMode = r.int32() + } + } + return { ...base, kind: 'superscope', code, spectrumSource, drawMode, colors } + } + if (id >= 0x4000 && apeId === APE_TEXER2) { + const r = new Reader(blob) + r.int32() // version + r.bytes(260) // image path + r.int32() // resize + r.int32() // wrap + r.int32() // colorize + r.int32() // unused + const code = { init: r.lpString(), frame: r.lpString(), beat: r.lpString(), point: r.lpString() } + return { ...base, kind: 'texer2', code, spectrumSource: false, drawMode: 0, colors: [] } + } + if (id === ID_EFFECTLIST || (id >= 0x4000 && apeId === 'AVS 2.8+ Effect List Config')) { + const { enabled, children } = parseEffectListBody(blob) + return { ...base, kind: 'effectlist', enabled, children } + } + if (id >= 0x4000 && apeId === APE_EELTRANS) { + const r = new Reader(blob) + if (r.remaining >= 16) { + r.int32(); r.int32(); r.int32(); r.int32() + return { ...base, kind: 'eeltrans', transCode: r.ntRest() } + } + return { ...base, kind: 'other' } + } + if (id >= 0x4000 && apeId === APE_GLOBALVARS) { + const r = new Reader(blob) + if (r.remaining >= 28) { + r.int32() // load time + r.bytes(24) // unused + const gv = { init: ntAt(r), frame: ntAt(r), beat: ntAt(r) } + return { ...base, kind: 'globalvars', gv } + } + return { ...base, kind: 'other' } + } + if (id === ID_COMMENT) { + const r = new Reader(blob) + return { ...base, kind: 'comment', comment: r.lpString() } + } + return { ...base, kind: 'other' } +} + +function ntAt(r: Reader): string { + // null-terminated string starting at reader position (within the blob) + const start = r.pos + const d = r.data + let end = start + while (end < d.length && d[end] !== 0) end++ + r.pos = Math.min(end + 1, d.length) + return latin1(d.subarray(start, end)) +} + +function parseAvsFile(path: string): Effect[] { + const data = new Uint8Array(readFileSync(path)) + const magic = 'Nullsoft AVS Preset 0.2\x1a' + const head = latin1(data.subarray(0, magic.length)) + if (head !== magic) throw new Error(`bad magic: ${JSON.stringify(head.slice(0, 30))}`) + const r = new Reader(data.subarray(magic.length)) + r.byte() // clear flag + const effects: Effect[] = [] + while (r.remaining > 8) { + const id = r.int32() + let apeId: string | null = null + if (id >= 0x4000) apeId = latin1(r.bytes(32)).split('\0')[0] + const len = r.int32() + if (len < 0 || len > r.remaining) break + effects.push(parseEffect(id, apeId, r.bytes(len))) + } + return effects +} + +// --------------------------------------------------------------------------- +// AVSTrans #define macro preprocessor +// --------------------------------------------------------------------------- + +interface Macro { + name: string + params: string[] | null // null = object-like + body: string +} + +/** AVSTrans built-in constants (available even without an AVSTrans module). */ +const AVSTRANS_BUILTINS: Macro[] = [ + { name: '$pi', params: null, body: '3.14159265358979' }, + { name: '$twopi', params: null, body: '6.28318530717959' }, + { name: '$e', params: null, body: '2.71828182845905' }, + { name: '$phi', params: null, body: '1.61803398874989' }, +] + +function extractDefines(sources: string[]): { macros: Macro[]; failNote: string | null } { + const macros: Macro[] = [] + let failNote: string | null = null + const defineRe = /^[ \t]*#define\s+(.+)$/gm + for (const src of sources) { + if (!src.includes('#define')) continue + // join backslash line-continuations first + const joined = src.replace(/\\\r?\n/g, ' ') + const matches = joined.match(defineRe) ?? [] + for (const m of matches) { + const rest = m.replace(/^[ \t]*#define\s+/, '').trim() + const fn = rest.match(/^([A-Za-z0-9_$]+)\s*\(([^)]*)\)\s*([\s\S]*)$/) + if (fn) { + const params = fn[2].split(',').map((p) => p.trim()).filter(Boolean) + macros.push({ name: fn[1], params, body: fn[3] }) + } else { + const obj = rest.match(/^([A-Za-z0-9_$]+)\s+([\s\S]*)$/) + if (obj) macros.push({ name: obj[1], params: null, body: obj[2] }) + else failNote = 'unparsed #define' + } + } + } + // user defines override the AVSTrans built-ins + const byName = new Map(macros.map((m) => [m.name, m])) + for (const b of AVSTRANS_BUILTINS) if (!byName.has(b.name)) macros.push(b) + return { macros, failNote } +} + +/** Split a macro CALL starting at `openPos` (must be '('). */ +function readCallArgs(src: string, openPos: number): { args: string[]; end: number } | null { + if (src[openPos] !== '(') return null + let depth = 0 + let start = openPos + 1 + const args: string[] = [] + for (let i = openPos; i < src.length; i++) { + const c = src[i] + if (c === '(') depth++ + else if (c === ')') { + depth-- + if (depth === 0) { + args.push(src.slice(start, i)) + return { args, end: i + 1 } + } + } else if (c === ',' && depth === 1) { + args.push(src.slice(start, i)) + start = i + 1 + } + } + return null +} + +function applyMacros(code: string, macros: Macro[], depth = 0): string { + if (depth > 24 || !macros.length) return code + let out = code + let changed = false + for (const macro of macros) { + const re = new RegExp(`(^|[^A-Za-z0-9_$])${escapeRe(macro.name)}($|[^A-Za-z0-9_(]|\\()`, 'g') + let result = '' + let last = 0 + let m: RegExpExecArray | null + let macroChanged = false + while ((m = re.exec(out))) { + const at = m.index + m[1].length + // skip #define lines themselves + const lineStart = out.lastIndexOf('\n', at) + 1 + const lineHead = out.slice(lineStart, at).trimStart() + if (lineHead.startsWith('#')) continue + if (macro.params) { + const call = readCallArgs(out, at + macro.name.length) + if (!call || call.args.length !== macro.params.length) continue + let body = macro.body + // token-concat ##param## first, then plain params + for (let i = 0; i < macro.params.length; i++) { + body = body.split(`##${macro.params[i]}##`).join(call.args[i].trim()) + } + for (let i = 0; i < macro.params.length; i++) { + body = body.replace(new RegExp(`(^|[^A-Za-z0-9_$])${escapeRe(macro.params[i])}($|[^A-Za-z0-9_])`, 'g'), + (_s, pre, post) => `${pre}(${call.args[i].trim()})${post}`) + } + result += out.slice(last, at) + `(${body})` + last = call.end + } else { + result += out.slice(last, at) + `(${macro.body})` + last = at + macro.name.length + } + macroChanged = true + re.lastIndex = last + } + if (macroChanged) { + result += out.slice(last) + out = result + changed = true + } + } + if (changed) return applyMacros(out, macros, depth + 1) + return out +} + +function escapeRe(s: string): string { + return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') +} + +function stripDirectives(code: string): string { + return code + .split('\n') + .filter((l) => !/^\s*#/.test(l)) + .join('\n') +} + +// --------------------------------------------------------------------------- +// code translation +// --------------------------------------------------------------------------- + +function translateCode(code: string, spectrumSource: boolean): string { + let out = code + // linesize -> size (AVS per-point line width) + out = out.replace(/\blinesize\b/g, 'size') + // AVS rand(n) returns an integer 0..n-1 — our deterministic rand(seed) differs + out = out.replace(/\brand\b/g, 'rnd') + // spectrum-source scopes: v should read the spectrum (AVS: byte/128-1) + if (spectrumSource) out = out.replace(/\bv\b/g, '(sv*2-1)') + return out +} + +function assignsVar(code: string, name: string): boolean { + return new RegExp(`(^|[^A-Za-z0-9_])${name}\\s*=[^=]`).test(code) +} + +// --------------------------------------------------------------------------- +// candidate collection +// --------------------------------------------------------------------------- + +interface Candidates { + scopes: Array + eeltrans: string[] + gv: Array<{ init: string; frame: string; beat: string }> + comment: string | null + otherKinds: Set +} + +function collect(effects: Effect[], into: Candidates): void { + for (const e of effects) { + if (!e.enabled) continue + switch (e.kind) { + case 'superscope': + case 'texer2': + into.scopes.push(e as Effect & { kind: 'superscope' | 'texer2' }) + break + case 'eeltrans': + if (e.transCode) into.eeltrans.push(e.transCode) + break + case 'globalvars': + if (e.gv) into.gv.push(e.gv) + break + case 'comment': + if (!into.comment && e.comment) into.comment = e.comment + break + case 'effectlist': + if (e.children) collect(e.children, into) + break + default: + into.otherKinds.add(describeEffect(e)) + } + } +} + +const BUILTIN_NAMES: Record = { + 0: 'Simple', 1: 'DotPlane', 2: 'OscilloscopeStar', 3: 'Fadeout', 4: 'BlitterFeedback', + 5: 'OnBeatClear', 6: 'Blur', 7: 'BassSpin', 8: 'MovingParticle', 9: 'RotoBlitter', 10: 'SVP', + 11: 'Colorfade', 12: 'ColorClip', 13: 'RotStar', 14: 'Ring', 15: 'Movement', 16: 'Scatter', + 17: 'DotGrid', 18: 'BufferSave', 19: 'DotFountain', 20: 'Water', 22: 'Brightness', 23: 'Interleave', + 24: 'Grain', 25: 'ClearScreen', 26: 'Mirror', 27: 'Starfield', 29: 'Bump', 30: 'Mosaic', + 31: 'WaterBump', 32: 'Video', 33: 'CustomBPM', 34: 'Picture', 35: 'DynamicDistanceModifier', + 37: 'Invert', 38: 'UniqueTone', 39: 'Timescope', 40: 'SetRenderMode', 41: 'Interferences', + 42: 'DynamicShift', 43: 'DynamicMovement', 44: 'FastBright', 45: 'ColorModifier', +} + +function describeEffect(e: Effect): string { + if (e.apeId) return e.apeId + return BUILTIN_NAMES[e.id] ?? `effect#${e.id}` +} + +// --------------------------------------------------------------------------- +// fallback templates (for presets whose visuals are movement/APE driven) +// --------------------------------------------------------------------------- + +function fallbackTemplate(seed: number, name: string): { content: string; style: string } { + const styles = [ + { + style: 'pulse rings', + mode: 'lines', + content: `name: ${JSON.stringify(name)} +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) +`, + }, + { + style: 'tunnel', + mode: 'lines', + content: `name: ${JSON.stringify(name)} +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) +`, + }, + { + style: 'starfield', + mode: 'dots', + content: `name: ${JSON.stringify(name)} +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) +`, + }, + { + style: 'lattice', + mode: 'dots', + content: `name: ${JSON.stringify(name)} +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 +`, + }, + { + style: 'swirl', + mode: 'lines', + content: `name: ${JSON.stringify(name)} +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) +`, + }, + { + style: 'kaleido', + mode: 'lines', + content: `name: ${JSON.stringify(name)} +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) +`, + }, + ] + return styles[seed % styles.length] +} + +// --------------------------------------------------------------------------- +// smoke test — runs the generated script headlessly through the real engine env +// --------------------------------------------------------------------------- + +function smokeTest(content: string): { ok: boolean; error?: string; n: number; ms: number } { + const t0 = Date.now() + const v = validateScript(content) + if (!v.ok || !v.script) return { ok: false, error: v.error ? `${v.error.section} line ${v.error.line}: ${v.error.message}` : 'parse failed', n: 0, ms: 0 } + resetEelBuffers() + AVA_HOOKS.spectrumAt = (p) => 0.25 + 0.25 * Math.sin(p * 18 + 1) + AVA_HOOKS.waveAt = (p) => Math.sin(p * 12.56) * 0.8 + const env: Record = { n: 400, t: 0, time: 0, frame: 0 } + const script = v.script + try { + script.initProg?.exec(env) + } catch (err) { + return { ok: false, error: `init: ${String(err)}`, n: 0, ms: Date.now() - t0 } + } + const n = Math.min(512, Math.max(4, Math.round(env.n ?? 400))) + let nan = 0 + try { + for (let f = 0; f < 36; f++) { + env.dt = 1 / 60 + env.time = (f + 1) / 60 + env.frame = f + 1 + AVA_HOOKS.now = () => env.time ?? 0 + env.beat = f % 15 === 0 ? 1 : 0 + env.bass = 0.3 + 0.3 * Math.sin(f * 0.4) + env.mid = 0.3 + env.treb = 0.25 + env.bass_att = env.bass + env.mid_att = 0.3 + env.treb_att = 0.25 + env.vol = 0.4 + env.vol_att = 0.4 + env.w = 1280 + env.h = 720 + env.aspect = 1280 / 720 + script.frameProg?.exec(env) + if (env.beat) script.beatProg?.exec(env) + for (let k = 0; k < n; k++) { + env.i = k / (n - 1 || 1) + env.v = AVA_HOOKS.waveAt(env.i) + env.sv = AVA_HOOKS.spectrumAt(env.i) + env.x = 0; env.y = 0; env.red = 1; env.green = 1; env.blue = 1; env.skip = 0; env.size = 2; env.alpha = 1 + script.pointProg?.exec(env) + if (!Number.isFinite(env.x) || !Number.isFinite(env.y)) nan++ + } + } + } catch (err) { + return { ok: false, error: `runtime: ${String(err)}`, n, ms: Date.now() - t0 } + } + const ms = Date.now() - t0 + // some presets deliberately NaN points (skip via NaN) — allow up to 40% + if (nan > n * 36 * 0.4) return { ok: false, error: `${nan} NaN points of ${n * 36}`, n, ms } + return { ok: true, n, ms } +} + +// --------------------------------------------------------------------------- +// name / author extraction +// --------------------------------------------------------------------------- + +function extractNameAuthor(filename: string): { name: string; author: string } { + let base = filename.replace(/\.avs$/i, '') + base = base.replace(/^\d{1,2}\s+/, '') // "01 dynamic duo - ..." numbering + // "Author - Name" (spaces around dash) + const spaced = base.match(/^(.+?)\s+-\s+(.+)$/) + if (spaced) return { author: spaced[1].trim(), name: spaced[2].trim() } + // "Author-Name" (no spaces — e.g. "zxe-Urantia", "Degnic-Adrealine rush") + const tight = base.match(/^([A-Za-z0-9_&']+)-([A-Za-z].+)$/) + if (tight) return { author: tight[1].trim(), name: tight[2].trim() } + return { author: '', name: base } +} + +function hashStr(s: string): number { + let h = 2166136261 + for (let i = 0; i < s.length; i++) { + h ^= s.charCodeAt(i) + h = Math.imul(h, 16777619) + } + return Math.abs(h) +} + +// --------------------------------------------------------------------------- +// the converter +// --------------------------------------------------------------------------- + +export { parseAvsFile, collect, applyMacros, extractDefines, translateCode, smokeTest, extractNameAuthor, fallbackTemplate, convertOne } +export type { Effect, Candidates, OutputPreset, Macro } + +interface OutputPreset { + folder: string + name: string + author: string + description: string + originalFile: string + content: string +} + +function convertOne(file: string, relDir: string, absPath: string): { preset: OutputPreset; status: 'ported' | 'fallback'; note: string } { + const { name, author } = extractNameAuthor(file) + const effects = parseAvsFile(absPath) + const cands: Candidates = { scopes: [], eeltrans: [], gv: [], comment: null, otherKinds: new Set() } + collect(effects, cands) + + const folder = 'root/embedded/' + relDir + const originalFile = `/avs-originals/embedded/${relDir}/${file}` + const desc = (extra: string): string => { + const by = author ? ` by ${author}` : '' + const src = `Auto-ported from the Winamp AVS preset "${file}"${by}.` + return extra ? `${src} ${extra}` : src + } + + const makeFallback = (reason: string) => { + const tpl = fallbackTemplate(hashStr(name), name) + return { + preset: { + folder, + name, + author, + description: desc(`The original's visuals are driven by ${reason}, which the AVA script engine does not support — this is a generated stand-in that keeps the beat & band reactivity.`), + originalFile, + content: tpl.content, + }, + status: 'fallback' as const, + note: `${reason} → ${tpl.style} stand-in`, + } + } + + // pick the richest point program + const scored = cands.scopes + .map((s) => ({ s, score: (s.code?.point.length ?? 0) + (s.code?.frame.length ?? 0) * 0.3 })) + .sort((a, b) => b.score - a.score) + if (!scored.length || (scored[0].s.code?.point.length ?? 0) < 12) { + const reason = cands.otherKinds.size + ? Array.from(cands.otherKinds).slice(0, 3).join(', ') + : 'no codeable scope' + return makeFallback(reason) + } + const scope = scored[0].s + const code = scope.code! + + // reject trivial scopes (e.g. a 2-point checker) — they are not the real + // visual. If init pins a tiny literal n and the frame code never sets n, + // the preset's meat is elsewhere (movements / APEs). + const initNLit = code.init.match(/(^|[^A-Za-z0-9_])n\s*=\s*([0-9.]+)\s*;/) + const frameSetsN = assignsVar(code.frame, 'n') + if (initNLit && !frameSetsN && parseFloat(initNLit[2]) < 8) { + return makeFallback('a trivial scope (the real work is movement/APE driven)') + } + + // macro preprocessing (AVSTrans defines + local defines) + const macroSources = [...cands.eeltrans, code.init, code.frame, code.beat, code.point] + const { macros } = extractDefines(macroSources) + let init = code.init + let frame = code.frame + let beat = code.beat + let point = code.point + let gvNote = '' + if (macros.length) { + init = applyMacros(init, macros) + frame = applyMacros(frame, macros) + beat = applyMacros(beat, macros) + point = applyMacros(point, macros) + } + // merge Jheriko Global register-setters as a preamble (sets reg00=dt etc.) + if (cands.gv.length) { + const gv = cands.gv[0] + const gvi = stripDirectives(applyMacros(gv.init, macros)) + const gvf = stripDirectives(applyMacros(gv.frame, macros)) + const gvb = stripDirectives(applyMacros(gv.beat, macros)) + if (gvi.trim()) init = `${gvi}\n${init}` + if (gvf.trim()) frame = `${gvf}\n${frame}` + if (gvb.trim()) beat = `${gvb}\n${beat}` + gvNote = ' + global register code' + } + init = stripDirectives(init) + frame = stripDirectives(frame) + beat = stripDirectives(beat) + point = stripDirectives(point) + + // token rewrites + const spectrum = scope.spectrumSource === true + init = translateCode(init, spectrum) + frame = translateCode(frame, spectrum) + beat = translateCode(beat, spectrum) + point = translateCode(point, spectrum) + + // AVS `t` is auto-advancing time — if the code never assigns t, map reads to `time` + const allCode = `${init}\n${frame}\n${beat}\n${point}` + if (!assignsVar(allCode, 't')) { + init = init.replace(/\bt\b/g, 'time') + frame = frame.replace(/\bt\b/g, 'time') + beat = beat.replace(/\bt\b/g, 'time') + point = point.replace(/\bt\b/g, 'time') + } + + // default n if never set + if (!assignsVar(allCode, 'n')) init = `n = 400\n${init}` + + // color cycling fallback when the point code never sets colors + const setsColors = assignsVar(point, 'red') || assignsVar(point, 'green') || assignsVar(point, 'blue') + let colorFrame = '' + let colorPoint = '' + if (!setsColors && scope.colors && scope.colors.length) { + const cols = scope.colors.map((c) => ({ + r: ((c >> 16) & 255) / 255, + g: ((c >> 8) & 255) / 255, + b: (c & 255) / 255, + })) + const gen = cols + .map((c, i) => `if(avsi==${i}, avsr=${c.r.toFixed(3)}; avsg=${c.g.toFixed(3)}; avsb=${c.b.toFixed(3)};)`) + .join('\n') + colorFrame = `avsc = avsc + 1;\navsp = avsc % ${cols.length * 64};\navsi = floor(avsp / 64);\navsf = (avsp % 64) / 64;\n${gen}` + const c1 = cols[0] + colorFrame += `\nif(avsi == ${cols.length - 1}, avsr2=${c1.r.toFixed(3)}; avsg2=${c1.g.toFixed(3)}; avsb2=${c1.b.toFixed(3)};)` + for (let i = 0; i < cols.length - 1; i++) { + colorFrame += `\nif(avsi == ${i}, avsr2=${cols[i + 1].r.toFixed(3)}; avsg2=${cols[i + 1].g.toFixed(3)}; avsb2=${cols[i + 1].b.toFixed(3)};)` + } + colorFrame += `\navsr = avsr * (1 - avsf) + avsr2 * avsf;\navsg = avsg * (1 - avsf) + avsg2 * avsf;\navsb = avsb * (1 - avsf) + avsb2 * avsf;` + colorPoint = 'red = avsr;\ngreen = avsg;\nblue = avsb;' + } else if (!setsColors) { + colorFrame = 'avsh = avsh + dt * 0.15;' + colorPoint = 'red = 0.55 + 0.45 * sin(avsh * 6.28318);\ngreen = 0.55 + 0.45 * sin(avsh * 6.28318 + 2.09);\nblue = 0.55 + 0.45 * sin(avsh * 6.28318 + 4.19);' + } + + const mode = scope.kind === 'texer2' ? 'dots' : scope.drawMode === 0 ? 'dots' : 'lines' + const linewidth = mode === 'dots' ? 3 : 2 + + const content = `# Auto-ported from "${file}" (Winamp AVS${author ? ` / ${author}` : ''}) +# ${scope.kind === 'texer2' ? 'Texer II' : 'SuperScope'} point program${gvNote}${spectrum ? ', spectrum source' : ''}${macros.length ? `, ${macros.length} AVSTrans macros expanded` : ''}. +name: ${JSON.stringify(name)} +author: ${JSON.stringify(author)} +mode: ${mode} +blend: additive +persist: ${mode === 'dots' ? 0.78 : 0.88} +linewidth: ${linewidth} +ysign: -1 + +[init] +${init.trim() || 'n = 400'} + +[frame] +${[frame.trim(), colorFrame].filter(Boolean).join('\n')} + +[beat] +${beat.trim() || 'flash = 1'} + +[point] +${[point.trim(), colorPoint].filter(Boolean).join('\n')} +` + + const smoke = smokeTest(content) + if (!smoke.ok) { + return makeFallback(`unportable scope code (${smoke.error})`) + } + const perf = smoke.ms > 900 ? ' (heavy script — point count clamped)' : '' + if (smoke.ms > 900) { + // clamp n for heavy scripts so the browser keeps 60fps + const patched = content.replace(/\[init\]\n/, `[init]\nn = if(above(n, 2048), 2048, n)\n`) + const recheck = smokeTest(patched) + if (recheck.ok) { + return { + preset: { folder, name, author, description: desc(`Original ${scope.kind} code, machine-translated to the AVA script dialect.${perf}`), originalFile, content: patched }, + status: 'ported', + note: `ok (n clamped, ${smoke.ms}ms → ${recheck.ms}ms)`, + } + } + } + return { + preset: { folder, name, author, description: desc(`Original ${scope.kind} code, machine-translated to the AVA script dialect.`), originalFile, content }, + status: 'ported', + note: `ok (${smoke.ms}ms, n=${smoke.n})`, + } +} + +// --------------------------------------------------------------------------- +// main +// --------------------------------------------------------------------------- + +const inputRoot = process.argv[2] ?? '/tmp/avsdrive/raw' +const outDir = 'tools/converted' +const originalsDir = 'public/avs-originals/embedded' + +const SKIP_FOLDERS = new Set(['Synth-C']) // hand-adapted versions ship in BUILTIN_PRESETS + +function walk(dir: string): string[] { + const out: string[] = [] + for (const entry of readdirSync(dir)) { + const p = join(dir, entry) + if (statSync(p).isDirectory()) { + if (SKIP_FOLDERS.has(entry)) continue + out.push(...walk(p)) + } else if (entry.toLowerCase().endsWith('.avs')) out.push(p) + } + return out +} + +const isMain = typeof process !== 'undefined' && process.argv[1] && process.argv[1].includes('convert-avs') +if (!isMain) { + // imported as a library — skip main +} else { +main() +} + +function main() { + +const files = walk(inputRoot).sort() +console.log(`converting ${files.length} .avs files from ${inputRoot}`) +const results: OutputPreset[] = [] +const report: Array<{ file: string; status: string; note: string }> = [] +let ported = 0 +let fallback = 0 + +for (const abs of files) { + const rel = relative(inputRoot, abs) + const relDir = dirname(rel) === '.' ? '' : dirname(rel) + const file = basename(rel) + try { + const r = convertOne(file, relDir, abs) + results.push(r.preset) + report.push({ file: rel, status: r.status, note: r.note }) + if (r.status === 'ported') ported++ + else fallback++ + console.log(`${r.status === 'ported' ? '✔' : '○'} ${rel} — ${r.note}`) + // keep a copy of the generated .ava for reference + const destAva = join(outDir, relDir, file.replace(/\.avs$/i, '.ava')) + mkdirSync(dirname(destAva), { recursive: true }) + writeFileSync(destAva, r.preset.content) + // copy the original binary + const destOrig = join(originalsDir, relDir, file) + mkdirSync(dirname(destOrig), { recursive: true }) + copyFileSync(abs, destOrig) + } catch (err) { + report.push({ file: rel, status: 'error', note: String(err) }) + fallback++ + console.log(`✘ ${rel} — ${String(err)}`) + } +} + +// emit the TS module +const seen = new Set() +for (const p of results) { + const key = `${p.folder}//${p.name}` + if (seen.has(key)) console.log(`!! duplicate name in folder: ${key}`) + seen.add(key) +} + +const tsHeader = `// AVA — embedded preset library (AUTO-GENERATED by tools/convert-avs.ts — do not edit) +// +// ${results.length} Winamp AVS presets from the user's Google Drive collection, +// auto-ported to the AVA script dialect by the converter. Ported presets run +// the original SuperScope / Texer II code (machine-translated); stand-in +// presets are generated visuals for originals that rely on effects the script +// engine does not support (movements, APEs). + +export interface EmbeddedPreset { + folder: string + name: string + author: string + description: string + originalFile?: string + content: string +} + +` + +const lines: string[] = [] +for (const p of results) { + lines.push(` {\n folder: ${JSON.stringify(p.folder)},\n name: ${JSON.stringify(p.name)},\n author: ${JSON.stringify(p.author)},\n description: ${JSON.stringify(p.description)},\n originalFile: ${JSON.stringify(p.originalFile)},\n content: ${JSON.stringify(p.content)},\n },`) +} +const ts = tsHeader + `export const EMBEDDED_LIBRARY: EmbeddedPreset[] = [\n${lines.join('\n')}\n]\n` +writeFileSync('src/lib/ava/embedded-presets.ts', ts) + +console.log(`\nDone: ${ported} ported, ${fallback} fallback, ${results.length} total`) +console.log(`→ src/lib/ava/embedded-presets.ts (${(ts.length / 1024).toFixed(0)} KB)`) +console.log(`→ ${originalsDir}/ (${results.length} .avs originals)`) +writeFileSync('tools/convert-report.json', JSON.stringify(report, null, 1)) +} diff --git a/tools/convert-report.json b/tools/convert-report.json new file mode 100644 index 0000000..7ff475e --- /dev/null +++ b/tools/convert-report.json @@ -0,0 +1,497 @@ +[ + { + "file": "root/embedded/Amp Picks/D&L - Life Is Violated.avs", + "status": "ported", + "note": "ok (25ms, n=512)" + }, + { + "file": "root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).avs", + "status": "fallback", + "note": "DynamicMovement, Movement, Invert → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/Degnic-Adrealine rush.avs", + "status": "fallback", + "note": "en03: Convolution Filter, Simple, Color Map → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/Duo - Alien Heart.avs", + "status": "fallback", + "note": "Fadeout, ClearScreen, MovingParticle → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/Duo - Brainstorm.avs", + "status": "fallback", + "note": "Invert, UniqueTone, Brightness → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).avs", + "status": "fallback", + "note": "DynamicMovement, Color Map, Invert → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/L1quid - Take the Veil.avs", + "status": "fallback", + "note": "unportable scope code (frame line 15: Unexpected character '$') → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/Nic01 - Rototronik.avs", + "status": "ported", + "note": "ok (54ms, n=512)" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - ...hidden track....avs", + "status": "fallback", + "note": "DynamicMovement, Color Map → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - A Tribute To Degnic.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.avs", + "status": "fallback", + "note": "BlitterFeedback, DynamicMovement, Movement → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Chinook.avs", + "status": "fallback", + "note": "ColorClip, ClearScreen, DynamicMovement → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.avs", + "status": "fallback", + "note": "Color Map → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.avs", + "status": "fallback", + "note": "effect#2176, DynamicMovement → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Kingish.avs", + "status": "fallback", + "note": "BlitterFeedback → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).avs", + "status": "fallback", + "note": "BlitterFeedback, \u0005, DotPlane → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Texering 002.avs", + "status": "ported", + "note": "ok (45ms, n=100)" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - Upward Current.avs", + "status": "fallback", + "note": "CustomBPM, DynamicMovement, Water → tunnel stand-in" + }, + { + "file": "root/embedded/Amp Picks/S_KuPeRS - female demands.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Aqua-fumes.avs", + "status": "fallback", + "note": "Holden03: Convolution Filter, Color Map, Bump → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).avs", + "status": "fallback", + "note": "Movement, DynamicMovement, Multiplier → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Different Load.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Electro blobs.avs", + "status": "fallback", + "note": "MovingParticle, Color Map, BlitterFeedback → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Kaleidofied.avs", + "status": "fallback", + "note": "Invert, Movement, Bump → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Magma Flow II.avs", + "status": "fallback", + "note": "Color Map, BufferSave, ClearScreen → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.avs", + "status": "fallback", + "note": "Movement, Color Map, BufferSave → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Odour Control.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Pina Colada.avs", + "status": "fallback", + "note": "Color Map → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.avs", + "status": "fallback", + "note": "effect#117, Color Map, Invert → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Solero Shots.avs", + "status": "fallback", + "note": "effect#28, FastBright, Movement → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Square Minded.avs", + "status": "fallback", + "note": "FastBright → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).avs", + "status": "fallback", + "note": "MovingParticle, Filter, Simple → tunnel stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Zero-G Maze.avs", + "status": "ported", + "note": "ok (9ms, n=50)" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Cartoon Trip.avs", + "status": "fallback", + "note": "DynamicMovement, FastBright, Color Reduction → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Containment.avs", + "status": "fallback", + "note": "unportable scope code (init line 12: Unexpected character '£') → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Cubic Flower.avs", + "status": "ported", + "note": "ok (8ms, n=40)" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Jello Cube.avs", + "status": "fallback", + "note": "Color Map → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Mercury.avs", + "status": "fallback", + "note": "Blur, DynamicMovement, FastBright → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Neon Coaster.avs", + "status": "fallback", + "note": "unportable scope code (beat line 18: Unexpected character '¤') → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Plankton.avs", + "status": "fallback", + "note": "DynamicMovement, FastBright → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Reflectocube.avs", + "status": "fallback", + "note": "Movement, DynamicMovement → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Speeder 3K.avs", + "status": "fallback", + "note": "unportable scope code (init line 12: Unexpected character '¤') → tunnel stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - TC Plasma.avs", + "status": "fallback", + "note": "CustomBPM, DynamicMovement, FastBright → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.avs", + "status": "fallback", + "note": "unportable scope code (init line 12: Unexpected character '¤') → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD - Zero-G Maze II.avs", + "status": "fallback", + "note": "DynamicMovement → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/UnConeD -Retrosquares.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/UnConeD -Zero-G Maze III.avs", + "status": "fallback", + "note": "BlitterFeedback, Movement, DynamicMovement → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/Yathosho - microcosm 02.avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/amphirion - nebulous (skupers remix).avs", + "status": "fallback", + "note": "Water, UniqueTone, Interleave → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → starfield stand-in" + }, + { + "file": "root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).avs", + "status": "ported", + "note": "ok (59ms, n=500)" + }, + { + "file": "root/embedded/Amp Picks/horse-fly - jinx (skupers remix).avs", + "status": "fallback", + "note": "ColorClip, Simple, Mosaic → tunnel stand-in" + }, + { + "file": "root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).avs", + "status": "fallback", + "note": "Interleave, DynamicMovement, effect#737 → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/justin - newpoop (for wa5).avs", + "status": "fallback", + "note": "ColorModifier → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).avs", + "status": "fallback", + "note": "DynamicDistanceModifier, ColorModifier → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Dragonscales.avs", + "status": "fallback", + "note": "CustomBPM, BufferSave, MovingParticle → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Encapsulade.avs", + "status": "fallback", + "note": "BufferSave, SetRenderMode, CustomBPM → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Freekwyrms.avs", + "status": "fallback", + "note": "BufferSave, SetRenderMode, MovingParticle → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Lilypod.avs", + "status": "fallback", + "note": "BufferSave, MovingParticle, 2.8+ Effect List Config → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Mist Wisps.avs", + "status": "fallback", + "note": "CustomBPM, BufferSave, MovingParticle → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.avs", + "status": "fallback", + "note": "CustomBPM, BufferSave, Fadeout → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Reverb - Deep Net.avs", + "status": "fallback", + "note": "CustomBPM, BufferSave, Fadeout → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Slyde - Tri.avs", + "status": "fallback", + "note": "BufferSave, SetRenderMode, MovingParticle → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Solar Flaire.avs", + "status": "fallback", + "note": "BufferSave, Fadeout, SetRenderMode → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Spintronics - Backspin.avs", + "status": "fallback", + "note": "2.8+ Effect List Config, Simple, SetRenderMode → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Starslappin.avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Street Art - Fire Inside.avs", + "status": "fallback", + "note": "BufferSave, Colorfade, Movement → swirl stand-in" + }, + { + "file": "root/embedded/Amp Picks/mig - Swoo - Slow.avs", + "status": "fallback", + "note": "CustomBPM, BufferSave, Movement → kaleido stand-in" + }, + { + "file": "root/embedded/Amp Picks/nixa - smell of music (skupers remix).avs", + "status": "fallback", + "note": "Mirror, DynamicMovement, Movement → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/p-k - bumpy.avs", + "status": "fallback", + "note": "CustomBPM, Color Map → pulse rings stand-in" + }, + { + "file": "root/embedded/Amp Picks/skupers - chinook (exclusive version).avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/splendora.avs", + "status": "fallback", + "note": "Grain, Simple, Movement → lattice stand-in" + }, + { + "file": "root/embedded/Amp Picks/yathosho - fabric (skupers remix).avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Amp Picks/zxe-Urantia.avs", + "status": "fallback", + "note": "effect#326, \u0001, UniqueTone → kaleido stand-in" + }, + { + "file": "root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → swirl stand-in" + }, + { + "file": "root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → tunnel stand-in" + }, + { + "file": "root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).avs", + "status": "ported", + "note": "ok (16ms, n=40)" + }, + { + "file": "root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).avs", + "status": "fallback", + "note": "unportable scope code (frame line 19: Expected ')' but found ';') → swirl stand-in" + }, + { + "file": "root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).avs", + "status": "ported", + "note": "ok (2ms, n=4)" + }, + { + "file": "root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → kaleido stand-in" + }, + { + "file": "root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → swirl stand-in" + }, + { + "file": "root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → pulse rings stand-in" + }, + { + "file": "root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).avs", + "status": "fallback", + "note": "unportable scope code (frame line 20: Expected ')' but found ';') → lattice stand-in" + }, + { + "file": "root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).avs", + "status": "ported", + "note": "ok (32ms, n=4)" + }, + { + "file": "root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).avs", + "status": "ported", + "note": "ok (4ms, n=50)" + }, + { + "file": "root/embedded/Envision/03 zamuz - waterburn (duo's icy hot mix).avs", + "status": "error", + "note": "Error: out of bytes" + }, + { + "file": "root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → lattice stand-in" + }, + { + "file": "root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).avs", + "status": "fallback", + "note": "unportable scope code (frame line 19: Expected ')' but found ';') → starfield stand-in" + }, + { + "file": "root/embedded/Envision/06 skupers - incantation (duo remix - edit).avs", + "status": "ported", + "note": "ok (8ms, n=4)" + }, + { + "file": "root/embedded/Envision/07 duo - miraculous flow (nemo remix).avs", + "status": "fallback", + "note": "UniqueTone, DynamicMovement, FastBright → swirl stand-in" + }, + { + "file": "root/embedded/Envision/08 duo - warm freeform (mykal remix).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → starfield stand-in" + }, + { + "file": "root/embedded/Envision/09 zxe - pleasure point (duo remix).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → pulse rings stand-in" + }, + { + "file": "root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → lattice stand-in" + }, + { + "file": "root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).avs", + "status": "fallback", + "note": "DynamicMovement, BufferSave, 2.8+ Effect List Config → lattice stand-in" + }, + { + "file": "root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).avs", + "status": "fallback", + "note": "unportable scope code (frame line 19: Expected ')' but found ';') → pulse rings stand-in" + }, + { + "file": "root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).avs", + "status": "ported", + "note": "ok (1ms, n=10)" + }, + { + "file": "root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).avs", + "status": "ported", + "note": "ok (4ms, n=15)" + }, + { + "file": "root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).avs", + "status": "ported", + "note": "ok (49ms, n=400)" + }, + { + "file": "root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).avs", + "status": "fallback", + "note": "a trivial scope (the real work is movement/APE driven) → swirl stand-in" + } +] \ No newline at end of file diff --git a/tools/converted/root/embedded/Amp Picks/D&L - Life Is Violated.ava b/tools/converted/root/embedded/Amp Picks/D&L - Life Is Violated.ava new file mode 100644 index 0000000..a3c33d8 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/D&L - Life Is Violated.ava @@ -0,0 +1,53 @@ +# Auto-ported from "D&L - Life Is Violated.avs" (Winamp AVS / D&L) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "Life Is Violated" +author: "D&L" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=800;xa=-0.5;ya=0.0;xb=-0.0;yb=0.75;c=200;f=0; +nxa=(rnd(100)-50)*.02;nya=(rnd(100)-50)*.02; +nxb=(rnd(100)-50)*.02;nyb=(rnd(100)-50)*.02; + +[frame] +f=f+1; +t=1-((cos((f*3.1415)/c)+1)*.5); +xa=((nxa-lxa)*t)+lxa; +ya=((nya-lya)*t)+lya; +xb=((nxb-lxb)*t)+lxb; +yb=((nyb-lyb)*t)+lyb; +ex=(xb-xa); +ey=(yb-ya); +d=sqrt(sqr(ex)+sqr(ey)); +r=atan(ey/ex)+(3.1415/2); +dv=d*2 + +[beat] +c=f; +f=0; +lxa=nxa; +lya=nya; +lxb=nxb; +lyb=nyb; +nxa=(rnd(100)-50)*.02; +nya=(rnd(100)-50)*.02; +nxb=(rnd(100)-50)*.02; +nyb=(rnd(100)-50)*.02 + +[point] +//primary render +x=(ex*i)+xa; +y=(ey*i)+ya; + +//volume offset +x=x+ ( cos(r) * v * dv); +y=y+ ( sin(r) * v * dv); + +//color values +red=i; +green=(1-i); +blue=abs(v*6); diff --git a/tools/converted/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).ava b/tools/converted/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).ava new file mode 100644 index 0000000..506130c --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Degnic - Retrowall (Yathosho's Supermicrocosm).ava @@ -0,0 +1,25 @@ +name: "Retrowall (Yathosho's Supermicrocosm)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Degnic-Adrealine rush.ava b/tools/converted/root/embedded/Amp Picks/Degnic-Adrealine rush.ava new file mode 100644 index 0000000..796f723 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Degnic-Adrealine rush.ava @@ -0,0 +1,25 @@ +name: "Adrealine rush" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Duo - Alien Heart.ava b/tools/converted/root/embedded/Amp Picks/Duo - Alien Heart.ava new file mode 100644 index 0000000..61b26e3 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Duo - Alien Heart.ava @@ -0,0 +1,29 @@ +name: "Alien Heart" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Duo - Brainstorm.ava b/tools/converted/root/embedded/Amp Picks/Duo - Brainstorm.ava new file mode 100644 index 0000000..b0364c1 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Duo - Brainstorm.ava @@ -0,0 +1,25 @@ +name: "Brainstorm" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).ava b/tools/converted/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).ava new file mode 100644 index 0000000..4058060 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/EL-VIS - Molecules (S_KuPeRS Remix).ava @@ -0,0 +1,25 @@ +name: "Molecules (S_KuPeRS Remix)" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/L1quid - Take the Veil.ava b/tools/converted/root/embedded/Amp Picks/L1quid - Take the Veil.ava new file mode 100644 index 0000000..0054f09 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/L1quid - Take the Veil.ava @@ -0,0 +1,29 @@ +name: "Take the Veil" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/Nic01 - Rototronik.ava b/tools/converted/root/embedded/Amp Picks/Nic01 - Rototronik.ava new file mode 100644 index 0000000..46d3e9e --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Nic01 - Rototronik.ava @@ -0,0 +1,39 @@ +# Auto-ported from "Nic01 - Rototronik.avs" (Winamp AVS / Nic01) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "Rototronik" +author: "Nic01" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +pi=acos(-1);n=1000; + +[frame] +rx=rx+rdx;ry=ry+rdy;rz=rz+rdz;xs=sin(rx);ys=sin(ry);zs=sin(rz);xc=cos(rx);yc=cos(ry);zc=cos(rz);t=t+0.1;p=0;p1=0.; + +[beat] +rdx=(getosc(0,0,0)*500-250)%250/2500;rdy=(getosc(0.05,0,0)*500-250)%250/2500;rdz=(getosc(0.1,0,0)*500-250)%250/2500; + +[point] +p=p+1; +p1=if(equal(p%20,1),p1+1,p1); +s=(1-equal(p%20,1)); +s1=1-s1; +x1=sin(i*pi*4)*s*s1; +y1=cos(i*pi*4)*s*s1; +x1=x1+getosc((p1%25)*0.04,0,0)*x1; +y1=y1+getosc((p1%25)*0.04,0,0)*y1; +z1=-below(p,500)*0.5+0.25; +c=(2-x1*x1-y1*y1); +; +y2=y1*xc-z1*xs;z2=y1*xs+z1*xc; +x2=z2*ys+x1*yc;z1=z2*yc-x1*ys; +x1=x2*zc-y2*zs;y1=y2*zc+x2*zs; +x=x1/(2+z1);y=y1/(2+z1); +red=c; +green=1-c; +c=equal(p,500)*10; +red=red-c;green=green-c; diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - ...hidden track....ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - ...hidden track....ava new file mode 100644 index 0000000..8fc37e1 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - ...hidden track....ava @@ -0,0 +1,25 @@ +name: "...hidden track..." +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.ava new file mode 100644 index 0000000..88f1aeb --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Arctic Rainbow.ava @@ -0,0 +1,29 @@ +name: "Arctic Rainbow" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Chinook.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Chinook.ava new file mode 100644 index 0000000..edeabd6 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Chinook.ava @@ -0,0 +1,29 @@ +name: "Chinook" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.ava new file mode 100644 index 0000000..053bacc --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Hexual Healing.ava @@ -0,0 +1,25 @@ +name: "Hexual Healing" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.ava new file mode 100644 index 0000000..4acce55 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Inverse Kinetics.ava @@ -0,0 +1,31 @@ +name: "Inverse Kinetics" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Kingish.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Kingish.ava new file mode 100644 index 0000000..a5ced2c --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Kingish.ava @@ -0,0 +1,25 @@ +name: "Kingish" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).ava new file mode 100644 index 0000000..8f9d0bc --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Spirit Realm (Degnic's Plasmoid RMX).ava @@ -0,0 +1,25 @@ +name: "Spirit Realm (Degnic's Plasmoid RMX)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Texering 002.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Texering 002.ava new file mode 100644 index 0000000..2a9972b --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Texering 002.ava @@ -0,0 +1,39 @@ +# Auto-ported from "S_KuPeRS - Texering 002.avs" (Winamp AVS / S_KuPeRS) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "Texering 002" +author: "S_KuPeRS" +mode: dots +blend: additive +persist: 0.78 +linewidth: 3 +ysign: -1 + +[init] +n=100;pi=acos(-1);rx=1.57;ry=1.57;rx=0;ry=0;rz=0;rxo=0;ryo=0;rzo=0;rxt=0;ryt=0;rzt=0; + +[frame] +redf=redf+redr;greenf=greenf+greenr;bluef=bluef+bluer;rx=rx+rxo;ry=ry+ryo;rz=rz+rzo;rzo=rzo*0.97;cx=cos(sin(rx));sx=sin(sin(rx));cy=cos(sin(ry));sy=sin(sin(ry));cz=cos(rz);sz=sin(rz); + +[beat] +redr=rnd(10)/100-0.05;greenr=rnd(10)/100-0.05;bluer=rnd(10)/100-0.05;rxo=getosc(0.5,0.02,0)/12;ryo=getosc(0.3,0.02,0)/12;rzo=getosc(0.7,0.02,0)/8; + +[point] +r=i*pi*2;r2=i*pi*99; +x1=sin(r-bluef*1.53+.0776)*cos(r2+greenf); +y1=cos(r+bluef); +z1=sin(r2+redf); + +x1d=x1*cz-y1*sz; +y1d=x1*sz+y1*cz; +y2d=y1d*cx-z1*sx; +z2d=y1d*sx+z1*cx; +x3d=x1d*cy-z2d*sy; +z3d=x1d*sy+z2d*cy; +zi=1/(z3d+3); +x=if(above(z3d+3,0.1),x3d*zi,x); +y=if(above(z3d+3,0.1),y2d*zi,y); + +alpha=if(below(z3d+2.4,0),0,1); +red=alpha*(1+sin(redf)/4-z3d/4)/7; +blue=alpha*(1+sin(bluef)/4-z3d)/20; +green=alpha*(1+sin(greenf)/3-z3d/2)/12; diff --git a/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Upward Current.ava b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Upward Current.ava new file mode 100644 index 0000000..181464e --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/S_KuPeRS - Upward Current.ava @@ -0,0 +1,25 @@ +name: "Upward Current" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.ava new file mode 100644 index 0000000..97d89b8 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Aqua-fumes.ava @@ -0,0 +1,25 @@ +name: "Aqua-fumes" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).ava new file mode 100644 index 0000000..e27f757 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Club Seizure (color enhanced mix).ava @@ -0,0 +1,25 @@ +name: "Club Seizure (color enhanced mix)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Electro blobs.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Electro blobs.ava new file mode 100644 index 0000000..3564940 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Electro blobs.ava @@ -0,0 +1,29 @@ +name: "Electro blobs" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Kaleidofied.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Kaleidofied.ava new file mode 100644 index 0000000..30a8415 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Kaleidofied.ava @@ -0,0 +1,29 @@ +name: "Kaleidofied" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Magma Flow II.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Magma Flow II.ava new file mode 100644 index 0000000..85f1bcd --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Magma Flow II.ava @@ -0,0 +1,25 @@ +name: "Magma Flow II" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.ava new file mode 100644 index 0000000..e811043 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Multiple Orgasms.ava @@ -0,0 +1,31 @@ +name: "Multiple Orgasms" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Pina Colada.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Pina Colada.ava new file mode 100644 index 0000000..ad0192f --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Pina Colada.ava @@ -0,0 +1,31 @@ +name: "Pina Colada" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.ava new file mode 100644 index 0000000..83637e4 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Scope in Spotlight II.ava @@ -0,0 +1,29 @@ +name: "Scope in Spotlight II" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Solero Shots.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Solero Shots.ava new file mode 100644 index 0000000..cb0acad --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Solero Shots.ava @@ -0,0 +1,25 @@ +name: "Solero Shots" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Square Minded.ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Square Minded.ava new file mode 100644 index 0000000..32d4f16 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Square Minded.ava @@ -0,0 +1,31 @@ +name: "Square Minded" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).ava b/tools/converted/root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).ava new file mode 100644 index 0000000..246423c --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/Tuggummi - Worm-O-Rama (Raz Remix).ava @@ -0,0 +1,25 @@ +name: "Worm-O-Rama (Raz Remix)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze.ava new file mode 100644 index 0000000..3baa8aa --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze.ava @@ -0,0 +1,24 @@ +# Auto-ported from "UnConeD - Zero-G Maze.avs" (Winamp AVS / UnConeD) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "Zero-G Maze" +author: "UnConeD" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=50;ro=0;go=2.0;bo=4.0 + +[frame] +t=t-0.05;aa=aa*0.7; + +[beat] +aa=0.0;ro=rnd(100)/100*6.28;go=rnd(100)/100*6.28;bo=rnd(100)/100*6.28 + +[point] +y=0;x=i*.5-.1; +red=sin(t+ro+i*2)*.5+.5; +green=sin(t+go+i*2)*.5+.5; +blue=sin(t+bo+i*2)*.5+.5; diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Cartoon Trip.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Cartoon Trip.ava new file mode 100644 index 0000000..5f1be74 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Cartoon Trip.ava @@ -0,0 +1,25 @@ +name: "Cartoon Trip" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Containment.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Containment.ava new file mode 100644 index 0000000..7212b88 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Containment.ava @@ -0,0 +1,29 @@ +name: "Containment" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Cubic Flower.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Cubic Flower.ava new file mode 100644 index 0000000..2688209 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Cubic Flower.ava @@ -0,0 +1,25 @@ +# Auto-ported from "UnConeD - Cubic Flower.avs" (Winamp AVS / UnConeD) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "Cubic Flower" +author: "UnConeD" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=40;ro=0;go=2.0;bo=4.0 + +[frame] +t=t-0.05;aa=aa*0.7; + +[beat] +aa=1;ro=rnd(100)/100*6.28;go=rnd(100)/100*6.28;bo=rnd(100)/100*6.28 + +[point] +x=i*.8-.4;y=0; +red=sin(t+ro+i*2)/2+.5+aa; +green=sin(t+go+i*2)/2+.5+aa; +blue=sin(t+bo+i*2)/2+.5+aa; +blue=blue+1-min(red+green+blue,1) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Jello Cube.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Jello Cube.ava new file mode 100644 index 0000000..34e8763 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Jello Cube.ava @@ -0,0 +1,29 @@ +name: "Jello Cube" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Mercury.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Mercury.ava new file mode 100644 index 0000000..bb8c189 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Mercury.ava @@ -0,0 +1,29 @@ +name: "Mercury" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Neon Coaster.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Neon Coaster.ava new file mode 100644 index 0000000..7b56665 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Neon Coaster.ava @@ -0,0 +1,25 @@ +name: "Neon Coaster" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Plankton.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Plankton.ava new file mode 100644 index 0000000..489387e --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Plankton.ava @@ -0,0 +1,25 @@ +name: "Plankton" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Reflectocube.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Reflectocube.ava new file mode 100644 index 0000000..d8fd3c8 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Reflectocube.ava @@ -0,0 +1,25 @@ +name: "Reflectocube" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Speeder 3K.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Speeder 3K.ava new file mode 100644 index 0000000..ee43f07 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Speeder 3K.ava @@ -0,0 +1,25 @@ +name: "Speeder 3K" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - TC Plasma.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - TC Plasma.ava new file mode 100644 index 0000000..7aea4cf --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - TC Plasma.ava @@ -0,0 +1,25 @@ +name: "TC Plasma" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.ava new file mode 100644 index 0000000..43877e6 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Tie Tunnel SSC.ava @@ -0,0 +1,29 @@ +name: "Tie Tunnel SSC" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.ava b/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.ava new file mode 100644 index 0000000..2f138d1 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD - Zero-G Maze II.ava @@ -0,0 +1,29 @@ +name: "Zero-G Maze II" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/UnConeD -Zero-G Maze III.ava b/tools/converted/root/embedded/Amp Picks/UnConeD -Zero-G Maze III.ava new file mode 100644 index 0000000..128aa3b --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/UnConeD -Zero-G Maze III.ava @@ -0,0 +1,25 @@ +name: "UnConeD -Zero-G Maze III" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).ava new file mode 100644 index 0000000..b5e4fae --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/amphirion - nebulous (skupers remix).ava @@ -0,0 +1,31 @@ +name: "nebulous (skupers remix)" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).ava new file mode 100644 index 0000000..f65bc7f --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/el-vis - soundscape III (skupers remix).ava @@ -0,0 +1,25 @@ +name: "soundscape III (skupers remix)" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).ava new file mode 100644 index 0000000..e9d3ca1 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/fck - checkers with metaballs (skupers remix).ava @@ -0,0 +1,28 @@ +# Auto-ported from "fck - checkers with metaballs (skupers remix).avs" (Winamp AVS / fck) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "checkers with metaballs (skupers remix)" +author: "fck" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=500;p=3.14159 + +[frame] +k=h/w*1.05;mxs=mxs+g;mys=mys+g2;mx=sin(mxs)*.8;my=sin(mys)*.8;t=t+.1 + +[beat] +g=getosc(.2,0,0)/3;g2=getosc(.8,0,0)/3 + +[point] +d=i/6+getosc(0,0,0)/5*i; +r=i*p*44; +x=(cos(r)*d+mx)*k; +y=sin(r)*d+my; +lig=sin(r)*above(sin(r),0)/2; +blue=(1-i)-lig; +green=blue; +red=sqrt(blue)*2-lig diff --git a/tools/converted/root/embedded/Amp Picks/horse-fly - jinx (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/horse-fly - jinx (skupers remix).ava new file mode 100644 index 0000000..6ea8341 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/horse-fly - jinx (skupers remix).ava @@ -0,0 +1,25 @@ +name: "jinx (skupers remix)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) diff --git a/tools/converted/root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).ava new file mode 100644 index 0000000..7ad6f26 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/jheriko - not quite a bendy tunnel (skupers remix).ava @@ -0,0 +1,29 @@ +name: "not quite a bendy tunnel (skupers remix)" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/justin - newpoop (for wa5).ava b/tools/converted/root/embedded/Amp Picks/justin - newpoop (for wa5).ava new file mode 100644 index 0000000..be432bd --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/justin - newpoop (for wa5).ava @@ -0,0 +1,25 @@ +name: "newpoop (for wa5)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).ava b/tools/converted/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).ava new file mode 100644 index 0000000..7596d34 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/justin - the landscape is killing me (wa5remix).ava @@ -0,0 +1,25 @@ +name: "the landscape is killing me (wa5remix)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Dragonscales.ava b/tools/converted/root/embedded/Amp Picks/mig - Dragonscales.ava new file mode 100644 index 0000000..e7010fd --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Dragonscales.ava @@ -0,0 +1,29 @@ +name: "Dragonscales" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/mig - Encapsulade.ava b/tools/converted/root/embedded/Amp Picks/mig - Encapsulade.ava new file mode 100644 index 0000000..4b546ba --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Encapsulade.ava @@ -0,0 +1,29 @@ +name: "Encapsulade" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Freekwyrms.ava b/tools/converted/root/embedded/Amp Picks/mig - Freekwyrms.ava new file mode 100644 index 0000000..a9e47cf --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Freekwyrms.ava @@ -0,0 +1,25 @@ +name: "Freekwyrms" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Lilypod.ava b/tools/converted/root/embedded/Amp Picks/mig - Lilypod.ava new file mode 100644 index 0000000..cc71b03 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Lilypod.ava @@ -0,0 +1,29 @@ +name: "Lilypod" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Mist Wisps.ava b/tools/converted/root/embedded/Amp Picks/mig - Mist Wisps.ava new file mode 100644 index 0000000..8c27cb5 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Mist Wisps.ava @@ -0,0 +1,29 @@ +name: "Mist Wisps" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.ava b/tools/converted/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.ava new file mode 100644 index 0000000..b8d7d4d --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Nebulating - Hypercolorspace.ava @@ -0,0 +1,25 @@ +name: "Nebulating - Hypercolorspace" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Reverb - Deep Net.ava b/tools/converted/root/embedded/Amp Picks/mig - Reverb - Deep Net.ava new file mode 100644 index 0000000..4289d51 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Reverb - Deep Net.ava @@ -0,0 +1,31 @@ +name: "Reverb - Deep Net" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Slyde - Tri.ava b/tools/converted/root/embedded/Amp Picks/mig - Slyde - Tri.ava new file mode 100644 index 0000000..ea6f45f --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Slyde - Tri.ava @@ -0,0 +1,25 @@ +name: "Slyde - Tri" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Solar Flaire.ava b/tools/converted/root/embedded/Amp Picks/mig - Solar Flaire.ava new file mode 100644 index 0000000..722939b --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Solar Flaire.ava @@ -0,0 +1,29 @@ +name: "Solar Flaire" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/mig - Spintronics - Backspin.ava b/tools/converted/root/embedded/Amp Picks/mig - Spintronics - Backspin.ava new file mode 100644 index 0000000..2982786 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Spintronics - Backspin.ava @@ -0,0 +1,31 @@ +name: "Spintronics - Backspin" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Starslappin.ava b/tools/converted/root/embedded/Amp Picks/mig - Starslappin.ava new file mode 100644 index 0000000..4505ebd --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Starslappin.ava @@ -0,0 +1,25 @@ +name: "Starslappin" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Street Art - Fire Inside.ava b/tools/converted/root/embedded/Amp Picks/mig - Street Art - Fire Inside.ava new file mode 100644 index 0000000..8817112 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Street Art - Fire Inside.ava @@ -0,0 +1,25 @@ +name: "Street Art - Fire Inside" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/mig - Swoo - Slow.ava b/tools/converted/root/embedded/Amp Picks/mig - Swoo - Slow.ava new file mode 100644 index 0000000..aa1025d --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/mig - Swoo - Slow.ava @@ -0,0 +1,31 @@ +name: "Swoo - Slow" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/nixa - smell of music (skupers remix).ava b/tools/converted/root/embedded/Amp Picks/nixa - smell of music (skupers remix).ava new file mode 100644 index 0000000..4fa500b --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/nixa - smell of music (skupers remix).ava @@ -0,0 +1,29 @@ +name: "smell of music (skupers remix)" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/p-k - bumpy.ava b/tools/converted/root/embedded/Amp Picks/p-k - bumpy.ava new file mode 100644 index 0000000..dc4bca5 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/p-k - bumpy.ava @@ -0,0 +1,29 @@ +name: "bumpy" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Amp Picks/splendora.ava b/tools/converted/root/embedded/Amp Picks/splendora.ava new file mode 100644 index 0000000..302aa51 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/splendora.ava @@ -0,0 +1,29 @@ +name: "splendora" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Amp Picks/zxe-Urantia.ava b/tools/converted/root/embedded/Amp Picks/zxe-Urantia.ava new file mode 100644 index 0000000..e40b3a5 --- /dev/null +++ b/tools/converted/root/embedded/Amp Picks/zxe-Urantia.ava @@ -0,0 +1,31 @@ +name: "Urantia" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).ava b/tools/converted/root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).ava new file mode 100644 index 0000000..0e8c9b0 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/01 dynamic duo - tentaclism (fake hboy rmx).ava @@ -0,0 +1,25 @@ +name: "tentaclism (fake hboy rmx)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).ava b/tools/converted/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).ava new file mode 100644 index 0000000..2952217 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/02 dynamic duo - tentaclism (sky of contempt mix by drew).ava @@ -0,0 +1,25 @@ +name: "tentaclism (sky of contempt mix by drew)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 900 + +[frame] +t = t + dt * (0.25 + bass_att * 1.5) +hue = hue + dt * 0.1 + +[point] +ring = floor(i * 24) +ri = frac(i * 24) +z = frac(ring / 24 + t) +rad = 0.06 + z * 0.9 +a = ri * 6.28318 + ring * 0.35 + sin(t * 0.7) * 2 +x = sin(a) * rad * (0.55 + sv * 0.9) / aspect +y = cos(a) * rad * (0.55 + sv * 0.9) +f = (1 - z) * (0.35 + bass * 0.65) +red = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4)) +green = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 2.09)) +blue = f * (0.45 + 0.55 * sin(hue * 6.28318 + z * 4 + 4.19)) diff --git a/tools/converted/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).ava b/tools/converted/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).ava new file mode 100644 index 0000000..a669506 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).ava @@ -0,0 +1,27 @@ +# Auto-ported from "03 dynamic duo - tentaclism (microdee's grandpa was a tentaclist).avs" (Winamp AVS / dynamic duo) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "tentaclism (microdee's grandpa was a tentaclist)" +author: "dynamic duo" +mode: dots +blend: additive +persist: 0.78 +linewidth: 3 +ysign: -1 + +[init] +n=40; ln1=1; ln=ln1+2; +cns=.6; chs2=200; chs1=35; mrab=rnd(10)/20; + +[frame] +t=t-0.05; pc=0; sw=-1; sm=sm+rnd(20)/200; +srm=.9*(srm+rnd(100)*.0004); +ssm=sin(sm)*srm+rnd(100)*.0003; + +[beat] +flash = 1 + +[point] +sw=sw*-1; +x=if(above(pc,ln),rnd(100)/50-1,rnd(100)/2000+.27+ssm);y=if(above(pc,ln),rnd(100)/50-1,sw); +red=rnd(100)/100; green=red; blue=red; pc=pc+1; +drawmode=below(pc,ln); skip=band(below(pc,ln),equal(sw,1)) diff --git a/tools/converted/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).ava b/tools/converted/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).ava new file mode 100644 index 0000000..73e471a --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/04 dynamic duo - tentaclism (cathode ray mix by onionring of doom).ava @@ -0,0 +1,25 @@ +name: "tentaclism (cathode ray mix by onionring of doom)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).ava b/tools/converted/root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).ava new file mode 100644 index 0000000..7982cd7 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/05 dynamic duo - chromatics (glowy mix by meaningless-existance).ava @@ -0,0 +1,24 @@ +# Auto-ported from "05 dynamic duo - chromatics (glowy mix by meaningless-existance).avs" (Winamp AVS / dynamic duo) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "chromatics (glowy mix by meaningless-existance)" +author: "dynamic duo" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=w;pi=acos(-1); + +[frame] +t=t-0.045;t2=t2-t2r;tm2=tm2*0.9+tm2c*0.1;tm=tm*0.9+tm2c*0.1; + +[beat] +tm2c=rnd(315)*0.04+1;tmc=rnd(315)*0.04+1;t2r=rnd(10)*0.01-0.05; + +[point] +x=i*2-1;y=-0.99; +red=sin(i*2*pi+t)*0.5+0.5;; +blue=sin(i*tm*2+t2)*0.5+0.5; +green=sin(i*tm2*2-t*0.33)*0.5+0.5; diff --git a/tools/converted/root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).ava b/tools/converted/root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).ava new file mode 100644 index 0000000..7459a92 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/06 dynamic duo - tentaclism (midas remix).ava @@ -0,0 +1,31 @@ +name: "tentaclism (midas remix)" +mode: lines +blend: additive +persist: 0.86 +linewidth: 1.8 + +[init] +n = 560 +segs = 8 + +[frame] +rot = rot + dt * (0.08 + mid_att * 0.5) +hue = hue + dt * (0.07 + treb * 0.08) + +[beat] +flash = 1 + +[point] +seg = floor(i * segs) +si = frac(i * segs) +a0 = si * 6.28318 / segs + rot +amp = 0.12 + sv * 0.55 + bass * 0.25 + flash * 0.05 +rad = 0.15 + amp * (0.4 + 0.6 * sin(a0 * 6 + time * 2)) +a = seg * 6.28318 / segs + a0 * if(below(seg % 2, 1), 1, -1) +x = sin(a) * rad / aspect +y = cos(a) * rad +lum = 0.35 + amp * 1.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + seg + 4.19)) +skip = if(above(si, 0.96), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).ava b/tools/converted/root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).ava new file mode 100644 index 0000000..8ac0c35 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/07 dynamic duo - tentaclism (raz remix - ugly edit).ava @@ -0,0 +1,25 @@ +name: "tentaclism (raz remix - ugly edit)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).ava b/tools/converted/root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).ava new file mode 100644 index 0000000..a6a2f6e --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/08 dynamic duo - tentaclism (the y.m.o. rework #1).ava @@ -0,0 +1,29 @@ +name: "tentaclism (the y.m.o. rework #1)" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).ava b/tools/converted/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).ava new file mode 100644 index 0000000..8f2db80 --- /dev/null +++ b/tools/converted/root/embedded/Dynamics/09 dynamic duo - tentaclism (kans of kansis mix by drew - edit).ava @@ -0,0 +1,29 @@ +name: "tentaclism (kans of kansis mix by drew - edit)" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).ava b/tools/converted/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).ava new file mode 100644 index 0000000..caceba4 --- /dev/null +++ b/tools/converted/root/embedded/Envision/01 amphirion - the pacifist (duo's underworld mix).ava @@ -0,0 +1,31 @@ +# Auto-ported from "01 amphirion - the pacifist (duo's underworld mix).avs" (Winamp AVS / amphirion) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "the pacifist (duo's underworld mix)" +author: "amphirion" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=2 + +[frame] +xt=1-xtd; +yt=1-ytd; + +[beat] +xtd=rnd(20)*.1; +ytd=rnd(20)*.1; +rd=rnd(20)*.1; +gd=rnd(20)*.1; +bd=rnd(20)*.1; + +[point] +x=i*.3+xt*.5-getosc(0,0.4,0)*.25; +y=yt*.5-getosc(0,0.2,0)*.25; +size=10*(w/h)*(1+getosc(0,0.2,0)); +red=.2+rd; +green=.5+gd; +blue=.2+bd; diff --git a/tools/converted/root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).ava b/tools/converted/root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).ava new file mode 100644 index 0000000..99590c3 --- /dev/null +++ b/tools/converted/root/embedded/Envision/02 duo - biofeedback (hboy's organic mix).ava @@ -0,0 +1,31 @@ +# Auto-ported from "02 duo - biofeedback (hboy's organic mix).avs" (Winamp AVS / duo) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "biofeedback (hboy's organic mix)" +author: "duo" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=50 + +[frame] +bg=sin(bt); +fr=fr+bt-(fr*.055); +pf=pf+.025; + +[beat] +bt=getspec(0,0,0)*.55; + +[point] +c=i*(3.14159265358979)*2; +x=cos(c); +y=c*sin(fr*.3)*cos(pf)*.1; +size=20+fr+v*20; + +col=cos(i*19); +red=col; +green=col; +blue=col; diff --git a/tools/converted/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).ava b/tools/converted/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).ava new file mode 100644 index 0000000..842ac57 --- /dev/null +++ b/tools/converted/root/embedded/Envision/04 zamuz - roll-on mojo (duo remix).ava @@ -0,0 +1,29 @@ +name: "roll-on mojo (duo remix)" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).ava b/tools/converted/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).ava new file mode 100644 index 0000000..e80c06f --- /dev/null +++ b/tools/converted/root/embedded/Envision/05 duo - cafe de duo (vanish's wicked jungle massive remix).ava @@ -0,0 +1,25 @@ +name: "cafe de duo (vanish's wicked jungle massive remix)" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Envision/06 skupers - incantation (duo remix - edit).ava b/tools/converted/root/embedded/Envision/06 skupers - incantation (duo remix - edit).ava new file mode 100644 index 0000000..af866ae --- /dev/null +++ b/tools/converted/root/embedded/Envision/06 skupers - incantation (duo remix - edit).ava @@ -0,0 +1,40 @@ +# Auto-ported from "06 skupers - incantation (duo remix - edit).avs" (Winamp AVS / skupers) +# Texer II point program, 4 AVSTrans macros expanded. +name: "incantation (duo remix - edit)" +author: "skupers" +mode: dots +blend: additive +persist: 0.78 +linewidth: 3 +ysign: -1 + +[init] +n=h;pi=acos(-1);xasp=min(h/w,1);yasp=min(w/h,1); + +[frame] +xm1=xm1+xm1r;ym1=ym1+ym1r;xm=sin(xm1)*0.4;ym=sin(ym1)*0.4;redf=redf+redr;greenf=greenf+greenr;bluef=bluef+bluer;rx=rx+rxo;ry=ry+ryo;rz=rz+rzo;rzo=rzo*0.97;cx=cos(sin(rx));sx=sin(sin(rx));cy=cos(sin(ry));sy=sin(sin(ry));cz=cos(rz);sz=sin(rz); + +[beat] +xm1r=getosc(0.2,0,0)/5;ym1r=getosc(0.3,0,0)/8;redr=rnd(10)/100-0.05;greenr=rnd(10)/100-0.05;bluer=rnd(10)/100-0.05;rxo=getosc(0.5,0.02,0)/15;ryo=getosc(0.3,0.02,0)/15;rzo=-abs(getosc(0.7,0.02,0)/4)-0.05; + +[point] +k=getspec(i*80*n%n/n,1/n,0); +r=i*pi*2;d=getspec(.3,0,1)+.25+k; +x1=cos(r*4)*d; +y1=sin(r)*d*cos(i*99); +z1=cos(r)*d*sin(i*99); + +x1d=x1*cz-y1*sz; +y1d=x1*sz+y1*cz; +y2d=y1d*cx-z1*sx; +z2d=y1d*sx+z1*cx; +x3d=x1d*cy-z2d*sy; +z3d=x1d*sy+z2d*cy; +zi=1/(z3d+3); +x=if(above(z3d+3,0.1),x3d*zi,x)*xasp-xm; +y=if(above(z3d+3,0.1),y2d*zi,y)*yasp-ym; + +alpha=if(below(z3d+2.4,0),0,1); +red=alpha*(1+k)/(3+sin(redf))*(1-z3d); +blue=alpha*k/(4+sin(bluef))*(1-z3d); +green=alpha*k/(3+sin(greenf))*(1-z3d); diff --git a/tools/converted/root/embedded/Envision/07 duo - miraculous flow (nemo remix).ava b/tools/converted/root/embedded/Envision/07 duo - miraculous flow (nemo remix).ava new file mode 100644 index 0000000..bd5cf33 --- /dev/null +++ b/tools/converted/root/embedded/Envision/07 duo - miraculous flow (nemo remix).ava @@ -0,0 +1,25 @@ +name: "miraculous flow (nemo remix)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/tools/converted/root/embedded/Envision/08 duo - warm freeform (mykal remix).ava b/tools/converted/root/embedded/Envision/08 duo - warm freeform (mykal remix).ava new file mode 100644 index 0000000..a0c141b --- /dev/null +++ b/tools/converted/root/embedded/Envision/08 duo - warm freeform (mykal remix).ava @@ -0,0 +1,25 @@ +name: "warm freeform (mykal remix)" +mode: dots +blend: additive +persist: 0.82 +linewidth: 2.5 + +[init] +n = 850 + +[frame] +travel = travel + dt * (0.2 + vol_att * 1.6) +hue = hue + dt * 0.05 + +[point] +a = rand(i * 7.3) * 6.28318 +z = frac(rand(i * 3.1 + 5) + travel * (0.5 + rand(i + 9) * 0.7)) +rad = z * z * 1.1 +x = sin(a) * rad / aspect +y = cos(a) * rad +tw = 0.4 + 0.6 * sin(z * 40 + time * 3) * (0.5 + treb) +red = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3)) +green = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 2.09)) +blue = tw * (0.5 + 0.5 * sin(hue * 6.28318 + i * 3 + 4.19)) +size = 1 + z * 3 * (0.5 + bass) +skip = if(above(z, 0.97), 1, 0) diff --git a/tools/converted/root/embedded/Envision/09 zxe - pleasure point (duo remix).ava b/tools/converted/root/embedded/Envision/09 zxe - pleasure point (duo remix).ava new file mode 100644 index 0000000..65316ff --- /dev/null +++ b/tools/converted/root/embedded/Envision/09 zxe - pleasure point (duo remix).ava @@ -0,0 +1,29 @@ +name: "pleasure point (duo remix)" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).ava b/tools/converted/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).ava new file mode 100644 index 0000000..6e31a7b --- /dev/null +++ b/tools/converted/root/embedded/Envision/10 zamuz - heart dynamics (duo's high dose mix).ava @@ -0,0 +1,29 @@ +name: "heart dynamics (duo's high dose mix)" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).ava b/tools/converted/root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).ava new file mode 100644 index 0000000..0a31d95 --- /dev/null +++ b/tools/converted/root/embedded/Envision/11 nemo - we build here (duo's building blocks remix).ava @@ -0,0 +1,29 @@ +name: "we build here (duo's building blocks remix)" +mode: dots +blend: additive +persist: 0.78 +linewidth: 2.5 + +[init] +cols = 36 +n = cols * cols + +[frame] +rot = rot + dt * (0.05 + mid * 0.4) +hue = hue + dt * (0.04 + treb * 0.1) + +[point] +cx = floor(i * cols) / (cols - 1) +cy = frac(i * cols) +h = sv * 0.35 +ux = (cx - 0.5) * 1.6 +uy = (cy - 0.5) * 1.6 +rx = ux * cos(rot) - uy * sin(rot) +ry = ux * sin(rot) + uy * cos(rot) +x = (rx / aspect) * (1 - h * 0.7) +y = ry * (1 - h * 0.7) +lum = 0.25 + h * 2.2 +red = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3)) +green = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 2.09)) +blue = lum * (0.6 + 0.4 * sin(hue * 6.28318 + cx * 3 + 4.19)) +size = 1.2 + h * 5 diff --git a/tools/converted/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).ava b/tools/converted/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).ava new file mode 100644 index 0000000..45292ed --- /dev/null +++ b/tools/converted/root/embedded/Envision/12 duo & vanish - wickedjunglesmassive (yathosho's cartographic re-rub).ava @@ -0,0 +1,29 @@ +name: "wickedjunglesmassive (yathosho's cartographic re-rub)" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 + +[init] +n = 720 + +[frame] +hue = hue + dt * (0.06 + mid * 0.2) +travel = travel + dt * (0.3 + bass_att * 1.4) + +[beat] +flash = 1 + +[point] +g = floor(i * 9) +gi = frac(i * 9) +ph = frac(rand(g * 5.1 + 1) + travel * (0.6 + rand(g + 17) * 0.8)) +a = gi * 6.28318 +rad = ph * (0.25 + bass * 0.6 + flash * 0.08) +x = sin(a) * rad / aspect +y = cos(a) * rad +fade = sin(ph * 3.14159) +red = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7)) +green = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 2.09)) +blue = fade * (0.3 + 0.7 * sin(hue * 6.28318 + g * 0.7 + 4.19)) +skip = if(above(ph, 0.95), 1, 0) diff --git a/tools/converted/root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).ava b/tools/converted/root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).ava new file mode 100644 index 0000000..4ea5fe0 --- /dev/null +++ b/tools/converted/root/embedded/Envision/13 skupers - why i love you (duo's pulsedriver remix).ava @@ -0,0 +1,25 @@ +# Auto-ported from "13 skupers - why i love you (duo's pulsedriver remix).avs" (Winamp AVS / skupers) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "why i love you (duo's pulsedriver remix)" +author: "skupers" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +n=10;pi=acos(-1); + +[frame] +t=t-t1;t1=t1*0.9+getspec(0.05,0,0)*0.1 + +[beat] +flash = 1 + +[point] +y=i*2.1-1.05;x=0; +col=i; +red=col; +green=col*.6; +blue=0; diff --git a/tools/converted/root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).ava b/tools/converted/root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).ava new file mode 100644 index 0000000..40d0a3c --- /dev/null +++ b/tools/converted/root/embedded/Envision/14 duo - conjuring sands (skupers remix - edit).ava @@ -0,0 +1,33 @@ +# Auto-ported from "14 duo - conjuring sands (skupers remix - edit).avs" (Winamp AVS / duo) +# Texer II point program, 4 AVSTrans macros expanded. +name: "conjuring sands (skupers remix - edit)" +author: "duo" +mode: dots +blend: additive +persist: 0.78 +linewidth: 3 +ysign: -1 + +[init] +n=15; + +[frame] +pfx=pfx+pbx; pfy=pfy+pby; pfz=pfz+pbz; xs=sin(pfx); xc=cos(pfx); ys=sin(pfy); yc=cos(pfy); zs=sin(pfz); zc=cos(pfz); + +[beat] +pbx=rnd(10)/70; pby=rnd(10)/70; pbz=rnd(10)/70; + +[point] +c=i*(3.14159265358979)*15; +x1=cos(c); +y1=i*2-1; +z1=sin(c); +x2=x1*xs-y1*xc; +y2=y1*xs+x1*xc; +z2=z1*ys-y2*yc; +x3=y2*ys+z1*yc; +y3=x2*zs-z2*zc; +z3=z2*zs+x2*zc+3.5; +x=x3/z3; +y=y3/z3; +red=v*3; green=v*3; blue=v*3; diff --git a/tools/converted/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).ava b/tools/converted/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).ava new file mode 100644 index 0000000..f61a6ce --- /dev/null +++ b/tools/converted/root/embedded/Envision/15 tuggummi - multiple overdose (duo remix).ava @@ -0,0 +1,28 @@ +# Auto-ported from "15 tuggummi - multiple overdose (duo remix).avs" (Winamp AVS / tuggummi) +# SuperScope point program, 4 AVSTrans macros expanded. +name: "multiple overdose (duo remix)" +author: "tuggummi" +mode: lines +blend: additive +persist: 0.88 +linewidth: 2 +ysign: -1 + +[init] +pi=acos(-1) ; t=acos(-1) + +[frame] +n=w*0.55+2 ; t=t+0.25 + +[beat] +flash = 1 + +[point] +s=bnot(s) ; +x=i*2-1 ; +y=s*0.25-0.225-v*.2 ; +c=sin(i*pi*2+t)*0.5+0.5 ; +red=c ; +blue=c ; +green=c; +size=3; diff --git a/tools/converted/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).ava b/tools/converted/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).ava new file mode 100644 index 0000000..39952f2 --- /dev/null +++ b/tools/converted/root/embedded/Envision/16 duo - warm freeform (ya-tho-sho treatment).ava @@ -0,0 +1,25 @@ +name: "warm freeform (ya-tho-sho treatment)" +mode: lines +blend: additive +persist: 0.9 +linewidth: 1.6 + +[init] +n = 1100 + +[frame] +t = t + dt * (0.3 + bass_att * 1.8) +hue = hue + dt * 0.08 + beat * 0.01 + +[point] +arm = floor(i * 5) +fa = frac(i * 5) +d = fa +ang = arm * 1.2566 + d * (1.4 + mid * 3) * 3.14159 + t +rad = (0.05 + d * d * 1.15) * (0.7 + bass * 0.5) +x = sin(ang) * rad / aspect +y = cos(ang) * rad +red = (0.3 + 0.7 * d) * (0.3 + bass) +green = (0.3 + 0.7 * d) * (0.25 + mid) +blue = (0.3 + 0.7 * d) * (0.2 + treb + hue * 0.2) +skip = if(below(fa, 0.04), 1, 0) diff --git a/worklog.md b/worklog.md index 577033f..504f75e 100755 --- a/worklog.md +++ b/worklog.md @@ -456,3 +456,275 @@ Stage Summary: (honest 422; works from residential IPs or with server-side cookies). SoundCloud/Bandcamp/ archive.org/direct files all resolve; SoundCloud serves HLS-only for some tracks → clean adaptive-stream error. + +--- +Task ID: 9 +Agent: main (Z.ai Code) +Task: Preset library folder-tree data layer (backend + store) for the requested +"folder/file tree" Presets page redesign + +Work Log: +- Prisma schema: Preset += folderPath (default "root/user created") + originalFile, + @@unique([folderPath, name]); new Folder model (path @unique). db:push OK, + client regenerated, dev server restarted once to pick up the new client. +- src/lib/server/preset-tree.ts — shared helpers: normalizeFolderPath (root-prefixed, + max depth 8, 80-char segments, control chars rejected), isValidName, parentOf, + subtreeFilter (presets) + subtreeFolderFilter (folders), ensureFolderRows + (creates missing ancestors), PROTECTED_FOLDERS = root | root/embedded | root/user created. +- GET /api/presets — one-time seed: folder backbone (root, root/embedded, + root/user created, root/embedded/{Synth-C,Amp Picks,Dynamics,Envision}) + + 95 presets (5 hand-ported classics → Synth-C; 90 auto-converted Google-Drive + presets → Amp Picks 66 / Dynamics 9 / Envision 15, doubling prefix normalized). + Legacy pre-folder built-ins migrated automatically. Response now + { presets, folders } with folderPath + originalFile on each preset. +- POST /api/presets — create in folder (409 on name clash within folder). +- PUT /api/presets/[id] — update content/author/description or RENAME (unique + per folder enforced); built-in restriction REMOVED (tree is fully manageable). +- DELETE /api/presets/[id] — any preset deletable. +- /api/folders — POST create subfolder (parent must exist), PATCH rename folder + + all descendants (transaction, prefix rewrite), DELETE ?path= removes subtree + (folders + presets). Protected folders reject rename/delete with 400. +- /api/presets/export?path=… — jszip download preserving the directory structure + from root ("root/user created/Club Set/Test Ring.ava" style entries + dir entries). +- /api/presets/import (multipart file + targetPath) — imports .ava/.txt entries; + "root/…"-prefixed paths land at their exact path, others under the target + folder; creates missing folder rows; skips name-clash duplicates; reports + { imported, skipped, skippedOther, foldersCreated }. +- src/lib/store.ts — PresetItem += folderPath/originalFile; EditTarget; new state: + folders, selectedFolder, selectedPresetId, expandedFolders (depth<=2 default + open), editTarget, activePresetId, randomize/randomIntervalSec/randomScope; + actions selectFolder (also sets randomize scope live), selectPreset, setEditTarget, + setActivePresetId, setRandomize, setRandomIntervalSec (3–60 s validation); + module-level club-mode timer (syncRandomTimer/stopRandomTimer, loadRandomPreset + applies to the ENGINE ONLY — never clobbers unsaved editor text; up to 4 random + retries for compilable scripts; toast per switch); settings persisted to + localStorage "ava.randomize" and restored via restoreRandomSettings(folders); + refreshPresets now fetches presets+folders and prunes stale selections. +- src/app/page.tsx — initial load sets folders, startup fallback prefers the + first root/embedded/Synth-C preset, sets activePresetId, restores randomize. +- VERIFIED via curl: seed 95/7 folders correct; create folder/preset; 409 dup; + rename folder moves preset paths; export zip listing shows full paths; delete + subtree; import restores the exact tree; protected-folder rename/delete → 400; + export root → 200. tsc clean on all touched files. + +Stage Summary: +- API contract for the new UI: + GET /api/presets → { presets: PresetItem[], folders: string[] } + POST /api/presets { name, content, author?, description?, folderPath? } → { preset } | 409 | 400 + PUT /api/presets/[id] { name?, content?, author?, description? } → { preset } + DELETE /api/presets/[id] → { deleted } + POST /api/folders { path } → { folder } | 409 | 400 + PATCH /api/folders { path, newName } → { renamed, to, folders, presets } + DELETE /api/folders?path=… → { deleted, folders, presets } (protected → 400) + GET /api/presets/export?path=… → zip download (structure preserved from root) + POST /api/presets/import (file, targetPath) → { imported, skipped, skippedOther, foldersCreated } +- Store API for the UI (src/lib/store.ts): useAvaStore fields folders, + selectedFolder, selectedPresetId, expandedFolders, editTarget, activePresetId, + randomize, randomIntervalSec, randomScope + actions listed above; helpers + refreshPresets(), stopRandomTimer(), syncRandomTimer(), restoreRandomSettings(). +- Random presets are applied engine-only (editor untouched) by design. + +--- +Task ID: 10 +Agent: full-stack-developer (Presets UI) +Task: Presets tab redesign — folder/file tree manager + Script tab Save-to-target / Save As + +Work Log: +- Read worklog (Task 9 contract), store.ts, all 5 API routes, old presets-tab, + script-tab, shared.ts, control-panel.tsx, page.tsx, audio-source.ts, + presets.ts, detect/beat tabs for style matching. +- src/components/ava/presets-tab.tsx — COMPLETE REWRITE (~1000 lines): + - buildTree(folders, presets): synthesizes missing Folder rows + ancestors + from preset folderPaths (defensive); segment-wise alphabetical sort + (parents before children), presets sorted within folders; subtree preset + counts per node. + - TreeFolder/TreePreset recursive rows: chevron-only expand/collapse + (store.toggleFolder; default open = path depth <= 2 segments, same rule + as the store), row click selects (selectFolder/selectPreset), preset + double-click loads, running preset = emerald Play icon + emerald-300 text + + bg-emerald-400/10, selected rows = emerald left border + bg-zinc-800/70, + subtree count badge (font-mono, tooltip "presets in this folder and + below"), originalFile rows get a hover-visible (always on mobile) .avs + download anchor, empty folders show "(empty)" italic hint. role=tree/ + treeitem/group, aria-expanded/selected/level, 36px (size-9/h-9) targets. + Tree scrolls in max-h-[420px] lg:max-h-[480px] with thinScrollbar. + - Two-column layout: tree 58% / actions 42% on sm+, stacked on mobile. + - Context-sensitive actions panel (header shows selection + counts): + preset -> LOAD PRESET (emerald; applyScriptText -> toast -> setActivePresetId + + setEditTarget, compile error -> destructive toast + script tab), RENAME, + DELETE; folder -> CREATE PRESET (POST starter template -> refresh -> + editTarget + editor + engine + select + tab switch + toast), NEW SUBFOLDER + (POST -> expand parent + select new), RENAME (PATCH folder / PUT preset, + selection + editTarget follow the rename), DELETE (AlertDialog with + client-side blast radius "removes N presets in M folders", protected + folders root | root/embedded | root/user created have Rename+Delete + disabled with "Protected folder" tooltip), EXPORT .ZIP (asChild anchor -> + /api/presets/export?path=..., download attr), IMPORT .ZIP (hidden .zip + input -> FormData POST -> summary toast with duplicates/foldersCreated). + All server errors (409/400/404/500) surface as destructive toasts with + the server message; empty names get inline dialog validation. + - Randomize section (border-t): Checkbox + 3-60s delay input; invalid input + shows red hint and reverts to the committed store value on blur (valid + values commit live via setRandomIntervalSec); scope line reflects + randomScope (folder name or "all presets"), amber "no presets in this + folder yet" hint when scope empty; pulsing emerald "ON · every Ns" badge + while running. Timer itself runs in the store — UI only wires controls. + - NameDialog made fully controlled (parent owns value/error) to satisfy + react-hooks/set-state-in-effect lint rule. +- src/components/ava/script-tab.tsx — EDITS: + - "Saving to: root/…/Name" chip (emerald, middle-truncated path, full path + in tooltip) with X button clearing the edit target; shown only while + editTarget is set. + - Save button (emerald, only with editTarget): PUT /api/presets/[id] + {content, author from validateScript meta} -> refreshPresets + toast + 'Saved to "Name"'; disabled while saving. + - Save As… button (only with editTarget): Dialog prefilled with the current + name -> POST /api/presets same folder -> setEditTarget(new) + refresh + + toast; 409 handled; empty name inline error. + - New button now also clears the edit target. +- VERIFIED in headless browser (agent-browser): tree render/expansion/ + selection, Load (toast + tab wiring), Save (PUT 200), Save As (copy + created server-side + chip retargeted), delete preset + folder dialogs + (blast-radius + empty-folder wording), create preset (full flow incl. + editor + tab switch), new subfolder, rename folder (selection follows, + editTarget path rewritten), import .zip end-to-end (DataTransfer dispatch + into the hidden input -> 96 presets/8 folders -> toast -> cleanup), + randomize persistence + scope line + invalid-delay revert + ON badge. + Library restored to pristine 95 presets / 7 folders after testing. +- bun run lint: clean. tsc: clean on both touched files (pre-existing errors + elsewhere in examples/, skills/, audio.ts, script.ts untouched). + dev.log: no runtime errors. + +Stage Summary: +- Files modified: src/components/ava/presets-tab.tsx (full rewrite), + src/components/ava/script-tab.tsx (chip + Save/Save As/New edits). + No changes to page.tsx, store.ts, API routes, or other tabs. +- Key decisions: subtree (not direct) preset counts on folder badges + (labeled via tooltip); NameDialog fully controlled to pass the new + react-hooks lint rules; rename keeps editTarget/randomScope/selection + pointing at the renamed paths client-side (refreshPresets prunes stale + ones server-side); delay input commits valid values live but only reverts + invalid text on blur so typing isn't fighted; export/import allowed on + protected folders (rename/delete disabled) exactly per spec. +- Store/API notes for Task 11: none needed — the Task 9 contract covered + everything. One cosmetic gap: setRandomIntervalSec is typed (sec: number) + though the store handles numeric strings at runtime; UI converts with + Number() before calling. +- Left for Task 11 verification: visual polish pass in a real browser + (spacing at 420 vs 440px panel widths, mobile stacking), touch-device + check of the hover-only .avs download button, and double-click-to-run + ergonomics (agent-browser cannot dblclick, so that path was verified via + the identical Load Preset code path). + +--- +Task ID: 11 +Agent: main (Z.ai Code) +Task: E2E verification of the new folder-tree Presets page + final cleanup + +Work Log: +- bun run lint: zero errors. tsc clean on all files touched by Tasks 9–10. + dev.log: no runtime errors, no hydration warnings. +- Agent-browser E2E golden path, ALL VERIFIED: + * Tree renders exactly as requested: root/ → embedded/ (Synth-C 5, Amp Picks 66, + Dynamics 9, Envision 15) + user created/ 0; subtree count badges; depth≤2 + folders default-expanded; chevron-only expand/collapse; role=tree/treeitem. + * Preset select → action panel switches to preset context (Load/Rename/Delete); + folder select → full management set; protected folders (root/embedded/user + created) have Rename+Delete disabled. + * Load Preset: applied, toast, emerald Play-icon running indicator in tree, + footer SCRIPT updated, engine running. + * Create Preset: dialog → created in selected folder → auto-switch to Script + tab with starter template → "Saving to: root/user created/…/Name" chip → + edit → Save (PUT) persisted server-side (verified content round-trip) → + Save As… created "Club Ring v2" in the same folder and retargeted the chip. + * New Subfolder → "My Fav Presets" created + selected + toast. + * Rename folder "My Fav Presets" → "Club Night": both presets' paths updated. + * Delete folder: AlertDialog with blast radius ("removes 2 presets"), confirmed + → folder + presets gone, library back to 95. + * Export .zip: link href /api/presets/export?path=… correct; zip contains + "root/user created/Round Trip/RT Preset.ava" (structure preserved from root). + * Import .zip via the UI file input (DataTransfer dispatch): toast + "Imported 1 presets — 1 folders created", tree restored at the exact path. + * Randomize: invalid delay 2 and 61 both rejected with the "3 and 60 seconds" + error + revert; 4 accepted; checkbox on → "ON · every 4s" badge; with Demo + audio running, the timer switched to a random preset from the selected + scope after ~4s (toast + footer PTS 333 matching the loaded script); + scope line follows folder selection; settings persist to localStorage and + do NOT auto-restart after reload unless enabled. + * Mobile 390×844: no horizontal scroll, tree/actions stack, footer pushed + naturally and sticks to viewport bottom when scrolled to the end. + * Fresh reload: startup falls back to the first root/embedded/Synth-C preset + (Gap The Mind), tree repopulates, zero console errors. +- Cleanup: deleted the Round Trip / Club Ring test data (library back to the + pristine 95 presets / 7 folders); test artifacts in tool-results/. + +Stage Summary: +- The requested Presets page redesign is COMPLETE and browser-verified: + left folder/file tree (root → embedded {Synth-C, Amp Picks, Dynamics, + Envision} + user created) with counts, expansion, selection, running + indicator and .avs original downloads; right management panel (Load Preset, + Create Preset → Script tab → Save/Save As, New Subfolder, Rename, Delete with + confirmation + blast radius, Export .zip preserving the tree, Import .zip + restoring the tree) and Randomize (3–60 s validated) scoped to the selected + folder. All flows verified end-to-end with zero console errors. + +--- +Task ID: 12 +Agent: main (Z.ai Code) +Task: LOST-WORK RECOVERY — restore the folder-tree Presets page (Tasks 9–11) +from the user's Google Drive project download after the sandbox was rebuilt +from an earlier snapshot + +Context: +- The sandbox running Tasks 9–11 was replaced by a rebuilt environment whose + git history ended at the "link source" commit (51e07079 → local 4caaa3e). + The two commits containing the Google-Drive preset import (b33474e) and the + folder-tree implementation (2a23db4) existed only in the user's downloaded + copy of the project — which the user kindly re-hosted on Google Drive. + +Work Log: +- Downloaded the user's archive (drive file 1yUmimOpLyz7l8BQO6keUHPCvLaV6TW5k, + 86 MB tar.gz, includes .git with the two lost commits) to /tmp/ava-restore. +- Verified the archive's base commit (fb12d97, subject 51e07079) is + content-identical to the workspace HEAD 4caaa3e (git diff empty except + .zscripts/tool-results) → archive HEAD is a strict superset, safe to restore. +- Stopped the dev server, then surgically checked out all 200 files changed + between fb12d97 → 2a23db4 (excluding .zscripts/dev.pid, tool-results, + dev.log): prisma/schema.prisma (Folder model + Preset.folderPath/originalFile), + db/custom.db (pre-seeded 95 presets / 7 folders), src/lib/server/preset-tree.ts, + src/lib/ava/embedded-presets.ts, src/lib/ava/{engine,expression,script}.ts + (functions needed by the converted presets), src/app/api/{folders,presets/** + export,import}/route.ts, presets-tab.tsx (full tree rewrite), script-tab.tsx + (Save/Save As chip), store.ts (tree + randomize state), page.tsx, plus the + 95 .avs originals under public/avs-originals/… and tools/convert-avs.ts. +- Ran `bun run db:generate` to rebuild the Prisma client for the new schema + (the restored db already matched it — no db:push needed, no data loss). +- Restarted the dev server (port 3000, single instance). +- VERIFIED via API: GET /api/presets → 95 presets / 7 folders + (Synth-C 5, Amp Picks 66, Dynamics 9, Envision 15); export + root/embedded/Synth-C → zip with full "root/embedded/Synth-C/*.ava" paths; + import of the same zip → 0 imported / 5 skipped (duplicate paths) — round + trip intact. +- VERIFIED in agent-browser (desktop 1440×900 + mobile 390×844): tree renders + (root 95 → embedded {Amp Picks 66, Dynamics 9, Envision 15, Synth-C 5} + + user created), preset select → Load Preset → engine running (footer + "SRC: DEMO, FPS: 60, PTS: 480, BPM: 126.8, SCRIPT: Gap The Mind, engine ok"), + New Subfolder ("My Fav Presets" created + selected), Rename (→ "Club Night", + toast shows new path), Delete (alertdialog + server 200, tree cleaned), + Randomize delay validation ("2" → red "Delay must be between 3 and 60 + seconds." hint; "4" commits), .avs original HEAD → 200, reload → startup + fallback loads Gap The Mind, zero console/page errors, mobile: no horizontal + scroll, footer pushed naturally and flush with the viewport bottom when + scrolled to end. bun run lint: clean. +- Test data cleaned up (Club Night folder deleted; library back to 95/7). +- Committed the restoration to git and left the recovery remote/objects + out of the repo (temp files remain in /tmp/ava-restore only). + +Stage Summary: +- The folder-tree Presets page (Tasks 9–11) is fully restored and re-verified + end-to-end. Root cause of the "revert": the environment was rebuilt from a + snapshot predating the morning's commits; the work itself was never lost in + the user's download. All state (schema, data, API, UI, presets, tooling) + now matches the archive's HEAD (2a23db4) on top of the current workspace. +- NOTE for the future: commit snapshots are the source of truth when an + environment rebuild is suspected — compare git log before re-implementing.