Audio (somewhat) implemented

News from administrators.
Post Reply
User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Audio (somewhat) implemented

Post by MarathonMan » Sat May 23, 2015 11:12 pm

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.

User avatar
e2118289
Posts: 13
Joined: Tue Dec 31, 2013 12:24 am

Re: Audio (somewhat) implemented

Post by e2118289 » Sun May 24, 2015 12:16 am

[img]data://image/gif;base64,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[/img]

User avatar
theboy181
Posts: 1
Joined: Fri Nov 21, 2014 10:07 pm

Re: Audio (somewhat) implemented

Post by theboy181 » Sun May 24, 2015 12:45 am

great stuff!!! Is there a command so that I can lock the VI's to 60?


I would like to test some audio.. :)

User avatar
Nintendo Maniac 64
Posts: 185
Joined: Fri Oct 04, 2013 11:37 pm

Re: Audio (somewhat) implemented

Post by Nintendo Maniac 64 » Sun May 24, 2015 1:10 am

MarathonMan wrote:The output audio needs to be resampled
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.

...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

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Sun May 24, 2015 1:13 am

theboy181 wrote:great stuff!!! Is there a command so that I can lock the VI's to 60?
You mean it's going past 60 VI/s? Try VSync. There's no command to rate-limit, no.

If it's going under, there's nothing you can do currently without playing with the code.
Nintendo Maniac 64 wrote:
MarathonMan wrote:The output audio needs to be resampled
I admittedly don't know how Linux does it, but on Windows
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.

User avatar
Nintendo Maniac 64
Posts: 185
Joined: Fri Oct 04, 2013 11:37 pm

Re: Audio (somewhat) implemented

Post by Nintendo Maniac 64 » Sun May 24, 2015 1:21 am

MarathonMan wrote:CEN64 will use a software resampler.
Well if you need a recommendation, I highly recommend the "SoX" resampling algorithm:
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

User avatar
Nacho
Posts: 66
Joined: Thu Nov 07, 2013 9:25 am

Re: Audio (somewhat) implemented

Post by Nacho » Sun May 24, 2015 7:14 am

:O I'm going to try it NOW!

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

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Sun May 24, 2015 10:42 am

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)
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.

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.

User avatar
Snowstorm64
Posts: 303
Joined: Sun Oct 20, 2013 8:22 pm

Re: Audio (somewhat) implemented

Post by Snowstorm64 » Sun May 24, 2015 12:38 pm

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)

User avatar
Net_Bastard
Posts: 17
Joined: Sun Nov 03, 2013 4:33 am

Re: Audio (somewhat) implemented

Post by Net_Bastard » Sun May 24, 2015 12:45 pm

Nice!

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Sun May 24, 2015 12:52 pm

Snowstorm64 wrote:Awesome! Next step, EEPROM/SRAM/FlashRAM/ControllerPak support? :)
Yeah, SRAM especially.

User avatar
Nintendo Maniac 64
Posts: 185
Joined: Fri Oct 04, 2013 11:37 pm

Re: Audio (somewhat) implemented

Post by Nintendo Maniac 64 » Sun May 24, 2015 1:05 pm

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.
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).

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

beannaich
Posts: 149
Joined: Mon Oct 21, 2013 2:43 pm

Re: Audio (somewhat) implemented

Post by beannaich » Sun May 24, 2015 7:39 pm

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.
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.

User avatar
Nintendo Maniac 64
Posts: 185
Joined: Fri Oct 04, 2013 11:37 pm

Re: Audio (somewhat) implemented

Post by Nintendo Maniac 64 » Sun May 24, 2015 7:50 pm

beannaich wrote:LoZ was outputting at (around) 32KHz
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.

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

User avatar
wareya
Posts: 16
Joined: Tue May 19, 2015 5:44 pm

Re: Audio (somewhat) implemented

Post by wareya » Sun May 24, 2015 10:17 pm

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.

User avatar
kode54
Posts: 1
Joined: Sun May 24, 2015 10:24 pm

Re: Audio (somewhat) implemented

Post by kode54 » Sun May 24, 2015 11:49 pm

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.

User avatar
Kaede
Posts: 5
Joined: Fri Jan 09, 2015 7:05 pm

Re: Audio (somewhat) implemented

