5D Library › Vocal Biomechanics, Non-Linear Source-Filter Coupling and Auditory-Motor Feedback · 中文

Chapter 2 Nonlinear Source–Filter Coupling: Inertance, Compliance and the Semi-Occluded Tract

The premise of the linear theory

The source–filter theory set out systematically by Fant in 1960 divides the voice into two independent parts: the pulses of airflow produced at the glottis (the source) and the vocal tract that filters them (the filter) (Fant 1960). The theory has been enormously successful, and Chapter 2 of Volume 10 used it to compute the formants of a uniform tube. But it rests on a hidden premise: the source is not affected by the filter; sound pressure in the tract does not feed back to change the glottal flow or the vibration of the folds.

Evidence

Titze and Story pointed out that the linear theory usually works because the glottis often behaves as a high-impedance, nearly constant-flow source; but imaging shows the epilarynx (laryngeal vestibule, or larynx tube) to be quite narrow, which can make the input impedance of the vocal tract comparable to the glottal impedance, and then strong interactions occur. They also noted that the inertance of the vocal tract facilitates vocal fold vibration by lowering the oscillation threshold pressure, and that the epilarynx tube is also what produces the singer’s formant (Titze and Story 1997). In 2008 Titze divided source–filter interaction into two levels: at the first, acoustic pressures in the tract help drive the glottal airflow (skewing the flow pulse and generating extra harmonics); at the second, they help drive the vocal folds themselves, changing the onset, amplitude and stability of vibration and even causing bifurcations. The degree of interaction is controlled mainly by the cross-sectional area of the epilarynx: the narrower it is, the larger the inertive reactance of the supraglottal tract; and when harmonics pass through formants during changes of pitch or vowel, vibration modes may become unstable (Titze 2008).

Inertance and compliance

The input impedance that the vocal tract presents to the glottis, Zin=R+jXZ_{\text{in}} = R + jX, has a real part (resistance) and an imaginary part (reactance). When X>0X > 0 the reactance is inertive: the air column in the tract behaves like a mass, producing positive pressure above the glottis while the flow accelerates and negative pressure while it decelerates. When X<0X < 0 it is compliant: the air column behaves like a spring, and pressure follows the accumulated volume rather than the acceleration.

For a uniform tube closed at the glottis and open at the lips, Zin=jZ0tan⁡(kL)Z_{\text{in}} = jZ_0\tan(kL): inertive below the first formant, compliant in a band above it. The program below uses a chain of tube sections (2.5 cm of epilarynx, 15 cm above it) with a little loss, yielding walls and radiation at the lips.

Calculation

# Input impedance Z_in = R + jX of the vocal tract seen from the glottis (X > 0 inertive,
# X < 0 compliant): lossy tube sections chained glottis -> lips, a yielding-wall shunt per
# section (typical mass and resistance), piston radiation at the open end. Illustrative.
import cmath, math

# air; wall mass (kg/m^2), resistance (N s/m^3)
RHO, C, MW, RW = 1.14, 350.0, 15.0, 16000.0

def z_in(f, secs):
    w = 2 * math.pi * f; k = w / C * (1 - 0.004j); s_end = secs[-1][1]
    a = math.sqrt(s_end / math.pi)
    zl = RHO * C / s_end * ((w / C * a) ** 2 / 2 + 0.8j * w / C * a)     # radiation load
    A, B, Cc, D = 1, 0, 0, 1
    for l, s in secs:
        z0, ca, sa = RHO * C / s, cmath.cos(k * l), cmath.sin(k * l)
        A, B, Cc, D = (A * ca + B * 1j * sa / z0, A * 1j * z0 * sa + B * ca,
                       Cc * ca + D * 1j * sa / z0, Cc * 1j * z0 * sa + D * ca)
        yw = 2 * math.sqrt(math.pi * s) * l / (RW + 1j * w * MW)            # wall shunt
        A, Cc = A + B * yw, Cc + D * yw
    return (A * zl + B) / (Cc * zl + D)

# 2.5 cm epilarynx + 15 cm at 3 cm^2 (+ straw)
def tract(epi_cm2, straw=None):
    secs = [(0.005, epi_cm2 * 1e-4)] * 5 + [(0.01, 3.0e-4)] * 15
    if straw:
        secs += [(straw[0] / 14, math.pi * straw[1] ** 2 / 4)] * 14
    return secs

