Skip to main content

A Pythonic audio processing library wrapping libsox

Project description

cysox

PyPI Python License: MIT Docs

A Python audio processing tool / library which uses Cython to wrap libsox.

Documentation | API Reference | Examples

Features

  • Simple API: Convert, analyze, and play audio with one-liners
  • Typed Effects: 27 base effect classes with IDE autocomplete and validation
  • 53 Effect Presets: Ready-to-use composite effects for voice, lo-fi, drums, mastering, and more
  • Sample Processing: Auto-trim silence, split recordings into one-shots, generate chromatic pitch scales, batch process directories
  • Drum Loop Tools: Slice loops by BPM, create stutter effects, apply beat-synced processing
  • High Performance: Direct C bindings through Cython, KissFFT-accelerated onset detection
  • Zero Configuration: Auto-initialization, no manual setup required
  • Cross-Platform: macOS, Linux (Windows placeholder)

Installation

Note that cysox only works on macOS and Linux.

pip install cysox

Command Line Interface

# Show version
cysox --version

# Get audio file info
cysox info audio.wav

# Convert audio files
cysox convert input.wav output.mp3
cysox convert input.wav output.wav --rate 48000 --channels 1
cysox convert input.wav output.wav -p Telephone

# Play audio
cysox play audio.wav

# Concatenate files
cysox concat intro.wav main.wav outro.wav -o full.wav

# List available effect presets
cysox preset list
cysox preset list drums          # Filter by category

# Get preset info and parameters
cysox preset info Chipmunk

# Apply a preset to audio
cysox preset apply Telephone input.wav output.wav
cysox preset apply Chipmunk input.wav output.wav --intensity=2.0

# Slice audio into segments
cysox slice drums.wav output_dir/ -n 8
cysox slice drums.wav output_dir/ --bpm 120 --beats 1
cysox slice drums.wav output_dir/ -n 4 -p DrumPunch

# Slice at detected transients (automatic beat detection)
# -t threshold (e.g. 0.3), -s sensitivity (default 1.5), -m method (default hfc)
cysox slice drums.wav output_dir/ -t 0.3
cysox slice drums.wav output_dir/ -t 0.2 -s 1.2 -m flux

# Create stutter effects
cysox stutter drums.wav stutter.wav -d 0.125 -r 8
cysox stutter drums.wav stutter.wav -s 0.5 -d 0.25 -r 4 -p GatedReverb

# Trim silence from beginning and end of audio
cysox auto-trim raw.wav trimmed.wav
cysox auto-trim raw.wav trimmed.wav --thresh -36 --fadein 10 --fadeout 50
cysox auto-trim raw.wav trimmed.wav --speedup 2

# Split continuous recording into one-shots at silence gaps
cysox split recording.wav one_shots/
cysox split recording.wav one_shots/ --thresh -36 --min-silence 0.5

# Generate pitch-shifted copies (chromatic scale)
cysox pitch-scale sample.wav scale/                    # 12 semitones (1 octave)
cysox pitch-scale sample.wav scale/ --range 24 --offset -12

# Batch process all audio files in a directory
cysox batch raw_samples/ processed/ -p Normalize
cysox batch raw_samples/ processed/ --rate 44100 --channels 1 --format wav
cysox batch raw_samples/ processed/ --no-recursive -p DrumPunch

Quick Start

import cysox
from cysox import fx

# Get audio file info
info = cysox.info('audio.wav')
print(f"Duration: {info['duration']:.2f}s, Sample rate: {info['sample_rate']} Hz")

# Convert with effects
cysox.convert('input.wav', 'output.mp3', effects=[
    fx.Normalize(),
    fx.Reverb(reverberance=60),
    fx.Fade(fade_in=0.5, fade_out=1.0),
])

# Play audio (macOS/Linux)
cysox.play('audio.wav')

# Play with effects
cysox.play('audio.wav', effects=[fx.Volume(db=-6)])

Core Functions

cysox.info(path) -> AudioInfo

Get audio file metadata. Returns an AudioInfo object supporting both attribute access and dict-style access:

