spektrafilm

Technical information
description
simulates the physical process of developing and printing analog film, using spectral emulsion and paper data from the spektrafilm project.
purpose
creative.
input
linear, RGB, scene-referred.
processing
non-linear, RGB.
output
non-linear, RGB, display-referred.

Recreate the look of a film stock printed onto darkroom paper.

Most film emulations are a color recipe: someone photographed a scene on film, measured how the colors moved, and saved that as a curve or a LUT. This module works the other way round. It starts from laboratory measurements of what real film and real paper are made of – how sensitive each color layer is to each wavelength of light and how much dye each one produces – and simulates what physically happens to a photograph, step by step:

  • light from the scene falls on the film and exposes its three-color layers,
  • development turns that exposure into dye, with the layers chemically interfering with one another as they do in a real tank,
  • an enlarger shines light through the developed negative onto a sheet of paper,
  • the paper develops in turn, and the finished print is scanned.

Grain, halation and diffusion filters are simulated as things that physically happen along the way.

Because the module simulates the physical properties of light and its interaction with film exposure and the printing process, the same film and paper render differently under different lighting. Tungsten light and midday sun will not simply differ in white balance.

The measurement data comes from the spektrafilm project by Andrea Volpato.


Note: Like other view transforms, modules placed before spektrafilm in the pipeline operate in scene-referred space. Modules after it work in display-referred space.


🔗usage

install the data first
The module needs a data pack – the film and paper measurements it works from – and cannot render anything without one. If none is installed, the module shows a single button that downloads it, and the rest of the controls appear once that finishes. Packs are checked against a checksum before being installed and are stored alongside your configuration, so they survive clearing the cache.
only use one display transform
Never use spektrafilm together with another display transform module (i.e. filmic rgb, sigmoid, AgX or base curve) – spektrafilm performs the film’s own tone mapping as part of simulating development and printing.
start simple
Choosing a film stock is enough. Everything else already carries a sensible value taken from that film’s own measurements, and the paper follows the film automatically. The tabs are for fine-tuning.
auto print exposure changes what film exposure does
Out of the box, film exposure behaves like leaving the enlarger on for a fixed time: expose the film more and the print comes out brighter. Switch on auto print exposure and it stops doing that, because print exposure now compensates automatically – which is what a real printer does, aiming for consistent print density however the negative was exposed. film exposure then changes only color and grain by moving the scene to a different part of the film’s response.
some print stocks need manual print exposure
A few print stocks respond only to a very narrow slice of the spectrum – the duplicating and release print films (Kodak 2302, 2383, 2393) rather than the ordinary papers. auto print exposure can misjudge these. If a print looks implausibly dark or bright with it on, correct it with print exposure compensation or leave auto off for those stocks.

🔗module controls

Film stock, print paper and film format are always visible at the top. Everything else is grouped into tabs, one per stage of the physical process: film, print, grain, halation, and scanner.

film stock
The film to simulate.
print paper
The paper to print onto. Left on auto it follows the film stock’s own intended paper, and names which one that currently is – for example auto (Kodak Portra Endura). Choose a paper explicitly and it stays put when you change film.
format
A preset picker for common frame sizes (half-frame, 35mm, 6x6, 6x7, 6x9, 4x5, 8x10, Super 8, 16mm, Super 16, Super 35, VistaVision, 65mm 5-perf, IMAX 15-perf, or custom), which sets frame long edge below. The preset names a film gauge (35mm) while the slider gives the frame’s long edge (36mm); both describe the same format.
frame long edge
The real-world width of the simulated frame, in mm. This is the physical scale everything else is measured against, so grain, scatter, halation and diffusion all come out proportionally larger on a smaller format at the same print size – just as they do in reality.

🔗film

🔗exposure

film exposure
Exposure adjustment at the film stage, in EV. With auto print exposure on this no longer changes overall brightness (see usage above), but it still changes color and grain because it moves the scene to a different part of the film’s response.
scan the film (skip print)
Look at the developed negative or slide directly instead of printing it. Switches on by itself for slide and reversal stocks and off again for negative stocks; you can override it either way afterward.
push/pull
Shooting the film at a speed other than the box says, then compensating in development, in stops. Positive values push (shoot darker, develop longer) negative values pull. An approximation, since the real result depends on the specific developer, which is not simulated. Stacks with the chemistry controls below.

🔗chemistry

development time
How long the film is developed, in minutes. Only a few black & white stocks were measured at more than one time – Kodak Double-X at 4, 5, 6.5, 9, and 12 minutes, for instance – so the slider is grayed out for color films and for anything measured only once. Values snap to the times actually measured, and 0 means the stock’s standard development.
development gamma
Overall development contrast, as though you had developed for longer or shorter. 1.0 is normal.
fast layer gamma
Contrast of the most light-sensitive layer alone. Real film has several layers of differing sensitivity, and a change in development does not affect them equally.
slow layer gamma
Contrast of the less sensitive layers.
developer exhaustion
In a real developing tank the chemistry gets locally used up where the film was most heavily exposed. Those areas then stop gaining density, however much brighter the scene gets, so highlights run into a ceiling instead of climbing indefinitely – and the approach to that ceiling steepens, so highlight contrast tends to rise rather than soften. Mid-gray is held still, so only the bright end moves. 0 switches it off.

🔗DIR couplers

As one color layer develops, it releases a chemical that slows development in its neighbors. This is where the saturation of color negative film comes from, and it sharpens edges too: a bright area holds back development just beyond its own boundary, which reads as extra definition.

DIR couplers
Overall strength of the effect. 1.0 matches the real film, 0 switches it off. The slider stops at 1.0 because the simulation has to be able to work backwards from the film’s measured curves, and beyond film-accurate strength that becomes impossible – for some stocks well before 2.0. The module reduces the amount further for stocks where it would break down sooner.
same-layer inhibition
How much each layer holds back its own development. Raising it flattens contrast within each color channel. Can be used for tuning local contrast and sharpening independently of the interlayer effect below.
interlayer inhibition
How much each layer holds back the other two. This is the part that produces the saturation the effect is known for; at 0 the three colors develop independently.
inhibitor spread
How far the released chemical spreads through the emulsion, in thousandths of a millimeter. The couplers are more of an edge effect rather than a purely tonal one: the further it spreads, the further a bright area reaches past its own boundary, and the more the result looks like added sharpening. Shorten it for a gentler, more purely tonal response – 5 to 20 is the useful range. Each film carries its own value, and the slider follows the film when you change stock.
spread tail
A small part of the chemical travels much further than the rest. This is what gives large bright areas a broad, gentle falloff rather than a glow that stops abruptly.
tail weight
How much of the chemical travels in that long tail. 0 removes the tail entirely.

🔗diffusion

Simulates a diffusion filter – the physical piece of glass a cinematographer puts in front of the lens to bloom highlights and take the edge off contrast. There are two here, at different points in the chain: one at the camera, one at the enlarger.

enable diffusion filter
Switch on the camera-stage filter.
diffusion filter type
Which filter to imitate:
  • black pro-mist: a concentrated, punchy halo that keeps blacks deep.
  • glimmerglass: tight and subtle, preserving sharpness.
  • pro-mist: broader and more pastel, a softer atmospheric look.
  • cinebloom: a wide, slowly fading veil across the frame.
diffusion strength
How much light is diverted into the halo. 0 switches it off. The halo is added on top of the unfiltered picture, so raising this lifts shadows and lowers contrast as well as making highlights glow.
diffusion size
How far the halo spreads – the same light carried further. Use diffusion strength for more.
diffusion halo warmth
Warms (positive) or cools (negative) the outer halo, on top of whatever bias the chosen filter type already has.

🔗advanced

