code wiki / (root) / nx_soda_design.nx

nx_soda_design.nx source

↩ module page · 105 lines · 4910 B

1// nx_soda_design.nx -- CRAFT-SODA capstone: the "AIR-TO-SODA" chain. 2// 3// The operator's thesis: one air intake -> pure water (harvested) + CO2 -> 4// nanobubble carbonation -> crystallized-citrus flavor -> craft soda on 5// demand, like a SodaStream but sovereign end-to-end. This organ composes 6// the pillars into ONE scored craft soda and a per-glass dispense recipe: 7// 8// WATER (pure, low-TDS = a clean canvas so citrus is unmasked) 9// + FIZZ (nx_soda_carbonation: nanobubble CO2, no heavy equipment) 10// + FLAVOR (nx_soda_flavor: smooth strong SUGAR-FREE citric:malic blend) 11// -> a craft_score and an on-demand crystal dose. 12// 13// MEASURED EXCEEDS (gate-checked, see nx_soda_design_test) -- the SYSTEM-level 14// claim that every pillar is load-bearing: 15// - the clean cold chain scores high AND is sugar-free by construction 16// - WARM water breaks the "no heavy equipment" promise (needs >5 bar) and 17// drops the score -- carbonating cold is what keeps the gear compact 18// - HARD (high-TDS) water muddies the canvas and drops the score 19// - the on-demand per-glass crystal dose is a sane craft quantity 20// No single number is hand-set; each falls out of the composed physics. 21// 22// genealogy_id: nishi_soda_carbonation_2026 + nishi_soda_flavor_2026 23// + nishi_water_awg_2026 (pure-canvas premise) + air_to_soda_2026 24 25import "nx_syscalls.nx" 26import "nx_soda_carbonation.nx" 27import "nx_soda_flavor.nx" 28 29// citrus-crystal molar masses (g/mol) for the per-glass dose. 30const SODA_CITRIC_MW: i64 = 192 31const SODA_MALIC_MW: i64 = 134 32 33struct NxCraftSoda { 34 serve_temp_c: i64, 35 target_sour_milli: i64, 36 water_tds_ppm: i64, 37 citric_mM: i64, 38 malic_mM: i64, 39 aroma_milli: i64, 40 sugar_g_per_l: i64, 41 carbonation_volumes_milli: i64, 42 required_pressure_mbar: i64, 43 nanobubble_ok: i64, 44 ph_milli: i64, 45 sour_milli: i64, 46 smoothness_milli: i64, 47 clarity_milli: i64, 48 intensity_milli: i64, 49 water_purity_milli: i64, 50 craft_score_milli: i64, 51} 52 53// water purity as a soda canvas: LOW TDS is best (minerals mask citrus), the 54// opposite of drinking-water taste. Pure AWG condensate (~5-30 ppm) scores 1000. 55func soda_water_purity_milli(tds_ppm: i64) -> i64 { 56 if tds_ppm <= 30 { return 1000 } 57 var p: i64 = 1000 - (tds_ppm - 30) * 4 58 if p < 0 { p = 0 } 59 return p 60} 61 62// composite craft score (milli): roundness + clarity + intensity + water 63// canvas + the no-heavy-equipment (nanobubble-feasible) bonus, weighted /100. 64func soda_craft_score_milli(smoothness: i64, clarity: i64, intensity: i64, purity: i64, nanobubble_ok: i64) -> i64 { 65 var inten: i64 = intensity 66 if inten > 1000 { inten = 1000 } 67 let feas: i64 = nanobubble_ok * 1000 68 return (smoothness * 30 + clarity * 25 + inten * 20 + purity * 15 + feas * 10) / 100 69} 70 71// THE CHAIN: serve temperature + target sourness + source-water TDS -> a fully 72// specified, scored craft soda (sugar-free blend designed, carbonation solved). 73func soda_craft(serve_temp_c: i64, target_sour_milli: i64, water_tds_ppm: i64) -> *NxCraftSoda { 74 let d: *NxSodaRecipe = soda_design_smooth(target_sour_milli, serve_temp_c) 75 let carb_vol: i64 = d.carbonation_volumes_milli 76 let co2: i64 = carb_vol * SODA_MG_PER_VOLUME / 1000 77 let cs: *NxCraftSoda = (sys_mmap(144)) as *NxCraftSoda 78 cs.serve_temp_c = serve_temp_c 79 cs.target_sour_milli = target_sour_milli 80 cs.water_tds_ppm = water_tds_ppm 81 cs.citric_mM = d.citric_mM 82 cs.malic_mM = d.malic_mM 83 cs.aroma_milli = d.aroma_milli 84 cs.sugar_g_per_l = d.sugar_g_per_l 85 cs.carbonation_volumes_milli = carb_vol 86 cs.required_pressure_mbar = soda_required_pressure_mbar(carb_vol, serve_temp_c) 87 cs.nanobubble_ok = soda_nanobubble_feasible(cs.required_pressure_mbar) 88 cs.ph_milli = soda_ph_milli(co2) 89 cs.sour_milli = soda_recipe_sour_milli(d) 90 cs.smoothness_milli = soda_recipe_smoothness_milli(d) 91 cs.clarity_milli = soda_recipe_clarity_milli(d) 92 cs.intensity_milli = soda_recipe_intensity_milli(d) 93 cs.water_purity_milli = soda_water_purity_milli(water_tds_ppm) 94 cs.craft_score_milli = soda_craft_score_milli(cs.smoothness_milli, cs.clarity_milli, cs.intensity_milli, cs.water_purity_milli, cs.nanobubble_ok) 95 return cs 96} 97 98// on-demand per-glass crystal dose (mg): the citric + malic crystals metered 99// into one glass -- the "crystallization" the operator wants, dosed exactly. 100func soda_glass_crystal_mg(cs: *NxCraftSoda, glass_ml: i64) -> i64 { 101 if glass_ml <= 0 { return 0 } 102 let citric_mg: i64 = cs.citric_mM * glass_ml * SODA_CITRIC_MW / 1000 103 let malic_mg: i64 = cs.malic_mM * glass_ml * SODA_MALIC_MW / 1000 104 return citric_mg + malic_mg 105}