Post by Kaede » Mon May 25, 2015 5:47 am

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... :oops: ), '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).

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Mon May 25, 2015 9:45 am

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.
Definitely. Would you be willing to re-license under 3-clause BSD for the sake of keeping the project all one license? :mrgreen:
Kaede wrote:Am I doing it wrong ? I have tried all Windows builds, the behavior is the same (rig: i5-4690k/R9 270).
Probably not... just lack of documentation on my part. :) The easiest thing to do is take the OpenAL32.dll from downloads.cen64.com and tuck it in the same directory as your CEN64 .exe file. Then use a frontend like CEN64-qt to manage CEN64 for you.

User avatar
Kaede
Posts: 5
Joined: Fri Jan 09, 2015 7:05 pm

Re: Audio (somewhat) implemented

Post by Kaede » Mon May 25, 2015 12:02 pm

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.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Mon May 25, 2015 12:43 pm

Kaede wrote:I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.
If that doesn't work, I probably won't have much success toggling it from within CEN64 either.

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.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Mon May 25, 2015 1:10 pm

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.

User avatar
Kaede
Posts: 5
Joined: Fri Jan 09, 2015 7:05 pm

Re: Audio (somewhat) implemented

Post by Kaede » Mon May 25, 2015 2:33 pm

MarathonMan wrote:
Kaede wrote:I have also tried forcing VSync through the drivers (AMD control panel) but that does not work.
If that doesn't work, I probably won't have much success toggling it from within CEN64 either.
I am not too sure, but it may have to do with my running Cen64 in windowed mode.

User avatar
iwasaperson
Posts: 49
Joined: Tue Apr 22, 2014 12:50 am

Re: Audio (somewhat) implemented

Post by iwasaperson » Mon May 25, 2015 4:26 pm

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

User avatar
Snowstorm64
Posts: 303
Joined: Sun Oct 20, 2013 8:22 pm

Re: Audio (somewhat) implemented

Post by Snowstorm64 » Mon May 25, 2015 4:51 pm

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
Just add -lX11 to the flags. (EDIT: of course you need the -dev dependecies)
OS: Debian GNU/Linux Jessie (8.0)
CPU: Intel i7 4770K @ 3.5 GHz
Build: AVX (compiled from git)

User avatar
iwasaperson
Posts: 49
Joined: Tue Apr 22, 2014 12:50 am

Re: Audio (somewhat) implemented

Post by iwasaperson » Mon May 25, 2015 5:19 pm

Snowstorm64 wrote:
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
Just add -lX11 to the flags. (EDIT: of course you need the -dev
dependecies)
I'm using Arch, so I don't have -dev packages.

Adding it to links worked though. Thanks.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Tue May 26, 2015 7:52 am

iwasaperson wrote:I'm using Arch, so I don't have -dev packages.

Adding it to links worked though. Thanks.
I'd like to get a CMake fix applied to this (though that is the correct "fix"):

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}
)
"${X11_X11_LIB}" line under X11_LIBRARIES:

Code: Select all

target_link_libraries(cen64
  ${EXTRA_OS_LIBS}
  ${OPENAL_LIBRARY}
  ${OPENGL_gl_LIBRARY}
  ${X11_LIBRARIES}
  ${X11_X11_LIB}
  ${CMAKE_THREAD_LIBS_INIT}
)

User avatar
iwasaperson
Posts: 49
Joined: Tue Apr 22, 2014 12:50 am

Re: Audio (somewhat) implemented

Post by iwasaperson » Tue May 26, 2015 3:49 pm

MarathonMan wrote:
iwasaperson wrote:I'm using Arch, so I don't have -dev packages.

Adding it to links worked though. Thanks.
I'd like to get a CMake fix applied to this (though that is the correct "fix"):

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}
)
"${X11_X11_LIB}" line under X11_LIBRARIES:

Code: Select all

target_link_libraries(cen64
  ${EXTRA_OS_LIBS}
  ${OPENAL_LIBRARY}
  ${OPENGL_gl_LIBRARY}
  ${X11_LIBRARIES}
  ${X11_X11_LIB}
  ${CMAKE_THREAD_LIBS_INIT}
)
That didn't work. Same error.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Tue May 26, 2015 5:02 pm

iwasaperson wrote:That didn't work. Same error.
Can you `rm -f cen64 && make VERBOSE=1` and pastebin?