FREQS = list(range(60, 2001, 2))
CONFIGS = (("neutral, epilarynx 2.0 cm2", tract(2.0)),
           ("narrow epilarynx 0.5 cm2", tract(0.5)),
           ("narrow + straw 14 cm x 4 mm", tract(0.5, (0.14, 0.004))))

if __name__ == "__main__":
    for name, secs in CONFIGS:
        z = [z_in(f, secs) for f in FREQS]
        m = [abs(v) for v in z]
        peaks = [FREQS[i] for i in range(1, len(z) - 1) if m[i - 1] < m[i] > m[i + 1]]
        edges = [FREQS[0]] + [FREQS[i] for i in range(1, len(z))
                              if (z[i].imag > 0) != (z[i - 1].imag > 0)] + [FREQS[-1]]
        bands = [f"{a}-{b}" for a, b in zip(edges[::2], edges[1::2])]
        print(f"{name}: impedance peaks (formants) {', '.join(map(str, peaks[:3]))} Hz")
        print("   inertive (X > 0) bands: " + ", ".join(bands) + " Hz")
        xs = [f"{f0}:{z_in(f0, secs).imag / 1e6:+5.2f}"
              for f0 in (110, 220, 330, 440, 660)]
        print("   X at f0 (MPa s/m^3)  " + "  ".join(xs))
    i0, i1 = (z_in(150, tract(a)).imag / (2 * math.pi * 150) for a in (0.5, 2.0))
    print(f"effective inertance X/w at 150 Hz: {i1:.0f} (neutral) vs {i0:.0f} kg/m^4"
          " (narrow epilarynx)")
# neutral, epilarynx 2.0 cm2: impedance peaks (formants) 542, 1508 Hz
#    inertive (X > 0) bands: 60-544, 932-1510, 1870-2000 Hz
#    X at f0 (MPa s/m^3)  110:+0.51  220:+1.08  330:+1.98  440:+4.29  660:-3.19
# narrow epilarynx 0.5 cm2: impedance peaks (formants) 580, 1624 Hz
#    inertive (X > 0) bands: 60-582, 748-1632, 1734-2000 Hz
#    X at f0 (MPa s/m^3)  110:+0.80  220:+1.65  330:+2.75  440:+4.75  660:-3.47
# narrow + straw 14 cm x 4 mm: impedance peaks (formants) 208, 1132, 1344 Hz
#    inertive (X > 0) bands: 60-210, 386-1134, 1232-1362, 1366-2000 Hz
#    X at f0 (MPa s/m^3)  110:+1.25  220:-0.42  330:-0.75  440:+0.64  660:+2.56
# effective inertance X/w at 150 Hz: 741 (neutral) vs 1164 kg/m^4 (narrow epilarynx)
Input reactance of three vocal-tract configurations. The neutral vowel (grey) is inertive below its first formant at about 540 Hz and compliant just above it; a narrow epilarynx (blue) raises the low-frequency inertance by about a half; adding a straw 14 cm long with a 4 mm bore (dark red, dashed) lowers the first resonance to about 210 Hz, with a compliant band from about 210 to 390 Hz and a wide inertive band from about 390 to 1130 Hz. Parameters are illustrative.

The result matches the qualitative description of the theory. For the neutral tract the first impedance peak (corresponding to the first formant) is at 542 Hz: everything below it is inertive, 544–932 Hz is compliant, and 932–1510 Hz is inertive again. Narrowing the epilarynx from 2.0 to 0.5 cm² raises the effective inertance at 150 Hz (X/ωX/\omega) from 741 to 1164 kg/m⁴, an increase of about 57 %, and nudges the first formant up to 580 Hz. In the common speaking range and the male singing range (100–400 Hz), then, narrowing the epilarynx markedly increases the mass of air “behind” the vocal folds.

How the tract load changes the threshold pressure

The threshold formula of Chapter 1 has no vocal tract. Now connect the simplest possible tract load: one fold (mass, damping, stiffness), a rectangular glottis, and a pressure above the glottis set jointly by the tract load and the flow. Linearising the system around its rest point gives a cubic characteristic polynomial, and the Routh–Hurwitz criterion (a2a1>a3a0a_2a_1 > a_3a_0) tells us when it loses stability.