quality
How finely the color simulation is calculated. The three table settings work the answer out on a grid in advance and interpolate between the points, so a larger grid is closer to exact and slower to prepare. exact spectral skips the grid and calculates every pixel directly: much slower, CPU only, and rarely visibly different.
bandwidth adaptation
Trims the extreme violet and deep red ends of the film’s sensitivity as part of how each stock is characterized. On by default and best left on as it belongs to the film’s description.
surface adaptation
An optional per-color exposure correction carried in the film data, worth up to two stops for strongly colored light and nothing at all for neutral. Off by default, because it shifts saturated colors noticeably and the reference implementation does not apply it either. Stocks whose data does not include the correction are unaffected either way.
gamut compression
When enabled colors the simulated film and print produce that fall outside the working color profile’s gamut are pulled back inside it along a smooth OkLCh curve, leaving already in-gamut colors untouched. When disabled, out-of-gamut colors pass through unchanged and are hard-clipped later in the pipeline instead, which can shift hues and merge distinct tones. This is useful for spotting which colors the simulation is pushing out of gamut.

🔗print

🔗exposure

print exposure compensation
How long the enlarger stays on, in EV – the brightness of the print. Always an offset: with auto print exposure on, it shifts the automatic result.
auto print exposure
Compensate print exposure automatically for changes in film exposure, the way a real printer aims for consistent density whatever the negative. Does nothing while scan the film is on.
print contrast
Contrast of the print, achieved by reshaping the paper’s own response.

Slide and reversal stocks are viewed directly rather than printed. scan the film switches on by itself when you choose one, and the entire print tab then has no effect, along with viewing glare on the scanner tab as there is no print surface.

🔗chemistry

development time
How long the print is developed. Works exactly like the film tab’s version and is set separately from it. Only Kodak Print Film 2302 was measured at more than one time (2, 3.5, 5, 7 and 9 minutes), so the slider is grayed out for every other paper – and while scan the film is on, since there is no print to develop.

🔗filtration

filtration M / filtration Y
Magenta and yellow filters in the enlarger, in Kodak CC units away from neutral – the color balance of the print, adjusted the way it is in a darkroom.

🔗preflash

preflash exposure
A brief, even pre-exposure of the paper before the main one, through the blank part of the film. Lifts shadows and lowers contrast; a standard darkroom technique for printing difficult negatives. 0 switches it off.
preflash M filter shift / preflash Y filter shift
Magenta and yellow filtration for the preflash alone, in Kodak CC units, independent of the main filtration above.
enable print diffusion
A second, independent filter at the enlarger rather than the camera, diffusing the print instead of the exposure. Its controls work exactly like the ones above and are set separately: print diffusion filter type, print diffusion strength, print diffusion size, and print diffusion halo warmth.

🔗grain

Silver crystals in the emulsion develop or don’t, and the picture is made out of them – so the simulation builds a grainy emulsion, blurs detail and grain together the way a real one does, and then restores the lost edge definition with the sharpening under texture below. The blur and the recovery are tuned as a pair, so a picture with grain on is slightly softer than the same picture with grain off. That is how film behaves. If you want it sharper, turn grain down.

The controls are split in two. emulsion changes what the film is made of and rebuilds the crystals. texture changes only how those crystals are drawn at your output size.

enable grain
Switch grain simulation on.

🔗emulsion

granularity
How coarse the film’s crystals are, relative to the value measured for this stock. 1.0 is the datasheet figure.
This is the size control. Raising it grows the crystals, which means there are fewer of them and each one counts for more, so the grain becomes coarser and stronger together – the same way a faster film differs from a slower one. Because it rebuilds the emulsion, it behaves the same on negative and slide film.
grain strength
How far the grain is allowed to move each pixel. 1.0 matches the real stock, 0 switches it off.
Unlike granularity this scales the result: a negative’s grain gets amplified a second time by the print stage, while a slide is scanned directly with nothing to amplify it. The same value therefore reads much weaker on slide film. Reach for granularity (right-click for up to 8).
uniformity
How evenly the crystals are distributed, relative to the stock’s own figure. Lowering it bends the noise into a bell curve: grain that peaks in the midtones and eases off again in the densest areas.
sublayer particle scale
A real emulsion layers coarse crystals over finer ones. This scales the finer sub-layers against the coarsest, which stays fixed. Lower makes the fine layers finer still, so the coarse layer dominates; at 0 only the coarsest is left. No effect on stocks measured as a single layer.
density floor
The density each crystal sits at even where the film received no light – the reason grain does not disappear entirely in clear areas. Real stocks measure between about 0.03 and 0.06.

