The Statistical RT60 result is created with info.airabsorption: false even though Sabine/Eyring/Arau all add an air term. UI that keys off that flag will tell the user air is off. K = RT_CONSTANTS[units] is 0.161 at 20 °C only; dispose() does not REMOVE_RESULT.
Found on varese-dev.
info: {
frequency: this.frequencies,
airabsorption: false, // lie
temperature: this.temperature,
humidity: this.humidity, // frozen at first Calculate
}
Subsequent Calculate UPDATE_RESULTs replace data and leave info stale if T/RH changed.
downloadRT60AsCSV exists; toFixed on NaN (empty-room α, zero area) becomes "NaN" in the file. Constructor this.uuid = uuid() after super(props) drops a restored uuid (same pattern as Energy Decay).
Suggested fix
airabsorption: true. Refresh info on every Calculate. K = 24 * Math.LN10 / ac.soundSpeed(T) (metric) with a feet conversion. dispose emits REMOVE_RESULT. Do not re-uuid in the constructor.
Acceptance criteria
The Statistical RT60 result is created with
info.airabsorption: falseeven though Sabine/Eyring/Arau all add an air term. UI that keys off that flag will tell the user air is off.K = RT_CONSTANTS[units]is 0.161 at 20 °C only;dispose()does notREMOVE_RESULT.Found on
varese-dev.Subsequent Calculate
UPDATE_RESULTs replacedataand leaveinfostale if T/RH changed.downloadRT60AsCSVexists;toFixedonNaN(empty-room α, zero area) becomes"NaN"in the file. Constructorthis.uuid = uuid()aftersuper(props)drops a restored uuid (same pattern as Energy Decay).Suggested fix
airabsorption: true. Refreshinfoon every Calculate.K = 24 * Math.LN10 / ac.soundSpeed(T)(metric) with a feet conversion.disposeemitsREMOVE_RESULT. Do not re-uuid in the constructor.Acceptance criteria
info