info = cysox.info('audio.wav')
print(info.duration)         # Attribute access
print(info['sample_rate'])   # Dict-style access (backwards compatible)
# Fields: path, format, duration, sample_rate, channels,
#         bits_per_sample, samples, encoding

cysox.convert(input, output, effects=[], **options)

Convert audio files with optional effects and format options:

# Simple format conversion
cysox.convert('input.wav', 'output.mp3')

# With effects
cysox.convert('input.wav', 'output.wav', effects=[
    fx.Volume(db=3),
    fx.Bass(gain=5),
    fx.Reverb(),
])

# With format options
cysox.convert('input.wav', 'output.wav',
    sample_rate=48000,
    channels=1,
    bits=24,
)

cysox.stream(path, chunk_size=8192) -> Iterator[memoryview]

Stream audio samples for processing:

import numpy as np

for chunk in cysox.stream('large.wav', chunk_size=8192):
    arr = np.frombuffer(chunk, dtype=np.int32)
    process(arr)

cysox.play(path, effects=[])

Play audio to the default audio device:

cysox.play('audio.wav')
cysox.play('audio.wav', effects=[fx.Volume(db=-6), fx.Reverb()])

cysox.concat(inputs, output)

Concatenate multiple audio files:

cysox.concat(['intro.wav', 'main.wav', 'outro.wav'], 'full.wav')

All input files must have the same sample rate and channel count.

Effects Module

The cysox.fx module provides 27 base effect classes and 53 composite presets:

Volume & Dynamics

fx.Volume(db=3)                    # Adjust volume in dB
fx.Gain(db=6)                      # Apply gain
fx.Normalize(level=-3)             # Normalize to target level

Equalization

fx.Bass(gain=5, frequency=100)     # Boost/cut bass
fx.Treble(gain=-2, frequency=3000) # Boost/cut treble
fx.Equalizer(frequency=1000, width=1.0, gain=3)

Filters

fx.HighPass(frequency=200)         # Remove low frequencies
fx.LowPass(frequency=8000)         # Remove high frequencies
fx.BandPass(frequency=1000, width=100)
fx.BandReject(frequency=60, width=10)  # Notch filter

Spatial & Reverb

fx.Reverb(reverberance=50, room_scale=100)
fx.Echo(gain_in=0.8, gain_out=0.9, delays=[100], decays=[0.5])
fx.Chorus()
fx.Flanger()

Time-Based

fx.Trim(start=1.0, end=5.0)        # Extract portion
fx.Pad(before=0.5, after=1.0)      # Add silence
fx.Speed(factor=1.5)               # Change speed (affects pitch)
fx.Tempo(factor=1.5)               # Change tempo (preserves pitch)
fx.Pitch(cents=100)                # Shift pitch (preserves tempo)
fx.Reverse()                       # Reverse audio
fx.Fade(fade_in=0.5, fade_out=1.0) # Fade in/out
fx.Repeat(count=3)                 # Repeat audio
fx.Silence(threshold=-48)          # Remove silence by amplitude

Conversion

fx.Rate(sample_rate=48000)         # Resample
fx.Channels(channels=1)            # Change channel count
fx.Remix(mix=["1,2"])              # Custom channel mixing
fx.Dither()                        # Add dither

Composite Effects

Create reusable effect combinations:

from cysox.fx import CompositeEffect, HighPass, LowPass, Reverb, Volume

class TelephoneEffect(CompositeEffect):
    """Simulate telephone audio quality."""

    @property
    def effects(self):
        return [
            HighPass(frequency=300),
            LowPass(frequency=3400),
            Volume(db=-3),
        ]

# Use like any other effect
cysox.convert('input.wav', 'output.wav', effects=[TelephoneEffect()])

Effect Presets

The library includes 54 ready-to-use composite effect presets organized by category:

Voice Effects

fx.Chipmunk(intensity=1.8)         # High-pitched voice
fx.DeepVoice(intensity=0.6)        # Low, slowed voice
fx.Robot(intensity=70)             # Metallic robotic voice
fx.HauntedVoice(pitch_shift=5)     # Spooky ghost effect
fx.VocalClarity(presence_boost=4)  # Enhanced vocal presence
fx.Whisper()                       # Intimate whisper effect

Lo-Fi Effects

