A súlyra két erő hat: a rugó visszahúzza a kimozdulás felé, arányosan (\(-k\,x\)), a csillapítás pedig fékezi a mozgást (\(-c\,v\)). A tömeg tehetetlensége (\(m\,a\)) azt szabja meg, hogy ez a két erő mekkora gyorsulást okoz. Newton törvénye szerint \(m\,a\) egyenlő az erők összegével:
\( m\,\ddot x + c\,\dot x + k\,x = 0 \)
ahol \(x\) a kitérés (a nyugalmi helyzettől), \(\dot x\) a sebesség, \(\ddot x\) a gyorsulás.
\( f_0=\dfrac{1}{2\pi}\sqrt{\dfrac{k}{m}} \)
Merevebb rugó vagy könnyebb súly: magasabb hang. Két könnyen megjegyezhető szabály: a merevséget négyszerezve a hang pontosan egy oktávval magasabb, a tömeget négyszerezve egy oktávval mélyebb. Példa: \(m=10\) g, \(k=76\) kN/m esetén \(f_0\approx 439\) Hz. Ez ugyanaz az elv, mint a húrnál: a nehezebb húr mélyebb, a feszesebb magasabb.
A csillapítás mértéke a csillapítási tényező, ami a csillapítást a „kritikus” értékhez viszonyítja:
\( \zeta=\dfrac{c}{2\sqrt{k\,m}},\qquad c_{krit}=2\sqrt{k\,m} \)
| Tartomány | Mi történik? | Hasonlat |
|---|---|---|
| \(\zeta<1\) alulcsillapított | oda-vissza rezeg, közben elhal | harang, húr |
| \(\zeta=1\) kritikus | a leggyorsabban áll meg rezgés nélkül | ajtócsukó |
| \(\zeta>1\) túlcsillapított | nem rezeg, lassan visszakúszik | súly a mézben |
Alulcsillapított esetben a rezgés amplitúdója \(e^{-\sigma t}\) szerint csökken, ahol \(\sigma=\dfrac{c}{2m}\). A T60 (60 dB-es, ezredrésznyi csökkenés ideje):
\( T_{60}=\dfrac{\ln 1000}{\sigma}\approx 13{,}8\,\dfrac{m}{c} \)
Ez a képlet alulcsillapított esetben pontos, és nem függ a merevségtől (\(k\)-tól). Kritikus közelében és túlcsillapításnál csak közelítés. Példa: \(m=10\) g, \(c=0{,}05\) N·s/m esetén \(T_{60}\approx 2{,}8\) s. A tényleges frekvencia csillapítással kissé alacsonyabb: \(f_d=f_0\sqrt{1-\zeta^2}\), de kis csillapításnál ez alig különbözik.
Ha egy koordinátarendszerben a kitérést és a sebességet együtt ábrázoljuk, egy csillapítás nélküli rezgés kör (ha a sebességet a \(\omega_0\) körfrekvenciával elosztjuk; egyébként ellipszis), a csillapított rezgés befelé tartó spirál. Amikor a súly a szélén van, áll (a sebesség nulla), a közepén a leggyorsabb. A túlcsillapított esetben nincs spirál, csak egy kör nélküli, íves visszakúszás a középpontba.
A számítógépben minden hangmintát az előző kettőből számolunk ki:
\( y[n]=a_1\,y[n-1]+a_2\,y[n-2],\quad a_1=2r\cos\theta,\; a_2=-r^2 \)
ahol \(r=e^{-\sigma/f_s}\) (a lecsengés egy mintányi lépésben) és \(\theta=2\pi f_d/f_s\) (a forgás egy mintányi lépésben). A „megütést” egy egyetlen mintányi impulzus adja az elején. Túlcsillapított esetben \(a_1=z_1+z_2,\; a_2=-z_1z_2\), ahol \(z_{1,2}\) két valós szám. Ez a két mintányi memóriájú rekurzió egy rezonáns szűrő: a következő órák modális szintézisének építőköve. A Karplus-Strong körben ugyanezt a visszacsatolás-gondolatot használtuk, de két minta helyett \(N\) mintányi memóriával.
Ugyanazt az egyenletet többféleképpen lehet lépésenként megoldani (\(h=1/f_s\) a lépésköz, az állapot a kitérés és a sebesség). A \(c/m=2\sigma\) és \(k/m=\omega_0^2\) jelöléssel:
| Módszer | Lépés |
|---|---|
| Explicit Euler | \(x_{n+1}=x_n+h\,v_n\), \(\;v_{n+1}=v_n+h\,(-\omega_0^2x_n-2\sigma v_n)\) |
| Szemi-implicit Euler | \(v_{n+1}=v_n+h\,(-\omega_0^2x_n-2\sigma v_n)\), \(\;x_{n+1}=x_n+h\,v_{n+1}\) (az új sebességgel lépünk) |
| Egzakt rezonátor | \(y_n=a_1y_{n-1}+a_2y_{n-2}\) a 5. pont szerint (a pólusok pontosan a valódi rezgés pólusai) |
Mi történik lépésenként? Az explicit Euler mátrixának determinánsa \(1-2\sigma h+h^2\omega_0^2\): a rezgés minden lépésben \(\sqrt{1-2\sigma h+h^2\omega_0^2}\)-szeresére változik, tehát nő, ha \(2\sigma\lt h\,\omega_0^2\). Hangoknál ez szinte mindig így van: a Harang (439 Hz, \(\sigma\approx2{,}4\) 1/s, 44,1 kHz) esetén \(h\omega_0^2/2\approx86\) 1/s, vagyis a hang másodpercenként \(e^{86}\)-szorosára robban. A szemi-implicit Euler determinánsa pontosan \(1-2\sigma h\) (a lecsengés gyakorlatilag helyes), és stabil, ha \(h\,\omega_0\lt 2\). A frekvenciája csak kissé magas: csillapítás nélkül \(2\sin(\theta/2)=h\omega_0\), azaz \(f\approx f_0\,(1+(h\omega_0)^2/24)\): 439 Hz-nél 0,3 cent, 3,5 kHz-nél már kb. 18 cent. Az egzakt rezonátor a szabad lecsengést lépésközről függetlenül pontosan adja (a frekvencia és a lecsengés is pontos), és mindig stabil (\(r\lt1\)).
| Módszer | Stabil? | Frekvencia | Lecsengés | Mikor jó? |
|---|---|---|---|---|
| Explicit Euler | nem, ha \(2\sigma\lt h\omega_0^2\) | pontatlan | hamis (nő) | soha hangszintézisre; tanulságnak jó |
| Szemi-implicit Euler | igen, ha \(h\omega_0\lt2\) | kissé magas | majdnem pontos | nemlineáris rugó, közben változó paraméter, tetszőleges erő, tömegek hálózata |
| Egzakt rezonátor | mindig | pontos | pontos | lineáris, állandó paraméterű rezgő: a legolcsóbb és a legpontosabb |
A teljes Newton-törvény külső erővel: \(F = m\,a + c\,v + k\,x\). Mértékegységek (SI): \(F\) [N], \(m\) [kg], \(a\) [m/s²], \(c\) [N·s/m], \(v\) [m/s], \(k\) [N/m], \(x\) [m], \(h=1/f_s\) [s]. Ellenőrzés: kg·m/s² = N; (N·s/m)·(m/s) = N; (N/m)·m = N, vagyis minden tag erő. Ebből a gyorsulás: \(a=(F-c\,v-k\,x)/m\). A szemi-implicit Euler lépése:
\( a_n=\dfrac{F_n-c\,v_n-k\,x_n}{m},\qquad v_{n+1}=v_n+h\,a_n,\qquad x_{n+1}=x_n+h\,v_{n+1} \)
Az explicit Eulernél ugyanez az \(a_n\), de \(x_{n+1}=x_n+h\,v_n\) (a régi sebességgel lépünk). Az „ütés” egyetlen lépésnyi erőimpulzus: \(F_0=J/h\), ahol \(J\) az impulzus [N·s]; ekkor \(v_0=J/m\).
Melyik a jobb? Lineáris, állandó paraméterű rezgőre (és a több tömeges lánc módusaira) az egzakt rezonátor: pontos, mindig stabil, és minden módus csak két szorzás. Amit viszont nem tud: nemlineáris rugót (gong), a menet közben változó \(k\)-t vagy \(m\)-et, és tetszőleges külső erőt. Ezekhez a szemi-implicit Euler kell (vagy a vele egyenértékű Verlet-lépés), elég nagy mintavételi frekvenciával, hogy \(h\omega_{max}\) kicsi maradjon. Az explicit Euler ezek közül sosem jó választás: hozzáad egy negatív csillapítást. A több tömegű láncot is lehet lépésenként szimulálni (\(m\ddot x_j=k(x_{j-1}-2x_j+x_{j+1})-c\dot x_j\), szemi-implicit Euler minden tömegre); ehhez \(h\,\omega_0\lt1\) kell, mert a lánc legmagasabb módusa közel \(2\omega_0\). Előnye, hogy nemlineáris rugókra is működik, hátránya, hogy a módusok frekvenciája kissé pontatlan, és módusonként nem állítható a csillapítás.
Ha a rendszert kívülről lökdössük, a rezgés akkor lesz a legnagyobb, ha a lökések ritmusa a sajátfrekvenciához illeszkedik (hinta). A rezonancia élességét a \(Q=\dfrac{1}{2\zeta}\) mutatja; a rezonancia sávszélessége kb. \(f_0/Q=2\zeta f_0\). Kis csillapítás: éles, hosszú rezonancia; nagy csillapítás: széles, rövid. A hangszertest is így működik: a húr „löki”, a test pedig azokat a frekvenciákat erősíti, amelyekhez rezonanciái vannak.
Egyetlen tömeg-rugó rezgő egyetlen tiszta hangot (egy módust) ad. A Karplus-Strong kör olyan, mintha sok rezgő szólna egyszerre, egész számú többszörösökre hangolva (1f, 2f, 3f...), mindegyik a saját ütemében halkulva. A húr valójában tömegek és rugók sora is lehetne: két tömegnél két hang, sok tömegnél sok hang lesz. Ez a következő óra témája.
Kössünk \(N\) azonos tömeget (\(m\)) azonos rugókkal (\(k\)) sorba: a fal – rugó – 1. tömeg – rugó – 2. tömeg – … – \(N\). tömeg elrendezésben az első rugó a falhoz van rögzítve, az utolsó tömeg szabadon lóg. Minden tömegre külön mozgásegyenlet van, és a szomszédok erőt adnak át egymásnak. Az eredmény \(N\) módus: \(N\) tiszta rezgésforma, mindegyiknek saját frekvenciája és alakja.
\( f_n=\dfrac{1}{\pi}\sqrt{\dfrac{k}{m}}\;\sin\dfrac{(2n-1)\pi}{2(2N+1)},\qquad u_n(j)=\sin\dfrac{(2n-1)\,j\,\pi}{2N+1} \)
(\(n=1\ldots N\) a módus, \(j=1\ldots N\) a tömeg sorszáma, \(u_n(j)\) a \(j\). tömeg kitérése az \(n\). módusban.) Ellenőrzés: \(N=1\)-re \(f_1=\frac{1}{2\pi}\sqrt{k/m}\), vagyis visszakapjuk az egyetlen tömeg-rugó rezgőt. Kis \(n\)-re a frekvenciák aránya közel \(1:3:5:\dots\) (páratlan többszörösök, mint a félig zárt síp), a magas módusok viszont a szinusz miatt „összesűrűsödnek”: a lánc nem pontosan harmonikus. Tömegarányos csillapításnál (minden tömegre ugyanaz a fék) minden módus ugyanolyan gyorsan cseng le, \(\sigma=c/2m\). Ha a szomszédok között is van fék, a magas módusok gyorsabban halnak el (\(\sigma_n=\frac{c}{2m}+\frac{\beta\omega_n^2}{2}\)): ezért tompul a pengetett húr hangja.
A hang előállítása: minden módus egy külön, két mintányi memóriájú rezgő (lásd 5. pont), és a kimenet ezek összege. Az \(n\). módus erőssége \(u_n(\text{ütés helye})\cdot u_n(\text{hallgatás helye})/\omega_n\): ha egy módus csomópontján ütsz, az a módus nem szólal meg.
// Egy tömeg-rugó-csillapítás rezgő ütésre adott válasza
// freq: a rezgés frekvenciája (Hz), decay: T60 lecsengési idő (mp)
(
{
var freq = 440, decay = 2.8;
Ringz.ar(Impulse.ar(0), freq, decay) * 0.1 ! 2 // halkan kezdj, majd állíts
}.play;
)
A Ringz ugyanezeket a pólusokat használó, két mintányi memóriájú rezonáns szűrő (a kimenetét még egy 0,5·(1 − z⁻²) tagon átvezeti, ezért ~1 csúcsú); a decay a 60 dB-es lecsengési idő. Sok rezgőhöz a Klank használható.
// n tömeg egy láncban, bal vége rögzített, jobb vége szabad
// f0: egy tömeg-rugó (1 tömeg) sajátfrekvenciája, t60: lecsengési idő (mp)
(
{
var n = 5, f0 = 439, t60 = 2.8;
var freqs = Array.fill(n, { |i| 2 * f0 * sin((2*i+1) * pi / (4*n+2)) });
// erősség: u(ütés)*u(hallgatás)/frekvencia; itt az utolsó (szabad) tömeget ütjük
var amps = Array.fill(n, { |i| sin((2*i+1) * n * pi / (2*n+1)).squared / freqs[i] });
var decays = Array.fill(n, t60); // tömegarányos fék: minden módus ugyanúgy cseng
Klank.ar(`[freqs, amps.normalizeSum, decays], Impulse.ar(0)) * 0.2 ! 2 // halkan kezdj
}.play;
)
A Klank egyszerre több Ringz-szerű rezgőt futtat; a frekvenciákat és az erősségeket az 8. pont képletei adják.
History a1(0); History a2(0); // 1. módus
History b1(0); History b2(0); // 2. módus
History c1(0); History c2(0); // 3. módus
Param f0(439, min=20, max=2000); // egy tömeg-rugó sajátfrekvenciája (Hz)
Param t60(2.8, min=0.05, max=10); // lecsengési idő (mp)
r = exp(-6.9078 / t60 / samplerate);
// f_n = 2 f0 sin((2n-1) pi / 14), kis csillapításnál a csillapított frekvencia is ennyi
th1 = twopi * 2 * f0 * sin(pi/14) / samplerate;
th2 = twopi * 2 * f0 * sin(3*pi/14) / samplerate;
th3 = twopi * 2 * f0 * sin(5*pi/14) / samplerate;
// erősség: u_n(3)^2 / omega_n (az ütés és a hallgatás is a 3. tömegnél van)
g1 = pow(sin(3*pi/7), 2) / sin(pi/14);
g2 = pow(sin(9*pi/7), 2) / sin(3*pi/14);
g3 = pow(sin(15*pi/7), 2) / sin(5*pi/14);
ya = in1 * sin(th1) * g1 + 2*r*cos(th1) * a1 - r*r * a2; a2 = a1; a1 = ya;
yb = in1 * sin(th2) * g2 + 2*r*cos(th2) * b1 - r*r * b2; b2 = b1; b1 = yb;
yc = in1 * sin(th3) * g3 + 2*r*cos(th3) * c1 - r*r * c2; c2 = c1; c1 = yc;
out1 = (ya + yb + yc) / (g1 + g2 + g3); // csúcs legfeljebb ~1
Ez három, párhuzamosan futó rezgő, mint az egzakt rezonátor. Az in1-re egyetlen mintányi impulzust küldj ([click~]).
History x(0); // kitérés (m)
History v(0); // sebesség (m/s)
Param m(0.010, min=0.0001, max=1); // tömeg (kg)
Param k(76000, min=100, max=5000000); // rugómerevség (N/m)
Param c(0.05, min=0.001, max=200); // csillapítás (N·s/m)
Param gain(25000, min=1, max=1000000); // csak a hallgatáshoz: kimenet = kitérés (m) · gain
h = 1 / samplerate; // lépésköz (s)
// in1 a külső erő F (N). Ütés: egy mintányi F = J / h erő (J az impulzus, N·s);
// pl. J = 1 mN·s, 44,1 kHz-nél F = 44,1 N. Más erő is jó (pl. szinusz: kényszerrezgés).
a = (in1 - c * v - k * x) / m; // F = m*a + c*v + k*x => a = (F - c*v - k*x) / m (m/s^2)
v1 = v + h * a; // új sebesség
x1 = x + h * v1; // szemi-implicit Euler: az ÚJ sebességgel lépünk
// explicit Euler lenne (INSTABIL, ha c < h*k): x1 = x + h * v;
v = v1;
x = x1;
out1 = x1 * gain; // 36 um * 25000 = ~0,9
Az in1-re egyetlen mintányi 44-es értéket küldj (például [click~] után [*~ 44]). Az m, k és c valódi egységekben állítható, a stabilitási feltételek az 5/c pontban vannak.
// A SuperCollider-ben a mintánkénti visszacsatolás nehézkes, ezért a nyelvi oldalon
// számoljuk ki a lépéseket, és puffert játszunk le. SI-egységek: kg, N/m, N·s/m, N, m, s.
(
s.waitForBoot {
var m = 0.010, k = 76000, c = 0.05; // tömeg, merevség, csillapítás
var j = 0.001; // az ütés impulzusa (N·s)
var h = 1 / s.sampleRate; // lépésköz (s)
var n = (s.sampleRate * 3).asInteger;
var x = 0, v = 0, a, f, sig = Signal.newClear(n);
n.do { |i|
f = if(i == 0) { j / h } { 0 }; // külső erő (N): egy lépésnyi erőimpulzus
a = (f - (c * v) - (k * x)) / m; // F = m*a + c*v + k*x
v = v + (h * a); // szemi-implicit Euler
x = x + (h * v); // kitérés (m)
sig[i] = x;
};
sig = sig * (0.3 / sig.abs.maxItem); // halkan kezdj
Buffer.loadCollection(s, sig, 1, { |b| b.play });
};
)
- k3 * x*x*x, ahol k3 [N/m³] a köbös merevség), és közben f0 is változhat. Ez az elméleti rész 5/b pontjának összevetése.History y1(0);
History y2(0);
Param freq(440, min=20, max=5000); // a rezgés frekvenciája (Hz)
Param t60(2.8, min=0.05, max=10); // lecsengési idő (mp)
sigma = 6.9078 / t60; // lecsengés (1/mp): ln(1000)/T60
r = exp(-sigma / samplerate);
theta = twopi * freq / samplerate;
y = in1 * sin(theta) + 2 * r * cos(theta) * y1 - r * r * y2; // az ütés az in1-en érkezik; a sin(theta) a csúcsot ~1-re skálázza
y2 = y1;
y1 = y;
out1 = y;
sin(theta) szorzó nélkül a kimenet csúcsa ~16-szoros lenne (440 Hz-nél), ami torzít és megbánthatja a fület. Az in1-re egyetlen mintányi impulzust küldj (pl. [click~]). Az \(f\) és a \(T_{60}\) üzenetként állítható. Ez a rezgő csillapított, ezért a \(\zeta<1\) esetet valósítja meg.| Feladat | Leírás |
|---|---|
| Oktávszabály | Válassz egy hangot, majd négyszerezd a merevséget (és külön a tömeget). Mérd az új frekvenciát. Mit várunk? |
| Kritikus határ | Keresd meg csúszkával azt a csillapítást, ahol a rezgés éppen eltűnik. Vesd össze a kiírt \(c_{krit}\)-tel. |
| T60-mérés | Számold ki \(13{,}8\,m/c\) értékét, és ellenőrizd a kiírt T60-nal és a hallott lecsengéssel. |
| Fázistér | Rajzold le kézzel a fázisteret harangra, kritikus és gumi esetre. Mit jelent a spirál egy fordulata? |
| Hangszín | Állíts be három egymástól nagyon eltérő hangot (harang, koppanás, gumi), és írd le a beállításokat. |
| Valódi mértékegységek | Válassz m, k, c értéket SI-egységekben, és számold ki: \(\omega_0\), \(c_{krit}\), \(v_0=J/m\), \(x_{max}\approx v_0/\omega_0\) és \(h\,k\). Ellenőrizd a demó kiírásával. Mekkora \(c\)-nél lesz az explicit Euler stabil? |
| Módszer-összevetés | Ütsd meg a Harangot mindhárom módszerrel. Melyik robban fel? Számold ki a \(h\omega_0^2/2\) értéket, és vesd össze a \(\sigma\)-val. Mekkora a „mért f” különbsége a szemi-implicit Euler és az egzakt között? |
| Két tömeg | N = 2: számold ki \(f_{1,2}\)-t a képlettel, és vesd össze a kiírt értékekkel. Hány Hz a különbségük, és mit hallasz, ha a kettő közel van? |
| Ütés helye | N = 5: ütögess minden tömegen, a hallgatás helye az 5. Melyik módus tűnik el vagy gyengül? Rajzold le az alakját. |
| Karplus és rezgő | Hasonlítsd össze: hány „hang” van egy tömeg-rugó rezgőben, és hány a Karplus-Strong hurokban? |