Coupled Mesh + String — User Guide
Physical-model synthesis with two fixed-edge 8×8 mass-spring meshes coupled to the two ends of a 12-node string. A short force pulse excites the network; energy moves among string and mesh modes, and a virtual pickup converts the simulated displacement into audio.
What this model is
This is a physical-model synthesizer: instead of starting from an oscillator or recording, it numerically simulates a small mechanical network. The network contains two square meshes and a short string. Every neighboring pair of nodes is connected by a spring with damping. The outer rows and columns of both meshes are fixed, while the interior mesh nodes and all 12 string nodes can move.
The model contains 140 nodes in total but only 84 moving nodes: 36 interior nodes in Mesh 1, 12 string nodes, and 36 interior nodes in Mesh 2. There are 235 internal springs — 112 in each mesh plus 11 along the string — and two additional distributed mesh-to-string couplings.
The simulation uses a central-difference / Verlet-style update. You do not need to work with the equation directly to use the instrument: musically, stiffness controls how strongly neighboring nodes pull against displacement, damping controls energy loss, coupling controls how strongly the string and meshes exchange motion, and the pickup controls which part of that motion becomes the output.
Quick start
- Run
Coupled_Mesh_String.praat. No input Sound is required. - Choose one of the five network presets.
- Leave Model rate at 2205 Hz for a useful starting point.
- Use Edit all model parameters only when you want direct access to stiffness, damping, geometry, excitation, and pickup settings.
- Click OK. If advanced editing is enabled, two compact parameter pages open after the preset has been applied.
- The final mono Sound remains selected and is named
coupled_mesh_string_<preset>.
Network structure
| Part | Nodes | Internal springs | Boundary / connection |
|---|---|---|---|
| Mesh 1 | 64 (8×8) | 112 | Outer edge fixed; interior 6×6 nodes move. A bilinearly interpolated point couples to string node 65. |
| String | 12 | 11 | All string nodes move. Its two endpoints are coupled to the two meshes. |
| Mesh 2 | 64 (8×8) | 112 | Outer edge fixed; interior 6×6 nodes move. A bilinearly interpolated point couples to string node 76. |
The mesh attachment coordinates are continuous values from 0 to 1. The script does not simply snap them to the nearest node: it computes a bilinear interpolation over the surrounding 2×2 mesh nodes. The coupling force is then distributed back to those same four nodes using the same weights. This lets the virtual connection sit between grid nodes.
Presets
The presets describe network configurations, not claims that the model literally reproduces a particular acoustic instrument. They set duration plus the detailed physical and geometric parameters. Sample rate, model rate, edge fade, normalization, visualization, and playback remain at the values in the compact launcher.
| Preset | Duration | String k | Mesh k 1 / 2 | Coupling k | Pickup mix |
|---|---|---|---|---|---|
| Tight Symmetric Network | 2.0 s | 0.49 | 0.24 / 0.24 | 0.14 | 0.15 |
| Soft Asymmetric Network | 2.5 s | 0.28 | 0.12 / 0.07 | 0.07 | 0.45 |
| Strong String-Mesh Coupling | 2.5 s | 0.42 | 0.20 / 0.18 | 0.28 | 0.55 |
| Short Damped Network | 0.9 s | 0.35 | 0.18 / 0.16 | 0.10 | 0.30 |
| Long Low-Damping Network | 4.0 s | 0.47 | 0.22 / 0.20 | 0.12 | 0.25 |
| Preset | String / Mesh1 / Mesh2 damping | Coupling / Global damping | Excite | String pickup | Mesh attachments |
|---|---|---|---|---|---|
| Tight Symmetric | 0.00015 / 0.00035 / 0.00035 | 0.00005 / 0.00003 | 0.20 | 0.16 | (0.40,0.40) / (0.60,0.60) |
| Soft Asymmetric | 0.00045 / 0.0012 / 0.0018 | 0.00020 / 0.00008 | 0.42 | 0.48 | (0.45,0.55) / (0.62,0.38) |
| Strong Coupling | 0.00030 / 0.00070 / 0.00090 | 0.00012 / 0.00005 | 0.30 | 0.36 | (0.35,0.45) / (0.65,0.55) |
| Short Damped | 0.0040 / 0.0050 / 0.0060 | 0.00070 / 0.00030 | 0.24 | 0.20 | default centers |
| Long Low-Damping | 0.00003 / 0.00008 / 0.00012 | 0.00002 / 0.00001 | 0.35 | 0.48 | default centers |
Excitation amplitude is not changed by the presets; its baseline value is 1.0. Presets 5 and 6 also leave both mesh attachment coordinates at the baseline center position, (0.5, 0.5).
Controls
Compact launcher
| Control | Default | Meaning |
|---|---|---|
| Duration | 2.0 s | Requested simulation and output duration. Some presets replace it. |
| Sample rate | 44100 Hz | Final audio sample rate. |
| Model rate | 2205 Hz | Number of physics updates per second. It controls simulation resolution and available physical bandwidth. |
| Edit all model parameters | off | Opens the two-page advanced wizard after preset values are loaded. |
| Edge fade | 0.005 s | Short linear protection fade at the beginning and end; capped at 20% of duration. |
| Normalize output | yes | Target peak normalization to 0.90 after resampling and edge fade. |
| Draw visualization | yes | Draw the network, physical probes, spectrogram, spectrum, and QC. |
| Play result | yes | Play the final Sound after generation. |
Advanced page 1: physics
| Control | Baseline | Effect |
|---|---|---|
| String stiffness | 0.49 | Reference spring coefficient for the 11 string links. |
| Mesh1 / Mesh2 stiffness | 0.24 / 0.24 | Reference spring coefficients for the two grids. |
| Coupling stiffness | 0.10 | Strength of energy exchange between each mesh attachment and its string endpoint. |
| String damping | 0.0003 | Relative-velocity damping along string springs. |
| Mesh1 / Mesh2 damping | 0.0008 / 0.0003 | Relative-velocity damping within each grid. |
| Coupling damping | 0.0001 | Velocity-dependent loss at each mesh-string coupling. |
| Global damping | 0.00005 | Small damping term in the Verlet-style motion update. |
Advanced page 2: geometry & pickup
| Control | Baseline | Effect |
|---|---|---|
| Excitation position | 0.30 | Continuous location along the 12-node string, 0 = first endpoint and 1 = second endpoint. |
| Excitation amplitude | 1.0 | Strength of the 5 ms half-sine force pulse. |
| String pickup position | 0.45 | Continuous listening point on the string, interpolated between adjacent nodes. |
| Mesh pickup mix | 0.20 | How much of the two mesh-attachment motions are mixed into the output. |
| Mesh 1 / 2 attach X,Y | 0.50,0.50 | Continuous coupling positions on each 8×8 mesh, implemented by bilinear interpolation. |
Model rate and stability
Model rate is the physics update rate, not the audio sample rate. The mechanical system is first calculated at Model rate and only afterwards converted to the requested Sample rate. Raising Sample rate alone cannot create physical modes above the bandwidth represented by the model-rate simulation.
This scaling follows the time-step dependence of the explicit central-difference update. It keeps tuning and decay approximately invariant across model rates; it does not make different numerical resolutions mathematically identical.
The script also calculates a conservative stability bound from the scaled string, mesh, and coupling stiffnesses. If the bound reaches 3.80, the run stops and asks for a higher Model rate or lower stiffness/coupling. Excessive scaled damping is also rejected.
Excitation and virtual pickup
Excitation
A 5 ms half-sine force pulse is applied to the string. The normalized excitation position is converted to the two neighboring string nodes, and the force is divided between them according to the fractional position. This gives continuous placement along the discrete 12-node string.
Pickup
The output is not hard-wired to one string node. The script measures three actual structural trajectories on every physics step:
- the interpolated string pickup,
- the actual Mesh 1 attachment displacement,
- the actual Mesh 2 attachment displacement.
At Mesh pickup mix = 0, the output is only the selected point on the string. At 1, the string term disappears and the output becomes the average of the two mesh attachment probes. Intermediate values expose the coupled exchange between the three structures.
Output, resampling, and level
The physics produces one mono displacement trajectory at Model rate. If Model rate differs from Sample rate, Praat's Resample command converts the model-rate Sound to the requested audio rate. This replaces the old integer interpolation approach and supports arbitrary rate ratios with proper resampling filtering.
A short linear edge fade is then applied at both ends. It is not the old long musical fade-out: the network's natural decay remains audible through almost the whole requested duration.
If Normalize output is enabled and the result is non-zero, Scale peak: 0.90 performs target peak normalization. The Info window reports pre-normalization peak/RMS as well as final peak/RMS, so normalization does not hide the raw physical level from QC.
| Property | Behavior |
|---|---|
| Channels | Mono. |
| Duration | Requested simulation duration, subject to the sample grid produced by Praat's Sound/resampling operations. |
| Sample rate | User-selected final audio rate. |
| Physics bandwidth | Limited by Model rate; upsampling does not invent higher simulated modes. |
| Normalization | Optional target peak 0.90. |
| Name | coupled_mesh_string_<preset>. |
Visualization and QC
The current figure is built around the mechanism rather than a generic waveform display:
| Panel | What it shows |
|---|---|
| A — Network Geometry | The two 8×8 grids, the 12-node string, the actual mesh attachment locations, coupling lines, excitation point, string pickup point, and the pickup-mix equation. |
| B — Structural Response | The actual model-rate displacement trajectories measured at Mesh 1, the string pickup, and Mesh 2, all on a shared amplitude scale. |
| C — Measured Output | Spectrogram of the final rendered Sound. Its upper frequency is limited by both model and audio rates. |
| D — Modal Spectrum | Measured spectrum of the final Sound up to the physically relevant model-band limit. |
The QC box reports the 84 moving nodes, 235 internal springs plus two couplings, model/reference rates, coefficient scaling, stability bound, RMS of the three structural probes, and pre/post-normalization output metrics.