This release has been yanked by its maintainers, and will be ignored by installers, except when explicitly specified.
proximal-ladder
Render any sound at any simulated distance from a listener, in a room you design, with a head and a microphone you can set.
For each distance you get one mono file: the sound as the near ear of a
listener in the room receives it. Every file is loudness-matched, so only
the distance cues change. The exception is a file whose true peak would
exceed −1 dBTP at the target loudness: it is turned down, a warning says
so, and its loudness column shows the level. Each ladder comes with a
verification table and a params.json that reproduces it exactly.
pip install proximal-ladder
Status: beta (0.9). The models are tested and verified. Names and defaults may still change before version 1.0.
Quick start
import proximal_ladder as pl
lad = pl.ladder("kettle.wav",
distances=[3, 1, 0.3], # metres from the head centre
room_size=[8, 5, 3], # length x width x height of the room, metres
head_position=[2, 2.5, 1.2], # where the head is: x, y, ear height (metres)
rt60=0.5, # reverberation time, seconds (default 0.6)
head_radius=0.08) # metres (default 0.0875)
print(lad) # summary table
lad.save("results/", formats=["wav", "mp3"]) # audio + verification.csv + params.json
pl.ladder("kettle.wav").save("results/defaults/") # everything at its default
pl.glide("kettle.wav", far=3, near=0.2).save("results/glide") # a moving source
y = pl.render("kettle.wav", distance=0.3) # one position as a numpy array
The same ladder from the terminal:
proximal-ladder ladder kettle.wav --distances 3 1 0.3 --set 'room.dimensions=[8, 5, 3]' \
--set 'room.listener=[2, 2.5, 1.2]' --set room.rt60=0.5 --set head.radius=0.08
proximal-ladder room --set room.absorption=0.2 --set room.walls.floor=carpet_cotton --measure
proximal-ladder docs guide # the full guide
proximal-ladder room shows a room's reverberation before you render
anything.
What you can set
Any setting you leave out keeps its default. help(pl.ladder) lists the
common ones, and proximal-ladder docs parameters gives the full
reference.
| setting | meaning |
|---|---|
distances, azimuths |
where the source is: metres from the head centre, degrees (0 = ahead, +90 = the ear's side) |
room_size, head_position |
the room's [length, width, height], and the head's [x, y, ear height], in metres |
rt60, absorption, walls |
the room's reverberation time; or absorption for all surfaces or per wall, as a coefficient, 7 octave bands, or one of 90 named materials (proximal-ladder materials) |
head_radius, ear_azimuth |
the head |
mic |
"cardioid" or "fig8" |
lufs, loudness |
loudness target (−28 LUFS), or "relative" to keep level as a distance cue |
start, duration, tail |
which part of the file, and how much reverberation to keep at the end |
arm |
"combined" (room, head, mic), "reception" (room, head) or "capture" (mic only) |
Anything else uses the section and name joined by a double underscore,
e.g. room__max_order=50. Alternatively, pass a parameter file with
config= (on the terminal: -c); proximal-ladder config writes one
with every setting explained. Typos are refused with a suggestion.
The model
| stage | model |
|---|---|
| Room | image-source shoebox model (Allen & Berkley 1979, via pyroomacoustics), with air absorption |
| Head | exact rigid-sphere transfer function at the near ear (Duda & Martens 1998), below ~4 kHz |
| Microphone | proximity effect of a first-order gradient microphone |
| Loudness | ITU-R BS.1770, −28 LUFS, true peak ≤ −1 dBTP; ISO 532-1 sones reported |
Glides move the source continuously between two distances. Each comes in three versions:
- A: only the loudness changes.
- B: only the spatial cues change.
- C: both change, as the physics predicts.
The equations are in proximal-ladder docs model.
Limits:
- Mono output: one ear, not binaural.
- Shoebox room without scattering. With absorption on only a few surfaces the decay is longer than Sabine predicts, which
room --measureshows. - The head model is a rigid sphere.
- Sounds must be at least 0.4 s long.
- Renders are relative to the recording's own perspective.
Requirements
- Python: 3.9 or newer.
- Dependencies: numpy, scipy, soundfile, pyloudnorm, mosqito, pyroomacoustics, matplotlib (installed automatically).
- ffmpeg (optional): adds mp3, m4a and aac input, and mp3 output.
Credits
proximal-ladder implements published methods and builds on open-source libraries. Please also cite the works behind the parts you rely on.
- Room: the image-source method of Allen & Berkley (1979, JASA 65:943), computed with pyroomacoustics (Scheibler, Bezzam & Dokmanić 2018, ICASSP; MIT licence, © EPFL-LCAV). The absorption materials come from its database.
- Head: the rigid-sphere solution of Rabinowitz, Maxwell, Shao & Wei (1993, Presence 2:125), evaluated as in Duda & Martens (1998, JASA 104:3048). The validity band follows Brungart & Rabinowitz (1999, JASA 106:1465).
- Microphone: first-order gradient-microphone theory (Olson 1957; Beranek & Mellow 2012; Eargle 2004).
- Loudness: ITU-R BS.1770-4, measured with pyloudnorm (Steinmetz & Reiss 2021; MIT licence), whose K-weighting filter design is used at sample rates other than 48 kHz. ISO 532-1 loudness comes from MoSQITo (Apache 2.0).
- Also: NumPy, SciPy, python-soundfile/libsndfile, Matplotlib, and ffmpeg (optional, called as a separate program).
Licence
MIT © 2026 Rishi Yildiz. The licence covers this package's own code; the libraries above keep their own licences.
Metadata
Release files for proximal-ladder 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| proximal_ladder-0.9.0.tar.gz | 83.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| proximal_ladder-0.9.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 159.9 kB
Release files / proximal_ladder-0.9.0.tar.gz
| Download URL | proximal_ladder-0.9.0.tar.gz |
|---|---|
| Size | 83.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bfaac8fdf1b4d95b904c11445cd8737acec330b63c248bada1546222617522e2
|
|
BLAKE2b-256 checksum How to use checksums |
48bef37df0cecfd77afa138e6402e80763d5ce1665296eeeb219fea4c56febee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|
Release files / proximal_ladder-0.9.0-py3-none-any.whl
| Download URL | proximal_ladder-0.9.0-py3-none-any.whl |
|---|---|
| Size | 76.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc26e3d1dc9859aa8373d2c3b19f20db3c88481139f455612c6073f44e74905a
|
|
BLAKE2b-256 checksum How to use checksums |
19d51cd4bbb50bf768bc811684606d83a046b8937312553fca8ea4315feca297
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.5
|