- A letter without a keystroke
Triton Neurotech is UCSD's student brain-computer-interface team; David worked on the ML side. The problem their speller line of work addresses is assistive communication: a person who cannot move or speak watches a 6x6 grid of characters while rows and columns flash, and the EEG betrays which cell they were watching. No muscles involved; the signal is the P300, a positive voltage bump about 300 ms after a stimulus the brain considers relevant.
- Twelve flashes, one oddball
In one repetition, each of the 6 rows and 6 columns lights up once, in random order, 100 ms on and 75 ms off. Only 2 of those 12 flashes contain the watched letter, which makes them oddballs, and oddballs evoke the P300. A single response is far below the noise floor, so the paradigm repeats everything 15 times and averages: noise cancels, the P300 stays. The live speller above runs this exact cadence on synthetic EEG; watch the target-flash average separate from the non-target average as repetitions accumulate.
- 650 milliseconds at a time
The pipeline never sees a raw recording: it sees windows. Each flash opens a 650 ms window across the electrodes (bandpassed 0.1-20 Hz, downsampled 240 to 120 Hz, z-scored per window), giving a 78-sample x N-channel patch, and P300 detection becomes binary image classification. The five-layer 1D CNN reads it in two moves: a kernel-size-1 convolution that mixes channels at each instant (a spatial filter over the scalp), then a temporal convolution that slides over the window.
- A family of small CNNs
The project treats the architecture as a family of experiments. CNN1 is the base model on all 64 electrodes; CNN2a keeps only the 8 classic P300 sites (Fz, Cz, Pz, P3, P4, PO7, PO8, Oz); CNN2b picks its 8 electrodes by reading CNN1's first-layer weights; CNN2c tries whole lobes at a time; CNN3 forces a single spatial filter to see what one scalp pattern can do. MCNN1-3 are ensembles of five (or three) CNN1s trained on different subsets, averaging their votes. The head map below shows every subset on the 10-20 layout.
- What the numbers said
On subject B's 100-letter test set (the runs committed in the notebooks), single windows are hard: 73.7-79.0% weighted accuracy across the single CNNs, with the ensembles at 78.8-79.6%. But the speller doesn't need single windows: it averages scores across repetitions before picking a row and a column. Character accuracy climbs from 37% after one repetition to 94% by twelve. The results panel shows the actual sentence the pipeline spelled, mistakes highlighted.
- Whose work is what (built 2026-09-01)
Honesty box: the CNN family, notebooks and quoted results are the open-source p300-speller project by Manuel Carzaniga and Lorenzo Gualniera, the codebase archived here and studied on the ML team; David's role stayed on the ML side of Triton Neurotech's speller work, not the UI, and none of this page's numbers are his runs. The live speller is this page's own build: synthetic EEG (no BCI Competition data is shipped), with the notebook's letter-decoding logic ported to TypeScript and fixture-tested against the Python original. The classifier panel's spatial-filter weights are illustrative; no trained checkpoint was archived. TS widgets written with AI coding tools.