Simple test

Ensure your device works with this simple test.

examples/synthvoice_simpletest.py
 1# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
 2# SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
 3#
 4# SPDX-License-Identifier: Unlicense
 5
 6import time
 7
 8import audiopwmio
 9import board
10import digitalio
11import synthio
12
13from relic_synthvoice.oscillator import Oscillator
14
15led = digitalio.DigitalInOut(board.LED)
16led.direction = digitalio.Direction.OUTPUT
17
18audio = audiopwmio.PWMAudioOut(board.A0)
19synth = synthio.Synthesizer()
20audio.play(synth)
21
22voice = Oscillator(synth)
23
24while True:
25    led.value = True
26    voice.press(60)
27    time.sleep(0.5)
28    led.value = False
29    voice.release()
30    time.sleep(0.5)

MIDI Control

Control a voice with USB MIDI input.

examples/synthvoice_midi.py
 1# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
 2# SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
 3#
 4# SPDX-License-Identifier: Unlicense
 5
 6import adafruit_midi
 7import audiopwmio
 8import board
 9import digitalio
10import synthio
11import usb_midi
12from adafruit_midi.note_off import NoteOff
13from adafruit_midi.note_on import NoteOn
14
15from relic_synthvoice.oscillator import Oscillator
16
17led = digitalio.DigitalInOut(board.LED)
18led.direction = digitalio.Direction.OUTPUT
19
20audio = audiopwmio.PWMAudioOut(board.A0)
21synth = synthio.Synthesizer()
22audio.play(synth)
23
24voice = Oscillator(synth)
25
26midi = adafruit_midi.MIDI(
27    midi_in=usb_midi.ports[0], in_channel=0, midi_out=usb_midi.ports[1], out_channel=0
28)
29
30while True:
31    msg = midi.receive()
32    if isinstance(msg, NoteOn) and msg.velocity != 0:
33        led.value = True
34        voice.press(msg.note, msg.velocity)
35    elif isinstance(msg, NoteOff) or (isinstance(msg, NoteOn) and msg.velocity == 0):
36        led.value = False
37        voice.release()

Oscillator

Demonstration of the relic_synthvoice.oscillator.Oscillator voice.

examples/synthvoice_oscillator.py
 1# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
 2# SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
 3#
 4# SPDX-License-Identifier: Unlicense
 5
 6import adafruit_midi
 7import audiopwmio
 8import board
 9import digitalio
10import relic_waveform
11import synthio
12import usb_midi
13from adafruit_midi.note_off import NoteOff
14from adafruit_midi.note_on import NoteOn
15
16from relic_synthvoice.oscillator import Oscillator
17
18led = digitalio.DigitalInOut(board.LED)
19led.direction = digitalio.Direction.OUTPUT
20
21audio = audiopwmio.PWMAudioOut(board.A0, board.A1)
22synth = synthio.Synthesizer(sample_rate=44100, channel_count=2)
23audio.play(synth)
24
25voice = Oscillator(synth)
26voice.waveform = relic_waveform.mix(
27    relic_waveform.saw(),
28    relic_waveform.saw(frequency=2),
29)
30
31# Frequency
32voice.glide = 0.5
33voice.coarse_tune = -1
34voice.fine_tune = 5
35voice.vibrato_depth = 1 / 12
36voice.vibrato_rate = 8.0
37voice.pitch_slew = -2.0
38voice.pitch_slew_time = 0.2
39
40# Envelope
41voice.attack_time = 0.0
42voice.attack_level = 1.0
43voice.decay_time = 0.75
44voice.sustain_level = 0.5
45voice.release_time = 1.0
46
47# Amplitude
48voice.amplitude = 0.75
49voice.tremolo_depth = 0.1
50voice.tremolo_rate = 2.0
51
52# Filter
53voice.filter_frequency = 200
54voice.filter_resonance = 1.75
55voice.filter_attack_time = 0.25
56voice.filter_amount = 1200
57voice.filter_release_time = 0.75
58voice.filter_rate = 0.5
59voice.filter_depth = 1000
60
61# Panning
62voice.pan_depth = 1.0
63voice.pan_rate = 0.25
64
65midi = adafruit_midi.MIDI(
66    midi_in=usb_midi.ports[0], in_channel=0, midi_out=usb_midi.ports[1], out_channel=0
67)
68
69while True:
70    msg = midi.receive()
71    if isinstance(msg, NoteOn) and msg.velocity != 0:
72        led.value = True
73        voice.press(msg.note, msg.velocity)
74    elif isinstance(msg, NoteOff) or (isinstance(msg, NoteOn) and msg.velocity == 0):
75        led.value = False
76        voice.release()
77    voice.update()

