1function [y, basis, dinfo] = maraca_render(P)
2% MARACA_RENDER Full render: basis + impacts -> radiate -> output.
3% Convenience composition of the stage functions; the web app calls the
4% stages separately so it can cache intermediates.
6basis = maraca_basis(P);
7fsHi = P.sample_rate * P.oversample;
8[timp, jimp, tauimp, fimp, ximp, ginfo] = maraca_impacts(P);
9[p, radinfo] = maraca_radiate(P, basis, timp, jimp, tauimp, fimp, ximp, fsHi);
10[y, peakPa] = maraca_output(P, p, P.oversample);
12dinfo.impactCount = ginfo.count;
13dinfo.meanV = ginfo.meanV;
14dinfo.maxV = ginfo.maxV;
15dinfo.meanTauUs = ginfo.meanTauUs;
16dinfo.durationS = ginfo.durationS;
17dinfo.breathingDryHz = basis.breathingDryHz;
18dinfo.breathingHz = basis.breathingHz;
19dinfo.peakPa = peakPa;
20dinfo.peakSplDb = 20 * log10(peakPa / 20e-6 + 1e-30);
21dinfo.directPeakPa = radinfo.directPeakPa;
22dinfo.listenerInside = radinfo.listenerInside;
23dinfo.listenerDistM = radinfo.listenerDistM;
24dinfo.ginfo = ginfo;
25end