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.
🔗header
- 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.
🔗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.
🔗print diffusion
- 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.