Skip to main content

softcut

CI

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

  • Voice wraps one softcut::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 is float32 memory you own, since softcut-lib never allocates buffer memory. The interface is the buffer protocol, so anything C-contiguous works — an array.array("f"), a memoryview, a numpy array — and it is stored, not copied: voice.buffer hands back the object you assigned and softcut records into that memory. Engine.allocate returns an array.array("f"), rounding the length up to the power of two softcut requires (next_power_of_two does the arithmetic alone). One buffer can be shared by several voices.

  • Engine is 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 via Engine.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 passthroughrate, level, pan, play/rec/loop, loop points, position, the pre/post filters, slews, phase, buffer, voice_sync, level_cut_cut, reset.

  • Buffer/disk opsbuffer_read_* / buffer_write_*, buffer_copy_*, buffer_clear*, on the shared C++ buffer primitives plus the standard-library wave module (WAV only, no new dependency), with preserve/mix crossfade, edge fade_time and reverse. 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-py serves 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 using py2tosc, a sibling project, 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. A full queue makes the setter wait for the next drain and, failing that, drop the change and count it on Voice.dropped_commands — never apply it off-thread. (The mix scalars level/pan/input_gain and the feedback matrix are relaxed atomics instead of queued: a read is at worst one block stale.)

  • The vendored softcut-lib carries 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 in thirdparty/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

softcut_py-0.4.2.tar.gz (728.7 kB view details)

Uploaded Source

Built Distributions

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

softcut_py-0.4.2-cp314-cp314-win_amd64.whl (196.9 kB view details)

Uploaded CPython 3.14Windows x86-64

softcut_py-0.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (269.7 kB view details)

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

softcut_py-0.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (260.1 kB view details)

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

