Acoustic Morphology Composer

Draw the space. Shape the sound. Compose its transformation. An interactive, geometry-driven acoustic instrument for turning walls, openings, resonances and virtual listening positions into evolving sound transformations.

Author: Shai CohenAffiliation: Department of Music, Bar-Ilan University, IsraelCategory: Hybrid SystemsLicense: MIT LicenseRepo: Praat AudioTools
Contents:

What this does

Acoustic Morphology Composer makes a virtual acoustic space into a compositional filter. Draw walls, obstacles and apertures; place a sound source and up to four virtual microphones; then compute how a pressure wave propagates through that geometry. Each microphone receives a simulated impulse response (IR), which is used to filter an existing recording by convolution. The resulting spectral peaks, notches, delays and resonances depend on the space that was drawn.

Compositional idea: instead of drawing an equalizer curve, draw the geometry that produces a frequency response. Save several geometries as acoustic states, compare their measured responses and compose transitions between their sonic identities.

Key Features:

Quick start

  1. In Praat, select exactly one Sound (mono or stereo) and run Acoustic_Morphology_Composer.praat from the AudioTools - py menu.
  2. In the Python window, start with Presets → Resonant Chamber or Narrow Passage, or draw your own geometry.
  3. Choose Draft while exploring, then press Compute. Wait for the response calculation to finish; geometry editing itself remains interactive.
  4. Open Acoustic fingerprint to inspect the response, and Source & audition to play the original or processed recording and compare them using Matched level.
  5. Move the microphone, adjust a wall or an opening, and press Compute again. Compare the resulting timbre and frequency response.
  6. Use Store state to create a named copy of the current configuration. The editor stays on the original state: explicitly select the stored copy in States before editing it. Place the states on the Timeline for an evolving treatment.
  7. In Render, choose the main output, wet/dry balance, tail policy and optional impulse-response or microphone-layer exports.
  8. Press Render, then Return to Praat. Newly generated Sound objects appear in the Praat Objects window; the original recording is preserved.
First listening experiment: process the same sustained cello note through Open Field, Resonant Chamber and Narrow Passage, with the same microphone target and audition level. You should hear three different acoustic identities; the exact result depends on the geometry, source spectrum and microphone placement. Change only one element at a time to understand its contribution.

Core concept

Selected Praat Sound + Geometry: walls / obstacles / openings + Source position + virtual microphones ↓ 2-D FDTD wave propagation ↓ Microphone impulse responses ↓ Acoustic Fingerprint ↓ Convolution with source audio ↓ Single state / multi-mic mix / timeline ↓ New Sound objects in Praat

For a stationary acoustic state, the rendered signal is obtained by convolving the recording x(t) with the microphone response h(t): y(t) = x(t) * h(t). Different geometries or listening positions produce different impulse responses. The composer can use them as timbral structures, not merely as room reverberation effects.

Wavefield images, IRs and frequency-response plots are derived from the same acoustic simulation. The Wavefield display is an inspection tool; the finished audio, however, comes from the computed impulse response.

Geometry editor

The left side of the application contains a scaled room plan, with coordinates measured in metres. A single source is indicated by S; microphones are labelled individually. The geometry is converted into a numerical grid when a response is computed.

ToolWhat you can do
SelectClick an object, drag it to reposition it, or drag a selection handle to resize an obstacle or move a wall endpoint.
WallClick and drag to draw a wall segment; edit its thickness and absorption in Properties.
ObstacleDrag to place a solid rectangular obstruction.
OpeningDraw a rectangle that clears the simulated solid cells, creating a door, slit or passage through a wall or obstacle.
SourceClick to reposition the single acoustic excitation point.
MicPlace up to four virtual microphones. Their location determines the captured acoustic responses.
PanMove around the displayed room without editing its geometry.

View aids: snap and its selectable grid step, grid, sim. cells (an overlay of the actual solid grid cells), Fit, Delete, Clear, Load geom. and Save geom. The Properties panel permits precise numerical editing of selected elements, the room dimensions and boundary conditions, or each microphone's name, gain, enabled state and stereo pan.

Geometry matters at grid resolution. Very narrow openings and slanted walls may be represented approximately on the simulation grid. Turn on sim. cells to inspect what the solver actually sees. A microphone placed inside a solid is rejected; an isolated cavity without an air path is flagged.

Interface and controls

Main toolbar

ControlFunction
Open / Save projectRestore or store acoustic states, timeline, settings and calculated IR cache.
PresetsLoad one of eight editable spaces, or reset the current state's preset geometry.
QualityChoose Draft, Standard or High Resolution for the simulation grid and frequency accuracy.
lengthSet the simulated impulse-response duration; longer responses capture longer decays at greater computational cost.
2.5-DEnable or disable the approximate correction applied to the native 2-D response; enabled by default.
Compute / CancelCalculate or cancel the current state's impulse response in the background.
PreviewAudition the processed material. Preview is derived from the same full render as the export, using the same settings.
Store stateCreate a new, named copy of the current acoustic state. The current editing selection does not switch to that copy; select it in the States tab if you intend to modify it.
RenderGenerate the finished audio with the selected output settings.
Return to PraatImport the finished files as new Praat Sound objects. In standalone mode the corresponding control exports WAV files.
Workflow / HelpChoose one of five compositional workflows or open the built-in manual.

Window areas

Acoustic fingerprint

Inspect impulse and transfer functions, energy decay, phase and spectrogram; compare measured spectral peaks and notches.

Wavefield

Animate positive and negative pressure from the solver itself. Pause, step, change display speed and pressure scale, or overlay geometry and microphones. Use Freeze to keep the currently displayed field visible while switching or recomputing states for comparison.

Measurements / Compare states

Review first arrival, level, centroid, decay estimates, resonances, warnings and differences between stored acoustic states.

States / Timeline

Maintain acoustic configurations, recompute changed states, place keyframes and design transitions through time.

Source & audition

Choose a listening region; play original, processed or A/B; use Bypass or Matched level. Audition playback requires the optional audio-playback dependency and an output device.

Render

Control wet gain, high-frequency policy, dry/wet mix, output trim, peak protection, channel routing, output target and exports.

Eight editable acoustic presets

The presets contain actual room geometries, source locations, microphones and boundary settings. They are starting points for composition, not fixed EQ curves; results vary when you change the geometry, source, microphone or solver settings.

1 · Open Field

An unobstructed space with absorbing outer edges. A direct-sound reference for comparing transmission, distance and coloration introduced by walls.

2 · Resonant Chamber

A compact, weakly absorbing 1.4 × 1.0 m chamber. Emphasizes discrete low resonances and audible ringing; useful for sustained notes and harmonic material.

3 · Narrow Passage

Two spaces separated by a wall with a narrow slit. Compare microphones on opposite sides to hear attenuation, diffraction and the resonances of the receiving space. It is not inherently a simple low-pass filter.

4 · Parallel Walls

Two long, mostly reflecting surfaces. Repeated reflections generate comb-like coloration; moving the source away from the center changes which patterns are excited.

5 · Side Cavity

A corridor connected to a side chamber by a short neck. Explore coupled resonances and compare the spectral character of corridor and cavity microphone positions.

6 · Acoustic Labyrinth

Staggered internal walls create longer and more varied paths. The far-end response can have delayed onset, complex reflections and an irregular decay.

7 · Moving Aperture

A prepared pair of states with different opening widths, plus a timeline. Use it to explore an evolving acoustic transition and, if desired, generate intermediate geometries.

8 · Dual Chamber

Connected rooms of contrasting shapes. Two microphones emphasize different resonances while sharing coupled decay behavior—a useful basis for layered counterpoint.

Preset comparison: a narrower opening does not always make a recorded sound simply darker. In an enclosed system, the receiving space's resonances may suppress low harmonics more strongly than higher ones. Trust the calculated response and listening comparison rather than a preset name.

Five compositional workflows

WorkflowCompositional purpose
A · Resonance SculptingDesign one geometry as a resonant filter. Edit → Compute → Audition → Render.
B · Acoustic MorphingCreate states with contrasting responses, position them on the Timeline and render an evolving timbral form.
C · Moving ListenerDuplicate a geometry with New listener state; move the microphones and compose movement between the independently calculated listening positions.
D · Resonant CounterpointUse several microphones to derive different layers from one recording. Export them individually or combine them using gains and stereo pans.
E · Spectral ArchitectureCompare geometries by response curves, spectral differences, resonances, relative level and decay before choosing material for the composition.

Acoustic states and response caching

A state stores the current geometry, sound-source position, microphones, boundary, simulation settings, state-specific rendering settings, name and notes. Use Store as new, Duplicate, New listener state, Rename, Delete, Recompute, Compute all outdated and Compare from the States tab.

