Skip to main content

A Pythonic audio processing library wrapping libsox

Project description

cysox

PyPI Python License: MIT

A Pythonic audio processing library which uses cython to wrap libsox.

Features

  • Simple API: Convert, analyze, and play audio with one-liners
  • Typed Effects: 28 base effect classes with IDE autocomplete and validation
  • 54 Effect Presets: Ready-to-use composite effects for voice, lo-fi, drums, mastering, and more
  • Drum Loop Tools: Slice loops by BPM, create stutter effects, apply beat-synced processing
  • High Performance: Direct C bindings through Cython
  • 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

# 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

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) -> dict

Get audio file metadata:

info = cysox.info('audio.wav')
# Returns: {
#     'path': 'audio.wav',
#     'format': 'wav',
#     'duration': 11.5,
#     'sample_rate': 44100,
#     'channels': 2,
#     'bits_per_sample': 16,
#     'samples': 507150,
#     'encoding': 'signed-integer',
# }

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 28 base effect classes and 54 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

Conversion

fx.Rate(sample_rate=48000)         # Resample
fx.Channels(channels=1)            # Change channel count
fx.Remix(out_spec=[[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', or 'complex'
  • 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', or 'complex'
)

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

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(),
])

## Low-Level API

For advanced use cases, access the full libsox bindings:

