Shuna Maekawa / Projects

Printable Spectrogram

2026-01-31 · Web App, TypeScript, React, Rust, WASM, Audio Processing, DSP

A fully client-side web application that generates high-resolution spectrograms with publication-quality annotated exports, powered by Rust/WASM.

Printable Spectrogram

Overview

Printable Spectrogram is a fully client-side web application that generates high-resolution spectrograms comparable in configurability to librosa. It supports real-time audio input and allows publication-quality annotated exports suitable for academic papers and presentations.

No server, no backend—everything runs in the browser.


The Problem

Creating publication-quality spectrograms typically requires:

I wanted a tool that does all of this in the browser, with real-time preview and direct SVG/PNG export.


Features

Audio Processing (Client-side only)

Visualization

Annotation Layer

Publication-Quality Export


Tech Stack


Architecture

This project follows Clean Architecture principles with a Test-Driven Development approach:

┌─────────────────────────────────────────┐
│     Presentation Layer (React UI)       │
├─────────────────────────────────────────┤
│     Use Case Layer (Application)        │
├─────────────────────────────────────────┤
│     Domain Layer (Business Logic)       │
├─────────────────────────────────────────┤
│  Infrastructure Layer (WASM, Audio I/O) │
└─────────────────────────────────────────┘

Project Structure

.
├── src/
│   ├── domain/              # Pure business logic, entities, interfaces
│   ├── usecases/            # Application orchestration
│   ├── infrastructure/      # External interfaces (WASM, audio, canvas)
│   └── presentation/        # React components
├── rust-dsp/               # Rust WASM DSP core
└── tests/                  # Integration tests

Why Rust/WASM?

Heavy DSP operations like STFT require significant computation. By implementing the DSP core in Rust and compiling to WebAssembly:


Development Status

Currently in active development. Core infrastructure is complete, with ongoing work on:


Links