function body = bass_body(P) % BASS_BODY The parameterized modal body seen at the bridge. % % This is the empirical part of the model: the corpus of a double bass is % not solved from plates and ribs here, it is a table of measured-plausible % resonances, each reduced to what the string and the listener can see of % it. Per mode: the frequency, the Q, the effective mass at the bridge foot % (which sets the admittance the string is loaded by), the radiating area % (the net volume the body displaces per unit bridge displacement in that % mode), and whether it radiates as a monopole or a dipole. The first row % is A0, the f-hole Helmholtz resonance: the one mode that moves net volume % through the f-holes and therefore the one monopole; every corpus mode % above it displaces the top plate against the surrounding air with no net % flow and radiates as a dipole across the body. The table follows the % published admittance and radiativity measurements of orchestral basses in % shape (A0 near 60 Hz, the main wood resonances between 90 and 250 Hz, a % falling effective area above), with the absolute levels set by the trims % in bass_defaults.m. Modes above the table are NOT ignored: their % collective resistive load enters as residual_y in bass_basis.m and their % radiation as the direct term in bass_radiate.m. % % Mass-normalized amplitude at the bridge: a_j = sqrt(bridge_mobility/m_j), % so bridge_mobility scales the whole admittance without retuning the table. fb = [60.0 97.0 113.0 135.0 167.0 205.0 252.0 310.0 382.0 470.0 578.0 711.0]; Qb = [28.0 30.0 30.0 30.0 28.0 26.0 24.0 22.0 20.0 19.0 18.0 17.0]; mb = [1.6 1.2 1.1 1.0 0.95 0.90 0.90 1.0 1.1 1.3 1.5 1.8]; % kg at the bridge Sb = [0.055 0.055 0.048 0.032 0.022 0.015 0.010 0.0075 0.0055 0.004 0.003 0.0022]; % m^2 mono = [1 0 0 0 0 0 0 0 0 0 0 0]; nb = length(fb); f = reshape(fb, nb, 1); f(1) = P.a0_hz; f(2:nb) = f(2:nb) * P.body_trim; body.n = nb; body.f = f; body.omega = 2 * pi * f; body.zeta = reshape(0.5 ./ (Qb * P.body_q_scale), nb, 1); body.a = reshape(sqrt(P.bridge_mobility ./ mb), nb, 1); % 1/sqrt(kg) body.S = reshape(Sb * P.rad_area_scale, nb, 1); % m^2 body.mono = reshape(mono, nb, 1); end