Game Boy Advance Audio Interpolation
jsgroth.dev
jsgroth.dev
But this is a bit like those who use smoothing filters. It's ultimately about taste, but it should be recognized that unless the filter is attempting to accurately recreate the original hardware of the era then the original design intent is not being adhered to, and so something may be lost in the "enhancement".
If it wasn't so late I'd calculate how big (in inches) an individual pixel is at that size.
I don't think so, I think you're just getting a high end that isn't in the original audio. In the places where there are high frequencies the aliasing and the hiss just gets in the way.
that drives emotional energy
Seems like a hyperbolic rationalization.
Accuracy is paramount. Targeting else than the console's sound is an affront to preservation.
Programmers using devkits (more powerful than the consumer hardware) likewise.
What you're saying to me is like someone saying, well, if the piano had more octaves then existing compositions would have been better. But those pieces were composed with the current amount of octaves in mind in the first place...
Maybe there's an analogue with the harpsichord-to-piano transition, but I'm not knowledgeable enough about that yet.
I guess history has shown that most composers (and listeners) preferred the piano sound over the harpsichord sound the majority of the time.
When you play e.g. Gamecube games in an emulator, do you run them in 480p or do you render at a higher resolution? The former is clearly what the designers were targeting, but I think there’s rarely any benefit to eschewing higher resolutions. It just looks even better.
Given its spectral complexity can you even tell if a hihat sample is aliased?
Of course the artifacts were a constraint. Whether consciously considered or not, constraints influence design decisions.
> We don't know whether the designers would have chosen to keep them or not, if they had the choice.
Maybe Frédéric Chopin would have written his etudes and nocturnes for the Roland SC-55 Goblins instrument patch if that choice had been available to him, but it wasn't. What we do know of are the choices he actually made facing the constraints that he actually faced.
Similarly, maybe a GBA music composer would have preferred for the music to be a high fidelity recording of a full piano arrangement if that choice had been available to them. But it wasn't, so they didn't.
We can speculate all we want about what creative choices might have been made if the people behind them were dealt a different hand, but in reality choices don't exist in isolation of constraints, and I think any line of reasoning trying to divorce the two is futile.
I don't get this, are you saying that this aliasing is just an artifact of the emulation? Like the GBA speaker/headphone jack itself would also be affected by the same aliasing right? And in that case the song was composed for that, right?
I don't think it would be right to go as far as to say that there's a huge strong interplay in every single GBA title's song with the hardware (I'm sure some stuff was phoned in and only listened to by the composer in whatever MIDI DAW thing they were using) but at one point the GBA was the target right?
In the mid-1980s the first really affordable sampler was the Ensoniq Mirage, which used the Bob Yannes-designed ES5503 DOC (Digital Oscillator Chip) to generate its waveforms. It played back 8-bit samples and used a fairly simple phase accumulator that didn't do any form of interpolation (I don't count "leftmost neighbour" as interpolation). Particularly when you pitch it down, you get a rough, clanky, gritty "whine" to samples, that the analogue filters didn't necessarily do a lot to remove.
Later on they released the EPS which had 13-bit sampling. Why 13-bit? I don't know, I guess because the Emulator I and II used 8-bit samples but μ-law coding, giving effectively 13-bit equivalent resolution. It also used linear interpolation to smooth the "jumps" between samples, and even if you loaded in and converted a Mirage disk the "graininess" when you pitched things down was gone.
I'm currently writing some code to play back Mirage samples from disk images, and I've actually added a linear interpolator to it. Some things sound better with it, some things sound worse. I think I'll make it a front panel control, so you can turn it on and off as you want.
When I browse the demoscene I'm always a bit surprised there's not much Apple IIGS content. Graphically, it was stunted, but the ES5503 DOC was a pro synth engine right there next to the 6502 ... yowza.
Then I listened to the accurate version again, and thought "wait, never mind, this one sounds better."
After going back and forth a few times, I think I still agree the original/accurate one is better, but it's pretty close. I really encourage people to listen for themselves.
For what it's worth, I have little to no personal nostalgia for the Game Boy Advance.
I personally do prefer the interpolated versions in most cases because to me the extra high-frequency information just sounds like noise that makes it harder for my brain to process the underlying music. But clearly many feel differently!
It's like saying you can only watch the Simpsons with the exact late 1980s / early 1990s ads that they originally aired with, and everything else is sacrilege.
The "uninterpolated" one is incorrect.
The "interpolated" one is incorrect.
The uninterpolated one has sharp square edges, which isn't correct. The GBA has a 12dB/octave filter at around 12kHz (IIRC) on the output, which the uninterpolated simulated output doesn't appear to have. This would knock the corners off a bit and make it "smoother" and less hissy, but would still have quite crunchy low frequency sounds.
The interpolated one smooths things off excessively, and while it doesn't really have much less spectral energy high up, what's there is in the wrong place.
I’ll add some context here—why don’t more games run their audio at 32768 Hz, if that’s such a natural rate to run audio? The answer lies in how you fill the buffers. In any modern, sensible audio system, you can check how much space is available in the audio buffer and simply fill it. The GBA lacks a mechanism to query this. Instead, what you do is calculate this yourself, and figure out when to trigger additional audio DMA from the VBlank interrupt. You know the VBlank runs every 280896 cycles, and you know that the processor runs at 16777216 Hz, so you can do some math to calculate how much data is remaining in the audio DMA stream.
A lot of games simplify the math—it’s easier to start a new audio DMA in your VBlank handler, but that means running at a lower sample rate, which will sound pretty crispy.
YMMV, some people like the crispy aliased audio. If the audio weren’t crispy, the sound designers probably would have adjusted the samples to compensate. Other factors being equal, I’d rather listen to what the original artists heard when they were testing on real hardware, because that is probably closer to what they intended, even though it has a lot of artifacts in it.
I've written some code to play back 8-bit samples (and indeed to wavetable, FM, and VA synthesis) on 8-bit Arduinos using the PWM to output 8-bit audio. That runs at 31373Hz which is a pretty crazy sample rate.
Why?
Because the chip is clocked at 16MHz, and if you program the PWM for no prescaler and "phase correct" PWM where it counts up and back down, so you get a widening pulse in the middle of a "burst", then it counts 510 "steps" of the counter. It's an 8-bit counter so it counts from 0 to 255, then the next step counts back down to 254, and so to 0 again, when the next step takes it to 1.
And 16000000/510 is 31372.55 ;-)
Same as for the PS1, I always found the wobbly polygons and warping textures painful to watch.
It's basically doing an accidental and low-quality form of spectral band replication: https://en.wikipedia.org/wiki/Spectral_band_replication which is used in modern codecs.
Interpolation is a bit of a confusing topic, because the most efficient implementation is not the one that lends itself the easiest to frequency analysis. But pretty much any rate change (be it up or down) using interpolation can be expressed equivalently using the following set of operations and appropriately chosen M and N:
1. Increase the rate by inserting M zeros between each sample. The has the effect of creating the “images” as discussed.
2. Apply a filter to the resulting signal. For instance, for nearest neighbor this is [1 1 1 … 0 0 0 0 0 …], with (M+1) ones and then just zeroes; effectively, every output sample is the sum of the previous M+1 input samples. This removes some of the original signal and then much more of the images.
3. Decrease the rate by taking every Nth sample and discarding the rest. This creates aliasing (higher frequencies wrap down to lower, possibly multiple times) as discussed.
The big difference between interpolation methods is the filter in #2. E.g., linear interpolation is effectively the same as a triangular filter, and will filter somewhat more of the images but also more of the original signal (IIRC). More fancy interpolation methods have more complicated shapes (windowed sinc, etc.).This also shows why it's useful to have some headroom in your signal to begin with, e.g. a CD-quality signal could represent up to 22.05 kHz but only has (by spec) actual signal up to 20 kHz, so that it's easier to design a filter that keeps the signal but removes the images.
"GBA Mus Ripper" detects the so-called "Sappy" music driver and extracts and converts the songs to MIDI files, and generates a SF2 soundbank file. Available at https://www.romhacking.net/utilities/881/
"SoundFont MIDI Player" plays back MIDI files. You can configure it to automatically load a SF2 soundbank file in the directory. When you load a converted GBA MIDI file, you get the high music quality of a modern feature-packed MIDI playback engine. Available at https://falcosoft.hu/softwares.html#midiplayer
It's not perfect though, as GBA games do not use true standard MIDIs. Some MIDI controller commands (like modulator wheel) don't translate correctly.
To me, the original has very obvious background noise which the enhanced version removes. But as the author has said, the enhanced version sounds "muffled" (and, IMHO, not just a little), which probably makes most people (including me) feel it sounds worse.
Also, shouldn't most of music be included in the game's official OST? I assume that version would not be limited by the game media's technical limitation at the time and should represent the artistically intended version best.
Edit: apparently in this very case, "Metroid: Zero Mission" doesn't seem to have any official OST release. Unfortunate.
I absolutely wouldn't. To my ears the second version sounds much worse. Personal opinion etc etc, but wow, it's very very clear to my ears.
My GameBoy emulator generates one "audio sample" per clock tick (which is ~1 mhz, so massive 'oversampling'), decimates that signal down to like 100 ksample/sec, then uses a low-pass biquad filter or two to go down to 16 bit / 48 khz and remove beyond-Nyquist frequencies. Doesn't have any of the "muffling" properties this guy is seeing, aside from those literally caused by the low-pass.
Besides, I personally prefer to play my vgm at the original sample rate, and my soundcard adjusts to the correct rate for each song through fb2k plugins.
Audio was the thing I could never figure out on my Gameboy emulator. I couldn’t get it to pass basic tests, even without bothering to output sound on the computer.
Having said that, there is definitely many use cases where GBA games would want to reduce that artifacting. Keep it up!
Then it would be less accurate to the actual console, and thus a worse emulator.
To make it sound subjectively worse, for every sample in that page. Others noticed as much.
It sounds better... on paper. In reality, it doesn't, simply because it isn't how it is supposed to sound.