El audio comprimido puede ser una bonita alternativa a los archivos WAV que no tienen compresión, especialmente cuando tienes un sistema de archivo pequeño como pasa en muchas de las tarjetas con CircuitPython: ¡los archivos WAV terminan ocupando mucho de tu espacio! Gracias a que han expirado las patentes sobre MP3, ahora podemos incluir decodificación de MP3 como una funcionalidad del núcleo de CircuitPython, y ¡hasta puedes tocar varios archivos MP3 de forma simultánea!
CircuitPython tiene capacidad para cualquier tipo de archivo MP3 que desees. Hemos encontrado que archivos tanto mono como estereo desde 32kbit/s hasta 128kbit/s funcionan, con tazas de muestreo desde 16kHz hasta 44.1kHz. La salida de DAC de las SAMD51 M4 es de tan solo 12-bits por lo que no tiene sentido usar tazas de muestreo más altas.
Vamos a tocar un archivo mp3 corto, esperar a que un botón sea presionado, y luego tocar otro segundo archivo mp3. Utilice el mismo cableado que en los otros ejemplos de audio.
Ya que crear un objeto MP3Decoder
requiere mucha memoria, lo mejor es hacer esto solo una vez cuando inicia tu programa, y luego actualizar la propiedad .file
del objeto MP3Decoder
cuando quieres tocar un archivo diferente. De otra forma, puede que te topes el temido error de MemoryError
.
Descarga estos dos archivos mp3 y cópialos a tu tarjeta:
Copia y pega el siguiente código hacia code.py utilizando tu editor preferido, y salva el archivo:
# SPDX-FileCopyrightText: 2020 Jeff Epler for Adafruit Industries # # SPDX-License-Identifier: MIT """CircuitPython Essentials Audio Out MP3 Example""" import board import digitalio from audiomp3 import MP3Decoder try: from audioio import AudioOut except ImportError: try: from audiopwmio import PWMAudioOut as AudioOut except ImportError: pass # not always supported by every board! button = digitalio.DigitalInOut(board.A1) button.switch_to_input(pull=digitalio.Pull.UP) # The listed mp3files will be played in order mp3files = ["slow.mp3", "happy.mp3"] # You have to specify some mp3 file when creating the decoder mp3 = open(mp3files[0], "rb") decoder = MP3Decoder(mp3) audio = AudioOut(board.A0) while True: for filename in mp3files: # Updating the .file property of the existing decoder # helps avoid running out of memory (MemoryError exception) decoder.file = open(filename, "rb") audio.play(decoder) print("playing", filename) # This allows you to do other things while the audio plays! while audio.playing: pass print("Waiting for button press to continue!") while button.value: pass
Text editor powered by tinymce.