Skip to main content

Python parser and MIDI generator for the Alda music programming language

Project description

aldakit

PyPI version Python 3.10+ License: MIT

A zero-dependency Python parser and MIDI generator for the Alda music programming language[^1].

[^1]: Includes a rich REPL, native MIDI, and built-in audio via bundled prompt-toolkit, libremidi, and TinySoundFont respectively.

Features

  • Alda Parser - Full parser for the Alda music language with AST generation
  • MIDI Playback - Low-latency playback via libremidi (CoreMIDI, ALSA, WinMM)
  • Audio Playback - Built-in synthesis via TinySoundFont (no external synth required)
  • MIDI Export - Save compositions as Standard MIDI Files
  • MIDI Import - Load MIDI files and convert to Alda notation
  • Real-time Transcription - Record from MIDI keyboards and convert to Alda
  • Programmatic Composition - Build music with Python using the compose module
  • Music Theory - Scale, chord, and interval utilities
  • Transformers - Transpose, invert, augment, diminish, and more
  • Generative Music - Markov chains, L-systems, cellular automata, Euclidean rhythms
  • Interactive REPL - Syntax highlighting, auto-completion, and live playback
  • CLI Tools - Play, transcribe, and convert from the command line

Installation

Requires Python 3.10+

pip install aldakit

Or with uv:

uv add aldakit

Quick Start

Command Line

# Evaluate inline code
aldakit -e "piano: c d e f g"

# Interactive REPL
aldakit repl

# Play an Alda file (examples available in the repository)
aldakit examples/twinkle.alda

# Export to MIDI file
aldakit examples/bach-prelude.alda -o bach.mid

Python API

import aldakit

# Play directly
aldakit.play("piano: c d e f g")

# Save to MIDI file
aldakit.save("piano: c d e f g", "output.mid")

# Play from file
aldakit.play_file("song.alda")

# List available MIDI ports
print(aldakit.list_ports())

For more control, use the Score class:

from aldakit import Score

score = Score("""
piano:
  (tempo 120)
  o4 c4 d e f | g a b > c
""")

# Play with options
score.play(port="FluidSynth", wait=False)

# Save to file
score.save("output.mid")

# Access internals
print(f"Duration: {score.duration}s")
print(score.ast)   # Parsed AST
print(score.midi)  # MIDI sequence

MIDI Import

Import existing MIDI files and work with them as Alda:

from aldakit import Score

# Import a MIDI file
score = Score.from_midi_file("recording.mid")

# Or use from_file (auto-detects .mid/.midi)
score = Score.from_file("song.mid")

# View as Alda source
print(score.to_alda())
# piano:
# o4 c4 d e f | g a b > c

# Play the imported MIDI
score.play()

# Export to Alda file
score.save("song.alda")

# Re-export to MIDI
score.save("output.mid")

# Import with custom quantization grid
# Default is 0.25 (16th notes), use 0.5 for 8th notes
score = Score.from_midi_file("recording.mid", quantize_grid=0.5)

Features:

  • Multi-track MIDI files (each channel becomes a separate part)
  • Tempo detection and preservation
  • General MIDI instrument mapping
  • Chord detection for simultaneous notes
  • Configurable timing quantization

Real-Time MIDI Transcription

Record MIDI input from a keyboard or controller:

import aldakit

# List available MIDI input ports
print(aldakit.list_input_ports())

# Record for 10 seconds from the first available port
score = aldakit.transcribe(duration=10)

# Play back what was recorded
score.play()

# Export to Alda source
print(score.to_alda())

# Record with options
score = aldakit.transcribe(
    duration=30,
    port_name="My MIDI Keyboard",
    instrument="piano",
    tempo=120,
    quantize_grid=0.25,  # Quantize to 16th notes
)

For more control, use TranscribeSession:

from aldakit.midi.transcriber import TranscribeSession

session = TranscribeSession(quantize_grid=0.25, default_tempo=120)

# Set a callback for note events (optional)
session.on_note(lambda pitch, vel, on: print(f"Note: {pitch}, vel={vel}, on={on}"))

# Start recording
session.start()

# Poll periodically (in a loop or timer)
import time
for _ in range(100):
    session.poll()
    time.sleep(0.1)

# Stop and get the recorded notes
seq = session.stop()
print(seq.to_alda())

