Skip to content

mdoege/PySynth

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

174 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Overview

PySynth is a simple music synthesizer for Python 2 or 3. The goal is not to produce many different sounds, but to have scripts that can turn ABC notation or MIDI files into a WAV file without too much tinkering.

The current release of the synthesizer can only play one note at a time. (Although successive notes can overlap in PySynth B and S, but not A.) However, two output files can be mixed together to get stereo sound.

Synthesizer scripts

Synth Synthesis method Approximate timbre Note decay Needs NumPy?
A additive (3 sine waves) flute, organ, piano variable (depends on note length) no
B additive (5 sine waves) acoustic piano medium yes
C subtractive (sawtooth wave) bowed string, analog synth pad none no
D subtractive (square wave) woodwind, analog synth lead none no
E FM/phase modulation (6 sine waves) DX7 Rhodes piano medium yes
F subtractive (triangle wave) flute, single reed none no
P subtractive (white noise) untuned percussion hit very fast no
S Karplus-Strong (physical modeling) plucked string, guitar, koto fast yes
beeper additive Nokia phone ringtone none no
samp sampler Salamander Grand Piano medium yes

Live MIDI synthesizers

There are also three synthesizers which can be played in real-time, e.g. from a MIDI keyboard or other MIDI source. They all require pyaudio and mido:

  • multi_synth.py: polyphonic additive synthesizer with 8-note polyphony by default
  • multi_wave.py: polyphonic wavetable synthesizer with 12-note polyphony by default
  • midi_synth.py: simple monophonic additive synthesizer

Multi_synth.py and midi_synth.py use three sine waves like PySynth A and an exponential decay like PySynth B, so they sound very similar to PySynth A and B.

There is also a helper script, midi_play.py, which can be used to send a MIDI file to these synthesizers.

The script make_wavetable.py creates a wavetable with 256 samples and 32 waveforms which is used by multi_wave.py by default.

If you hear crackling audio from these scripts, you might want to

  • quit other applications, especially web browsers.
  • increase audio buffer size (BSIZE) in the scripts or reduce maximum polyphony (MAXPOLY).
  • make sure you are running a recent Python version, because Python performance tends to improve with each release.

Installation

Linux

Clone the repository:

git clone git@github.com:mdoege/PySynth.git

or

git clone https://github.com/mdoege/PySynth.git

Enter the directory (cd PySynth) and run

python -m pip install .

Sample usage

Basic usage:

import pysynth as ps
test = (('c', 4), ('e', 4), ('g', 4),
		('c5', -2), ('e6', 8), ('d#6', 2))
ps.make_wav(test, fn = "test.wav")

More advanced usage:

import pysynth_b as psb # a, b, e, and s variants available

''' (note, duration)
Note name (a to g), then optionally a '#' for sharp or
'b' for flat, then optionally the octave (defaults to 4).
An asterisk at the end means to play the note a little 
louder.  Duration: 4 is a quarter note, -4 is a dotted 
quarter note, etc.'''
song = (
  ('c', 4), ('c*', 4), ('eb', 4), 
  ('g#', 4),  ('g*', 2), ('g5', 4),
  ('g5*', 4), ('r', 4), ('e5', 16),
  ('f5', 16),  ('e5', 16),  ('d5', 16),
  ('e5*', 4) 
)

# Beats per minute (bpm) is really quarters per minute here
psb.make_wav(song, fn = "danube.wav", leg_stac = .7, bpm = 180)

Read ABC file and output WAV:

python3 read_abc.py straw.abc

Documentation

More documentation and examples at the PySynth homepage.

About

Python music synthesizer scripts (input also via ABC or MIDI)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors