Skip to content

A wrong type raises TypeError, a missing key KeyError, and every warning is a PhonometryWarning you can filter by topic - #979

Merged
jmrplens merged 1 commit into
fix/records-instead-of-tuplesfrom
fix/errors-and-warnings-by-kind
Oct 21, 2026
Merged

jmrplens merged 1 commit into
fix/records-instead-of-tuplesfrom
fix/errors-and-warnings-by-kind

Conversation

@jmrplens

@jmrplens jmrplens commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

The Python documentation draws the line between the two refusals a guard raises: TypeError is "raised when an operation or function is applied to an object of inappropriate type", and ValueError "when an operation or function receives an argument that has the right type but an inappropriate value". The library had it both ways. Seventy-six refusals asked an argument for its type and raised ValueError, nine of them behind a # noqa: TRY004 that said so on purpose; thirty-two handlers caught a TypeError and raised it again as a ValueError; a few others raised TypeError for the same mistake; and about ninety parameters written as an int went through int() alone, which truncated 2.5 to 2 and took True as 1 without a word. A lookup that missed raised KeyError in one result and ValueError in the next for the same kind of question. And the promise the root makes, that one filterwarnings rule on PhonometryWarning reaches every advisory, did not hold: RoadDeviceWarning derived from UserWarning alone, seven calls warned as a plain UserWarning (two naming no class at all), and five as the bare root, so none of them could be silenced or escalated without every other advisory too.

What changes

A wrong type is a TypeError, a right type with a wrong value a ValueError. An array, None or an object that is not a number where one number belongs, a complex value where a real one does, an array of the wrong dtype (a mask that is not boolean, counts that are not integers), a bool where a count or a flag does, a number where a pair or a sequence does, a choice among named options given as something other than a text, and an object of the wrong class now raise TypeError, naming the parameter. A text is the wrong type wherever a number belongs, whatever it reads as: "20" and "fifty" are both a TypeError, given alone or in an array, where one guard used to parse the first into a number and the next refused it as a value. A count that is not whole or is too small, an empty name, a choice that names none of the options and a value out of range stay ValueError. Mixed conditions (if not isinstance(n, int) or n < 1) are two refusals, and a handler that rewords a refusal keeps its class. Every public function that raises TypeError says so under :raises TypeError:, so the API reference names the class a call raises.

Every whole number goes through one check. require_count reads every parameter written as an int: a whole float such as 5.0 is taken as 5, a fraction is a ValueError, and a bool, a text or an array is a TypeError. That covers story_fundamental_frequency(n_stories), n_events= of the sound energy functions and results, uncertainty n, oversample=, the FDTD grid indices and step counts, max_order=, n_level_ranges=, duration_days= and the ReportMetadata position counts, and also signals.window_metrics(window, n), n_points= of signals.zoom_fft (which truncated 100.6 to 100 points), oversample= of signals.min_phase, n_segments= of metrology.stationarity_test, n_harmonics= of electroacoustics.swept_sine_distortion, the step and arrival counts of the underwater ray and mode solvers and the machinery diagnostics counts. The two private copies of the count check in noise_control and vibration.machinery are gone, and so are the nine TRY004 suppressions, the one in scripts/fdtd_gpu.py and the one in scripts/generate_api_docs.py.

A band set, a window of record indices and a spectrogram channel are read by their type too. fraction=, wherever a band set is chosen, refuses a word, a flag, a float or None with TypeError and an integer other than 1 or 3 with ValueError. aircraft.EPNLIntegration refuses band_limits that are not whole record indices with TypeError and a window that is not a pair with ValueError. OctaveSpectrogramResult.plot(channel=...) reads the channel through require_count, so channel=1.0 draws channel 1, channel=1.5 is a ValueError and channel=True a TypeError. filters.WeightingFilter documents the TypeError it raises for high_accuracy=None, and building.RequirementConformity names each of its three levels to the shared guard before it compares them.

Three things stay ValueError on purpose, named as exemptions: the sidecar payload parser and CalibrationSidecar's own checks (a field of the wrong type in a file is a malformed file, and the refusal names the file), and CatalogueError cells.

A guard that only compared a parameter written as one number (if volume <= 0: raise, or a lookup that returns the row whose frequency matches and raises after the loop, as psychoacoustics.loudness_level did) took a one-element array as its element and answered a longer one with numpy's anonymous "truth value is ambiguous". The 361 functions and dataclass fields with such a guard now ask the rank first, through require_scalar, and so do the 104 public parameters that a call with an array still reached because the comparison sat in one function and the conversion in another (environment.lden, aircraft.noise_fraction, fluids.air(temperature_c=...), vibration.injury_risk(start_age=...)). aircraft.rotorcraft_event_level refuses a ground that holds an array for a single receiver with TypeError.

A lookup that misses a key raises KeyError; a number outside what a result covers raises ValueError. RegulationLimits["noon"] raises KeyError, as a mapping does, and the key is matched exactly, as a mapping matches it: limits["Day"] and limits[" night "], which were read as "day" and "night", raise KeyError too. The period of environment.PeriodAssessment, a choice, keeps its ValueError. TrackDecayRate.rate_at, AcousticRoughnessSpectrum.level_at and the class branch of FilterComplianceResult.binding_margin raise ValueError; a requirement the verdict did not grade stays a KeyError. The selectors of a plot (FilterComplianceResult.plot(requirement=...), BinauralIndicators.plot(parameter=...)) are choices and keep ValueError. materials.ResilientLayer.natural_frequency raises ValueError for a row it cannot rate, as CatalogueRow.printed does, instead of io.CatalogueError, on both refusals: a row without an airflow resistivity and a row whose s't cell holds only a declared bound.