Programmatic Composition

Build music programmatically using the compose module:

from aldakit import Score
from aldakit.compose import part, note, rest, chord, seq, tempo, volume

# Create a score from compose elements
score = Score.from_elements(
    part("piano"),
    tempo(120),
    note("c", duration=4),
    note("d"),
    note("e"),
    chord("c", "e", "g", duration=2),
)
score.play()

# Builder pattern with method chaining
score = (
    Score.from_elements(part("violin"))
    .with_tempo(90)
    .add(note("g", duration=8), note("a"), note("b"))
)

# Note transformations
c = note("c", duration=4)
c_sharp = c.sharpen()           # C#
c_up_octave = c.transpose(12)   # Up one octave

# Repeat syntax
pattern = seq(note("c"), note("d"), note("e"))
repeated = pattern * 4  # Repeat 4 times

# Export to Alda source
print(score.to_alda())  # "violin: (tempo 90) g8 a b"

Available compose elements:

  • Notes: note("c", duration=4, octave=5, accidental="+", dots=1)
  • Rests: rest(duration=4), rest(ms=500)
  • Chords: chord("c", "e", "g"), chord(note("c"), note("e", accidental="+"))
  • Sequences: seq(note("c"), note("d")), Seq.from_alda("c d e")
  • Parts: part("piano"), part("violin", alias="v1")
  • Attributes: tempo(120), volume(80), octave(5), panning(50)
  • Dynamics: pp(), p(), mp(), mf(), f(), ff()
  • Advanced: cram(), voice(), voice_group(), var(), var_ref(), marker(), at_marker()

Scales and Chords

Build melodies and harmonies using music theory helpers:

from aldakit import Score
from aldakit.compose import part, tempo
from aldakit.compose import (
    # Scale functions
    scale, scale_notes, scale_degree, mode,
    relative_minor, relative_major,
    # Chord builders
    major, minor, dim, aug, maj7, min7, dom7,
    arpeggiate, invert_chord, voicing,
)

# Get scale pitches
c_major = scale("c", "major")       # ['c', 'd', 'e', 'f', 'g', 'a', 'b']
a_blues = scale("a", "blues")       # ['a', 'c', 'd', 'd+', 'e', 'g']

# Generate scale as playable notes
melody = scale_notes("c", "pentatonic", duration=8)

# Key relationships
rel_min = relative_minor("c")  # 'a' (C major -> A minor)
rel_maj = relative_major("a")  # 'c' (A minor -> C major)

# Build chords
c_maj = major("c")                    # C E G
a_min7 = min7("a")                    # A C E G
g_dom7 = dom7("g", inversion=1)       # B D F G (first inversion)

# Arpeggiate a chord
arp = arpeggiate(maj7("c"), pattern=[0, 1, 2, 3, 2, 1], duration=16)

# Custom voicing (spread chord across octaves)
spread = voicing(major("c"), [3, 4, 5])  # C3 E4 G5

# Create a I-IV-V-I progression
pitches = scale("c", "major")
progression = [
    major(pitches[0], duration=2),  # C major (I)
    major(pitches[3], duration=2),  # F major (IV)
    major(pitches[4], duration=2),  # G major (V)
    major(pitches[0], duration=1),  # C major (I)
]

score = Score.from_elements(
    part("piano"),
    tempo(100),
    *progression,
)
score.play()

Available scales: major, minor, harmonic-minor, melodic-minor, pentatonic, blues, chromatic, whole-tone, dorian, phrygian, lydian, mixolydian, locrian, japanese, arabic, hungarian-minor, spanish, bebop-dominant, bebop-major

Available chords: major, minor, dim, aug, sus2, sus4, maj7, min7, dom7, dim7, half_dim7, min_maj7, aug7, maj6, min6, dom9, maj9, min9, add9, power

Transformers

Transform sequences with pitch and structural operations:

from aldakit.compose import (
    note, seq,
    transpose, invert, reverse, shuffle,
    augment, diminish, fragment, loop, interleave,
    pipe,
)

# Create a motif
motif = seq(note("c", duration=8), note("d", duration=8), note("e", duration=8))

# Pitch transformers
up_fourth = transpose(motif, 5)      # Transpose up 5 semitones
inverted = invert(motif)             # Invert intervals around first note
backwards = reverse(motif)           # Retrograde