Sample

Demonstration of the relic_synthvoice.sample.Sample voice with the provided 16-bit WAV 11025hz audio file, examples/test.wav.

examples/synthvoice_sample.py
 1# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
 2# SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
 3#
 4# SPDX-License-Identifier: Unlicense
 5
 6import adafruit_midi
 7import audiopwmio
 8import board
 9import digitalio
10import synthio
11import usb_midi
12from adafruit_midi.note_off import NoteOff
13from adafruit_midi.note_on import NoteOn
14
15from relic_synthvoice.sample import Sample
16
17led = digitalio.DigitalInOut(board.LED)
18led.direction = digitalio.Direction.OUTPUT
19
20synth = synthio.Synthesizer(sample_rate=44100)
21
22voice = Sample(synth, file="/test.wav")
23voice.waveform_loop = (0.65, 0.96)
24voice.release_time = 0.5
25
26# Start up audio output after loading sample file to avoid file background tasks interrupting
27audio = audiopwmio.PWMAudioOut(board.A0)
28audio.play(synth)
29
30midi = adafruit_midi.MIDI(
31    midi_in=usb_midi.ports[0], in_channel=0, midi_out=usb_midi.ports[1], out_channel=0
32)
33
34while True:
35    msg = midi.receive()
36    if isinstance(msg, NoteOn) and msg.velocity != 0:
37        led.value = True
38        voice.press(msg.note, msg.velocity)
39    elif isinstance(msg, NoteOff) or (isinstance(msg, NoteOn) and msg.velocity == 0):
40        led.value = False
41        voice.release()
42    voice.update()

Drone

Demonstration of the relic_synthvoice.drone.Drone voice.

examples/synthvoice_drone.py
 1# SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple
 2#
 3# SPDX-License-Identifier: Unlicense
 4
 5import audiopwmio
 6import board
 7import synthio
 8
 9from relic_synthvoice.drone import Drone
10
11audio = audiopwmio.PWMAudioOut(board.A0)
12synth = synthio.Synthesizer()
13audio.play(synth)
14
15voice = Drone(synth)
16voice.press()

Percussive

Demonstration of the voices available in the relic_synthvoice.percussive module to create a simple drum machine (without a sequencer).

examples/synthvoice_percussive.py
 1# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
 2# SPDX-FileCopyrightText: Copyright (c) 2024 Cooper Dalrymple
 3#
 4# SPDX-License-Identifier: Unlicense
 5
 6import adafruit_midi
 7import audiopwmio
 8import board
 9import digitalio
10import synthio
11import usb_midi
12from adafruit_midi.note_off import NoteOff
13from adafruit_midi.note_on import NoteOn
14
15import relic_synthvoice.percussive
16
17led = digitalio.DigitalInOut(board.LED)
18led.direction = digitalio.Direction.OUTPUT
19
20audio = audiopwmio.PWMAudioOut(board.A0)
21synth = synthio.Synthesizer(sample_rate=44100)
22audio.play(synth)
23
24voices = (
25    relic_synthvoice.percussive.Kick(synth),
26    relic_synthvoice.percussive.Snare(synth),
27    relic_synthvoice.percussive.ClosedHat(synth),
28    relic_synthvoice.percussive.OpenHat(synth),
29    relic_synthvoice.percussive.HighTom(synth),
30    relic_synthvoice.percussive.MidTom(synth),
31    relic_synthvoice.percussive.FloorTom(synth),
32    relic_synthvoice.percussive.Ride(synth),
33)
34
35midi = adafruit_midi.MIDI(
36    midi_in=usb_midi.ports[0], in_channel=0, midi_out=usb_midi.ports[1], out_channel=0
37)
38
39while True:
40    msg = midi.receive()
41    if isinstance(msg, NoteOn) and msg.velocity != 0:
42        led.value = True
43        voices[msg.note % len(voices)].press(msg.velocity)
44    elif isinstance(msg, NoteOff) or (isinstance(msg, NoteOn) and msg.velocity == 0):
45        led.value = False