function [y, basis, dinfo] = maraca_render(P) % MARACA_RENDER Full render: basis + impacts -> radiate -> output. % Convenience composition of the stage functions; the web app calls the % stages separately so it can cache intermediates. basis = maraca_basis(P); fsHi = P.sample_rate * P.oversample; [timp, jimp, tauimp, fimp, ximp, ginfo] = maraca_impacts(P); [p, radinfo] = maraca_radiate(P, basis, timp, jimp, tauimp, fimp, ximp, fsHi); [y, peakPa] = maraca_output(P, p, P.oversample); dinfo.impactCount = ginfo.count; dinfo.meanV = ginfo.meanV; dinfo.maxV = ginfo.maxV; dinfo.meanTauUs = ginfo.meanTauUs; dinfo.durationS = ginfo.durationS; dinfo.breathingDryHz = basis.breathingDryHz; dinfo.breathingHz = basis.breathingHz; dinfo.peakPa = peakPa; dinfo.peakSplDb = 20 * log10(peakPa / 20e-6 + 1e-30); dinfo.directPeakPa = radinfo.directPeakPa; dinfo.listenerInside = radinfo.listenerInside; dinfo.listenerDistM = radinfo.listenerDistM; dinfo.ginfo = ginfo; end