<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv" -->

---
title: Obscure audio codec is a perfect fit for the N64 | daily.dev
description: A niche transform audio codec called ULC turns out to be a great fit for the Nintendo 64. It runs on the console's RSP vector coprocessor using only about 4%...
canonical: https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Obscure audio codec is a perfect fit for the N64 | daily.dev
og:description: A niche transform audio codec called ULC turns out to be a great fit for the Nintendo 64. It runs on the console's RSP vector coprocessor using only about 4%...
og:url: https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv
og:image: https://api.daily.dev/og/posts/uFqNgEtPV.png
og:image:alt: Obscure audio codec is a perfect fit for the N64
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Obscure audio codec is a perfect fit for the N64

**[Hacker News](https://daily.dev/sources/hn)** · 10 min read · 0 upvotes · 0 comments

## Summary

A niche transform audio codec called ULC turns out to be a great fit for the Nintendo 64. It runs on the console's RSP vector coprocessor using only about 4% of CPU time and 5% of RSP time for a 44100 Hz stereo track, with quality close to Opus. ULC was originally built by Aikku93 as a codec, and a Game Boy Advance demo played recorded music at 70kbps with it. The author ported it to RSP-accelerated MIPS assembly (about 1400 lines) using 16-bit fixed point math, with help from Codex to translate a custom RSPL language into optimized assembly. The decoder has been merged into Libdragon's preview branch and is used in a Half-Life N64 port to fit 2,500 sounds and 27 music tracks into a 64MB cartridge.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://phoboslab.org/log/2026/11/n64-ulc-codec>

## Questions this post answers

### What is the Ultra Low Complexity (ULC) audio codec and how does it compare to MP3?

ULC is a transform-based audio codec similar to MP3, using the Modified Discrete Cosine Transform, but without multi-band splitting or Huffman entropy coding. Instead it stores coefficients with a simple nibble-based syntax, making decoding extremely cheap, around 150 lines of C. It was created by developer Aikku93 for a Game Boy Advance demo that played music at 70kbps on a 16 MHz ARM CPU with no vector instructions.

_Comparing lightweight codecs for constrained hardware is easier with technical write-ups like this surfaced on daily.dev._

### How much CPU and RSP time does ULC audio decoding use on the Nintendo 64?

A single 44100 Hz stereo ULC track uses about 4% of the N64's 93 MHz CPU time and 5% of RSP coprocessor time. The decoder was ported to roughly 1400 lines of MIPS assembly running on the RSP, using 16-bit fixed point math with a 1024-sample block size, making it practical for background music and gameplay audio rather than just cutscenes.

_Developers optimizing audio pipelines on constrained hardware can track breakdowns like this via daily.dev._

### Why was MP3 or Opus decoding too slow for real-time background music on the Nintendo 64?

Opus and MP3 decoding require too much CPU time to run alongside gameplay on the N64's 93 MHz CPU; MP3 typically needs at least an 80 to 100 MHz CPU, and Libdragon's RSP-accelerated Opus decoder, while excellent in quality, is also too slow for continuous use during gameplay. ADPCM was fast but used roughly 4 times the storage of ULC for comparable quality.

_Weighing codec trade-offs for resource-limited platforms is simpler when these comparisons land on daily.dev._

## Community take

How the wider developer community reacted, aggregated from 2 discussions and 26 comments across hackernews, lobsters (as of 2026-11-05).

**TL;DR:** Commenters are impressed by the technical feat of porting the ULC codec to the N64's RSP, with discussion spanning patent history of audio/video codecs, the flood of recent N64 fan ports, and some practical questions about RSP memory usage.

**Sentiment:** 55% positive · 35% mixed · 10% skeptical

**The case for**

- The port is seen as a clever, well-documented technical achievement for squeezing good audio quality into tight N64 constraints.
- It fits into a broader wave of impressive fan-made N64 ports that people are excitedly tracking.
- IMEM constraints are considered a solvable non-issue since code can be swapped in and out via Libdragon's queue system.

**The pushback**

- Some argue a codec like this would have been blocked by the patent minefield of the late 1990s had it existed then.
- One commenter noted the demo track chosen was a poor example for showcasing audio quality via A/B comparison.

**By community**

- hackernews (positive): Overall enthusiastic about the codec port and the wider N64 fan-porting scene, with a side tangent into codec patent history and video codec licensing woes.

**Open questions**

- Could the codec be adapted to run on other constrained DSPs like the MAS3507D given its tiny instruction memory?

**Highlights**

> This codec would have been great 27 years ago!  I suspect it wouldn't have gotten past the patent lawyers in 1999 though.  It seems cute today but the entire codec space was a patent minefield, the N64 mp3 decoder was implemented twice (once based on the reference codec, once clean) with Nintendo/Rare then paying RAD game tools to license their decoder... of which none of their code was used but they had a license from the mp3 patent holder (Fraunhofer) which then shielded Nintendo from lawsuits.  Fraunhofer wanted something like $250k to license directly which wasn't going to fly. I'll also note the frame rate issues in Conker were mainly down to raw RDP fillrate issues, which was for sure the weakest part of the N64 hardware, it could draw beautiful triangles (for the time) but oh so so slowly.  There was a decent amount of speech during gameplay using the RSP mp3 codec.  The cartridge size was still an issue, 64Mb got a good amount of mono speech but was still very much at a premium.
> — [midnightclubbed on hackernews · 2 comments](https://news.ycombinator.com/item?id=50380915)

> Like the DMEM, you can replace the IMEM at any time. In this case, when you're done with processing a block of music, you can DMA the code for 3d transforms or anything else to the RSP. Libdragon handles this transparently for you with a queue[1]. [1] https://libdragon.dev/ref/rspq_8h.html
> — [phoboslab on hackernews](https://news.ycombinator.com/item?id=50384608)

> There's an explosion of N64 ports lately, with a huge mix of new libraries (libdragon) pure fan passion, and LLM assistance. Some I'm tracking: - Duke Nukem 3D (ie, the fully-functional PC version) https://github.com/BigChat88/N64DukeNukem3DPort - Portal 64 Still alive https://github.com/mwpenny/portal64-still-alive - Resident Evil 64 (ie, not RE2, but the first one) https://www.youtube.com/watch?v=_xRiwy8Z6S0 - Silent Hill (still an early WIP) https://www.youtube.com/watch?v=v7fM06jmHso I haven't personally tested, but these look interesting: - Simpsons Arcade https://www.youtube.com/watch?v=zH9JYQVzKDE - X-men Arcade https://www.youtube.com/watch?v=ah3nB8MP4CM - TMNT Arcade Collection https://www.youtube.com/watch?v=CiR5-ZpLtyI At this point, they're coming out faster than I can play them. I'm in the middle of the 2nd Episode of Duke 3D right now and it's quite nice. The original 64 version was always fun, but mid-level saves are really a game changer.
> — [everdrive on hackernews · 1 comments](https://news.ycombinator.com/item?id=50380919)

> i got confused at first, and then noted that this was an awful piece of music to pick for a compression demonstration. not the music taste itself, but perhaps he should have gone for something more known that would be easy for A/B tests.
> — [aruametello on hackernews](https://news.ycombinator.com/item?id=50383410)

> I wonder if this would also be a great fit for the MAS3507D! Supposedly you can replace the program with your own in a 1-kiloword RAM (the default MP3 decoder is in ROM, and probably larger). If you can fit this codec in 1024 MIPS instructions, perhaps you can do the same in 1024 of these DSP instructions… Too bad there is seemingly zero public documentation on the format of these programs, though (and no emulator or similar).
> — [Sesse\_\_ on hackernews](https://news.ycombinator.com/item?id=50384241)

**Source threads**

- [hackernews](https://news.ycombinator.com/item?id=50378508) · 158 points · 26 comments
- [lobsters](https://lobste.rs/s/cm9b92/ulc_audio_codec_is_perfect_fit_for_n64) · 4 points · 0 comments

## Similar posts on daily.dev

- [PhobosLab](https://daily.dev/posts/phoboslab-46ax4iw1k) · Hacker News · 0 upvotes · 0 comments
- [Your old Nintendo 64 games are finally getting unofficial PC ports, and they run better than emulators](https://daily.dev/posts/your-old-nintendo-64-games-are-finally-getting-unofficial-pc-ports-and-they-run-better-than-emulato-buc1z3nip) · XDA Developers · 0 upvotes · 0 comments
- [Hand-Coded ASM Powers Homebrew SNES Game](https://daily.dev/posts/hand-coded-asm-powers-homebrew-snes-game-wjds4mzkp) · Hackaday · 1 upvotes · 0 comments
- [60fps Video on a CGA?](https://daily.dev/posts/60fps-video-on-a-cga--6dmcdlx1s) · Two Stop Bits · 0 upvotes · 0 comments
- [PhobosLab](https://daily.dev/posts/phoboslab-gv3axay9y) · Hacker News · 0 upvotes · 0 comments

---

Tags: [#embedded](https://daily.dev/tags/embedded)

[View this post on daily.dev](https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Obscure audio codec is a perfect fit for the N64","url":"https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv"},"datePublished":"2026-11-05T16:38:16.189Z","dateModified":"2026-11-05T21:49:00.275Z","description":"A niche transform audio codec called ULC turns out to be a great fit for the Nintendo 64. It runs on the console's RSP vector coprocessor using only about 4%...","image":"https://media.daily.dev/image/upload/s--CxzD6vbw--/f_auto/v1722860399/public/Placeholder%2005","thumbnailUrl":"https://media.daily.dev/image/upload/s--CxzD6vbw--/f_auto/v1722860399/public/Placeholder%2005","isAccessibleForFree":true,"articleSection":"Hacker News","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Hacker News","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/hn","url":"https://daily.dev/sources/hn"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"embedded","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Hacker News","item":"https://daily.dev/sources/hn"},{"@type":"ListItem","position":3,"name":"Obscure audio codec is a perfect fit for the N64"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/obscure-audio-codec-is-a-perfect-fit-for-the-n64-ufqngetpv#faq","mainEntity":[{"@type":"Question","name":"What is the Ultra Low Complexity (ULC) audio codec and how does it compare to MP3?","acceptedAnswer":{"@type":"Answer","text":"ULC is a transform-based audio codec similar to MP3, using the Modified Discrete Cosine Transform, but without multi-band splitting or Huffman entropy coding. Instead it stores coefficients with a simple nibble-based syntax, making decoding extremely cheap, around 150 lines of C. It was created by developer Aikku93 for a Game Boy Advance demo that played music at 70kbps on a 16 MHz ARM CPU with no vector instructions. Comparing lightweight codecs for constrained hardware is easier with technical write-ups like this surfaced on daily.dev."}},{"@type":"Question","name":"How much CPU and RSP time does ULC audio decoding use on the Nintendo 64?","acceptedAnswer":{"@type":"Answer","text":"A single 44100 Hz stereo ULC track uses about 4% of the N64's 93 MHz CPU time and 5% of RSP coprocessor time. The decoder was ported to roughly 1400 lines of MIPS assembly running on the RSP, using 16-bit fixed point math with a 1024-sample block size, making it practical for background music and gameplay audio rather than just cutscenes. Developers optimizing audio pipelines on constrained hardware can track breakdowns like this via daily.dev."}},{"@type":"Question","name":"Why was MP3 or Opus decoding too slow for real-time background music on the Nintendo 64?","acceptedAnswer":{"@type":"Answer","text":"Opus and MP3 decoding require too much CPU time to run alongside gameplay on the N64's 93 MHz CPU; MP3 typically needs at least an 80 to 100 MHz CPU, and Libdragon's RSP-accelerated Opus decoder, while excellent in quality, is also too slow for continuous use during gameplay. ADPCM was fast but used roughly 4 times the storage of ULC for comparable quality. Weighing codec trade-offs for resource-limited platforms is simpler when these comparisons land on daily.dev."}}]}
```