# Structural transformers
longer = augment(motif, 2)           # Double durations (8th -> quarter)
shorter = diminish(motif, 2)         # Halve durations (8th -> 16th)
first_two = fragment(motif, 2)       # Take first 2 elements
repeated = loop(motif, 4)            # Repeat 4 times (explicit)

# Chain transformations with pipe
result = pipe(
    motif,
    lambda s: transpose(s, 5),
    reverse,
    lambda s: augment(s, 2),
)

# All transforms preserve to_alda() export
print(result.to_alda())

MIDI Transformers

For post-MIDI-generation processing, use MIDI-level transformers that operate on absolute timing:

from aldakit import Score
from aldakit.midi.transform import (
    quantize, humanize, swing, stretch,
    accent, crescendo, normalize,
    filter_notes, trim, merge,
)

# Get MIDI sequence from a score
score = Score("piano: c d e f g a b > c")
midi_seq = score.midi

# Timing transformers
quantized = quantize(midi_seq, grid=0.25, strength=0.8)  # Snap to quarter-note grid
humanized = humanize(midi_seq, timing=0.02, velocity=10)  # Add subtle variations
swung = swing(midi_seq, grid=0.5, amount=0.3)            # Apply swing feel

# Velocity transformers
accented = accent(midi_seq, pattern=[1.0, 0.5, 0.5, 0.5])  # 4/4 accent pattern
crescendo_seq = crescendo(midi_seq, start_vel=50, end_vel=100)
normalized = normalize(midi_seq, target=100)

# Filtering and combining
filtered = filter_notes(midi_seq, lambda n: n.pitch >= 60)  # Keep notes >= middle C
trimmed = trim(midi_seq, start=0.0, end=2.0)               # First 2 seconds
merged = merge(midi_seq, another_seq)                       # Combine sequences

Note: MIDI transformers operate on absolute timing (seconds) and cannot be converted back to Alda notation.

Generative Functions

Create algorithmic compositions with generative functions:

from aldakit import Score
from aldakit.compose import part, tempo
from aldakit.compose.generate import (
    random_walk, euclidean, markov_chain, lsystem, cellular_automaton,
    shift_register, turing_machine,
)

# Random walk melody
melody = random_walk("c", steps=16, intervals=[-2, -1, 1, 2], duration=8, seed=42)

# Euclidean rhythms (e.g., Cuban tresillo: 3 hits over 8 steps)
rhythm = euclidean(hits=3, steps=8, pitch="c", duration=16)

# Markov chain
chain = markov_chain({
    "c": {"d": 0.5, "e": 0.3, "g": 0.2},
    "d": {"e": 0.6, "c": 0.4},
    "e": {"c": 0.5, "g": 0.5},
    "g": {"c": 1.0},
})
markov_melody = chain.generate(start="c", length=16, duration=8, seed=42)

# L-System (Fibonacci pattern)
from aldakit.compose import note, rest
fib = lsystem(
    axiom="A",
    rules={"A": "AB", "B": "A"},
    iterations=5,
    note_map={"A": note("c", duration=8), "B": note("e", duration=8)},
)

# Cellular automaton (Rule 110)
automaton = cellular_automaton(rule=110, width=8, steps=4, pitch_on="c", duration=16)

# Shift register (LFSR) - classic analog sequencer
lfsr = shift_register(16, bits=4, scale=["c", "e", "g", "b"], duration=16)

# Turing Machine - evolving loop (probability=0 for locked, higher for chaos)
turing = turing_machine(32, bits=8, probability=0.1, seed=42)

# Combine into a score
score = Score.from_elements(
    part("piano"),
    tempo(120),
    *melody.elements,
)
score.play()

CLI Reference

aldakit [-h] [--version] [-e CODE] [-o FILE] [--port NAME|INDEX]
       [--stdin] [--parse-only] [--no-wait] [-v]
       {repl,ports,transcribe,play} [file]

Subcommands

Command Description
repl Interactive REPL with syntax highlighting and auto-completion
ports List available MIDI ports (both input and output)
transcribe Record MIDI input and output Alda code
play Play an Alda file or code (default behavior)

Options

