denjhang 发表于 2026-6-9 09:49:43

全球首款STC8H8K64移植芯片音乐仿真核心工程

{:4_165:}

折腾了一阵 STC8H8K + PWM-DAC 复古音源方案,目前进度来交个底😆

定时器分配:

• 定时器2:VGM主时序,固定 17640Hz 采样定时,负责音源解码与波形合成

• 另一定时器:60Hz 串口后台定时,用于调试/日志输出

目前兼容情况:
✅ AY-8910、SN76489 播放丝滑流畅,音色正常
⚠️ SCC 音源勉强能跑,已经摸到算力上限
❌ NES、GB、SAA1099 暂时没法正常播放,中断服务函数开销太大,8位MCU算力顶不住了

https://github.com/denjhang/STC_Chiptune

硬件非常简单,p2.0一根线出来,过耦合电容之后接有源音箱,音质还行,考虑性能原因,采样率固定为17640hz,pwm载波调制DAC输出原理

【全球首款STC8H 可编程声音发生器 AY8910 PSG仿真器-哔哩哔哩】 https://b23.tv/8wP2PQp

【全球首款STC8H 数控复杂声音发生器移植 DCSG SN76489兼容-哔哩哔哩】 https://b23.tv/FMonvpC

【全球首款STC8H 简易片上波表合成器 SCC-哔哩哔哩】 https://b23.tv/4U7ug0h

denjhang 发表于 2026-6-9 13:00:56

源码也上传了,语音方案就是移植libvgm的声音核心,这些PSG/DCSG是一些古董游戏机的声音芯片,也是最基础芯片音乐硬件。
本方案使用UART从上位机接受VGM寄存器流,通过内置的精简版仿真核心计算声音并使用PWM载波调制DAC输出到P2.0脚位,
和其他mp3/wav播放器项目相比有本质区别,那些播放器项目是对音频进行解码播放,我这里是进行真正的声音合成,具备实时合成的能力,
稍加改进即可配合电脑等上位机进行实时音乐合成,MIDI合成,电子琴等功能,也可扩展为本地SD卡播放VGM。

目前8h的性能已经榨干,超频到48M已经是内置IRC的极限,播放ay尚且流畅,sn略有卡顿,scc非常勉强,saa,gb,nes等几乎无法发出正常声音。
迁移到32g12k128之后,时钟频率有所下降为35M,但是由于C251内核对运算的加速,scc有大幅度改善,但是FM合成如YM2413还是做不了,FM合成需要大量高精度乘法(大多数单片机8位/32位低端MCU可能都难以完成),这里最多做精简内置查表替代。

如不懂可查豆包等ai解释下:
什么是 PSG / DCSG / GB / NES / SAA / SCC?(libvgm 复古声音芯片通俗解释)
这些全是老游戏机 / 老电脑里的声音芯片(音源),libvgm 就是专门模拟它们发声的核心库。下面逐个讲人话:

1. PSG(Programmable Sound Generator)
可编程声音发生器,8 位机最基础的 “方块声芯片”。


[*]代表型号:AY-3-8910、YM2149
[*]用在:世嘉 SMS、Game Gear、MSX、早期街机、Amstrad CPC
[*]声音特点:3 路方波 + 1 路噪音 + 一路硬件包络,就是那种 “嘟嘟、哔哔、沙沙” 的 8 位机味,音色硬、亮、电子感强。
[*]libvgm 地位:最基础、支持最多的一类芯片,几乎所有复古平台都有它。
[*]真正的特征是硬件包络可独立当波表输出,也可和方波进行AM调制获得特殊BASS音效

2. DCSG(Digital Channel Sound Generator)
德州仪器出的PSG竞品,SN76489


[*]本质:PSG 的同时期竞争对手,删除了硬件包络功能
[*]用在:部分 MSX 扩展卡、老家用电脑、掌机、Sega SMS/GG

3. GB(Game Boy Sound System)
任天堂 Game Boy 的内置音源,俗称 “GB 音”。


[*]芯片:GB DMG 声音单元
[*]用在:Game Boy、GB Color、GB Pocket
[*]声音特点:2 路方波 + 1 路波形 + 1 路噪音,经典的 “Game Boy 味”,单薄、清脆、带点 “滋滋” 感,童年宝可梦 / 口袋妖怪的音乐就是它。
[*]libvgm 地位:独立完整的 GB 核心,模拟度非常准。

4. NES(Famicom APU)
任天堂红白机(FC/NES)的声音处理器,俗称 “FC 音”。


[*]芯片:2A03 APU
[*]用在:NES/FC、盗版红白机
[*]声音特点:2 路方波 + 1 路三角波 + 1 路噪音 + 1 路 DPCM 采样,音色比 GB 更厚、更有力量,超级玛丽、魂斗罗、洛克人的音乐全是它。
[*]libvgm 地位:核心重点芯片,模拟精度极高。

5. SAA(SAA1099)
飞利浦出的早期 PSG 变种,欧洲 8 位机常用。


[*]芯片:SAA1099
[*]用在:SAM Coupe欧洲电脑,创新CMS PC-ISA声卡
[*]声音特点:6 路方波 + 噪音,比普通 PSG 通道多,音色更 “宽”,但还是典型 8 位电子味。
[*]libvgm 地位:小众但经典的欧洲音源。

6. SCC(Sound Creative Chip)
Konami(科乐美)给 MSX 做的 “超级 PSG”,也叫 “Konami SCC”。


[*]芯片:Konami SCC
[*]用在:MSX 科乐美游戏卡带(合金装备、宇宙巡航机等)
[*]声音特点:5 路自定义波形,不是固定方波,能做更柔和、更复杂的音色,8 位机里音质顶级,被称为 “8 位 FM”。
[*]libvgm 地位:高端复古音源代表,玩家很爱它的音色。


梁工 发表于 2026-6-9 11:12:32

应该使用AI8051U或STC32G来做,算力提高好几倍。

另外你可以简介一下你的语音方案是什么,毕竟搞过的人比较少,一看不懂直接划走。

denjhang 发表于 2026-6-9 13:15:01

另外本次开发的亮点,全程使用vscode+claude code+glm5.1 AI全流程开发,里面全部源码都glm写的,我没有写一句,
编译器当然是直接调用keil c251完成编译,现在的ai实在是太强大了。不过当前烧录还是手动打开stcisp进行手动烧录,这也不麻烦。


以下是编译指令可参考:

cd "D:/working/vscode-projects/STC_Chiptune/STC32G12K128" && rm -f *.OBJ ; D:/Keil_v5/C251/BIN/C251.exe scc.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe main.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/l251.exe ay8910.OBJ,scc.OBJ,sn76489.OBJ,gb.OBJ,nes.OBJ,saa1099.OBJ,ym2413.OBJ,main.OBJ TO build/MAIN 2>&1 ; D:/Keil_v5/C251/BIN/OH251.exe build/MAIN "HEXFILE(build/MAIN.hex)" 2>&1 ; echo "BUILD DONE"


C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018
*** WARNING C115 IN LINE 101 OF scc.c: '-' applied to unsigned type, result still unsigned

C251 COMPILATION COMPLETE.1 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

L251 LINKER/LOCATER V4.66.93.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 1995 - 2018
ay8910.OBJ,scc.OBJ,sn76489.OBJ,gb.OBJ,nes.OBJ,saa1099.OBJ,ym2413.OBJ,main.OBJ TO build/MAIN
*** ERROR L210: I/O ERROR ON INPUT FILE:
    EXCEPTION 0021H: PATH OR FILE NOT FOUND
    FILE: AY8910.OBJ

MCS 51/251 OBJECT TO HEX FILE CONVERTER V1.47.0.0
COPYRIGHT ARM Germany GmbH 2000 - 2018

*** ERROR: CANNOT OPEN FILE 'build/MAIN'
BUILD DONE


cd "D:/working/vscode-projects/STC_Chiptune/STC32G12K128" && rm -f *.OBJ ; D:/Keil_v5/C251/BIN/C251.exe ay8910.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe scc.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe sn76489.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe gb.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe nes.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe saa1099.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe ym2413.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/C251.exe main.c "LARGE" "OPTIMIZE(8,SPEED)" 2>&1 ; D:/Keil_v5/C251/BIN/l251.exe ay8910.OBJ,scc.OBJ,sn76489.OBJ,gb.OBJ,nes.OBJ,saa1099.OBJ,ym2413.OBJ,main.OBJ TO build/MAIN 2>&1 ; D:/Keil_v5/C251/BIN/OH251.exe build/MAIN "HEXFILE(build/MAIN.hex)" 2>&1 ; echo "BUILD DONE"

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018
*** WARNING C115 IN LINE 101 OF scc.c: '-' applied to unsigned type, result still unsigned

C251 COMPILATION COMPLETE.1 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018
*** WARNING C153 IN LINE 211 OF nes.c: '==': different spaced pointers (far,xdata)

C251 COMPILATION COMPLETE.1 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

C251 COMPILER V5.60.0.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 2018

C251 COMPILATION COMPLETE.0 WARNING(S),0 ERROR(S)

L251 LINKER/LOCATER V4.66.93.0 - SN: K2DZC-UCLHYC
COPYRIGHT ARM Germany GmbH 1995 - 2018
ay8910.OBJ,scc.OBJ,sn76489.OBJ,gb.OBJ,nes.OBJ,saa1099.OBJ,ym2413.OBJ,main.OBJ TO build/MAIN
Program Size: data=9.1 edata+hdata=256 xdata=3174 const=2758 code=16219
L251 RUN COMPLETE.0 WARNING(S),0 ERROR(S)

MCS 51/251 OBJECT TO HEX FILE CONVERTER V1.47.0.0
COPYRIGHT ARM Germany GmbH 2000 - 2018

GENERATING INTEL H386 FILE: build/MAIN.hex
BUILD DONE

页: [1]
查看完整版本: 全球首款STC8H8K64移植芯片音乐仿真核心工程