From 76c7f7a736d75df7c6d98f8305acf217df404df4 Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Sun, 14 Jun 2020 14:45:32 -0500 Subject: [PATCH 1/4] add play_mp3 function to bluefruit module --- adafruit_circuitplayground/bluefruit.py | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/adafruit_circuitplayground/bluefruit.py b/adafruit_circuitplayground/bluefruit.py index 04623d4..b48feb4 100755 --- a/adafruit_circuitplayground/bluefruit.py +++ b/adafruit_circuitplayground/bluefruit.py @@ -42,6 +42,7 @@ import digitalio import board import audiopwmio +import audiomp3 import audiobusio from adafruit_circuitplayground.circuit_playground_base import CircuitPlaygroundBase @@ -151,6 +152,41 @@ def loud_sound(self, sound_threshold=200): return self.sound_level > sound_threshold + def play_mp3(self, file_name): + """ Play a .mp3 file using the onboard speaker. + + :param file_name: The name of your .mp3 file in quotation marks including .mp3 + + .. image :: ../docs/_static/speaker.jpg + :alt: Onboard speaker + + To use with the Circuit Playground Bluefruit: + + .. code-block:: python + + from adafruit_circuitplayground import cp + + while True: + if cp.button_a: + cp.play_mp3("laugh.mp3") + elif cp.button_b: + cp.play_mp3("rimshot.mp3") + """ + if file_name.lower().endswith(".mp3"): + # Play a specified file. + self.stop_tone() + self._speaker_enable.value = True + with self._audio_out( + board.SPEAKER + ) as audio: # pylint: disable=not-callable + mp3file = audiomp3.MP3Decoder(open(file_name, "rb")) + audio.play(mp3file) + while audio.playing: + pass + self._speaker_enable.value = False + else: + raise ValueError("Filetype must be mp3") + cpb = Bluefruit() # pylint: disable=invalid-name """Object that is automatically created on import. From 3f50cfd175ca7d22c1f6f48a2a1ce154f7b52d9c Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Sun, 14 Jun 2020 16:25:26 -0500 Subject: [PATCH 2/4] fix docs import issue --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index 7c9853b..5f84980 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,6 +40,7 @@ "audiocore", "audiopwmio", "audiobusio", + "audiomp3", ] # Add any paths that contain templates here, relative to this directory. From 6232174fd74343613e7c7a9b37e812b93055377a Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Mon, 15 Jun 2020 19:24:51 -0500 Subject: [PATCH 3/4] make play_mp3 unsupported in the express module --- adafruit_circuitplayground/express.py | 1 + 1 file changed, 1 insertion(+) diff --git a/adafruit_circuitplayground/express.py b/adafruit_circuitplayground/express.py index d0f61fb..73d0f9a 100755 --- a/adafruit_circuitplayground/express.py +++ b/adafruit_circuitplayground/express.py @@ -87,6 +87,7 @@ def _unsupported(self): # Express, they will result in the NotImplementedError raised in the property above. sound_level = _unsupported loud_sound = _unsupported + play_mp3 = _unsupported cpx = Express() # pylint: disable=invalid-name From d2ab3a3dcd49b3bf83243de54a9aad0f0161c9e9 Mon Sep 17 00:00:00 2001 From: FoamyGuy Date: Tue, 16 Jun 2020 18:23:34 -0500 Subject: [PATCH 4/4] adding play_mp3 example --- examples/circuitplayground_bluefruit_play_mp3.py | 12 ++++++++++++ examples/dip.mp3 | Bin 0 -> 5641 bytes examples/rise.mp3 | Bin 0 -> 5432 bytes 3 files changed, 12 insertions(+) create mode 100644 examples/circuitplayground_bluefruit_play_mp3.py create mode 100644 examples/dip.mp3 create mode 100644 examples/rise.mp3 diff --git a/examples/circuitplayground_bluefruit_play_mp3.py b/examples/circuitplayground_bluefruit_play_mp3.py new file mode 100644 index 0000000..eccfb94 --- /dev/null +++ b/examples/circuitplayground_bluefruit_play_mp3.py @@ -0,0 +1,12 @@ +""" +This example plays mp3 audio files from the built-in speaker when the A or B buttons are pressed. + +NOTE: This example does NOT support Circuit Playground Express. +""" +from adafruit_circuitplayground import cp + +while True: + if cp.button_a: + cp.play_mp3("dip.mp3") + if cp.button_b: + cp.play_mp3("rise.mp3") diff --git a/examples/dip.mp3 b/examples/dip.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1e4e595c5b85f50107edcc91197ab8024190031a GIT binary patch literal 5641 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 O|C>wxn@;{ejQ<1vvs<(P literal 0 HcmV?d00001