Option Description
file Alda file to play (use - for stdin)
-e, --eval CODE Evaluate Alda code directly
-o, --output FILE Save to MIDI file instead of playing
--port NAME|INDEX MIDI port by name or index (see aldakit ports). Auto-selects if only one port available.
--stdin Read from stdin (blank line to play)
--parse-only Print AST without playing
--no-wait Don't wait for playback to finish
-v, --verbose Verbose output

Examples

# Interactive REPL with syntax highlighting
aldakit repl

# List available MIDI ports (input and output)
aldakit ports
aldakit ports -o  # output ports only
aldakit ports -i  # input ports only

# Play with verbose output
aldakit -v examples/jazz.alda

# Play to a specific port (by index or name)
aldakit --port 0 examples/twinkle.alda
aldakit --port FluidSynth examples/twinkle.alda

# Read from stdin
echo "piano: c d e f g" | aldakit -

# Parse and show AST
aldakit --parse-only -e "piano: c/e/g"

# Export to MIDI file
aldakit examples/twinkle.alda -o twinkle.mid

# Record MIDI input for 10 seconds (default)
aldakit transcribe

# Record from a specific input port (by index or name)
aldakit transcribe --port 0
aldakit transcribe --port "My MIDI Keyboard"

# Record for 30 seconds with verbose note display
aldakit transcribe -d 30 -v

# Record with Alda-style note display
aldakit transcribe -d 10 -v --alda-notes

# Record and save to file
aldakit transcribe -o recording.alda
aldakit transcribe -o recording.mid

# Record and play back
aldakit transcribe --play

# Record with custom settings (swing feel, triplet quantization)
aldakit transcribe -d 20 -t 90 -i guitar --feel triplet --play

Interactive REPL

The REPL provides an interactive environment for composing and playing Alda code:

aldakit repl

Features:

  • Syntax highlighting
  • Auto-completion for instruments (3+ characters)
  • Command history (persistent across sessions)
  • Multi-line paste (use platform-specific paste: ctrl-v, shift-ctrl-v, cmd-v, etc.)
  • Multi-line input (Alt+Enter)
  • MIDI playback control (Ctrl+C to stop)

REPL Commands:

  • :help - Show help
  • :quit - Exit REPL
  • :ports - List MIDI ports
  • :instruments - List available instruments
  • :tempo [BPM] - Show/set default tempo
  • :stop - Stop playback

Alda Syntax Reference

Notes and Rests

piano:
  c d e f g a b   # Notes
  r               # Rest
  c4 d8 e16       # With duration (4=quarter, 8=eighth, etc.)
  c4. d4..        # Dotted notes
  c500ms d2s      # Milliseconds and seconds

Accidentals

c+    # Sharp
c-    # Flat
c_    # Natural
c++   # Double sharp

Octaves

o4 c    # Set octave to 4
> c     # Octave up
< c     # Octave down

Chords

c/e/g           # C major chord
c1/e/g          # Whole note chord
c/e/g/>c        # With octave change

Ties and Slurs

c1~1            # Tied notes (duration adds)
c4~d~e~f        # Slurred notes (legato)

Parts

piano: c d e

violin "v1": c d e    # With alias

violin/viola/cello "strings":   # Multi-instrument
  c d e

Attributes

(tempo 120)     # Set tempo (BPM)
(tempo! 120)    # Global tempo

(vol 80)        # Volume (0-100)
(volume 80)

(quant 90)      # Quantization/legato (0-100)

(panning 50)    # Pan (0=left, 100=right)

# Dynamic markings
(pp) (p) (mp) (mf) (f) (ff)

Variables

riff = c8 d e f g4

piano:
  riff riff > riff

Repeats

c*4             # Repeat note 4 times
[c d e]*4       # Repeat sequence
[c d e f]*8     # 8 times

Cram (Tuplets)

{c d e}4        # Triplet in quarter note
{c d e f g}2    # Quintuplet in half note
{c {d e} f}4    # Nested cram

Voices

piano:
  V1: c4 d e f
  V2: e4 f g a
  V0:           # End voices

Markers

piano:
  c d e f
  %chorus
  g a b > c

violin:
  @chorus       # Jump to chorus marker
  e f g a

Supported Instruments

All 128 General MIDI instruments are supported. Common examples:

  • piano, acoustic-grand-piano
  • violin, viola, cello, contrabass
  • flute, oboe, clarinet, bassoon
  • trumpet, trombone, french-horn, tuba
  • acoustic-guitar, electric-guitar-clean, electric-bass
  • choir, strings, brass-section

