@beerwright/core
    Preparing search index...

    Blending, mead and spirits

    This is the guide for the cellar side: blending finished beers (sours and barrel-aged beers, mostly), building a mead or cider must, and proofing and sweetening a spirit. These are smaller calculations than a recipe, and each one stands on its own.

    • pearsonSquare answers "how much of each of these two do I need to hit a target?" for any value that blends by volume: ABV, gravity, acidity.
    • evaluateBlend answers "what will this blend come out at?" for any number of components, with fruit, sugar and spirit additions, and works out the priming dose that accounts for what's still fermentable.
    • sugarToGravity answers "how much honey or sugar to reach this gravity?" for a mead must, a thin cider juice, or backsweetening.
    • proofAndSweeten answers "how much water and sugar to bring this macerate to a strength and a sweetness?" for limoncello, amaro and the like.

    How much of a 7.5 % sour and a 4.5 % sour make 20 L at 6.5 %:

    // How much of a 7.5 % sour and a 4.5 % sour make 20 L at 6.5 %?
    const square = pearsonSquare({ a: 7.5, b: 4.5, target: 6.5, totalVolumeL: 20 });

    13.3 L of the stronger and 6.7 L of the weaker. If the target is outside the two, or the two are the same, it returns null.

    Three barrels of sour, blended and bottle conditioned to 2.8 volumes:

    const sour = (
    name: string,
    volumeL: number,
    og: number,
    fg: number,
    ph: number,
    ): BlendComponentInput => ({
    name,
    volumeL,
    og,
    fg,
    ph,
    srm: 5,
    peakTempC: 22,
    barrelAged: true,
    naohMl: null,
    });

    const blend = evaluateBlend({
    components: [
    sour('Three-year barrel', 8, 1.062, 1.002, 3.3),
    sour('Two-year barrel', 10, 1.058, 1.004, 3.4),
    sour('One-year barrel', 6, 1.055, 1.008, 3.6),
    ],
    targetVolumes: 2.8,
    additions: [],
    kegVolumeL: null,
    });

    The 24 L blend is 7.3 % ABV at pH 3.40 and FG 1.0043. The barrels have off-gassed, so the blend holds only 0.41 volumes of CO₂ from fermentation. The two sweeter barrels will ferment down to the driest one's 1.002 in the bottle, and that leftover extract is worth 1.19 volumes more. That makes 1.60 volumes before any sugar, so the priming dose is 110 g of table sugar for the last 1.2. Priming a blend from its temperature alone would overcarbonate it.

    Honey for a traditional mead, 15 L of water up to 1.100:

    // Honey to bring 15 L of water up to 1.100 for a traditional mead.
    const honey = sugarToGravity({ currentSg: 1, targetSg: 1.1, volumeL: 15, sugar: 'honey' });

    5.1 kg of honey. Leave room for it, because dissolving it adds about 0.7 L per kilogram and the calculation doesn't count that.

    A liter of lemon-peel macerate at 60 %, down to 28 % with 250 g of sugar per liter:

    // A litre of lemon-peel macerate at 60 %, down to 28 % with 250 g of sugar per litre.
    const limoncello = proofAndSweeten({
    volumeL: 1,
    abvPercent: 60,
    targetAbvPercent: 28,
    targetSugarGL: 250,
    sweetener: { kind: 'sugar' },
    });

    Add 0.54 kg of sugar and 0.81 L of water, for 2.14 L of finished limoncello. The strength fixes the final volume first, because water and sugar add no alcohol, and the sugar's own volume comes out of the water.

    blendExplanations returns an Explanation for each figure a blend shows, citing Michael Tonsmeire's article on priming barrel-aged and blended sours and Curtis Crane's blending spreadsheet, which extends it. The others have twins: pearsonSquareExplained, sugarToGravityExplained, proofAndSweetenExplained, and nutrientScheduleExplained for the TOSNA nutrient schedule.

    • evaluateBlend wants every field, with null for unknown. A component with no measured pH has ph: null, and the blend's pH is worked out from the components that have one. A figure that none of them can supply comes back null.
    • Dated additions change the priming. Fruit or sugar added close to packaging will still be sugar in the bottle. Pass packagedOn and dates on the additions, and evaluateBlend counts that sugar toward the dose.
    • A blend's pH isn't the average. pH is a log scale, so blendPh averages the hydrogen-ion concentration and converts back.
    • sugarToGravity never lowers a gravity. A target below the current one returns zero. To dilute, use dilutionToTargetGravity.
    • proofAndSweeten returns null for an impossible target. Water can't make a spirit stronger, and past some sweetness the sugar alone takes more room than the target strength leaves.

    There's no method page for this area yet. The comments on evaluateBlend, sugarToGravity and proofAndSweeten have the formulas and their sources. In the reference, the Blending, mead and spirits category has the rest, including the nutrient schedule in nutrientSchedule and the acid-shock starter in acidShockStarter.