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.
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.
Key Features:
- Interactive geometry editor: walls, rectangular obstacles and openings, with selectable objects, snapping, numeric properties and undo/redo.
- Two-dimensional FDTD wave simulation: pressure and particle-velocity propagation with reflections, diffraction and interference.
- Up to four virtual microphones: distinct geometry-derived IRs, individual outputs, mono mix or panned stereo mix.
- Acoustic Fingerprint: IR waveform, frequency response, energy decay, phase or spectrogram, resonant peaks and notches.
- Eight editable geometrical presets: from an open field to coupled chambers and a changing aperture.
- Acoustic States and Morph Timeline: store, compare, sequence and interpolate acoustic transformations.
- Sound-first workflow: offline audition, dry/wet balance, rendered Sound and optional IR/layer exports to Praat.
- Reproducible projects: saved geometry, states, timeline, processing settings and computed-response cache.
Quick start
- In Praat, select exactly one Sound (mono or stereo) and run
Acoustic_Morphology_Composer.praatfrom the AudioTools - py menu. - In the Python window, start with Presets → Resonant Chamber or Narrow Passage, or draw your own geometry.
- Choose Draft while exploring, then press Compute. Wait for the response calculation to finish; geometry editing itself remains interactive.
- Open Acoustic fingerprint to inspect the response, and Source & audition to play the original or processed recording and compare them using Matched level.
- Move the microphone, adjust a wall or an opening, and press Compute again. Compare the resulting timbre and frequency response.
- 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.
- In Render, choose the main output, wet/dry balance, tail policy and optional impulse-response or microphone-layer exports.
- Press Render, then Return to Praat. Newly generated Sound objects appear in the Praat Objects window; the original recording is preserved.
Core concept
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.
| Tool | What you can do |
|---|---|
| Select | Click an object, drag it to reposition it, or drag a selection handle to resize an obstacle or move a wall endpoint. |
| Wall | Click and drag to draw a wall segment; edit its thickness and absorption in Properties. |
| Obstacle | Drag to place a solid rectangular obstruction. |
| Opening | Draw a rectangle that clears the simulated solid cells, creating a door, slit or passage through a wall or obstacle. |
| Source | Click to reposition the single acoustic excitation point. |
| Mic | Place up to four virtual microphones. Their location determines the captured acoustic responses. |
| Pan | Move 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.
Interface and controls
Main toolbar
| Control | Function |
|---|---|
| Open / Save project | Restore or store acoustic states, timeline, settings and calculated IR cache. |
| Presets | Load one of eight editable spaces, or reset the current state's preset geometry. |
| Quality | Choose Draft, Standard or High Resolution for the simulation grid and frequency accuracy. |
| length | Set the simulated impulse-response duration; longer responses capture longer decays at greater computational cost. |
| 2.5-D | Enable or disable the approximate correction applied to the native 2-D response; enabled by default. |
| Compute / Cancel | Calculate or cancel the current state's impulse response in the background. |
| Preview | Audition the processed material. Preview is derived from the same full render as the export, using the same settings. |
| Store state | Create 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. |
| Render | Generate the finished audio with the selected output settings. |
| Return to Praat | Import the finished files as new Praat Sound objects. In standalone mode the corresponding control exports WAV files. |
| Workflow / Help | Choose 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.
Five compositional workflows
| Workflow | Compositional purpose |
|---|---|
| A · Resonance Sculpting | Design one geometry as a resonant filter. Edit → Compute → Audition → Render. |
| B · Acoustic Morphing | Create states with contrasting responses, position them on the Timeline and render an evolving timbral form. |
| C · Moving Listener | Duplicate a geometry with New listener state; move the microphones and compose movement between the independently calculated listening positions. |
| D · Resonant Counterpoint | Use several microphones to derive different layers from one recording. Export them individually or combine them using gains and stereo pans. |
| E · Spectral Architecture | Compare 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.
| Status | Meaning |
|---|---|
| Computed | The cached response matches the current acoustic configuration. |
| OUTDATED | Geometry or calculation settings changed. The previous plots may remain visible for reference, but audition and render require a fresh response. |
| Not computed | No 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 / Mode | Behavior |
|---|---|
| Linear | A constant-sum amplitude crossfade; often preferable between highly correlated acoustic states. |
| Equal power | Useful for relatively uncorrelated outputs; can raise level at the midpoint when two states sound very similar. |
| Smoothstep | A soft-edged change with gentler motion near its endpoints. |
| Hold | Maintain the previous state, then switch near the endpoint with a short de-click transition. |
| Input crossfade | Split 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 crossfade | Crossfade already convolved outputs. The earlier state's response fades together with the state. |
| Loop | Repeat 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). |
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
| Control | Function |
|---|---|
| Wet gain | State-specific output level of the geometry-derived convolved sound. |
| Above the band: Preserve | Retain high-frequency content beyond the reliable simulation bandwidth as a delayed, level-matched unsimulated dry component (default). |
| Above the band: Attenuate | Remove the unmodeled upper range from the wet response; hear predominantly the simulated band. |
| Above the band: Creative extension | Generate a seeded, noise-based extension shaped by modeled decay. This is an artistic treatment, not wave simulation. |
Project output controls
| Control | Function |
|---|---|
| Dry / wet | Blend original and geometry-filtered audio. The dry signal enters the final mix only once, regardless of microphone count. |
| Output trim | Apply final gain to the rendered signal. |
| Peak protection / ceiling | Attenuate 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. |
| Duration | Choose exact source duration or include the reverberation tail. Preserving source duration may fade a tail at the endpoint. |
| Channels | For stereo inputs: mix to mono, process each channel, or use only left/right. |
| Main output | Stereo mix, mono mix or a specified microphone (1–4). |
| Render the timeline | Render the arranged keyframes when present; otherwise render the current acoustic state. |
| Export impulse responses | Return the calculated microphone IRs as separate Praat Sounds. |
| Export microphone layers | Return 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.
Mouse gestures and keyboard shortcuts
These commands apply when the relevant Python editor has keyboard focus; they are not Praat Demo-window shortcuts.
| Gesture / key | Action |
|---|---|
| Click + drag (drawing tool) | Create a wall, obstacle or opening; with Select, move the selected element or a handle. |
| Mouse wheel | Zoom the geometry editor. |
| Middle mouse drag | Pan the geometry editor regardless of the active drawing tool. |
| Delete / Backspace | Delete the selected geometry element or microphone in the geometry editor. |
| Esc | Cancel a drawing gesture or deselect the current item. |
| Ctrl + Z / Cmd + Z | Undo 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. |
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 / file | Contents |
|---|---|
<source>_acoustic_morphology | The final filtered Sound or timeline composition; <source> is the selected Praat Sound name (for example, cello_acoustic_morphology). |
Acoustic_IR_A_<mic> and related names | Optional 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.amcproj | Project description: geometries, states, timeline, output settings and source reference. |
Project_cache/ | Saved, reusable impulse-response data for the project. |
Geometry.amcgeom | A 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.
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
| Component | Requirement |
|---|---|
| Praat | AudioTools installation with support for external script and subprocess execution. A recent Praat may request Full Trust when the launcher writes and invokes files. |
| Input Sound | Exactly one selected mono or stereo Sound; from 10 ms up to 30 minutes. |
| Python | Python 3.9 or newer with PySide6, NumPy, SciPy, soundfile and pyqtgraph. |
| Optional playback | sounddevice plus a working output device; without it, simulation and rendering still function. |
| Processing | Local 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.
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
| Quality | Grid spacing | Approximate reliable band at 48 kHz input | Default IR length |
|---|---|---|---|
| Draft | 3 cm | Up to ~1.1 kHz | 0.5 s |
| Standard | 1.5 cm | Up to ~2.4 kHz | 0.8 s |
| High Resolution | 0.75 cm | Up to ~4.8 kHz | 1.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
- 2-D rather than 3-D: the virtual space has no floor, ceiling or height modes; decay times and spatial spreading are those of a two-dimensional model.
- Instrument radiation: a cello, flute or voice is represented as an omnidirectional excitation point, not as a measured directional radiation pattern. The input recording is processed through the simulated space.
- Limited frequency band: frequencies above the solver's reliable band are either preserved dry, attenuated or processed by a labelled creative extension, not accurately propagated by FDTD.
- Approximate materials: absorption is frequency-independent; it is not a complete model of real acoustic materials.
- Geometry sampling: very narrow openings and diagonal walls are quantized by the grid; use the sim. cells overlay and adjust quality where needed.
- Finite response length: long decays can reach the end of the simulated IR. The application warns and fades the truncated end; extend the response duration or increase absorption.
- Static-state morphing: ordinary timeline crossfades do not numerically simulate continuously moving walls. Intermediate-geometry morphing generates several independently computed states.
- Offline workflow: Compute and Render are separate from mouse interaction. The application is intended for composition, not live acoustic feedback.
- Playback requirements: direct listening inside the Python window depends on a functioning audio device and optional playback library; exports do not.
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.