v1.3.0 (2026-06-19)
New: Room Data Import
An Import data button has been added, sitting between the existing Export data and Settings buttons. It restores the full application state from a previously exported CSV file — room dimensions, speaker and mic positions, per-wall reflection coefficients, source count, phase correction mode, room scatter, and listening area.
All controls are updated in a single batch; no intermediate recomputes fire during the load. Room dimensions are applied first so that position values clamp correctly against the imported room geometry. If any required parameter is missing or the file is malformed, the import is cancelled entirely and an error dialog is shown — no partial state is ever applied.
New: Schroeder Frequency Display
A read-only label showing the estimated Schroeder frequency now appears below the frequency-response curve. It provides a quick reference for the simulation's valid frequency range — the Schroeder frequency marks the boundary between the modal region (where this simulation is physically meaningful) and the diffuse-field region above it.
The estimate is derived from Sabine's reverberation formula using the current room volume and per-wall absorption coefficients (α = 1 − r²). The label updates live as room dimensions or wall reflections are adjusted. It is intentionally understated — a rough guide, not a precise measurement.
Internal: Structural Cleanup
A focused refactoring pass reduced main.py by approximately 240 lines and introduced three new source files (widgets.py, csv_io.py, constants.py). No application behaviour was changed.
- View widgets (
LabeledSlider,XYZSliders, etc.) extracted towidgets.py - CSV parse/format logic extracted to a Qt-free
csv_io.py, making it independently testable - Shared constants (phase-mode tokens, equipment colours, wall names) centralised in
constants.py, eliminating cross-file duplication that could silently affect physics branching - Dead code removed: unreachable
_setup_overlayinrender.pyand its misleading docstring - Helper methods
_num_src()and_physics_snapshot()added to eliminate repeated parameter-gather patterns inmain.py
New: Full-band Scaling Mode
Previously the 3D pressure field was normalised per-frequency, making cross-frequency level comparison impossible. This release adds an optional Full-band scaling mode with a single normalisation reference derived from the global pressure maximum across the entire frequency band.
Controls added below the frequency slider:
- Full-band scaling checkbox — enables cross-frequency normalisation
- Calibrate button — runs an accurate background sweep across all frequencies
- Progress label showing live sweep status
Two operating tiers:
- Approximate (instant) — uses the peak of the already-computed 1D response as the reference; activates immediately on toggle
- Accurate (after Calibrate) —
CalibWorkersweeps all frequencies in the background via QThread; UI remains interactive throughout
The calibration cache is invalidated by any change to the 3D field (room geometry, source positions, reflections, source count, phase mode, room scatter). Display-only parameters — Show room modes and Listening Area — do not invalidate the cache.
- The per-frequency spatial reference was switched from a 2-sigma mean to the median of spatial-peak values across all frequencies, giving a more representative baseline
- The colour window was changed from symmetric ±20 dB to an asymmetric [−24 dB, +15 dB] range, reflecting the measured asymmetry of real room pressure distributions (nulls at nodes reach −50 dB or below; peaks rarely exceed +15–18 dB above median)
Some clipping at the extremes is intentional — it improves mid-range contrast.
| dB re. median | Colour |
|---|---|
| −24 dB and below | Blue |
| 0 dB | Green |
| +15 dB and above | Red |
日本語サマリー
周波数をまたいで音圧レベルを比較できるFull-band Scalingモードを追加。即時の近似モードと、バックグラウンドで全周波数をスイープするCalibrateモードの2段階構成。このモードにおいては基準値を2σ平均から中央値に変更し、カラーウィンドウを対称±20dBから非対称**[−24dB, +15dB]**に修正。部屋の音圧分布の非対称性を正しく反映した。
また、それに加えて以下の二つの機能を追加した。
①CSVインポート機能 — エクスポートしたCSVから部屋の全パラメータを一括復元。UIを安全に一括更新し、再計算は1回のみ。②シュレーダー周波数表示 — サビン式から算出したシミュレーション有効域の目安を控えめなラベルで表示。あわせてコードの構造的リファクタリングを実施し、main.pyを約240行削減。
[English]
Since this is a free, open-source application, the .exe file does not include a paid digital signature. On your first launch, Windows SmartScreen may display a blue warning ("Windows protected your PC").
To launch the app safely, click "More info" and then select "Run anyway".
(Tip: You can prevent this by right-clicking the downloaded ZIP, opening Properties, checking "Unblock", and then extracting.)
[日本語]
本アプリは無料のオープンソースソフトウェアであるため、企業用のデジタル署名を取得していません。そのため、初回起動時に「Windows によって PC が保護されました」という青い警告画面(SmartScreen)が表示される場合があります。
起動するには、「詳細情報」をクリックし、「実行」ボタンを押してください。
(※解凍前に、ダウンロードしたZIPファイルを右クリックして「プロパティ」を開き、「許可する(ブロックの解除)」にチェックを入れておくと警告が出なくなります。)