The King of Fighters '98 songs played two ways through the same YM2610 emulator: Real driver is every register write SNK's Z80 sound driver made in MAME, Model is our reading of that driver re-playing the song data from the M1 ROM. Switch between them while it plays; the playhead keeps its place in the music.
Click a block to hear that note on its own and see the song data behind it: the note, and every command the channel read since its previous note (instrument, volume, pan, loops, calls).
Chip. Both sources run through ymfm's YM2610 (Geolith's C port, the core our emulator uses), compiled to WebAssembly and running in this page, with the ADPCM samples from the KOF98 V ROM. Nothing here is a recording.
Real driver: the register writes captured in MAME while the game's own Z80 driver played the song, placed at the timer interrupt they happened in.
Model: tools/kof98snd/song98.py + regs98.py, the driver re-implemented from its disassembly, reading the song data from the M1 ROM. For each song the facts line says on how many sequencer ticks its register writes are identical to the real driver's, same values, same order.
Timing. The capture only knows which interrupt (6 ms) a write fell in, so both sources space the writes of a tick by an estimated 6.4 samples each. The real driver loses an interrupt when a tick has too many writes; the model estimates those losses, so its clock can drift by a fraction of a second over a long song. A/B switching jumps to the same tick, not the same second.
Keys: Space play / stop, T switch source, M on a track button mutes, S solos. While stopped, clicking a block generates that note on its own: the chip set to its state at that moment, only that note keyed on, played through its release.