Audio (somewhat) implemented
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Audio (somewhat) implemented
The output audio needs to be resampled (I currently just use 44.1KHz for everything, so the sound is garbled), but CEN64 now has audio.
Re: Audio (somewhat) implemented
[img]data://image/gif;base64,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[/img]
Re: Audio (somewhat) implemented
great stuff!!! Is there a command so that I can lock the VI's to 60?
I would like to test some audio..
I would like to test some audio..

- Nintendo Maniac 64
- Posts: 185
- Joined: Fri Oct 04, 2013 11:37 pm
Re: Audio (somewhat) implemented
I admittedly don't know how Linux does it, but on Windows it'd probably be better to just resample to whatever the "Default Format" sample rate is set to.MarathonMan wrote:The output audio needs to be resampled
...which technically could be done by just outputting the native 32006Hz and letting the OS do it (Windows or Linux), but depending on how OCD you are, you may not trust the OS to handle such funky sampling rates with good quality...
Last edited by Nintendo Maniac 64 on Sun May 24, 2015 1:13 am, edited 2 times in total.
CEN64 Forum's resident straight-male kuutsundere
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
You mean it's going past 60 VI/s? Try VSync. There's no command to rate-limit, no.theboy181 wrote:great stuff!!! Is there a command so that I can lock the VI's to 60?
If it's going under, there's nothing you can do currently without playing with the code.
I'm trying to stay away from OS-dependent things. CEN64 will use a software resampler. One of the luxuries of cycle-accurate simulation is that everything is incredibly fine-grained, so a simple lerp will probably do just fine.Nintendo Maniac 64 wrote:I admittedly don't know how Linux does it, but on WindowsMarathonMan wrote:The output audio needs to be resampled
- Nintendo Maniac 64
- Posts: 185
- Joined: Fri Oct 04, 2013 11:37 pm
Re: Audio (somewhat) implemented
Well if you need a recommendation, I highly recommend the "SoX" resampling algorithm:MarathonMan wrote:CEN64 will use a software resampler.
http://sox.sourceforge.net/SoX/Resampling
It's particularly known for being both very high quality yet very fast, both of which would be important since we're dealing with funky sampling rates and heavy CPU utilization.
EDIT: And since we are doing resampling, is it safe to assume that, after resampling to whatever sample rate (whether 44.1KHz, 48KHz, or something else), will Cen64 be outputting a 24bit PCM stream? (rand technically 32 floating point still has 24bits of precision)
CEN64 Forum's resident straight-male kuutsundere
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
Re: Audio (somewhat) implemented
:O I'm going to try it NOW!
EDIT: I had to install libopenal-dev in order to compile. But... Awesome!
EDIT: I had to install libopenal-dev in order to compile. But... Awesome!
Testing CEN64 on: Intel Core i5 520M 2.4 GHz. SSE2 SSE3 SSE4.1 SSE4.2 SSSE3, but no AVX. Ubuntu Linux
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
I don't want to use another library (especially a old one, that looks no longer maintained after it's appearance!) - they make the build process a much bigger hassle for people that want to just start hacking on CEN64. The resampler really shouldn't be that hard; I'm not sure why everyone talks about it like theirs is the one and only resampler that works or something.Nintendo Maniac 64 wrote:EDIT: And since we are doing resampling, is it safe to assume that, after resampling to whatever sample rate (whether 44.1KHz, 48KHz, or something else), will Cen64 be outputting a 24bit PCM stream? (rand technically 32 floating point still has 24bits of precision)
Anyways, yeah - I have an X-Fi with 24bit sound and a 96KHz sampling rate... you better believe that I'll sample up to the best possible thing provided by your sound card. I need to get a little more comfortable with OpenAL first, though; this is the first time I've used it.
- Snowstorm64
- Posts: 303
- Joined: Sun Oct 20, 2013 8:22 pm
Re: Audio (somewhat) implemented
Awesome! Next step, EEPROM/SRAM/FlashRAM/ControllerPak support? 

OS: Debian GNU/Linux Jessie (8.0)
CPU: Intel i7 4770K @ 3.5 GHz
Build: AVX (compiled from git)
CPU: Intel i7 4770K @ 3.5 GHz
Build: AVX (compiled from git)
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
Yeah, SRAM especially.Snowstorm64 wrote:Awesome! Next step, EEPROM/SRAM/FlashRAM/ControllerPak support?
- Nintendo Maniac 64
- Posts: 185
- Joined: Fri Oct 04, 2013 11:37 pm
Re: Audio (somewhat) implemented
I hope Linux actually works that way, because on Windows you have to use something like WASAPI (used by Audacity for example) in order to override what the "Default Format" in the control panel is set to (which a lot of times is 16bit 44100Hz, not even 24bit!), though idiotically enough Asus and Creative soundcards even override WASAPI (though ASIO works correctly on Asus, but that isn't open source).MarathonMan wrote:Anyways, yeah - I have an X-Fi with 24bit sound and a 96KHz sampling rate... you better believe that I'll sample up to the best possible thing provided by your sound card. I need to get a little more comfortable with OpenAL first, though; this is the first time I've used it.
Oh, and Windows 7 has a resampling bug that most people don't even know about (using 96000Hz seems to work around the issue however, and WASAPI also avoids it):
https://www2.iis.fraunhofer.de/AAC/ie9.html
CEN64 Forum's resident straight-male kuutsundere
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
Re: Audio (somewhat) implemented
Doesn't the N64 already output at consistent sample rates? I remember when I was trying to implement this stuff, LoZ was outputting at (around) 32KHz.. Oversampling and/or larger sample sizes won't get you anything if the system is already limiting this before it's given to you. As you already stated, simple Lerp will be fine, along with 44.1KHz sample rate (depending on the game's settings). The only case you have to worry about is if games go over the Nyquist frequency (sample rate / 2), then you'll get aliasing, but that condition hasn't been shown to exist to my knowledge.MarathonMan wrote:Anyways, yeah - I have an X-Fi with 24bit sound and a 96KHz sampling rate... you better believe that I'll sample up to the best possible thing provided by your sound card. I need to get a little more comfortable with OpenAL first, though; this is the first time I've used it.
- Nintendo Maniac 64
- Posts: 185
- Joined: Fri Oct 04, 2013 11:37 pm
Re: Audio (somewhat) implemented
That's the thing, it's actually outputting at 32006Hz - the N64 does not output at exact standardized sampling rates like 32000Hz and/or 22050Hz but instead outputs at 32006Hz and 22047Hz.beannaich wrote:LoZ was outputting at (around) 32KHz
Some other games like Mario Kart 64 output at a sampling rate that's something like 24.6KHz if I remember correctly. UPDATE: Just checked, Mario Kart 64 uses 26807Hz apparently.
CEN64 Forum's resident straight-male kuutsundere
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
(just "tsundere" makes people think of "Shana clones" *shivers*)
CPU+iGPU: Pentium G3258 @ 4.6GHz/1.281v
dGPU: Radeon HD5870 1GB
RAM: Vengeance 1600 4x4GB
OS: Windows 7
Re: Audio (somewhat) implemented
Writing a resampler is easy. Writing a resampler that will remain accurate for a long playback time when using arbitrary (even fractional) input and output sample rates is hard. In fact, when you hit fractional, you can basically say "game over" and round for posterity.
Re: Audio (somewhat) implemented
You're welcome to pick and choose a resampler from my resampler.[ch], which I give away under an MIT license. It includes fast nearest neighbor (yuck), band limited steps (antialiased nearest neighbor, nice for chip music, not so nice for N64 audio), linear, band limited auto linear, and the two you'd be likely to be interested in, cubic and sinc. It's not the fastest or the best at sinc, but it's still fairly simple.
It's implemented as a push-pull interface with tiny buffers. You push in samples one at a time, as many as it will accept, then you pull out samples one at a time, as many as it supplies at a time.
It also supports near real time sample rate changes, as they are delayed by the buffers.
You can find a copy in my lazyusf2 repository, as well as the modplay and DUMB repositories.
It's implemented as a push-pull interface with tiny buffers. You push in samples one at a time, as many as it will accept, then you pull out samples one at a time, as many as it supplies at a time.
It also supports near real time sample rate changes, as they are delayed by the buffers.
You can find a copy in my lazyusf2 repository, as well as the modplay and DUMB repositories.
Re: Audio (somewhat) implemented
Thanks for everything, MarathonMan, it sounds too good to be true, I cannot wait to try it (this will be my first time at using Cen64 too) 
I am running into a few issues trying to run Cen64 on Windows 8.1 (I know, I know...
), 'though.
When executing the compiled binary, it first complained about openAL, so I simply installed OpenAL using that binary file http://www.openal.org/creative-installers/oalinst.zip
The problem is that now nothing happens at all when I start cen64-win64-avx-latest.exe (I was expecting either some error message due to missing arguments, or a command line usage reminder).
I have checked the archive for a readme but it does not contain one, and the readme at Github seems to be about other matters.
Am I doing it wrong ? I have tried all Windows builds, the behavior is the same (rig: i5-4690k/R9 270).

