红白机模拟器的音频模拟蛮有槽点

Description: SMBX以外其他游戏讨论、发布区
Moderators: Slash_18, 5438A38A, Yingchun Soul, Yave Yu, Moderators, Semi-moderatos

Yave Yu M
Topic author, Count
Count
Avatar
Yave Yu M
Topic author, Count
Count
Age: 30
Reputation: 57
Posts: 299
Joined: 25 Jan 2016

Post #1by Yave Yu » 28 Apr 2026, 14:51

红白机模拟器从90年代的开始,到如今的继续维护,准确度已提升数个量级!这玩意儿终究是人类编写的,因此还是会受到认知限制,比如受限于自己的听力与辨别能力的不足而导致音频混音并不特别还原实机,尤其是最先出现的Famicom!FC!红白机!所以想写长篇大论 (误) 来吐槽这现状。

经历90年代连音色都模拟不准确的时期后,电脑性能增强而足够让模拟器混流成大采样输出,于是能让我们听到正确的音色了。
2000年左右诞生的模拟器一律简单粗暴地混音输出,相当于用着线性混音器。三年后blargg发表了NES的APU研究,包含模拟器实现混音要用什么公式。他的研究对模拟红白机的音频非常有帮助,可以说是提升了N个量级。
首先让你听听线性混音器与非线性混音器有何差异,这里挑选一首BGM比较下,戴耳机听更有利于听出差异。先听blargg发表研究前的线性混音器:
线性播放Artelius.ogg (758.8 KiB) Viewed 8 times

再听blargg发表研究后的非线性混音器:
非线性播放Artelius.ogg (759.72 KiB) Viewed 7 times

也许你听出了混音差异,但不知如何用文字描述……我也没法准确地用文字描述,只能讲讲大体感觉。
非线性混音器的APU1 (俩方波) 只要混音50%或75%占空比的方波 (之后简称为XX%方波),音质就开始展现毛刺感,听着相当不干净。APU2的三角波与噪波则听着响亮而给力,只是一旦DPCM参与混音,便会降低整个APU2音量,表面感受就是三角波与噪波降低了音量。此BGM并不包含DPCM,但这样描述一下你应该能懂。由于不用DPCM的红白机游戏并不少,因此大多数时候非线性混音器就是让人觉得音频模拟飞跃了几个量级。

APU2有点模拟差异,表现为每个音结束后破音明不明显、混合力度有多强等,不过前者因听感不好而不会刻意还原 (除非全方位注重准确度),后者整体都比较强而忽略不计,所以APU1的非线性混音器模拟才是我要吐槽的东西。
如今网上有不少实机采集录像,国内玩家几乎都玩FC而非NES,还有FirebrandX从NewFC上录制的音乐专辑,这些都是很合适的参考对象。
以洛克人2为例,这游戏爱用响亮的方波与75%方波音色,适合拿来比较。
MetalMan关卡BGM就有不少75%方波,先听实机的:
MetalMan实机非线性.ogg (606.44 KiB) Viewed 9 times

再听模拟器的:
MetalMan模拟器非线性.ogg (596.72 KiB) Viewed 8 times

你听出混音差异了吗?也许比上面区分线性与非线性要困难些,但我着实听出了差异。简而言之,模拟器非线性实机非线性听着毛刺感更重,或者保守点讲,比日版机的非线性混音器听着毛刺感更重。
问题就来了,为何blargg会研究出那种听着毛刺感更重的混音公式?是他研究出现误差,还是美版机确实如此?相较于日版机,美版机的实机录像并不太好找,大多数还是音量小、听感也差的RTA实机速通录像,根本没法拿来参考。好在还是有参考对象,比如喷神James换上任天面包机之前的实机录像。

