1function P = cymbal_defaults()
2% CYMBAL_DEFAULTS Default parameters, mirroring the web app's params.ts.
3% The output duration is not a parameter: it is
4% (strike_count - 1) / strike_rate_hz + tail_s.
6% Plate geometry (a 16-inch crash-ride)
7P.radius_m = 0.2032;
8P.hole_radius_m = 0.0064;
9P.bell_radius_m = 0.0450;
10P.bell_height_m = 0.0170;
11P.bow_height_m = 0.0200;
12P.thickness_bell_m = 0.00115;
13P.thickness_rim_m = 0.00075;
15% Material (B20 bell bronze)
16P.density = 8700.0;
17P.youngs_modulus = 1.05e11;
18P.poisson_ratio = 0.33;
19P.stiffness_trim = 1.00;
21% Discretization / mode retention
22P.n_elements = 28;
23P.n_diameters = 48; % highest circumferential order solved for
24P.min_mode_hz = 40.0;
25P.max_mode_hz = 8000.0;
27% Damping
28P.damp_rate = 0.35; % s^-1, frequency-independent decay rate
29P.loss_factor = 1.5e-4;
30P.loss_slope = 2.0e-9;
31P.radiation_loss = 1.0;
32P.mount_loss = 3.0; % N s/m dashpot at the inner edge (felt and stand)
34% Stick (nylon-tip drumstick)
35P.tip_radius_m = 0.0050;
36P.stick_mass_kg = 0.030;
37P.stick_youngs = 5.0e9;
38P.restitution = 0.55;
40% Strike gesture
41P.strike_velocity = 3.0;
42P.strike_r = 0.94; % 0 at the hole, 1 at the rim
43P.strike_angle_deg = 40.0; % 0 = normal to the surface, 90 = tangential
44P.strike_count = 1;
45P.strike_rate_hz = 6.0;
46P.roll_r2 = 0.80; % second contact radius when strike_count > 1
47P.timing_jitter_ms = 8.0;
48P.velocity_spread = 0.18;
49P.seed = 1;
51% Nonlinear cascade
52P.cascade_gain = 800.0;
53P.cascade_back = 0.45; % downward / upward transfer ratio
54P.cascade_ratio = 1.19; % frequency ratio of one transfer step (2^0.25)
55P.cascade_leak = 1.0; % 1 = energy leaving the top mode is lost
56P.cascade_step_ms = 0.5;
58% Radiation / listener
59P.direct_gain = 1.0;
60P.dipole_scale = 1.0;
61P.n_azimuth = 96; % azimuthal samples in the listener transfer
62P.listener_x_m = 0.30;
63P.listener_y_m = 0.00;
64P.listener_z_m = 0.50;
65P.speed_of_sound = 343.0;
66P.air_density = 1.204;
68% Rendering / output
69P.sample_rate = 48000;
70P.oversample = 2;
71P.tail_s = 3.0;
72P.pre_delay_ms = 3.0;
73P.normalize = 1;
74P.peak_dbfs = -3.0;
75P.full_scale_pa = 5.0;
76end