3dsFM

3dsFM

A music player for the Nintendo 3DS. Copy MP3, Ogg, Opus and WAV files to the SD card and it plays them with cover flow, a queue and a visualizer, lid open or closed.

3dsFM turns a 3DS into the music player it should have shipped as.

I had a folder of 600 downloaded songs and a New 3DS that sits next to my bed. The console’s own sound app is from 2011 and acts like it, so I wrote my own. Drop files under sdmc:/Music, loose or in folders, and 3dsFM reads the tags, pulls out the cover art and sorts everything into songs, artists and a queue.

The bottom screen is the controller. Songs come as a cover flow you can flick through, a grid or a list; the top screen is always the player, with the art fogged behind the title. Close the lid and the music keeps going with the screens off, like an iPod with a hinge.

Features

  • MP3, Ogg Vorbis, Opus and WAV, decoded on the console with mpg123, Tremor and libopus
  • Tags from ID3, Vorbis comments and WAV INFO chunks, with video-site noise like “(Official Video)” cleaned off titles
  • A library index on the SD card, so 600 songs appear instantly on every launch after the first
  • Cover flow with flick physics, a grid and a list, plus artists with song counts and a play queue
  • Covers load for what is on screen first, so long lists stay smooth
  • A visualizer, dark and HOME Menu themes, and playback with the lid closed
  • A 3D HOME Menu banner with its own jingle, built from a glTF model in the repo

Built With

  • C++17 with libctru, Citro2D and Citro3D, NDSP for sound
  • Host-side tests for the tag reader, scanner and queue under AddressSanitizer
  • Reproducible .3dsx and .cia builds in Docker, released by GitHub Actions
  • Shares its toolchain and website design with 3dsDL

It is a development build that I test on a New 3DS. The story of getting it to play without freezing the console is in the blog post. GPLv3.