The window is one piece: a title strip, a toolbar, a canvas with an inspector beside it, a bottom panel of three data columns, and a status bar. Every divider between those areas is draggable, and the sizes you set are remembered.

1. Title strip
A 36 pt strip at the very top. The macOS traffic lights float over its left
end; the centre shows the Midtone Lab mark, the app name, and — once an
image is open — a middle-truncated filename after an interpunct:
StepWedgeDensitone · raw-2026-08-03-0001.dng. The strip is a label only;
nothing in it is clickable.
2. Toolbar
A 44 pt row of actions, in five groups separated by hairline dividers: the file and rotate buttons, the cell-order cluster, the zoom chip, the session and export controls, and the theme toggle at the far right.

| Control | What it does |
|---|---|
| Open Wedge | Opens a file panel for the scan. PNG, JPEG, TIFF, GIF, BMP, HEIC/HEIF and Apple-supported RAW (DNG, NEF, CR2/CR3, ARW, ORF, RAF, RW2). |
| ↺ / ↻ | Rotate the working image 90° counter-clockwise / clockwise. The quad, every measured point, the per-cell offsets and the step-0 corner rotate with it; the file on disk is untouched. Disabled with no image. |
Detection is deliberately not here. It used to be, and the toolbar copy was the easier one to reach first — so the common mistake was detecting before entering the layout, then wondering why the pickers had changed. Both detect actions now live in the inspector’s Measurement section, beside the Cols / Rows / Steps values they depend on.
Cell-order cluster
Five compact buttons that describe how the step index walks the grid. They are disabled until a quad exists, because there is nothing to re-order before that.
- The first button is the axis toggle.
↕means the step number advances down a column first (column-major);↔means it advances along a row first (row-major). Clicking switches to the other. - The four arrow buttons pick which physical corner of the quad holds
step 0 —
↖top-left,↗top-right,↙bottom-left,↘bottom-right. The active corner is filled orange.
There is nothing to re-order until a detect in the Measurement section — or a Shift+⌘+drag — has produced a quad, which is why the cluster starts disabled.
Changing either one re-derives every cell centre from the quad and clears per-cell nudges, since those were attached to the old step numbering.
Zoom chip
| Button | Action |
|---|---|
| − | Zoom out one step |
| Fit / 133% | Shows the current zoom; click to snap back to fit-to-window |
| ⧉ | Fit to wedge — frames the detected wedge instead of the whole scan. Disabled until a quad exists (detect, or place corners, first). |
| + | Zoom in one step |
Zoom ranges from 10 % to 800 %. Zoom is deliberately not saved in the session: opening an image always starts fit-to-window.
Session and export group

-
Open Session — a pull-down listing your five most recent
.wdgesessions (the one currently open carries a checkmark, unreachable files are dimmed and marked “(missing)”), then Browse… and Clear Recents. The list is rebuilt and re-validated every time you open it. -
Save Session — writes back to the open
.wdgein place, with no panel. The first save after launch, or after opening a different image, has nothing to write back to and asks for a location. The chevron beside it holds Save Session and Save Session As…. -
Export — a pull-down of everything the app can write out:
Item Output Generate PDF Report… Multi-page print-ready analysis sheet Generate CSV Report… Per-step table for spreadsheets Export Reports for Sessions… A PDF report for every .wdgein a folder, in one passSave Adjusted Values… Tab-separated GRAY / LAB_L / LAB_A / LAB_BtableSave Adjusted Curve… The corrected Photoshop .acvExport ICC Profiles… Two grayscale profiles for soft-proofing
Right end
After a save, a pill reads Session saved · just now, counting up to
Ns ago, Nm ago, then a while ago; it refreshes every 30 seconds. At
the far right, a sun/moon button toggles between the light and dark themes.
3. Value strip
A one-line monospace readout above the canvas.

The left half shows the selected step’s value — a six-decimal scalar and the
same number as an RGBA tuple. The right half restates the current layout
(3 × 17 · 51 points) and the working colour depth (16-bit · sRGB).
4. Canvas
The scan sits in a rounded, faintly striped panel that is also a drop
target: drag an image file onto it to open it, or a .wdge file to restore
that session. While a drag hovers, the panel border turns orange.
With no image loaded the panel shows a placeholder:

With an image loaded, the canvas scrolls and zooms, drawn without smoothing so individual scan pixels stay honest at high zoom.