Calculation

# Onset pressure with a vocal-tract load: one fold, m x'' + b x' + k x = Am (p_wave +
# p_e). p_wave: Titze's surface-wave term, a negative damping Am P T / (kt c xi0). p_e:
# pressure above the glottis from load Z; linearised Bernoulli gives
#   p_e = Z G x / (g1 + Z),  g1 = sqrt(2 rho P) / a0,  G = 4 P Lg / a0
# Z = I s (inertive) or 1/(Ca s) (compliant). The characteristic cubic is tested with
# Routh-Hurwitz (a2 a1 > a3 a0). Parameters illustrative, as in p02.
import math

RHO, KT, BAREA, CW, T, XI0, LG = 1.14, 1.1, 800.0, 1.0, 0.003, 0.001, 0.014
# medial area, rest glottal area (m^2), mass (kg)
AM, A0, M = LG * T, 2 * LG * XI0, 1e-4
# 120 Hz natural frequency; damping
K, B = M * (2 * math.pi * 120) ** 2, BAREA * LG * T

def poly(P, inert=0.0, compl=None, wave=True):
    b = B - (AM * P * T / (KT * CW * XI0) if wave else 0.0)
    g1, alpha = math.sqrt(2 * RHO * P) / A0, AM * 4 * P * LG / A0
    if compl is not None:                       # force = alpha x / (1 + tc s)
        tc = g1 * compl
        return M * tc, M + b * tc, b + K * tc, K - alpha
    if inert == 0.0:
        return 0.0, M, b, K
    tau = inert / g1                            # force = alpha tau s x / (1 + tau s)
    return M * tau, M + b * tau, b + (K - alpha) * tau, K

def unstable(c):
    a3, a2, a1, a0 = c
    return (a1 <= 0 or a0 <= 0) if a3 == 0.0 else (min(c) <= 0 or a2 * a1 <= a3 * a0)

def show(label, **kw):
    lo, hi = 1.0, 5000.0
    if not unstable(poly(hi, **kw)):
        return print(f"{label:46s} no onset below 5 kPa")
    for _ in range(60):
        mid = (lo + hi) / 2
        lo, hi = (lo, mid) if unstable(poly(mid, **kw)) else (mid, hi)
    a3, a2, a1, a0 = poly(hi, **kw)
    f = math.sqrt(a1 / a3 if a3 else K / M) / (2 * math.pi)
    print(f"{label:46s} Pth = {hi / 98.07:4.2f} cm H2O, onset near {f:3.0f} Hz")

show("surface wave only, no tract (Titze 1988)")
show("no surface wave, no tract (straight glottis)", wave=False)
show("no surface wave, inertive tract 741 kg/m^4", wave=False, inert=741.0)
show("no surface wave, inertive tract 1164 kg/m^4", wave=False, inert=1164.0)
show("surface wave + neutral tract (741 kg/m^4)", inert=741.0)
show("surface wave + narrow epilarynx (1164 kg/m^4)", inert=1164.0)
xc = 2 * math.pi * 120 * 741.0                  # same |X| at 120 Hz, but compliant
show("surface wave + compliant load of equal |X|", compl=1 / (2 * math.pi * 120 * xc))
# surface wave only, no tract (Titze 1988)       Pth = 2.99 cm H2O, onset near 120 Hz
# no surface wave, no tract (straight glottis)   no onset below 5 kPa
# no surface wave, inertive tract 741 kg/m^4     Pth = 10.32 cm H2O, onset near 112 Hz
# no surface wave, inertive tract 1164 kg/m^4    Pth = 6.24 cm H2O, onset near 106 Hz
# surface wave + neutral tract (741 kg/m^4)      Pth = 2.02 cm H2O, onset near 114 Hz
# surface wave + narrow epilarynx (1164 kg/m^4)  Pth = 1.96 cm H2O, onset near 110 Hz
# surface wave + compliant load of equal |X|     Pth = 5.17 cm H2O, onset near 111 Hz

