Did you know that I make an open source music player?! It's called MoseAmp! It's runs on Mac OS and Windows1 and is focused on playing retro videogame music formats including:
- Nintendo 64 (.usf, .miniusf)
- Nintendo DS (.2sf, .mini2sf)
- Playstation (.psf, .minipsf)
- Playstation 2 (.psf2, .minipsf2)
- Gameboy (.gbs)
- Sega Genesis (.gym, .vgz)
- Sega Game Gear (.kss)
- Nintendo (NES) (.nsf, .nsfe)
- Super Nintendo (.spc)
- Gameboy Advance (.gsf, .minigsf)
- Also normal music formats (.mp3, .ogg, .wav, .flac)
I made it for myself and use it every day, but it'd be dope if other people used it too! There's no analytics or automatic updates so I don't really have any way of knowing if anyone besides me uses it. It could be a banger hit app that's just so stable there's no bug reports and I'd never know.
Oh also shoutout @toastbits for making the console icons!
Fun facts below the fold:
-
It could probably run on Linux too I just haven't bothered to get automation set up to build it there.
Fun Facts
- MoseAmp is an Electron app; the UI is a React/Redux app, and the music synthesis is done by the lovely Musix player library by sasq64.
- I've been making and using MoseAmp since 2015!
- The very first versions of MoseAmp were pulling in GME and compiling it using emscripten to run on the web, but at some point I switched to building the native code as a native Node.js module, which simplified some integration bits and added some speed, but made the app impossible to run in a web browser. I've got mild hopes of moving to building the synthesis as a WebAssembly module to unlock the ability to make a mobile version of MoseAmp with React Native.
- For reasons I still don't understand, Playstation 2 tracks in Musix output at a 48kHz sample rate while every other format outputs at 44.1kHz. For a while I was resampling the output in JavaScript only for PS2 tracks to get them to match the other formats, which hurt audio quality and playback speed. Happily, the Web Audio API added configurable sample rates for output at some point, so I could hand off the resampling to the browser engine that did it waaaaay fasterrrrrrr.
- Yeah the design is absolutely a ripoff of OpenEmu.
Visualizer / Renderer

Okay so the weird part of MoseAmp is the Visualizer, which has two super-basic generic visualizers and the magic NES visualizer. Why does this exist?
Basically, I have lots of friends who make Famitracker chiptune covers and use NSFPlay Synthesia to make visuals for posting to Youtube. I wanted to see if I could make MoseAmp able to output similar visuals, and then add more features / customizability as NSFPlay Synthesia is mostly not being maintained.
I got as far as adding the bare bones of a piano roll visualization, but the rendering is not great (e.g. key sizes being weird, notes being rendered under the keys, weird blurring, etc.). Another problem is that the app can't reliably render at 60fps, so instead of having people make screen captures of the app like they do with NSFPlay, I added a Renderer tab that renders a visualization at a manually-set FPS. It works by outputting individual frames as PNGs in a temporary directory, and mixing them together with the audio output using ffmpeg.
I'd like to eventually revisit this and make it more usable as I still think there's room for a more flexible, usable visualizer for chiptune covers, but time will tell if I can work up the motivation.