Overlays, from back to front:
- Quad outline — a dashed rectangle through the four corners of the printed wedge.
- Measurement circles — one per step, each labelled with its step percentage. Hidden by Hide result in the inspector without discarding any data.
- Corner handles — colour-coded so you can tell which is which at a glance: top-left orange, top-right green, bottom-left blue, bottom-right red.
- Selection rectangle — the dashed box drawn while Shift+⌘+dragging.
Canvas gestures
| Gesture | Effect |
|---|---|
| ⌘ + click | Write the sampled value under the cursor into the selected step, then advance to the next step |
| Shift + ⌘ + drag | Lay out the whole grid inside the rectangle you drag. The corner you start from becomes the step-0 corner. |
| Drag a corner handle | Move that corner of the quad; every cell centre re-interpolates |
| Drag a measurement circle | Nudge that one cell off a dust speck; the nudge survives later corner moves |
| Drag empty canvas | Moves every measurement point together, as a group |
| ⌘ + scroll | Zoom around the cursor |
| Pinch | Zoom |
| Esc | Cancel the fill wizard |
Under the canvas
A status badge reports where the current geometry came from — · untouched,
⚠ auto-detected, or ✓ manually adjusted — followed by a live
RGBValue readout that follows the pointer, and a one-line reminder of the
three canvas gestures.
5. Inspector
A scrolling column of six sections on the right. Drag its left edge to resize it (280–440 pt).

Measurement
This section owns detection, and its three pickers are ordered the way you fill them in — Cols, then Rows, then Steps: the first two describe the sheet in front of you, and the step count follows from them.
| Control | Notes |
|---|---|
| Cols | 1, 7, 8, 11, 13, 17, 21, 31, 41, 51 |
| Rows | 1, 2, 3, 7, 8, 10 |
| Steps | 5, 10, 11, 12, 14, 21, 31, 37, 41, 51, 101, 129, 256 |
| Status | UNTOUCHED before any detection, DETECTED · N PTS after |
Under them, a hint line — Set Cols, Rows and Steps above, then Detect Corners — and four buttons in a 2 × 2 block, the two detect actions down the left edge with their smaller companions flush right:
| Button | What it does |
|---|---|
| Detect Corners | Finds the wedge outline and keeps your Cols / Rows / Steps, re-deriving each cell centre from the detected quad. It leads because it honours what you just entered |
| Show result / Hide result | Toggles the measurement overlay on the canvas |
| Detect Corners and Steps | Detects the outline and the layout, overwriting the three pickers. The fallback for a wedge whose layout you do not know |
| Clear | Destructive: drops the quad, the cells and every reading |
Both detect buttons are tinted: they are two halves of one choice, not a primary and a lesser path. Which one you want depends only on whether you already know the layout.
The three pickers are independent — changing one never silently rewrites the
others. The only constraint is that the grid must hold the steps, so
changing one axis bumps the other when cols × rows would fall below the
step count. When a detection can’t be applied exactly as predicted, a note
appears under the block explaining the difference — “Detector read 51 steps
in 17×3 — kept your 21 in 7×3”.
Image
| Control | Range | Effect |
|---|---|---|
| Blur | 0 – 10, step 0.1 | Pre-blur used to suppress scanner grain |
| Edge | 0 – 10, step 1 | Strength of the Metal Laplacian edge pass |
| Radius | 5 – 40, step 1 | Radius, in pixels, of the disc averaged at each measurement point |
| Display | Processed / Raw / Edges | What the canvas draws: the blurred image, the untouched scan, or the edge map |
Sliders apply when you release them, then the canvas repaints and every patch is re-sampled. Blur and Edge exist to help you and the detector see patch boundaries; reports always use the unprocessed scan.
Processing
- Mode — Gaussian, Median, or Savitzky-Golay smoothing of the measured series.
- Smoothing — 0 to 10: the Gaussian sigma, or the half-window for the other two.
Changing either recomputes the normalized values, the adjusted curve, the graph, and the statistics immediately.

Curve
Load .acv opens a Photoshop curve; Unload drops it and returns to a straight line; Save writes the adjusted curve to a location you pick. Below the buttons, a chip names the loaded curve — click it for a menu of the five most recently used curves, plus Browse… and Clear Recents. With nothing loaded it reads No curve loaded.
Print Process
Method and Paper are free-text fields with a preset menu on the chevron (Platinum/Palladium, Palladium, Kallitype, Cyanotype, Van Dyke Brown, Salted Paper, Ziatype, Gum Bichromate, Carbon Transfer, Argyrotype; Bergger COT320, Arches Platine, Hahnemühle Platinum Rag, Hahnemühle Photo Rag, Revere Platinum, Fabriano Artistico). Anything you type is accepted. These values are saved in the session, printed on the reports, and folded into the description of exported ICC profiles.
Notes
A free-form note for the print — exposure, humidity, coating batch, developer dilution, what went wrong. It is saved in the session and printed on the PDF and CSV reports. Unlike Method and Paper it describes one specific print, so it is cleared when you open a different wedge image.
6. Bottom panel
Three columns, each with its own draggable divider. The whole panel’s height is adjustable from 200 to 600 pt.

