Scanline Studio

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.

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.