I am running into a few issues trying to run Cen64 on Windows 8.1 (I know, I know...

When executing the compiled binary, it first complained about openAL, so I simply installed OpenAL using that binary file http://www.openal.org/creative-installers/oalinst.zip
The problem is that now nothing happens at all when I start cen64-win64-avx-latest.exe (I was expecting either some error message due to missing arguments, or a command line usage reminder).
I have checked the archive for a readme but it does not contain one, and the readme at Github seems to be about other matters.
Am I doing it wrong ? I have tried all Windows builds, the behavior is the same (rig: i5-4690k/R9 270).
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
Definitely. Would you be willing to re-license under 3-clause BSD for the sake of keeping the project all one license?kode54 wrote:You're welcome to pick and choose a resampler from my resampler.[ch], which I give away under an MIT license. It includes fast nearest neighbor (yuck), band limited steps (antialiased nearest neighbor, nice for chip music, not so nice for N64 audio), linear, band limited auto linear, and the two you'd be likely to be interested in, cubic and sinc. It's not the fastest or the best at sinc, but it's still fairly simple.

Probably not... just lack of documentation on my part.Kaede wrote:Am I doing it wrong ? I have tried all Windows builds, the behavior is the same (rig: i5-4690k/R9 270).

Re: Audio (somewhat) implemented
Thanks
I eventually did not need the .dll inside the cen64 folder - installing openAL probably added it to some folder included in Path instead).
CEN64-qt works great so I guess I will simply go with that instead - at least until I take a little time to look at what parameters are mentionned in the source.
Last question (probably ^^), may I ask how I should enable vsync ? I have quickly checked options.c / options.h but there seems to be no mention of a vsync parameter. I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.