See midi/types.py for the complete mapping.

MIDI Backend

aldakit uses libremidi via nanobind for cross-platform MIDI I/O:

  • Low-latency realtime playback
  • Virtual MIDI port support (AldakitMIDI), makes it easy to just send to your DAW.
  • Pure Python MIDI file writing (no external dependencies)
  • Cross-platform: macOS (CoreMIDI), Linux (ALSA), Windows (WinMM)
  • Supports hardware and software/virtual MIDI ports (FluidSynth, IAC Driver, etc.)
import aldakit

# List available ports
print(aldakit.list_ports())

# Play to virtual port (visible in DAWs like Ableton Live)
aldakit.play("piano: c d e f g")

# Play to a specific port
aldakit.play("piano: c d e f g", port="FluidSynth")

# Save to MIDI file
aldakit.save("piano: c d e f g", "output.mid")

Audio Backend (Built-in)

For self-contained audio playback without external synthesizers, aldakit includes a built-in audio backend powered by TinySoundFont and miniaudio:

  • Direct audio output (no FluidSynth or DAW required)
  • Cross-platform: macOS (CoreAudio), Linux (ALSA/PulseAudio), Windows (WASAPI)
  • Requires a SoundFont file (.sf2) for instrument sounds
  • Header-only libraries for minimal binary size

Basic Usage

from aldakit import Score

# Play with built-in audio (requires SoundFont)
score = Score("piano: c d e f g")
score.play(backend="audio")

# Specify SoundFont explicitly
score.play(backend="audio", soundfont="/path/to/FluidR3_GM.sf2")

SoundFont Setup

The audio backend requires a General MIDI SoundFont file. aldakit searches these locations automatically:

  • $ALDAKIT_SOUNDFONT environment variable
  • ~/Music/sf2/
  • ~/.aldakit/soundfonts/
  • /usr/share/soundfonts/ (Linux)

Option 1: Download manually

Download a SoundFont and place it in ~/Music/sf2/:

Option 2: Auto-download

from aldakit.midi.soundfont import setup_soundfont

# Downloads TimGM6mb.sf2 (~6 MB) to ~/.aldakit/soundfonts/
setup_soundfont()

Option 3: Environment variable

export ALDAKIT_SOUNDFONT=/path/to/your/soundfont.sf2

Using TsfBackend Directly

from aldakit import Score
from aldakit.midi.backends import TsfBackend

# Create backend with specific SoundFont
with TsfBackend(soundfont="~/Music/sf2/FluidR3_GM.sf2") as backend:
    score = Score("piano: c/e/g")
    backend.play(score.midi)
    backend.wait()  # Block until playback completes

# Inspect SoundFont presets
backend = TsfBackend()
print(f"Presets: {backend.preset_count}")
for i in range(min(10, backend.preset_count)):
    print(f"  {i}: {backend.preset_name(i)}")

Audio vs MIDI Backend

Feature Audio (backend="audio") MIDI (backend="midi")
External synth required No Yes (FluidSynth, DAW, hardware)
Setup complexity Just needs SoundFont Requires MIDI routing
Sound quality Depends on SoundFont Depends on synth
DAW integration No Yes (virtual port)
Latency Very low Very low
Effects (reverb, etc.) No Depends on synth

Recommendation: Use backend="audio" for quick playback and standalone use. Use backend="midi" (default) for DAW integration, hardware synths, or when you need effects.

MIDI Playback Setup

Virtual Port (Recommended)

When no hardware MIDI ports are available, aldakit creates a virtual port named "AldakitMIDI". This port is visible to DAWs and other MIDI software:

  1. Start the REPL: aldakit repl
  2. In your DAW (Ableton Live, Logic Pro, etc.), look for "AldakitMIDI" in MIDI input settings
  3. Play code in the REPL - notes will be sent to your DAW

Software Synthesizer (FluidSynth)

For high-quality General MIDI playback without hardware, use FluidSynth:

# Install FluidSynth (macOS)
brew install fluidsynth

# Install FluidSynth (Debian/Ubuntu)
sudo apt install fluidsynth 

