CPS+
Arranged CD-era soundtracks for CPS-1 & CPS-2 arcade games on MiSTer
From Final Fight CD onward, Capcom kept sending its arcade soundtracks back to the studio. Every CD-based home port got a full re-recording of the music, the 'arrange' versions, produced by the original composers' teams. For thirty years those recordings stayed locked to the home versions. CPS+ puts them where they always belonged, under the arcade games themselves.
On a MiSTer, the real CPS-1 or CPS-2 hardware logic runs the game while the CD-era soundtrack plays the music, started, looped and faded by the game itself, exactly the way Capcom's own console releases timed it. Hit sounds, voices and the announcer stay pure arcade. It sounds like the arcade board grew a CD drive.
Version 1.3 brings the arranged soundtracks to two new Super Turbo projects, Grand Master Challenge and Super Street Fighter II EX: The Ultimate Championship, with either the Anniversary Edition arrangement or the HD Remix soundtrack. It also moves the Final Fight EX and Street Fighter Alpha 2 Gold MRAs onto those projects' latest sets.
- 27 audio packs covering 18 arcade games: every arranged soundtrack Capcom recorded for the CPS line, the SNES and X68000 MIDI scores, the Double Impact and HD Remix arrangements, and Strider's PlayStation remix
- 80 ready-to-play MRAs, so you pick the game from the CPS+ folder and the music is just there
- Runs on a stock MiSTer, with no firmware changes and nothing to configure
- Only tools in the download. Packs build from the discs, disks and albums you already own, in one command
Get started
- Download and unzip the kit.
- Edit builder/discs.toml and point it at the disc rips you own (each entry is optional), or pass them on the command line with --disc mtwins_pce_disc=/discs/chiki.7z. make_packs.py --list shows every pack and the disc it wants.
- Run python3 builder/make_packs.py (Python 3.11+, numpy, ffmpeg). It builds out/mister/, laid out like your SD card. The three X68000 packs also need git, cmake and a C/C++ compiler, and take up to an hour each to render. The Strider pack needs MAME and your PlayStation BIOS set, and takes about five minutes to record.
- Copy the contents of out/mister/ to your MiSTer SD card, merging with what's there. Arcade ROM zips go where they always do.
The download is tools: the MRAs, the three CPS+ cores with their GPL-3.0 source, and the pack builder. It makes the packs on your machine from discs, disks and albums you own, naming anything it skips for want of a disc. It also assembles out/mister/ for you, holding the cores, your packs, and only the MRAs those packs can load, so nothing on the card fails to start.
Five MRA groups pair CPS+ audio with sets that are not stock: the Alpha 2 Gold MRAs load the SFA2 Gold reconstructed sets, the Grand Master Challenge and Super Street Fighter II EX MRAs load those projects' HBMAME sets, ‘Final Fight EX (Arrange)’ loads the Final Fight EX set, and ‘Final Fight 30th Anniversary CPS2 Edition (Arrange)’ loads the CPS2 conversion of Final Fight that the Arcade Offset project distributes. Build the first four with their own kits first (links below).
Game coverage
Every soundtrack is built from one disc, one set of disks, or one album you own. Where a disc came out in several regions, the ones listed below all produce the same pack.
| Arcade game | Soundtrack | Built from |
|---|---|---|
| Final Fightffightu, ffightj, ffightus01, ffightjs01 | Sega CD arrange | Final Fight CD (Sega CD) |
| SNES soundtrack | Final Fight Original Sound Collection (CD audio) | |
| X68000 FM soundtrack | Final Fight Original Sound Collection (CD audio) | |
| X68000 MIDI soundtrack | Final Fight Original Sound Collection (CD audio) | |
| Double Impact remix | Final Fight: Double Impact remixed soundtrack (Download) | |
| Final Fight 30th Anniversary CPS2 Editiona CPS2 conversion of Final Fight, distributed by Arcade Offsetffightae_cps2 | Sega CD arrange (USA disc) | Final Fight CD (Sega CD) |
| Forgotten WorldsLost Worlds in Japanforgottn, lostwrld | PC Engine CD arrange | Forgotten Worlds (PC Engine CD) |
| Ghouls'n GhostsDaimakaimura in Japanghoulsu, daimakai | X68000 MIDI soundtrack | Daimakaimura (X68000) |
| Hyper Street Fighter IIhsf2, hsf2j, hsf2a | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| CPS-1 soundtrack | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) | |
| Magic SwordMagic Sword: Heroic Fantasy in Japanmswordu, mswordj | Double Impact remix | Final Fight: Double Impact remixed soundtrack (Download) |
| Mega TwinsChiki Chiki Boys in Japanmtwins, chikij | PC Engine CD arrange | Chiki Chiki Boys (PC Engine CD) |
| Saturday Night Slam MastersMuscle Bomber in Japanslammastu, mbomberj | FM Towns arrange | Muscle Bomber (FM Towns) |
| Street Fighter AlphaStreet Fighter Zero in Japan and Asiasfau, sfzj, sfza | Saturn arrange | Street Fighter Alpha: Warriors' Dreams / Street Fighter Zero (Saturn) |
| Street Fighter Alpha 2Street Fighter Zero 2 in Japan and Asiasfa2u, sfz2j, sfz2a | Saturn arrange | Street Fighter Zero 2 / Alpha 2 (Saturn) |
| SNES soundtrack | Street Fighter Alpha Anthology (PlayStation 2) | |
| Street Fighter Alpha 2 GoldZero 2 Alpha and Zero 2 Dashsfa2g, sfz2al, sfz2alj, sfz2d, sfz2da, sfa2d | Saturn extended arrange | Street Fighter Zero 2′ or SF Collection Disc 2 (Saturn) |
| Street Fighter II': Champion Editionsf2ceuc, sf2cejc | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| X68000 MIDI soundtrack | Street Fighter II' Champion Edition (X68000) | |
| Street Fighter II': Hyper Fightingsf2hfu, sf2hfj | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| Street Fighter II: The World Warriorsf2uk, sf2jl | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| StriderStrider Hiryu in Japanstriderua, striderjr | PlayStation Sound Remix | Strider (PlayStation) |
| Super Puzzle Fighter II TurboSuper Puzzle Fighter II X in Japanspf2tu, spf2ta, spf2xj | Saturn arrange | Super Puzzle Fighter II Turbo (Saturn) |
| Super Street Fighter IIssf2u, ssf2j, ssf2a | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| X68000 MIDI soundtrack | Super Street Fighter II (X68000) | |
| HD Remix | Super Street Fighter II Turbo HD Remix official soundtrack (Download) | |
| Super Street Fighter II TurboSuper Street Fighter II X in Japan, plus Grand Master Challenge and Super Street Fighter II EXssf2tu, ssf2ta, ssf2xj, ssf2tgmc, ssf2tuc, ssf2xuc | Anniversary Edition arrange | Hyper Street Fighter II: The Anniversary Edition (PlayStation 2) |
| HD Remix | Super Street Fighter II Turbo HD Remix official soundtrack (Download) | |
| UN SquadronArea 88 in Japanunsquad, area88 | SNES soundtrack | Capcom Music Generation: Area 88 Original Soundtrack (CD audio) |
Which disc you need
Under the hood
Nothing in the game is modified. CPS-1 and CPS-2 games post sound commands to their audio hardware, and the CPS+ core watches for them. When one matches the loaded pack, it streams that arranged track and holds the command back from the sound chip. Everything else plays as it always did: hit sounds, voices, the announcer, and the jingles a pack deliberately leaves alone.
The trigger tables were reverse-engineered from Capcom's own console releases and checked against the arcade programs, down to the loop points and fades.
A pack carries the arranged tracks and the table that says which sound command starts each one. The MRA points at the pack, and MiSTer loads it into memory alongside the ROM. A stock MiSTer runs all of this as it comes.
A given disc always produces the same pack, and the builder checks yours against a published hash.
Making your own packs
Community packs are a first-class goal, so the format is documented and the tools ship in the kit. build_pack.py init <game> starts a project; you supply the tracks and say which sound command triggers each one; build_pack.py build produces the pack, which you can listen through, check, and point an MRA at.
Any QSound CPS-2 title is a potential target, and CPS-1 and CPS-1.5 games work too. PACK_FORMAT.md in the kit covers the trigger contract, the pack layout, and how to author one.
FAQ
What do I need installed to build the packs?
Python 3.11 or newer, numpy, and ffmpeg on your PATH. On a Mac: brew install python ffmpeg, then pip3 install numpy. On Linux, use your package manager. 7-Zip is only needed if your rips are .7z archives. The three X68000 packs additionally need git, cmake and a C/C++ compiler (see the X68000 question below). The Strider pack needs MAME as well (see the Strider question below).
Nothing is installed on the MiSTer itself. The kit is plain files copied to the SD card, and a stock MiSTer runs them as-is.
What disc rip formats does the builder accept?
A .cue sheet with its .bin files beside it, a .mds/.mdf pair, or a .zip/.7z archive containing exactly one cue sheet. For the PlayStation 2 sources, point it at the .iso (or a zip containing it). The two CD-audio sources (the Final Fight OST and the Area 88 soundtrack) are folders of .flac or .wav files instead of a disc image. The X68000 games are a zip of their .dim or .xdf floppy images. The two album sources are the downloads themselves: Capcom's Double Impact zip, as downloaded or unpacked, and the OC ReMix folder holding the FLACs. The Strider PlayStation disc can be .chd, or .cue with its bins.
CHD rips need converting back first with chdman extractcd, since the builder doesn't read CHD directly.
A pack failed hash verification. What now?
It almost always means the disc isn't one of the supported releases listed above, or the rip is damaged. Check which release you have, re-rip if in doubt, and run make_packs.py again. A nonstandard ffmpeg build can also encode slightly differently; the stock Homebrew or distro ffmpeg matches the published hashes.
The builder won't stage a pack that fails, so a bad rip can't reach your SD card. There's a --no-verify flag if you want one anyway.
What do the X68000 soundtracks need, and why are they different?
The X68000 ports of Ghouls'n Ghosts, Street Fighter II' Champion Edition and Super Street Fighter II shipped their music as MIDI, meant for a Roland SC-55 on the desk next to the computer. There is no recording to copy, so the kit renders one on your machine, the same way the published packs were made: your disk images, your SC-55 ROM set, and a cycle-accurate SC-55 emulator built from source at a pinned revision.
That means git, cmake and a C/C++ compiler (Xcode's command-line tools on a Mac, build-essential and cmake on Debian or Ubuntu), a one-time build of a few minutes, and then ten minutes to an hour of rendering per game. The result is hash-checked like every other pack. The kit's X68000.md walks through it.
The published packs were rendered and rebuilt byte-for-byte on a Mac. Whether the emulator's output is bit-identical on every CPU has not been proven; if it isn't on yours, the builder stops at the hash check rather than staging different audio.
What does the Strider pack need, and why is it different?
The PlayStation port's Sound Remix music is sequenced and played by the game's own sound driver through the console's sound chip, so there is no recording on the disc to copy. The kit makes one: MAME boots your disc, walks into the game's sound test, plays the ten performances and records the console's output. The builder then cuts the reviewed performances from that recording and checks each against its published hash.
That means MAME installed (brew install mame on a Mac, your package manager on Linux, the official build on Windows), your Strider (USA) disc as .chd or .cue, and MAME's PlayStation ROM sets, psu.zip and psx_cd.zip, in a folder you point discs.toml at. The recording takes about five minutes. The kit's PSX.md walks through it.
The pack was verified with MAME 0.288 from Homebrew on a Mac and with the official Windows build. Those two record a few samples a tiny, inaudible step apart, so the kit accepts both and checks each against its own hashes. If your MAME build renders differently, the builder stops at the hash check rather than staging different audio.
Will this touch my existing MiSTer setup?
No. The CPS+ cores have their own names and the MRAs live in their own folder, so your existing cores, MRAs and ROMs are untouched. To remove it, delete the _Arcade Patches folder, the three cores and games/CPS+.
Is any of the music in the download?
No, the kit is tools only. Every pack is made on your machine from a disc you own.
Do the packs work in MAME or on a real arcade board?
No. CPS+ is a MiSTer feature: the streaming player lives in the FPGA cores and the pack loads into the MiSTer's DDR memory. Everywhere else the games just play their stock music.
The companion projects do cover other targets: SFA2 Gold, Final Fight EX, Grand Master Challenge and Super Street Fighter II EX all ship HBMAME sets. See their pages, linked below.
I built the 1.2 packs. Do I need to rebuild them for 1.3?
No. Every pack you built with 1.2 still works with 1.3. Three packs (the two Double Impact remixes and HD Remix) have new reference hashes, because they now build to the same bytes on every computer, but the difference is inaudible and the files are the same size. Copy the new MRAs to your card.
If you use the Gold, Final Fight EX or Grand Master Challenge MRAs, rebuild those sets with their projects' latest kits: the MRAs now expect the new sets.
I built the 1.1 packs. Do I need to rebuild them for 1.2?
Six packs changed. The three Final Fight soundtrack packs (SNES, X68000 FM and X68000 MIDI) now start their opening where the arcade's own song starts, in both regions, and leave the phone ring to the board. The three Super Street Fighter II packs (Arrange, Turbo Arrange and X68000 MIDI) now let the QSound logo jingle play from the arcade board. Ten SSF2-family MRAs also changed, carrying each region's factory EEPROM defaults.
Drop the 1.2 kit over your old one, add the new sources to discs.toml, and run make_packs.py again. Every pack it builds is checked against the published hashes, so the six changed ones come out corrected and the rest come out identical, and out/mister/ picks up the new MRAs. The other 17 packs and the three cores are unchanged, hash for hash.
Release history
1.3b (2026-09-19)
- A second player joining at the character select no longer kills the music. The board borrows the music channels for the “Here comes a new challenger” stinger and hands them back; the packs read that as a new song, so the arranged track stopped and nothing restarted it. Affects the Street Fighter II family: Super Street Fighter II, Turbo, Hyper, and the X68000 and HD Remix soundtracks. The board's own stinger is heard under the arranged music, and HD Remix's arranged stinger is no longer in the pack.
- Fixes the pack builder: building any of the three album-sourced packs (Final Fight and Magic Sword Double Impact, Super Turbo HD Remix) stopped with a KeyError at the last step. The packs themselves are unchanged — each still builds to the same bytes as before.
- The kit's README now states the version it was built as.
1.3 (2026-09-17)
- Super Street Fighter II Turbo: Grand Master Challenge, with the Anniversary Edition arrangement or the HD Remix soundtrack, loading the restoration's HBMAME set.
- Super Street Fighter II EX: The Ultimate Championship, USA and Japan, with the same two soundtracks. The bonus stages keep the board's own music.
- Final Fight (Arrange + CD Cutscenes) is now Final Fight EX (Arrange), and loads the Final Fight EX rc2 sets.
- The Street Fighter Alpha 2 Gold MRAs load the rc3 sets.
- Builds on Windows: paths pasted straight into discs.toml work, the X68000 tools build with MinGW or Visual Studio, .zip and .7z sources both work, and the Strider pack records and verifies with MAME's official Windows build.
- Every pack now builds to the same bytes on any computer. The Double Impact and HD Remix packs used to come out slightly different on Intel and AMD PCs; their reference hashes change by an inaudible amount, and a pack you already built keeps working.
- If a pack doesn't verify, make_packs.py now tells you which disc track differs and why (a different rip, a read offset, a missing track), and fixes rips that are only shifted. --check-inputs checks your discs without building.
- Six new MRAs (80 in all). The three cores are unchanged.
1.2 (2026-09-10)
- Final Fight and Magic Sword with the remixed soundtracks from Final Fight: Double Impact (Simon Viklund; Melssen and Thunberg), built from Capcom's free 2010 soundtrack download. Final Fight's is one pack for both regions.
- Super Street Fighter II and Super Street Fighter II Turbo with the OC ReMix soundtrack from Super Street Fighter II Turbo HD Remix, built from OC ReMix's official FLAC release.
- Strider with the Sound Remix performances from its PlayStation port, recorded from the game's own sound test with MAME on your machine.
- Fixes: the three Final Fight soundtrack packs (SNES, X68000 FM and X68000 MIDI) now start their opening where the arcade's own song starts, in both regions, and leave the phone to the board; the Super Street Fighter II packs let the QSound logo jingle play from the arcade board; the SSF2-family MRAs carry each region's factory EEPROM defaults.
- Twelve new MRAs (74 in all) and four new packs (27 in all). Six existing packs changed (see the FAQ); the other 17 packs, their MRAs and the three cores are unchanged.
1.1 (2026-09-01)
- UN Squadron / Area 88 with the Super Famicom soundtrack, built from the Capcom Music Generation: Area 88 CD (FLAC or WAV).
- X68000 MIDI soundtracks for Street Fighter II' Champion Edition, Super Street Fighter II and Ghouls'n Ghosts / Daimakaimura, rendered on your machine from your own X68000 disk images and SC-55 ROMs.
- Final Fight 30th Anniversary CPS2 Edition with the Sega CD arrangement, from the same US Final Fight CD as the CPS-1 pack.
- Ten new MRAs (62 in all) and five new packs (23 in all). The eighteen 1.0 packs, their MRAs and the three cores are unchanged, so nothing needs rebuilding.
1.0 (2026-08-25)
- First public release.
Source & related projects
- strygo/jtcores (cpsplus branch), the CPS+ core fork: RTL, integration patches, pack format spec, and full GPL-3.0 source for the shipped RBFs
- jotego/jtcores, the upstream CPS core project CPS+ builds on
- Arcade Offset, the MiSTer distribution of the Final Fight 30th Anniversary CPS2 Edition conversion that the 30th Anniversary Arrange MRA pairs with
- Final Fight: Double Impact remixed soundtrack, Capcom's free release of the Double Impact remixes the Final Fight and Magic Sword packs are built from; the direct download link is in the kit's discs.toml
- OC ReMix: Super Street Fighter II Turbo HD Remix Official Soundtrack, the album the HD Remix packs are built from
- OCRA-0012 official torrent, the FLAC set, from OC ReMix's own tracker
- MAME, records the Strider PlayStation sound test for its pack; verified with 0.288 on a Mac (Homebrew) and on Windows (the official build)
- Street Fighter Alpha 2 Gold, companion project: the reconstructed Gold sets that the Gold Arrange MRAs load
- Final Fight EX, companion project: the cutscene backport set that the Final Fight EX (Arrange) MRAs load
- Super Street Fighter II Turbo: Grand Master Challenge, companion project: the English restoration of Japan's Super Turbo that the Grand Master Challenge MRAs load
- Super Street Fighter II EX: The Ultimate Championship, companion project: the enhanced Super Turbo that the SSF2 EX MRAs load
- Nuked-SC55 (float build), the SC-55 emulator the X68000 MIDI packs are rendered with, built from source at a pinned revision
- ValleyBell/ExtractorsDecoders, the X68000 music-bank decoders, built from source at a pinned revision
Notes
- The arranged recordings remain © Capcom and are never distributed here. Every pack is built from your own discs, disks, albums and ROMs.
- Sound effects, voices and the announcer always play live through the original arcade audio path; packs substitute music only, and a few cues deliberately pass through to the arcade board's own music.