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