I eventually did not need the .dll inside the cen64 folder - installing openAL probably added it to some folder included in Path instead).
CEN64-qt works great so I guess I will simply go with that instead - at least until I take a little time to look at what parameters are mentionned in the source.
Last question (probably ^^), may I ask how I should enable vsync ? I have quickly checked options.c / options.h but there seems to be no mention of a vsync parameter. I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
If that doesn't work, I probably won't have much success toggling it from within CEN64 either.Kaede wrote:I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.
I only have Intel and NVIDIA systems, but I'll try to keep in mind that some software-enforced simulation speed cap is necessary in some cases.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
BTW, krom mentioned that a lot of ROMs use a constant audio frequency.
If you change all instances of "44100" in ai/context.c and ai/controller.c to "31985", you'll notice that Super Mario 64 and Ocarina of Time sound really ****ing good!
26792 for Mario Kart 64.
If you change all instances of "44100" in ai/context.c and ai/controller.c to "31985", you'll notice that Super Mario 64 and Ocarina of Time sound really ****ing good!
26792 for Mario Kart 64.
Re: Audio (somewhat) implemented
I am not too sure, but it may have to do with my running Cen64 in windowed mode.MarathonMan wrote:If that doesn't work, I probably won't have much success toggling it from within CEN64 either.Kaede wrote:I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.
- iwasaperson
- Posts: 49
- Joined: Tue Apr 22, 2014 12:50 am
Re: Audio (somewhat) implemented
I can't seem to compile CEN64 ever since you merged the X11 stuff. No idea why. Am I missing any dependencies?
Log: http://pastebin.com/eyHAAVKs
Log: http://pastebin.com/eyHAAVKs
- Snowstorm64
- Posts: 303
- Joined: Sun Oct 20, 2013 8:22 pm
Re: Audio (somewhat) implemented
Just add -lX11 to the flags. (EDIT: of course you need the -dev dependecies)iwasaperson wrote:I can't seem to compile CEN64 ever since you merged the X11 stuff. No idea why. Am I missing any dependencies?
Log: http://pastebin.com/eyHAAVKs
OS: Debian GNU/Linux Jessie (8.0)
CPU: Intel i7 4770K @ 3.5 GHz
Build: AVX (compiled from git)
CPU: Intel i7 4770K @ 3.5 GHz
Build: AVX (compiled from git)
- iwasaperson
- Posts: 49
- Joined: Tue Apr 22, 2014 12:50 am
Re: Audio (somewhat) implemented
I'm using Arch, so I don't have -dev packages.Snowstorm64 wrote:Just add -lX11 to the flags. (EDIT: of course you need the -deviwasaperson wrote:I
can't seem to compile CEN64 ever since you merged the X11 stuff. No
idea why. Am I missing any dependencies?
Log: http://pastebin.com/eyHAAVKs
dependecies)
Adding it to links worked though. Thanks.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
I'd like to get a CMake fix applied to this (though that is the correct "fix"):iwasaperson wrote:I'm using Arch, so I don't have -dev packages.
Adding it to links worked though. Thanks.
In CMakeLists.txt, at the very bottom of the file, can you change this:
Code: Select all
target_link_libraries(cen64
${EXTRA_OS_LIBS}
${OPENAL_LIBRARY}
${OPENGL_gl_LIBRARY}
${X11_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
)
Code: Select all
target_link_libraries(cen64
${EXTRA_OS_LIBS}
${OPENAL_LIBRARY}
${OPENGL_gl_LIBRARY}
${X11_LIBRARIES}
${X11_X11_LIB}
${CMAKE_THREAD_LIBS_INIT}
)
- iwasaperson
- Posts: 49
- Joined: Tue Apr 22, 2014 12:50 am
Re: Audio (somewhat) implemented
That didn't work. Same error.MarathonMan wrote:I'd like to get a CMake fix applied to this (though that is the correct "fix"):iwasaperson wrote:I'm using Arch, so I don't have -dev packages.
Adding it to links worked though. Thanks.
In CMakeLists.txt, at the very bottom of the file, can you change this:"${X11_X11_LIB}" line under X11_LIBRARIES:Code: Select all
target_link_libraries(cen64 ${EXTRA_OS_LIBS} ${OPENAL_LIBRARY} ${OPENGL_gl_LIBRARY} ${X11_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} )
Code: Select all
target_link_libraries(cen64 ${EXTRA_OS_LIBS} ${OPENAL_LIBRARY} ${OPENGL_gl_LIBRARY} ${X11_LIBRARIES} ${X11_X11_LIB} ${CMAKE_THREAD_LIBS_INIT} )
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
Can you `rm -f cen64 && make VERBOSE=1` and pastebin?iwasaperson wrote:That didn't work. Same error.
- iwasaperson
- Posts: 49
- Joined: Tue Apr 22, 2014 12:50 am
Re: Audio (somewhat) implemented
Doesn't fail until linking, so I only copied everything below the linking stage.MarathonMan wrote: Can you `rm -f cen64 && make VERBOSE=1` and pastebin?
http://pastebin.com/1FXTAFb4
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
OK, that's really interesting... looking at the link line:
Arch simply fails to add -lX11 to the link line. Why? I'm not quite sure!
I might have to setup Arch in a VM and take a peek at that.
Code: Select all
/usr/bin/cmake -E cmake_link_script CMakeFiles/cen64.dir/link.txt --verbose=1
/usr/bin/cc -Wall -Wextra -Wno-unused-parameter -std=c99 -mavx -ffixed-xmm8 -ffixed-xmm9 -ffixed-xmm10 -ffixed-xmm11 -ffixed-xmm12 -ffixed-xmm13 -ffixed-xmm14 -ffixed-xmm15 -maccumulate-outgoing-args -ffat-lto-objects -D_POSIX_C_SOURCE=200112L -D_BSD_SOURCE -O3 -ffast-math -DNDEBUG -fmerge-all-constants -flto -fdata-sections -ffunction-sections -funsafe-loop-optimizations -s -Wl,--gc-sections CMakeFiles/cen64.dir/ai/context.c.o CMakeFiles/cen64.dir/ai/controller.c.o CMakeFiles/cen64.dir/arch/x86_64/gcc/context.s.o CMakeFiles/cen64.dir/arch/x86_64/tlb/tlb.c.o CMakeFiles/cen64.dir/arch/x86_64/rsp/vrcpsq.c.o CMakeFiles/cen64.dir/arch/x86_64/rsp/vmov.c.o CMakeFiles/cen64.dir/arch/x86_64/rsp/vdivh.c.o CMakeFiles/cen64.dir/arch/x86_64/rsp/rsp.c.o CMakeFiles/cen64.dir/bus/controller.c.o CMakeFiles/cen64.dir/bus/memorymap.c.o CMakeFiles/cen64.dir/common/debug.c.o CMakeFiles/cen64.dir/common/one_hot.c.o CMakeFiles/cen64.dir/common/reciprocal.c.o CMakeFiles/cen64.dir/dd/controller.c.o CMakeFiles/cen64.dir/cen64.c.o CMakeFiles/cen64.dir/device/device.c.o CMakeFiles/cen64.dir/device/netapi.c.o CMakeFiles/cen64.dir/device/options.c.o CMakeFiles/cen64.dir/os/common/gl_hints.c.o CMakeFiles/cen64.dir/os/common/input.c.o CMakeFiles/cen64.dir/os/posix/alloc.c.o CMakeFiles/cen64.dir/os/posix/main.c.o CMakeFiles/cen64.dir/os/posix/rom_file.c.o CMakeFiles/cen64.dir/os/posix/timer.c.o CMakeFiles/cen64.dir/os/x11/gl_config.c.o CMakeFiles/cen64.dir/os/x11/gl_window.c.o CMakeFiles/cen64.dir/pi/controller.c.o CMakeFiles/cen64.dir/rdp/cpu.c.o CMakeFiles/cen64.dir/rdp/interface.c.o CMakeFiles/cen64.dir/rdp/n64video.c.o CMakeFiles/cen64.dir/ri/controller.c.o CMakeFiles/cen64.dir/rsp/cp0.c.o CMakeFiles/cen64.dir/rsp/cp2.c.o CMakeFiles/cen64.dir/rsp/cpu.c.o CMakeFiles/cen64.dir/rsp/decoder.c.o CMakeFiles/cen64.dir/rsp/functions.c.o CMakeFiles/cen64.dir/rsp/interface.c.o CMakeFiles/cen64.dir/rsp/opcodes.c.o CMakeFiles/cen64.dir/rsp/pipeline.c.o CMakeFiles/cen64.dir/rsp/vfunctions.c.o CMakeFiles/cen64.dir/si/cic.c.o CMakeFiles/cen64.dir/si/controller.c.o CMakeFiles/cen64.dir/vi/controller.c.o CMakeFiles/cen64.dir/vi/render.c.o CMakeFiles/cen64.dir/vi/window.c.o CMakeFiles/cen64.dir/vr4300/cp0.c.o CMakeFiles/cen64.dir/vr4300/cp1.c.o CMakeFiles/cen64.dir/vr4300/cpu.c.o CMakeFiles/cen64.dir/vr4300/dcache.c.o CMakeFiles/cen64.dir/vr4300/decoder.c.o CMakeFiles/cen64.dir/vr4300/fault.c.o CMakeFiles/cen64.dir/vr4300/functions.c.o CMakeFiles/cen64.dir/vr4300/icache.c.o CMakeFiles/cen64.dir/vr4300/interface.c.o CMakeFiles/cen64.dir/vr4300/opcodes.c.o CMakeFiles/cen64.dir/vr4300/pipeline.c.o CMakeFiles/cen64.dir/vr4300/segment.c.o -o cen64 -lopenal -lGL -lpthread
I might have to setup Arch in a VM and take a peek at that.
Re: Audio (somewhat) implemented
Builds on Arch if I add "find_package(X11 REQUIRED)"
It will also link against libSM, libICE, and libXext unless I change ${X11_LIBRARIES} to ${X11_X11_LIB}.
It will also link against libSM, libICE, and libXext unless I change ${X11_LIBRARIES} to ${X11_X11_LIB}.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
Oh geeze, I don't know how that wasn't already in there! Thanks for the fix and X11_LIBRARIES vs. X11_X11_LIB difference.Presence wrote:Builds on Arch if I add "find_package(X11 REQUIRED)"
It will also link against libSM, libICE, and libXext unless I change ${X11_LIBRARIES} to ${X11_X11_LIB}.
Re: Audio (somewhat) implemented
I still find it really odd that you picked OpenAL. Why not SDL, if you're going to be resampling soon anyway?
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
I've never been a fan of external libraries, mostly because they feel to bloated, make the build process more complicated for me, and a couple other nagging issues.wareya wrote:I still find it really odd that you picked OpenAL. Why not SDL, if you're going to be resampling soon anyway?
Also: I'm a minimalist at heart, which is one of the reasons CEN64 is a C and assembly-only project.
I'll also mention that, now that the UI is restructured well enough, it should be possible to write a 'backend' for almost any OS-level or library interface of your choosing.
Re: Audio (somewhat) implemented
>I've never been a fan of external libraries, mostly because they feel to bloated, make the build process more complicated for me, and a couple other nagging issues.
Doesn't this apply that much more to OpenAL than SDL now that SDL2 is permissively licensed? Not to mention, using OpenAL on windows is an absolute nightmare if you don't have a standard setup...
Doesn't this apply that much more to OpenAL than SDL now that SDL2 is permissively licensed? Not to mention, using OpenAL on windows is an absolute nightmare if you don't have a standard setup...
Re: Audio (somewhat) implemented
If you're curious what the difference is with an Arch system, looks like it's a newer version of CMake. I have 3.2.2 on my system:MarathonMan wrote:Oh geeze, I don't know how that wasn't already in there! Thanks for the fix and X11_LIBRARIES vs. X11_X11_LIB difference.
http://www.cmake.org/cmake/help/v3.2/release/3.2.html
The FindOpenGL module no longer explicitly searches for any dependency on X11 libraries with the FindX11 module. Such dependencies should not need to be explicit. Applications using X11 APIs themselves should find and link to X11 libraries explicitly.
Re: Audio (somewhat) implemented
Anyone managed to compile on Windows yet? Even after installing the OpenAL 1.1 SDK and manually adding the registry key CMake uses to determine the installation directory (no clue why the installer didn't add it), it still can't find it.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
I did.Sintendo wrote:Anyone managed to compile on Windows yet? Even after installing the OpenAL 1.1 SDK and manually adding the registry key CMake uses to determine the installation directory (no clue why the installer didn't add it), it still can't find it.
I ended up having to manually point CMake to the library and include path. (When generating a clean CEN64 build with the CMake GUI, the initial 'configure' step should fail and it should present you with the option to specify an include path and library location).
Re: Audio (somewhat) implemented
Alright, at least I've been able to generate a Visual Studio solution. Still having some problems, and I'm thinking some of them might need some changes to CMakeLists.txt.
1) mingw32.lib is included as an additional dependency, which it can't find (and probably doesn't need) for MSVC.
2) __WIN32__ is used in netapi.c, while options.c uses _WIN32. The former was not defined for me, causing it to look for some UNIX headers and failing.
3) It doesn't seem to be building the assembly (getting some unresolved external symbol errors for fpu_cmp_eq_32 and many others).
1) mingw32.lib is included as an additional dependency, which it can't find (and probably doesn't need) for MSVC.
2) __WIN32__ is used in netapi.c, while options.c uses _WIN32. The former was not defined for me, causing it to look for some UNIX headers and failing.
3) It doesn't seem to be building the assembly (getting some unresolved external symbol errors for fpu_cmp_eq_32 and many others).
Last edited by Sintendo on Sun May 31, 2015 11:03 am, edited 1 time in total.
- MarathonMan
- Site Admin
- Posts: 692
- Joined: Fri Oct 04, 2013 4:49 pm
Re: Audio (somewhat) implemented
MSVC builds might be buggered; haven't tried them in awhile. Thanks for the heads up...Sintendo wrote:Alright, at least I've been able to generate a Visual Studio solution. Still having some problems, and I'm thinking some of them might need some changes to CMakeLists.txt.
1) mingw32.lib is included as an additional dependency, which it can't find (and probably don't need) for MSVC.
2) __WIN32__ is used in netapi.c, while options.c uses _WIN32. The former was not defined for me, causing it to look for some UNIX headers and failing.
3) It doesn't seem to be building the assembly (getting some unresolved external symbol errors for fpu_cmp_eq_32 and many others).
Re: Audio (somewhat) implemented
I would love to register the domain http://www.missedyourpoint.com/ in honor of you.Nintendo Maniac 64 wrote:That's the thing, it's actually outputting at 32006Hz - the N64 does not output at exact standardized sampling rates like 32000Hz and/or 22050Hz but instead outputs at 32006Hz and 22047Hz.beannaich wrote:LoZ was outputting at (around) 32KHz
Some other games like Mario Kart 64 output at a sampling rate that's something like 24.6KHz if I remember correctly. UPDATE: Just checked, Mario Kart 64 uses 26807Hz apparently.
The audio for those games is output (sampled) at ~32KHz for some games, and other rates for other games. This means that the frequencies they can accurately represent without aliasing is between 0Hz and 16Khz:
Code: Select all
0KHz ≤ sample rate ≤ 32KHz
So the difference between 96KHz, and 44.1KHz output is 0. The instruments, tones, and melodies are already processed and mixed by the time they get to the output DAC. What would make a difference in the audio is if you refined the signal more using DSP. Simply sampling 3x more than you need to will get you nowhere. In fact, the only thing that would do is take even more CPU cycles away from the already starved CEN64.
Re: Audio (somewhat) implemented
>This means, that as long as CEN64 samples that signal at LEAST 32,000 times per second, there will be little to no aliasing in the output.
I was going to rant about this and then I realized that you just used what was accidentally misleading language. For the sake of others, it's not "samples the signal at LEAST 32,000 times per second", but "outputs a sample with at LEAST a 32khz samplerate".
But yes, the samplerate doesn't matter as long as it's high enough. This isn't images/video, where doubling the sampling rate for no apparent reason suddenly means that you can tell anti-aliasing apart from an actual blur on the image.
I will however say that without a perfect resampling function you're going to lose amplitude resolution or amplitude modulation resolution on extremely high frequencies, but the games won't be able to play back audio this close to nyquist anyway and literally every single realtime audio application in the world has this problem.
I was going to rant about this and then I realized that you just used what was accidentally misleading language. For the sake of others, it's not "samples the signal at LEAST 32,000 times per second", but "outputs a sample with at LEAST a 32khz samplerate".
But yes, the samplerate doesn't matter as long as it's high enough. This isn't images/video, where doubling the sampling rate for no apparent reason suddenly means that you can tell anti-aliasing apart from an actual blur on the image.
I will however say that without a perfect resampling function you're going to lose amplitude resolution or amplitude modulation resolution on extremely high frequencies, but the games won't be able to play back audio this close to nyquist anyway and literally every single realtime audio application in the world has this problem.
- nothingtosay
- Posts: 1
- Joined: Mon Oct 07, 2013 12:25 am
Re: Audio (somewhat) implemented
Hey everybody! I registered here shortly after the site went up but never felt I had anything to contribute until now. I came here with hopes of finding further info on the subject of the resampling in the N64's audio output, but it seems, with all due respect, that everyone in this thread missed something. The specific implementation of resampling used in the emulator is actually crucial to getting audio to sound accurate to the hardware. Have a look at this image:

