/ proof-of-concept / toy-instruments
Sign in
proof-of-concept / toy-instruments
toy-instruments / src / sim / types.ts
53 lines · 2.0 KBCodeBlameHistory
4a8abcfString of beads: 3D bead-spring solver, control panel, waveform, spectrogram, wav, displacement viewerJeremy Magland 1// Generic bead-spring system in 3D. Instruments build one of these; the solver
2// integrates it. SI units throughout.
4export interface Anchor {
5 pos: [number, number, number];
6 // -1: fixed point. Otherwise a massless ring on a rod: x fixed, y and z
7 // follow this bead, so the spring to it stays parallel to x (no transverse force).
8 slideBead: number;
9}
11export interface BeadSystem {
12 n: number; // number of beads
13 rest: Float64Array; // 3n equilibrium positions
14 mass: Float64Array; // n
15 pinned: Uint8Array; // n, 1 = held fixed at rest position
16 anchors: Anchor[]; // node index n + a
17 // springs: endpoints are node indices (bead < n, anchor >= n)
18 si: Int32Array;
19 sj: Int32Array;
20 sk: Float64Array; // stiffness (N/m)
21 sL0: Float64Array; // rest length (m)
22 sc: Float64Array; // dashpot on relative velocity, all 3 components (N s/m)
23 sigma0: number; // mass-proportional damping: force -2 sigma0 m v
26export interface Excitation {
27 u0: Float64Array; // 3n initial displacement from rest
28 v0: Float64Array; // 3n initial velocity
29 // External force F(t) = shape * F0 * 0.5 (1 - cos(2 pi t / tau)), 0 <= t <= tau
30 force?: { shape: Float64Array; F0: number; tau: number };
33export interface SimOptions {
34 duration: number; // s
35 fs: number; // audio sample rate (Hz)
36 cfl: number; // fraction of the leapfrog stability limit 2/omega_max
37 frameRate: number; // displacement frames per second
38 pickup: Float64Array; // 3n weights; audio = sum w . acceleration
41export interface SimResult {
42 audio: Float32Array; // pickup acceleration (m/s^2) at fs
43 fs: number;
44 frames: Float32Array; // nFrames x 3n displacement from rest
45 frameTimes: Float64Array;
46 energy: Float64Array; // mechanical energy above equilibrium at frame times (J)
47 balance: Float64Array; // E + dissipated - work_in - E0 at frame times (J)
48 dt: number;
49 stepsPerSample: number;
50 omegaMax: number;
51 wallSeconds: number;
52 maxStretch: number; // largest |l - L0| / L0 seen, at frame times
↑↓ move↵openescclose