Every warning is a PhonometryWarning with a topic. environment.RoadDeviceWarning joins the hierarchy, and its docstring says that the absorption ratio warns when it reaches 0,99 and the reflection ratio only above it. environment.BarrierInSituWarning now says what it warns on, in its docstring and its row of the API reference: the NOTE to ISO 10847 7.2.2 that reference_microphone_height_m cannot follow once the barrier top stands 80° or more above the near end of the source region, and receiver types that differ between the two campaigns of measured_insertion_loss_indirect, which the NOTE to 8.2.2 advises against; the row named a distance past 250 m and three other conditions no code warns on. New topics: building.BuildingPredictionWarning (the extrapolations of equivalent_impact_level, weighted_lining_improvement and lining_improvement), room.NoiseCriterionWarning (room_criterion on a spectrum missing a band), aircraft.FlightProfileWarning (the Doc 29 B7.1.4 altitude mismatches of approach_profile), signals.ToneBurstWarning and underwater.NumericalPropagationWarning (normal_modes, eigenrays, gaussian_beams). The ISO 15186-1 element count emits building.LaboratoryInsulationWarning, and the filter bank's low sampling rate emits filters.FilterBankWarning, which moves to a module of its own so the band calculation can import it without the filter core; the pytest filter in pyproject.toml names it. vibration.evaluate_train_passage silenced every UserWarning while it built its third-octave bank and now silences only the FilterBankWarning it means, and four docstrings that listed a warning under :raises list it under :warns, so the API reference shows it in its own table by name. Each topic is still a UserWarning, so a filter on that class still matches. The topic guides (room noise, insulation prediction, speech transmission, getting started) name the topic class to filter on, and the notebook check in CI waits for the FilterBankWarning its warning cell provokes.

aircraft.approach_profile warns for both cases Doc 29 asks it to. ECAC Doc 29 5th edition, Volume 2, B7.1.4 (PDF pages 115 and 116, folios B-42 and B-43) asks the system to warn the user when a Level-Idle step starts at another altitude than the step after it, in Case 1 (a following Level-Idle step) and in Case 2 (any following step but Descend-Idle). Only Case 1 was checked. Both emit FlightProfileWarning now, and the start CAS note of each case, which the clause states without asking for a warning, is reported with it as a consistency note.

fluids.FluidPropertyUnavailable is fluids.FluidPropertyUnavailableError, still an AttributeError, so hasattr and getattr with a default behave as before.

The survey grade of ISO 3746 serves its own positions for one, two and three planes. emission.measurement_positions("hemisphere", ..., n_reflecting_planes=3, grade="survey") raised NotImplementedError, and over one plane the survey grade returned positions 4, 5, 6 and 10 of ISO 3744 Table B.1, the array for a source with tones, so the four microphones sat at the wrong points. ISO 3746:2010 clause 8.2.1 takes them from its own tables, and both are now held as printed, as private read-only tables: Table B.1 (BS EN ISO 3746:2010, PDF page 34, printed folio 25), whose positions 4, 5, 6 and 10 are the broadband positions of the same numbers in ISO 3744 Table B.2, serves one plane, whatever tones says, since ISO 3746 has one array; Table B.2 (PDF page 35, printed folio 26) serves positions 14, 15 and 18 for two planes (the same values as before) and 14, 21 and 22 for three. The docstring and the guide name the 3 m least radius the annex sets beside two or three planes, and say that plot_microphone_positions numbers the points 1 to N rather than with the standard's position numbers.

scripts/check_boundary_comparisons.py followed a public parameter rebound to a value computed from itself (levels = np.asarray(levels)) as an opaque cycle and lost the comparison; it now reads the parameter the caller passed, and the comparisons that surfaced are settled with a reason each.

CONTRIBUTING states the rules: the class of a refusal (citing the Python documentation), a text and a whole number by type, what a lookup that misses raises beside the judgement verbs, <Topic>Warning and <Topic>Error in the naming table. The migration guide (EN, site EN, site ES) lists every public call whose exception or warning class changed in 3.3.0 or 4.0.0rc1; the lookups that are newer than 4.0.0rc1 are in the CHANGELOG only.

What breaks

Code that caught ValueError to absorb any bad input should catch (TypeError, ValueError). A number given as a text ("5") is refused with TypeError where some guards used to parse it; pass a number. A fractional count is a ValueError where it was truncated, and a bool count a TypeError. RegulationLimits[...] callers catching ValueError catch KeyError, and pass the period in lower case. rate_at, level_at and binding_margin class callers catching KeyError catch ValueError. fluids.FluidPropertyUnavailable is gone. A band set given as a word, a flag or a float (fraction="third", fraction=True, fraction=3.0) is a TypeError, where it was a ValueError. The one-plane survey positions of emission.measurement_positions changed coordinates. A filter on UserWarning still matches every warning that changed class.

Guards, red before and green here

tests/test_error_kinds.py reads src for every shape a type refusal takes (an if that asks only a type, dtype or rank question, np.isscalar, np.isrealobj and np.issubdtype included; an or joining one to a value test; a chain of type dispatches falling through to a raise; an except TypeError that raises another class) and fails on each that raises anything but TypeError, with the exemptions keyed by function and reason. It also fails on a parameter written as an int read through int() without require_count, and on a public function that raises TypeError without a :raises TypeError: field. Red on fc71c2180:

108 type refusals that raise something but TypeError on .../src/phonometry:
_internal/validation.py:require_real:94 refuses a type with ValueError
_internal/validation.py:require_scalar:115 refuses a type with ValueError
_internal/validation.py:require_count:277 refuses a type with ValueError
_internal/validation.py:require_real:98 catches TypeError and raises ValueError
...
building/regulation/spain.py:_normalise:353 refuses a type with ValueError
emission/_shared.py:_validate_event_count:107 refuses a type with ValueError
emission/turbine_noise.py:turbine_measurement_surface:455 refuses a type with ValueError
...

and, for the three rules added on top, red on d1b0a9131, the commit before them:

E       AssertionError: type refusals that raise something but TypeError (split a mixed condition into its type and its value refusal):
E           aircraft/rotorcraft_noise.py:rotorcraft_event_level:1992 refuses a type with ValueError
E       AssertionError: whole numbers read through int() alone (route them through require_count):
E           _internal/rays.py:march_rays(n_steps):1188
E           _plot/geometry/room.py:plot_image_source_geometry(max_order):115
...  (90 parameters)
E       AssertionError: public functions that raise TypeError without a ':raises TypeError:' field:
E           aircraft/certification.py:EPNLResult.__post_init__:651
E           building/measurement/_rainfall_sound.py:rainfall_sound:901
...  (27 functions)

tests/test_scalar_guards.py (compared_without_rank), red on fc71c2180 with 325 guards, and on d1b0a9131 with 36 more once it reads a comparison that returns before a raise and a comparison inside abs() or a difference:

325 compare-only guards on a scalar-annotated value with no rank check on .../src/phonometry:
_internal/json_input.py:read_at_most(limit):392
_internal/validation.py:require_count(minimum):282
...
36 compare-only guards (fall-through returns and compares through arithmetic) with no rank check:
_plot/geometry/noise_control.py:_draw_chamber(inlet_extension):171
aircraft/flight_performance.py:__post_init__(self.runway_gradient_ratio):355
...

tests/test_scalar_guards.py::test_every_public_scalar_parameter_refuses_an_array_or_a_text_by_name calls every public function whose parameters all take one number with a one-element array, a two-element array, the text of its number and a word in each parameter, and requires a TypeError that names the parameter. Red on d1b0a9131 with 1967 cases:

E       AssertionError: aircraft.duration_correction(reference_speed_m_s) given '1.0': accepted
E         aircraft.duration_correction(reference_speed_m_s) given 'fifty': ValueError (could not convert string to float: 'fifty')
E         aircraft.impedance_adjustment(temperature_c) given '15.0': accepted
...

The same two files, run on the code that arrived beside these rules (the band set of fraction=, the EPNL integration record, the spectrogram plot, WeightingFilter.high_accuracy and RequirementConformity), red with these rules applied over 075ac5e and before the fixes:

E       AssertionError: whole numbers read through int() alone (route them through require_count):
E           _plot/filters.py:_spectrogram_grid(channel):1244
E           _plot/filters.py:plot_octave_spectrogram(channel):1326
E       AssertionError: type refusals that raise something but TypeError (split a mixed condition into its type and its value refusal):
E           _internal/validation.py:require_band_fraction:431 joins a type and a value question in one refusal (ValueError)
E           aircraft/certification.py:EPNLIntegration.__post_init__:515 joins a type and a value question in one refusal (ValueError)
E       AssertionError: public functions that raise TypeError without a ':raises TypeError:' field:
E           filters/weighting.py:WeightingFilter.__init__:623
E         Left contains one more item: 'building/measurement/uncertainty.py:__post_init__(self.expanded_uncertainty_db):866'

tests/test_package_architecture.py, red on fc71c2180:

E       AssertionError: published warnings outside the PhonometryWarning hierarchy:
E           RoadDeviceWarning derives from ['UserWarning', 'Warning', 'Exception', 'BaseException', 'object']
E       AssertionError: published exceptions not named <Topic>Error: ['FluidPropertyUnavailable']
E       AssertionError: warnings emitted without a published topic:
E           aircraft/flight_performance.py:2653 names no category
E           aircraft/flight_performance.py:2662 names no category
E           building/measurement/intensity_insulation.py:813 warns with UserWarning
E           building/prediction/linings.py:303 warns with UserWarning
...
E       AssertionError: warning filters that name no topic:
E           vibration/immission/railway.py:835 filters UserWarning
E       AssertionError: warnings documented as raised:
E           noise_control/valves_hydrodynamic.py:1703
E           vibration/human/instrumentation.py:830
E           vibration/human/instrumentation.py:919
E           vibration/human/instrumentation.py:1089

tests/test_check_boundary_comparisons.py::test_a_parameter_rebound_to_a_value_of_itself_keeps_the_caller_value, red on fc71c2180:

E         Right contains one more item: 'np.max(levels) - np.min(levels) <= _SPREAD_LIMIT_DB'

The value tests read the printed pages: ISO 3746:2010 Tables B.1 and B.2 (BS EN ISO 3746:2010, PDF pages 34 and 35, folios 25 and 26) pin the four one-plane survey rows, the two-plane and the three-plane rows times the radius; ISO 3744:2010 Table B.2 (BS EN ISO 3744:2010, PDF page 47, folio 38) prints the same four broadband positions. Doc 29 Volume 2, B-42 and B-43, gives the two altitude cases the new approach_profile tests build. A mutation that raises CatalogueError from the bounded s't refusal of ResilientLayer.natural_frequency now fails its test.

Gates

  • ruff check ., ruff format --check .: clean. mypy src scripts: no issues in 701 source files. bandit -q -r src: exit 0.
  • Full suite on the remote gate (pytest -q -n 8 tests/, Python 3.13): 29007 passed, 69 skipped.
  • scripts/check_doc_snippets.py: 7565 blocks over 732 pages pass.
  • Site: pnpm install --frozen-lockfile, check:types (0 errors), build and html-validate: green.
  • scripts/check_notebook.py on a real ipykernel: every tagged cell reads as it should, the warning cell with its FilterBankWarning.
  • make conformance: 1893/1893, no drift. make api-docs, make llms and the site evidence pages: no drift; check_api_reference.py covers all 3082 public names.
  • check_frozen_constants, check_parameter_units, check_published_sources, check_em_dashes, check_digit_grouping, check_markdown_hazards, check_errata_evidence, check_spanish_accents, check_boundary_comparisons, check_raises_blocks, check_dead_constants, check_identifier_spelling, check_record_display and the rest of scripts/check_*.py: all pass. check_animation_freshness reports only anim_epnl_flyover, stale with the same fingerprint on the base; this branch moves no clip.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, we are unable to review this pull request

The GitHub API does not allow us to fetch diffs exceeding 300 files, and this pull request has 378

@jmrplens
jmrplens added this pull request to stack #984 October 17, 2026 17:11
@coderabbitai

coderabbitai Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 377 files, which is 277 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration
  • Configuration used: Repository: jmrplens/phonometry/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3bc69eac-b051-4828-be4b-c8126063ad22
📥 Commits

Reviewing files that changed from the base of the PR and between 075ac5e and 25453c2.