# Download a SoundFont (e.g., FluidR3_GM.sf2)
# eg. sudo apt install fluid-soundfont-gm
# Place in ~/Music/sf2/

# Start FluidSynth with CoreMIDI (macOS)
fluidsynth -a coreaudio -m coremidi ~/Music/sf2/FluidR3_GM.sf2

# In another terminal, start aldakit
aldakit repl
# aldakit> piano: c d e f g

A helper script is available in the repository:

# Set the SoundFont directory (add to your shell profile)
export ALDAPY_SF2_DIR=~/Music/sf2

# Run with default SoundFont (FluidR3_GM.sf2)
python scripts/fluidsynth-gm.py

# Or specify a SoundFont directly
python scripts/fluidsynth-gm.py /path/to/soundfont.sf2

# List available SoundFonts
python scripts/fluidsynth-gm.py --list

Hardware MIDI

Connect a USB MIDI interface or synthesizer, then:

# List available ports
aldakit ports

# Play to a specific port
aldakit --port "My MIDI Device" examples/twinkle.alda

MIDI File Export

If you don't have MIDI playback set up, export to a file:

# Save to MIDI file
aldakit examples/twinkle.alda -o twinkle.mid

# Open with default app
open twinkle.mid

Development

Setup

git clone https://github.com/shakfu/aldakit.git
cd aldakit
make  # Build the libremidi extension

Run Tests

make test
# or
uv run pytest tests/ -v

Architecture

aldakit architecture

License

MIT

See Also

  • Alda - The original Alda language and reference implementation
  • Alda Cheat Sheet - Syntax reference
  • Extending aldakit - Design document for programmatic API
  • libremidi - A modern C++ MIDI 1 / MIDI 2 real-time & file I/O library. Supports Windows, macOS, Linux and WebMIDI.
  • TinySoundFont - SoundFont2 synthesizer library in a single C/C++ header
  • miniaudio - Single-header audio playback and capture library
  • nanobind - a tiny and efficient C++/Python bindings

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

aldakit-0.1.7.tar.gz (2.0 MB view details)

Uploaded Source

Built Distributions

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

aldakit-0.1.7-cp314-cp314-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.14Windows x86-64

aldakit-0.1.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (825.7 kB view details)

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

aldakit-0.1.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (814.0 kB view details)

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