softcut_py-0.4.2-cp314-cp314-macosx_11_0_arm64.whl (235.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

softcut_py-0.4.2-cp314-cp314-macosx_10_15_x86_64.whl (250.8 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

softcut_py-0.4.2-cp313-cp313-win_amd64.whl (191.4 kB view details)

Uploaded CPython 3.13Windows x86-64

softcut_py-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (269.6 kB view details)

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

softcut_py-0.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (259.8 kB view details)

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

softcut_py-0.4.2-cp313-cp313-macosx_11_0_arm64.whl (234.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

softcut_py-0.4.2-cp313-cp313-macosx_10_14_x86_64.whl (250.6 kB view details)

Uploaded CPython 3.13macOS 10.14+ x86-64

softcut_py-0.4.2-cp312-cp312-win_amd64.whl (191.5 kB view details)

Uploaded CPython 3.12Windows x86-64

softcut_py-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (269.7 kB view details)

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

softcut_py-0.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (259.8 kB view details)

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

softcut_py-0.4.2-cp312-cp312-macosx_11_0_arm64.whl (234.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

softcut_py-0.4.2-cp312-cp312-macosx_10_14_x86_64.whl (250.7 kB view details)

Uploaded CPython 3.12macOS 10.14+ x86-64

softcut_py-0.4.2-cp311-cp311-win_amd64.whl (191.9 kB view details)

Uploaded CPython 3.11Windows x86-64

softcut_py-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (270.4 kB view details)

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

softcut_py-0.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (260.7 kB view details)

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

softcut_py-0.4.2-cp311-cp311-macosx_11_0_arm64.whl (235.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

softcut_py-0.4.2-cp311-cp311-macosx_10_14_x86_64.whl (251.3 kB view details)

Uploaded CPython 3.11macOS 10.14+ x86-64

softcut_py-0.4.2-cp310-cp310-win_amd64.whl (192.2 kB view details)

Uploaded CPython 3.10Windows x86-64

softcut_py-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (270.8 kB view details)

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

softcut_py-0.4.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (261.0 kB view details)

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

softcut_py-0.4.2-cp310-cp310-macosx_11_0_arm64.whl (236.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

softcut_py-0.4.2-cp310-cp310-macosx_10_14_x86_64.whl (251.6 kB view details)

Uploaded CPython 3.10macOS 10.14+ x86-64

File details

Details for the file softcut_py-0.4.2.tar.gz.

File metadata

  • Download URL: softcut_py-0.4.2.tar.gz
  • Upload date:
  • Size: 728.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for softcut_py-0.4.2.tar.gz
Algorithm Hash digest
SHA256 fa1d628674ec834a0bdab00115aea7cdeb27e26c98829a228ef6c271b941c7ef
MD5 e0f903b88c1f54de3fd9f8028e4f5405
BLAKE2b-256 94f260ba739ae48a77495b00ba570fe84aef50602adda920aeb702826b068bc2

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: softcut_py-0.4.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 196.9 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

Hashes for softcut_py-0.4.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 10fa240fe3fdbe1d580ec0bb4a2f0ced28073ac987088cda70c417503737bc9a
MD5 6851ae9a0f7992bb6ae66d2a6c207407
BLAKE2b-256 e7362b3b1154033622d84a814909c7d33ce1c3fec9890e8361e41be79be49977

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9abec9792ca40522db2ed8bd039816a6d1af544523082a2dd2391de3973e3aa0
MD5 ebafcc9e377b03bf54bc55f24a5b8491
BLAKE2b-256 2cd9509faa3093afbd6299c0170c4c7f4236f955b68e6b34b713e23f1ce115fe

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d8ec2282922cc620eb18df2bf85321e8ee7279a2ad0b870d7bca8973560ef090
MD5 8898c2a03178ea1f539076c831ed747e
BLAKE2b-256 26bebeacd68ded898336a5d95cbe24cd9a05f9368b0cb71c036eabce463431fc

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2634e30e0199dc0f49cb1f0e4b53fa405922296d6c42fab345eb1d2d088b1ab8
MD5 05d198e386177e522ec3c2894a4a8fb5
BLAKE2b-256 df7fc2ce7ecebee0bbb86e92a21ecec265e345c6904463244aa9b5f9ef092a6e

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 11116a374748f7b5207d3dd4a20625596db434635450cbe8c555a36e5762bb89
MD5 637de76bef1f1abf863bca8f33f441f8
BLAKE2b-256 e0d794a6b7fdb59627db559400b28e29ffc8174a6cf059df2842a5714a0901c7

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: softcut_py-0.4.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 191.4 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

Hashes for softcut_py-0.4.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 37fbbd139682fc6a6ba7b9f16e68ff0812bda48ac14b015384d9229960b250b3
MD5 f4f8b6c8920b2cbaf5a8ba6e41a541b4
BLAKE2b-256 0b3f32983f0ceb8c535de3b56e970787bac504f57c85aae10da5ada299e089ca

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cf58c383e2bbeebfd20276c6bfc7c9c1046a4bfca842112253793b68554f37ff
MD5 bfcbe76ee7c987be6c7fac2a2e14099a
BLAKE2b-256 786f48a3f4accfec2c02c20e52397bf28a14bf0e18dcfaac7eac8dbf5842a112

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dc11e77ac0b4fec8b7e2ee75c2e96ba8a41dd617ae3428ec7fa34631fe8e98f9
MD5 2790cabfa922d676e66b2ba8866ac76f
BLAKE2b-256 c12bdc6a383f32e46b08501ac9f8377d4124bb9ba9dee388e0ce4885575916d3

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 722bf91db91ba2d5b7d2f70f9b31710535d5f3a104cc2a515239167304816302
MD5 c60bd4dd83405648df9f5203d933828d
BLAKE2b-256 18576b780e08046849f9f86fd27462071ee203340130156f14fee9a295062426

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp313-cp313-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp313-cp313-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 943d05cb5e7e3a95715976c71c8f814ae14a454e906252ebe6b653b5e98c2866
MD5 acd0c4b5e83a2505c1bde8aeead47d4d
BLAKE2b-256 115702709b56df4ded53e35ef621aedc53a77ba5c0dad44fb8ec01f2a4d82de8

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: softcut_py-0.4.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 191.5 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

Hashes for softcut_py-0.4.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3681c18713f87b690c23be4320d899d81aedb0957284d6dc29a76b83c5ed91f8
MD5 479869d0f3decebfa738c16dcc0471c6
BLAKE2b-256 2e760abcb6ad1372e10b405d8400ca61aba8b0cba3056a60c55b6a935e2a706b

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da445a2cb3d9aed09023fe029062b938e6288919b5165c44b375f844675782b2
MD5 f59075e92aacb8001d4ec2fee1038724
BLAKE2b-256 56153b2dbb2e242b54cb9933ee59d5def929d5e6b7140d6d2efb9f5485ad5484

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d4141747d0b40ba67ba2dbf4d41b8facaee1c80c875d006c62d1e6bfbb65e0e1
MD5 47fcef7bd518d29f7f2598487fb5c24e
BLAKE2b-256 3da614035a8ed54369e1e2e035a7145f58ddb2450be7f271b984b0454a034e69

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b382b6493c6313ddfd532946725795e2562422ca1c41e7044fbad2a278b833f
MD5 610e3e617c9b6cc1bc560c21dc71bde5
BLAKE2b-256 785d5ea100fcdb887ab23fbb1b9d0ff3d5b73889c3b86046565023553e2842fb

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp312-cp312-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp312-cp312-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 54d315ca884d227bb6b98ff7be6cfde7eed9daa412f79f9fb393915b4e410a52
MD5 46d67cdb6b16fae4217fb92ce6bd1cf7
BLAKE2b-256 f57329ff5652ebf97e67699f6fd7d0026aa155318e4b5c6a86dc0ae9a292f79e

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: softcut_py-0.4.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 191.9 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

Hashes for softcut_py-0.4.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 68153e3d90f0ca47fb58bbad8fd9c141ea09e5e6e58a758ac315209bfbb8ac54
MD5 5f18c12cfceeacbc04b98da6621b2e63
BLAKE2b-256 76729100bddb96b9d2005b7d78a3f14ca3926c28d61c05423ed57c65bce837b3

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b1a157a442b1957251fa9751d1c4c3c0c7eedb1073b96d7df3a150c3b490b60c
MD5 1f508994c4dd0b4e2572d8e38a7836e6
BLAKE2b-256 fae7f40fc9698029e3cc8606fc26d8d28d7d2867836723cceb372b95eda68b11

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a7a31dc29601fd0672e15f72beb76a2aa8828ef6228bc8936331467d49c9d759
MD5 1cd001f4f678ecfef11374388cb24475
BLAKE2b-256 20dc062ad02ae2797825955590c934c73692c2f5c7300c5eeb0ba3263a475ea8

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e459ba46b0be583299ffe30ee105f9b95981d51277b87c443bb72fcc0e8c06d
MD5 a735e6da3155302db3fa3a6c1e3246e5
BLAKE2b-256 ad9272a1b2b3b43512753f26b4257353994b31b0808e7dcd64f362845d316dcd

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp311-cp311-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 b4d454c969af388ba6237233eaf0edb3fe5691eed62e75f4238ade254ab97e30
MD5 bfd3acad6798310e0225310226d4a1a3
BLAKE2b-256 96b0422b88b7e3f91abfd9c2296195016911ff551b3c95586d4809d3f2c39ed9

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: softcut_py-0.4.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 192.2 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

Hashes for softcut_py-0.4.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a5ecc1d1026b3a795edd07cb9b8618d253a7be748fd5b60cc6a61d0b7235d300
MD5 b46ffb893a8a80dfc393efb2937e44d2
BLAKE2b-256 4eb13e7953303ed88bcf84b12dc615f9232ecaa3ee0c63206417492f3d7c8e67

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 360bce12b3fd5189de974f26fd0b80255dc3f36473062a6c3497815cb089a59e
MD5 a55ebfca65bd1aaa5e09526a807ad9a6
BLAKE2b-256 2abb770e0e5bc71c77bb20dd79ea50f36e3bd4b913209b954121e759ae79ef15

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7cfffe0c1fab767935e977dc0af07ca5b802c1019a7e981c6301836c39f4c727
MD5 1ede756c1a1e08fa610cd86039ef3689
BLAKE2b-256 aadd7befbbad901ae80150222f8b917584c80b9c6fb30fa2113ae24768a6e4c2

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c65115ab1495ec8b3701a56ee9eaf4864ca152a72a7401b712c54e7f1419624
MD5 a879d8f7602faa0715153d368d035e3c
BLAKE2b-256 450579ab2ad2e0764a504520f01473caceaf9841c759c22fc52abc57450d58f8

See more details on using hashes here.

File details

Details for the file softcut_py-0.4.2-cp310-cp310-macosx_10_14_x86_64.whl.

File metadata

File hashes

Hashes for softcut_py-0.4.2-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ee8508bdb8bcc1e8a7292f5a76e8554ad15310196ae15ae021ad88547e36f846
MD5 228cf585d7f03331e84a779343714559
BLAKE2b-256 8a9dc3ce4dda0ded979c696d750048479cae4c34b893a8e25a3c9850f37031e4

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.4.2 This release

26 files

0.4.1

26 files

0.4.0

26 files

0.3.0

26 files

0.2.0

26 files

0.1.1

26 files

0.1.0

25 files

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