/ simulated_instruments / cymbal
Sign in
simulated_instruments / cymbal
cymbal / matlab / cymbal_render.m
40 lines · 1.6 KBCodeBlameHistory
2% CYMBAL_RENDER Full render: basis + strikes -> cascade -> radiate -> output.
3% Convenience composition of the stage functions; the web app calls the stages
4% separately so it can cache intermediates (the shell eigensolves above all).
6basis = cymbal_basis(P);
7fsHi = P.sample_rate * P.oversample;
8[tstr, vstr, jstr, taustr, fstr, sstr, sinfo] = cymbal_strikes(P, basis);
9[env, tframe, DV, kf, cinfo] = cymbal_cascade(P, basis, tstr, jstr, taustr, sstr, sinfo.durationS);
10[p, radinfo] = cymbal_radiate(P, basis, env, tframe, DV, kf, tstr, taustr, fstr, sstr, fsHi);
11[y, peakPa] = cymbal_output(P, p, P.oversample);
a136eacMake the contact point a first-class controlJeremy Magland 13[r1, z1] = cymbal_point(basis, P.strike_r);
14[r2, z2] = cymbal_point(basis, P.roll_r2);
15dinfo.strikeRadiusM = r1;
16dinfo.strikeRimM = P.radius_m - r1;
17dinfo.strikeZM = z1;
18dinfo.roll2RadiusM = r2;
19dinfo.roll2RimM = P.radius_m - r2;
21dinfo.meanV = sinfo.meanV;
22dinfo.maxV = sinfo.maxV;
23dinfo.meanTauUs = sinfo.meanTauUs;
24dinfo.peakForceN = sinfo.peakForceN;
25dinfo.durationS = sinfo.durationS;
26dinfo.modesKept = basis.n;
27dinfo.maxN = max(basis.ndia);
28dinfo.f1 = basis.f(1);
29dinfo.peakPa = peakPa;
30dinfo.peakSplDb = 20 * log10(peakPa / 20e-6 + 1e-30);
31dinfo.directPeakPa = radinfo.directPeakPa;
32dinfo.listenerInside = radinfo.listenerInside;
33dinfo.listenerDistM = radinfo.listenerDistM;
34dinfo.peakStrength = cinfo.peakStrength;
35dinfo.peakWrmsUm = cinfo.peakWrmsUm;
36dinfo.injectedJ = cinfo.injectedJ;
37dinfo.cascadeLostJ = cinfo.cascadeLostJ;
38dinfo.cascadeFrames = cinfo.frames;
39dinfo.sinfo = sinfo;
40end
↑↓ move↵openescclose