Step table

The header counts the steps (STEPS · 51) and offers Detail panel…,
which opens the Step Detail window. Then one 22 pt row per step:
| Column | Meaning |
|---|---|
| • | Orange when the row is selected, green when the step has a reading, grey when it does not |
| STEP | The step’s nominal percentage |
| TONE | Three swatches — scanned, normalized, target — painted as the tones they are, so a drifting step reads as a visible mismatch |
| RAW | The value sampled from the scan |
| NORM | After smoothing and rescaling to the measured range |
| Δ | Normalized minus the ideal target. Green within ±0.015, neutral to ±0.04, red beyond |
Hovering highlights a row and marks it on the graph; clicking selects it, and a selection made anywhere — table, canvas or graph — scrolls the table to it.
Response curves

The header carries live γ and σ readouts and an expand button. The plot is square, with the step percentage on X (0 % = paper white end) and a 0…1 scale on Y.
Two conventions share the plot, exactly as alt-process workers are used to reading them:
- Raw, Normalized and Target are print-density series — paper white at the top left, maximum black at the bottom right, so a linear print is a descending diagonal. The shaded band between Raw and Target is the error you are correcting.
- Curve and Adjusted are Photoshop-Curves series — identity is the ascending diagonal from bottom-left to top-right. They describe what the digital negative does, not what the paper did.
A grey dashed diagonal marks the identity reference. Hovering a step draws a dashed crosshair and a ring; the selected step keeps a solid ring.
The five pill toggles below (Raw, Normalized, Target, Curve, Adjusted) show and hide each series; Target draws dashed. The expand button opens a 900 × 720 sheet with the same plot at inspection size, sharing the same toggles and selection:

Statistics

| Row | Meaning |
|---|---|
| White reading | The lightest patch’s raw value — the paper-white end, including base + fog |
| Black reading | The darkest patch’s raw value — the deepest black the process produced |
| Reading spread | White reading − black reading: a plain difference on the 0–1 reading scale, where high means light |
| Density range | log₁₀ of the ratio between those two, linearized first — the log-density figure a densitometer or a scanner’s D-range spec quotes. It is relative: with no reference target in the scan, the lightest patch is the zero-density anchor, so a densitometer reading of the same print differs by that patch’s own base + fog. Reads — when the black end clipped to zero |
| Mid-tone | The raw value of the step nearest 50 %, with that step’s percentage |
| γ (raw) | Power-law slope fitted to the measured response. 1.0 is linear |
| γ (adjusted) | The same fit against the correction curve being exported |
| σ (residual) | RMS distance of the normalized readings from the ideal straight line — the single number for “how linear is this print” |
| Points | How many steps are in the table, with the grid that holds them |
When a step is selected, its percentage appears in the header and a SELECTED STEP card at the bottom repeats the step, raw and normalized values at four decimals.
7. Status bar

A 24 pt strip: a gesture reminder on the left, and — whenever a step is selected or hovered — that step’s percentage, its value to six decimals, and the value as an RGBA tuple on the right.
Secondary windows
-
Step Detail — a plain-text dump of every measurement, selectable and copyable, useful for pasting into a spreadsheet or a lab notebook. Opened from Detail panel… or the Window menu.

-
Acknowledgments and Privacy Policy — from the Help menu.
Menu bar
File
| Item | Shortcut |
|---|---|
| Open Session… | ⇧⌘O |
| Open Recent Session ▸ | — |
| Save Session | ⌘S |
| Save Session As… | ⇧⌘S |
| Close Session | — |
| Export Reports for Sessions… | — |
There is no New Window. WindowGroup adds one on the assumption that a
second window is a second document, and here it is not: the session lives in
a single app-wide object that every window renders, so the “new” window came
up showing the wedge already open in the first. Close Session is what
starts the next scan from an empty canvas. Closing the last window still
leaves the app running, and clicking the Dock icon creates a fresh one.
Display — Fill and adjust measure points ▸ 51 points 3x17 (wizard) starts the two-click fill wizard. It is only available when the step count is 51.
View
| Item | Shortcut |
|---|---|
| Dark Theme | ⌥⌘D |
| Light Theme | ⌥⌘L |
| MidtoneLab Theme | — |
| System Theme | — |
| Zoom In | ⌘+ |
| Zoom Out | ⌘− |
| Actual Size | ⌘0 |
| Fit to Window | ⌘9 |
Help — Acknowledgments, Privacy Policy.
The active theme is greyed out in the View menu, so the menu also tells you which one you are in. System Theme follows the macOS appearance and flips live.