User avatar
iwasaperson
Posts: 49
Joined: Tue Apr 22, 2014 12:50 am

Re: Audio (somewhat) implemented

Post by iwasaperson » Tue May 26, 2015 5:13 pm

MarathonMan wrote: Can you `rm -f cen64 && make VERBOSE=1` and pastebin?
Doesn't fail until linking, so I only copied everything below the linking stage.
http://pastebin.com/1FXTAFb4

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Wed May 27, 2015 9:16 am

OK, that's really interesting... looking at the link line:

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
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.

Presence
Posts: 51
Joined: Fri Oct 18, 2013 9:27 am

Re: Audio (somewhat) implemented

Post by Presence » Wed May 27, 2015 9:54 am

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}.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Wed May 27, 2015 12:22 pm

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}.
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.

User avatar
wareya
Posts: 16
Joined: Tue May 19, 2015 5:44 pm

Re: Audio (somewhat) implemented

Post by wareya » Wed May 27, 2015 12:41 pm

I still find it really odd that you picked OpenAL. Why not SDL, if you're going to be resampling soon anyway?

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Wed May 27, 2015 1:04 pm

wareya wrote:I still find it really odd that you picked OpenAL. Why not SDL, if you're going to be resampling soon anyway?
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.

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.

User avatar
wareya
Posts: 16
Joined: Tue May 19, 2015 5:44 pm

Re: Audio (somewhat) implemented

Post by wareya » Wed May 27, 2015 1:45 pm

>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...

Presence
Posts: 51
Joined: Fri Oct 18, 2013 9:27 am

Re: Audio (somewhat) implemented

Post by Presence » Wed May 27, 2015 2:00 pm

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.
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:
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.

User avatar
Sintendo
Posts: 25
Joined: Thu Oct 31, 2013 9:11 am

Re: Audio (somewhat) implemented

Post by Sintendo » Sat May 30, 2015 4:21 pm

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.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Sat May 30, 2015 7:40 pm

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 did.

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).

User avatar
Sintendo
Posts: 25
Joined: Thu Oct 31, 2013 9:11 am

Re: Audio (somewhat) implemented

Post by Sintendo » Sun May 31, 2015 6:10 am

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).
Last edited by Sintendo on Sun May 31, 2015 11:03 am, edited 1 time in total.

User avatar
MarathonMan
Site Admin
Posts: 692
Joined: Fri Oct 04, 2013 4:49 pm

Re: Audio (somewhat) implemented

Post by MarathonMan » Sun May 31, 2015 10:30 am

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).
MSVC builds might be buggered; haven't tried them in awhile. Thanks for the heads up...

beannaich
Posts: 149
Joined: Mon Oct 21, 2013 2:43 pm

Re: Audio (somewhat) implemented

Post by beannaich » Mon Jun 01, 2015 7:42 pm

Nintendo Maniac 64 wrote:
beannaich wrote:LoZ was outputting at (around) 32KHz
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.

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.
I would love to register the domain http://www.missedyourpoint.com/ in honor of you.

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
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. That also means that a sample rate above that, would produce the same results (except, without that pesky "little bit of aliasing").

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.

User avatar
wareya
Posts: 16
Joined: Tue May 19, 2015 5:44 pm

Re: Audio (somewhat) implemented

Post by wareya » Tue Jun 02, 2015 10:02 am

>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.

User avatar
nothingtosay
Posts: 1
Joined: Mon Oct 07, 2013 12:25 am

Re: Audio (somewhat) implemented

Post by nothingtosay » Fri Jul 31, 2015 1:45 am

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:
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. :D

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. :P

If anyone wants to investigate further I can try to help in any way I can.

User avatar
The Extremist
Posts: 29
Joined: Sun Nov 03, 2013 6:11 pm
Location: Canadian Prairie

Re: Audio (somewhat) implemented

Post by The Extremist » Sun Aug 02, 2015 4:56 am

Now THAT is some hardcore detective work!

User avatar
wareya
Posts: 16
Joined: Tue May 19, 2015 5:44 pm

Re: Audio (somewhat) implemented

Post by wareya » Mon Aug 03, 2015 5:00 pm

Cool.

While we're on this topic, how similar is Cubic to Hermite in terms of distortion/reconstruction?

Post Reply

Who is online

Users browsing this forum: No registered users and 0 guests