Thanks for your interest in contributing. This guide explains how to report bugs, submit reverse engineering findings, and propose improvements.
- Ways to Contribute
- Bug Reports
- Reverse Engineering Contributions
- Pull Requests
- Code Style
- What's Most Needed
- Test files for unmapped areas — Smart Morph, Scene snapshots, FM-X 2nd LFO matrix
- Verification on Montage M hardware — we assume format compatibility but lack hardware verification
- Bug reports for the Forge Librarian tool (the production tool)
- Documentation improvements — clarifications, typo fixes, additional examples
The Performance Editor, translators, and utilities are experimental and provided without active support. Feature requests are appreciated but may not be implemented quickly. Forks and independent development are encouraged.
Please use the bug report template and include:
- The specific file(s) that exhibit the bug (or steps to reproduce without the file)
- Browser and version you're using
- Hardware tested on (MODX M, ESP plugin, Montage M)
- Expected vs actual behavior
If the bug involves a corrupt or unusual .Y2L / .Y2U file, attaching the file (or a minimal reproduction file) helps enormously.
Reverse engineering contributions are highly valued. We use a strict binary-diff methodology to ensure every documented offset has concrete evidence.
- Set up a baseline performance on hardware. We use a stripped-down "Init Voice" with one part — simple defaults, no modulation routing.
- Change exactly ONE parameter via the UI. For example: set OSC1 Pitch to +50 cents, leave everything else untouched.
- Export the file with a descriptive name:
Test-{Engine}_{Section}_{Parameter}_{Value}.Y2L. Example:Test-ANX_OSC1_Pitch_+50.Y2L. - Run a binary diff against the baseline. Any hex-diff tool works (
cmp -l,xxd | diff, HxD, etc.) - Document the finding:
- File offset (or audit offset, if you know the conversion)
- Before/after values
- UI parameter name and section
- Encoding (direct u8, center=64, u16le, etc.)
- Filter out save-counter noise. These bytes change on every save regardless of edits:
abs 22-24, 60-63, 66, 232, 234, 358, 376, 396-399, 488, 654, abs 6715-6716, 6721, 6724-6725, 7167-7168, 7419
Submit findings either as:
- An issue with the test file attached and a description of the parameter mapping, or
- A pull request updating
serializer/ysfc_serializer.pywith the new field
For changes across multiple bytes, or no changes at all for a UI control, it helps to test variations:
- Same parameter at min/mid/max values
- Toggling on/off (for boolean parameters)
- Small step changes (e.g., +1, +5, +10) to detect encoding
For multi-byte fields, look for patterns: little-endian u16 with low byte changing first, center-offset encodings (raw = value + 64 or + 128), etc.
Use the verification level system when documenting findings:
- ★★★★★ — Binary-verified with one or more test files (direct A/B diff evidence)
- ★★★★☆ — Derived from official source data, highly confident
- ★★★☆☆ — Likely correct, not binary-verified
- ★★☆☆☆ — Uncertain
- [INTERN] — MODX-internal firmware constant, not user-editable
- Keep tool changes focused on Forge Librarian unless coordinated with maintainers
- For serializer changes, include the test file name(s) as evidence in the comment
- Update both
serializer/ysfc_serializer.pyANDdocs/YSFC_FORGE_REFERENCE.mdto stay consistent - Preserve the star rating system
Use clear, descriptive commit messages:
Add: AN-X OSC1 Connect field (audit 12670)Fix: FM-X Algorithm encoding off-by-oneDocs: clarify Drum filoffset convention (+669)Verify: AWM2 element 1-8 stride 313 with 8 new test files
- All PRs are reviewed before merging
- For serializer changes, expect questions about test file evidence
- For tool changes, expect questions about browser compatibility
- Vanilla JavaScript, no build step, single-file
- CSS inline or in a single
<style>block - No frameworks (no React, no Vue, no jQuery)
- ES6+ features OK (
const/let, arrow functions, template literals)
- Python 3.8+
- Standard library only (no external dependencies)
- Type hints encouraged but not mandatory
- Follow PEP 8 for general style
- GitHub-flavored Markdown
- Tables for parameter listings
- Code blocks for binary examples (hex, byte offsets)
- Preserve the star rating system across all documents
If you want to contribute but aren't sure where to start, these areas have the most value:
- Smart Morph — completely unmapped area
- Scene snapshots — structure verified, field-level mapping incomplete
- FM-X 2nd LFO matrix — partial mapping needs verification
- Montage M hardware — verify that the format is identical to MODX M
- Performance Editor multi-part support — currently only shows Part 1
- Drum parameter editor UI — structure is mapped, UI is not yet exposed
- Undo/redo in Performance Editor
- Translation of
docs/REVERSE_ENGINEERING.mdto other languages - Improvements to parameter encoding documentation
- More real-world examples of binary diff workflows
Open an issue with the question label, or start a discussion in the GitHub Discussions tab.