Minimal embedded SuperCollider synthesis engine (libscsynth) wrapper
Project description
nanosynth
nanosynth is a Python package that embeds SuperCollider's libscsynth synthesis engine in-process using nanobind. It makes it possible to define SynthDefs in Python, compile them to SuperCollider's SCgf binary format, boot the embedded audio engine, and control it via OSC -- all without leaving Python.
Features
- Embedded synthesis engine -- libscsynth runs in-process as a Python extension (vendored and built from source), no separate scsynth process required
- High-level
Serverclass -- boot/quit lifecycle, node ID allocation, SynthDef dispatch, and convenience methods (synth,group,free,set). Context manager support andmanaged_synth()/managed_group()for automatic node cleanup - Pythonic SynthDef builder -- define UGen graphs using a context manager and operator overloading, compiled to SuperCollider's SCgf binary format
- 340+ UGens -- oscillators, filters, delays, noise, chaos, granular, demand, dynamics, panning, physical modeling, reverb, phase vocoder, machine listening, stochastic synthesis, and more
- Envelope system --
Envelopeclass with factory methods (adsr,asr,linen,percussive,triangle) and theEnvGenUGen - OSC codec -- pure-Python
OscMessage/OscBundleencode/decode with optional C++ acceleration via nanobind @synthdefdecorator -- shorthand for defining SynthDefs as plain functions with parameter rate/lag annotations- Full type safety -- passes
mypy --strict, complete type annotations throughout
Requirements
- Python 3.10+
- uv (package manager)
- For embedded scsynth: SuperCollider 3.14.1, libsndfile, and PortAudio are vendored and built from source automatically. Audio backend: CoreAudio on macOS, PortAudio (ALSA) on Linux, PortAudio (WASAPI) on Windows -- no system-level audio dependencies beyond the compiler toolchain.
Installation
pip install nanosynth
Or build from source:
# Editable install with embedded libscsynth
uv pip install -e .
# Build wheel (incremental -- reuses cmake build cache in build/)
make build
# Install without the audio engine (OSC codec + SynthDef compiler only)
uv pip install -e . -C cmake.define.NANOSYNTH_EMBED_SCSYNTH=OFF
Quick Start
Run the Audio Demos
make demos
Defining and Compiling a SynthDef
No embedded engine required -- you can define UGen graphs and compile them to SCgf bytes for use with any SuperCollider server:
from nanosynth import SynthDefBuilder, DoneAction, compile_synthdefs
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Out, Pan2, SinOsc
with SynthDefBuilder(frequency=440.0, amplitude=0.3) as builder:
sig = SinOsc.ar(frequency=builder["frequency"])
sig = sig * builder["amplitude"]
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.1, sustain_time=1.8, release_time=0.1),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env
Out.ar(bus=0, source=Pan2.ar(source=sig))
synthdef = builder.build(name="sine")
scgf_bytes = synthdef.compile()
Using the @synthdef Decorator
For simpler definitions, use the decorator to skip the builder boilerplate. Parameter rates and lags are specified positionally:
from nanosynth import synthdef, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Out, Pan2, SinOsc
@synthdef("kr", ("kr", 0.5)) # freq: control rate, amp: control rate with 0.5s lag
def my_sine(freq=440.0, amp=0.3):
sig = SinOsc.ar(frequency=freq)
env = EnvGen.kr(
envelope=Envelope.percussive(attack_time=0.01, release_time=1.0),
done_action=DoneAction.FREE_SYNTH,
)
Out.ar(bus=0, source=Pan2.ar(source=sig * amp * env))
scgf_bytes = my_sine.compile() # my_sine is a SynthDef instance
Subtractive Synthesis
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import LFNoise1, LPF, Out, Pan2, RLPF, Saw, WhiteNoise, XLine
# Saw wave through a sweeping low-pass filter
with SynthDefBuilder(frequency=110.0, amplitude=0.4) as builder:
sig = Saw.ar(frequency=builder["frequency"])
cutoff = XLine.kr(start=8000.0, stop=200.0, duration=3.0,
done_action=DoneAction.FREE_SYNTH)
sig = LPF.ar(source=sig, frequency=cutoff)
sig = sig * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
filtered_saw = builder.build(name="filtered_saw")
# White noise through a resonant LPF with LFO-modulated cutoff
with SynthDefBuilder(amplitude=0.15) as builder:
sig = WhiteNoise.ar()
lfo = LFNoise1.kr(frequency=4.0)
cutoff = lfo * 1900.0 + 2100.0 # map [-1,1] to [200, 4000]
sig = RLPF.ar(source=sig, frequency=cutoff, reciprocal_of_q=0.1)
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.5, sustain_time=2.0, release_time=0.5),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
resonant_noise = builder.build(name="resonant_noise")
FM Synthesis
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Out, Pan2, SinOsc
with SynthDefBuilder(
carrier_freq=440.0, mod_ratio=2.0, mod_index=3.0,
amplitude=0.3, gate=1.0,
) as builder:
mod_freq = builder["carrier_freq"] * builder["mod_ratio"]
modulator = SinOsc.ar(frequency=mod_freq) * builder["mod_index"] * mod_freq
carrier = SinOsc.ar(frequency=builder["carrier_freq"] + modulator)
env = EnvGen.kr(
envelope=Envelope.adsr(
attack_time=0.01, decay_time=0.1, sustain=0.7, release_time=0.3,
),
gate=builder["gate"],
done_action=DoneAction.FREE_SYNTH,
)
sig = carrier * env * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
fm_synth = builder.build(name="fm_synth")
Additive Synthesis
Sum harmonics with decreasing amplitude to build a rich tone from pure sine partials:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Out, Pan2, SinOsc
with SynthDefBuilder(frequency=200.0, amplitude=0.3) as builder:
sig = SinOsc.ar(frequency=builder["frequency"]) * 1.0
sig = sig + SinOsc.ar(frequency=builder["frequency"] * 2.0) * 0.5
sig = sig + SinOsc.ar(frequency=builder["frequency"] * 3.0) * 0.33
sig = sig + SinOsc.ar(frequency=builder["frequency"] * 4.0) * 0.25
sig = sig + SinOsc.ar(frequency=builder["frequency"] * 5.0) * 0.2
sig = sig * 0.3 # normalize
env = EnvGen.kr(
envelope=Envelope.percussive(attack_time=0.01, release_time=2.0),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
additive = builder.build(name="additive")
Plucked String (Physical Modeling)
Karplus-Strong style plucked string using the Pluck UGen:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Dust, Out, Pan2, Pluck, WhiteNoise
with SynthDefBuilder(frequency=440.0, amplitude=0.5, decay=5.0) as builder:
trig = Dust.ar(density=1.0)
sig = Pluck.ar(
source=WhiteNoise.ar(),
trigger=trig,
maximum_delay_time=1.0 / 100.0,
delay_time=1.0 / builder["frequency"],
decay_time=builder["decay"],
coefficient=0.3,
)
sig = sig * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
pluck = builder.build(name="plucked_string")
Delay and Reverb Effects
Process a dry signal through comb delay and FreeVerb:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import CombC, FreeVerb, Out, Pan2, Saw, LPF
with SynthDefBuilder(frequency=220.0, amplitude=0.3) as builder:
# Dry signal: filtered saw
dry = Saw.ar(frequency=builder["frequency"])
dry = LPF.ar(source=dry, frequency=2000.0)
env = EnvGen.kr(
envelope=Envelope.percussive(attack_time=0.005, release_time=0.3),
done_action=DoneAction.FREE_SYNTH,
)
dry = dry * env * builder["amplitude"]
# Comb delay for metallic echo
sig = CombC.ar(
source=dry,
maximum_delay_time=0.2,
delay_time=0.15,
decay_time=2.0,
)
# Reverb
sig = FreeVerb.ar(source=dry + sig, mix=0.4, room_size=0.8, damping=0.3)
Out.ar(bus=0, source=Pan2.ar(source=sig))
delay_reverb = builder.build(name="delay_reverb")
Demand-Rate Sequencing
Use demand UGens to sequence pitches without host-side scheduling:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Duty, Dseq, Out, Pan2, SinOsc
with SynthDefBuilder(amplitude=0.3) as builder:
# Dseq loops a sequence of MIDI-note frequencies at demand rate
freq_pattern = Dseq.dr(
repeats=4,
sequence=[261.63, 293.66, 329.63, 392.00, 440.00, 392.00, 329.63, 293.66],
)
# Duty reads from the demand pattern every 0.25 seconds
freq = Duty.kr(duration=0.25, level=freq_pattern)
sig = SinOsc.ar(frequency=freq) * builder["amplitude"]
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.01, sustain_time=7.9, release_time=0.1),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env
Out.ar(bus=0, source=Pan2.ar(source=sig))
sequencer = builder.build(name="sequencer")
Ring Modulation
Multiply two signals together for classic ring modulation:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import LFTri, Out, Pan2, SinOsc
with SynthDefBuilder(
carrier_freq=440.0, mod_freq=60.0, amplitude=0.3,
) as builder:
carrier = SinOsc.ar(frequency=builder["carrier_freq"])
modulator = LFTri.ar(frequency=builder["mod_freq"])
sig = carrier * modulator # ring mod = simple multiplication
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.05, sustain_time=2.0, release_time=0.5),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
ring_mod = builder.build(name="ring_mod")
Stereo Width with Detuning
Fatten a sound by panning two slightly detuned oscillators:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import LPF, Out, Saw
with SynthDefBuilder(frequency=110.0, detune=0.5, amplitude=0.4) as builder:
left = Saw.ar(frequency=builder["frequency"] - builder["detune"])
right = Saw.ar(frequency=builder["frequency"] + builder["detune"])
left = LPF.ar(source=left, frequency=3000.0)
right = LPF.ar(source=right, frequency=3000.0)
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.1, sustain_time=2.0, release_time=0.5),
done_action=DoneAction.FREE_SYNTH,
)
left = left * env * builder["amplitude"]
right = right * env * builder["amplitude"]
Out.ar(bus=0, source=[left, right]) # direct stereo output
stereo_saw = builder.build(name="stereo_saw")
Dynamics Processing
Apply compression to a signal using Compander:
from nanosynth import SynthDefBuilder, DoneAction
from nanosynth.envelopes import EnvGen, Envelope
from nanosynth.ugens import Compander, Dust, Out, Pan2, Ringz
with SynthDefBuilder(amplitude=0.5) as builder:
# Sparse impulses through a resonant filter -- wide dynamic range
sig = Ringz.ar(
source=Dust.ar(density=3.0),
frequency=2000.0,
decay_time=0.2,
)
# Compress: bring quiet parts up, loud parts down
sig = Compander.ar(
source=sig,
control=sig,
threshold=0.3,
slope_below=2.0, # expand below threshold
slope_above=0.5, # compress above threshold
clamp_time=0.01,
relax_time=0.1,
)
env = EnvGen.kr(
envelope=Envelope.linen(attack_time=0.01, sustain_time=3.0, release_time=0.5),
done_action=DoneAction.FREE_SYNTH,
)
sig = sig * env * builder["amplitude"]
Out.ar(bus=0, source=Pan2.ar(source=sig))
compressed = builder.build(name="compressed")
Booting the Embedded Engine and Playing Sound
The Server class wraps the embedded engine lifecycle. Use it as a context manager to boot on entry and shut down on exit:
import time
from nanosynth import Server, Options
with Server(Options(verbosity=0)) as server:
# Send the SynthDef we defined above
synthdef.send(server)
time.sleep(0.1)
# Create a synth -- returns a node ID
node = server.synth("sine", frequency=440.0, amplitude=0.3)
time.sleep(2.0)
server.free(node)
# Engine shuts down automatically on context exit
Or use SynthDef.play() to send and create a synth in one call:
with Server() as server:
node = synthdef.play(server, frequency=880.0, amplitude=0.2)
time.sleep(2.0)
Managed Nodes (Automatic Cleanup)
managed_synth() and managed_group() create nodes that are automatically freed on context exit, even if an exception occurs:
import time
from nanosynth import Server
with Server() as server:
synthdef.send(server)
time.sleep(0.1)
with server.managed_synth("sine", frequency=440.0, amplitude=0.3) as node:
print(f"Playing node {node}...")
time.sleep(2.0)
# node freed automatically here
# Group multiple voices and free them together
with server.managed_group(target=1) as group:
server.synth("sine", target=group, frequency=261.63, amplitude=0.2)
server.synth("sine", target=group, frequency=329.63, amplitude=0.2)
server.synth("sine", target=group, frequency=392.00, amplitude=0.2)
time.sleep(2.0)
# entire group freed here
Debugging SynthDef Graphs
SynthDef.dump_ugens() prints a human-readable UGen graph (like SuperCollider's SynthDef.dumpUGens):
print(synthdef.dump_ugens())
# SynthDef: sine
# 0: Control.kr - frequency, amplitude
# 1: SinOsc.ar(frequency: Control[0], phase: 0.0)
# 2: BinaryOpUGen.ar(MULTIPLICATION, a: SinOsc[0], b: Control[1])
# ...
OSC Codec
The OSC module works standalone for any OSC communication needs:
from nanosynth import OscMessage, OscBundle
# Encode
msg = OscMessage("/s_new", "sine", 1000, 0, 1, "frequency", 440.0)
datagram = msg.to_datagram()
# Decode
decoded = OscMessage.from_datagram(datagram)
assert decoded == msg
# Bundles
bundle = OscBundle(
timestamp=None, # immediately
contents=[
OscMessage("/s_new", "sine", 1000, 0, 1),
OscMessage("/n_set", 1000, "frequency", 880.0),
],
)
bundle_bytes = bundle.to_datagram()
Available UGens
Organized by category:
| Category | UGens |
|---|---|
| Oscillators | SinOsc, Saw, Pulse, Blip, Klank, LFSaw, LFPulse, LFTri, LFCub, LFPar, VarSaw, SyncSaw, Impulse, FSinOsc, LFGauss, Vibrato, Osc, OscN, COsc, VOsc, VOsc3 |
| Filters | LPF, HPF, BPF, BRF, RLPF, RHPF, MoogFF, Lag, Lag2, Lag3, LagUD, Lag2UD, Lag3UD, Ramp, Decay, Decay2, Ringz, Formlet, Median, LeakDC, OnePole, OneZero, TwoPole, TwoZero, APF, FOS, SOS, MidEQ, Slew, Slope, Integrator, DetectSilence, Changed |
| BEQ Filters | BLowPass, BHiPass, BBandPass, BBandStop, BAllPass, BLowShelf, BHiShelf, BPeakEQ, BLowCut, BHiCut |
| Noise | WhiteNoise, PinkNoise, BrownNoise, GrayNoise, ClipNoise, Dust, Dust2, Crackle, LFNoise0, LFNoise1, LFNoise2, LFDNoise0, LFDNoise1, LFDNoise3, LFClipNoise, LFDClipNoise, Logistic |
| Stochastic | Gendy1, Gendy2, Gendy3 |
| Delays | DelayN, DelayL, DelayC, Delay1, Delay2, CombN, CombL, CombC, AllpassN, AllpassL, AllpassC, BufDelayN, BufDelayL, BufDelayC, BufCombN, BufCombL, BufCombC, BufAllpassN, BufAllpassL, BufAllpassC, DelTapRd, DelTapWr |
| Envelopes | EnvGen, Linen, Done, Free, FreeSelf, FreeSelfWhenDone, Pause, PauseSelf, PauseSelfWhenDone |
| Panning | Pan2, Pan4, PanAz, PanB, PanB2, BiPanB2, Balance2, Rotate2, DecodeB2, XFade2, Splay |
| Demand | Dseq, Dser, Dseries, Drand, Dxrand, Dshuf, Dwrand, Dwhite, Dbrown, Diwhite, Dibrown, Dgeom, Demand, Duty, DemandEnvGen, Dbufrd, Dbufwr, Dstutter, Dreset, Dswitch, Dswitch1, Dunique |
| Dynamics | Compander, CompanderD, Limiter, Normalizer, Amplitude |
| Chaos | LorenzL, HenonN/L/C, GbmanN/L, LatoocarfianN/L/C, LinCongN/L/C, CuspN/L, QuadN/L/C, StandardN/L, FBSineN/L/C |
| Granular | GrainBuf, GrainIn, PitchShift, Warp1 |
| Buffer I/O | PlayBuf, RecordBuf, BufRd, BufWr, ClearBuf, LocalBuf, MaxLocalBufs, ScopeOut, ScopeOut2 |
| Disk I/O | DiskIn, DiskOut, VDiskIn |
| Physical Modeling | Pluck, Ball, TBall, Spring |
| Reverb | FreeVerb |
| Convolution | Convolution, Convolution2, Convolution2L, Convolution3 |
| Phase Vocoder | FFT, IFFT, PV_Add, PV_BinScramble, PV_BinShift, PV_BinWipe, PV_BrickWall, PV_ConformalMap, PV_Conj, PV_Copy, PV_CopyPhase, PV_Diffuser, PV_Div, PV_HainsworthFoote, PV_JensenAndersen, PV_LocalMax, PV_MagAbove, PV_MagBelow, PV_MagClip, PV_MagDiv, PV_MagFreeze, PV_MagMul, PV_MagNoise, PV_MagShift, PV_MagSmear, PV_MagSquared, PV_Max, PV_Min, PV_Mul, PV_PhaseShift, PV_PhaseShift90, PV_PhaseShift270, PV_RandComb, PV_RandWipe, PV_RectComb, PV_RectComb2, RunningSum |
| Machine Listening | BeatTrack, BeatTrack2, KeyTrack, Loudness, MFCC, Onsets, Pitch, SpecCentroid, SpecFlatness, SpecPcile |
| Hilbert | FreqShift, Hilbert, HilbertFIR |
| I/O | In, Out, InFeedback, LocalIn, LocalOut, OffsetOut, ReplaceOut, XOut |
| Lines | Line, XLine, LinExp, LinLin, DC, K2A, A2K, AmpComp, AmpCompA, Silence |
| Triggers | Trig, Trig1, Latch, Gate, Schmidt, Sweep, Phasor, Peak, PeakFollower, RunningMax, RunningMin, SendTrig, Poll, SendReply, SendPeakRMS, ToggleFF, TDelay, ZeroCrossing, LeastChange, MostChange, Clip, Fold, Wrap, InRange |
| Mouse/Keyboard | KeyState, MouseButton, MouseX, MouseY |
| Info | SampleRate, SampleDur, BlockSize, ControlRate, ControlDur, SubsampleOffset, RadiansPerSample, NumRunningSynths, BufFrames, BufSamples, BufSampleRate, BufRateScale, BufChannels, BufDur, NumOutputBuses, NumInputBuses, NumAudioBuses, NumControlBuses, NumBuffers, NodeID |
| Random | Rand, IRand, ExpRand, LinRand, NRand, TRand, TIRand, TExpRand, CoinGate, TWindex, RandID, RandSeed, Hasher, MantissaMask |
| Utility | MulAdd, Sum3, Sum4, Mix |
| Safety | CheckBadValues, Sanitize |
Envelope Types
from nanosynth import Envelope
Envelope.adsr(attack_time=0.01, decay_time=0.3, sustain=0.5, release_time=1.0)
Envelope.asr(attack_time=0.01, sustain=1.0, release_time=1.0)
Envelope.linen(attack_time=0.01, sustain_time=1.0, release_time=1.0)
Envelope.percussive(attack_time=0.01, release_time=1.0)
Envelope.triangle(duration=1.0, amplitude=1.0)
# Custom envelope
Envelope(amplitudes=[0, 1, 0.5, 0], durations=[0.1, 0.3, 0.6], curves=[-4])
Development
make dev # uv sync + editable install
make build # build wheel (incremental via build cache)
make sdist # build source distribution
make test # run tests
make lint # ruff check --fix
make format # ruff format
make typecheck # mypy --strict
make qa # all of the above
make clean # remove transitory files (preserves build cache)
make reset # clean everything including build cache
CI
The GitHub Actions workflow (.github/workflows/build.yml) builds wheels for CPython 3.10--3.14 on macOS ARM64, Linux x86_64, and Windows x86_64 using cibuildwheel. A qa job runs lint, format check, typecheck, and tests on every push. An sdist is built separately and all artifacts are aggregated into a single downloadable archive.
A separate release workflow (.github/workflows/release.yml) publishes to PyPI on tag push via trusted publisher, with manual dispatch for TestPyPI.
Attributions
- SuperCollider -- the audio synthesis engine and programming language that nanosynth embeds.
- supriya -- the inspiration for nanosynth; its UGen system and SynthDef compiler were the basis for this project's graph compilation pipeline.
- TidalCycles -- live coding pattern language for music, built on SuperCollider.
- Strudel -- JavaScript port of TidalCycles for browser-based live coding.
- Sonic Pi -- live coding music synth built on SuperCollider.
- nanobind -- the C++/Python binding library used to embed libscsynth and the OSC codec.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 nanosynth-0.1.2.tar.gz.
File metadata
- Download URL: nanosynth-0.1.2.tar.gz
- Upload date:
- Size: 6.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a8b2c0032f67a059e9fce8809e731b02ecd10a730ccaf96dbba409e3d18be37
|
|
| MD5 |
40a8da3f0f46f0e51cc7042e6273b7c9
|
|
| BLAKE2b-256 |
1c4676f1b104d2ba6ff7b85057763c5738e6886b231ce65973a205c17a311f31
|
File details
Details for the file nanosynth-0.1.2-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 1.3 MB
- 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 |
cef223ea29484da288a0a22e79e487662203a6a65bc49cb8edc1d3f7687eaf15
|
|
| MD5 |
762742951a9229dd36b995644db96e6f
|
|
| BLAKE2b-256 |
8013dccada8c5cf1a4533d2ca97e06213330f18e4ca97b83ad1fd766f0063ca7
|
File details
Details for the file nanosynth-0.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- 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 |
4a9e4eec7feb30e7dad9c47250568fdf4667d57a2e0070ad206eab287a5e0535
|
|
| MD5 |
5009bf0bbdc8a1391e5d03495ae92cdf
|
|
| BLAKE2b-256 |
0ae18ba3d81bb9b563fae0f8b8660eb7b07cee9d1d2b158819a14abb1310e0fb
|
File details
Details for the file nanosynth-0.1.2-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- 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 |
37ca1e46173bec53df57ee62cb1b3b44702c5cf6761f221153979f4f8d0845c8
|
|
| MD5 |
dd697ac48e9ca0a88188ceb5b1173b37
|
|
| BLAKE2b-256 |
65c50d4d09342ffd72af963954f9babd33af8439934f6853696b1f250d361355
|
File details
Details for the file nanosynth-0.1.2-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- 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 |
eb70e21a3700c1cb401fc9b1058755cf8a550b9e1b936109efde902f161cb9cf
|
|
| MD5 |
cda9f6820f0a82d59740adb90fbb2f41
|
|
| BLAKE2b-256 |
138671d50fb4e5a37d3362714c8aee2a47c8a5f54ec126eb2f47779d1a65e5f8
|
File details
Details for the file nanosynth-0.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- 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 |
d9607635e524dc88860f4f40ca6bad2c233c86d9ccd45ef024658631ca0334a6
|
|
| MD5 |
ee5a69d96642b201079b3f9a23894bee
|
|
| BLAKE2b-256 |
5cb62ea9edb1ad465c048bc42597a79c3110078826028c2b6740a6ffa6134c12
|
File details
Details for the file nanosynth-0.1.2-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- 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 |
a36ad34db1b7278132e20bc09f6b9f1fbc9b082333dc5cf49dd0c5c588cf94cb
|
|
| MD5 |
f34e7084ee4e7e116f6c8f0fe78f9944
|
|
| BLAKE2b-256 |
98a4eab319d6f7bbcdaef9d9025822da1e9482b91b59eed76cba0307b517b6af
|
File details
Details for the file nanosynth-0.1.2-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- 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 |
cd30c5cf71bdbb1a6f00ca013a736c8de00bcc1f36e575e6414f3cc77f859d9d
|
|
| MD5 |
1df5ab744831aaa134ca82ecd30c2096
|
|
| BLAKE2b-256 |
4dd1bb6d5ec362606a20a438299c49578c251a9343cf9fec1710ca9765e037d9
|
File details
Details for the file nanosynth-0.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- 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 |
65d3f00992289e9b54b6c7d89c3826fc3c11f603cd0fbee79fc639273eb1edf5
|
|
| MD5 |
470da2411a4bd18c871c7dbea33f1181
|
|
| BLAKE2b-256 |
41fbe0c0b7946808e5d13296e1efcc6a1983d464ff2b09bf19c01c060ba6af1f
|
File details
Details for the file nanosynth-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- 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 |
5c96c7aa1842c3ae4fdfe1599b71b2efc13e1c2aafc3e274b8c399cc9dfad5b0
|
|
| MD5 |
58c208aa68e7629aeb4ef1ea92775ffb
|
|
| BLAKE2b-256 |
1fb4557126c3863eb7fbaae7af4600c977e9c97ce0f80f756a8629c9b8dd32af
|
File details
Details for the file nanosynth-0.1.2-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- 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 |
6ea1454112428f07f60c4cd01e95ea67c694a9fe7acdec875055f59b2e3aebfc
|
|
| MD5 |
0639fada0618a49f025e0ec40b9b30b1
|
|
| BLAKE2b-256 |
358674e1091257414fe789042102662705f4422d23df08ad3c2ca5593fed1547
|
File details
Details for the file nanosynth-0.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- 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 |
bc61219fffa06d02f75bf06f116a1667bb5aefde80a9ce4433b9cfc61e1bc29a
|
|
| MD5 |
ee875a6de89d1067c8e9a9f0c5cd7ba9
|
|
| BLAKE2b-256 |
12f60ee10ad663419f8de2d592afc60245f2cd7db6411768a9a8b59405ddcab7
|
File details
Details for the file nanosynth-0.1.2-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- 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 |
0868ecda5413db0dfeacaa207a08bf0f8fa90e65592360d484cda58d6605d456
|
|
| MD5 |
b9c2aefa2de978a10461854ae5246aca
|
|
| BLAKE2b-256 |
8ff0383c54f8510be69f2540c1a917622e9087b54b981164231d6fe9bef98557
|
File details
Details for the file nanosynth-0.1.2-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 1.2 MB
- 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 |
58590cfb0b40eebd19a395908775f4ee2e9fb475a3006710c764d50afef50407
|
|
| MD5 |
505fcd7aefefc378473052013c66620c
|
|
| BLAKE2b-256 |
a82b03cc25c46386cd954764170f6673ce36f9365bc516492c657e53f937e292
|
File details
Details for the file nanosynth-0.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 2.1 MB
- 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 |
6d93f63c0ad37ca94b8c1c6d39629a4f6ac00ae7613c4695f6a47f7a28858da6
|
|
| MD5 |
3eeb28d143827d2add5f689646b6ee6d
|
|
| BLAKE2b-256 |
998e4145e1eae828dc9b28a95cb501703a820b0ede53bb74dfc560218ca15033
|
File details
Details for the file nanosynth-0.1.2-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: nanosynth-0.1.2-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- 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 |
40bf480f82bb7aaa388d69ecabdf661e98a306c60024f902ad41116bf0f09bbe
|
|
| MD5 |
5b078550d80423f9b3764d79a1ee9005
|
|
| BLAKE2b-256 |
a0acd99d8e0945a01e6c08dbbf102307193dae87adce9bebe0822ed0bbae89af
|