Skip to content

Add audio output option file to Larsio and Chip's Challenge #3103

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 56 additions & 13 deletions Fruit_Jam/Larsio_Paint_Music/sound_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import math
import time
import array
import json
import gc
import os
import digitalio
Expand All @@ -22,6 +23,7 @@
import audiomixer
import synthio
import board
import adafruit_pathlib as pathlib
import adafruit_tlv320
from adafruit_midi.note_on import NoteOn
from adafruit_midi.note_off import NoteOff
Expand Down Expand Up @@ -63,6 +65,16 @@ def __init__(self, audio_output="pwm", seconds_per_eighth=0.25):
# Setup PWM audio output on D10
self.audio = audiopwmio.PWMAudioOut(board.D10)
else: # i2s
# optional configuration file for speaker/headphone setting
# check current directory first and then root directory
launcher_config = {}
if pathlib.Path("launcher.conf.json").exists():
with open("launcher.conf.json", "r") as f:
launcher_config = json.load(f)
elif pathlib.Path("/launcher.conf.json").exists():
with open("/launcher.conf.json", "r") as f:
launcher_config = json.load(f)

try:
# Import libraries needed for I2S
#check for Metro RP2350 vs. Fruit Jam
Expand Down Expand Up @@ -96,20 +108,51 @@ def __init__(self, audio_output="pwm", seconds_per_eighth=0.25):
wsel_pin = board.I2S_WS
din_pin = board.I2S_DIN

# Check if DAC is connected
for i in range(500): # try for 5 seconds
if i2c.try_lock():
break
time.sleep(0.01)
if 0x18 in i2c.scan():
ltv320_present = True
else:
ltv320_present = False
i2c.unlock()

# Initialize TLV320
self.tlv = adafruit_tlv320.TLV320DAC3100(i2c)
self.tlv.configure_clocks(sample_rate=11025, bit_depth=16)
self.tlv.headphone_output = True
self.tlv.headphone_volume = -15 # dB

# Setup I2S audio output - important to do this AFTER configuring the DAC
self.audio = audiobusio.I2SOut(
bit_clock=bclck_pin,
word_select=wsel_pin,
data=din_pin
)

print("TLV320 I2S DAC initialized successfully")
if ltv320_present:
self.tlv = adafruit_tlv320.TLV320DAC3100(i2c)

# set sample rate & bit depth
self.tlv.configure_clocks(sample_rate=11025, bit_depth=16)

if "sound" in launcher_config:
if launcher_config["sound"] == "speaker":
# use speaker
self.tlv.speaker_output = True
self.tlv.speaker_volume = -60
else:
# use headphones
self.tlv.headphone_output = True
self.tlv.headphone_volume = -15 # dB
else:
# default to headphones
self.tlv.headphone_output = True
self.tlv.headphone_volume = -15 # dB

# Setup I2S audio output - important to do this AFTER configuring the DAC
self.audio = audiobusio.I2SOut(
bit_clock=bclck_pin,
word_select=wsel_pin,
data=din_pin
)

print("TLV320 I2S DAC initialized successfully")

else:
print("TLV320 DAC not found, falling back to PWM audio output")
self.audio = audiopwmio.PWMAudioOut(board.D10)

except Exception as e:
print(f"Error initializing TLV320 DAC: {e}")
print("Falling back to PWM audio output")
Expand Down
11 changes: 3 additions & 8 deletions Metro/Metro_RP2350_Chips_Challenge/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import picodvi
import framebufferio
import displayio
import adafruit_tlv320
import audiobusio
from audio import Audio
from game import Game
Expand Down Expand Up @@ -39,16 +38,12 @@

displayio.release_displays()

i2c = board.I2C()
dac = adafruit_tlv320.TLV320DAC3100(i2c)
dac.configure_clocks(sample_rate=44100, bit_depth=16)
dac.headphone_output = True
dac.headphone_volume = -15 # dB

if hasattr(board, "I2S_BCLK"):
audio_bus = audiobusio.I2SOut(board.I2S_BCLK, board.I2S_WS, board.I2S_DIN)
else:
elif hasattr(board, "D9") and hasattr(board, "D10") and hasattr(board, "D11"):
audio_bus = audiobusio.I2SOut(board.D9, board.D10, board.D11)
else:
audio_bus = None
audio = Audio(audio_bus, SOUND_EFFECTS)

fb = picodvi.Framebuffer(320, 240, clk_dp=board.CKP, clk_dn=board.CKN,
Expand Down
55 changes: 54 additions & 1 deletion Metro/Metro_RP2350_Chips_Challenge/definitions.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,63 @@
# SPDX-FileCopyrightText: 2025 Melissa LeBlanc-Williams
#
# SPDX-License-Identifier: MIT
import json
import time
import board
from micropython import const
import adafruit_pathlib as pathlib
import adafruit_tlv320

# optional configuration file for speaker/headphone setting, check current and root directory
launcher_config = {}
if pathlib.Path("launcher.conf.json").exists():
with open("launcher.conf.json", "r") as f:
launcher_config = json.load(f)
elif pathlib.Path("/launcher.conf.json").exists():
with open("/launcher.conf.json", "r") as f:
launcher_config = json.load(f)

# Check if DAC is connected
i2c = board.I2C()
for i in range(500): # try for 5 seconds
if i2c.try_lock():
break
time.sleep(0.01)
if 0x18 in i2c.scan():
ltv320_present = True
else:
ltv320_present = False
i2c.unlock()

if ltv320_present:
dac = adafruit_tlv320.TLV320DAC3100(i2c)

# set sample rate & bit depth
dac.configure_clocks(sample_rate=44100, bit_depth=16)

if "sound" in launcher_config:
if launcher_config["sound"] == "speaker":
# use speaker
dac.speaker_output = True
dac.speaker_volume = -40
elif launcher_config["sound"] != "mute":
# use headphones
dac.headphone_output = True
dac.headphone_volume = -15 # dB
else:
# default to headphones
dac.headphone_output = True
dac.headphone_volume = -15 # dB

# Settings
PLAY_SOUNDS = True
if ltv320_present:
PLAY_SOUNDS = True
else:
PLAY_SOUNDS = False

if "sound" in launcher_config:
if launcher_config["sound"] == "mute":
PLAY_SOUNDS = False

# Timing Constants
TICKS_PER_SECOND = const(20)
Expand Down