fx.Telephone(sample_rate=8000)     # Classic telephone sound
fx.AMRadio()                       # AM radio broadcast
fx.Megaphone(volume_boost=6)       # Bullhorn effect
fx.Underwater(depth=500)           # Submerged/muffled sound
fx.VinylWarmth(bass_boost=3)       # Warm vinyl aesthetic
fx.LoFiHipHop(warmth=4)            # Lo-fi hip hop style
fx.Cassette()                      # Cassette tape degradation

Spatial Effects

fx.SmallRoom(wetness=30)           # Intimate room reverb
fx.LargeHall(size=100, decay=70)   # Concert hall ambience
fx.Cathedral()                     # Church reverb
fx.Bathroom()                      # Tiled room reverb
fx.Stadium()                       # Arena with echo

Broadcast Effects

fx.Podcast()                       # Voice cleanup + presence
fx.RadioDJ(presence=4)             # Punchy broadcast voice
fx.Voiceover()                     # Professional VO processing
fx.Intercom()                      # PA system effect
fx.WalkieTalkie()                  # Two-way radio

Musical Effects

fx.EightiesChorus(depth=4)         # Classic 80s chorus
fx.DreamyPad()                     # Ethereal ambient texture
fx.SlowedReverb(slow_factor=0.85)  # Slowed + reverb aesthetic
fx.SlapbackEcho(delay_ms=120)      # Rockabilly short delay
fx.DubDelay(tempo_ms=375)          # Rhythmic dub delays
fx.JetFlanger()                    # Extreme flanger sweep
fx.ShoegazeWash()                  # Heavy reverb/chorus wash

Drum Loop Effects

fx.HalfTime(preserve_pitch=True)   # Slow to half speed
fx.DoubleTime(preserve_pitch=True) # Speed up to double
fx.DrumPunch(punch=4, attack=3)    # Enhance punch and attack
fx.DrumCrisp(brightness=4)         # Crisp, bright drums
fx.DrumFat(fatness=5)              # Thick, heavy drums
fx.Breakbeat()                     # Classic breakbeat processing
fx.VintageBreak()                  # Lo-fi sampled break sound
fx.DrumRoom(room_size=40)          # Natural room ambience
fx.GatedReverb()                   # 80s gated reverb
fx.DrumSlice(start=0, duration=0.5)# Extract a segment
fx.ReverseCymbal(fade_duration=0.5)# Reverse riser effect
fx.LoopReady()                     # Prepare for seamless looping

Mastering Effects

fx.BroadcastLimiter(target_level=-1)  # Broadcast-ready limiting
fx.WarmMaster(warmth=1.5)             # Warm mastering preset
fx.BrightMaster(air=2)                # Bright/airy mastering
fx.LoudnessMaster(target_level=-0.3)  # Maximum loudness

Cleanup Effects

fx.RemoveRumble(cutoff=60)         # High-pass for rumble
fx.RemoveHiss(cutoff=12000)        # Low-pass for tape hiss
fx.RemoveHum(frequency=60)         # Notch filter for hum (50/60Hz)
fx.CleanVoice()                    # Basic voice cleanup
fx.TapeRestoration()               # Restore tape recordings

Transition Effects

fx.FadeInOut(fade_in_secs=0.3, fade_out_secs=0.3)
fx.CrossfadeReady(fade_duration=0.3)

Chaining Presets

Presets can be combined with each other and base effects:

cysox.convert('input.wav', 'output.wav', effects=[
    fx.RemoveRumble(),      # Cleanup first
    fx.VinylWarmth(),       # Apply lo-fi aesthetic
    fx.SmallRoom(),         # Add room ambience
    fx.WarmMaster(),        # Final mastering
])

Drum Loop Slicing

cysox provides utilities for slicing drum loops and creating stutter effects.

cysox.slice_loop() - Split Loops into Segments

Split an audio file into multiple segment files:

import cysox
from cysox import fx

# Slice into equal parts
slices = cysox.slice_loop('drums.wav', 'output_dir/', slices=8)
# Creates: output_dir/drums_slice_000.wav through drums_slice_007.wav

# Slice by BPM (one beat per slice)
slices = cysox.slice_loop('drums.wav', 'output_dir/', bpm=120, beats_per_slice=1)

# Slice with effects applied to each segment
slices = cysox.slice_loop('drums.wav', 'output_dir/',
    slices=8,
    effects=[fx.DrumPunch()]
)

Parameters:

  • path: Input audio file
  • output_dir: Directory for slice files (created if needed)
  • slices: Number of equal slices (default: 4)
  • bpm: Calculate slice duration from BPM (overrides slices)
  • beats_per_slice: Beats per slice when using BPM (default: 1)
  • beat_duration: Explicit duration per slice in seconds
  • threshold: Onset detection threshold 0.0-1.0 (enables automatic transient slicing)
  • sensitivity: Onset detection sensitivity 1.0-3.0 (default: 1.5)
  • onset_method: Detection method - 'hfc', 'flux', 'energy', 'complex', or 'superflux'
  • output_format: Output format (default: "wav")
  • effects: Effects to apply to each slice

Returns: List of created file paths

Automatic Transient Slicing

Slice loops automatically at detected transients (drum hits, etc.):

# Slice at detected onsets with default sensitivity
slices = cysox.slice_loop('drums.wav', 'output_dir/', threshold=0.3)

# More sensitive detection (catches subtle hits)
slices = cysox.slice_loop('drums.wav', 'output_dir/',
    threshold=0.2,
    sensitivity=1.2
)

# Use different detection method
slices = cysox.slice_loop('drums.wav', 'output_dir/',
    threshold=0.3,
    onset_method='flux'  # Good for tonal changes
)

cysox.onset - Direct Onset Detection

For more control, use the onset detection module directly:

from cysox import onset

# Detect onsets in a file
onsets = onset.detect('drums.wav', threshold=0.3)
print(f"Found {len(onsets)} transients")
for t in onsets:
    print(f"  {t:.3f}s")

# With custom parameters
onsets = onset.detect('drums.wav',
    threshold=0.3,      # Detection threshold (0.0-1.0)
    sensitivity=1.5,    # Peak picking sensitivity (1.0-3.0)
    min_spacing=0.05,   # Min time between onsets (seconds)
    method='hfc'        # 'hfc', 'flux', 'energy', 'complex', or 'superflux'
)

Detection Methods:

  • hfc (default) - High-Frequency Content

    • Weights frequency bins by their index, emphasizing high frequencies
    • High frequencies are prominent in transient attacks (the "click" of a drum hit)
    • Best for: drums, percussion, plucked instruments
    • Fast and reliable for most percussive material
  • flux - Spectral Flux

    • Measures the change in spectral energy between consecutive frames
    • Detects when the frequency content changes significantly
    • Best for: mixed material, melodic instruments, detecting note changes
    • Good all-around choice when HFC misses softer onsets
  • energy - Energy-based

    • Simply measures the RMS energy (loudness) of each frame
    • Fastest method, minimal computation
    • Best for: very clean recordings, isolated drums, quick processing
    • May miss onsets that are spectrally distinct but similar in volume
  • complex - Complex Domain

    • Analyzes both magnitude AND phase of the spectrum
    • Detects deviations from expected phase trajectories
    • Best for: maximum accuracy, subtle onsets, research applications
    • Slowest method but catches onsets other methods miss
  • superflux - Superflux (Boeck & Widmer, DAFx 2013)

    • Mel-scaled spectral flux with vibrato suppression
    • Maximum filter along frequency axis to reject false onsets from frequency modulation
    • Backtracking from peaks to nearest local minimum for precise transient placement
    • Best for: polyphonic material, vibrato-heavy sources, maximum precision

Understanding threshold vs sensitivity:

threshold (0.0-1.0) and sensitivity (1.0-3.0) control different stages:

  • threshold - Global minimum floor

    • Sets the absolute minimum level a peak must reach
    • Applied to the normalized detection function (0-1 scale)
    • Lower values = more sensitive, catches quieter transients
    • threshold=0.3 means peaks must reach at least 30% of max energy
    • Think of it as: "ignore everything below this level"
  • sensitivity - Adaptive peak picking strictness

    • Controls how much a peak must exceed the local average
    • Uses a moving median filter to compute the local baseline
    • Higher values = stricter, only picks prominent peaks
    • sensitivity=1.5 means a peak must be 1.5x the local median
    • Think of it as: "how much must a peak stand out from neighbors"

Typical combinations:

  • Drums with clear hits: threshold=0.3, sensitivity=1.5 (defaults)
  • Subtle transients: threshold=0.2, sensitivity=1.2
  • Only loud hits: threshold=0.5, sensitivity=2.0

cysox.stutter() - Create Stutter Effects

Extract a segment and repeat it:

# Basic stutter: 8x repeat of first 1/8 note at 120 BPM
cysox.stutter('drums.wav', 'stutter.wav',
    segment_duration=0.125,  # 1/8 note at 120 BPM
    repeats=8
)

# Stutter from a specific position (e.g., the snare hit)
cysox.stutter('drums.wav', 'snare_stutter.wav',
    segment_start=0.5,       # Start at 0.5 seconds
    segment_duration=0.125,
    repeats=4
)

# Stutter with effects
cysox.stutter('drums.wav', 'stutter_punchy.wav',
    segment_duration=0.25,
    repeats=4,
    effects=[fx.DrumPunch(), fx.DrumRoom()]
)

Parameters:

  • path: Input audio file
  • output_path: Output file path
  • segment_start: Start position in seconds (default: 0)
  • segment_duration: Length of segment in seconds (default: 0.125)
  • repeats: Total times segment plays (default: 8)
  • effects: Effects to apply after stuttering

Practical Examples

Chop an Amen Break

import cysox
from cysox import fx

# Get loop info
info = cysox.info('amen.wav')
print(f"Duration: {info['duration']:.3f}s")

# Assuming 2-bar loop at 175 BPM
bpm = 175

# Slice into individual beats
slices = cysox.slice_loop('amen.wav', 'amen_beats/', bpm=bpm)
print(f"Created {len(slices)} beat slices")

# Slice into 16th notes with breakbeat processing
slices = cysox.slice_loop('amen.wav', 'amen_16ths/',
    slices=16,
    effects=[fx.Breakbeat()]
)

# Create kick stutter fill
cysox.stutter('amen.wav', 'kick_fill.wav',
    segment_start=0,
    segment_duration=info['duration'] / 16,  # First 16th note
    repeats=16
)

Process Drum Loops

# Half-time for slow, heavy feel
cysox.convert('drums.wav', 'halftime.wav', effects=[fx.HalfTime()])

# Lo-fi vintage break sound
cysox.convert('drums.wav', 'vintage.wav', effects=[
    fx.VintageBreak(),
    fx.DrumRoom(wetness=20)
])

# 80s gated reverb snare
cysox.convert('drums.wav', 'gated.wav', effects=[fx.GatedReverb()])

# Full processing chain
cysox.convert('drums.wav', 'processed.wav', effects=[
    fx.RemoveRumble(cutoff=40),
    fx.DrumPunch(punch=5, attack=4),
    fx.DrumRoom(room_size=30, wetness=20),
    fx.BroadcastLimiter(),
])

Sample Processing

cysox includes sample processing utilities ported from AudioHit for preparing audio samples for software and hardware samplers.

cysox.auto_trim() - Trim Silence

Detect and remove silence from the beginning and end of audio based on amplitude threshold:

# Basic silence trimming
cysox.auto_trim('raw.wav', 'trimmed.wav')

# Custom threshold (less sensitive)
cysox.auto_trim('raw.wav', 'trimmed.wav', threshold_db=-36)

# With fade in/out (milliseconds)
cysox.auto_trim('raw.wav', 'trimmed.wav', fade_in=10, fade_out=50)

# Speed up after trimming
cysox.auto_trim('raw.wav', 'trimmed.wav', speed_factor=2.0)

# With additional effects
cysox.auto_trim('raw.wav', 'trimmed.wav', effects=[fx.Normalize()])

Parameters:

  • path: Input audio file
  • output_path: Output audio file
  • threshold_db: Amplitude threshold in dB (default: -48dB)
  • min_silence: Minimum non-silence duration in seconds (default: 0.1)
  • fade_in: Fade-in duration in milliseconds (default: 0)
  • fade_out: Fade-out duration in milliseconds (default: 0)
  • speed_factor: Playback speed multiplier (default: None)
  • effects: Additional effects to apply after trimming

cysox.split_by_silence() - Split at Silence Gaps

Split a continuous recording into separate one-shot samples at silence boundaries:

# Split at default threshold
segments = cysox.split_by_silence('recording.wav', 'one_shots/')

# Custom detection parameters
segments = cysox.split_by_silence('recording.wav', 'one_shots/',
    threshold_db=-36,     # Less sensitive
    min_silence=0.5,      # Require 500ms of silence to split
    min_segment=0.25,     # Discard segments shorter than 250ms
)

# With fades and effects on each segment
segments = cysox.split_by_silence('recording.wav', 'one_shots/',
    fade_in=5, fade_out=20,
    effects=[fx.Normalize()],
)

Parameters:

  • path: Input audio file
  • output_dir: Directory for segment files (created if needed)
  • threshold_db: Amplitude threshold in dB (default: -48dB)
  • min_silence: Minimum silence duration to trigger split, in seconds (default: 0.25)
  • min_segment: Minimum segment duration, in seconds (default: 0.25)
  • fade_in: Fade-in per segment in milliseconds (default: 0)
  • fade_out: Fade-out per segment in milliseconds (default: 0)
  • speed_factor: Playback speed multiplier (default: None)
  • output_format: Output format (default: "wav")
  • effects: Effects to apply to each segment

Returns: List of created file paths

cysox.pitch_scale() - Generate Chromatic Pitch Variants

Create multiple pitch-shifted copies of a sample at semitone intervals, useful for building playable melodic sample libraries:

# Generate one octave (12 semitones) of chromatic variations
files = cysox.pitch_scale('c3_piano.wav', 'scale/')
# Creates: scale/c3_piano_pitch_+0.wav through scale/c3_piano_pitch_+11.wav

# Two octaves starting from one octave below
files = cysox.pitch_scale('sample.wav', 'scale/',
    semitones=24, offset=-12)

# With effects on each copy
files = cysox.pitch_scale('sample.wav', 'scale/',
    semitones=12, effects=[fx.Normalize()])

Parameters:

  • path: Input audio file
  • output_dir: Directory for pitch-shifted files (created if needed)
  • semitones: Number of copies to generate (default: 12)
  • offset: Starting semitone offset (default: 0)
  • output_format: Output format (default: "wav")
  • effects: Effects to apply to each copy after pitch shifting

Returns: List of created file paths

cysox.batch() - Batch Process Directories

Process all audio files in a directory tree:

# Convert a folder to mono 22050Hz
processed = cysox.batch('samples/', 'processed/',
    sample_rate=22050, channels=1)

# Apply effects to all files
processed = cysox.batch('raw/', 'ready/',
    effects=[fx.Normalize(), fx.Fade(fade_in=0.01)])

# Convert format, non-recursive
processed = cysox.batch('input/', 'output/',
    output_format='flac', recursive=False)

# With progress callback
cysox.batch('raw/', 'done/',
    on_file=lambda i, o: print(f"  {i} -> {o}"))

Parameters:

  • input_dir: Directory containing audio files
  • output_dir: Directory for processed files (created if needed)
  • effects: Effects to apply to each file
  • sample_rate: Target sample rate in Hz
  • channels: Target number of channels
  • bits: Target bits per sample
  • recursive: Process subdirectories (default: True)
  • output_format: Output format (None keeps original)
  • on_file: Callback called after each file (input_path, output_path)

Returns: List of processed output file paths

Low-Level API

For advanced use cases, access the full libsox bindings:

from cysox import sox

# Manual initialization (high-level API handles this automatically)
sox.init()

# Open files
input_fmt = sox.Format('input.wav')
output_fmt = sox.Format('output.wav', signal=input_fmt.signal, mode='w')

# Build effects chain
chain = sox.EffectsChain(input_fmt.encoding, output_fmt.encoding)

e = sox.Effect(sox.find_effect("input"))
e.set_options([input_fmt])
chain.add_effect(e, input_fmt.signal, input_fmt.signal)

e = sox.Effect(sox.find_effect("vol"))
e.set_options(["3dB"])
chain.add_effect(e, input_fmt.signal, input_fmt.signal)

e = sox.Effect(sox.find_effect("output"))
e.set_options([output_fmt])
chain.add_effect(e, input_fmt.signal, input_fmt.signal)

# Process
chain.flow_effects()

# Cleanup
input_fmt.close()
output_fmt.close()
sox.quit()

Building from Source

macOS

brew install sox libsndfile mad libpng flac lame mpg123 libogg opus opusfile libvorbis
make
make test

Linux

sudo apt-get install libsox-dev libsndfile1-dev pkg-config
make
make test

Status

Comprehensive test suite covering all functionality. All libsox C examples ported to Python (effects chains, waveform analysis, trim, concatenation, format conversion).

Known Issues

  • Memory I/O: libsox memory I/O functions have platform issues (tests skipped)
  • Init/Quit Cycles: Use high-level API to avoid init/quit issues (handled automatically)

See KNOWN_LIMITATIONS.md for details.

Platform Support

  • macOS: Full support
  • Linux: Full support
  • Windows: Placeholder (contributions welcome)

Building Documentation

pip install mkdocs-material
make docs          # Build static site
make docs-serve    # Live preview at http://localhost:8000

License

MIT

KissFFT (vendored in vendor/kissfft/) is BSD-3-Clause licensed. See vendor/kissfft/COPYING.

Project details


Download files

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

Source Distribution

cysox-0.1.11.tar.gz (2.3 MB view details)

Uploaded Source

Built Distributions

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

