做了一个重播 NES APU 指令的 UI:


点击图片或这里体验。

使用说明

  • 将录制好的文本文件拖放到 UI 中即可开始播放
  • 录制文件格式如下:
    82946, $4015, $0f
    82952, $4017, $c0
    83145, $4015, $0b
    83151, $4008, $00
    83157, $4015, $0f
    83169, $4000, $30
    83205, $4004, $30
    83241, $400c, $30
    83279, $4001, $7f
    83315, $4005, $7f
    

    其中,第一列表示 CPU 时钟周期;第二列表示寄存器地址;第三列表示写入寄存器的数据

  • 录制文件可由其它模拟器录制产生。使用 Mesen 录制时,可以使用如下录制条件:
    IsWrite && ((Address >= $4000 && Address <= $400f) || Address == $4015 || Address == $4017)
  • UI 从上到下共 5 行。分别代表:方波通道一、方波通道二、三角波通道、噪声通道、最终合成效果
  • UI 从左到右共 5 列。分别代表:波形、通道基本信息、滑音单元、包络生成器、长度计数器

实现细节
APU 部分可以参考 NES APU 这篇文章,不赘述

音频部分当然是采用 WebAudio API,基本思路就是每次产生一小段样本数据,然后送去播放。收到播放完毕通知后,再产生,再播放,这样一直循环。不过,这里有几个小细节。

一是播放完毕的通知存在延迟且时长不固定。如果收到通知再产生下个音频数据块,会让整体声音有停顿,听起来极度不适。解决此问题可维护一个音频数据块列表,这个列表不用太大,比如长度为 5 即可。设每个音频数据块的播放时长是 20 ms, 则这个列表中的音频数据全部播放完毕共需要 100 ms。每个块儿播放完毕后,会有一个播放完毕通知。因此,不用等 100 ms 就可以收到通知,此时列表内应还剩音频数据还没有播放完毕。收到通知后,先移除掉已经播放过的块,再产生音频数据,直到列表填满。由于此时列表还有剩余音频没有播放完毕,而新的音频数据已经就绪,就不会出现停顿。这个方法有个前提假设,就是通知的延迟不能太高。按列表长度为 5 来算,延迟不能大于 80 ms。就实际情况来看,延迟大约在 20 ms 左右的样子。

二是 AudioBufferSourceNode 没有队列功能。起初我以为跟 Windows API 是有列队功能的,结果导致列表内的音频数据实际上是同时播放了,听起来也是极度不适。这里应该采用 AudioBufferSourceNode.start(startTime) 指定每个块的开始时间,避免同时播放的问题。设每个块儿播放时长是 20 ms,则每个块的开始时间就是上个块的开始时间再加 20 ms。第一个块的播放时间应该是 AudioContext.currentTime,开始时间小于 AudioContext.currentTime 的音频数据也是会立即播放的!这里,第一个块是指第一个被播放的数据块,不是上述列表中的第一个元素。

三是如果用户没有在页面上进行过用户交互,则 AudioContext.state 的初始状态是 suspended,此时即使调用 AudioContext.resume() 也没有任何效果。

