Skip to main content

Klang

Block based synthesis and music library for Python. Klang is German for sound.

Getting Started

Prerequisites

We use Python bindings for PortAudio and RtMidi. On Mac they can be installed via Homebrew.

Installing

Klang can be installed via PyPi / pip or directly via setup.py. Note that there are some audio C extensions. Python fallbacks exists.

python3 setup.py build_ext --inplace

For developing you can link your working copy with

python3 setup.py develop

Running the tests

Tests can be run via with

python3 setup.py test

Safety First

As always when programming with sound: Unplug your headphones or be very sure of what you are doing! Also with low headphone volume bugs in the code can result in very unpleasant loud noises which could probably impair your hearing. Be careful!

Klang Primer

Klang provides various audio related blocks. Every block can have multiple in- and outputs and by connecting them with each other we can define our network. Once we are finished with patching we can run our network with by calling run_klang(*blocks). This function only needs some blocks which belong to the network. It will then automatically discovers the other blocks of the network and deduce an appropriate block execution order.

In the following script we create a 440 Hz sine oscillator which output gets send to the sound card.

from klang.audio import Oscillator, Dac
from klang.klang import run_klang

# Init blocks
osc = Oscillator(frequency=440.)
dac = Dac(nChannels=1)

# Define network
osc.output.connect(dac.input)

# Run it
run_klang(dac)

Audio can be written to disk as a WAV file with the filepath argument.

run_klang(*blocks, filepath='some/filepath.wav')

Connections

There are two different types of connections in Klang:

Value

These connection can hold any kind of Python object which will be propagated through the network and updated during each cycle. Most commonly these are numpy arrays holding audio or modulation signals (Input and Output classes).

Message

Discrete messages. Each message input has its own internal message queue. Most commonly Note messages (MessageInput and MessageOutput classes).

There are also corresponding Relay connections (Relay and MessageRelay classes). These are used to build composite blocks (blocks which contain there own network of child blocks). Relays can be used to interface between the inside and outside of an composite block.

Defining The Network

The connect method can be used to connect inputs and outputs with each other. Note that it is always possible to connect one output to multiple inputs but not the other way round. As a shorthand there are two overloaded operators:

  • Pipe operator |: Connect multiple blocks in series.

  • Mix operator +: Mix multiple value outputs together.

# Pipe operator
a | b | c

# Is equivalanet to:
# >>> a.output.connect(b.input)
# ... b.output.connect(c.input)
# Mix operator
mixer = a + b + c

# Is equivalanet to:
# >>> mixer = Mixer(nInputs=0)
# ... mixer.add_new_channel()
# ... a.output.connect(mixer.inputs[-1])
# ... mixer.add_new_channel()
# ... b.output.connect(mixer.inputs[-1])
# ... mixer.add_new_channel()
# ... c.output.connect(mixer.inputs[-1])

Examples

See the examples directory with a couple example script which illustrate the core functionality of Klang. Currently there are:

Coding Style

PEP8 / Google flavored. With the one exception for variable and argument names (camelCase). Function and in methods are snake_case().

Author

Acknowledgments

Thanks for the support and inputs!

Metadata

Release files for klang 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for klang 0.2.1
File Size Uploaded
klang-0.2.1.tar.gz 1.4 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for klang 0.2.1
File Interpreter ABI Platform
klang-0.2.1-cp37-cp37m-macosx_10_15_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.15+ x86-64 Details

Total release size: 2.9 MB

Release files / klang-0.2.1.tar.gz

Download URL klang-0.2.1.tar.gz
Size 1.4 MB
Tags Source
SHA-256 checksum
How to use checksums
edff3338c2d8b1f93b81696a6ea1f8e7c198894e71e8185fd633cd6384514dd0
BLAKE2b-256 checksum
How to use checksums
d6f92cb6bf3c0951195a0c63743a0869ae891818999974b12564b87aada7e0d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

Release files / klang-0.2.1-cp37-cp37m-macosx_10_15_x86_64.whl

Download URL klang-0.2.1-cp37-cp37m-macosx_10_15_x86_64.whl
Size 1.4 MB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
0435595d09cbd166ad6a5b218c2edc12bbcdbaab5e98d50d2af9ada3de861a5c
BLAKE2b-256 checksum
How to use checksums
6741ebf51862ac56b6efc2d88e01f6613be9903fd981fbb97046fa11b9274a1c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.7.7

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

3 release 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