🔗texture

grain blur
How much the grain is blurred after it is drawn, in pixels. This softens grain: the crystals are unchanged, so raising it makes grain smoother and less distinct, not coarser. Use granularity above for that.
The value that looks right depends on output size since it is measured in pixels rather than on the film. Raise it for large prints where one crystal covers several pixels; lower it for small output.
dye cloud size
Each developed crystal leaves a small cloud of dye rather than a hard dot. This scales how far that cloud spreads, measured on the film itself, so it only becomes visible at magnifications where a single crystal covers more than a pixel.
recovery radius
How wide the recovery sharpening reaches, in pixels. 0 switches it off. A broad radius puts the crispness back into mid-sized detail. This stops the pixel grid itself from showing through.
recovery strength
How strongly it sharpens, restoring the definition the grain blur took away. It moves density around without adding any, so it cannot invent detail and is not a noise reduction. 0 leaves the softening in place with nothing countering it; pushing well beyond the default sharpens more than was ever lost, which makes grain look crunchy rather than photographic.

🔗halation

Two separate things happen to bright light inside film. Some of it scatters sideways within the emulsion as it passes through. Some goes all the way through, reflects off the film base behind, comes back, and puts a reddish glow around very bright highlights. Both are simulated and adjusted independently.

enable halation
Switch both effects on.

🔗scatter

scatter amount
How much light scatters sideways within the emulsion. 1.0 matches the film, 0 switches it off.
scatter size
How far it scatters. 1.0 matches the film and is the value the simulation normally works at. Above that, the whole frame softens quickly since the radius grows directly with the value. Drags to 1.5, right-click for more.

🔗halation

halation strength
How strong the reflected glow is. 1.0 matches the chosen film, which means it looks very different from stock to stock: most modern color negative film has a layer specifically to absorb this light and shows almost none, while film without one (a redscale-style stock, say) glows dramatically. Drags to 2, right-click for up to 8.
halation size
How far the glow spreads. 1.0 matches the film.

🔗threshold

highlight boost
Rebuilds highlights that were clipped in the original file so they can glow into the scatter, halation and diffusion effects. In EV; 0 switches it off. The boost applies over a fixed range, so it gives the same result regardless of image size, zoom level, or how the export was processed.
boost range
How far down the tonal range the boost reaches. Lower keeps it to the very brightest areas; higher pulls more of the upper midtones into the glow.
boost protect
Keeps everything below this many stops above mid-gray out of the boost entirely.

🔗scanner

How the finished print – or the negative, in scan the film mode – is digitized, and the conditions it is looked at under. These act on the final image, after everything else.

🔗output

pre-compression boost
Brightens the finished picture without flattening its highlights, because the film’s own highlight roll-off is applied afterward, so the image lifts instead of washing out. 1.0 leaves it alone. Since it acts right at the end, the color picker reads the finished picture rather than the original: point it at a highlight area, and it sets the boost so the brightest tone lands just short of where the roll-off takes over.
post-compression scale
Scales the finished picture after the gamut compressor. This only changes the level, leaving the relationship between the channels alone, similar to what a tone curve does by moving its white point.

🔗sharpness

scanner blur
Softening from the scanner’s own optics, in pixels. 0 switches it off.
scanner sharpness
How wide the scanner’s sharpening reaches, in pixels.
scanner sharpen strength
How strongly it sharpens. 0 switches it off – worth doing if you would rather sharpen later with darktable’s sharpen or diffuse or sharpen modules.

🔗glare

viewing glare
A faint veil of room light reflecting off the print surface, as a percentage. Lifts the deepest blacks very slightly, the way a real print in a real room never quite reaches black. Does nothing while scan the film is on, since there is no print surface.