NES APU Replayer相关推荐

  1. nes 红白机模拟器 第6篇 声音支持

    InfoNES 源码中并没有包含 linux 的声音支持. 但提供 wince 和 win 的工程,文件,通过分析,win 的 DirectSound 发声,在使用 linux ALSA 实现. 先使 ...

  2. iMX6ULL应用移植 | 移植 infoNES 模拟器(重玩经典NES游戏)

    没玩过NES游戏的童年,可能不是80后的童年.我们小时候是从玩FC开始接触游戏机的,那时真的是红极一时啊,我上初中时还省吃俭用买了一台小霸王,暑假里把电视机都给打爆了!那时任天堂单是FC机的主机的发售 ...

  3. (转载)Everynes NES Hardware Specifications

    原文: NES Specifications  Everynes - Nocash NES Specs Everynes Hardware Specifications Tech Data Memor ...

  4. 用C语言开发NES游戏(CC65)15、音乐

    粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/ 我前段时间写了一篇关于NES Audio文章. https://nesdo ...

  5. 任天堂红白机 ( NES ) 文档

    +---------------------------+ | 任天堂红白机 ( NES ) 文档 | | 版本.2.00                 | +------------------- ...

  6. NES专题——NES游戏机简介

    目录 一.FC.NES.红白机的关系及发展史 二.FC游戏机的组成部分 三.FC模拟器 四.参考文章及资料 一.FC.NES.红白机的关系及发展史 1983年7月15日,由日本任天堂株式会社(原本是生 ...

  7. AMD Ryzen 5000‘Cezanne’APU

    AMD Ryzen 5000'Cezanne'APU Spotted,Zen 3&7nm Vega芯片将在2021年前保留AM4支持 AMD Ryzen 5000 'Cezanne' APU ...

  8. 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载

    NES Emulator TV精选了上千款经典的红白机小游戏,我们小时候玩过的经典游戏都能够在这里找到,每一款游戏在这里都能够分别存档,没有太多时间的上班族可以尝试一下,给玩家带来最好的游戏体验. 软 ...

  9. apu和atom处理器两者的定位

    首先需要明确的是,APU处理器上市之后的定位于新一代双核Atom处理器比较相近,距离定位主流的Core i3处理器则有很大的性能差距,综合性能甚至还不如Core i3的一半.因此,在这里更推荐神舟优雅 ...

  10. AMD之A系列APU问世 引领平板市场与高清视频

    图:AMD LlanoAPU 2011年6月14日,AMD正式发布了全新的主流笔记本平台--"Sabine",Sabine平台采用了代号为Llano的A系列APU,AMD在Sabi ...

最新文章

  1. 一篇叫做决心书的文章
  2. 基于Python的MORSE音频的波形和频谱(二)
  3. MyClass a,b[2],*p[2]调用了几次构造函数
  4. kafka 可视化工具_两小时带你轻松实战SpringBoot+kafka+ELK分布式日志收集
  5. 让CMD窗口显示中文[JAVAC输出中文错误信息乱码的解决]
  6. Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)
  7. 《数据库SQL实战》查找入职员工时间排名倒数第三的员工的所有信息
  8. spark2.0.1 安装配置
  9. php dos,防止用户利用PHP代码DOS造成用光网络带宽
  10. java中的构造方法与代码块
  11. Java键盘录入 Scanner
  12. java多组List所有的排列组合
  13. 【原】移动web页面兼容处理的思考
  14. python可以嵌在vba中吗_Jupyter Notebooks嵌入Excel并使用Python替代VBA宏
  15. paip.多维理念 输入法的外码输入理论跟文字输出类型精髓
  16. 【Day4.3】大皇宫内蹭讲解
  17. 昆石VOS3000_2.1.4.0安装脚本
  18. Ubuntu不同颜色文件所代表的文件类型
  19. coding-summaries
  20. 【历史上的今天】3月13日:1986年微软IPO 缔造四位亿万富翁

热门文章

  1. 正面管教读书笔记 05 当心逻辑后果
  2. TypeError: parentComponent.ctx.deactivate is not a function
  3. 【Python】Talk Python To Me Podcast播客
  4. 苹果手机开机一会显示无服务器,苹果手机出现无信号的解决方法
  5. X360吉他英雄4鼓套装 1 TB硬盘入手
  6. 计算机应用基础压缩文件操作题目演示,计算机应用基础操作题题目
  7. 网吧客户信息查询c语言,网吧经营管理之客户定位
  8. 证明三角形中cosA+cosB+cosC=1+4sin(A/2)sin(B/2)sin(C/2)
  9. 2021-最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)---JavaScript篇
  10. redis 模糊删除keys