谁陷害了兔子罗杰:开头就是游戏开场BGM,播放着俩75%方波,能听出毛刺感……不过听着并不是特别明显。
超人:展示NES版的标题画面BGM也播放着俩75%方波,这相较于上面那个比较明显,毛刺感如此地重。
冬奥会:NES版全程用着响亮的75%方波,开场BGM、滑冰BGM都能听出毛刺感,即便带着喷神的解说。
换上任天面包机后:
Glitch集:双截龙通关短曲,容易听出毛刺感。
……之后的也不用继续听了,这些例子足够了。还蛮符合我所想的,这大概就是为啥blargg会研究出那混音公式的缘故吧?美版机有过滤高频和低频,所以他的视频里听着缺失了一些高频,但还是能听出俩75%方波混音的毛刺感。

既然有了blargg的研究,那模拟器开发者们自然会采用这公式来混音。他提供了两套公式,一套是符合美版机混音的公式,另一套是高效模拟的公式,毕竟他发布研究文档的年份电脑性能普遍不强,但凡模拟准确度高点运行就吃力。对APU1来讲,我会分别简称为95.88公式、95.52公式。
似乎FCE Ultra是最先用这公式的,至少如今能下载的TAS专版0.98.12是这样,用着95.52公式装数组来混音。之后的模拟器也是一个二个都采用这公式,不是95.52就是95.88,而电脑性能普遍变强后,新模拟器几乎都采用了95.88公式。这两套公式的听感差异非常微小,不及模拟器跟日版机的差异大。总而言之,这些模拟器非线性的混音都毛刺感重,听俩50%方波混音也难受。有趣的是Nestopia真做到了日版机的混音效果,听后还天真地指望有没有别的模拟器也做到这点,结果嘛……没有了!
Nestopia实际也采用的是95.52公式,但增至9552,再在这基础上多处理几步,于是做到毛刺感跟日版机同等程度,甚至能把Nestopia作为参考对象。一个比较滑稽的事,就是因为Nestopia混音APU1的毛刺感比很多模拟器的要轻点,让某些人误以为Nestopia用着线性混音器……看来对他们来讲日版机的表现很陌生。

很长一段时间内我即便能听出差异,也改变不了这现状,只能忍受。虽然Nestopia做到了,但它并不好用。让画面丝滑,音频会渐渐落后。启用跳帧让画面不丝滑,音频就不会落后了,可是声音还是会时不时跳帧,导致声音听着有跳跃感。直到Nestopia UE才把这稳定性做好,不过还是不好用,所以我并不常用,更常用FCEUX。
这期间的确有开发者出来改变现状,只不过是提供线性混音器且设计为非线性混音器开关,关掉后就不再听毛刺感重的混音。好像是NSFPlay最先引入,早期直接采用blargg的线性混音公式,导致方波音量越小,跟非线性的差距就越大。NewRisingSun也不喜欢非线性混音,于是研究如何保持音量跟非线性一致,之后便塞进NintendulatorNRS里了,且后来NSFPlay也做到了这点。两者的实现方式不同,NSFPlay的方式相当简单粗暴,且在俩50%或75%方波混音时切换非线性开关会听出较为明显的音量差异,比NintendulatorNRS明显。总之自那之后便有了高准确度带非线性混音器开关的红白机模拟器,只可惜这俩在当时就是唯二……想起我以前用NSFPlay知道非线性混音器开关后便想在FCEUX里尝试,结果发现没有开关时我有点懵逼,难道改变不了现状?是的,只能受着。

终究会有转机,虽然我掀不起大波澜。由于Sour停更Mesen许久,一直停留在2025年7月15日的测试版,因此我打算下载源码改进一些东西。起初是想增加线性混音器,但因Mesen源码的解耦化相当强而折腾死我,一直搞不好NintendulatorNRS那样带音量修正的混音公式,直到进一步改其它类的代码……总之我做到了,我的Mesen魔改便成为第三款能切换至线性混音器的模拟器!后续还基于Mesen-X改造出Mesen-Y,由于其模拟Flag屎山而不得不替换选项以添加线性混音器,但我依然把这算作第三款,毕竟都叫Mesen。
有了这等成功经验,便下载FCEUX源码尝试增加此开关。FCEUX采用95.52公式+装数组来混音,那么得采用NSFPlay的方式,有点缺陷但不是不能用。也是通过修改FCEUX源码,发现FCEUX的混音质量还不错,High跟Low真的有区别。同样是TAS御用的BizHawk我也下载源码改过,只是不再像改Mesen与FCEUX那样加开关,而是直接替换掉非线性混音公式,毕竟我不想再听那毛刺感重的混音。然后在复位时向$4011写0以让APU2响亮,再将磁碟机与VRC6音源放大点音量以匹配APU Volume 5……另外BizHawk的采样率真是座屎山,很多地方固定写44100,所以我一键替换为48000了。跟Mesen会发布编译的Fork不同,这俩我就私下享用,不过FCEUX我有向Yhc分享过,期待Yhc版FCEUX实装这些改动,只是一时半会儿还等不到。
后续突发奇想,移植Nestopia的非线性混音公式如何?结果是以失败告终。Nestopia本质还是blargg的95.52公式,那能否改动现有公式来做到这效果呢?结果还真可以,降低后面的+100.0就行了。跟FirebrandX的NewFC录音、Nestopia反复比对,最终确定改成+64.0即可做到这种毛刺程度。这下感觉爽快了,然后立即对FCEUX也作相同改动。
我把FCEUX的95.52公式换成95.88公式,再将+100降至+64,搭配之前就加的线性混音器开关,这下FCEUX也爽了!已实装于
FCEUX-2.6.6-Y310-Win32.7z
(3.67 MiB) Downloaded 4 times
,欢迎下载使用!此Fork由Yhc改造,移植了不少FCEUmm的新Mapper,我只是为他提供这些帮助:
· 线性方波混音器。
· 不重置方波相位。
· Prescale 5x、6x、8x滤镜。
再往后我想为用着FCEUX核心的NES.emu提供线性方波混音器开关,于是改代码后发到其Issue上,看看那开发者是否采纳。至于为何不为原版FCEUX提供这改动?我在那边提供了新的默认调色板改动,结果没有一丁点回应,那看来志不同道不合?行,原版FCEUX爱咋样就咋样,我用Yhc版就是了。

除了拿来游玩的红白机模拟器,还有音乐播放器,上文提到的NSFPlay就是其中之一,还有使用范围更广的GME,很多支持NSF、SPC、GBS、VGM等格式的音乐播放器都会采用GME。
单论听感来讲,GME绝对是线性混音器,连APU2都应用了,于是会听到偏响亮的方波、偏弱的三角波与噪波,以及DPCM播放时不会让三角波与噪波变弱。从源码的实现公式上看,并没采用blargg的方案……也是,线性混音器只要线性,怎样实现都行,但震惊的是GME源码包含了Nonlinear,以及三角波与噪波的音量修正 (差不多跟Mesen同款),可是给Foobar2000用的插件就没这开关,所以只能听线性。
虽然GME因APU1强、APU2弱的混音表现听着生硬感重,但还是比VirtuaNES等早期模拟器的线性混音器要强,因为细节更准确加上支持NSF的速率参数,使其能正确播放设定为40FF (60.099帧) 的速率。因为线性混音方波很干净,所以有一些人就认为GME的音质好,毕竟方波很干净。Nintendulator、QuickerNES也差不多是这种混音表现,APU1强、APU2弱,只有方波音量偏小时才感觉合适。
除了GME,还有知名度更低的NEZPlug++,也能给Foobar2000用。提供NESRealDAC开关 (非线性混音器),甭管启不启用,听感都不像GME那样生硬,只是这插件播放它支持的格式都有不舒服的点,就是每个音之间的隔断音刷了存在感,是每个音之间都有,就很难受。难怪不怎么有人采用它,再加上它播放GBC勇者斗恶龙3还会缺一会儿Square 1音。这玩意儿的线性混音器显然没作音量修正,只是加大线性的音量,导致APU1音量听着偏大,而且连APU2也跟着线性混音,只是不像blargg的公式那样会显著降低三角波、噪波的混音音量。
NSFPlay也算是流行了起来,安卓Droidsound-E、苹果Modizer都用上了NSFPlay,并且可在NSFPlay与GME之间切换,给了你一个选择。
其实我还注意到这些红白机模拟器即便是非线性混音器,不同模拟器之间的音质也有所不同。FCEUX相对干净,只要不混音50%与75%方波就听不太出脏感。BizHawk稍微次点但也还算可以,毕竟这用了95.88公式,而非FCEUX用的95.52公式。其余几个模拟器都差不多的程度,脏也只会稍微脏那么一丁点,但NSFPlay我认为是最脏的一款,即便将音质设置为最高的40,听非线性混音还是毛刺感重,连12.5%与25%方波混音都能听出脏感。可不是我在胡说,在我将Mesen、FCEUX的+100降至+64后,这俩模拟器的非线性混音均有效降低了一些毛刺感以符合日版机,可是NSFPlay即便将+100降至+64,毛刺感也还是重成狗,那看来弄不成日版机的非线性混音表现咯?真的是,辛辛苦苦费了老大劲安装完早已不支持的v141开发包后成功编译NSFPlay,结果却得到这种糟心结果,唯一的收获只有证明我的观点很正确。所以想在NSFPlay上愉快地听音乐,就只能关掉APU1的非线性混音器。