⛔ Files ignored due to path filters: 1
  • scripts/boundary_comparison_exemptions.tsv is excluded by !**/*.tsv
📒 Files selected for processing: 377
  • .github/workflows/python-app.yml
  • CHANGELOG.md
  • CONTRIBUTING.md
  • docs/buildings/rooms/room-noise.md
  • docs/devices/emission/sound-power-pressure.md
  • docs/fluids/humid-air.md
  • docs/materials/resilient/dynamic-stiffness.md
  • docs/perception/speech/speech-transmission.md
  • docs/reference/api/index.md
  • docs/start/upgrading.md
  • llms-full.txt
  • pyproject.toml
  • scripts/api_taxonomy.py
  • scripts/check_boundary_comparisons.py
  • scripts/check_notebook.py
  • scripts/fdtd_gpu.py
  • scripts/fdtd_gpu_remote.py
  • scripts/generate_api_docs.py
  • site/public/llms/llms-buildings-rooms.txt
  • site/public/llms/llms-devices-emission-enveloping.txt
  • site/public/llms/llms-fluids.txt
  • site/public/llms/llms-materials-resilient.txt
  • site/public/llms/llms-perception-speech.txt
  • site/public/llms/llms-upgrading.txt
  • site/src/content/docs/buildings/design/insulation-prediction.mdx
  • site/src/content/docs/buildings/rooms/room-noise.mdx
  • site/src/content/docs/devices/emission/sound-power-pressure.mdx
  • site/src/content/docs/es/buildings/design/insulation-prediction.mdx
  • site/src/content/docs/es/buildings/rooms/room-noise.mdx
  • site/src/content/docs/es/devices/emission/sound-power-pressure.mdx
  • site/src/content/docs/es/fluids/humid-air.mdx
  • site/src/content/docs/es/materials/resilient/dynamic-stiffness.mdx
  • site/src/content/docs/es/perception/speech/speech-transmission.mdx
  • site/src/content/docs/es/start/getting-started.mdx
  • site/src/content/docs/es/start/upgrading.mdx
  • site/src/content/docs/fluids/humid-air.mdx
  • site/src/content/docs/materials/resilient/dynamic-stiffness.mdx
  • site/src/content/docs/perception/speech/speech-transmission.mdx
  • site/src/content/docs/reference/api/aeroacoustics/certification.md
  • site/src/content/docs/reference/api/aeroacoustics/flight-performance.md
  • site/src/content/docs/reference/api/aeroacoustics/rotorcraft-noise.md
  • site/src/content/docs/reference/api/building/intensity-insulation.md
  • site/src/content/docs/reference/api/building/laboratory-insulation.md
  • site/src/content/docs/reference/api/building/linings.md
  • site/src/content/docs/reference/api/building/rainfall-sound.md
  • site/src/content/docs/reference/api/building/service-equipment.md
  • site/src/content/docs/reference/api/building/simplified-model.md
  • site/src/content/docs/reference/api/building/uncertainty.md
  • site/src/content/docs/reference/api/electroacoustics/induction-loop-components.md
  • site/src/content/docs/reference/api/environment/acoustic-roughness.md
  • site/src/content/docs/reference/api/environment/barrier-in-situ.md
  • site/src/content/docs/reference/api/environment/ground-barriers.md
  • site/src/content/docs/reference/api/environment/noise-reducing-devices.md
  • site/src/content/docs/reference/api/environment/software-quality.md
  • site/src/content/docs/reference/api/environment/soundscape.md
  • site/src/content/docs/reference/api/environment/track-decay.md
  • site/src/content/docs/reference/api/environment/wind-turbine-modulation.md
  • site/src/content/docs/reference/api/environment/wind-turbine-receptor.md
  • site/src/content/docs/reference/api/filters/compliance.md
  • site/src/content/docs/reference/api/filters/core.md
  • site/src/content/docs/reference/api/filters/weighting.md
  • site/src/content/docs/reference/api/fluids/fluids.md
  • site/src/content/docs/reference/api/fluids/gas.md
  • site/src/content/docs/reference/api/fluids/water.md
  • site/src/content/docs/reference/api/materials/dynamic-stiffness.md
  • site/src/content/docs/reference/api/metrology/reciprocity-coupler.md
  • site/src/content/docs/reference/api/noise_control/enclosures.md
  • site/src/content/docs/reference/api/noise_control/valves-hydrodynamic.md
  • site/src/content/docs/reference/api/power/sound-power-high-frequency.md
  • site/src/content/docs/reference/api/power/sound-power-in-situ.md
  • site/src/content/docs/reference/api/power/sound-power.md
  • site/src/content/docs/reference/api/power/turbine-noise.md
  • site/src/content/docs/reference/api/rooms/noise-criteria.md
  • site/src/content/docs/reference/api/signals/test-signals.md
  • site/src/content/docs/reference/api/signals/windows.md
  • site/src/content/docs/reference/api/simulation/elastic-fdtd.md
  • site/src/content/docs/reference/api/simulation/fdtd.md
  • site/src/content/docs/reference/api/simulation/ntff.md
  • site/src/content/docs/reference/api/underwater/acoustics.md
  • site/src/content/docs/reference/api/underwater/numerical.md
  • site/src/content/docs/reference/api/underwater/pile-driving-noise.md
  • site/src/content/docs/reference/api/vibration/building-damage.md
  • site/src/content/docs/reference/api/vibration/instrumentation.md
  • site/src/content/docs/reference/api/vibration/transfer-stiffness.md
  • site/src/content/docs/start/getting-started.mdx
  • site/src/content/docs/start/upgrading.mdx
  • src/phonometry/_internal/json_input.py
  • src/phonometry/_internal/rays.py
  • src/phonometry/_internal/validation.py
  • src/phonometry/_plot/common.py
  • src/phonometry/_plot/emission.py
  • src/phonometry/_plot/filters.py
  • src/phonometry/_plot/geometry/electroacoustics.py
  • src/phonometry/_plot/geometry/materials.py
  • src/phonometry/_plot/geometry/noise_control.py
  • src/phonometry/_plot/geometry/room.py
  • src/phonometry/_report/_layout.py
  • src/phonometry/_report/iso10848.py
  • src/phonometry/_report/iso1996_tone.py
  • src/phonometry/_report/iso3382.py
  • src/phonometry/_report/iso3382_3.py
  • src/phonometry/_report/metadata.py
  • src/phonometry/aircraft/__init__.py
  • src/phonometry/aircraft/airport_noise.py
  • src/phonometry/aircraft/certification.py
  • src/phonometry/aircraft/flight_performance.py
  • src/phonometry/aircraft/measurement_system.py
  • src/phonometry/aircraft/rotorcraft_noise.py
  • src/phonometry/broadcast/_program_loudness.py
  • src/phonometry/building/__init__.py
  • src/phonometry/building/measurement/_rainfall_sound.py
  • src/phonometry/building/measurement/flanking_transmission.py
  • src/phonometry/building/measurement/floor_covering_improvement.py
  • src/phonometry/building/measurement/insulation.py
  • src/phonometry/building/measurement/intensity_insulation.py
  • src/phonometry/building/measurement/laboratory_insulation.py
  • src/phonometry/building/measurement/ratings.py
  • src/phonometry/building/measurement/service_equipment.py
  • src/phonometry/building/measurement/uncertainty.py
  • src/phonometry/building/prediction/__init__.py
  • src/phonometry/building/prediction/aperture_transmission.py
  • src/phonometry/building/prediction/detailed_model.py
  • src/phonometry/building/prediction/facade.py
  • src/phonometry/building/prediction/installed_structure_borne.py
  • src/phonometry/building/prediction/linings.py
  • src/phonometry/building/prediction/panel_transmission.py
  • src/phonometry/building/prediction/resilient_layers.py
  • src/phonometry/building/prediction/simplified_model.py
  • src/phonometry/building/regulation/spain.py
  • src/phonometry/electroacoustics/distortion.py
  • src/phonometry/electroacoustics/frequency_response.py
  • src/phonometry/electroacoustics/induction_loop_components.py
  • src/phonometry/electroacoustics/loudspeaker.py
  • src/phonometry/electroacoustics/program_signal.py
  • src/phonometry/electroacoustics/sound_reinforcement.py
  • src/phonometry/electroacoustics/swept_sine.py
  • src/phonometry/emission/_shared.py
  • src/phonometry/emission/_sound_power_anechoic.py
  • src/phonometry/emission/_sound_power_hard_walled.py
  • src/phonometry/emission/_sound_power_in_duct.py
  • src/phonometry/emission/_sound_power_in_situ.py
  • src/phonometry/emission/_sound_power_intensity.py
  • src/phonometry/emission/_sound_power_intensity_points.py
  • src/phonometry/emission/_sound_power_reverberation.py
  • src/phonometry/emission/_sound_power_special_room.py
  • src/phonometry/emission/free_field_qualification.py
  • src/phonometry/emission/intensity.py
  • src/phonometry/emission/intensity_compliance.py
  • src/phonometry/emission/reference_sound_source.py
  • src/phonometry/emission/sound_power.py
  • src/phonometry/emission/sound_power_high_frequency.py
  • src/phonometry/emission/sound_power_plant.py
  • src/phonometry/emission/turbine_noise.py
  • src/phonometry/emission/vibration_sound_power.py
  • src/phonometry/environment/assessment/exposure_distribution.py
  • src/phonometry/environment/assessment/measurement.py
  • src/phonometry/environment/assessment/rating.py
  • src/phonometry/environment/assessment/soundscape.py
  • src/phonometry/environment/assessment/spain.py
  • src/phonometry/environment/assessment/wind_turbine_modulation.py
  • src/phonometry/environment/assessment/wind_turbine_receptor.py
  • src/phonometry/environment/propagation/air_absorption.py
  • src/phonometry/environment/propagation/barrier_in_situ.py
  • src/phonometry/environment/propagation/barrier_reflection.py
  • src/phonometry/environment/propagation/ground_barriers.py
  • src/phonometry/environment/propagation/noise_reducing_devices.py
  • src/phonometry/environment/propagation/outdoor_propagation.py
  • src/phonometry/environment/propagation/refraction.py
  • src/phonometry/environment/propagation/software_quality.py
  • src/phonometry/environment/sources/acoustic_roughness.py
  • src/phonometry/environment/sources/cnossos_rail.py
  • src/phonometry/environment/sources/cnossos_road.py
  • src/phonometry/environment/sources/rolling_stock_noise.py
  • src/phonometry/environment/sources/track_decay.py
  • src/phonometry/filters/__init__.py
  • src/phonometry/filters/_warnings.py
  • src/phonometry/filters/compliance.py
  • src/phonometry/filters/core.py
  • src/phonometry/filters/design.py
  • src/phonometry/filters/equalizer.py
  • src/phonometry/filters/frequencies.py
  • src/phonometry/filters/periodic_tests.py
  • src/phonometry/filters/weighting.py
  • src/phonometry/filters/weighting_compliance.py
  • src/phonometry/fluids/__init__.py
  • src/phonometry/fluids/_air.py
  • src/phonometry/fluids/_state.py
  • src/phonometry/fluids/gas.py
  • src/phonometry/fluids/water.py
  • src/phonometry/hearing/_earmuff_insertion_loss.py
  • src/phonometry/hearing/_real_ear_attenuation.py
  • src/phonometry/hearing/active_noise_reduction.py
  • src/phonometry/hearing/audiometry.py
  • src/phonometry/hearing/hearing_protectors.py
  • src/phonometry/hearing/noise_induced_hearing_loss.py
  • src/phonometry/hearing/occupational_exposure.py
  • src/phonometry/hearing/sound_field_audiometry.py
  • src/phonometry/io/_blocks.py
  • src/phonometry/io/_catalogue.py
  • src/phonometry/io/_chunks.py
  • src/phonometry/io/_resolve.py
  • src/phonometry/io/_sidecar.py
  • src/phonometry/io/_signal.py
  • src/phonometry/io/_write.py
  • src/phonometry/materials/absorbers/_airflow_resistance.py
  • src/phonometry/materials/absorbers/four_microphone.py
  • src/phonometry/materials/absorbers/impedance_tube.py
  • src/phonometry/materials/absorbers/layered.py
  • src/phonometry/materials/absorbers/slow_sound.py
  • src/phonometry/materials/absorbers/sound_absorption.py
  • src/phonometry/materials/absorbers/uncertainty.py
  • src/phonometry/materials/diffusers/design.py
  • src/phonometry/materials/resilient/dynamic_stiffness.py
  • src/phonometry/materials/surfaces/road_absorption.py
  • src/phonometry/metrology/comparison_calibration.py
  • src/phonometry/metrology/conformance.py
  • src/phonometry/metrology/data_qualification.py
  • src/phonometry/metrology/free_field_corrections.py
  • src/phonometry/metrology/random_incidence.py
  • src/phonometry/metrology/reciprocity_calibration.py
  • src/phonometry/metrology/reciprocity_coupler.py
  • src/phonometry/metrology/reciprocity_free_field.py
  • src/phonometry/metrology/sound_level_meter.py
  • src/phonometry/metrology/uncertainty.py
  • src/phonometry/noise_control/duct_modes.py
  • src/phonometry/noise_control/enclosures.py
  • src/phonometry/noise_control/hvac.py
  • src/phonometry/noise_control/silencer_in_situ.py
  • src/phonometry/noise_control/silencer_measurement.py
  • src/phonometry/noise_control/silencers.py
  • src/phonometry/noise_control/valves.py
  • src/phonometry/noise_control/valves_hydrodynamic.py
  • src/phonometry/psychoacoustics/loudness/contours.py
  • src/phonometry/psychoacoustics/loudness/zwicker.py
  • src/phonometry/psychoacoustics/quality/_tone_audibility.py
  • src/phonometry/psychoacoustics/quality/tonality.py
  • src/phonometry/room/__init__.py
  • src/phonometry/room/_impulse_response.py
  • src/phonometry/room/_shared.py
  • src/phonometry/room/acoustics.py
  • src/phonometry/room/auditorium.py
  • src/phonometry/room/image_source.py
  • src/phonometry/room/noise_criteria.py
  • src/phonometry/room/steady_field.py
  • src/phonometry/signals/__init__.py
  • src/phonometry/signals/_cepstrum.py
  • src/phonometry/signals/_correlation.py
  • src/phonometry/signals/_envelope.py
  • src/phonometry/signals/inversion.py
  • src/phonometry/signals/levels.py
  • src/phonometry/signals/multitaper.py
  • src/phonometry/signals/phase.py
  • src/phonometry/signals/spectra.py
  • src/phonometry/signals/synchronous_average.py
  • src/phonometry/signals/test_signals.py
  • src/phonometry/signals/time_frequency.py
  • src/phonometry/signals/windows.py
  • src/phonometry/simulation/elastic_fdtd.py
  • src/phonometry/simulation/fdtd.py
  • src/phonometry/simulation/ntff.py
  • src/phonometry/speech/objective_intelligibility.py
  • src/phonometry/speech/sti.py
  • src/phonometry/underwater/__init__.py
  • src/phonometry/underwater/acoustics.py
  • src/phonometry/underwater/propagation/__init__.py
  • src/phonometry/underwater/propagation/numerical.py
  • src/phonometry/underwater/sonar_equation.py
  • src/phonometry/underwater/sources/pile_driving_noise.py
  • src/phonometry/vibration/human/exposure.py
  • src/phonometry/vibration/human/instrumentation.py
  • src/phonometry/vibration/human/multiple_shock.py
  • src/phonometry/vibration/immission/people.py
  • src/phonometry/vibration/immission/railway.py
  • src/phonometry/vibration/immission/vibration_meter.py
  • src/phonometry/vibration/machinery/diagnostics.py
  • src/phonometry/vibration/machinery/evaluation.py
  • src/phonometry/vibration/structural/_impact_mobility.py
  • src/phonometry/vibration/structural/_junction_transmission.py
  • src/phonometry/vibration/structural/building_damage.py
  • src/phonometry/vibration/structural/mechanical_mobility.py
  • src/phonometry/vibration/structural/point_mobility.py
  • src/phonometry/vibration/structural/transfer_stiffness.py
  • tests/aircraft/test_certification.py
  • tests/aircraft/test_flight_performance.py
  • tests/aircraft/test_rotorcraft_terrain.py
  • tests/broadcast/test_program_loudness.py
  • tests/building/measurement/test_building_uncertainty.py
  • tests/building/measurement/test_floor_covering_improvement.py
  • tests/building/measurement/test_intensity_insulation.py
  • tests/building/measurement/test_service_equipment.py
  • tests/building/prediction/test_simplified_model.py
  • tests/building/prediction/test_wall_linings.py
  • tests/building/regulation/test_spanish_building_code.py
  • tests/building/test_insulation_datasheets.py
  • tests/electroacoustics/test_frequency_response.py
  • tests/electroacoustics/test_induction_loop.py
  • tests/electroacoustics/test_induction_loop_components.py
  • tests/electroacoustics/test_loudspeaker.py
  • tests/electroacoustics/test_microphone.py
  • tests/electroacoustics/test_piston.py
  • tests/electroacoustics/test_sound_reinforcement.py
  • tests/emission/test_free_field_qualification.py
  • tests/emission/test_reference_sound_source.py
  • tests/emission/test_sound_energy.py
  • tests/emission/test_sound_power.py
  • tests/emission/test_sound_power_in_duct.py
  • tests/emission/test_sound_power_in_situ.py
  • tests/emission/test_turbine_noise.py
  • tests/environment/assessment/test_exposure_distribution.py
  • tests/environment/assessment/test_soundscape.py
  • tests/environment/assessment/test_spain.py
  • tests/environment/assessment/test_wind_turbine_modulation.py
  • tests/environment/assessment/test_wind_turbine_receptor.py
  • tests/environment/propagation/test_barrier_reflection.py
  • tests/environment/propagation/test_ground_barriers.py
  • tests/environment/propagation/test_software_quality.py
  • tests/environment/sources/test_acoustic_roughness.py
  • tests/environment/sources/test_track_decay.py
  • tests/filters/test_pattern_evaluation.py
  • tests/filters/test_stateful_octave_filter_bank.py
  • tests/fluids/test_gas.py
  • tests/fluids/test_state.py
  • tests/fluids/test_water.py
  • tests/hearing/test_hearing_protectors.py
  • tests/io/test_io_sidecar.py
  • tests/materials/absorbers/test_slow_sound.py
  • tests/materials/absorbers/test_sound_absorption.py
  • tests/materials/resilient/test_dynamic_stiffness.py
  • tests/materials/test_suspended_ceilings.py
  • tests/metrology/test_comparison_phase_impedance_time.py
  • tests/metrology/test_free_field_corrections.py
  • tests/metrology/test_random_incidence.py
  • tests/metrology/test_reciprocity_calibration.py
  • tests/metrology/test_sound_level_meter.py
  • tests/noise_control/test_room_to_room.py
  • tests/noise_control/test_silencer_measurement.py
  • tests/noise_control/test_silencers.py
  • tests/noise_control/test_valves.py
  • tests/psychoacoustics/quality/test_tonality.py
  • tests/psychoacoustics/quality/test_tone_audibility.py
  • tests/room/test_image_source.py
  • tests/room/test_impulse_response.py
  • tests/room/test_iso3382_report.py
  • tests/room/test_noise_criteria.py
  • tests/signals/test_envelope.py
  • tests/signals/test_signal_toolbox.py
  • tests/simulation/test_elastic_fdtd.py
  • tests/simulation/test_elastic_fluid_solid.py
  • tests/simulation/test_fdtd.py
  • tests/simulation/test_fdtd_plane_wave.py
  • tests/solids/test_wave3_catalogues.py
  • tests/speech/test_sti.py
  • tests/speech/test_stipa_certified.py
  • tests/test_advanced.py
  • tests/test_check_boundary_comparisons.py
  • tests/test_check_notebook.py
  • tests/test_choice_vocabulary.py
  • tests/test_error_kinds.py
  • tests/test_errors_and_edge_cases.py
  • tests/test_fdtd2d.py
  • tests/test_fdtd_gpu_parity.py
  • tests/test_internal_validation.py
  • tests/test_package_architecture.py
  • tests/test_scalar_guards.py
  • tests/test_signal_contract_exemptions.py
  • tests/test_utils.py
  • tests/underwater/propagation/test_eigenrays.py
  • tests/underwater/propagation/test_gaussian_beams.py
  • tests/underwater/sources/test_pile_driving_noise.py
  • tests/underwater/sources/test_ship_radiated_noise.py
  • tests/underwater/test_underwater_acoustics.py
  • tests/vibration/immission/test_people.py
  • tests/vibration/immission/test_prediction.py
  • tests/vibration/machinery/test_diagnostics.py
  • tests/vibration/structural/test_building_damage.py
  • tests/vibration/structural/test_impact_mobility.py
  • tests/vibration/structural/test_transfer_stiffness.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jmrplens jmrplens changed the title fix/errors and warnings by kind A wrong type raises TypeError, a missing key KeyError, and every warning is a PhonometryWarning you can filter by topic Oct 17, 2026
@jmrplens
jmrplens force-pushed the fix/errors-and-warnings-by-kind branch from 08cc45d to babc6f7 Compare October 17, 2026 17:12
@github-actions github-actions Bot added documentation Improvements or additions to documentation api Public API surface, naming and deprecations figures Generated plots, diagrams and animations reports Accredited-format .report() fiches and their rendering site Documentation website i18n English and Spanish translations packaging Build, release, PyPI and the stub package ci Workflows, linting and developer tooling area: aircraft Aircraft and rotorcraft noise area: broadcast Programme loudness and broadcast levels area: building Sound insulation and building acoustics area: electroacoustics Transducers, arrays and electroacoustic devices area: emission Sound power and source emission area: environment Outdoor propagation, environmental sources and noise assessment area: hearing Audiometric thresholds, hearing loss and noise exposure area: materials Absorption, impedance and material properties area: metrology Calibration, uncertainty and measurement quality area: noise control Silencers, barriers and noise control treatments area: psychoacoustics Loudness, sharpness, roughness and annoyance area: room Room acoustics and reverberation area: simulation FDTD and other numerical solvers area: underwater Underwater acoustics and propagation area: vibration Human vibration and structure-borne sound area: core Shared internals and cross-cutting code every domain depends on labels Oct 17, 2026
@github-actions github-actions Bot added area: filters Octave filter banks, weightings and instrument class verification area: signals Levels, spectra, generators and general signal analysis area: speech Speech intelligibility: STI, SII and STOI labels Oct 17, 2026
@codecov

codecov Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.32258% with 99 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (fix/records-instead-of-tuples@075ac5e). Learn more about missing BASE report.

Files with missing lines Patch % Lines
src/phonometry/_internal/validation.py 80.72% 16 Missing ⚠️
src/phonometry/filters/periodic_tests.py 10.00% 9 Missing ⚠️
...rc/phonometry/environment/assessment/soundscape.py 63.63% 8 Missing ⚠️
src/phonometry/metrology/sound_level_meter.py 57.89% 8 Missing ⚠️
...onometry/building/measurement/service_equipment.py 72.22% 5 Missing ⚠️
...rc/phonometry/metrology/reciprocity_calibration.py 28.57% 5 Missing ⚠️
...etry/electroacoustics/induction_loop_components.py 42.85% 4 Missing ⚠️
src/phonometry/filters/_warnings.py 0.00% 4 Missing ⚠️
src/phonometry/metrology/comparison_calibration.py 55.55% 4 Missing ⚠️
src/phonometry/emission/turbine_noise.py 66.66% 3 Missing ⚠️
... and 28 more
Additional details and impacted files
@@                       Coverage Diff                        @@
##             fix/records-instead-of-tuples     #979   +/-   ##
================================================================
  Coverage                                 ?   92.02%           
================================================================
  Files                                    ?      446           
  Lines                                    ?    91127           
  Branches                                 ?        0           
================================================================
  Hits                                     ?    83862           
  Misses                                   ?     7265           
  Partials                                 ?        0           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Numerical conformance

All 1893 conformance checks pass, across 111 domains and 523 standards

1893/1893 checks pass across 111 domains and 523 standards (227 normative designations, 125 further published sources).

Used in the tables below is how much of that clause's published tolerance the deviation consumes: 100 % sits exactly on the limit, 5 % uses a twentieth of the allowance, and a dash means the clause states no two-sided tolerance for the quantity, so there is no budget to spend. It is reported and never used to decide a verdict, which is settled at full precision before any rounding.

Renamed (4)

Standard Base quantity Head quantity
ISO 8297:1994 Table 2 Background correction at differences of 6 to 10 dB and at 12 dB, read through plant_background_correction_db Background correction at differences of 6 to 10 dB and at 12 dB, read through plant_background_correction
Wenz wind noise (rule of fives) Wind spectrum level at 1 kHz, 5 kn (canonical anchor), dB re 1 µPa²/Hz Wind spectrum level at 1 kHz, 5 kt (canonical anchor), dB re 1 µPa²/Hz
JOMOPANS-ECHO ship source level Bulker V=13.5 kn L=211 m band level at 1 kHz (File S1 oracle), dB re 1 µPa m Bulker V=13.5 kt L=211 m band level at 1 kHz (File S1 oracle), dB re 1 µPa m
ISO 10847:1997 6.3.1 The short-distance ratio is strict at 0,1, and the after case needs both of its two inequalities The short-distance ratio is strict at 0,1, the after case needs both of its two inequalities, and a geometry past 0,1 on every ratio is short

Closest to their published limit (top 5)

The rows with the least room left, so the ones a change is most likely to push over.

Standard Quantity Deviation Used
ISO/TR 17534-3:2015 Table 3 Ground-projected path length dp, m 0.005 m 100 %
DIN 4150-2:1999-06 Annex C, Example 5 KB_FTr with hammer b) in the rest hours, Formula (5) -0.005 100 %
DIN 4150-2:1999-06 Annex C, Example 8 KB_FTm over the record with the passage maxima alone -0.0005 100 %
E DIN 4150-2:2023-08 Annex B, Table B.1 KB_FTm,Zug of the metro north by Formula (5) -0.0005 100 %
Jarvis (1996) NPL CIRA(EXT) 010 Appendix B, folio 26 Volume of the coupler of the example, v = pi r^2 L -0.00000000005 m³ 100 %

Pass Tests & coverage: 261684 tests, 0 failures (all green)
Python Version Tests Failures Coverage Status
macos-latest-3.12 29076 0 92.0% Pass Passed
macos-latest-3.13 29076 0 92.0% Pass Passed
macos-latest-3.14 29076 0 92.0% Pass Passed
ubuntu-latest-3.12 29076 0 92.0% Pass Passed
ubuntu-latest-3.13 29076 0 92.0% Pass Passed
ubuntu-latest-3.14 29076 0 92.0% Pass Passed
windows-latest-3.12 29076 0 92.0% Pass Passed
windows-latest-3.13 29076 0 92.0% Pass Passed
windows-latest-3.14 29076 0 92.0% Pass Passed

Full report at this commit: docs/CONFORMANCE.md · docs/conformance.json · full CI artifacts

…ing is a PhonometryWarning you can filter by topic

The Python documentation draws the line between the two refusals a guard raises: `TypeError` is "raised when an operation or function is applied to an object of inappropriate type", and `ValueError` "when an operation or function receives an argument that has the right type but an inappropriate value". The library had it both ways. Seventy-six refusals asked an argument for its type and raised `ValueError`, nine of them behind a `# noqa: TRY004` that said so on purpose; thirty-two handlers caught a `TypeError` and raised it again as a `ValueError`; a few others raised `TypeError` for the same mistake; and about ninety parameters written as an `int` went through `int()` alone, which truncated `2.5` to `2` and took `True` as `1` without a word. A lookup that missed raised `KeyError` in one result and `ValueError` in the next for the same kind of question. And the promise the root makes, that one `filterwarnings` rule on `PhonometryWarning` reaches every advisory, did not hold: `RoadDeviceWarning` derived from `UserWarning` alone, seven calls warned as a plain `UserWarning` (two naming no class at all), and five as the bare root, so none of them could be silenced or escalated without every other advisory too.
@jmrplens
jmrplens force-pushed the fix/errors-and-warnings-by-kind branch from babc6f7 to 25453c2 Compare October 20, 2026 01:45
@greptile-apps

greptile-apps Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] Renames exception types and warning classes across the library.

Fix stored source indices before merging; newly accepted whole floats currently crash simulations.

Findings

  1. P1 Accepted sources crash when stepped ▶

Reviews (1) · Last reviewed commit: "A wrong type raises TypeError, a missing..." · Reviewed by Greptile

:class:`ValueError` for a number that is not whole. The bound each one
has is checked where it is read.
"""
return require_count(value, name, at_least=None)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Accepted sources crash when stepped

_integer now accepts whole floats, but source registration discards the converted indices and stores the original source. For example, GaussianPulse(ix=2.0, iy=3, half_width_s=1e-4) passes FDTD2D.add_source, then run(1) raises IndexError when step indexes self.p with src.ix. The same problem affects PlaneWaveSource.offset and elastic sources.

Store the converted integers before registering each source, and test that whole-float indices can complete a step.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in #992, commit f1f5f18. Every source record holds its cell indices (and the plane wave its offset) as the ints they name when it is built, and refuses a half cell there. Tests over the six source types run a whole-float index through a step. The CuPy proof was re-run on the GPU in f043e3c: fields and phasors bit-identical, only the engine fingerprint moved.

@sonarqubecloud

Copy link
Copy Markdown

@jmrplens
jmrplens merged commit eac3097 into main Oct 21, 2026
105 of 110 checks passed
@jmrplens
jmrplens deleted the fix/errors-and-warnings-by-kind branch October 21, 2026 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api Public API surface, naming and deprecations area: aircraft Aircraft and rotorcraft noise area: broadcast Programme loudness and broadcast levels area: building Sound insulation and building acoustics area: core Shared internals and cross-cutting code every domain depends on area: electroacoustics Transducers, arrays and electroacoustic devices area: emission Sound power and source emission area: environment Outdoor propagation, environmental sources and noise assessment area: filters Octave filter banks, weightings and instrument class verification area: hearing Audiometric thresholds, hearing loss and noise exposure area: materials Absorption, impedance and material properties area: metrology Calibration, uncertainty and measurement quality area: noise control Silencers, barriers and noise control treatments area: psychoacoustics Loudness, sharpness, roughness and annoyance area: room Room acoustics and reverberation area: signals Levels, spectra, generators and general signal analysis area: simulation FDTD and other numerical solvers area: speech Speech intelligibility: STI, SII and STOI area: underwater Underwater acoustics and propagation area: vibration Human vibration and structure-borne sound ci Workflows, linting and developer tooling documentation Improvements or additions to documentation figures Generated plots, diagrams and animations i18n English and Spanish translations packaging Build, release, PyPI and the stub package reports Accredited-format .report() fiches and their rendering site Documentation website

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant