phonen banner

phonen

2 devlogs
4h 38m 13s

ever though how letters sound.. well now you do!

This project uses AI

Used ai to aid in the readme, it can word things better than I can!

Demo Repository

Loading README...

ShiviWhivi

Shipped this project!

I built this app, curious as ever to know what letters taste, i mean sound like. well know i know what they sound like! I hope you feel enlightened too.

ShiviWhivi

Added local draft persistence in src/components/Phonen.tsx: composition snapshots (serialized chars + mode) are stored to localStorage with metadata (title, last update date/time, mode, bpm, preview text), then restored on load.

Added composition draft management UI in src/components/Phonen.tsx: save/drafts/load/delete actions along with a floating drafts panel with each draft’s metadata plus inline load/delete controls.

Added deterministic playback timing in src/components/Phonen.tsx: playback no longer uses the original keystroke timestamps but instead uses BPM-quantized step intervals; slight spacing multipliers are also applied to spaces/newlines.

Added playback safety controls in phonenSynth.ts and src/components/Phonen.tsx: explicit audio-enabled flag adoption, mute state handling, global and per-voice volume controls, and safeguard around playback when audio is not enabled. .
Added WAV export workflow pipeline in src/lib/phonenSynth.ts: tap to capture for the entire synth graph now points to a ScriptProcessorNode, longitudinal PCM recording/accumulation, and WAV encoding to a downloadable Blob URL.

Connected WAV export workflow pipeline in src/components/Phonen.tsx: export mode is hooked into playComposition, recording is stropped before/after playback, tail ring-out time is preserved, and the file is saved. to disk.
Potential potential pitfall/error/source of future bugs: the ScriptProcessorNode used for the WAV capture path in phonenSynth is based on legacy/deprecated code; it works but has performance/latency idiosyncrasies, and will need eventually to be ported over to be based on an AudioWorklet. Potential potential pitfall/error/source of future bugs: while present in the replay flow only, if audio state is paused or interrupted during playback, the file will have a truncated end or silence in front depending on the timing.

Attachment
0
ShiviWhivi

Got the base going
settled on a calm, just text and hear the letters!
added a feature that lets users play back, understand what they can do, and share their music with others!!
gonna roll in some more stuff!

heres a more detailed overview:

  • the keypresses are captured in a hidden textarea, classified by character type (vowel/consonant/punctuation/whitespace), processed through the Web Audio nodes, and emitted as SoundEvents.
  • each rendered letter has a timestamp, opacity, scaling, and glow attached to it, and it’s re-rendered with time-dependent fade-in via a regular loop.
  • the sentiment of text is computed on-the-fly, translated into a musical mode, and passed to the synth as parameters that will change its behavior.
  • events of characters are replayed with delays that depend on recorded delays between consecutive keystrokes (limited by min and max values).
  • states of compositions are serialized into a compact form of base64-encoded JSON with mode and character-specific data as query parameters.
Attachment
0