pysidtracker
Shared base for the pure-Python C64 SID tracker parsers (pygoattracker, pysidwizard, pydmcsid, pyfuturecomposer, pymusicassembler, pydefmon, pyjch, pysoundmonitor).
Reads .sid containers (PSID/RSID) and bare .prg images into a 64 KiB C64
memory model, and detects packed/relocating playroutines by running the tune's
init in a 6502 emulator — container headers are not trusted. Each format
package subclasses BaseSidParser for a consistent read / parse / detect
API.
Components
parse_sid_header/SidHeader— PSID/RSID container header parsing.SidImage— a loaded 64 KiB C64 memory image with absolute-addressed accessors, from a.sidcontainer or a bare.prg.read_bytes— path /bytes/ file-like source dispatch.SidErrorhierarchy —SidParseError,SidFormatError,EmulatorUnavailable.detect_playroutine/PlayroutineKind— static signature recognition, then an emulated init run to classifyDIRECT/RELOCATED/PACKED/UNKNOWN.BaseSidParser— the base class each format subclasses.CodePattern/find_code_all/find_code_first— masked 6502 code-fragment search with operand capture.registers— C64 hardware register map (SID/CIA/VIC, IRQ/NMI and CPU vectors) with predicates andfind_register_stores.trace_init/InitTrace— run a tune's init under a write observer to report CIA timer cadence and the IRQ/NMI vectors an IRQ-driven header hides.emu— the shared jennings host every init/replay path runs on:wire_mpu(NMOS illegal opcodes + cycle-derived VIC/SID reads),patch_illegals,run_to_rts.playroutine_cadence/Cadence/TriggerSource— derive the play-routine cadence (PAL/NTSC video frame vs CIA-timer latch) from what init programs, not the header.native_decrunch— native exomizer unpack (pydexomizer), an init-free alternative depack path; opt-in viadetect_playroutine(..., native=True).reglog—RegWriteregister-log format (read_reglog/write_reglog) andframe_writes, the shared per-frame SID-write framing loop.oracle— per-frame SID register grids:register_grid(jennings), the stdlibgrid_from_writesframer,read_sidwr(preframr-sidtrace.sidwr.bin),aligned_match, and thesidtrace(sidplayfp) oracle bridge —run_sidtrace,read_sidtrace,sidtrace_cadence,sidtrace_grid.testing— HVSC tune fetch/resolve for test suites (fetch_tune,resolve_tune,make_tune_fixtures), andmake_oracle_fixtures/oracle_grid— a reusable byte-exact player-vs-sidtrace-oracle test (docs/oracle-testing.md).audio—render_player_wav/render_player_samplesdrive aMemPlayerstraight to WAV through an emulated SID (pyresidfp, a core dependency); the lower-levelrender_wav/render_samplestake a bare write stream, plusresolve_device/seconds_to_frames.- Writers —
SidHeader.to_bytes/write_psid/SidImage.to_prg(the inverse of the parsers),parse_prg, andencode_cstr/decode_cstr. SidImageabsolute-address accessors —byte_at/word_at/contains/poke, relocation-safe and bounds-checked.mos6502— shared 6502 primitives:OP_LEN, opcode-class sets,s8/adc/sbc,SidWriteCapturingMemory,walk_until.MemPlayer— per-frame register-diff player scaffold; subclasses implement_init/_frame.register_writes_from_playerdrives it to a reglog.notefreq—NoteFreqTable, computed PAL/NTSC pitch tables, andlocate_note_freq(find hi/lo tables from paired absolute-indexed reads).make_package_errors— per-package error hierarchy factory whose*ParseError/*FormatErrorsubclass the base ones, so baseexceptclauses catch them.formats/maincli— the onepysidtrackerCLI (info/reglog/wav) that discovers installed formats through thepysidtracker.formatsentry-point group and runs against each format's parser + player, plus any subcommands it contributes. A format package registers aSidFormatinstead of shipping its own CLI.cliholds the underlying argparse scaffold (run_cli,print_info,add_reglog_command,add_wav_command).registersadditions —SID_VOICES, voice/global register indices, and theattack_decay/sustain_releaseADSR nibble packers.resolve_entry_points/is_jmp_vector,cadence_from_latch, and theByteCursor/check/byte_rangeparse helpers.
Install
pip install pysidtracker # core: jennings (init emulation), numpy, pyresidfp (WAV render)
All dependencies are core: jennings (detection runs a tune's 6502 init), pydexomizer
(native_decrunch unpacks exomizer-packed images natively), pyresidfp (the
emulated SID the WAV render drives), and numpy (sample buffers and the image
anchor scan).
Usage
from pysidtracker import BaseSidParser, PlayroutineKind
class MyParser(BaseSidParser):
def recognize(self, image):
return image.find(b"MYSIG") # truthy anchor when found
def parse(self, data, **kw):
image = self.load_image(data) # .sid or .prg -> SidImage
... # decode image.mem into a model
det = MyParser().detect("tune.sid")
if det.kind is PlayroutineKind.PACKED:
... # header was not trustworthy
Development
pip install -e ".[dev]"
pytest --cov=pysidtracker
See docs/design.md for the detection model and shared primitives.
License
Apache 2.0 — see LICENSE.
Metadata
Release files for pysidtracker 0.10.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pysidtracker-0.10.1.tar.gz | 101.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pysidtracker-0.10.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 180.0 kB
Release files / pysidtracker-0.10.1.tar.gz
| Download URL | pysidtracker-0.10.1.tar.gz |
|---|---|
| Size | 101.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e0ff5eab66b445ce6745e0a2757f6c7e66ac35cf115f3d7e2d4a8fcc7afb1de8
|
|
BLAKE2b-256 checksum How to use checksums |
74fd93b9bb0c5bcafa4ac39ba1dad7c64b28c8b36b61aa119b25f24ee3d694b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency logRelease files / pysidtracker-0.10.1-py3-none-any.whl
| Download URL | pysidtracker-0.10.1-py3-none-any.whl |
|---|---|
| Size | 78.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a3451dafda830d73fc76dfb53e48b0a87e0e9ad7c20198e8392d1b1f9e86c9da
|
|
BLAKE2b-256 checksum How to use checksums |
2c32e39d6d0de0a15908beba999f69a0983181962f46c4a3274aa217060a1306
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.
Transparency log