This is the spectogram of the audio of GoldenEye's intro movie (plus the demo of the Silo level starting at about 1:15) recorded at 192 kHz from a US Nintendo 64 directly into my recording device. It starts on the far left before the music begins at that first spike so you can see the console's inherent noise -- the fuzziness and purple in the lower part of the spectrum -- as well as that of my recording device -- the upper fuzziness -- to help differentiate what is music and what is not. The game uses a sampling rate of only 22,047 Hz for mixing, but as you can see here, harmonics extend up to around 60 kHz at least! This image is of the recording with no noise reduction applied, but using the high quality "noiseprint" method of noise reduction, set to a conservative level to subtract only my device's noise and get rid of that high frequency fuzziness while hopefully not touching any of the console's sound at all, the highest frequency sound I can see very faintly produced by the console is about 64 kHz, in a fitting coincidence for this particular console.
This is because of resampling done after mixing. I assume this is not performed in software and that the digital-to-analog converter functions like almost all others in the world and uses oversampling before analog output. While a theoretically superior DAC should use sinc interpolation to stop aliasing, the N64 clearly does not do this and, as best as I can tell through testing by resampling USF files with kode54's MultiResampler component for foobar2000, comparing aurally the actual sound and visually with spectograms, it uses cubic interpolation instead. I've tested this with GoldenEye, Mischief Makers (which also uses a 22 kHz sampling rate), and Star Fox 64 (which is 32 kHz), and kode54 has provided me with recordings of Ocarina of Time (32 kHz) and Donkey Kong 64 (22 kHz). All signs point to cubic interpolation with all games. This was very likely a conscious choice on Nintendo's part as an audio enhancement for cases just such as this where the sampling rate of the audio has to be sacrificed to free up some of the processor's budget (not to mention that, from what I understand, DACs that use cubic interpolation are cheaper to make than sinc). The aliasing that's allowed through, while theoretically bad, is a sort of dirty way of synthesizing treble to make the audio sound better and is actually desirable (testing has also led me to believe the 3DS does this, using cubic as well). When the sampling rate is high enough, like 32 kHz, the generated frequencies are pretty much inaudible anyway.
You can easily tell the difference with GoldenEye, and if anyone wants me to post samples for comparison of the music at its native rate versus the actual hardware output, I can do that. I can also give a sample of the emulated audio resampled with cubic interpolation, which produces a very highly similar sound. Indeed, I was going to play through and record all the music in GoldenEye but decided, after listening back-to-back with instantaneous switching and synchronization aligned to the sample, that the hardware and the USFs resampled with cubic interpolation sounded so similar as to make the recording redundant. Note, this is with the MultiResampler component, not the resampling built into the foobar USF player component, which uses a different cubic interpolation scheme and sounds less similar.
It is my opinion, based on my hardware and listening tests, that linear and sinc interpolation should not be used in CEN64's software resampling for the purpose of accuracy. Cubic should be used instead, and kode54's MultiResampler, which he referred to when he posted earlier in this thread, has a cubic interpolation method that is not exact but very similar in sound to the one used by the real Nintendo 64. I don't know if there is any official documentation or if hardware tests could be written or analysis of the DAC itself somehow performed that would reveal the exact method used to enable perfect emulation accuracy. And if you want to take accuracy to absurd levels, the sampling rate should be configurable to at least 128 kHz in case anyone wants to emulate the potential intermodulation distortion all the ultrasonic frequencies may create in their sound system's playback.
If anyone wants to investigate further I can try to help in any way I can.