This sketch reproduces several points of Titze’s theory. With the surface wave alone (the mechanism of Chapter 1), the threshold is 2.99 cm H2O and oscillation starts near the 120 Hz natural frequency of the fold. With neither surface wave nor tract, the rectangular glottis does not start below 5 kPa: another face of “a symmetric shape gains no energy”. With an inertive tract but no surface wave, the fold can still start (10.3 cm H2O for an inertance of 741 kg/m⁴, 6.2 cm H2O for 1164): the inertia of the air column makes the pressure above the glottis positive while the glottis opens (the flow accelerates) and negative while it closes, in step with the motion, which does the job of the phase difference. This is the second level of interaction that Titze emphasised in 2008.

With both mechanisms present, the neutral tract lowers the threshold from 2.99 to 2.02 cm H2O (by about 32 %) and the narrow epilarynx to 1.96 (about 34 %). In this model, narrowing the epilarynx adds only a little on top of the neutral tract, because the surface wave already supplies most of the negative damping. Conversely, a compliant load of the same size raises the threshold to 5.17 cm H2O (by about 73 %): the pressure lags the motion and draws energy out of the tissue. That is the physical meaning of “below F1 the tract helps vibration; above F1, in the compliant region, it hinders it”.

Note

This model is crude. It has a single mass and a frequency-independent reactance, and ignores the inertia of air within the glottis, the movement of the flow-separation point and collision; the reactance is taken at 150 Hz, whereas a real tract’s reactance changes with frequency. A three-dimensional computational study, reviewing earlier work, notes that the effect of epilaryngeal narrowing on the threshold pressure is not always consistent, and that the opposite effect has also been observed (Zhang 2023). The program shows direction and mechanism only, not numbers that could be applied to any singer.

F0 crossing F1: instability and “voice breaks”

Evidence

Titze, Riede and Popolo asked nine adult men and nine adult women to perform three gliding exercises that combined fundamental-frequency glides with formant glides. Their hypothesis was that vocal fold vibration is most destabilised when F0 crosses F1, where the acoustic load changes dramatically, so that sudden frequency jumps, subharmonics or chaotic vibration should coincide with the crossings. The bifurcations did occur more often in phonations with F0–F1 crossovers, and the authors concluded that nonlinear source–filter coupling is partly responsible for source instabilities; men showed more bifurcations at the crossings, which the authors attributed to men’s lack of practice with such crossings in everyday speech (Titze et al. 2008).

This supports the framework’s statement but also marks its limits. First, the study speaks of “more often” and “partly responsible”, not of instability at every crossing. Second, what singers usually call a “voice break” is the sudden jump at a register transition (M1/M2 in Chapter 4), which comes mainly from a change in the vibratory mechanism of the laryngeal muscles and fold tissue; tract loading can trigger or aggravate such a jump but is not its only cause. Third, sopranos in their upper range commonly tune F1 close to F0 (formant tuning) (Sundberg 1977), which shows that the relation between F0 and F1 can be trained and exploited rather than being an inevitable “danger zone”.

Semi-occluded vocal tract exercises: straws and water

Semi-occluded vocal tract exercises (SOVTE) include lip trills, tongue trills, bilabial fricatives, humming, and phonation into straws or into tubes held in water.

Evidence

In 2006 Titze used computer simulation with a self-oscillating vocal fold model and a 44-section vocal tract to give these exercises a theoretical rationale: a semi-occlusion at the lips raises the mean supraglottal and intraglottal pressures and so heightens source–tract interaction; the aim of training is to match the glottal impedance to the input impedance of the vocal tract, and the same benefits can be obtained without lip occlusion through vocal fold adduction and epilarynx narrowing (Titze 2006). In a short column for singers, Titze wrote that a straw lowers the first resonance of the tract to about 200 Hz, so that the lower harmonics fall above F1 and below F2 in inertive territory; and that the threshold pressure is lowered and vibration amplitude and collision forces reduced when the folds are slightly separated with parallel surfaces before onset (Titze 2018).

Our impedance program (the dark red dashed curve in Figure 1) gives a finer picture. With a straw 14 cm long and 4 mm in bore, the first impedance peak falls to 208 Hz, matching “about 200 Hz”; but in this model there is a compliant band from about 210 to 390 Hz immediately above it, and a wide inertive band from about 390 to 1130 Hz above that. For a 220 Hz tone, then, the fundamental itself sits in the compliant band (X=−0.42X = -0.42), while the second to fifth harmonics (440–1100 Hz) are all inertive. “A straw raises inertance” should not be read as “everything becomes inertive”: what changes is which harmonics fall in favourable regions of reactance.

