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}