StatusMeaning
ComputedThe cached response matches the current acoustic configuration.
OUTDATEDGeometry or calculation settings changed. The previous plots may remain visible for reference, but audition and render require a fresh response.
Not computedNo valid response is available for the state.

Matching configurations can reuse cached responses. Changing only a microphone's name, gain, pan or enabled state does not require a new simulation. Moving, adding or removing a microphone does require a new simulation; so do changes to the source, geometry or acoustic calculation settings. Unaffected states retain their valid cached responses.

Timeline and acoustic morphing

Place a state at the Timeline cursor using Add keyframe. Each keyframe specifies the state to reach, its time, the preceding transition duration, the transition curve and an amount. At 100%, the new target state takes over; at 40%, it contributes 40% while the previous mixture retains 60%.

Control / ModeBehavior
LinearA constant-sum amplitude crossfade; often preferable between highly correlated acoustic states.
Equal powerUseful for relatively uncorrelated outputs; can raise level at the midpoint when two states sound very similar.
SmoothstepA soft-edged change with gentler motion near its endpoints.
HoldMaintain the previous state, then switch near the endpoint with a short de-click transition.
Input crossfadeSplit the source between static states before convolution, allowing an earlier space's reverb tail to keep sounding after the next state starts. This is the default.
Output crossfadeCrossfade already convolved outputs. The earlier state's response fades together with the state.
LoopRepeat the timeline cycle according to the configured loop length.
Geometry morph…Generate and simulate intermediate geometries between matching states, then sequence their responses. Requires the same room dimensions, corresponding objects (same identifiers and kinds), microphone identities and boundary type (rigid, partial or absorbing).
Physical distinction: Input and Output Crossfade mix the responses of static geometries. Geometry morphing computes a sequence of intermediate static spaces. Neither is a continuous physical simulation of moving walls; they are explicitly composition-oriented transformations.

Drag a keyframe or transition edge to edit timing, double-click a keyframe for detailed values, or right-click it for state, curve and deletion options. Use Preview composition to hear the full trajectory before exporting.

Acoustic analysis and visualisation

Impulse response

Shows the microphone's time-domain response: direct arrival, reflections and the development of resonant decay.

Frequency response

Shows the filtering produced by the geometry, including measurable peaks and notches. Frequencies outside the modeled reliable band are distinguished visually.

Energy decay

Inspect the decay envelope and comparative EDT, T20 and T30 estimates. These describe the 2-D model, not the predicted reverberation time of an actual hall.

Pressure wavefield

Animated calculated pressure: red for positive, blue for negative and white for approximately zero. Step through reflections and diffraction near openings; use Freeze to hold the current field when changing states for visual comparison.

The Measurements tab also reports source-to-microphone distance, first-arrival time, in-band level, spectral centroid, resonances, notches and energy distribution. Compare states overlays the responses of all checked, computed states; its difference curve compares the first two checked states to reveal changes in spectral shape and transmission level.

Physical level keeps a common reference (the modeled free-field response at 1 m); Normalized timbre compares shapes on normalized scales. Use physical level to study transmission loss; use normalized timbre when judging color independently of loudness.

Rendering and sound controls

Current-state controls

ControlFunction
Wet gainState-specific output level of the geometry-derived convolved sound.
Above the band: PreserveRetain high-frequency content beyond the reliable simulation bandwidth as a delayed, level-matched unsimulated dry component (default).
Above the band: AttenuateRemove the unmodeled upper range from the wet response; hear predominantly the simulated band.
Above the band: Creative extensionGenerate a seeded, noise-based extension shaped by modeled decay. This is an artistic treatment, not wave simulation.

Project output controls

ControlFunction
Dry / wetBlend original and geometry-filtered audio. The dry signal enters the final mix only once, regardless of microphone count.
Output trimApply final gain to the rendered signal.
Peak protection / ceilingAttenuate the complete result when its sample peak exceeds the ceiling. This is static scaling, not dynamic limiting. The render report shows the pre-protection peak and the applied reduction; attenuation greater than 6 dB triggers a warning.
DurationChoose exact source duration or include the reverberation tail. Preserving source duration may fade a tail at the endpoint.
ChannelsFor stereo inputs: mix to mono, process each channel, or use only left/right.
Main outputStereo mix, mono mix or a specified microphone (1–4).
Render the timelineRender the arranged keyframes when present; otherwise render the current acoustic state.
Export impulse responsesReturn the calculated microphone IRs as separate Praat Sounds.
Export microphone layersReturn individual processed outputs for the active microphones of the current state.

Multiple microphone wet layers are normalized by approximately 1 / sqrt(N) in combined mixes, where N is the number of contributing microphones. The stereo mix uses each microphone's gain and pan; a mono source is equal-power centered in stereo.

Listening tip: keep Matched level enabled for A/B audition when investigating timbre. It adjusts listening comparison only and does not change the rendered output. The render report also displays output RMS relative to the source, sample peak before protection and any applied gain reduction. If protection removes more than 6 dB, lower the wet gain or trim rather than relying on the ceiling to rebalance the sound.

Mouse gestures and keyboard shortcuts

These commands apply when the relevant Python editor has keyboard focus; they are not Praat Demo-window shortcuts.

Gesture / keyAction
Click + drag (drawing tool)Create a wall, obstacle or opening; with Select, move the selected element or a handle.
Mouse wheelZoom the geometry editor.
Middle mouse dragPan the geometry editor regardless of the active drawing tool.
Delete / BackspaceDelete the selected geometry element or microphone in the geometry editor.
EscCancel a drawing gesture or deselect the current item.
Ctrl + Z / Cmd + ZUndo an editable operation using the platform's standard Undo shortcut.
Ctrl + Y or Ctrl + Shift + Z (platform-dependent)Redo using the operating system's standard Redo shortcut.
Drag (timeline keyframe)Move a keyframe; drag a transition edge to change its duration.
Double-click (timeline keyframe)Open the keyframe editor.
Right-click (timeline keyframe)Change its state or transition curve, or delete it.
Shortcut scope: unlike an instrument-oriented Demo script, this application does not define a large letter-key performance map. The main musical operations are performed through the graphical toolbar, geometry editor and timeline.

Outputs and project files

The Praat launcher exports the selected Sound to a temporary working session and imports only files explicitly returned by the Python application. The original source object remains unchanged. If the window is closed without Return to Praat, no new Sounds are imported.

Object / fileContents
<source>_acoustic_morphologyThe final filtered Sound or timeline composition; <source> is the selected Praat Sound name (for example, cello_acoustic_morphology).
Acoustic_IR_A_<mic> and related namesOptional simulated, band-limited impulse responses. A, B and so on designate the states used; <mic> is the microphone name (for example, Acoustic_IR_A_Behind).
<source>_layer_<mic>Optional individual microphone-layer renders from the current state, named after the actual source and microphone.
Project.amcprojProject description: geometries, states, timeline, output settings and source reference.
Project_cache/Saved, reusable impulse-response data for the project.
Geometry.amcgeomA standalone saved geometry that can be loaded into another project.

Praat output names receive a collision-safe suffix if needed. The project does not embed or duplicate the original recording; it keeps a reference. A project can still preserve its acoustic design when the original source is absent. When running from Praat, the Sound currently supplied to the session remains the audio input; in standalone mode the user may load or relink a source. If the audio sample rate changes, the relevant IRs may need to be recomputed.

Save versus Return: Save project stores the compositional setup for reuse. Return to Praat exports finished Sound objects. These are separate actions; saving a project alone does not add a new Sound to the Praat Objects list.

Praat Info report: following an export, Praat lists the imported objects, reports whether the main output preserves the original duration to within one sample (or includes a requested reverberation tail), and confirms that the original Sound object was not modified.

Requirements and installation

ComponentRequirement
PraatAudioTools installation with support for external script and subprocess execution. A recent Praat may request Full Trust when the launcher writes and invokes files.
Input SoundExactly one selected mono or stereo Sound; from 10 ms up to 30 minutes.
PythonPython 3.9 or newer with PySide6, NumPy, SciPy, soundfile and pyqtgraph.
Optional playbacksounddevice plus a working output device; without it, simulation and rendering still function.
ProcessingLocal and offline. Calculation and preview preparation run in background workers; live acoustic convolution is not required.

Place the two files side by side in the plugin's py directory:

plugin_AudioTools/
  py/
    Acoustic_Morphology_Composer.praat
    acoustic_morphology_composer.py

Install Python dependencies into the environment that Praat uses:

python -m pip install PySide6 numpy scipy soundfile pyqtgraph sounddevice

