Skip to main content

SonicLab

CI PyPI version Python versions License: MIT

SonicLab is a modular Python DSP / audio synthesis engine: vectorized oscillators, envelopes, filters, effects, sequencing, optional realtime audio I/O, and MIDI adapters.

Status: Beta. Public APIs may still evolve; see docs/stability.md and CHANGELOG.md.

Features

  • Oscillators: sine, square, sawtooth, triangle, PolyBLEP bandlimited variants
  • Modulation: ADSR / decay envelopes, modulated oscillators & frequency helpers
  • Modifiers: volume, panning, clipping, frequency processors
  • Composition: Chain (serial), WaveAdder (parallel mix)
  • Noise: white, pink, brownian, blue, grey, velvet, sample-and-hold, Perlin
  • Filters: Butterworth utilities, biquad resonant, acid/303-style filter
  • Effects: distortion, delay, reverb, compressor
  • Sequencing: step sequencers, clock, accent/slide, TB-303 helpers
  • Presets: PresetBuilder / PresetLibrary
  • I/O (optional): AudioOutput via the audio-io extra
  • MIDI (optional): adapters and synth helpers via the midi extra

Install

From PyPI:

pip install soniclab

Optional extras:

pip install "soniclab[audio-io]"   # sounddevice + numba speed path
pip install "soniclab[midi]"       # mido + python-rtmidi
pip install "soniclab[speed]"      # numba only
pip install "soniclab[examples]"   # notebooks / plotting
pip install "soniclab[full]"       # audio-io + midi + examples

From a checkout (recommended while developing):

uv sync
# or:
python -m pip install -e ".[dev]"

Notes:

  • Base install is the core NumPy/SciPy engine only.
  • Realtime device playback needs working system audio drivers plus audio-io.
  • MIDI needs local MIDI ports/backends plus the midi extra.

Minimal example

from soniclab import SineOscillator, __version__

print(__version__)
osc = SineOscillator(frequency=440, amplitude=0.3)
samples = osc.get_samples(44100)  # 1 second @ 44.1 kHz, float32
print(samples.shape, samples.dtype)

Chain + stereo pan:

from soniclab import SineOscillator, Chain, Volume, Panner

chain = Chain(
    SineOscillator(frequency=440, amplitude=0.4),
    Volume(0.8),
    Panner(0.25),
)
stereo = chain.get_samples(2048, mode="vectorized")  # shape (2048, 2)

PolyBLEP oscillator:

from soniclab import PolyBLEPOscillator, WaveShape

osc = PolyBLEPOscillator(
    frequency=110,
    amplitude=0.5,
    wave_shape=WaveShape.SAWTOOTH_UP,
)
samples = osc.get_samples(1024, mode="vectorized")

Optional audio output:

from soniclab.audio_io import AudioOutput
# See examples/ and soniclab/audio_io for callback-based playback.

Sample generation modes

Most generators support:

Mode Behavior
"vectorized" NumPy block rendering (preferred for production)
"iterator" Python sample loop (flexible, slower)
"auto" oscillators: vectorized when n >= 512, else iterator; composers (Chain / WaveAdder) always use vectorized so small realtime buffers stay on the fast path

For realtime or offline renderers, prefer "vectorized" (or "auto" with buffer sizes ≥ 512).

Documentation

Testing

uv run pytest tests -q
uv run ruff check soniclab tests
uv run mypy soniclab

Suggested slices (mirrors soniclab/ layout):

uv run pytest tests/core -q
uv run pytest tests/dsp -q
uv run pytest tests/generators -q
uv run pytest tests/audio_io -q
uv run pytest tests/midi_io -q
uv run pytest tests/utils -q
uv run pytest tests/presets -q
uv run pytest tests/sequencing -q
uv run pytest tests/voices -q

Project layout

soniclab/          # installable package
tests/             # pytest suite (mirrors soniclab/ packages)
examples/          # demos & notebooks (not in sdist)
docs/              # user documentation (MkDocs)
scripts/           # benchmarks & local tooling

Public API

Import the stable surface from the top-level package:

from soniclab import (
    SineOscillator,
    SquareOscillator,
    TriangleOscillator,
    SawtoothOscillator,
    PolyBLEPOscillator,
    ADSREnvelope,
    Chain,
    WaveAdder,
    Volume,
    Panner,
    Delay,
    Reverb,
)

Optional subsystems stay in subpackages so the core install stays light:

from soniclab.audio_io import AudioOutput
from soniclab.midi_io import MIDIInput  # requires midi extra

Contributing

  1. Prefer uv for environments (uv sync --group dev).
  2. Keep changes covered by tests under tests/.
  3. Run pytest, ruff, and mypy before opening a PR.
  4. Follow existing module patterns (component descriptor + registry registration).
  5. See CONTRIBUTING.md for details.

Changelog

See CHANGELOG.md.

License

See LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

soniclab-2026.1.1.tar.gz (244.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

soniclab-2026.1.1-py3-none-any.whl (199.2 kB view details)

Uploaded Python 3

File details

Details for the file soniclab-2026.1.1.tar.gz.

File metadata

  • Download URL: soniclab-2026.1.1.tar.gz
  • Upload date:
  • Size: 244.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for soniclab-2026.1.1.tar.gz
Algorithm Hash digest
SHA256 1f2bcfea343070bda2a58aba5035d4a1bc14a585f79175bd2b1d4290933f78ee
MD5 4c0a395d177b53c6cb1c1576704ceb98
BLAKE2b-256 e528e37454836cff96351f4ded28caa9feb12c29ae017d98da2e43da02498d5d

See more details on using hashes here.

File details

Details for the file soniclab-2026.1.1-py3-none-any.whl.

File metadata

  • Download URL: soniclab-2026.1.1-py3-none-any.whl
  • Upload date:
  • Size: 199.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for soniclab-2026.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f96f52ed777d743153831aeda094530df17a159299557804d9cf94e606fcd69a
MD5 3655fab37e56eb9a7e9b571ad45e2798
BLAKE2b-256 20fadc4e2b011208c5f5145adfc547e962aeed445128e37f3876661dd9bd281b

See more details on using hashes here.

Release history Release notifications | RSS feed

2026.2.0

2 files

2026.1.5

2 files

2026.1.4

2 files

2026.1.3

2 files

2026.1.2

2 files

This release

2026.1.1 This release

2 files

2026.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page