Skip to main content

software sound synthesizer, audio streaming and conversion, and playback engine

Project description

[![Latest Version](](

**Software sound synthesizer (FM/PCM oscillators), sound file streaming and conversion,
and sound playback and mixing engine.**

*requires Python 3.5 or newer*.

# synthplayer.synth

A waveform synthesizer that can generate different wave form samples:
sine, triangle, sawtooth, square, pulse wave, harmonics and white noise.
It also supports Frequency Modulation, Pulse-width modulation, and ADSR envelopes using LFOs.

![Synth Waveforms overview](./waveforms.png?raw=true "Overview of the basic waveforms available in the synth")

![Synth GUI screenshot](./screenshot.png?raw=true "Screenshot of the Keyboard GUI")

# synthplayer.playback

Sound playback engine. Supports multiple sound APIs,
efficient sequential streaming or real-time mixing of shorter sound clips.
The streaming is implemented via Python generators where the main generator essentially produces mixed sample fragments.
These are written to an audio stream of one of the supported audio libraries.
Libraries supported are: [``sounddevice``](,
[``pyaudio``]( and ``winsound`` (in this order).
``winsound`` has very limited capabilities so beware.

# synthplayer.sample

Contains the Sample class that represents a digitized sound clip.
It provides a set of simple sound manipulation methods such as changing
the amplitude, fading in/out, and format conversions.

# synthplayer.streaming

Provides various classes to stream audio data with.
Uses ffmpeg or oggdec to read/stream many different sound formats.

# Example program:

This is a jukebox like party sound player that allows to prepare a playlist,
fade from a track to the next from the list, and insert random soundbytes for added fun.
The songs are queried from a backend audio file database server program.

# Example program: trackmixer

You assemble rhythm samples into bars and patterns, which are then mixed.
Samples have to be in .wav format but can be anything that the Python wave module understands.
The 'track' files are in a simple .ini format and can be edited with any text editor.
Most of the file should be self explanatory but here are a few tips:

- Song bpm means beats per minute, which translates in how many *bars* are played per minute.
If you put one kick/bass drum trigger in one bar, it exactly hits the specified number of beats per minute.
- Song ticks means how many *ticks* (or *triggers*) are in one bar. More ticks means more resolution. Nice for fast hi-hats.
- A *bar* is a sequence of instrument *ticks* (or *triggers*) where '.' means nothing is played at that instant,
and another character such as 'x' means that the sample is played at that instant.
- you can separate bars with whitespace for easier readability
- pattern names are prefixed with ``pattern.`` when writing their section (ini file limitation, you can't nest things)
- patterns can contain one or more bars per instrument (so you can have long and short patterns). However inside
a pattern every instrument has to have the same number of bars.

Here is a very simple example of a track file:

# where to find the sample files
samples = samples/

# list your samples here
kick7 = biab_kick_7.wav
snare2 = biab_sn_2.wav
snare10 = biab_sn_10.wav
hihat2 = biab_hat_2.wav
hihat4 = biab_hat_4.wav

# basic song parameters and pattern sequence
bpm = 128
ticks = 4
patterns = pat1 pat2 pat1 pat2 outro

hihat2 = x.x. x.x. x.x. x.x.
snare2 = .... x... .... x...
kick7 = x... x... x... x...

hihat4 = x.x. x.x. x.x. x.x.
snare10 = .... .... x... x...

hihat2 = x.x. x.x.
hihat4 = .... x...
kick7 = .... x...

## invoking the mixer

To simply mix and stream your track file to your speakers use the following command:

``python3 mytrack.ini``

To load your track file and start the interactive command line interface:

``python3 -i mytrack.ini``

...then type ``help`` to see what commands are available.

A few example tracks are provided, try them out! (pre-mixed output can be found in the example_mixes folder)

- track1.ini - a short jungle-ish fragment
- track2.ini - a somewhat longer classic rhythm loop, I guess it's in 4/4 time
- track3.ini - an experiment with a few liquid drum'n'bass type patterns

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

synthplayer-1.1.tar.gz (32.7 kB view hashes)

Uploaded Source

Built Distribution

synthplayer-1.1-py3-none-any.whl (35.1 kB view hashes)

Uploaded Python 3

Supported by

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