From 191b143e7ba3b9f5786996cbffb42e2460f1c14d Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 2 Feb 2021 17:14:39 -0800 Subject: Add PWM based audio playback See https://learn.adafruit.com/circuitpython-essentials/circuitpython-audio-out to get started. Fixes #4037 --- .../jeplayer-splash-16000-16bit-mono-signed.wav | Bin 0 -> 130448 bytes .../jeplayer-splash-16000-16bit-stereo-signed.wav | Bin 0 -> 260852 bytes .../jeplayer-splash-16000-24bit-mono-signed.wav | Bin 0 -> 195650 bytes .../jeplayer-splash-16000-24bit-stereo-signed.wav | Bin 0 -> 391256 bytes .../jeplayer-splash-16000-8bit-mono-unsigned.wav | Bin 0 -> 65246 bytes .../jeplayer-splash-16000-8bit-stereo-unsigned.wav | Bin 0 -> 130448 bytes .../jeplayer-splash-44100-16bit-mono-signed.wav | Bin 0 -> 359468 bytes .../jeplayer-splash-44100-16bit-stereo-signed.wav | Bin 0 -> 718892 bytes .../jeplayer-splash-44100-24bit-mono-signed.wav | Bin 0 -> 539180 bytes .../jeplayer-splash-44100-24bit-stereo-signed.wav | Bin 0 -> 1078316 bytes .../jeplayer-splash-44100-8bit-mono-unsigned.wav | Bin 0 -> 179756 bytes .../jeplayer-splash-44100-8bit-stereo-unsigned.wav | Bin 0 -> 359468 bytes .../audiocore/jeplayer-splash-44100-stereo.mp3 | Bin 0 -> 65200 bytes .../jeplayer-splash-8000-16bit-mono-signed.wav | Bin 0 -> 65246 bytes .../jeplayer-splash-8000-16bit-stereo-signed.wav | Bin 0 -> 130448 bytes .../jeplayer-splash-8000-24bit-mono-signed.wav | Bin 0 -> 97848 bytes .../jeplayer-splash-8000-24bit-stereo-signed.wav | Bin 0 -> 195650 bytes .../jeplayer-splash-8000-8bit-mono-unsigned.wav | Bin 0 -> 32646 bytes .../jeplayer-splash-8000-8bit-stereo-unsigned.wav | Bin 0 -> 65246 bytes tests/manual/audiopwmio/single_buffer_loop.py | 65 +++++++++++++++++++++ tests/manual/audiopwmio/wavefile_pause_resume.py | 39 +++++++++++++ tests/manual/audiopwmio/wavefile_playback.py | 36 ++++++++++++ 22 files changed, 140 insertions(+) create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-16bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-16bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-24bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-24bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-8bit-mono-unsigned.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-16000-8bit-stereo-unsigned.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-16bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-16bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-24bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-24bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-8bit-mono-unsigned.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-8bit-stereo-unsigned.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-44100-stereo.mp3 create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-16bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-16bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-24bit-mono-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-24bit-stereo-signed.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-8bit-mono-unsigned.wav create mode 100644 tests/manual/audiocore/jeplayer-splash-8000-8bit-stereo-unsigned.wav create mode 100644 tests/manual/audiopwmio/single_buffer_loop.py create mode 100644 tests/manual/audiopwmio/wavefile_pause_resume.py create mode 100644 tests/manual/audiopwmio/wavefile_playback.py (limited to 'tests') diff --git a/tests/manual/audiocore/jeplayer-splash-16000-16bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-16000-16bit-mono-signed.wav new file mode 100644 index 000000000..cd3da395b Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-16bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-16000-16bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-16000-16bit-stereo-signed.wav new file mode 100644 index 000000000..c1036475b Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-16bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-16000-24bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-16000-24bit-mono-signed.wav new file mode 100644 index 000000000..6aa6afc7a Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-24bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-16000-24bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-16000-24bit-stereo-signed.wav new file mode 100644 index 000000000..c175aaf61 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-24bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-16000-8bit-mono-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-16000-8bit-mono-unsigned.wav new file mode 100644 index 000000000..ccf63b9c1 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-8bit-mono-unsigned.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-16000-8bit-stereo-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-16000-8bit-stereo-unsigned.wav new file mode 100644 index 000000000..63aaa5b29 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-16000-8bit-stereo-unsigned.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-16bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-44100-16bit-mono-signed.wav new file mode 100644 index 000000000..147b14b16 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-16bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-16bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-44100-16bit-stereo-signed.wav new file mode 100644 index 000000000..adfe84fb0 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-16bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-24bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-44100-24bit-mono-signed.wav new file mode 100644 index 000000000..2c5337045 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-24bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-24bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-44100-24bit-stereo-signed.wav new file mode 100644 index 000000000..a290c6c37 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-24bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-8bit-mono-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-44100-8bit-mono-unsigned.wav new file mode 100644 index 000000000..cd1c79280 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-8bit-mono-unsigned.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-8bit-stereo-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-44100-8bit-stereo-unsigned.wav new file mode 100644 index 000000000..12c48e258 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-8bit-stereo-unsigned.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-44100-stereo.mp3 b/tests/manual/audiocore/jeplayer-splash-44100-stereo.mp3 new file mode 100644 index 000000000..fd820e69a Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-44100-stereo.mp3 differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-16bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-8000-16bit-mono-signed.wav new file mode 100644 index 000000000..a730c2b84 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-16bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-16bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-8000-16bit-stereo-signed.wav new file mode 100644 index 000000000..5038ae8ae Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-16bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-24bit-mono-signed.wav b/tests/manual/audiocore/jeplayer-splash-8000-24bit-mono-signed.wav new file mode 100644 index 000000000..ac25cddb3 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-24bit-mono-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-24bit-stereo-signed.wav b/tests/manual/audiocore/jeplayer-splash-8000-24bit-stereo-signed.wav new file mode 100644 index 000000000..6fec67431 Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-24bit-stereo-signed.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-8bit-mono-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-8000-8bit-mono-unsigned.wav new file mode 100644 index 000000000..d5e49b24b Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-8bit-mono-unsigned.wav differ diff --git a/tests/manual/audiocore/jeplayer-splash-8000-8bit-stereo-unsigned.wav b/tests/manual/audiocore/jeplayer-splash-8000-8bit-stereo-unsigned.wav new file mode 100644 index 000000000..3df7945aa Binary files /dev/null and b/tests/manual/audiocore/jeplayer-splash-8000-8bit-stereo-unsigned.wav differ diff --git a/tests/manual/audiopwmio/single_buffer_loop.py b/tests/manual/audiopwmio/single_buffer_loop.py new file mode 100644 index 000000000..dfac475b5 --- /dev/null +++ b/tests/manual/audiopwmio/single_buffer_loop.py @@ -0,0 +1,65 @@ +import audiocore +import audiopwmio +import board +import digitalio +import array +import time +import math + +trigger = digitalio.DigitalInOut(board.D4) +trigger.switch_to_output(True) + +# Generate one period of sine wav. +length = 8000 // 440 + +samples = [] +sample_names = [ +"unsigned 8 bit", +"signed 8 bit", +"unsigned 16 bit", +"signed 16 bit" +] + + +# unsigned 8 bit +u8 = array.array("B", [0] * length) +for i in range(length): + u8[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 7) + 2 ** 7) + +samples.append(audiocore.RawSample(u8, sample_rate=4000)) + +# signed 8 bit +s8 = array.array("b", [0] * length) +for i in range(length): + s8[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 7)) + +samples.append(audiocore.RawSample(s8, sample_rate=16000)) + +# unsigned 16 bit +u16 = array.array("H", [0] * length) +for i in range(length): + u16[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15) + 2 ** 15) + +samples.append(audiocore.RawSample(u16, sample_rate=8000)) + + +# signed 16 bit +s16 = array.array("h", [0] * length) +for i in range(length): + s16[i] = int(math.sin(math.pi * 2 * i / length) * (2 ** 15)) + +samples.append(audiocore.RawSample(s16, sample_rate=8000)) + + +dac = audiopwmio.PWMAudioOut(board.D13) +for sample, name in zip(samples, sample_names): + print(name) + trigger.value = False + dac.play(sample, loop=True) + time.sleep(1) + dac.stop() + time.sleep(0.1) + trigger.value = True + print() + +print("done") diff --git a/tests/manual/audiopwmio/wavefile_pause_resume.py b/tests/manual/audiopwmio/wavefile_pause_resume.py new file mode 100644 index 000000000..27912d321 --- /dev/null +++ b/tests/manual/audiopwmio/wavefile_pause_resume.py @@ -0,0 +1,39 @@ +import audiocore +import audiopwmio +import board +import digitalio +import time +import math +import os + +trigger = digitalio.DigitalInOut(board.D4) +trigger.switch_to_output(True) + +sample_prefix = "jeplayer-splash" + +samples = [] +for fn in os.listdir("/"): + if fn.startswith(sample_prefix): + samples.append(fn) + +dac = audiopwmio.PWMAudioOut(left_channel=board.D12, right_channel=board.D13) +for filename in samples: + print("playing", filename) + with open(filename, "rb") as sample_file: + try: + sample = audiocore.WaveFile(sample_file) + except OSError as e: + print(e) + continue + trigger.value = False + dac.play(sample) + while dac.playing: + time.sleep(0.1) + dac.pause() + time.sleep(0.1) + dac.resume() + trigger.value = True + time.sleep(0.1) + print() + +print("done") diff --git a/tests/manual/audiopwmio/wavefile_playback.py b/tests/manual/audiopwmio/wavefile_playback.py new file mode 100644 index 000000000..0adbf2b19 --- /dev/null +++ b/tests/manual/audiopwmio/wavefile_playback.py @@ -0,0 +1,36 @@ +import audiocore +import audiopwmio +import board +import digitalio +import time +import math +import os + +trigger = digitalio.DigitalInOut(board.D4) +trigger.switch_to_output(True) + +sample_prefix = "jeplayer-splash" + +samples = [] +for fn in os.listdir("/"): + if fn.startswith(sample_prefix): + samples.append(fn) + +dac = audiopwmio.PWMAudioOut(left_channel=board.D12, right_channel=board.D13) +for filename in samples: + print("playing", filename) + with open(filename, "rb") as sample_file: + try: + sample = audiocore.WaveFile(sample_file) + except OSError as e: + print(e) + continue + trigger.value = False + dac.play(sample) + while dac.playing: + time.sleep(1) + trigger.value = True + time.sleep(0.1) + print() + +print("done") -- cgit v1.2.3