除了混音器是否线性,还有高频过滤差异。使用一副稍微好点的耳机,并且自己的听力受损程度不高,便能分辨这些红白机模拟器的差异。
VirtuaNES、FCEUX、新Mesen无高频过滤,听着较尖锐,很通透。
旧Mesen、BizHawk (NesHawk核心) 有高频过滤,听着较柔和,有点糊。
Nestopia、NintendulatorNRS、BizHawk (QuickerNES核心) 有点点高频过滤,但没上面那样重。
AprNes默认有14kHz高频过滤,可设置主机型号或自定义来调节高频过滤程度。
NSFPlay默认有112高频过滤 (该值越大、过滤越强),可设置为0 (Windows端把LPF拉到最左边) 来取消高频过滤,但还是跟FCEUX有点差距。
有趣的是FCEUXQt与NES.emu均有Low-Pass Filter开关,启用后便会过滤高频。

曾经FC吧有人认为Nestopia的声音听着震撼,而VirtuaNES听着不够震撼。这俩的确有混音差异,且被那人听了出来,只是不知如何准确描述罢了。我录制两首音乐让你听听及比较差异,先听地底大作战的标题画面BGM:
VirtuaNESChiteiSenkuuVazorudaa.ogg (395.89 KiB) Viewed 5 times

NestopiaChiteiSenkuuVazorudaa.ogg (384.38 KiB) Viewed 3 times

再听洛克人2的开场与标题画面BGM:
VirtuaNESRockman2.ogg (1.26 MiB) Viewed 16 times

NestopiaRockman2.ogg (1.24 MiB) Viewed 5 times

听后感觉如何?你同意那条观点吗?我很同意,VirtuaNES听着实在很生硬。可是Nestopia也有自己的毛病,主要体现在APU2上。
默认设置下三角波与噪波过于响亮,比实机与其它非线性模拟器都更响亮,而DPCM则有不知如何描述的小问题。
比较了模拟器使用与比较、源码修改、其它使用体验的差异后,我才明白FCEUX、Mesen与BizHawk到底有多香。如今的电脑运行这些模拟器都不再成大问题,除非你还在用皆如i3-4130这样的老古董电脑。

此文就只是想着重吐槽红白机模拟器混音APU1的现状,大多数都采用毛刺感重的非线性混音公式,且不提供非线性开关,就很难受。唯一提供此开关,拿来游玩的NintendulatorNRS却难用,不能改快捷键对我来讲就是屑,画面也丝滑不了且启用VSync后还会帮倒忙,窗口大小最大4倍且设置还过滤数值 (如7倍会被过滤成3倍),所以除了玩VT游戏我还真不知道有何用它的理由……哦对,其源码帮助我为Mesen实现了干净的APU1混音

其实非线性混音公式我一开始是认定为+60,之后才认定为+64,但很遗憾我又错了!实机录音很诱人,于是我又翻出来听,结果发现+64的毛刺感也轻了点……所以我猜日版机的混音毛刺感大概就是轻个¼?改成+75后听起来就像了,那么……又得去麻烦Yhc修改他的FCEUX了。

Return to “游戏”

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest