Skip to content

Releases: naelolaiz/acoustic-spaces

4.0.0: takes the simulation outdoors, into wind and weather, woods, terrain and whole cities, makes every reflection fade in and out at the edges that cut it off, adds line arrays summed box by box, sources and listeners that move along keyframes, a car passing by with Doppler, demos of any scene and packs to run on another computer, and gives binaural renders back their treble.

@naelolaiz naelolaiz released this 25 Oct 19:17
e880ee5

Results change from 3.2.3 in a few cases. Every binaural output changes: an HRTF between the measured directions had lost treble (at 8 kHz up to 13.6 dB from some directions and 2.7 dB on average over all, more in higher bands), and now keeps the measured spectrum within 1 dB. A response that ends in silence no longer has decay times read from the drop after its last sound; they are NaN where the curve does not fall through their range. auralize and walkthrough mix sources at their sound power (--equal-power keeps the old mix). On Apple silicon the last bits now round as on the other platforms. Where edges diffract (diffraction is first_order by default), the early part changes: reflections with more bounces than the edge diffraction bends now fade in and out at the edges instead of stepping. In the examples the early energy changes by up to 5.2 dB at 63 Hz behind the archway's wall, 2.8 dB at 63 Hz in the leaky classroom's back row, 2.2 dB at 63 Hz in the orchestra's middle stalls, 1.4 dB in the street's garden, 1.4 dB round the gallery's corner and 1.0 dB in the concert hall's rear stalls. Other indoor results differ by less than 0.0001 dB. Scene files of 3.2.3 load unchanged.

Highlights

  • Reflections that fade at edges. Every specular path, of any order, now fades in and out at the edges that cut it off, as the exact solution does (within 0.2 dB past a screen's end, a building's corner, a strip and a gap), instead of coming or going at full strength, also where two events stop a path at once, as a reflection past the end of its face with a corner in the way. A car passing a gap between houses no longer jumps by up to 11.4 dB(A) from one metre to the next, and walking round the gallery's corner 1 cm at a time steps by at most 0.13 dB instead of up to 3.8 dB. Indoors, where paths add in energy from 250 Hz up, the terms at one edge event take their cross terms, so round a narrow face they nearly cancel, as they do in pressure. Some steps are left: up to 1.4 dB in one band (0.35 dB(A)) where the street's car passes the ends of the barrier, at the corners of edges, and up to 1.4 dB at 250 and 500 Hz behind the archway's wall where the reflection off the arch's jamb appears. The validation report lists them, with what is not checked yet.
  • Outdoor acoustics. A scene can stand on a ground under an open sky, with buildings, barriers, terrain and buildings from a map, porous grounds, wind and temperature gradients, turbulence, vegetation, weather zones, weather classes with levels over a year (L_den), moving sources with Doppler and whole cities. It runs on the GPU too and is checked against exact solutions and a fast field program.
  • Line arrays box by box. near_field: true adds up an array's elements one by one wherever a path leaves it, so near listeners hear it as a line does.
  • Movement along keyframes. Walks go through keyframes, every mover goes at once on one clock in one simulation (walkthrough --all), and the editor's Movement panel edits them on a timeline. A walk can be turned off, so one scene serves still and moving.
  • Demos of any scene. acoustic-spaces demo scene.yaml mixes what every listener hears and makes a video that tours them. The example demos (an orchestra in the concert hall, a choir and organ in the church, a stadium concert, a lakeside concert, a walk through a gallery and a car passing on a road and along a street) run from the command line or from Simulation > Run demo…, with WAV files and songs of your own.
  • A car passing by. The roadside and street examples have a car with CNOSSOS-EU's sound power at 50 km/h, and passby_demo.py drives it past every listener with Doppler, each early path through its own changing delay, with the level over time, L_Amax and SEL. The demo of any scene plays a walk with Doppler too.
  • Free HRTF sets. acoustic-spaces hrtf and the editor's Download HRTFs… fetch the KU100, KEMAR and Viking sets with their licences.
  • Packs for another computer. acoustic-spaces pack puts a scene and every file it names in one zip that every command takes, and a container image runs packs headless on a GPU.
  • ISO 3382-2 checks. Every T20 and T30 comes with its non-linearity and the decay with its curvature, in amber in the editor past the standard's limits.

New

Outdoors

  • geometry.ground: a ground under an open sky, with buildings, barriers and a model's objects standing on it. Outdoors, ir_length_s counts from the latest direct sound, coverage maps cover the ground, and every response gives its level relative to free field.
  • Porous grounds (impedance): Nord2000's ground classes or a flow resistivity, locally or extendedly reacting, with ground zones of their own materials. Reflections take the spherical wave's reflection factor, within 0.05 dB of the exact solution over grass and harder grounds.
  • Wind and temperature (atmosphere): curved eigenrays, a parabolic equation below 500 Hz and up to 2 kHz near a shadow (narrow or wide angle), the wave solver with a speed of sound per cell or in moving air, and weather zones.
  • Turbulence: coherence between paths and sound scattered into shadows, weaker with height if asked.
  • Vegetation: belts of trees, hedges and lone trees, from presets, measured rates or the leaves' size and density.
  • Terrain from a grid of heights and buildings from GeoJSON, with diffraction over crests.
  • Long-term levels: weather classes and their shares of the time give the level over a year and L_den.
  • Insertion loss of named buildings, barriers or vegetation (--without), and reflections on both sides of an edge.
  • Doppler on walks (doppler: true), with pass-by levels (maximum, SEL, L_Aeq), and a car in roadside and street with CNOSSOS-EU's sound power of a passenger car (left out of their simulations until ticked).
  • Whole cities: edge diffraction skips the edges no path can use, so a city of 900 buildings simulates in 17 s on four cores with the reflections that fade at edges (2.6 s without them) instead of 81 s, with the same results.
  • New examples: street, roadside, open_air_stage, tree_belt, hillside, lakeside_concert.

Edge diffraction

  • Reflections that fade at edges (engine.edge_fade): every specular path takes the uniform theory of diffraction's term of its own boundary at each edge near each of its events, and a narrow face reflects only in part at low frequencies. A path that two events stop is followed where one or two edges explain them, and reflections off perpendicular planes try each order. Indoors, from 250 Hz up, the terms at one event take their cross terms with each other and with the edge diffraction's. Checked against the exact solution (validation/edge_fade.py). It comes with any diffraction but none and costs time where edges diffract: a hall with 16 edges takes 296 ms per source and listener instead of 83 ms.

Sound systems

  • Coherent arrays element by element (near_field: true).
  • Groups of sources and listeners (group, nested with /) and enabled: false to leave one out of runs; the editor's scene tree shows the groups with a tick and an eye each.
  • New examples: stadium_pa, concert_stage (with a feedback check) and stadium_concert.

Movement

  • keyframes on a walk (no speed to set), walk.enabled, walkthrough --all for every mover at once, and the editor's Movement panel: keyframes in a table, a timeline you can lengthen, handles to drag in the plan and the 3D view, and Render movement….
  • gallery_walk is merged into gallery, whose visitor walks unless its walk is turned off.
  • The Movement panel's Doppler tick; a line or surface source's form shows Moves greyed, with a tip saying only a point source moves.
  • The Movement panel edits a walk through points too: its start and points with the time each is reached, a point typed or dragged in the plan or the 3D view, Add point, Remove point and one speed for the whole walk.
  • Render movement… writes the output picked in the panel's Output list, binaural first (through a spherical head when the scene has none), and plays a walk with Doppler when it is the only walk that moves.

Demos

  • acoustic-spaces demo for any scene: each source plays the WAV file its signal names, the walks that are on move, and the video tours the listeners with the level, arrival and reverberation time at each.
  • Example demos share one package, acoustic_spaces.demos, take --hrtf and --input SOURCE=WAV, and the stadium and the lakeside play your own song (--music, --bpm, --stem). Every still says how its sound was made.
  • passby_demo.py in roadside and street: a car at the speed of its walk or --speed in km/h (a walk through points or keyframes timed for one steady speed), its sound made to CNOSSOS-EU's sound power (tyre noise and a four-cylinder engine, or a dry recording with --input car=WAV), heard pass by every listener with Doppler; the video shows the car moving and the level over time.
  • The demo of any scene plays a walk with Doppler when it is the only walk that moves.
  • Simulation > Run demo… in the editor, with the options and their units, the sources' files, what moves, and a line with the walk's length, speed and how long it lasts.
  • Demos lists each recording's source and licence; the videos are in the playlist.

Editor

  • File > New outdoor scene, drawing buildings, barriers, zones and vegetation in the plan, and the wind drawn with Show wind and Show wind profile.
  • A progress bar that says what runs, with Cancel; Messages with filters by kind, item and words.
  • Markers sized from the scene, and a coverage map you can see through.
  • Download HRTFs…, Plays ...
Read more

Added extra languages

Choose a tag to compare

@naelolaiz naelolaiz released this 18 Oct 15:34
ca0efbf

Added extra languages for editor and CLI text:

  • Catalan
  • Italian
  • German
  • Dutch

3.2.2: wgpu fix and languages (spanish) Latest

Choose a tag to compare

@naelolaiz naelolaiz released this 17 Oct 19:45

Spanish

The editor now speaks Spanish. Menus, panels, forms, hover tips, messages, the lists of choices, the coverage map's parameters, the examples and the plots are all translated, with the acoustics terms of UNE-EN ISO 3382. Numbers follow the computer's regional settings (0,85 in Spain, 0.85 in Mexico).

The language follows the computer's. View > Language picks one in the editor, and ACOUSTIC_SPACES_LANG=es or en overrides both. Scene files, commands and options stay in English, so scenes work the same in either language. The command line and the library's messages (room checks, run progress) are still in English and come next.

Fixes

  • The editor no longer aborts with a wgpu panic (egl.rs ... BadAccess) when it looks for a GPU on Linux with the gpu extra. wgpu now uses Vulkan, Metal or Direct3D 12 only.

Install or upgrade with pip install -U acoustic-spaces. See the changelog for details.

3.2.1: added wheels for Intel Macs, so pip installs it there without a compiler, and makes loudspeaker panning give the same gains on every processor.

Choose a tag to compare

@naelolaiz naelolaiz released this 16 Oct 19:08
5066c0b

Results are the same as 3.2.0's, except that loudspeaker gains of 1e-12 or less (below -240 dB) are now exactly 0. Scene files of 3.2.0 load unchanged.

New

  • Wheels for Intel Macs. pip install acoustic-spaces on an Intel Mac (macOS x86-64) now gets a ready-built wheel for CPython 3.10 to 3.14 instead of building the package from source with a C++17 compiler. CI builds these wheels on GitHub's Intel macOS runner and runs the tests and the editor's tests there too.

Fixes

  • Loudspeaker panning gives the same gains on every processor. For sound arriving on an edge between speakers, rounding could leave a speaker beyond that edge a gain of about 1e-17 (on Intel Macs, the rear height speakers of 5.x.4 for sound from straight behind). Such gains are now 0.

The full list is in CHANGELOG.md.

Install

pip install acoustic-spaces                # simulation, rendering and the command line
pip install "acoustic-spaces[viz,gui]"     # with the 3D view and the graphical editor

Other extras: [gpu] for the GPU paths, [ifc] for IFC models, [sketchup] for SketchUp files, [sofa] for HRTFs and [measure] for sweeps and playback. The wheels for Linux, macOS (Apple silicon and Intel) and Windows are also among the assets below; install one with pip install <wheel file>, with the extras after the file name.

3.2.0: renamed project to acoustic-spaces. Publishing in PyPi.

Choose a tag to compare

@naelolaiz naelolaiz released this 16 Oct 17:25
b74798b

Results are the same as in 3.1.0. This release puts the package on PyPI and gives the repository the name of the package and its command. Scene files load unchanged.

New

  • On PyPI. pip install acoustic-spaces installs the simulator, the rendering and the command line; pip install "acoustic-spaces[viz,gui]" adds the 3D view and the graphical editor. There are wheels for Linux (x86-64), macOS (Apple silicon) and Windows (x86-64), CPython 3.10 to 3.14; elsewhere pip builds the package from source, which needs a C++17 compiler.
  • A new address. The repository is now github.com/naelolaiz/acoustic-spaces. The old address redirects; to update a clone, run git remote set-url origin https://github.com/naelolaiz/acoustic-spaces.git.
  • Install hints name the extra. When an optional part is missing, the message says pip install "acoustic-spaces[gui]" (with the extra it needs), or uv sync --extra gui in a source checkout, instead of listing the extra's packages.

Coming from 3.0.0 or earlier?

3.2.0 includes everything from 3.1.0: acoustic-spaces tune, which picks the faster of the CPU and the GPU for each computer; acoustic-spaces alone opens the editor, with a tip on every control; and 39 bug fixes from a full review, some of which change results. See the 3.1.0 release notes.

Install

pip install acoustic-spaces, with the extras you need in brackets: viz (3D view, plots, videos), gui (the editor), gpu (the GPU paths), sofa (HRTFs), measure (sweeps and playback), ifc (IFC models) and sketchup (SketchUp files). The same wheels and the source distribution are attached below.

Release 3.1.0: optimizations and bugfixes

Choose a tag to compare

@naelolaiz naelolaiz released this 16 Oct 16:50

Results change from 3.0.0 in a few cases. Responses rendered at 44.1, 22.05 or 88.2 kHz keep up to about 15 % more late energy (48 and 96 kHz are unchanged). 5.x.4 and 7.x.4 layouts pan symmetrically. Delayed sources near a listener now give stage support. The STI is undefined where it used to read 0 or too low. Runs of only some of a scene's sources or listeners (and calibrate) now draw the same random numbers as a run of the whole scene, so they differ from 3.0.0's. Scene files of 3.0.0 load unchanged.

Highlights

  • Tune the devices for your computer. acoustic-spaces tune times the late stage on the CPU, the GPU and both, and the wave solver on the CPU and the GPU, for responses of 0.5 to 4 s, and keeps the fastest of each for this computer. In the editor: Simulation > Tune CPU and GPU…
  • The editor by default. acoustic-spaces with no command opens the editor.
  • A tip on every control. Resting the mouse on any label, field, button or column header of the editor says what it means, with its unit.
  • 39 bug fixes from a full review of the code, and the documentation corrected wherever it no longer matched the code.

New

  • A default device per computer. simulation.late.device and simulation.wave.device may be left out (the editor's Run on: default) and then follow this computer's default: cpu, or auto after tune --default auto or the tune window's check box. Scenes that name a device keep it. acoustic-spaces info shows the tuned choices.
  • Warnings and errors in colour. Amber warnings and red errors in the editor's Messages, the scene form and the status bar; warning: and error: in yellow and red on a terminal (NO_COLOR turns it off).
  • Finished runs get noticed. When a run, a coverage map or a tuning ends behind another window, the editor's taskbar entry flashes (the Dock icon bounces on macOS).

Optimizations

  • With auto, the late stage takes the device tune found fastest for the run's response length. Without a tuning, its trial now traces the run's own length (3.0.0 traced at most 0.25 s) and keeps its choice for that range of lengths. The wave solver's auto compares the timed costs for the run's step count.
  • The GPU now traces large late stages itself. In 3.0.0, more than about 1 to 3 million rays per band in a small room overflowed its sums, and the run was then traced all over again on the CPU.
  • With both, parts the GPU hands back go to the one CPU tracer on all its threads, instead of a second CPU tracer competing for the same threads.

Fixes

Simulation

  • Responses at 44.1, 22.05 or 88.2 kHz had random silent 1 ms gaps while the late part was still sparse, losing up to about 15 % of the late energy.
  • A source with a delay_ms gave no stage support (ST early, ST late) at listeners near it.
  • Runs of some of a scene's sources or listeners drew other random numbers than a run of the whole scene with the same seed.
  • A negative seed is refused at once, and the progress message says so when the CPU traced a run the GPU declined.

Spatial audio

  • Binaural outputs through a SOFA HRTF gave no IACC_E and IACC_L.
  • 5.x.4 and 7.x.4 layouts panned lopsided, up to 2.8 dB apart between mirror-image speakers.
  • walkthrough --hrtf did nothing unless the format was binaural.

Parameters, calibration, maps and models

  • The STI read 0 or too low where a band from 125 Hz up had not decayed by 20 dB; it is undefined now.
  • calibrate() accepted LF, LFC and the directional T30s, which it cannot fit, and failed inside scipy with a lower bound of 0.
  • Coverage maps over a slab could put their points up to its thickness too low.
  • The leak finder's gap area came out too small when rays escaped through several gaps.
  • CATT-Acoustic libraries that give 8 and 16 kHz after a colon, and ABS1 materials, are read; Collada files with X_UP no longer lie on their side; inspect gives the air volume of a model drawn as a shell inside another.

Command line and editor

  • Invalid YAML, folders and models without their extra give an error: instead of a traceback.
  • walkthrough ignored the scene's thread count, and walks with places less than 10 ms apart failed or played a neighbour's response.
  • view --paths and export --paths show only the early paths the simulation keeps, and particles stop at their 200th reflection instead of flying through walls.
  • Edit > Add material from a library… failed before its file dialog.
  • The floor plan and simulation forms rewrote every value, rounded, when one changed; coherent_max_band_hz: null was lost on saving; an array element's file kept its absolute path.

Documentation and CI: the user guide, API docs and validation report are corrected where they no longer matched the code, and CI now fails on any test warning.

The full list is in CHANGELOG.md.

Upgrading from 3.0.0

  • The 3.0.0 trial file late-device.json is no longer read. Run acoustic-spaces tune once, or let auto run its trial again.
  • Scenes saved by the 3.0.0 editor name cpu; the tune window offers to let the open scene follow this computer's default.

Install

Download the wheel for your platform (Linux, macOS or Windows, CPython 3.10 to 3.14) from the assets below and install it with pip install <wheel file>. Add the extras you need, for example pip install "<wheel file>[viz,gui]" for the 3D view and the editor, [gpu] for the GPU paths, [ifc] for IFC models, [sketchup] for SketchUp files, [sofa] for HRTFs and [measure] for sweeps and playback.

Acoustic Spaces 3.0.0 is checked against two measured rooms, simulates in third-octave bands, gives sources their own spectra and shapes, lets sound through walls and between coupled rooms, fits a model's materials to measurements, traces rays 7 to 8 times faster with the late stage and the wave solver on a GPU, and reads BIM models and the material libraries of CATT-Acoustic and ODEON. It also finds leaks in a model and renders walkthroughs.

@naelolaiz naelolaiz released this 16 Oct 06:14
1dd0c8a

Results change from 2.0.0. Sound now scatters by vector and by the size of each surface, and every band traces rays of its own, so rooms with smooth walls decay faster than in 2.0.0 and closer to measurements: in the chamber music hall of the BRAS benchmark the reverberation time came out 20 to 32 % long and now 7 to 20 %. Early reflections add in pressure at 63 and 125 Hz, and the wave solver's walls absorb as their materials do in every band. Scene files of 2.0.0 load unchanged; for version 2's results, set simulation: {scattering: {method: random, from_size: false}, late: {rays: 100000}}. A simulation takes about 1.5 to 4 times as long as before, less the faster ray tracing. scipy is a new dependency.

New

Validation against measured rooms (acoustic-spaces compare, validation/bras_validation.py)

  • Two rooms of the BRAS benchmark, a seminar room and a chamber music hall, as scenes with their measured parameters. In the seminar room the reverberation time is within 2 % of the measurement from 500 Hz to 4 kHz; in the hall it is 7 to 10 % long, one and a half to two JNDs. The validation report has the tables.
  • compare sets a simulated against a measured impulse response band by band, in just noticeable differences (ISO 3382-1), with a plot of the two decays.

More parameters: LF, LFC and LJ, IACC, stage support, the T30 along three axes, STIPA, U50 and the echo criteria of Dietsch and Kraak, for simulated and measured responses (analyze --lateral, --ambisonic, --binaural, --stage).

Scattering and frequency bands

  • Vector-based scattering as in ODEON, scattering that follows the size of each surface (Christensen and Rindel), and rays of their own for each band (simulation.scattering; 50,000 rays per band by default).
  • simulation.bands: third_octave runs everything in 24 third-octave bands from 50 Hz to 10 kHz; materials take 8 or 24 values.

Sources

  • A sound power per band, speech spectra for the STI, and a gain, equalizer and delay on each source's feed; sound pressure levels in the results.
  • Line and surface sources, and coherent loudspeaker arrays with their far-field patterns, steering and a near-field warning.

Walls, doors, openings and audience seating

  • Materials with a sound reduction index or an opening: sound passes between coupled rooms in the early paths, the late rays, the statistical method and coverage maps, and the rooms are found from the faces themselves.
  • audience: true on a material: sound skimming the seats loses more from 500 Hz to 2 kHz.

Fitting materials to measurements (acoustic-spaces calibrate)

  • The absorption of a scene's materials fitted band by band to measured T30, EDT and C80 in JNDs, tracing the room once per round and re-weighting its rays. On the BRAS rooms it brings responses it did not fit to about one JND. In the editor, results follow a change of absorption at once.

Wave solver

  • Walls that absorb as their materials do in every band, in one run, and a matched layer round open models.
  • A 19-point stencil with less than half the dispersion, the same in every direction, and a CPU update 1.7 to 2.4 times as fast.
  • The grid stepped on a GPU through WebGPU (simulation.wave.device, the gpu extra): AMD, NVIDIA, Intel and Apple GPUs alike.

Faster ray tracing, and the late stage on a GPU (simulation.performance, simulation.late.device)

  • Ray queries are 7 to 8 times faster: one band of 50,000 rays in the chamber music hall takes 5.7 s instead of 41 s on four cores. threads and ray_tree settings, and --threads on the command line.
  • The late stage's rays traced on a GPU, alone (gpu), sharing the rays with the CPU (both) or whichever a short trial finds faster (auto).

Low frequencies

  • Edge diffraction over two edges (simulation.early.diffraction: second_order): over thick walls and barriers and round both corners of a doorway, checked against the exact solution.
  • Early reflections that add in pressure up to 125 Hz by default, with the phase of every reflection and of the sound over edges (simulation.early.coherent_max_band_hz).

Models and materials

  • IFC (BIM) models with the ifc extra, Collada files, SketchUp files with the sketchup extra (experimental), and DXF polygon meshes.
  • Materials from CATT-Acoustic files and ODEON libraries (file and entry, acoustic-spaces materials --file, Edit > Add material from a library in the editor).
  • A leak finder (validate --leaks, view --leaks, View > Show leaks in the editor): where rays escape from a model that is not closed, with the size of each gap.

Walkthroughs (acoustic-spaces walkthrough): a listener or a source walks along a path in the scene, heard through the responses along the way with crossfades, with a video of the walk.

Smoother binaural: HRTFs interpolated between the measured directions, so a moving source or a turning head no longer jumps in steps.

Examples: thirteen new rooms, among them a gallery walk, an office from an IFC model, a town hall sound system with delay loudspeakers, a workshop's noise map, an apartment with a door between its rooms, a listening room's bass, and Beethoven's 8th symphony from 61 anechoic tracks in the concert hall.

Fixes

  • Simulation: the count of rays that leave an open model was always 0; runs that split rays gave different results when the core was built with Clang (macOS); the sound diffracted by a thin screen left out one term in the lit zone.
  • Display: arrays, worked out in third octaves, were listed and drawn as if those were octaves.
  • Editor: playback has a Stop button in the toolbar, the status bar and the Simulation menu (and Esc); playback follows the source, listener or head tracking picked; Listen always plays binaurally at one shared level.
  • Install hints name the packages to install instead of a PyPI extra that does not exist.

The full list is in CHANGELOG.md.

Install

Download the wheel for your platform (Linux, macOS or Windows, CPython 3.10 to 3.14) from the assets below and install it with pip install <wheel file>. Add the extras you need, for example pip install "<wheel file>[viz,gui]" for the 3D view and the editor, [gpu] for the GPU paths, [ifc] for IFC models, [sketchup] for SketchUp files, [sofa] for HRTFs and [measure] for sweeps and playback.

v2.0.0: coverage maps, diffraction, head tracking and a wave solver

Choose a tag to compare

@naelolaiz naelolaiz released this 14 Oct 19:30
9d9d986

Acoustic Spaces 2.0.0 adds coverage maps, edge diffraction, drawing rooms in the editor, head-tracked binaural playback and a wave-based solver for low frequencies. It also fixes 38 bugs found in a full code review.

Results change from 1.1.0. Edge diffraction is now on by default, so rooms with convex corners or thin screens sound and measure differently. Set simulation.early.diffraction: none (or --diffraction none) for purely specular early reflections as before. The statistical late method now keeps Barron's total energy, which raises G by up to 1.8 dB. The wave solver is off unless switched on.

New

Coverage maps (acoustic-spaces map, or Simulation > Run coverage map in the editor)

  • SPL, G, C50, C80, D50, EDT, T20, T30, Ts, the A-weighted level and the speech transmission index (IEC 60268-16) on a grid over the audience area.
  • Maps per source and for all sources together, with several seating levels such as stalls and balcony.
  • A map costs about as much as a few listeners. Results come as a top-view plot, coloured tiles in the 3D view, or JSON.

Edge diffraction (simulation.early.diffraction, --diffraction)

  • The uniform theory of diffraction (UTD) for the direct sound and first-order reflections, on convex corners and the free edges of thin screens.
  • Levels stay continuous across shadow and reflection boundaries.
  • Diffracted paths are drawn in their own colour in view --paths, the editor and the Blender export.
  • A new gallery example: an L-shaped room with a listener round the corner.

Drawing rooms in the editor

  • A Plan tab: drag corners, add or remove walls, or draw a new floor plan, with grid snapping and wall lengths.
  • Sources and listeners can be dragged in the plan and in the 3D view.
  • Floor plans whose walls cross are refused with the reason.

Head tracking (play --head-tracking, or the editor's Head tracking controls)

  • Real-time binaural playback of an Ambisonics response that turns with the listener's head, with crossfades between orientations.
  • Head trackers connect over OSC (yaw/pitch/roll or quaternions), with per-axis inversion and re-centring.
  • MagLS binaural decoders from any HRTF, and rotation matrices for Ambisonics of any order.

Wave-based solver for low frequencies (simulation.wave, simulate --wave)

  • The lowest octave bands come from a finite-difference time-domain (FDTD) simulation of the sound field, so room modes and low-frequency diffraction are included.
  • It joins the ray-traced response through crossovers, up to 63, 125 (default), 250 or 500 Hz.
  • Surfaces absorb as their materials do in each band. Ambisonics, binaural and loudspeaker outputs keep the direction of the low end.
  • Checked against theory: box modes and their decay within 0.5 %, and free-field level within 0.35 dB.

Fixes

  • Simulation and parameters: the statistical late tail keeps Barron's total energy. A response that decays less than 20 dB now has no parameters instead of wrong ones. Trailing silence no longer makes T30 read up to 70 % long. Mono WAV columns and empty responses are handled.
  • Diffraction and coverage: no level steps across reflection boundaries, and no crash for a listener on a source or for short responses in maps.
  • Wave solver: correct timing against the rays, no 3 dB dip at the crossover, and no static pressure left in closed rooms.
  • Spatial audio: HRTFs keep their gain when resampled (a 96 kHz SOFA file played 6 dB quiet at 48 kHz). SOFA files with a turning head or spherical ear positions are read correctly. 5.0.4 and 5.1.4 keep sound from behind on the horizon.
  • Geometry and scene files: models with flipped faces work, and DXF files are read in their own units without phantom corners. L-shaped floors are triangulated correctly. NaN and infinity are refused, and a listener on a source is reported as a problem.
  • Command line: overrides are validated, --sample-rate reaches the wave solver, and missing files give an error instead of a traceback.
  • Editor: a material chosen for one wall stays on that wall. The 3D view stays lit and keeps its camera while you edit. Typing one coordinate no longer rounds the others. Save As adds .yaml.

The full list is in CHANGELOG.md.

Install

Download the wheel for your platform (Linux, macOS or Windows) from the assets below and install it with pip install <wheel file>. Add the extras you need, for example pip install "<wheel file>[gui,sofa]" for the editor and SOFA files.

Releasing v1.1.0, including first version of GUI.

Choose a tag to compare

@naelolaiz naelolaiz released this 14 Oct 06:45
73e37da

The graphical editor, export to Blender and source directivity.

Graphical editor (acoustic-spaces edit, or acoustic-spaces-editor; the gui extra)

  • A Qt window with the room in 3D, a scene tree, a form for each item and a message log.
    Every change is checked against the scene schema and can be undone.
  • Sources and listeners placed by clicking a floor or wall; surfaces given materials,
    materials added from the database and their coefficients edited per octave band.
  • New rooms as a box or from a model file, box and floor plan dimensions, model units
    and up axis, simulation settings and output formats, all from forms.
  • Simulations in the background with progress and cancel; results with ISO 3382-1
    parameters, echograms, decay curves, arrival directions and reflection paths in 3D;
    export to the files simulate writes; listening to a WAV file through a response.
  • The results show the source and listener selected in the scene, and stay on them
    after another run. The selected point has arrows to its front and to its top, so
    yaw, pitch and roll all show in 3D.

Export to Blender

  • acoustic-spaces export and the editor's File menu write a scene as glTF 2.0
    (.glb) for Blender: the surfaces with their materials (absorption and scattering as
    custom properties), sources and listeners facing their way, the early reflection
    paths by order, and sound particles as an animation in slow motion.

Source directivity

  • Directivity per octave band: a pattern name or a first-order a for each band, or
    measured data from a SOFA file (AES69 FreeFieldDirectivityTF, or impulse responses)
    or a CSV table of levels by azimuth and elevation, interpolated over the sphere.
  • It applies to the direct sound, the early paths, the rays of the late part (in the
    compiled tracer) and the sound particles, in the source's own frame including roll.
  • acoustic-spaces directivity prints a directivity's index and front-to-back ratio
    per band and draws its polar patterns (--plot); inspect lists each source's
    index. The editor picks a pattern or a file, shows the index and the polar patterns,
    and draws the selected source's balloon in 3D. The control room example's monitors
    narrow from omni in the bass to supercardioid at 8 kHz.
  • acoustic_spaces.directivity has the patterns, balloons and file readers;
    Room.directivities holds each source's.

Examples

  • New example rooms: a concert hall, a control room and a church.
  • The examples ship inside the package. acoustic-spaces examples lists them and
    copies them (--copy DIR); acoustic_spaces.examples finds them from Python.

Other changes

  • uv sync installs the test tools (a dev dependency group: pytest, h5py, ruff), so
    uv run pytest works in a fresh checkout, and rebuilds the compiled core when the C++
    sources change. The README shows the uv and pip setups side by side, and messages about
    a missing extra name uv sync --extra ... as well as pip.
  • inspect adds the Arau-Puchades reverberation time, which allows for absorption that
    faces one way (also Room.reverberation_time("arau_puchades")), and a note when the
    absorption is too uneven for Sabine and Eyring to hold, as in the example shoebox,
    whose simulated T30 is several times their estimates.
  • Tests check the decay of a box with specular walls against its closed form, with even
    and with uneven absorption, and the example's absorption with diffusing walls against
    Eyring.
  • Saved scene files refer to model, material and HRTF files under their folder by
    relative paths, so the folder can move, and leave out unset fields.
  • acoustic_spaces.results.write_results writes a simulation's responses and
    parameters.json, as simulate does.