2026-02-11 13:17:17 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
2026-03-22 00:36:00 +01:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2026-02-11 13:17:17 +01:00
< title > NISPS Playground< / title >
2026-03-22 00:36:00 +01:00
< style >
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap');
* { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #0a0a0a;
--surface: #111;
--border: #1e1e1e;
--accent: #ff6a00;
--accent-dim: rgba(255, 106, 0, 0.12);
--text: #c8c8c8;
--text-dim: #606060;
--mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
}
html, body {
background: var(--bg);
color: var(--text);
font-family: var(--mono);
min-height: 100vh;
}
/* Faint grid background */
body::before {
content: '';
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(255,106,0,0.02) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,106,0,0.02) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
z-index: 0;
}
.page {
position: relative;
z-index: 1;
max-width: 900px;
margin: 0 auto;
padding: 56px 24px 80px;
}
/* Header */
.header {
margin-bottom: 48px;
}
h1 {
font-family: var(--mono);
font-size: 28px;
font-weight: 700;
color: var(--accent);
letter-spacing: -0.5px;
line-height: 1.2;
}
h1 span {
color: var(--text-dim);
font-weight: 400;
font-size: 13px;
display: block;
margin-top: 6px;
letter-spacing: 1px;
text-transform: uppercase;
}
.intro {
margin-top: 20px;
font-size: 13px;
color: var(--text-dim);
line-height: 1.7;
max-width: 560px;
}
/* Cards */
.cards {
display: flex;
flex-direction: column;
gap: 16px;
}
.card {
display: grid;
grid-template-columns: 1fr;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
text-decoration: none;
color: inherit;
transition: border-color 0.2s, box-shadow 0.2s;
cursor: pointer;
}
.card:hover {
border-color: var(--accent);
box-shadow: 0 0 20px rgba(255, 106, 0, 0.06), inset 0 0 20px rgba(255, 106, 0, 0.02);
}
.preview {
width: 100%;
height: 220px;
overflow: hidden;
position: relative;
background: #080808;
border-bottom: 1px solid var(--border);
}
.preview iframe {
width: 200%;
height: 200%;
transform: scale(0.5);
transform-origin: top left;
border: none;
pointer-events: none;
}
.card-body {
padding: 16px 20px 20px;
}
.card-body h2 {
font-family: var(--mono);
font-size: 16px;
font-weight: 700;
color: #e0e0e0;
margin-bottom: 6px;
}
.card-body p {
font-size: 12px;
color: var(--text-dim);
line-height: 1.6;
}
.card:hover .card-body h2 {
color: var(--accent);
}
/* Desktop: horizontal row */
@media (min-width: 860px) {
.cards {
flex-direction: row;
gap: 12px;
}
.card {
flex: 1;
}
.preview {
height: 240px;
}
}
/* Large: more breathing room */
@media (min-width: 1100px) {
.page { max-width: 1100px; }
.preview { height: 280px; }
}
< / style >
2026-02-11 13:17:17 +01:00
< / head >
< body >
2026-03-22 00:36:00 +01:00
< div class = "page" >
< div class = "header" >
< h1 > NISPS Playground
< span > Neural Interactive Shaping of Parameter Spaces< / span >
< / h1 >
< p class = "intro" > Map a 2D joystick to 126 synthesizer parameters through a neural network. Two learning modes: show examples of what you want, or give thumbs up/down feedback. The network learns to interpolate the space between them.< / p >
< / div >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
2026-03-22 00:36:00 +01:00
< div class = "cards" >
< a class = "card" href = "a-immersive.html" >
< div class = "preview" >
< iframe src = "a-immersive.html" loading = "lazy" tabindex = "-1" > < / iframe >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< div class = "card-body" >
< h2 > Immersive< / h2 >
< p > Full-screen canvas with floating controls. The visualization is the interface.< / p >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< / a >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
2026-03-22 00:36:00 +01:00
< a class = "card" href = "b-workbench.html" >
< div class = "preview" >
< iframe src = "b-workbench.html" loading = "lazy" tabindex = "-1" > < / iframe >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< div class = "card-body" >
< h2 > Workbench< / h2 >
< p > Dashboard layout with a 2D heatmap. Built for understanding the mapping.< / p >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< / a >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
2026-03-22 00:36:00 +01:00
< a class = "card" href = "c-journey.html" >
< div class = "preview" >
< iframe src = "c-journey.html" loading = "lazy" tabindex = "-1" > < / iframe >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< div class = "card-body" >
< h2 > Journey< / h2 >
< p > Three phases that dissolve as you master the mapping. The UI fades away.< / p >
feat(playground): add C15 synth mode with NISPS-controlled parameters and arpeggiator
Adds a secondary Synth mode (toggled via collapsible left side panel)
where the NISPS ML engine's 20 outputs control curated C15 synthesizer
parameters (oscillator PM, shapers, filters, reverb, echo, flanger,
output mixer) through a WASM AudioWorklet bridge.
Includes a chord progression arpeggiator with controls for tempo (BPM),
octave range, octave offset, and 4 selectable progressions. The C15
engine runs in an AudioWorklet with lock-free SharedArrayBuffer ring
buffer communication.
New files: c15/ (WASM assets), js/synth/ (bridge, arpeggiator, param map),
serve-coop.py (COOP/COEP headers for SharedArrayBuffer support).
2026-03-21 21:26:37 +01:00
< / div >
2026-03-22 00:36:00 +01:00
< / a >
2026-02-11 13:17:17 +01:00
< / div >
< / div >
< / body >
< / html >