synthio – Support for MIDI synthesis

synthio.from_file(file: BinaryIO, *, sample_rate: int = 11025)MidiTrack

Create an AudioSample from an already opened MIDI file. Currently, only single-track MIDI (type 0) is supported.

Parameters
  • file (typing.BinaryIO) – Already opened MIDI file

  • sample_rate (int) – The desired playback sample rate; higher sample rate requires more memory

Playing a MIDI file from flash:

import audioio
import board
import synthio

data = open("single-track.midi", "rb")
midi = synthio.from_file(data)
a = audioio.AudioOut(board.A0)

print("playing")
a.play(midi)
while a.playing:
  pass
print("stopped")
class synthio.MidiTrack(buffer: _typing.ReadableBuffer, tempo: int, *, sample_rate: int = 11025)

Simple square-wave MIDI synth

Create a MidiTrack from the given stream of MIDI events. Only “Note On” and “Note Off” events are supported; channel numbers and key velocities are ignored. Up to two notes may be on at the same time.

Parameters
  • buffer (ReadableBuffer) – Stream of MIDI events, as stored in a MIDI file track chunk

  • tempo (int) – Tempo of the streamed events, in MIDI ticks per second

  • sample_rate (int) – The desired playback sample rate; higher sample rate requires more memory

Simple melody:

import audioio
import board
import synthio

dac = audioio.AudioOut(board.SPEAKER)
melody = synthio.MidiTrack(b"\0\x90H\0*\x80H\0\6\x90J\0*\x80J\0\6\x90L\0*\x80L\0\6\x90J\0" +
                           b"*\x80J\0\6\x90H\0*\x80H\0\6\x90J\0*\x80J\0\6\x90L\0T\x80L\0" +
                           b"\x0c\x90H\0T\x80H\0\x0c\x90H\0T\x80H\0", tempo=640)
dac.play(melody)
print("playing")
while dac.playing:
  pass
print("stopped")
sample_rate :Optional[int]

32 bit value that tells how quickly samples are played in Hertz (cycles per second).

deinit(self)None

Deinitialises the MidiTrack and releases any hardware resources for reuse.

__enter__(self)MidiTrack

No-op used by Context Managers.

__exit__(self)None

Automatically deinitializes the hardware when exiting a context. See Lifetime and ContextManagers for more info.