The launcher searches the Python environment specified by pyCandidate1$ near the top of the Praat script, then common Python commands on the system. It checks for required modules and explains if no suitable interpreter is found. On a machine with a dedicated Python environment, update pyCandidate1$ to point to the correct interpreter.

You can also launch the application independently with python acoustic_morphology_composer.py and use its Load source… and Export WAVs… commands.

Temporary sessions: the Praat launcher creates a private working folder under the system temporary directory (on Windows, normally %TEMP%). Temporary input, manifest and output files are cleaned up when the session ends. The launcher's Keep_session_files option retains them for troubleshooting; leave it off for normal use.

Command-line tools

The Python application also provides offline tests, example creation, model validation and manual access. Run these commands from the folder containing acoustic_morphology_composer.py:

python acoustic_morphology_composer.py --project FILE
python acoustic_morphology_composer.py --selftest
python acoustic_morphology_composer.py --selftest --praat "C:/path/to/Praat.exe"
python acoustic_morphology_composer.py --make-example DIR
python acoustic_morphology_composer.py --validate DIR
python acoustic_morphology_composer.py --manual

--project opens a saved project; --selftest runs the bundled checks, with --praat additionally enabling the Praat round-trip check; --make-example creates demonstration material; --validate performs musical and acoustic-model checks; and --manual prints the built-in manual. These tools are optional for normal composition.

How the acoustic method works

The engine solves the linear acoustic equations on a two-dimensional staggered grid, keeping acoustic pressure at cell centers and particle velocity at cell faces. The numerical time step respects the Courant stability limit for two dimensions.

Pressure field: p(x, y, t) Wave equation: ∂²p/∂t² = c²(∂²p/∂x² + ∂²p/∂y²) Grid: finite-difference time domain (FDTD) At each microphone: pressure over time → impulse response Sound rendering: source audio * impulse response

Rigid walls reflect, partially absorbing boundaries use an approximate frequency-independent impedance, and absorbing outer boundaries use a numerical absorbing layer. Apertures allow diffraction and interference to emerge from the computed field. Source and receiver locations are interpolated on the grid.

Simulation quality

QualityGrid spacingApproximate reliable band at 48 kHz inputDefault IR length
Draft3 cmUp to ~1.1 kHz0.5 s
Standard1.5 cmUp to ~2.4 kHz0.8 s
High Resolution0.75 cmUp to ~4.8 kHz1.0 s

The application calculates and reports its actual reliable bandwidth for the selected grid, speed of sound and sampling rate; the numbers above are reference values, not universal limits. Finer grids cost substantially more computation and memory.

The optional 2.5-D correction reduces the characteristic spectral tilt and time-domain wake of a two-dimensional line-source response, making its direct arrival more point-source-like. It does not transform the entire simulation into a physically accurate three-dimensional room model.

Limitations and interpretation

Musical applications

A bowed cello tone as spectral architecture

Load a sustained cello tone, use Resonant Chamber and compute. Compare its response with Open Field, listening at matched level. Inspect which harmonics the geometry emphasizes or suppresses, then alter the chamber dimensions and repeat. The frequency response—not an arbitrary fixed filter curve—explains the timbral changes.

Compose an evolving resonant space

Use Moving Aperture as a starting point. Place its acoustic states on the Timeline and vary transition timing. Choose Input crossfade if you want earlier resonances to continue decaying as new ones enter. Try Geometry morph… when you want a sequence of physically recomputed aperture widths.

Make counterpoint from one sound

Use Dual Chamber with two microphones at different listening positions. Export their separate processed layers, then arrange and mix those layers in a larger composition. Their distinct timbres share a common source and simulated geometry.

Moving listener as timbral gesture

Store one state, use New listener state, and move a microphone while preserving the walls and source. Compute the new IR, place both states on the Timeline and use the transition as a composed change of perspective.

Build a library of acoustic instruments

Save a project of carefully designed resonant chambers, passages and cavities. Reopen the acoustic design and apply it to different source recordings. This separates the compositional structure of the filter from any one input sound.

Compositional study

Take one short phrase of cello, flute or voice and create three states: Resonant Chamber → Narrow Passage → Dual Chamber. Render with Linear transitions and then with Equal Power. Compare how the same phrase acquires a different sense of density, articulation and spatial identity. Finally, export individual microphone layers and use them as independent material.