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.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 1.2.1 (2026) License: MIT License Repo: Praat AudioTools
Contents:

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 basic idea: strike the string, then let the simulated structure ring. The string sends energy into Mesh 1 and Mesh 2 through two coupling elements. The meshes return energy to the string, so the decay is not simply a string resonance plus two independent resonators: all three structures influence one another over time.

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.

Mesh 1 (8×8, fixed outer edge) │ │ coupling ▼ string endpoint — 12-node string — string endpoint ▲ │ coupling │ Mesh 2 (8×8, fixed outer edge)

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

  1. Run Coupled_Mesh_String.praat. No input Sound is required.
  2. Choose one of the five network presets.
  3. Leave Model rate at 2205 Hz for a useful starting point.
  4. Use Edit all model parameters only when you want direct access to stiffness, damping, geometry, excitation, and pickup settings.
  5. Click OK. If advanced editing is enabled, two compact parameter pages open after the preset has been applied.
  6. The final mono Sound remains selected and is named coupled_mesh_string_<preset>.
Good first comparisons: Tight Symmetric Network emphasizes a relatively stiff, balanced structure; Soft Asymmetric Network makes the two meshes deliberately different; Strong String-Mesh Coupling makes the mesh contribution especially prominent; Short Damped Network loses energy quickly; Long Low-Damping Network preserves the network response for much longer.

Network structure

PartNodesInternal springsBoundary / connection
Mesh 164 (8×8)112Outer edge fixed; interior 6×6 nodes move. A bilinearly interpolated point couples to string node 65.
String1211All string nodes move. Its two endpoints are coupled to the two meshes.
Mesh 264 (8×8)112Outer 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.

mesh attachment displacement = w11·u11 + w21·u21 + w12·u12 + w22·u22 coupling force = coupling stiffness · displacement difference + coupling damping · velocity difference

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.

PresetDurationString kMesh k 1 / 2Coupling kPickup mix
Tight Symmetric Network2.0 s0.490.24 / 0.240.140.15
Soft Asymmetric Network2.5 s0.280.12 / 0.070.070.45
Strong String-Mesh Coupling2.5 s0.420.20 / 0.180.280.55
Short Damped Network0.9 s0.350.18 / 0.160.100.30
Long Low-Damping Network4.0 s0.470.22 / 0.200.120.25
PresetString / Mesh1 / Mesh2 dampingCoupling / Global dampingExciteString pickupMesh attachments
Tight Symmetric0.00015 / 0.00035 / 0.000350.00005 / 0.000030.200.16(0.40,0.40) / (0.60,0.60)
Soft Asymmetric0.00045 / 0.0012 / 0.00180.00020 / 0.000080.420.48(0.45,0.55) / (0.62,0.38)
Strong Coupling0.00030 / 0.00070 / 0.000900.00012 / 0.000050.300.36(0.35,0.45) / (0.65,0.55)
Short Damped0.0040 / 0.0050 / 0.00600.00070 / 0.000300.240.20default centers
Long Low-Damping0.00003 / 0.00008 / 0.000120.00002 / 0.000010.350.48default 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

ControlDefaultMeaning
Duration2.0 sRequested simulation and output duration. Some presets replace it.
Sample rate44100 HzFinal audio sample rate.
Model rate2205 HzNumber of physics updates per second. It controls simulation resolution and available physical bandwidth.
Edit all model parametersoffOpens the two-page advanced wizard after preset values are loaded.
Edge fade0.005 sShort linear protection fade at the beginning and end; capped at 20% of duration.
Normalize outputyesTarget peak normalization to 0.90 after resampling and edge fade.
Draw visualizationyesDraw the network, physical probes, spectrogram, spectrum, and QC.
Play resultyesPlay the final Sound after generation.

Advanced page 1: physics

ControlBaselineEffect
String stiffness0.49Reference spring coefficient for the 11 string links.
Mesh1 / Mesh2 stiffness0.24 / 0.24Reference spring coefficients for the two grids.
Coupling stiffness0.10Strength of energy exchange between each mesh attachment and its string endpoint.
String damping0.0003Relative-velocity damping along string springs.
Mesh1 / Mesh2 damping0.0008 / 0.0003Relative-velocity damping within each grid.
Coupling damping0.0001Velocity-dependent loss at each mesh-string coupling.
Global damping0.00005Small damping term in the Verlet-style motion update.

Advanced page 2: geometry & pickup

ControlBaselineEffect
Excitation position0.30Continuous location along the 12-node string, 0 = first endpoint and 1 = second endpoint.
Excitation amplitude1.0Strength of the 5 ms half-sine force pulse.
String pickup position0.45Continuous listening point on the string, interpolated between adjacent nodes.
Mesh pickup mix0.20How much of the two mesh-attachment motions are mixed into the output.
Mesh 1 / 2 attach X,Y0.50,0.50Continuous 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.

Important v1.2 behavior: the stiffness, damping, and excitation values are defined as reference coefficients at 2205 model steps/s. The script rescales them when Model rate changes. This makes Model rate primarily a simulation-resolution / computation control rather than an accidental pitch transposition control.
rateScale = 2205 / ModelRate step stiffness = reference stiffness × rateScale² step damping = reference damping × rateScale step excitation = reference excitation × rateScale²

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.

Bandwidth: the generated motion is fundamentally limited by the physics update rate. The visualization therefore limits its spectrogram and spectrum to approximately the model Nyquist region. If you want physically represented higher modes, increase Model rate; increasing only Sample rate merely changes the final audio sampling grid.

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:

output = (1 - MeshPickupMix) × StringPickup + 0.5 × MeshPickupMix × (Mesh1Probe + Mesh2Probe)

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.

PropertyBehavior
ChannelsMono.
DurationRequested simulation duration, subject to the sample grid produced by Praat's Sound/resampling operations.
Sample rateUser-selected final audio rate.
Physics bandwidthLimited by Model rate; upsampling does not invent higher simulated modes.
NormalizationOptional target peak 0.90.
Namecoupled_mesh_string_<preset>.

Visualization and QC

The current figure is built around the mechanism rather than a generic waveform display:

PanelWhat it shows
A — Network GeometryThe 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 ResponseThe actual model-rate displacement trajectories measured at Mesh 1, the string pickup, and Mesh 2, all on a shared amplitude scale.
C — Measured OutputSpectrogram of the final rendered Sound. Its upper frequency is limited by both model and audio rates.
D — Modal SpectrumMeasured 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.