This is the spectogram of the audio of GoldenEye's intro movie (plus the demo of the Silo level starting at about 1:15) recorded at 192 kHz from a US Nintendo 64 directly into my recording device. It starts on the far left before the music begins at that first spike so you can see the console's inherent noise -- the fuzziness and purple in the lower part of the spectrum -- as well as that of my recording device -- the upper fuzziness -- to help differentiate what is music and what is not. The game uses a sampling rate of only 22,047 Hz for mixing, but as you can see here, harmonics extend up to around 60 kHz at least! This image is of the recording with no noise reduction applied, but using the high quality "noiseprint" method of noise reduction, set to a conservative level to subtract only my device's noise and get rid of that high frequency fuzziness while hopefully not touching any of the console's sound at all, the highest frequency sound I can see very faintly produced by the console is about 64 kHz, in a fitting coincidence for this particular console.

This is because of resampling done after mixing. I assume this is not performed in software and that the digital-to-analog converter functions like almost all others in the world and uses oversampling before analog output. While a theoretically superior DAC should use sinc interpolation to stop aliasing, the N64 clearly does not do this and, as best as I can tell through testing by resampling USF files with kode54's MultiResampler component for foobar2000, comparing aurally the actual sound and visually with spectograms, it uses cubic interpolation instead. I've tested this with GoldenEye, Mischief Makers (which also uses a 22 kHz sampling rate), and Star Fox 64 (which is 32 kHz), and kode54 has provided me with recordings of Ocarina of Time (32 kHz) and Donkey Kong 64 (22 kHz). All signs point to cubic interpolation with all games. This was very likely a conscious choice on Nintendo's part as an audio enhancement for cases just such as this where the sampling rate of the audio has to be sacrificed to free up some of the processor's budget (not to mention that, from what I understand, DACs that use cubic interpolation are cheaper to make than sinc). The aliasing that's allowed through, while theoretically bad, is a sort of dirty way of synthesizing treble to make the audio sound better and is actually desirable (testing has also led me to believe the 3DS does this, using cubic as well). When the sampling rate is high enough, like 32 kHz, the generated frequencies are pretty much inaudible anyway.
You can easily tell the difference with GoldenEye, and if anyone wants me to post samples for comparison of the music at its native rate versus the actual hardware output, I can do that. I can also give a sample of the emulated audio resampled with cubic interpolation, which produces a very highly similar sound. Indeed, I was going to play through and record all the music in GoldenEye but decided, after listening back-to-back with instantaneous switching and synchronization aligned to the sample, that the hardware and the USFs resampled with cubic interpolation sounded so similar as to make the recording redundant. Note, this is with the MultiResampler component, not the resampling built into the foobar USF player component, which uses a different cubic interpolation scheme and sounds less similar.
It is my opinion, based on my hardware and listening tests, that linear and sinc interpolation should not be used in CEN64's software resampling for the purpose of accuracy. Cubic should be used instead, and kode54's MultiResampler, which he referred to when he posted earlier in this thread, has a cubic interpolation method that is not exact but very similar in sound to the one used by the real Nintendo 64. I don't know if there is any official documentation or if hardware tests could be written or analysis of the DAC itself somehow performed that would reveal the exact method used to enable perfect emulation accuracy. And if you want to take accuracy to absurd levels, the sampling rate should be configurable to at least 128 kHz in case anyone wants to emulate the potential intermodulation distortion all the ultrasonic frequencies may create in their sound system's playback.

If anyone wants to investigate further I can try to help in any way I can.
- The Extremist
- Posts: 29
- Joined: Sun Nov 03, 2013 6:11 pm
- Location: Canadian Prairie
Re: Audio (somewhat) implemented
Now THAT is some hardcore detective work!
Re: Audio (somewhat) implemented
Cool.
While we're on this topic, how similar is Cubic to Hermite in terms of distortion/reconstruction?
While we're on this topic, how similar is Cubic to Hermite in terms of distortion/reconstruction?
Who is online
Users browsing this forum: No registered users and 1 guest