A straw has a more direct effect as well: back pressure.

Calculation

# Mouth back pressure during straw phonation, and the extra pressure with the tip in
# water. Straw: Poiseuille friction + kinetic loss of the exit jet (a rough engineering
# estimate):
#   dP = 8 mu L U / (pi r^4) + rho U^2 / (2 A^2);   water: dP_w = rho_w g h
# Transglottal pressure (lung minus mouth) drives the folds; lung pressure held at 10 cm
# H2O. Flows and sizes are illustrative.
import math

RHO, MU, RHO_W, G = 1.14, 1.85e-5, 1000.0, 9.81
CM = 98.07                                     # Pa per cm H2O
P_LUNG = 10.0                                  # cm H2O

def straw_dp(flow_lps, length_m, diam_m):
    u = flow_lps / 1000.0
    r, area = diam_m / 2, math.pi * diam_m ** 2 / 4
    lam = 8 * MU * length_m * u / (math.pi * r ** 4)
    kin = RHO * u * u / (2 * area * area)
    re = RHO * (u / area) * diam_m / MU
    return (lam + kin) / CM, re

print("straw 14 cm long, flow 0.15 L/s (soft sustained tone):")
print("  inner diameter | mouth pressure | transglottal | Reynolds number")
for d_mm in (8.0, 6.0, 4.0, 3.0):
    dp, re = straw_dp(0.15, 0.14, d_mm / 1000)
    print(f"      {d_mm:3.0f} mm      |  {dp:5.2f} cm H2O  |  {P_LUNG - dp:5.2f} cm H2O"
          f" | {re:6.0f}")
dp, _ = straw_dp(0.15, 0.27, 0.009)
print(f"resonance tube 27 cm x 9 mm (tube phonation): {dp:.2f} cm H2O before any water")
print("adding water at the tube tip (depth below the surface):")
for h_cm in (2, 5, 10):
    pw = RHO_W * G * h_cm / 100 / CM
    tg = P_LUNG - dp - pw
    print(f"  {h_cm:2d} cm deep: +{pw:4.1f} static -> mouth {dp + pw:4.1f}, "
          f"transglottal {tg:4.1f} cm H2O")
    if tg < 3:
        print("             (below a typical onset pressure: lung pressure must rise)")
print("note: bubbling adds a pressure ripple at a few to tens of Hz (not modelled here)")
# straw 14 cm long, flow 0.15 L/s (soft sustained tone):
#   inner diameter | mouth pressure | transglottal | Reynolds number
#         8 mm      |   0.09 cm H2O  |   9.91 cm H2O |   1471
#         6 mm      |   0.29 cm H2O  |   9.71 cm H2O |   1961
#         4 mm      |   1.46 cm H2O  |   8.54 cm H2O |   2942
#         3 mm      |   4.61 cm H2O  |   5.39 cm H2O |   3923
# resonance tube 27 cm x 9 mm (tube phonation): 0.08 cm H2O before any water
# adding water at the tube tip (depth below the surface):
#    2 cm deep: + 2.0 static -> mouth  2.1, transglottal  7.9 cm H2O
#    5 cm deep: + 5.0 static -> mouth  5.1, transglottal  4.9 cm H2O
#   10 cm deep: +10.0 static -> mouth 10.1, transglottal -0.1 cm H2O
#              (below a typical onset pressure: lung pressure must rise)
# note: bubbling adds a pressure ripple at a few to tens of Hz (not modelled here)

At a gentle flow of 0.15 L/s, narrowing a 14 cm straw from 8 mm to 3 mm raises the mouth pressure from under 0.1 to about 4.6 cm H2O (both friction and the loss of the exit jet’s kinetic energy rise steeply as the bore shrinks). The Reynolds numbers in the table, about 2900 and 3900 for the 4 mm and 3 mm straws, exceed the usual laminar limit for pipe flow (about 2300), so the Poiseuille term is only a rough estimate and the real friction loss may be larger. With the lung pressure held at 10 cm H2O, the transglottal pressure falls from 9.9 to 5.4 cm H2O. In water-resistance exercises each centimetre of immersion of the tube tip adds about 1 cm H2O of static pressure in the mouth: the transglottal pressure is about 7.9 at 2 cm and about 4.9 at 5 cm; at 10 cm it falls to around zero, and the singer must raise the lung pressure to keep phonating. Deeper water is therefore not “more exercise”: it changes the pressure balance across the glottis and adds the pressure ripple of the bubbles.

