USBSID-Pico:用树莓派Pico让真实的Commodore 64 SID芯片通过USB复活
深入探索USBSID-Pico项目如何通过开源硬件让经典的MOS 6581/8580 SID芯片在现代设备上重现温暖音色,涵盖技术细节、应用生态与未来展望。
在复古计算与电子音乐的世界里,Commodore 64的MOS Technology SID芯片始终占据着一个不可替代的位置。这款诞生于上世纪八十年代的声音合成器以其独特的模拟滤波器、温暖的失真音色以及极具表现力的声音设计能力,塑造了一整代人的听觉记忆。无论是Martin Galway的经典配乐,还是Rob Hubbard那些让人难忘的旋律,SID芯片所发出的声音早已超越了单纯的电子音符,成为了一种文化符号。然而,随着原始硬件的逐渐老化,如何在现代设备上重现这些真实的音色,成为了许多爱好者与技术创作者不断探索的课题。 软件模拟固然可以在数字层面上相当接近SID的声音特征,但无论算法多么精细,都难以完全复制老旧硅片中那种独特的模拟温暖感与不可预测的微小瑕疵。正是基于这样的认知,开发者LouD(本名loudness)创建了USBSID-Pico项目,一个旨在将真实的SID芯片通过USB接口连接到现代工作环境中的开源硬件平台。
这个项目不仅代表着对复古硬件的致敬,更是现代微控制器技术与经典音频硬件完美结合的典范。 USBSID-Pico的核心设计基于Raspberry Pi Pico微控制器系列,包括rp2040和rp2350两个版本。Pico强大的处理能力、丰富的GPIO接口以及独特的可编程输入输出(PIO)状态机,使其成为控制SID芯片的理想平台。通过这款小巧的电路板,用户可以连接最多两颗SID芯片,无论是经典的MOS 6581还是后来的8580,亦或是各种现代硬件替代品,如Swinke SID、FPGASID、ARMSID等,都能在USBSID-Pico上找到自己的位置。 在连接方式上,USBSID-Pico展现出了极高的灵活性。它支持原生USB连接,可以作为CDC设备、WebUSB设备或WebSerial设备与主机通信。
这意味着用户不仅可以通过传统的桌面应用程序控制SID,还能在Chrome浏览器中直接播放SID音乐文件,无需安装任何额外软件。此外,它还支持USB-MIDI协议,使得任何MIDI兼容的音序器或键盘都能将音符发送给真实的SID芯片进行演奏。对于追求更纯净数字传输的用户,ASID流协议提供了另一种高效的数据传输方式。 跨平台兼容性是USBSID-Pico的另一个重要特性。无论是Windows、macOS还是Linux用户,甚至是Android设备和复古的Amiga系统,都能享受到这款设备带来的便利。这种广泛的兼容性并非偶然,而是项目开发者在设计之初就考虑到的核心目标之一。
通过TinyUSB库实现的多接口USB复合设备架构,使得USBSID-Pico能够在不同操作系统上保持一致的体验。 从硬件迭代的角度来看,USBSID-Pico经历了一个漫长而精心打磨的演进过程。项目始于2024年初,最初的灵感来源于SIDPod这个简单的Raspberry Pi Pico SID播放器。LouD在此基础上添加了SD卡支持,创建了SIDPod-SDCard版本。随后,他发现了ESP32-SIDView项目,这个支持真实SID芯片的播放器进一步激发了他的创作热情。在尝试了FTDI FT223HL方案之后,LouD最终选择了Pico作为主控制器,并于2024年5月完成了第一个perfboard原型。
从v0.1到v1.5,每一个硬件版本都带来了显著的改进。v1.0版本奠定了基础,支持双SID固定电压插座,实现了多协议连接,并获得了OSHWA开源硬件认证。v1.3版本引入了混合SID配置,允许同时使用不同代的芯片,例如在第一个插座中使用需要12V供电的6581,在第二个插座中使用需要9V供电的8580。这一版本还增加了硬件音频切换功能,可以在单声道和真正的立体声之间切换。v1.5版本则是一项重大飞跃,实现了100%无跳线电压控制,系统能够自动检测所安装的芯片类型并设置正确的供电电压,这不仅极大地提升了用户体验,更重要的是保护了珍贵的SID芯片免受过压损坏。 在技术实现层面,USBSID-Pico展现出了令人印象深刻的工程深度。
控制古老的MOS SID芯片面临着独特的挑战,因为这些芯片依赖于严格的相位时钟来驱动其内部的开关电容模拟滤波器、声音包络发生器以及数模转换器。任何时钟线上的抖动或频率漂移都会导致可听的音调漂移、滤波器步进异常或数字采样播放(Digiplay)失真。为了解决这一关键问题,项目利用了Raspberry Pi Pico内置的可编程输入输出状态机和直接内存访问(DMA)功能。 主时钟生成被完全委托给专用的PIO状态机。由于PIO状态机独立于ARM Cortex核心运行,因此无论USB数据包传输、MIDI处理还是配置任务多么繁重,时钟信号都能保持完全的周期精度。PIO的小数分频器允许时钟输出动态配置,固件可以无缝生成标准的1MHz方波,精确锁定PAL或NTSC制式C64的频率,或为自定义硬件替代品缩放时钟。
在v1.0版本上,如果存在外部振荡器,PIO状态机还可以动态切换到读取并传递外部信号。 SID芯片的寄存器写入需要相对于PHI2时钟的精确定时窗口。寄存器写入需要在PHI2的高相位期间,在特定的时间窗口内设置地址总线、数据总线,并将片选和写使能信号拉低。USBSID-Pico结合了PIO状态机和DMA缓冲区,实现了确定性的低延迟总线周期,仅产生单个时钟周期的开销。来自WebUSB、ASID或USB-MIDI的寄存器写入数据包几乎直接从USB堆栈放入DMA缓冲区。第二个PIO状态机控制RW和两个片选引脚,第三个PIO状态机使用映射的SET和OUT引脚目标在单个时钟周期内同时处理8位数据总线和6位地址总线,第四个状态机程序则在断言片选和驱动数据之间插入精确的循环延迟,确保芯片建立时间和保持时间得到满足,同时不会阻塞主处理器。
值得一提的是,所有这些时序精度都依赖于编译器优化级别为-O3。如果降低优化级别,编译器会在DMA/PIO交接处产生足够的额外开销,重新引入时序松弛,这会表现为嵌入式SID播放器和Cynthcart中的数字采样播放异常。因此,-O3优化对于这个固件而言不是锦上添花,而是承载关键功能的必要条件。 双核分工是USBSID-Pico固件架构的另一个精妙之处。核心0始终处理所有USB相关事务,包括CDC、WebUSB、MIDI以及配置管理。核心1则承担着多项任务,包括运行MIDI引擎、板载模拟器用于SID播放或Cynthcart、用户触发时的SID测试,以及在其他任务空闲时的VU表显示。
当核心1忙于处理板载模拟器时,VU表功能会转移到核心0上执行。两侧核心都可以进行SID总线写入,因为实际的写入操作被移交给处理时序关键工作的DMA/PIO。这种任务分配方式确保了USB流量、MIDI处理或配置保存等操作永远不会影响到周期精确的总线时序。 SID型号自动检测是一项看似简单但实现起来颇具挑战的功能。真实的6581和8580芯片在包络/波形发生器内部对某些测试位序列的反应略有不同,这些行为并未被官方文档记录,而是C64社区多年来总结出的经验。USBSID-Pico在启动时(以及在插座重新配置时)对每个插座运行多个探测程序,交叉核对结果,并通过多种检测方法进行回退,直到它确信所面对的是6581、8580还是无法识别的芯片。
如果检测出错,固件会对芯片施加错误的电压/滤波器假设,这可能会损坏珍贵的硅片,因此这绝非一个可有可无的功能。 在MIDI支持方面,USBSID-Pico展现了强大的灵活性。MIDI处理程序维护每个通道的声音分配表,使传入的音符被分配到空闲的SID声音插槽,跟踪音符开关和力度,并在其自己的定时器上叠加琶音器。MIDI和ASID消息通过完全不同的传输方式传入,但解码后汇入相同的底层寄存器写入路径,因此总线时序代码无需关心是哪个协议请求了写入。 配置持久化是一个看似不起眼却极其重要的设计考量。板载设置(包括启用的插座、地址范围、时钟速度、电压模式、VU源等)在断电后仍然保留,而无需运行文件系统。
闪存在链接器级别被分割为固件区域和单独的持久存储区域,因此写入配置更新永远不会意外覆盖运行中的代码,固件更新也永远不需要触及或擦除用户保存的配置。 软件生态的丰富程度是衡量一个硬件项目成功与否的重要标志。USBSID-Pico在这方面表现出色,已经获得了众多知名应用程序的原生支持。Vice这款经典的C64模拟器从3.10版本开始支持通过USBSID-Pico输出最多4个SID。JSidplay2、Denise、sidplayfp等播放器也已加入支持列表。Acid64 Pro这款Windows商业SID播放器、Phosphor跨平台播放器、sidfactory2这款音乐创作工具,都已将USBSID-Pico列为输出选项。
此外,Amiga playsid项目让经典Amiga电脑也能通过USBSID-Pico享受真实SID音色。 在浏览器端,deepsid网站让用户无需安装任何软件即可通过WebUSB(Chrome)或WebSerial(Chrome/Firefox)播放SID文件。Hippoplayer这款多格式音乐播放器同样支持通过USBSID-Pico输出。对于不太熟悉技术的用户,USBSID Web配置工具不仅提供配置界面,还可以作为快速的测试播放器使用。 项目开发者LouD本人也创建了一系列配套工具。USBSID-Player是一个命令行SID播放器,可以直接通过板载播放PSID/RSID/PRG/P00文件,无需完整的模拟器。
CLI SendSID工具用于将SID音乐文件传输到板载的嵌入式播放器。USBSID-Configtool提供了桌面图形界面配置方式,使用Clojure语言开发。这些工具共同构成了一个完整的生态系统,让用户无论技术水平如何,都能轻松使用USBSID-Pico。 社区贡献同样是USBSID-Pico项目不可或缺的一部分。sandlbn完全出于自发编写并维护了一个完整的Rust驱动程序,WilfredC64也为Acid64 Pro创建了专门的Rust实现。Raros为嵌入式Cynthcart固件开发了Windows平台的Cynthcart VST插件。
所有这些USB底层工作的实现都离不开TinyUSB项目的支持,固件依赖它来构建整个USB协议栈。 展望未来,USBSID-Pro正在紧锣密鼓地开发中。这款专为音乐制作人、音频工程师和SID芯片音乐纯粹主义者设计的高端版本,将支持四颗SID芯片、提供专业级的音频路由和更低噪声底噪,以及专用的MIDI输入端口。这些特性将使USBSID-Pro成为录音棚环境中真实SID音色的终极解决方案。 从文化传承的角度来看,USBSID-Pico的意义远超过一款普通的硬件产品。它代表着一种对数字时代模拟遗产的珍视与守护。
在这个软件模拟日益完美的时代,仍然有人致力于让真实的硬件继续发声,这本身就是一种对技术历史的尊重。每一颗被小心使用的SID芯片,每一首通过真实硬件演奏的经典曲目,都是对那个黄金时代的致敬。 对于复古计算爱好者而言,USBSID-Pico提供了一个难得的机会,让他们能够在现代工作环境中继续享受那些定义了一整代电子音乐的音色。对于电子音乐创作者来说,这款设备打开了一扇通往新音色可能性的大门,真实的SID芯片那种独特的模拟温暖感是任何软件模拟都无法完全复制的。无论你是想重温经典游戏配乐,还是希望将真实SID音色融入现代音乐创作,USBSID-Pico都提供了一个功能强大、灵活多变且社区支持丰富的解决方案。 随着项目的不断发展和社区的持续壮大,USBSID-Pico正在成为连接过去与未来的重要桥梁。
它让古老的MOS 6581和8580芯片能够在现代USB接口下重获新生,让无数经典的SID音乐作品得以在新设备上以最真实的方式重现。这不仅是一个技术项目的成功,更是一场跨越数十年的文化传承的延续。 。