cysox-0.1.11-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (856.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (830.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp314-cp314-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

cysox-0.1.11-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (854.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (825.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp313-cp313-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

cysox-0.1.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (854.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (825.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp312-cp312-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

cysox-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (864.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (842.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp311-cp311-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

cysox-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (862.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (839.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp310-cp310-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

cysox-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (863.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

cysox-0.1.11-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (840.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

cysox-0.1.11-cp39-cp39-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file cysox-0.1.11.tar.gz.

File metadata

  • Download URL: cysox-0.1.11.tar.gz
  • Upload date:
  • Size: 2.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for cysox-0.1.11.tar.gz
Algorithm Hash digest
SHA256 57f5e9c741986edd0b37aadb1fdde30d29da735bd00f174127f02eb50e73459d
MD5 1d0c089312b29678f315848529310e48
BLAKE2b-256 94282c832e2499a851a58890877f9be776dad6cc32f1cd5eec4aaccf64a85ffc

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1ea85f5902b0760bf4f374df0a0a26ecdc768ce8f346eeca7e85cb47ff0e7586
MD5 fae6311f4152dcc24d1001e112e241ea
BLAKE2b-256 cfb2f9cfbf7b8dc48006a7569c322da387179c243a353f6f01ee1a1c613ab8aa

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0f8e190c4087d072f15f84a382fbe054274ed42316634ed22ccd43ae849b1de7
MD5 c51e26ad4763eb8d1e3e9c80fe78f29b
BLAKE2b-256 432fec064117a195c76230a0cd2a1962eeab128689bfb5e7853615e8080bdf57

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd96517d277268b7ffc11bbbbd4f08b3d7666ab4e2155d37e1064bb8cfd89e85
MD5 e686b98ce7fcdfde0dfd548e1e80ad2e
BLAKE2b-256 bbf2c6d866be65086394bc2a6da149db5f0307e347d41a4a165c58d799c8707a

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8b2b1944266c2ecc79a35f8f3dcbd5b07ef031ea7c7bab8e5eca88fdd0e1bb13
MD5 76ad218d057c1b2c073563869ef938e1
BLAKE2b-256 628b2dfe9f0ca7090e37f2edf6ac0e3ed4529cadc85ec993166bd5c6980bd1e7

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a8da890014cff43722e9d515ece135f8ee5af0b6ded8b00cfd8c55fdd0d44fd8
MD5 4cf60482cfaa143b852c08a710dacdb6
BLAKE2b-256 1344cfa05fb97c1482117efa0b38d4d467dc1135e719f1fcb46b5ad1f9b46670

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e1e3158334083a60b49e71f4c90761f7f948ca94afc1dfe71a82c8d5372cec3d
MD5 a322c01e423d4c0d2e122b6b7b6615c2
BLAKE2b-256 220f17878fd77204dea74d159922a6e522472ac3afc3c17b9e9e397865931f1c

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 914bd64ac8f5d7b7bf70e0440646c269c2ca39a1c40e936f1c0e0f359130486b
MD5 227525e9f831b1ee49515a5e78c8075e
BLAKE2b-256 581b41d6c5c4d4a05da5b59031b1fdad3989ae2bf3dc05ab0e112abf2c045f76

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 87f80aa7a61f58e58a450d7e10f5d166e4a7b488d12248667fc90426fe359a0d
MD5 f0a00937ad2a3c274fed592eeb14b54c
BLAKE2b-256 2afb929fbe7e5de17650db1c2bcf320af8189ccc491a8a9d073eca4b4e413553

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66ff19e73d4c776495ee37228054fa2fc5a6913e7c847c516fbbcefbd6ceefe0
MD5 7dcd1c4ec465e26eee28a81de1849077
BLAKE2b-256 7addc98723efd0a84e3a5eba39df00d22f4a51125778b5e1691b3389f6ae1135

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d789a48f7206774094acc49f87866ab03c3b8501786d8f6c6642045eb12906ef
MD5 b0befdc8aa6bff987976b9d9a8cec848
BLAKE2b-256 8400f8a2fb0ce0af9043b5d16e7e4af25f24757f9dc1eac2e30dbab5fcb92ba7

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 552f3df79395c456b579c9cceea6a0a4adb1aba166a48d0bc246d502156f0858
MD5 c89d7752573a49e9090f2667befc22a9
BLAKE2b-256 917905cab2befdec939d9b4193157eef230c406241f71d1e69b3ddf0afd2a14b

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 537392e361d3b515d20b93b530619960444abfe7a4945635d3d9db424cf213bd
MD5 1dd5d6e2d97b3063ffba9653b01b5492
BLAKE2b-256 5b69908078f0660929ac8565cd7b57894e05bc19c5f4c88f75ccb89c6e4957c4

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0b43f035426d7016c5d6b67e485f9075570cebaffc52666d3fc01d1c6beca349
MD5 7738f75834b0a1969478e0421bf36d3f
BLAKE2b-256 19023855a7da7364ccb6dcfa39d5199f81dc05b1bb40c582773a930993327186

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 61206dbce466dd7e9122fc46f97ab0c65d1c5fd7d567c9aac01abe7cc4be6148
MD5 8c044c971881285688ef0872b1dbe7da
BLAKE2b-256 31b5b7f6031955cc4f75e7c13c83839f22b6e37eab6659caf38085590fd40868

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 62b744ebf8609d89e396879bfd6a966d59538b051cfe8244bc063cfae8353973
MD5 85a7eeb001abe358abaf96908f287c73
BLAKE2b-256 037a6f933b7389bd243f132732d406440d668eb47c93add65e20df3f11c17528

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 eb7e56f46f6fa1d1bcaeb9374f4326ac647b8878a0e7450dfdb0296ef14264af
MD5 08f54a365ff47d4f25579603c65c783a
BLAKE2b-256 a622f2330639e8251296a096c52951dbbdf66bbcdfc5f68688b4b122aa135ed3

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 844e5cf2018714ed59daa1249e02306bb9fa93e8a2147327cbbe01df8a6ac28e
MD5 b53d97852f68ce54aecae69439f8ebe7
BLAKE2b-256 567b779c0d5954e4b58ffdea6a7ddb06dd6548f0345bbc238015df507ceb0c65

See more details on using hashes here.

File details

Details for the file cysox-0.1.11-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for cysox-0.1.11-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 90fa64d46a5e63e5f5964001e7255e4c3ef0e034886b62ba9d9b7160ede9da47
MD5 19926c02395e89e72d73a9f89921bfed
BLAKE2b-256 ccb82f9e2d052d46f8acaaa0e85520ed283c7d9ad33033db5d99e1f4c18f6d52

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page