Evidence

As for actual effects, a within-subject study in which 36 participants performed straw phonation and straw phonation into water found that shimmer fell significantly after straw phonation and that most acoustic measures improved to some degree; but after phonation into water, listener-rated strain rose significantly, and self-rated vocal effort did not differ between the two exercises (Ford et al. 2024). The three-dimensional computational study mentioned above concluded that the therapeutic benefit of semi-occluded exercises probably does not lie in directly improving vocal efficiency or economy (Zhang 2023).

The mechanisms of SOVTE therefore sit on three levels: reliable physics (back pressure, a lowered first resonance, redistributed reactance); plausible physiology still to be tested (slightly separated folds, less collision, lower threshold); and uncertain practical effects.

Chapter summary

Linear source–filter theory assumes that the source is unaffected by the tract, which holds when glottal impedance far exceeds tract impedance; with a narrow epilarynx the two become comparable and nonlinear interaction appears. Titze (2008) divides it into a level that drives the airflow and a level that drives the folds. Below its first formant the tract is inertive, and inertance puts the pressure above the glottis in step with fold motion, lowering the threshold pressure (by about a third in the sketch), while a compliant load raises it. Bifurcations are more frequent when F0 crosses F1, but “voice breaks” are chiefly a laryngeal register mechanism, with acoustic loading as one factor. A straw lowers the first resonance to about 200 Hz, changes the reactance region in which each harmonic falls and creates back pressure; consistent evidence for its practical effects is still lacking. The next chapter returns to the singer’s formant of Volume 10 and does the signal-to-noise accounting under stated assumptions.

References

Fant, Gunnar. 1960. Acoustic Theory of Speech Production. Mouton.
Ford, D. S., Eric J. Hunter, and Dimitar D. Deliyski. 2024. “Immediate Effects of Semi-Occluded Vocal Tract Exercises on Acoustic, Auditory-Perceptual, and Self-Perceptual Measures of Voice Production.” Folia Phoniatrica Et Logopaedica 76 (5): 467–81. https://doi.org/10.1159/000536002.
Sundberg, Johan. 1977. “The Acoustics of the Singing Voice.” Scientific American 236 (3): 82–91.
Titze, Ingo R. 2006. “Voice Training and Therapy with a Semi-Occluded Vocal Tract: Rationale and Scientific Underpinnings.” Journal of Speech, Language, and Hearing Research 49 (2): 448–59. https://doi.org/10.1044/1092-4388(2006/035).
Titze, Ingo R. 2008. “Nonlinear Source–Filter Coupling in Phonation: Theory.” Journal of the Acoustical Society of America 123 (5): 2733–49. https://doi.org/10.1121/1.2832337.
Titze, Ingo R. 2018. “Major Benefits of Semi-Occluded Vocal Tract Exercises.” Journal of Singing 74 (3): 311–12.
Titze, Ingo R., Tobias Riede, and Peter Popolo. 2008. “Nonlinear Source–Filter Coupling in Phonation: Vocal Exercises.” Journal of the Acoustical Society of America 123 (4): 1902–15. https://doi.org/10.1121/1.2832339.
Titze, Ingo R., and Brad H. Story. 1997. “Acoustic Interactions of the Voice Source with the Lower Vocal Tract.” Journal of the Acoustical Society of America 101 (4): 2234–43. https://doi.org/10.1121/1.418246.
Zhang, Zhaoyan. 2023. “The Influence of Source-Filter Interaction on the Voice Source in a Three-Dimensional Computational Model of Voice Production.” Journal of the Acoustical Society of America 154 (4): 2462–75. https://doi.org/10.1121/10.0021879.

Fan, Y. (2026). Vocal Biomechanics, Non-Linear Source-Filter Coupling and Auditory-Motor Feedback: From Titze's Self-Sustained Vocal Fold Oscillation and Vocal-Tract Inertance to the Lombard Effect, Read Beside Classical Chinese Vocal Aesthetics [嗓音生物力学、非线性源-滤波耦合与听觉-运动反馈的数学模型] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23770084 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).