High-performance Python DSP toolkit built on C++ libraries via nanobind
Project description
cydsp
High-performance Python DSP toolkit built on C++ libraries via nanobind. All processing uses float32 in a planar [channels, frames] layout with block-based APIs that accept and return AudioBuffer objects.
Backends
| Library | License | What it provides |
|---|---|---|
| signalsmith-dsp | MIT | Filters, FFT, delay, envelopes, spectral processing, rates, mix |
| DaisySP | MIT | Oscillators, effects, dynamics, drums, physical modeling, noise |
| STK | MIT | Physical modeling instruments, generators, filters, delays, effects |
| madronalib | MIT | FDN reverbs, resampling, generators, projections, windows |
| HISSTools Library | BSD-3 | Convolution, spectral processing, statistical analysis, windows |
| CHOC | ISC | FLAC codec (read/write) |
Requirements
- Python >= 3.10
- numpy
- C++17 compiler
- CMake >= 3.15
Install
pip install cydsp
Or if you prefer to build from source (requires uv and cmake):
git clone https://github.com/shakfu/cydsp.git
cd cydsp
uv sync # install dependencies + build extension
uv run pytest # run tests
uv build # build wheel
Use make help for additional targets (build, test, lint, format, typecheck, qa, coverage, etc.).
CLI
cydsp ships a command-line interface accessible via cydsp or python -m cydsp.
# File info
cydsp info drums.wav
cydsp info drums.wav --json
# Process with effect chain (single file)
cydsp process input.wav -o output.wav \
-f highpass:cutoff_hz=80 \
-f compress:ratio=4,threshold=-18 \
-f normalize_peak:target_db=-1
# Apply a preset
cydsp process vocals.wav -o out.wav -p vocal_chain
cydsp process input.wav -o out.wav -f lowpass:cutoff_hz=12000 -p master
# Batch mode -- process multiple files to a directory
cydsp process *.wav -O out/ -f lowpass:cutoff_hz=2000
# Dry run -- show chain without reading/writing files
cydsp process input.wav -n -f highpass:cutoff_hz=80 -f compress:ratio=4
# Verbose / quiet
cydsp -v process input.wav -o out.wav -f lowpass:cutoff_hz=1000
cydsp -q process input.wav -o out.wav -p master
# Analyze
cydsp analyze input.wav loudness
cydsp analyze input.wav pitch --fmin=80 --fmax=800
cydsp analyze input.wav onsets --json
cydsp analyze input.wav info
# Synthesize
cydsp synth tone.wav sine --freq=440 --duration=2.0
cydsp synth kick.wav drum --type=analog_bass_drum --freq=60
cydsp synth melody.wav note --instrument=clarinet --freq=440 --duration=1.0
cydsp synth seq.wav sequence --instrument=flute \
--notes='[{"freq":440,"start":0,"dur":0.5},{"freq":554,"start":0.5,"dur":0.5}]'
# Convert
cydsp convert input.wav output.flac
cydsp convert input.wav output.wav --sample-rate=44100 --channels=1 -b 24
# Presets
cydsp preset list
cydsp preset list spatial
cydsp preset info master
cydsp preset apply master input.wav output.wav target_lufs=-16
# Pipe (stdin/stdout streaming)
cat input.wav | cydsp pipe -f lowpass:cutoff_hz=1000 > output.wav
cat input.wav | cydsp pipe -p telephone > output.wav
cydsp pipe -f highpass:cutoff_hz=80 < in.wav | cydsp pipe -f compress:ratio=4 > out.wav
# Benchmark
cydsp benchmark lowpass:cutoff_hz=1000
cydsp benchmark compress:ratio=4,threshold=-20 -n 100 --duration=2.0
cydsp benchmark reverb:preset=hall --channels=2 --json
# List available functions
cydsp list
cydsp list filters
cydsp list effects
Presets
30 built-in presets across 8 categories:
| Category | Presets |
|---|---|
| mastering | master, master_pop, master_hiphop, master_classical, master_edm, master_podcast |
| voice | vocal_chain |
| spatial | room, hall, plate, cathedral, chamber |
| dynamics | gentle_compress, heavy_compress, brick_wall |
| creative | radio, underwater, megaphone, tape_warmth, shimmer, vaporwave, walkie_talkie |
| lofi | telephone, lo_fi, vinyl, 8bit |
| cleanup | dc_remove, de_noise, normalize, normalize_lufs |
Quick start
from cydsp.buffer import AudioBuffer
from cydsp import effects, analysis
# Read, process, write
buf = (
AudioBuffer.from_file("input.wav")
.pipe(effects.highpass, freq=80.0)
.pipe(effects.compress, threshold=-18.0, ratio=4.0)
.pipe(analysis.normalize_lufs, target_lufs=-14.0)
)
buf.write("output.wav")
Modules
cydsp.buffer -- AudioBuffer
The central data type. A 2D float32 array with shape [channels, frames] plus metadata (sample_rate, channel_layout, label).
from cydsp.buffer import AudioBuffer
# Construction
buf = AudioBuffer(np.zeros((2, 44100), dtype=np.float32), sample_rate=44100)
buf = AudioBuffer.from_file("input.wav") # read WAV/FLAC
buf = AudioBuffer.sine(440.0, channels=1, frames=44100, sample_rate=44100)
buf = AudioBuffer.noise(channels=2, frames=44100, sample_rate=44100)
buf = AudioBuffer.zeros(channels=1, frames=1024, sample_rate=44100)
buf = AudioBuffer.impulse(channels=1, frames=1024, sample_rate=44100)
# Properties
buf.channels # number of channels
buf.frames # number of frames
buf.sample_rate # sample rate in Hz
buf.duration # duration in seconds
buf.mono # 1D view (mono buffers only)
buf.channel(0) # 1D view of channel 0
# Channel operations
buf.to_mono("mean") # downmix
buf.to_channels(2) # upmix mono to stereo
AudioBuffer.concat_channels(a, b) # stack channels
# Arithmetic
buf + other # add
buf * 0.5 # scale
buf.gain_db(-6.0) # apply dB gain
# I/O
buf.write("output.wav") # write WAV/FLAC (detected by extension)
buf.write("output.flac", bit_depth=24)
# Pipeline
buf.pipe(effects.lowpass, freq=1000.0)
cydsp.io -- Audio file I/O
Read and write WAV (8/16/24/32-bit PCM) and FLAC (16/24-bit) files. Zero external dependencies for WAV (uses stdlib wave); FLAC uses the CHOC codec.
from cydsp import io
buf = io.read("file.wav") # auto-detect by extension
buf = io.read("file.flac")
io.write("out.wav", buf) # 16-bit default
io.write("out.flac", buf, bit_depth=24)
# Format-specific
buf = io.read_wav("file.wav")
io.write_wav("out.wav", buf, bit_depth=24)
buf = io.read_flac("file.flac")
io.write_flac("out.flac", buf, bit_depth=16)
# Byte-level (for stdin/stdout/pipe workflows)
buf = io.read_wav_bytes(raw_bytes) # parse WAV from bytes
raw = io.write_wav_bytes(buf, bit_depth=16) # serialize to WAV bytes
cydsp.ops -- Core DSP operations
Low-level building blocks: delay, envelopes, FFT, convolution, sample rates, mixing, panning, normalization.
from cydsp import ops
# Delay
ops.delay(buf, delay_samples=100)
ops.delay_varying(buf, delays=delay_curve)
# Envelopes
ops.box_filter(buf, length=64)
ops.box_stack_filter(buf, size=32, layers=4)
ops.peak_hold(buf, length=128)
ops.peak_decay(buf, length=256)
# FFT
spectra = ops.rfft(buf) # forward real FFT
buf = ops.irfft(spectra, size=1024, sample_rate=44100) # inverse
# Convolution
ops.convolve(buf, ir, normalize=True)
# Sample rates
ops.upsample_2x(buf)
ops.oversample_roundtrip(buf)
# Mixing
ops.hadamard(buf) # Hadamard matrix mixing
ops.householder(buf) # Householder reflection
ops.crossfade(buf_a, buf_b, x=0.5)
ops.mix_buffers(a, b, c, gains=[1.0, 0.5, 0.8])
# LFO
lfo_signal = ops.lfo(frames=44100, low=0.0, high=1.0, rate=2.0)
# Normalization
ops.normalize_peak(buf, target_db=-1.0)
ops.trim_silence(buf, threshold_db=-60.0)
# Fades
ops.fade_in(buf, duration_ms=10.0)
ops.fade_out(buf, duration_ms=50.0, curve="exp")
# Panning and stereo
ops.pan(buf, position=0.3) # equal-power pan
ops.mid_side_encode(buf)
ops.mid_side_decode(buf)
ops.stereo_widen(buf, width=1.5)
cydsp.effects -- Filters, effects, dynamics, mastering
52 functions covering signalsmith biquad filters, DaisySP effects/filters/dynamics, composed effects, reverbs, mastering chains, and STK effects.
Biquad filters (signalsmith)
All filter functions take freq in Hz, auto-converted to normalized frequency.
from cydsp import effects
effects.lowpass(buf, freq=1000.0, q=0.707)
effects.highpass(buf, freq=80.0)
effects.bandpass(buf, freq=1000.0, q=2.0)
effects.notch(buf, freq=50.0)
effects.peak(buf, freq=1000.0, gain=2.0, q=1.0)
effects.peak_db(buf, freq=1000.0, db=6.0)
effects.high_shelf(buf, freq=8000.0, gain=1.5)
effects.high_shelf_db(buf, freq=8000.0, db=3.0)
effects.low_shelf(buf, freq=200.0, gain=0.8)
effects.low_shelf_db(buf, freq=200.0, db=-2.0)
effects.allpass(buf, freq=1000.0)
DaisySP effects
effects.autowah(buf, wah=0.5)
effects.chorus(buf, rate=1.0, depth=0.5)
effects.decimator(buf, downsample_factor=0.5, bitcrush_factor=0.5)
effects.flanger(buf, rate=0.2, depth=0.5, feedback=0.5)
effects.overdrive(buf, drive=0.7)
effects.phaser(buf, rate=0.3, depth=0.5, feedback=0.5)
effects.pitch_shift(buf, semitones=12.0)
effects.sample_rate_reduce(buf, factor=0.5)
effects.tremolo(buf, rate=5.0, depth=0.8)
effects.wavefold(buf, gain=2.0)
effects.bitcrush(buf, bits=8)
effects.fold(buf, gain=2.0)
effects.reverb_sc(buf, feedback=0.8, lpfreq=10000.0)
effects.dc_block(buf)
DaisySP filters
effects.svf_lowpass(buf, freq=1000.0, res=0.5)
effects.svf_highpass(buf, freq=200.0, res=0.5)
effects.svf_bandpass(buf, freq=1000.0, res=0.7)
effects.svf_notch(buf, freq=1000.0, res=0.5)
effects.svf_peak(buf, freq=1000.0, res=0.8)
effects.ladder_filter(buf, freq=800.0, res=0.6, mode="lp24")
effects.moog_ladder(buf, freq=1000.0, res=0.7)
effects.tone_lowpass(buf, freq=2000.0)
effects.tone_highpass(buf, freq=100.0)
effects.modal_bandpass(buf, freq=440.0, q=50.0)
effects.comb_filter(buf, freq=500.0, revtime=0.5)
Dynamics
effects.compress(buf, threshold=-20.0, ratio=4.0, attack=0.01, release=0.1)
effects.limit(buf, threshold=-1.0)
Composed effects
effects.saturate(buf, drive=0.7, mode="soft") # soft, hard, or tape
effects.exciter(buf, freq=3000.0, drive=0.4)
effects.de_esser(buf, freq=6000.0, threshold=-20.0)
effects.parallel_compress(buf, mix=0.5, threshold=-24.0, ratio=8.0)
effects.noise_gate(buf, threshold_db=-40.0)
effects.stereo_delay(buf, delay_l=0.25, delay_r=0.375, feedback=0.4, ping_pong=True)
effects.multiband_compress(buf, crossovers=[200.0, 2000.0, 8000.0])
Reverb
effects.reverb(buf, preset="hall", decay=2.0, mix=0.3)
# Presets: room, hall, plate, chamber, cathedral
Mastering and vocal chains
effects.master(buf, target_lufs=-14.0)
effects.vocal_chain(buf, de_ess_freq=6000.0, comp_threshold=-18.0)
STK effects
effects.stk_reverb(buf, algorithm="freeverb", decay=1.5, mix=0.3)
effects.stk_chorus(buf, mod_depth=0.02, mod_freq=1.0, mix=0.5)
effects.stk_echo(buf, delay=0.25, max_delay=1.0, mix=0.5)
cydsp.spectral -- STFT and spectral processing
Short-time Fourier transform, spectral utilities, and spectral transforms.
from cydsp import spectral
# STFT
spec = spectral.stft(buf, window_size=2048, hop_size=512)
buf = spectral.istft(spec)
# Spectral utilities
mag = spectral.magnitude(spec)
ph = spectral.phase(spec)
spec = spectral.from_polar(mag, ph)
spec = spectral.apply_mask(spec, mask)
spec = spectral.spectral_gate(spec, threshold_db=-40.0)
spec = spectral.spectral_emphasis(spec, low_db=-3.0, high_db=3.0)
freq = spectral.bin_freq(bin_index=10, fft_size=2048, sample_rate=44100)
b = spectral.freq_to_bin(freq=1000.0, fft_size=2048, sample_rate=44100)
# Spectral transforms
stretched = spectral.time_stretch(buf, rate=0.5) # half speed
locked = spectral.phase_lock(spec) # identity phase-locking
frozen = spectral.spectral_freeze(buf, frame_index=10) # frozen texture
morphed = spectral.spectral_morph(spec_a, spec_b, x=0.5)
shifted = spectral.pitch_shift_spectral(buf, semitones=5.0)
denoised = spectral.spectral_denoise(buf, noise_frames=10)
# EQ matching
matched = spectral.eq_match(source_buf, target_buf, strength=1.0)
cydsp.synthesis -- Oscillators, noise, drums, physical modeling
Sound generators using DaisySP and STK backends.
from cydsp import synthesis
# Oscillators
synthesis.oscillator(freq=440.0, waveform="saw", frames=44100)
synthesis.fm2(freq=440.0, ratio=2.0, index=1.0, frames=44100)
synthesis.formant_oscillator(freq=440.0, formant_freq=800.0, frames=44100)
synthesis.bl_oscillator(freq=440.0, waveform="saw", frames=44100)
# Noise
synthesis.white_noise(frames=44100, amp=0.5)
synthesis.clocked_noise(freq=1000.0, frames=44100)
synthesis.dust(density=100.0, frames=44100)
# Drums
synthesis.analog_bass_drum(freq=60.0, frames=44100)
synthesis.analog_snare_drum(freq=200.0, frames=44100)
synthesis.hihat(freq=3000.0, frames=44100)
synthesis.synthetic_bass_drum(freq=60.0, frames=44100)
synthesis.synthetic_snare_drum(freq=200.0, frames=44100)
# Physical modeling
synthesis.karplus_strong(buf, freq=440.0, brightness=0.5, damping=0.5)
synthesis.modal_voice(freq=440.0, frames=44100)
synthesis.string_voice(freq=440.0, frames=44100)
synthesis.pluck(freq=440.0, frames=44100)
synthesis.drip(freq=1000.0, frames=44100)
# STK synthesis
synthesis.synth_note("clarinet", freq=440.0, amplitude=0.8, duration=1.0)
synthesis.synth_sequence("flute", notes=[
{"freq": 440.0, "amp": 0.8, "start": 0.0, "dur": 0.5},
{"freq": 554.37, "amp": 0.7, "start": 0.5, "dur": 0.5},
])
Available STK instruments: clarinet, flute, brass, bowed, plucked, sitar, stifkarp, saxofony, recorder, blowbotl, blowhole, whistle.
cydsp.analysis -- Loudness, spectral features, pitch, onsets, resampling
from cydsp import analysis
# Loudness (ITU-R BS.1770-4)
lufs = analysis.loudness_lufs(buf)
buf = analysis.normalize_lufs(buf, target_lufs=-14.0)
# Spectral features
centroid = analysis.spectral_centroid(buf)
bandwidth = analysis.spectral_bandwidth(buf)
rolloff = analysis.spectral_rolloff(buf, percentile=0.85)
flux = analysis.spectral_flux(buf, rectify=True)
flatness = analysis.spectral_flatness_curve(buf)
chroma = analysis.chromagram(buf, n_chroma=12, tuning_hz=440.0)
# Pitch detection (YIN algorithm)
f0, confidence = analysis.pitch_detect(buf, method="yin", fmin=50.0, fmax=2000.0)
# Onset detection
onsets = analysis.onset_detect(buf, method="spectral_flux", threshold=0.5)
# Resampling
buf_48k = analysis.resample(buf, target_sr=48000.0) # madronalib backend
buf_22k = analysis.resample_fft(buf, target_sr=22050.0) # FFT-based
cydsp.stream -- Real-time streaming infrastructure
Block-based processing, ring buffers, and processor chains for streaming audio.
from cydsp.stream import (
RingBuffer, BlockProcessor, CallbackProcessor, ProcessorChain, process_blocks
)
# Ring buffer
rb = RingBuffer(channels=2, capacity=8192)
rb.write(frame_data)
chunk = rb.read(512)
# Block processor
class MyProcessor(BlockProcessor):
def process_block(self, block):
return block * 0.5
proc = MyProcessor(block_size=512)
out = proc.process(buf)
# Callback processor
proc = CallbackProcessor(block_size=512, fn=lambda b: b * 0.5)
# Chain processors
chain = ProcessorChain([proc1, proc2, proc3])
out = chain.process(buf)
# Process with overlap-add
out = process_blocks(buf, block_size=2048, hop_size=512, fn=my_spectral_fn)
cydsp._core -- C++ bindings (low-level)
Direct access to the C++ extension module with 12 submodules. All high-level Python modules build on these.
| Submodule | Backend | Contents |
|---|---|---|
filters |
signalsmith | Biquad with 16 filter designs, BiquadDesign enum |
fft |
signalsmith | FFT (complex), RealFFT (real) |
delay |
signalsmith | Delay (linear), DelayCubic (cubic interpolation) |
envelopes |
signalsmith | CubicLfo, BoxFilter, BoxStackFilter, PeakHold, PeakDecayLinear |
spectral |
signalsmith | STFT (multi-channel analysis/synthesis) |
rates |
signalsmith | Oversampler2x |
mix |
signalsmith | Hadamard, Householder, cheap_energy_crossfade |
daisysp |
DaisySP | 9 submodules, ~60 classes (oscillators, filters, effects, dynamics, drums, noise, physical modeling, control, utility) |
stk |
STK | 5 submodules, 39 classes (instruments, generators, filters, delays, effects) |
madronalib |
madronalib | FDN reverbs, resampling, generators, 18 projection functions, 6 window functions |
hisstools |
HISSTools | Convolution (mono/multi), spectral processing, 24 statistics functions, 28 window functions, partial tracking |
choc |
CHOC | FLAC read/write |
from cydsp._core import filters, fft, delay, daisysp, stk, madronalib, hisstools
# Example: direct biquad usage
bq = filters.Biquad()
bq.lowpass(0.1, 0.707)
out = bq.process(input_array)
# Example: direct FFT
f = fft.RealFFT(1024)
spectrum = f.fft(signal)
# Example: DaisySP oscillator
osc = daisysp.oscillators.Oscillator()
osc.init(44100.0)
osc.set_freq(440.0)
samples = osc.process(1024)
Full type stubs are provided in _core.pyi for IDE autocompletion and type checking.
Architecture
cydsp/
__init__.py # package root (__version__ only)
__main__.py # CLI entry point (argparse, subcommand handlers)
_cli.py # function/preset registries, fx parser, type coercion
_core.cpython-*.so # compiled C++ extension (nanobind)
_core.pyi # type stubs for C++ extension
_helpers.py # shared private utilities
buffer.py # AudioBuffer class
io.py # audio file I/O (WAV + FLAC)
ops.py # delay, envelopes, FFT, convolution, rates, mix, pan
effects.py # filters, effects, dynamics, reverb, mastering
spectral.py # STFT, spectral transforms, eq_match
synthesis.py # oscillators, noise, drums, physical modeling
analysis.py # loudness, spectral features, pitch, onsets, resample
stream.py # ring buffer, block processors, overlap-add
Development
make build # rebuild extension after C++ changes
make test # run 1114 tests
make qa # test + lint + typecheck + format
make coverage # tests with coverage report
License
MIT
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 Distributions
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 cydsp-0.1.1.tar.gz.
File metadata
- Download URL: cydsp-0.1.1.tar.gz
- Upload date:
- Size: 2.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
337debf284a3b2bdbe884f42d62db3865ea2c5eecaf01fce3bbb058542a6525c
|
|
| MD5 |
9c20fafc70ab865111b0e26729aba411
|
|
| BLAKE2b-256 |
dca7c282dbe24a0015dbaa52f0fa5f02efceda0833497730981330e6137f355c
|
File details
Details for the file cydsp-0.1.1-cp314-cp314-macosx_15_0_arm64.whl.
File metadata
- Download URL: cydsp-0.1.1-cp314-cp314-macosx_15_0_arm64.whl
- Upload date:
- Size: 552.6 kB
- Tags: CPython 3.14, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8bdc48b31bedcbca5c5a94801452d4f7d2b30b658f21973788c7364a635e9b2f
|
|
| MD5 |
9b66ed9df3c0ab32ec84ee77b4ca5846
|
|
| BLAKE2b-256 |
241a44babc05256f25841e54a1290e469e9d94844d184abb3c72a24d5b1d6fd6
|
File details
Details for the file cydsp-0.1.1-cp313-cp313-macosx_15_0_arm64.whl.
File metadata
- Download URL: cydsp-0.1.1-cp313-cp313-macosx_15_0_arm64.whl
- Upload date:
- Size: 552.6 kB
- Tags: CPython 3.13, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c079c3a2e43a75f3d0d221370a18d4641c0e29622e6ca27f36ef5b9037431ecb
|
|
| MD5 |
0a893611d5a2758c6f4a5259621c3624
|
|
| BLAKE2b-256 |
ebaf5ae751d48e732d758f1fa110f4e0b2c758249ade033029871adaa66d620f
|
File details
Details for the file cydsp-0.1.1-cp312-cp312-macosx_15_0_arm64.whl.
File metadata
- Download URL: cydsp-0.1.1-cp312-cp312-macosx_15_0_arm64.whl
- Upload date:
- Size: 552.7 kB
- Tags: CPython 3.12, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73a41970839e1cb9c534aa610637e82c902498f2e0dc2ee2d4378baff8fa89ce
|
|
| MD5 |
c36f4ccc5914c2c4cf48d3e23645ecc4
|
|
| BLAKE2b-256 |
3f4019ed238cb093483c6e5925461737d3cd42da6cf6cd05f2e3a6a454f02756
|
File details
Details for the file cydsp-0.1.1-cp311-cp311-macosx_15_0_arm64.whl.
File metadata
- Download URL: cydsp-0.1.1-cp311-cp311-macosx_15_0_arm64.whl
- Upload date:
- Size: 553.1 kB
- Tags: CPython 3.11, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18ae7da0518811c142813367f2ec9d50861444e978bb9f140cd424f8c42766fa
|
|
| MD5 |
ba747abf815b05cde435703efb01acda
|
|
| BLAKE2b-256 |
44e62296697d515a75aec503f225e29e581b23513735b15899b8e2a48f7caa71
|
File details
Details for the file cydsp-0.1.1-cp310-cp310-macosx_15_0_arm64.whl.
File metadata
- Download URL: cydsp-0.1.1-cp310-cp310-macosx_15_0_arm64.whl
- Upload date:
- Size: 552.7 kB
- Tags: CPython 3.10, macOS 15.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a6ba385603729ebbe8aa71eae08914af2be3cf07330333fe38efcbb2b2d7e03
|
|
| MD5 |
e651b05327fa95f9a589ae893a67391e
|
|
| BLAKE2b-256 |
498376f3ce721c33212736310162c10cf24ab6a4596b92a8223e99cd0e54c40c
|