softcut
Python bindings for softcut-lib — the per-voice DSP engine behind monome norns' softcut — with realtime audio I/O via miniaudio. Built with nanobind, and with no dependencies: buffers are any buffer-protocol object — array.array("f") from the standard library, or a numpy array if you already use one — and audio, WAV I/O and the OSC server all work on a bare install.
The primary API exposes softcut as idiomatic Python objects. An optional norns-compatible layer (softcut.norns) additionally mirrors the flat norns Lua softcut API for porting existing scripts.
Concepts
-
Voicewraps onesoftcut::Voice: a crossfading read/write head over an audio buffer, with rate, loop points, record/play, fades, and pre/post state-variable filters. Parameters are plain attributes; the buffer isfloat32memory you own, since softcut-lib never allocates buffer memory. The interface is the buffer protocol, so anything C-contiguous works — anarray.array("f"), amemoryview, a numpy array — and it is stored, not copied:voice.bufferhands back the object you assigned and softcut records into that memory.Engine.allocatereturns anarray.array("f"), rounding the length up to the power of two softcut requires (next_power_of_twodoes the arithmetic alone). One buffer can be shared by several voices. -
Engineis the multi-voice host: it owns a set of voices and a miniaudio device, and runs them either live (realtime mic/speaker I/O on a background audio thread) or offline viaEngine.render. It is a context manager and a sequence of voices.
Live looping
import softcut, time
with softcut.Engine(voices=2) as eng: # opens the audio device
eng.allocate(seconds=8) # shared power-of-two buffer
eng[0].configure(loop_region=(0, 4), rate=1.0, level=0.8, pan=-0.3)
with eng[0].record(at=0): # rec + play on; head cut to 0s
time.sleep(4) # capture 4s of mic input
# on exit: rec off — the voice keeps looping what it captured
eng[1].configure(loop_region=(0, 4), rate=-0.5, level=0.6, pan=0.3)
eng[1].record_for(4, at=0) # blocking variant: record 4s, then stop
time.sleep(8) # listen to both loops
# device closed automatically
eng.start() returns immediately and audio runs on a background thread, so the REPL stays live — set a parameter and you hear the change on the next block. record() is the non-blocking context-manager gesture; record_for(seconds) blocks the calling thread for a fixed capture.
Offline rendering
No device; process a mono block through the voices and get the mixed stereo output back. This is the deterministic path used by the tests:
import array, softcut
eng = softcut.Engine(voices=1, mode="playback")
eng.allocate(seconds=2) # a shared power-of-two buffer
eng[0].configure(loop_region=(0, 1), rate=1.0, rec_level=1.0)
eng[0].rec = eng[0].play = True
eng[0].cut_to(0)
# an input buffer is what the voices record; two laps, so the first is heard back
eng.render_to("recorded.wav", array.array("f", [0.3] * 96000))
eng[0].rec = False
eng.render_to("loop.wav", seconds=4) # nothing to record: just play
render_to is render plus write_wav, without restating the sample rate and channel count the engine already knows. Both take either seconds, which feeds the voices that much silence, or an input buffer — the engine's mono input, which voices with rec on record and the rest ignore.
To keep the samples rather than write them, render returns interleaved frames in an array.array("f"). numpy is not needed for any of the above, but if you have it, it wraps that without copying:
import numpy as np
out = eng.render(seconds=4) # flat, interleaved
frames = np.asarray(out).reshape(-1, eng.out_channels) # (n, out_channels), a view
frames[0, 0] = 0.0 # writes into `out` itself
softcut.read_wav, read_wav_mono and write_wav handle PCM WAV on the standard library alone, which is what the norns layer and the demos use. For anything else — FLAC, OGG, resampling — load with whatever you like (e.g. soundfile) and assign the result to voice.buffer:
samples, sr = softcut.read_wav_mono("loop.wav")
buf = eng.allocate(frames=len(samples)) # rounded up to a power of two
buf[: len(samples)] = samples
Dependencies
softcut-py has no dependencies, numpy included. What softcut allocates for you — Engine.allocate, render, NornsSoftcut.buffers — is array.array("f"), and what it accepts is any C-contiguous float32 buffer, so numpy arrays work wherever you care to use them — as a voice's buffer, as render input, as an out buffer — and numpy.asarray wraps what softcut returns without copying. The extension allocates no results and imports nothing.
The sample-level buffer arithmetic and the WAV sample-format conversion run in C++ (shared with the standalone server), and wave from the standard library parses the container.
$ pip install softcut-py # no dependencies
$ pip install softcut-py[osc] # + the pure-Python OSC transport
One consequence worth knowing: a float64 array is now refused rather than silently converted. Cast it with .astype("float32").
Routing and devices
Voices mix to stereo via each voice's level and pan. Engine.feedback(src, dst, amount) routes one voice's output into another's input (one block delayed; src == dst is a self-feedback delay line), and each voice's input_gain scales the engine's external (mic) input into it:
eng = softcut.Engine(voices=2)
eng.feedback(0, 1, 0.4) # voice 0 -> voice 1 input
eng[1].input_gain = 0.0 # voice 1 ignores the mic
Pick a specific device by index from softcut.list_devices():
softcut.list_devices() # [{'index':0,'name':...,'type':'playback',...}, ...]
eng = softcut.Engine(output_device=1, input_device=0)
norns-compatible API
For porting norns scripts (and the muscle memory that goes with them), softcut.norns mirrors the flat, 1-based, singleton norns softcut Lua API: 6 voices indexed from 1 and 2 global mono buffers numbered 1/2. Import it under the name norns scripts expect and call the functions verbatim:
from softcut import norns as softcut
softcut.buffer_clear()
softcut.buffer_read_mono("loop.wav", ch_dst=1) # stdlib wave, no extra dep
softcut.loop(1, 1)
softcut.loop_start(1, 0.0)
softcut.loop_end(1, 4.0)
softcut.rate(1, 1.0)
softcut.level(1, 0.8)
softcut.play(1, 1)
softcut.position(1, 0.0) # cut the head into the loop
softcut.start() # open the audio device
-
Attribute passthrough —
rate,level,pan,play/rec/loop, loop points,position, the pre/post filters, slews, phase,buffer,voice_sync,level_cut_cut,reset. -
Buffer/disk ops —
buffer_read_*/buffer_write_*,buffer_copy_*,buffer_clear*, on the shared C++ buffer primitives plus the standard-librarywavemodule (WAV only, no new dependency), with preserve/mix crossfade, edgefade_timeandreverse. Operations write in place, so they are safe against the running audio thread; reads are non-resampling, matching norns.
softcut.render / softcut.start / softcut.stop drive audio (norns runs its audio continuously; here you render offline or open the device explicitly). Setting a loop region does not move the play head, so position is what makes a loop actually loop — without it the head runs past loop_end and off the end of the material. Phase polling and per-sample level/pan slews are not implemented here; the norns layer guide has the full surface, the gaps and the reasons, and demos/12_norns_api.py is a narrated walkthrough built entirely on this layer.
OSC server
softcut.osc exposes softcut over the same OSC wire protocol as the reference softcut_jack_osc client, so existing norns/Lua scripts, SuperCollider, Max, or any OSC controller can drive softcut-py as a drop-in engine over the network. It is a thin dispatch layer over the norns host: each address maps to a host method, with the one translation that the wire protocol is 0-based (voices 0-5, buffers 0-1) while the host is 1-based.
from softcut.osc import SoftcutOSC
from softcut import norns
host = norns.NornsSoftcut()
host.start() # open the audio device
server = SoftcutOSC(host) # listen on UDP 9999
server.serve_forever() # blocks until a /quit message
Or run it straight from the command line:
python -m softcut.osc # device + OSC server
python -m softcut.osc --no-audio # offline: buffer ops only
Then drive it from any OSC client (voice/buffer indices 0-based):
/set/param/cut/rate 0 1.0 # voice 0 rate = 1.0
/set/param/cut/loop_start 0 0.0
/set/param/cut/loop_end 0 4.0
/set/param/cut/loop_flag 0 1
/set/level/cut 0 0.8
/set/param/cut/play_flag 0 1
/set/param/cut/position 0 0.0 # cut the head in, or it runs past loop_end
/softcut/buffer/read_mono "loop.wav" 0.0 0.0 -1 0 0
/poll/start/cut/phase # -> /poll/softcut/phase <voice> <phase>
The full namespace is mirrored: all /set/param/cut/* params, routing (/set/level|pan/cut, cut_cut, in_cut), the /softcut/buffer/* disk ops, /softcut/reset, and the phase poll. Defaults match the reference: listen on UDP 9999, reply (phase poll) to 127.0.0.1:57120.
Two transports, selected by backend= ("auto" by default):
-
native — a dependency-free UDP transport on the vendored tinyosc codec, compiled in by default, so
pip install softcut-pyserves OSC with nothing else installed. Per-voice/set/param/cut/*messages are parsed and dispatched entirely in C without the GIL. IPv4-only. Disable with a source build (SKBUILD_CMAKE_DEFINE="SOFTCUT_ENABLE_TINYOSC=OFF" pip install .). -
python-osc — the pure-Python transport, longer-established and the fallback when the native one is not built.
pip install softcut-py[osc].
"auto" takes native when built and python-osc otherwise; either can be named explicitly.
Building the transport in grants the ability to serve OSC, never a running server: importing softcut.osc opens no socket and starts no thread. A server exists when you construct SoftcutOSC and listens when you start it, or when you run python -m softcut.osc.
Standalone server (no Python)
For a headless, interpreter-free deployment, clients/softcut-osc builds a standalone native binary (softcut-lib + tinyosc + miniaudio) that speaks the same softcut OSC protocol with no CPython at all — so nothing on its control path can touch a GIL. It is the pure-C++ counterpart to softcut.osc: identical DSP and wire protocol, with no interpreter to schedule at all — where softcut.osc merely keeps its control path off the GIL, this has no GIL to keep off. It covers the full namespace plus WAV disk I/O (via the vendored dr_wav, on a disk-worker thread with click-avoidance crossfades), preserve/mix blending, opt-in --resample-on-read, and device selection.
make build-standalone # -> build/softcut-osc/softcut-osc
./build/softcut-osc/softcut-osc --help
./build/softcut-osc/softcut-osc # listen UDP 9999, reply 127.0.0.1:57120
The Python extension and this binary share their Python-free C++ core (command queue, mixer, device, sockets) under src/shared. See clients/softcut-osc/README.md.
TouchOSC surface
clients/touchosc holds a TouchOSC layout, softcut.tosc, that plays either server over the wire protocol: a mixer strip per voice, tabular pages for the loop, record and filter parameters, the feedback and voice-sync matrices, buffer and disk operations, and a receive-only phase readout fed by the phase poll. It is generated from Python with py2tosc rather than drawn by hand, so make touchosc rebuilds it for a different canvas, voice count or parameter range, and the test suite pushes every binding in it through the server's own dispatch table. demos/13_osc_surface.py drives that surface over a real socket into a real server and renders the result, which is the quickest way to see the whole stack work; --serve instead opens the device and prints what to enter in TouchOSC's connection settings.
Build and test
make sync # set up the environment
make test # run the test suite
make qa # test + lint + typecheck + format
Set SOFTCUT_TEST_AUDIO=1 to additionally exercise a real audio device in the test suite. Use make help for more targets (wheel, sdist, clean, etc.).
Releasing
CI runs QA and a Linux/macOS/Windows build smoke on every push and pull request. Pushing a v* tag builds wheels for CPython 3.10-3.14 across Linux (x86_64/aarch64), macOS (x86_64/arm64) and Windows with cibuildwheel, plus the sdist, and publishes them to PyPI via trusted publishing. To cut one, set the version in both pyproject.toml and src/softcut/__init__.py — they are separate copies, and test_version_matches_the_packaging_metadata fails if they disagree — then commit, tag vX.Y.Z, and push the tag. (TestPyPI is available via the workflow's manual workflow_dispatch.)
Notes
-
Realtime parameter updates are safe: while the device is running, voice DSP parameter changes from Python are enqueued and applied on the audio thread via a lock-free queue rather than racing it. (The mix scalars
level/pan/input_gainand the feedback matrix are plain aligned writes.) -
The vendored
softcut-libcarries small host-portability fixes (uninitialized members that relied on embedded zero-init static storage — including the phase quantum and the two phase mirrors the poll reports from — and an oversized debug buffer stubbed out); see the comments inthirdparty/softcut-lib.
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 softcut_py-0.4.1.tar.gz.
File metadata
- Download URL: softcut_py-0.4.1.tar.gz
- Upload date:
- Size: 725.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b541e1cfe8aeef46734ad3a7f02a65167079491bccfb775751f71209a5e2dfee
|
|
| MD5 |
af11d84aff93889814abbfd31c56c97b
|
|
| BLAKE2b-256 |
04dc9ef851d6f3ec59d858900b357c1c65666d05636fcb534752350c9672359f
|
File details
Details for the file softcut_py-0.4.1-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 195.7 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7eade38e08743c79ac6cbc17ae7635c42cc8d4d8bdcafc7301b20e4d629d2768
|
|
| MD5 |
3f68ebc1a87c640e6d8b372c0d492b51
|
|
| BLAKE2b-256 |
8dda0e9177e64d8377d3653260f990e0c2d84210cc355ef8b4d7ee8563b43ac7
|
File details
Details for the file softcut_py-0.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 268.1 kB
- Tags: CPython 3.14, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
336ca6cf289c0f33b15852e1858be3747fa3ea2a03cbda381de173843727a3e1
|
|
| MD5 |
709df6038a65c8bd36ed86814329e493
|
|
| BLAKE2b-256 |
93258866336f491229583912ff5b2b54eca2e957fac0903fa9706051dc243ea2
|
File details
Details for the file softcut_py-0.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 258.6 kB
- Tags: CPython 3.14, manylinux: glibc 2.27+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81d9e73948c00d12aff0d19f3f68adeaae6172dd8ef451adbfe01918111c8718
|
|
| MD5 |
df17997eb7c8b81512fafd6513151f18
|
|
| BLAKE2b-256 |
d39c799320ccad01e1d789a9b23f6ee0512a528e207477228f66eddec9ddbc4e
|
File details
Details for the file softcut_py-0.4.1-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 233.7 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44793d7cfc1e9067d076ee56b3651f1a80aaa3c8670b61b6b9f5aecc6e4e969d
|
|
| MD5 |
c9e7d71ec320ac067b4f8840a061826d
|
|
| BLAKE2b-256 |
0d3ff004bb801b8f916e680e604724d271e532d74704628184d84e8097518ea1
|
File details
Details for the file softcut_py-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl
- Upload date:
- Size: 249.4 kB
- Tags: CPython 3.14, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5572061e7f8178a973457baca21a258dc95666c8ebd485d25219106335b0bae4
|
|
| MD5 |
a618f5fab09becb8954c575e117d30cd
|
|
| BLAKE2b-256 |
76bac8d85e75997ae0a413b5333bdb098d02cdb67904711f76be86b382c9f0e6
|
File details
Details for the file softcut_py-0.4.1-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 190.1 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b6a5fcdb558c8e520ea167c41415c0d1fca10f3453532fb77c6234f31cb27772
|
|
| MD5 |
f8fe4f0fed143a5708badee9cfe18bb5
|
|
| BLAKE2b-256 |
eaf9d56d0629078d4e5e15dc50a76a170b1287946ea4dfe0643c6b2870f033a3
|
File details
Details for the file softcut_py-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 268.1 kB
- Tags: CPython 3.13, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1daea6941cce273b9b8fbb26c113785bb8a053ed069ec9ecd2672db65dbcd8a8
|
|
| MD5 |
0c8610f254d02e1ba93792f8707882ff
|
|
| BLAKE2b-256 |
8e46d956f5684e62e6c3383cf268b427b918c85cf40586d878d0015834b78b3a
|
File details
Details for the file softcut_py-0.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 258.3 kB
- Tags: CPython 3.13, manylinux: glibc 2.27+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d5c639394eccaf2a1e329538b52d4fc7831f13a8933ec09005d747abbfdfde2
|
|
| MD5 |
4a920445e9f64e9602d9c99b0a28ce42
|
|
| BLAKE2b-256 |
97c6473ddc1afb62130577e56491cc01fadc355ee550441e333f62841532fd63
|
File details
Details for the file softcut_py-0.4.1-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 233.6 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0a9947f31bc6bb39c0d742349ad18f8e8439950251a187e0eeff6c4f9a1e86c
|
|
| MD5 |
0c1799042a84a88125032662c3d623ad
|
|
| BLAKE2b-256 |
b40f98b3f825967d04a6d191f0841558011534f5b9fa2f5aab46036ec8acfae5
|
File details
Details for the file softcut_py-0.4.1-cp313-cp313-macosx_10_14_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp313-cp313-macosx_10_14_x86_64.whl
- Upload date:
- Size: 249.2 kB
- Tags: CPython 3.13, macOS 10.14+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65bc56b6160b06dec2d920794d2e1ef2ec1f213be86a7a74a4f8b40d77ba0542
|
|
| MD5 |
03526915be5e6da46ece5d675c7e2a9e
|
|
| BLAKE2b-256 |
51e621bb338e539268734bf62053b8d1dfe18fded246899798ffb6d8f958d84a
|
File details
Details for the file softcut_py-0.4.1-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 190.2 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a07d3ac713518f9b03b42e9cece52513fdc58b80bf2478534ac675293f7de848
|
|
| MD5 |
6fa3a84493de5ba0471214990c38b7a1
|
|
| BLAKE2b-256 |
a5e36e84c2fe2a85465258f3ec26f57b201957c83157870b07e70f193d049376
|
File details
Details for the file softcut_py-0.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 268.1 kB
- Tags: CPython 3.12, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
527197e3a3e53df76e1722ab3f20c4de09da56ccc1e50dc76d1eae83de70c044
|
|
| MD5 |
58353c3a45d3bd96b1c459debc300151
|
|
| BLAKE2b-256 |
8ea84ec20ebe8a22370f6992c6493024380aa78da76f7d35b877aed3bb9918fd
|
File details
Details for the file softcut_py-0.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 258.3 kB
- Tags: CPython 3.12, manylinux: glibc 2.27+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5cb273224a8a50bf2d8961927992d5f80181da558bbe59af12ccd9c600245d78
|
|
| MD5 |
5003ae47eb70bb01d4b2618d566a3ffb
|
|
| BLAKE2b-256 |
991fc73b058cc52a9b6a19bda91f6f21c6947542199af28ae842fe867fe46994
|
File details
Details for the file softcut_py-0.4.1-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 233.7 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38e982b5dc850f253b0d21651ffc3fc9b10cd3fbb05c5cf80a09e049350993e7
|
|
| MD5 |
757b0d6de62f2da65c0c8b9543af40bd
|
|
| BLAKE2b-256 |
9c24145dc91860ce9c2b2721a2b402cd9fdb0a1f89dc92a044eea92cd9d2ee2f
|
File details
Details for the file softcut_py-0.4.1-cp312-cp312-macosx_10_14_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp312-cp312-macosx_10_14_x86_64.whl
- Upload date:
- Size: 249.3 kB
- Tags: CPython 3.12, macOS 10.14+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba467427d541c235bdadd985f9fe6888db8ea8a8bfbec1bacc591e220833592c
|
|
| MD5 |
01091011b5246f6da53bb4af808d61dd
|
|
| BLAKE2b-256 |
101764070ca513194fcf5fb15ce64d549452723092c13ae3c3c354c277789133
|
File details
Details for the file softcut_py-0.4.1-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 190.8 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf39befd2bc79d694e5a240f6ed8965ed3924e83f6bed3c2a2732383f2a4018e
|
|
| MD5 |
2b0cb272af93612ced88242a579b31bb
|
|
| BLAKE2b-256 |
755eebed8a968791e9223edffa55fe402e1ce9ff2c3388390c103d0ae2b2c78f
|
File details
Details for the file softcut_py-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 269.0 kB
- Tags: CPython 3.11, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0bab8f0cb60b2660577a7c2fa68a56e047c41816acc570ad814170ae3b369ef
|
|
| MD5 |
c5730cdf0fed1d9bad606f684f4ab4f1
|
|
| BLAKE2b-256 |
c786b0b5a3b32494d2974ee52eb695bab552961738b198a830fd2304c3a7a5e3
|
File details
Details for the file softcut_py-0.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 259.3 kB
- Tags: CPython 3.11, manylinux: glibc 2.27+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
69f521429b4df09bbaf43f1d0ab843178018203de003125a5448b3451e725e87
|
|
| MD5 |
62a2f175a26bd50b5dccdf92e9d9e866
|
|
| BLAKE2b-256 |
abe192aae2faf00a569344b7fa30acf1d7b15e90177be34d3eefcf9d0ed0a639
|
File details
Details for the file softcut_py-0.4.1-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 234.4 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a8ae527c462781769005d73f28777476a1a0f4d3139cdac40ccd85117ac45b7
|
|
| MD5 |
eeec52a4ed4b38c79f857cdab36cd3ba
|
|
| BLAKE2b-256 |
0a2cd5957f7d9790c50aed659d237524a05d9c737b3bc999c54c634e51da62c4
|
File details
Details for the file softcut_py-0.4.1-cp311-cp311-macosx_10_14_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp311-cp311-macosx_10_14_x86_64.whl
- Upload date:
- Size: 249.8 kB
- Tags: CPython 3.11, macOS 10.14+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d35a9d18baa54ff66b3485c99fbe90221151e7056ed448d63f6857ac5e5edd41
|
|
| MD5 |
33a9f46008b7c9b452e51373c20b2fbc
|
|
| BLAKE2b-256 |
42b6f10a5a6c72a0d30dd505b2ab7088aba074e2b6cd53910ab6eee23c652d42
|
File details
Details for the file softcut_py-0.4.1-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 190.9 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
369ef2ade4a27e6cabbd541d3db181782f7d5ec25e993e620a4b1c0c7f9dc99f
|
|
| MD5 |
1c8049d5e8bb1e250a5c0a4d9a81848e
|
|
| BLAKE2b-256 |
8cf1ae4bc52a22705641e58a70db07d6c83f055baf052928615e7b3186f023e8
|
File details
Details for the file softcut_py-0.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 269.3 kB
- Tags: CPython 3.10, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d57e727247c068893ad34f540b426e64e3d1b840f90e72a1518bac86728647b1
|
|
| MD5 |
3625952d77282dca9644bcd498a75d8b
|
|
| BLAKE2b-256 |
9a194bc020190101eec4b2e1705ac1f6a72a901afb72b07bff5b1ce660811aa0
|
File details
Details for the file softcut_py-0.4.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
- Upload date:
- Size: 259.7 kB
- Tags: CPython 3.10, manylinux: glibc 2.27+ ARM64, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25cf923eee0117175c6e810372c2fbf8868b0c914e0e28bf315d049979a50bf5
|
|
| MD5 |
13e2acb036423b1db99fb8567fcfad75
|
|
| BLAKE2b-256 |
08c43faa123fdb6aab27c4bd8fbf7742a7848cfc799dc8c0bdcc082c58011eee
|
File details
Details for the file softcut_py-0.4.1-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 234.7 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7aec5629554a3ec6cf6a3a137dd7b36ed3a4a9d1bfeeef86db9ff5eae287326b
|
|
| MD5 |
865c645a3e9c103bd0aa591ecff25ed9
|
|
| BLAKE2b-256 |
c026ee464c5a94aa3f5b6636670fbb9c602e559eb088640b49ec90f85d52805e
|
File details
Details for the file softcut_py-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl.
File metadata
- Download URL: softcut_py-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl
- Upload date:
- Size: 250.1 kB
- Tags: CPython 3.10, macOS 10.14+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
463edc9315b738510382bf9cd344cee7f8b3220618d37dc47e1b56deb276c755
|
|
| MD5 |
717183960c61604c445f2701e7bc1326
|
|
| BLAKE2b-256 |
8a7a0755d5b811434db907ae8d70f950f821cadf62405545397c0ea392aa0fca
|