319 lines
12 KiB
HTML
319 lines
12 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Synapse BCI Lab · Neural Interface Study</title>
|
|
<meta
|
|
name="description"
|
|
content="An illustrative neural-interface study showing how simulated signals, reporting fields, and research commitments can be communicated."
|
|
/>
|
|
<meta property="og:title" content="Synapse BCI Lab · Neural Interface Study" />
|
|
<meta
|
|
property="og:description"
|
|
content="An illustrative interface concept with simulated signals and no clinical results."
|
|
/>
|
|
<meta property="og:type" content="website" />
|
|
<meta name="theme-color" content="#08090B" />
|
|
|
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
<link
|
|
rel="stylesheet"
|
|
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Sans+KR:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap"
|
|
/>
|
|
<link rel="stylesheet" href="./styles/main.css?v=20260912all" />
|
|
<link
|
|
rel="icon"
|
|
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' fill='%2308090B'/%3E%3Cpath d='M6 24l6-6 4 4 9-14' fill='none' stroke='%23D9A441' stroke-width='2'/%3E%3Cpath d='M19 8h6v6' fill='none' stroke='%23D9A441' stroke-width='2'/%3E%3C/svg%3E"
|
|
/>
|
|
</head>
|
|
|
|
<body>
|
|
<a class="skip" href="#main">Skip to main content</a>
|
|
|
|
<header class="site-head">
|
|
<div class="wrap head-inner">
|
|
<a class="wordmark" href="#main">synapse<span class="wordmark-dot">·</span>bci</a>
|
|
<nav class="nav" aria-label="Sections">
|
|
<a href="#raster">Raster</a>
|
|
<a href="#device">Device</a>
|
|
<a href="#numbers">Numbers</a>
|
|
<a href="#ethics">Ethics</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main id="main">
|
|
<section class="hero" aria-labelledby="hero-h">
|
|
<div class="wrap hero-grid">
|
|
<div class="hero-text">
|
|
<p class="hero-kicker reveal">Illustrative μECoG concept · simulated signal display</p>
|
|
<h1 id="hero-h" class="reveal" style="--delay: 60ms">
|
|
A signal interface,<br />explained clearly
|
|
</h1>
|
|
<p class="lead reveal" style="--delay: 120ms">
|
|
This page illustrates how a neural-interface study could describe
|
|
signals, reporting, and safeguards. It is not a clinical device,
|
|
a trial, or evidence of performance. The raster is simulated and
|
|
contains no participant data.
|
|
</p>
|
|
<dl class="trial-register reveal" style="--delay: 150ms">
|
|
<div>
|
|
<dt>study status</dt>
|
|
<dd>illustrative concept · no trial</dd>
|
|
</div>
|
|
<div>
|
|
<dt>reporting</dt>
|
|
<dd>no clinical outcomes reported</dd>
|
|
</div>
|
|
<div>
|
|
<dt>raster source</dt>
|
|
<dd>simulated signal · no participant data</dd>
|
|
</div>
|
|
</dl>
|
|
<div class="hero-actions reveal" style="--delay: 180ms">
|
|
<a class="btn" href="#numbers">See the reporting format</a>
|
|
<a class="link-quiet" href="#ethics">Read the research principles</a>
|
|
</div>
|
|
</div>
|
|
|
|
<figure class="raster-frame reveal" style="--delay: 140ms">
|
|
<figcaption class="raster-head">
|
|
<span>SPIKE RASTER · 64 CH · SIMULATED</span>
|
|
<span>2.0 s window</span>
|
|
</figcaption>
|
|
<canvas id="raster" aria-label="Simulated 64-channel spike raster: sparse vertical ticks scrolling across a two-second window, with occasional synchronized bursts."></canvas>
|
|
<div class="raster-legend">
|
|
<span class="legend-tick" aria-hidden="true"></span>
|
|
<span>each tick — one detected spike · bursts are channel-sync events</span>
|
|
</div>
|
|
</figure>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="device" class="section" aria-labelledby="device-h">
|
|
<div class="wrap two">
|
|
<figure class="two-photo reveal">
|
|
<img
|
|
src="./assets/chip-macro.webp"
|
|
alt="Illustrative neural-interface concept plate with dense gold traces and a micro-electrode grid at one edge"
|
|
width="900"
|
|
height="1200"
|
|
loading="lazy"
|
|
/>
|
|
<figcaption>SYN-64 concept plate · illustrative reference image</figcaption>
|
|
</figure>
|
|
<div class="two-text">
|
|
<h2 id="device-h">Surface interface,<br />explained</h2>
|
|
<p>
|
|
The SYN-64 is an illustrative surface-interface concept. It helps
|
|
explain the questions a real device page must answer about contact,
|
|
tissue interaction, and user safety; it does not describe an
|
|
implant available for study or care.
|
|
</p>
|
|
<p class="muted">
|
|
The image is a constructed reference for this concept, not a
|
|
clinical product photograph or a surgical instruction.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<section id="numbers" class="section band" aria-labelledby="numbers-h">
|
|
<div class="wrap">
|
|
<h2 id="numbers-h" class="reveal">Reporting fields, not results</h2>
|
|
<div class="table-wrap reveal" style="--delay: 80ms">
|
|
<table>
|
|
<caption class="sr-only">
|
|
Illustrative research reporting fields — metric, reported value, and condition
|
|
</caption>
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">Metric</th>
|
|
<th scope="col" class="num">Value</th>
|
|
<th scope="col">Condition</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<th scope="row">Decode latency</th>
|
|
<td class="num">—</td>
|
|
<td>No clinical result reported</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">Raw sampling</th>
|
|
<td class="num">—</td>
|
|
<td>No device specification reported</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">SNR</th>
|
|
<td class="num">—</td>
|
|
<td>No clinical measurement reported</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">Gesture classes</th>
|
|
<td class="num">—</td>
|
|
<td>No accuracy or participant result reported</td>
|
|
</tr>
|
|
<tr>
|
|
<th scope="row">Wireless link</th>
|
|
<td class="num">—</td>
|
|
<td>No system detail reported</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<p class="measure-note reveal" style="--delay: 140ms">
|
|
This table shows the fields a responsible report should identify.
|
|
It deliberately reports no clinical values, participant outcomes,
|
|
regulatory status, or device availability.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="section plate" aria-label="Illustrative microelectrode layout reference image">
|
|
<figure class="plate-fig reveal">
|
|
<img
|
|
src="./assets/thread-array.webp"
|
|
alt="Illustrative gold-tipped microelectrode layout spreading across a dark reference stage"
|
|
width="1440"
|
|
height="810"
|
|
loading="lazy"
|
|
/>
|
|
<figcaption class="wrap">Illustrative electrode layout · reference image</figcaption>
|
|
</figure>
|
|
</section>
|
|
|
|
<section id="ethics" class="section" aria-labelledby="ethics-h">
|
|
<div class="wrap ethics-grid">
|
|
<h2 id="ethics-h">Research principles for a real study</h2>
|
|
<ul class="ethics-list">
|
|
<li class="reveal">
|
|
<h3>Signals are not advertising data</h3>
|
|
<p>
|
|
A real study should define purpose limits before data collection
|
|
and should not repurpose neural signals for advertising or profiling.
|
|
</p>
|
|
</li>
|
|
<li class="reveal" style="--delay: 80ms">
|
|
<h3>Withdrawal must be possible</h3>
|
|
<p>
|
|
A real protocol must explain withdrawal, support, and follow-up
|
|
before enrollment. This concept reports no participants or outcomes.
|
|
</p>
|
|
</li>
|
|
<li class="reveal" style="--delay: 160ms">
|
|
<h3>Data access needs a stated boundary</h3>
|
|
<p>
|
|
A real study must state how raw data is retained, who can access
|
|
it, and how publication separates aggregate findings from identity.
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="section band contact" aria-labelledby="contact-h">
|
|
<div class="wrap contact-grid">
|
|
<h2 id="contact-h">About this concept</h2>
|
|
<p>
|
|
This is a design concept for explaining an emerging research area.
|
|
It does not recruit participants, accept data-access requests, or
|
|
provide medical or research services.
|
|
</p>
|
|
<a class="btn" href="#main">Return to the concept</a>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
|
|
<footer class="site-foot">
|
|
<div class="wrap foot-inner">
|
|
<p>synapse bci · illustrative research concept</p>
|
|
<p class="foot-meta">no trial, clinical result, regulatory approval, or participant data</p>
|
|
</div>
|
|
</footer>
|
|
|
|
<script>
|
|
const canvas = document.getElementById("raster");
|
|
const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
const CH = 64;
|
|
let ctx, w, h, dpr, running = false;
|
|
|
|
function fit() {
|
|
dpr = Math.min(devicePixelRatio || 1, 1.5);
|
|
w = canvas.clientWidth;
|
|
h = canvas.clientHeight;
|
|
canvas.width = Math.round(w * dpr);
|
|
canvas.height = Math.round(h * dpr);
|
|
ctx = canvas.getContext("2d");
|
|
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
ctx.fillStyle = "#0b0d10";
|
|
ctx.fillRect(0, 0, w, h);
|
|
}
|
|
|
|
const rate = () => 0.02 + Math.random() * 0.05;
|
|
const GOLD = "rgba(235, 184, 78, 1)";
|
|
const GOLD_DIM = "rgba(217, 164, 65, 0.72)";
|
|
|
|
function column(x) {
|
|
const burst = Math.random() < 0.006;
|
|
const rowH = h / CH;
|
|
for (let ch = 0; ch < CH; ch++) {
|
|
const fire = burst ? Math.random() < 0.55 : Math.random() < rate();
|
|
if (!fire) continue;
|
|
ctx.strokeStyle = burst ? GOLD : GOLD_DIM;
|
|
ctx.lineWidth = burst ? 1.35 : 1;
|
|
ctx.beginPath();
|
|
const y = ch * rowH + rowH / 2;
|
|
ctx.moveTo(x, y - rowH * 0.36);
|
|
ctx.lineTo(x, y + rowH * 0.36);
|
|
ctx.stroke();
|
|
}
|
|
}
|
|
|
|
function step() {
|
|
if (!running) return;
|
|
const dx = 2;
|
|
ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, -dx * dpr, 0, canvas.width, canvas.height);
|
|
ctx.fillStyle = "#0b0d10";
|
|
ctx.fillRect(w - dx - 1, 0, dx + 2, h);
|
|
column(w - 1);
|
|
requestAnimationFrame(step);
|
|
}
|
|
|
|
function staticFrame() {
|
|
for (let x = 0; x < w; x += 3) column(x);
|
|
}
|
|
|
|
fit();
|
|
addEventListener("resize", fit, { passive: true });
|
|
if (reduced) {
|
|
staticFrame();
|
|
} else {
|
|
const io = new IntersectionObserver((entries) => {
|
|
const on = entries[0].isIntersecting;
|
|
if (on && !running) {
|
|
running = true;
|
|
requestAnimationFrame(step);
|
|
} else if (!on) {
|
|
running = false;
|
|
}
|
|
});
|
|
io.observe(canvas);
|
|
}
|
|
|
|
const io2 = new IntersectionObserver(
|
|
(entries) => {
|
|
for (const e of entries) {
|
|
if (!e.isIntersecting) continue;
|
|
e.target.classList.add("is-in");
|
|
io2.unobserve(e.target);
|
|
}
|
|
},
|
|
{ rootMargin: "0px 0px -8% 0px", threshold: 0.05 },
|
|
);
|
|
for (const el of document.querySelectorAll(".reveal")) io2.observe(el);
|
|
</script>
|
|
</body>
|
|
</html>
|