```python
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 sphinx furo myst-parser
make docs
make docs-serve  # http://localhost:8000

License

MIT

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.7.tar.gz (1.6 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.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (820.0 kB view details)

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

cysox-0.1.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (795.2 kB view details)

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

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

Uploaded CPython 3.14macOS 11.0+ ARM64

cysox-0.1.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (817.6 kB view details)

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

cysox-0.1.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (790.9 kB view details)

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

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

Uploaded CPython 3.13macOS 11.0+ ARM64

cysox-0.1.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (817.8 kB view details)

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

cysox-0.1.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (790.8 kB view details)

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

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

Uploaded CPython 3.12macOS 11.0+ ARM64

cysox-0.1.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (824.5 kB view details)

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

cysox-0.1.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (803.2 kB view details)

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

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

Uploaded CPython 3.11macOS 11.0+ ARM64

cysox-0.1.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (820.6 kB view details)

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

cysox-0.1.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (801.1 kB view details)

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

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

Uploaded CPython 3.10macOS 11.0+ ARM64

cysox-0.1.7-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (821.2 kB view details)

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

cysox-0.1.7-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (801.4 kB view details)

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

cysox-0.1.7-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.7.tar.gz.

File metadata

  • Download URL: cysox-0.1.7.tar.gz
  • Upload date:
  • Size: 1.6 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.7.tar.gz
Algorithm Hash digest
SHA256 2963c1179f1415606ccbc2fd4cfdc00a7f9fd50696ad6d553d6ee175f9662d35
MD5 8254269eae31a6f8036978f7b7680076
BLAKE2b-256 d4ebef42b668d8c24349296f90cff3af0f0d8951dd3a665cec366a0214bc7ccf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4790df27e71c4493302ed46de2f953db7004ffff3628d05c17efff987a653bf5
MD5 d16dc688609ea3b1499b374d7b8aadd7
BLAKE2b-256 0f02b9da3b216e51f80d39634169204b82bcba2d777f7e4c847cb6c7194692dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 66d28eea6cd13fbbaf1b04511401141394b9ef75781adaff1b85cc049b2f5e31
MD5 42cbe984a115cd0172704c5f77b08cc3
BLAKE2b-256 1950d8bcbe6aecd53b8c1775606eb0b7723d542d5140abb41fe7dffc2b85b733

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e57b13b7400f7b558ca54d09840e8b7a4c684425f83bfb044d9ae58ef3ab9fff
MD5 ae732331ba61659fdfc846339e61f688
BLAKE2b-256 1017f03c27c2cc7690ed3d9cfbfc9949f0eb18c3999659f990e36142b277b2f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30a7c9288a99ebea362e5eaa7765f629c2c4a42ccc98b2d451751bd7636cdb4c
MD5 3693a648e903276bf045d460a00f1296
BLAKE2b-256 98ec531624997996e106845ea4616094fed339539d4fc901dd4ddf8387aa6ef5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bb2b35fec127fb05e6012e9d4af4180a93c78d5f8f16d324a83686b2f0396f86
MD5 3e2acd7ebce59967cba0679ad7a9a76a
BLAKE2b-256 8c4ae155e8026b960d295fb74f7d2ddb67d1e96d8f502142af1c4e189ba612b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c1a0be3ba2495392f17f31c6a4da21186a1d66603098dab35e61788e2354c95a
MD5 f69dfb13a7da1680e9ebd3ea90241597
BLAKE2b-256 cfcf12a1e0d4cf158354585164728b4c9a2de23575960343123d3842005319d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3c240d0229f6cf6c7af38390a7a9d2276c02659dd38b82a6356df9650ff69705
MD5 4f5380f0b42a92ebb56f13e80c660cf7
BLAKE2b-256 4f6633b0cf0b482abd77e8cad69aed2fcff1da2cc87b8572cbd189439974ef33

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1f531065ae0f3ceb0c87726b7fc25b47d7976d081b1043c3222cd8f5767b6f80
MD5 b908fec0874eea6d5927054834b70e2f
BLAKE2b-256 77598ef5a73c71bc7b3867712575e183de130bb51fdb1b20d6c4b4f0d7437532

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d47fb257da0495d5958d4fbd8ee6b73faa5c11722ea32be5d05393da1ef30cf0
MD5 f8d5d1ddd286cf9ada38cafc97174dc3
BLAKE2b-256 a3c35c8e99114ef18377ad6e774ea4e365412832db3f52b96b8edc30297f6e21

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 13a891b088ec0f8c54aa5fbe8f50689084960c0966e5662b6bb655a88cb4f7a3
MD5 2760e29a94ca196f601f5c3a0d0a1509
BLAKE2b-256 96ccdc42353d063230e942e9738a625dae6d54adb4de6b473c84d2a152d2135a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b44f5145d5e46dbe9d40ee779d7721e3fa94bd56797ea755518ad3e2a30f5a60
MD5 a411f28313117f84cef9f02948dba031
BLAKE2b-256 215a40dd412ebcac07012675f4f23d16368e50277d2d35bd91dc075532b3b9e8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 14a0b0dc8b7718759ef78ec38011a8691cbc64a48efb6d219edf9693439d02b1
MD5 0d71bc71d2c4c9907472ddb103701798
BLAKE2b-256 111eec8aa557b7b24ee7386f21f94427d173b8600f6e80780031b0574538dabf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 66bd42acbb0608d30a475a2756f48df4d8532aa05d0cc81e6220b8ca49b64178
MD5 364fdf12f1eb8cacab54648f67f445df
BLAKE2b-256 e066d37f2e9ebdb09a19aa5ae075085d501fd7d792d93d294f6568b0413df6e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 05e8aa9306af48e02ca8631a4a527ec8e08889460df7e8bd8b7931302c26c208
MD5 c0e47ae2eee5428f50cd4e1fcd3c0c85
BLAKE2b-256 534999e23454f7673b7249c99550041c49cdc69388ff85cdd8f44e0d5cfe6865

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0f48937007dece0766f37bbcad5aa9a1e68a626851ba0b02cc017e260cfbdaae
MD5 b9bf817ca4bfffc200de2d8f83db5dc8
BLAKE2b-256 6bfe3e43ac6e3e10bf9e0e1370b81669ec66a59978a6bf00210eedbe2571fe73

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7c3b0e0e7230b1de45725fdeb17c970f74b72a10372728f59500d322b42d6b5e
MD5 a67b808fe571e752206912bbd2c2c48d
BLAKE2b-256 9f09bf600a599ab058090fa527fb9c6442c6571ff82c8ab140ea9a11ba509cc0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 78604217e4b43cb891243c4cef18ee14863db5d196191fe9cf09496567bbb3bc
MD5 9a0beebeb0acdddc69f66fb3ec1b4f0c
BLAKE2b-256 f6581b9248dfc38f86d2e2dfd443b38a9769f939060eb51899d99e985609137d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cysox-0.1.7-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 255ae575f7701f94122e82170fd40b1b020a68ffe4627c0858aa6dac93f4931d
MD5 06e508a51d52f49919ebc4390559ed45
BLAKE2b-256 871812441bbc9cf8556025006be4c083cfc22922d47d4ea82bffdc4d758abb0a

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