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 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_gain and the feedback matrix are plain aligned writes.)

  • 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.1.tar.gz (725.9 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.1-cp314-cp314-win_amd64.whl (195.7 kB view details)

Uploaded CPython 3.14Windows x86-64

softcut_py-0.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (268.1 kB view details)

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

softcut_py-0.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (258.6 kB view details)

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

softcut_py-0.4.1-cp314-cp314-macosx_11_0_arm64.whl (233.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

softcut_py-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl (249.4 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

softcut_py-0.4.1-cp313-cp313-win_amd64.whl (190.1 kB view details)

Uploaded CPython 3.13Windows x86-64

softcut_py-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (268.1 kB view details)

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

softcut_py-0.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (258.3 kB view details)

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

softcut_py-0.4.1-cp313-cp313-macosx_11_0_arm64.whl (233.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

softcut_py-0.4.1-cp313-cp313-macosx_10_14_x86_64.whl (249.2 kB view details)

Uploaded CPython 3.13macOS 10.14+ x86-64

softcut_py-0.4.1-cp312-cp312-win_amd64.whl (190.2 kB view details)

Uploaded CPython 3.12Windows x86-64

softcut_py-0.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (268.1 kB view details)

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

softcut_py-0.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (258.3 kB view details)

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

softcut_py-0.4.1-cp312-cp312-macosx_11_0_arm64.whl (233.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

softcut_py-0.4.1-cp312-cp312-macosx_10_14_x86_64.whl (249.3 kB view details)

Uploaded CPython 3.12macOS 10.14+ x86-64

softcut_py-0.4.1-cp311-cp311-win_amd64.whl (190.8 kB view details)

Uploaded CPython 3.11Windows x86-64

softcut_py-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (269.0 kB view details)

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

softcut_py-0.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (259.3 kB view details)

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

softcut_py-0.4.1-cp311-cp311-macosx_11_0_arm64.whl (234.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

softcut_py-0.4.1-cp311-cp311-macosx_10_14_x86_64.whl (249.8 kB view details)

Uploaded CPython 3.11macOS 10.14+ x86-64

softcut_py-0.4.1-cp310-cp310-win_amd64.whl (190.9 kB view details)

Uploaded CPython 3.10Windows x86-64

softcut_py-0.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (269.3 kB view details)

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

softcut_py-0.4.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (259.7 kB view details)

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

softcut_py-0.4.1-cp310-cp310-macosx_11_0_arm64.whl (234.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

softcut_py-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl (250.1 kB view details)

Uploaded CPython 3.10macOS 10.14+ x86-64

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

Hashes for softcut_py-0.4.1.tar.gz
Algorithm Hash digest
SHA256 b541e1cfe8aeef46734ad3a7f02a65167079491bccfb775751f71209a5e2dfee
MD5 af11d84aff93889814abbfd31c56c97b
BLAKE2b-256 04dc9ef851d6f3ec59d858900b357c1c65666d05636fcb534752350c9672359f

See more details on using hashes here.

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

Hashes for softcut_py-0.4.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 7eade38e08743c79ac6cbc17ae7635c42cc8d4d8bdcafc7301b20e4d629d2768
MD5 3f68ebc1a87c640e6d8b372c0d492b51
BLAKE2b-256 8dda0e9177e64d8377d3653260f990e0c2d84210cc355ef8b4d7ee8563b43ac7

See more details on using hashes here.

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

File hashes

Hashes for softcut_py-0.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 336ca6cf289c0f33b15852e1858be3747fa3ea2a03cbda381de173843727a3e1
MD5 709df6038a65c8bd36ed86814329e493
BLAKE2b-256 93258866336f491229583912ff5b2b54eca2e957fac0903fa9706051dc243ea2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 81d9e73948c00d12aff0d19f3f68adeaae6172dd8ef451adbfe01918111c8718
MD5 df17997eb7c8b81512fafd6513151f18
BLAKE2b-256 d39c799320ccad01e1d789a9b23f6ee0512a528e207477228f66eddec9ddbc4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44793d7cfc1e9067d076ee56b3651f1a80aaa3c8670b61b6b9f5aecc6e4e969d
MD5 c9e7d71ec320ac067b4f8840a061826d
BLAKE2b-256 0d3ff004bb801b8f916e680e604724d271e532d74704628184d84e8097518ea1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 5572061e7f8178a973457baca21a258dc95666c8ebd485d25219106335b0bae4
MD5 a618f5fab09becb8954c575e117d30cd
BLAKE2b-256 76bac8d85e75997ae0a413b5333bdb098d02cdb67904711f76be86b382c9f0e6

See more details on using hashes here.

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

Hashes for softcut_py-0.4.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b6a5fcdb558c8e520ea167c41415c0d1fca10f3453532fb77c6234f31cb27772
MD5 f8fe4f0fed143a5708badee9cfe18bb5
BLAKE2b-256 eaf9d56d0629078d4e5e15dc50a76a170b1287946ea4dfe0643c6b2870f033a3

See more details on using hashes here.

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

File hashes

Hashes for softcut_py-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1daea6941cce273b9b8fbb26c113785bb8a053ed069ec9ecd2672db65dbcd8a8
MD5 0c8610f254d02e1ba93792f8707882ff
BLAKE2b-256 8e46d956f5684e62e6c3383cf268b427b918c85cf40586d878d0015834b78b3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6d5c639394eccaf2a1e329538b52d4fc7831f13a8933ec09005d747abbfdfde2
MD5 4a920445e9f64e9602d9c99b0a28ce42
BLAKE2b-256 97c6473ddc1afb62130577e56491cc01fadc355ee550441e333f62841532fd63

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f0a9947f31bc6bb39c0d742349ad18f8e8439950251a187e0eeff6c4f9a1e86c
MD5 0c1799042a84a88125032662c3d623ad
BLAKE2b-256 b40f98b3f825967d04a6d191f0841558011534f5b9fa2f5aab46036ec8acfae5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp313-cp313-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 65bc56b6160b06dec2d920794d2e1ef2ec1f213be86a7a74a4f8b40d77ba0542
MD5 03526915be5e6da46ece5d675c7e2a9e
BLAKE2b-256 51e621bb338e539268734bf62053b8d1dfe18fded246899798ffb6d8f958d84a

See more details on using hashes here.

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

Hashes for softcut_py-0.4.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a07d3ac713518f9b03b42e9cece52513fdc58b80bf2478534ac675293f7de848
MD5 6fa3a84493de5ba0471214990c38b7a1
BLAKE2b-256 a5e36e84c2fe2a85465258f3ec26f57b201957c83157870b07e70f193d049376

See more details on using hashes here.

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

File hashes

Hashes for softcut_py-0.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 527197e3a3e53df76e1722ab3f20c4de09da56ccc1e50dc76d1eae83de70c044
MD5 58353c3a45d3bd96b1c459debc300151
BLAKE2b-256 8ea84ec20ebe8a22370f6992c6493024380aa78da76f7d35b877aed3bb9918fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5cb273224a8a50bf2d8961927992d5f80181da558bbe59af12ccd9c600245d78
MD5 5003ae47eb70bb01d4b2618d566a3ffb
BLAKE2b-256 991fc73b058cc52a9b6a19bda91f6f21c6947542199af28ae842fe867fe46994

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 38e982b5dc850f253b0d21651ffc3fc9b10cd3fbb05c5cf80a09e049350993e7
MD5 757b0d6de62f2da65c0c8b9543af40bd
BLAKE2b-256 9c24145dc91860ce9c2b2721a2b402cd9fdb0a1f89dc92a044eea92cd9d2ee2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp312-cp312-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ba467427d541c235bdadd985f9fe6888db8ea8a8bfbec1bacc591e220833592c
MD5 01091011b5246f6da53bb4af808d61dd
BLAKE2b-256 101764070ca513194fcf5fb15ce64d549452723092c13ae3c3c354c277789133

See more details on using hashes here.

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

Hashes for softcut_py-0.4.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 cf39befd2bc79d694e5a240f6ed8965ed3924e83f6bed3c2a2732383f2a4018e
MD5 2b0cb272af93612ced88242a579b31bb
BLAKE2b-256 755eebed8a968791e9223edffa55fe402e1ce9ff2c3388390c103d0ae2b2c78f

See more details on using hashes here.

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

File hashes

Hashes for softcut_py-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0bab8f0cb60b2660577a7c2fa68a56e047c41816acc570ad814170ae3b369ef
MD5 c5730cdf0fed1d9bad606f684f4ab4f1
BLAKE2b-256 c786b0b5a3b32494d2974ee52eb695bab552961738b198a830fd2304c3a7a5e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 69f521429b4df09bbaf43f1d0ab843178018203de003125a5448b3451e725e87
MD5 62a2f175a26bd50b5dccdf92e9d9e866
BLAKE2b-256 abe192aae2faf00a569344b7fa30acf1d7b15e90177be34d3eefcf9d0ed0a639

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2a8ae527c462781769005d73f28777476a1a0f4d3139cdac40ccd85117ac45b7
MD5 eeec52a4ed4b38c79f857cdab36cd3ba
BLAKE2b-256 0a2cd5957f7d9790c50aed659d237524a05d9c737b3bc999c54c634e51da62c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp311-cp311-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 d35a9d18baa54ff66b3485c99fbe90221151e7056ed448d63f6857ac5e5edd41
MD5 33a9f46008b7c9b452e51373c20b2fbc
BLAKE2b-256 42b6f10a5a6c72a0d30dd505b2ab7088aba074e2b6cd53910ab6eee23c652d42

See more details on using hashes here.

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

Hashes for softcut_py-0.4.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 369ef2ade4a27e6cabbd541d3db181782f7d5ec25e993e620a4b1c0c7f9dc99f
MD5 1c8049d5e8bb1e250a5c0a4d9a81848e
BLAKE2b-256 8cf1ae4bc52a22705641e58a70db07d6c83f055baf052928615e7b3186f023e8

See more details on using hashes here.

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

File hashes

Hashes for softcut_py-0.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d57e727247c068893ad34f540b426e64e3d1b840f90e72a1518bac86728647b1
MD5 3625952d77282dca9644bcd498a75d8b
BLAKE2b-256 9a194bc020190101eec4b2e1705ac1f6a72a901afb72b07bff5b1ce660811aa0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 25cf923eee0117175c6e810372c2fbf8868b0c914e0e28bf315d049979a50bf5
MD5 13e2acb036423b1db99fb8567fcfad75
BLAKE2b-256 08c43faa123fdb6aab27c4bd8fbf7742a7848cfc799dc8c0bdcc082c58011eee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7aec5629554a3ec6cf6a3a137dd7b36ed3a4a9d1bfeeef86db9ff5eae287326b
MD5 865c645a3e9c103bd0aa591ecff25ed9
BLAKE2b-256 c026ee464c5a94aa3f5b6636670fbb9c602e559eb088640b49ec90f85d52805e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for softcut_py-0.4.1-cp310-cp310-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 463edc9315b738510382bf9cd344cee7f8b3220618d37dc47e1b56deb276c755
MD5 717183960c61604c445f2701e7bc1326
BLAKE2b-256 8a7a0755d5b811434db907ae8d70f950f821cadf62405545397c0ea392aa0fca

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.2

26 files

This release

0.4.1 This release

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