aldakit-0.1.7-cp314-cp314-macosx_11_0_x86_64.whl (754.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ x86-64

aldakit-0.1.7-cp314-cp314-macosx_11_0_arm64.whl (742.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

aldakit-0.1.7-cp313-cp313-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.13Windows x86-64

aldakit-0.1.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (825.7 kB view details)

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

aldakit-0.1.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (813.7 kB view details)

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

aldakit-0.1.7-cp313-cp313-macosx_11_0_x86_64.whl (754.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

aldakit-0.1.7-cp313-cp313-macosx_11_0_arm64.whl (742.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

aldakit-0.1.7-cp312-cp312-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.12Windows x86-64

aldakit-0.1.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (825.8 kB view details)

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

aldakit-0.1.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (813.9 kB view details)

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

aldakit-0.1.7-cp312-cp312-macosx_11_0_x86_64.whl (754.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

aldakit-0.1.7-cp312-cp312-macosx_11_0_arm64.whl (742.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

aldakit-0.1.7-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11Windows x86-64

aldakit-0.1.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (828.0 kB view details)

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

aldakit-0.1.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (816.0 kB view details)

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

aldakit-0.1.7-cp311-cp311-macosx_11_0_x86_64.whl (755.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

aldakit-0.1.7-cp311-cp311-macosx_11_0_arm64.whl (744.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

aldakit-0.1.7-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10Windows x86-64

aldakit-0.1.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (828.5 kB view details)

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

aldakit-0.1.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (816.4 kB view details)

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

aldakit-0.1.7-cp310-cp310-macosx_11_0_x86_64.whl (755.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

aldakit-0.1.7-cp310-cp310-macosx_11_0_arm64.whl (744.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file aldakit-0.1.7.tar.gz.

File metadata

  • Download URL: aldakit-0.1.7.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for aldakit-0.1.7.tar.gz
Algorithm Hash digest
SHA256 0ec96b9b8c60a54b5c649ff92afc10acd6a31a4a52cf3284e82788da34a30cfb
MD5 0c6bdedd76f7f1ed38b4d4735d4af04a
BLAKE2b-256 6c156edc610141ff9cdeb99852c5dcc61073d89e72c286896c93d451a90425a3

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: aldakit-0.1.7-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.1 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

Hashes for aldakit-0.1.7-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 05bcf24f86a91960fce195d375575836d519dc570dd35162c73cd3a38c9c7cf8
MD5 ff8be5eb60190922dbd7a4de1931fd76
BLAKE2b-256 cafe3674d5eebcbcb946b787c628281f77e11597de02bc8c67b447d59c98915d

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ad9725758b3d9f09af92c6942af37265f2cccbe50a9215ba9af4d094c28900f7
MD5 7110383ca943c99330c028ce3a0f44a8
BLAKE2b-256 993426188fb8aec7bf73a2446d5b3a3795fb9228008f6b01c3e6ea5111c75672

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b12b4c25661ee2c9fe0b4b5d50358ec550f370dc6aa78bc9075c7294fb5d89e0
MD5 f4a69b6ab6a98fcb4fa66c89363078cb
BLAKE2b-256 acd009d02f5ccb3947f78da92be0e656513d4feceacae88e35cb7f678355c259

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp314-cp314-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp314-cp314-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c1411b28f7f65f7251acd60d8cdfe40b44d165758ff97dad6b77220429e13446
MD5 e0c13cba968470124a2c20622f8deab8
BLAKE2b-256 e908e8264ffabb6196a65893752b3502306d9d9c050039559cd2f76be96c1fde

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b0e1f07974cb3783d1d615b7c6ba5da8b610146f99195059f1cac9cf56970396
MD5 94f5055a8f24ec8967ff5c9bfb737908
BLAKE2b-256 5a6c19488d557a7be43867649f515c28bd626af8fedd07439ec3e0f392d3b119

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: aldakit-0.1.7-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.1 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

Hashes for aldakit-0.1.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 cede1de1b1adca850fe4d7d07e4cd30c4c774dbfceff7eb569624f427f907b9c
MD5 bb2a537b97c2f6c732ecda0db805d7f3
BLAKE2b-256 fb86f022b3751bf5e28e57dbb9f35433b333408c533e0d7ad598d84544e148c3

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2cd4478902faa995519204e80f09d23d37ef9e97d9529bca91611570f6204008
MD5 afb2dc6c3c41f5485c66a8734cafc429
BLAKE2b-256 9961602cb30e5e86414dc975429f2a77e9243c8c9ff0cfc1b21c42b8f4313d67

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5af5f1a9086ead7ad7b40ce3072bb3aff5785ea40281ca8e42ae681f368c649f
MD5 941924985b391c592c7c82f12ea0f040
BLAKE2b-256 3f752711c7d34ef0441ae7f78269dbbd8a17ff37aa9a169b760ac9c15237304a

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c3c9db11e262ae702b2a6e19d09c5c8dc79c183608525ec619cb0033a368c440
MD5 b69631040e9bcbcd3b996bdf29be6523
BLAKE2b-256 d9eca5cac7bc4bb37dfc5a49c0d5a35d35d8f2c7e4d01f063c96fbea32a3cd98

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd4cb8446139eead5b04c820ae591d6c429f5d8f9d24b30bf52893bb88595420
MD5 930ba5c5d067a2d2eb81d8dda7ae68c9
BLAKE2b-256 cdc95ab39b09406cc3734cb3c40fc243ac43e33c0e8c637fc8a2fd626fbb9be4

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: aldakit-0.1.7-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.1 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

Hashes for aldakit-0.1.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ef637939aeea8f839481074f825b42f49497e07688415f289d7ab720528ef376
MD5 17da019f1e124343f394dc5cd4706bf9
BLAKE2b-256 feadec144b734baabeedf195fda5d7e938c6d824106032b2c1b6e44c6f291f22

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3f398680db2dd118c81c3cd82852dcaab0359ab594ce1a3a4f5a123182db06c7
MD5 d5e87892d8ca2680f6a0183d54cb8d34
BLAKE2b-256 905b6675bd3cebd68bb089df6ff11c82d358153e7b26dc327168726aafcc8c36

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e466b63218831a0ad7f7eed791dc7629397726153ce145045cb91289cfd64eb8
MD5 bbe0e650f4bc72e987d645fc936f7ed2
BLAKE2b-256 b56266df55d3aff4a9961f726cc9a0e61b1600779e5253eee8eecb0a604be783

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f559a1097537ebfc47ad0ea47b7dc4bd3c94f5ddc463ca3f286cb5a05046283a
MD5 2f59405915a0833a8f1f7d03ccdb88a9
BLAKE2b-256 ed04c4a93c5a979e258a375b456e6848762c40f314d7e9b2b8e1e1c432dc1cff

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64a7f3e1d4596acfff08632c9e54556e1f2718248b79a86f98c81748fe0e4441
MD5 ed48161418b3f30ddf80dbf8d0e4c4ae
BLAKE2b-256 162417a195e0fe085ae5d5fc50adb7d4fbc0a01ab0779946830fe99b174cf940

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: aldakit-0.1.7-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.1 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

Hashes for aldakit-0.1.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c72c3bcf159ea2671f78f3d11a8273dd6785a52843588086bf5779a49e1131f8
MD5 7e490d0b24f9ea0ef4e9a679788f6f0c
BLAKE2b-256 cf76bdd52e4387c1c2808d1a14a85428d7743b7bb24bfff171554f79300f1cb6

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a67f01e45dd3d6091d5f777f971b4cd446807652eb416d2752a59fe58a7c4a8e
MD5 ea924c263b3187bf665f63aff8476169
BLAKE2b-256 4790c0ef2c5a2574daed89d3c81fba5d9ae652f0f5975bbbb0e7d61d53b1d010

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d78501bb6f40c67d4e839a302ae91428edc31243288a2f9bc876da5f5fe1255a
MD5 47c4cdd9623e4af9a663ba15ef0e2d8a
BLAKE2b-256 5484f14803fa5667299fd6709c67d75b0f11f19a7f9503193ad268e04ae08dab

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 25acdc85e9ce8eef53d87ac40aacb06b1ac12fb18bc6ca51011f8f0315d2a01b
MD5 34d29554e20ee9602ce447c06195a241
BLAKE2b-256 45a18bfc35f05efa22f56556a3fa4ce1c3594c7e4bf5db4f916fd01586c6ec80

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1647f1891f1b57ccd8cf9c9890a14b7447e3e134d9f42fcc42db92fa90574125
MD5 02f0b3cabcc7860b9d9e8999ef189434
BLAKE2b-256 3d613f82a8a28b73ee3d49a5a6ab2886f0f05bc23584a01cf67f9909f9a5792e

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: aldakit-0.1.7-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.1 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

Hashes for aldakit-0.1.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 a6ccb8de6dce5e7c174e59236f30794945fb47c4ef8c7d9686d9499700194674
MD5 ca6c75636446d9cdb2d86b7162dc3ce0
BLAKE2b-256 93ee2e28fcc510f9e45b438fd209501c07cc88957d1265baa86ba3a801d3b2b9

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1859d11f98d29983d758a2f895c8113b6e519b8a023fe4ff2229cfa359c08a3f
MD5 d9be50a86f5be3ff45bdbd2adc6d01d0
BLAKE2b-256 63b6fa35f8bb808c9dc0189dafaea186482948becd8ddd809ef8919573fda682

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89ec727e6a722f2d50ef6a006c2029c85683343f224da13b3de2e1d18c70df69
MD5 6f6f17784a7061964f6954b7bc07a6cc
BLAKE2b-256 bc152b95bf8c3d81522bc7aa4833eeef9ddc3e4349b81d292044790d669e77a1

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c67ed0218f692fe06f12f027862c0c95d23365642e4cd244fffb488ef77a6b27
MD5 e3b1aaad3a3d77b7c85b56b178271f3e
BLAKE2b-256 d46d0e49750afe686a61da1f7fb3592ccd8e6e6fcc01b03305a4f9426f867fe2

See more details on using hashes here.

File details

Details for the file aldakit-0.1.7-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aldakit-0.1.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 597c0c787d255fd19d8d147f1ace3d2ab95a648dbcb3e0028be3497eab75f7f2
MD5 2894a7f3da1df3077071a95c515b8150
BLAKE2b-256 a92a80f23fd449b7b0f2bbf7ba882d2050686fdb41c67168caaa7ac94de314c7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page