A Black on White Sound-Interactive Particle Visualiser
Project description
Particled
Audio-reactive particle visualizer with multiple visualization styles and modes.
Status
- Runtime and packaging are release-hardened for PyPI/Homebrew workflows.
- CI includes Linux and macOS checks for lint, tests, type checks, and build validation.
- Publish workflows are in place; remaining release steps are maintainer submission actions.
Overview
Particled is a real-time particle visualization system that responds to microphone input, featuring:
- Torus Knot: Complex mathematical knot patterns with 3D geometry
- Particle Cloud - Gravitas Mode: Physics-based gravity-centered expansion with audio reactivity
- Particle Cloud - Impact Mode: Whole-cloud breathing animation with gentle drift
- Penrose Triangle: Impossible triangle geometry with audio-reactive particle flow
flowchart LR
Mic[Microphone Input] --> Meter[Audio Meter + Features]
Meter --> Main[Main Render Loop]
Main --> Impact[Particle Cloud: Impact]
Main --> Gravitas[Particle Cloud: Gravitas]
Main --> Torus[Torus Knot]
Main --> Penrose[Penrose Triangle]
Main --> Overlay[ImGui Params Overlay]
Overlay --> Presets[Preset Save / Load]
Impact --> Frame[GPU Frame]
Gravitas --> Frame
Torus --> Frame
Penrose --> Frame
classDef audio fill:#0f766e,color:#ffffff,stroke:#0b5f58,stroke-width:2px;
classDef core fill:#1d4ed8,color:#ffffff,stroke:#1e40af,stroke-width:2px;
classDef vis fill:#9333ea,color:#ffffff,stroke:#7e22ce,stroke-width:2px;
classDef ui fill:#ea580c,color:#ffffff,stroke:#c2410c,stroke-width:2px;
classDef out fill:#16a34a,color:#ffffff,stroke:#15803d,stroke-width:2px;
class Mic,Meter audio;
class Main core;
class Impact,Gravitas,Torus,Penrose vis;
class Overlay,Presets ui;
class Frame out;
Features
- Real-time audio reactivity via microphone input
- Multiple visualization styles and sub-modes
- Interactive CLI configuration
- Runtime parameters panel with live tuning
- Per-band particle count and size mapping (8 configurable bands)
- Preset save/load from the parameters panel
- Resizable window with fullscreen support
- Configurable particle physics and return mechanics
- Frequency-based particle mapping (Gravitas mode)
- Adjustable motion trails and visual effects
Installation
Requires Python 3.13+ and Poetry.
System dependencies
PortAudio (required by sounddevice for microphone input):
# Ubuntu / Debian
sudo apt install -y libportaudio2 portaudio19-dev
# macOS
brew install portaudio
SDL2 (only needed if building pygame-ce from source — pre-built wheels are available for most platforms):
# Ubuntu / Debian
sudo apt install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
Install
# Clone the repository
git clone https://github.com/crafted-glitches/particled.git
cd particled
# Install dependencies
poetry install
Optional: install as a package command
python -m pip install -e .
particled --version
Quick Start
# Run with interactive configuration
poetry run particled --selective
# Or run with defaults
poetry run particled
# Version check (non-interactive)
poetry run particled --version
The application will prompt you to:
- Select visualization style (Torus Knot or Particle Cloud)
- Select mode (for Particle Cloud: Gravitas or Impact)
- Optionally configure parameters interactively
Controls:
ESC- Exit the applicationTAB- Toggle parameters panelG- Toggle audio graph- Window is resizable by default
macOS Runtime Notes
macOS-specific runtime permissions and external-display caveats are documented in .0folder.bak/publishing/macos-runtime-notes.md.
Visualization Modes
Torus Knot
Complex mathematical patterns based on torus knot geometry with audio-driven distortion and rotation.
Particle Cloud - Gravitas (Default)
Physics-based particle system where audio pushes particles radially outward from center:
- Audio threshold to prevent ambient noise jitter
- Three return mechanics: Exponential (default), Spring, or Linear
- Frequency-band particle mapping (bass/mid/treble)
- Drift and rotation when idle
Particle Cloud - Impact
Gentle whole-cloud breathing animation with:
- Soft expansion and contraction
- Drift motion for organic feel
- Audio-reactive size and motion
Documentation
See particled/README.md for comprehensive documentation including:
- Package structure and module details
- Complete parameter reference
- Configuration examples
- API usage guide
Publishing and release docs:
- .0folder.bak/publishing/pypi-readiness.md
- .0folder.bak/publishing/homebrew-readiness.md
- RELEASING.md
- CHANGELOG.md
Configuration
All parameters can be configured either:
- Interactively via CLI prompts at startup
- Programmatically via the
Configdataclass
Example programmatic configuration:
from particled import Config, ParticleCloudGravitas
cfg = Config()
cfg.num_particles = 8000
cfg.audio_noise_threshold = 0.05
cfg.gravitas_push_strength = 2.5
cfg.gravitas_return_mechanic = "spring"
field = ParticleCloudGravitas(cfg)
Development
# Install development dependencies
poetry install --with dev
# Run linter
poetry run ruff check .
# Run CI lint gate used in workflow
poetry run ruff check . --select E9,F63,F7,F82
# Run tests
poetry run pytest
# Build distributable artifacts and verify metadata
poetry run python -m build
poetry run twine check dist/*
# Type checks (CI target)
poetry run mypy particled/config.py particled/visuals/param_panels.py particled/visuals/particle_cloud/base.py particled/visuals/particle_cloud/impact.py
# Install pre-commit hooks
poetry run pre-commit install
License
MIT. See LICENSE.
Release Process
Release policy and checklist are documented in RELEASING.md, and version history is tracked in CHANGELOG.md.
Submission-only release steps:
- Update version and changelog.
- Push tag
vX.Y.Z. - Publish release (triggers PyPI workflow).
- Update Homebrew formula URL/SHA for the released artifact.
flowchart TD
Start[Prepare Release] --> Bump[Bump Version + Update Changelog]
Bump --> Tag[Create and Push Tag]
Tag --> GH[GitHub Release Published]
GH --> PyPI[Trusted Publishing to PyPI]
PyPI --> Verify[Verify pip install + package metadata]
Verify --> Brew[Update Homebrew Formula URL + SHA]
Brew --> Done[Release Complete]
classDef prep fill:#334155,color:#ffffff,stroke:#1e293b,stroke-width:2px;
classDef ship fill:#047857,color:#ffffff,stroke:#065f46,stroke-width:2px;
classDef dist fill:#7c3aed,color:#ffffff,stroke:#6d28d9,stroke-width:2px;
classDef done fill:#166534,color:#ffffff,stroke:#14532d,stroke-width:2px;
class Start,Bump,Tag,GH prep;
class PyPI,Verify,Brew ship;
class Done done;
Credits
Built with:
- Pygame - Graphics and window management
- NumPy - Numerical computations
- sounddevice - Audio input
- InquirerPy - Interactive CLI
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file particled-0.9.0.tar.gz.
File metadata
- Download URL: particled-0.9.0.tar.gz
- Upload date:
- Size: 2.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b5b25e02e341cd3eb75040ae9d6a0dfe13405432e5681436667def85950c5d8
|
|
| MD5 |
0a340d4e50d0aa8c9957dd1fc2827151
|
|
| BLAKE2b-256 |
f5ce9835b57323f770c41cb8282dfc0c5c40a6dac817a27c03b8e350ccd61f81
|
Provenance
The following attestation bundles were made for particled-0.9.0.tar.gz:
Publisher:
publish-pypi.yml on crafted-glitches/particled
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
particled-0.9.0.tar.gz -
Subject digest:
3b5b25e02e341cd3eb75040ae9d6a0dfe13405432e5681436667def85950c5d8 - Sigstore transparency entry: 1634358470
- Sigstore integration time:
-
Permalink:
crafted-glitches/particled@d66c6eccd7b01f8b74b8e9df2b592c6bc226f89b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/crafted-glitches
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d66c6eccd7b01f8b74b8e9df2b592c6bc226f89b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file particled-0.9.0-py3-none-any.whl.
File metadata
- Download URL: particled-0.9.0-py3-none-any.whl
- Upload date:
- Size: 2.6 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87b644207dd022bf03c30843a44f8f18e1acc02f439ddf53fb4460d6ba0773ed
|
|
| MD5 |
85ae4f122f2f0723775d7846badba522
|
|
| BLAKE2b-256 |
bcc0c714eac94bd8d0c669ba01b6090ec13a85172fe5864712ebada52e2440e1
|
Provenance
The following attestation bundles were made for particled-0.9.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on crafted-glitches/particled
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
particled-0.9.0-py3-none-any.whl -
Subject digest:
87b644207dd022bf03c30843a44f8f18e1acc02f439ddf53fb4460d6ba0773ed - Sigstore transparency entry: 1634358532
- Sigstore integration time:
-
Permalink:
crafted-glitches/particled@d66c6eccd7b01f8b74b8e9df2b592c6bc226f89b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/crafted-glitches
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d66c6eccd7b01f8b74b8e9df2b592c6bc226f89b -
Trigger Event:
workflow_dispatch
-
Statement type: