How Scanline Studio is built and tested
Scanline Studio has to send pictures that other stations can read, and read the pictures they send. That means matching YONIQ and MMSSTV exactly on the air. This page explains how that is checked, using one real mistake as the worked example.
AI-assisted development
Scanline Studio is developed with heavy use of AI-assisted engineering (Claude Code), including help with porting the C++ code to C#. The AI doesn't decide what is correct. YONIQ's own source code decides, and recordings from a running copy of the legacy program back it up.
The rule: read the matching code
YONIQ transmits and receives through separate code. Transmitting is done by the
TMmsstv::Line… functions in Main.cpp, for example
LineMRT for Martin and LineSCT for Scottie. Receiving uses a
different per-pixel decode switch. Each mode here is ported from the code that does that
job: the transmit code for the encoder and the receive code for the decoder. One is never
inferred from the other.
A worked example: Scottie
In July 2026 the Scottie S1, S2 and DX modes were first added. The transmit structure was worked out from the widths of the receive code's decode branches, not from the transmit function.
That gave the right line duration. The duration was cross-checked against YONIQ's timing
table (CSSTVSET::GetTiming) and the test passed. It also gave the wrong
channel order and the wrong sync position:
What the receive code suggested: sync pulse, red, green, blue.
What LineSCT, the real transmit function, sends: separator,
green, separator, blue, sync pulse (in the middle of the line, not at the start),
separator, red.
The round-trip test passed the whole time. It encodes a picture and decodes it again, and the encoder and decoder agreed with each other. Both were wrong about how Scottie is really framed. Other stations would not have been able to read our Scottie pictures, and our own tests would not have told us.
The mistake was found by reading LineSCT directly. Martin was checked against
its own transmit function, LineMRT, at the same time and was already correct.
Scottie was then rebuilt from the real function.
Two lessons became project rules. Read the matching legacy function for each direction. And treat "the duration matches" and "the round trip passes" as necessary checks, never as sufficient ones.
What the tests compare against
A round trip can't catch a mistake that both halves share. So the tests also use reference data taken from a running copy of the legacy program. These are called golden vectors.
- Receiving. For eight modes, audio was recorded from the legacy program while it transmitted a known picture, and the legacy program's own decode of that audio was saved. Scanline Studio decodes the same audio and the result is compared with the source picture. The allowed difference is set from what the legacy program itself achieves on the same audio, because its own decode isn't perfect either.
- Transmitting. For eleven modes, Scanline Studio's encoder output was played into the legacy program, and its decode was compared with the source picture. Those captures were made before some later encoder changes. Re-capturing them needs a person with a legacy install, and it is still to do.
The data and the tests that use it are in the source repository.
Found a mismatch?
If a mode decodes differently from MMSSTV or YONIQ, or sends something another station can't read, that's a bug. Please open an issue.