From 79a62c5c0f4eded5e6e74971080fa12e149b2919 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Fri, 7 Jul 2023 11:08:48 +0200 Subject: [PATCH 01/61] =?UTF-8?q?Bump=20version:=201.0.0=20=E2=86=92=201.1?= =?UTF-8?q?.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.cfg | 2 +- setup.py | 2 +- sofar/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index b7fac823..2866f7b2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.0.0 +current_version = 1.1.0 commit = True tag = True diff --git a/setup.py b/setup.py index 36d536c7..adde0d82 100644 --- a/setup.py +++ b/setup.py @@ -65,7 +65,7 @@ "Documentation": "https://sofar.readthedocs.io/", "Source Code": "https://github.com/pyfar/sofar", }, - version='1.0.0', + version='1.1.0', zip_safe=False, python_requires='>=3.8' ) diff --git a/sofar/__init__.py b/sofar/__init__.py index 9b8916e0..f2836b21 100644 --- a/sofar/__init__.py +++ b/sofar/__init__.py @@ -4,7 +4,7 @@ __author__ = """The pyfar developers""" __email__ = 'info@pyfar.org' -__version__ = '1.0.0' +__version__ = '1.1.0' from .sofa import Sofa From bb30e591a2ad2aa12d7c3543430e71b6f0533c5f Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Fri, 7 Jul 2023 11:14:33 +0200 Subject: [PATCH 02/61] =?UTF-8?q?Revert=20"Bump=20version:=201.0.0=20?= =?UTF-8?q?=E2=86=92=201.1.0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 79a62c5c0f4eded5e6e74971080fa12e149b2919. --- setup.cfg | 2 +- setup.py | 2 +- sofar/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 2866f7b2..b7fac823 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.1.0 +current_version = 1.0.0 commit = True tag = True diff --git a/setup.py b/setup.py index adde0d82..36d536c7 100644 --- a/setup.py +++ b/setup.py @@ -65,7 +65,7 @@ "Documentation": "https://sofar.readthedocs.io/", "Source Code": "https://github.com/pyfar/sofar", }, - version='1.1.0', + version='1.0.0', zip_safe=False, python_requires='>=3.8' ) diff --git a/sofar/__init__.py b/sofar/__init__.py index f2836b21..9b8916e0 100644 --- a/sofar/__init__.py +++ b/sofar/__init__.py @@ -4,7 +4,7 @@ __author__ = """The pyfar developers""" __email__ = 'info@pyfar.org' -__version__ = '1.1.0' +__version__ = '1.0.0' from .sofa import Sofa From f1a3fcbd432a004e4a012ea0a4b1a3d13a0a41fd Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Sun, 30 Jul 2023 18:30:49 +0200 Subject: [PATCH 03/61] Delete tox.ini --- tox.ini | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 tox.ini diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 8b4e5151..00000000 --- a/tox.ini +++ /dev/null @@ -1,44 +0,0 @@ -[tox] -envlist = py37, py38, py39, flake8, build, wheel - -[travis] -python = - 3.9: build, wheel, flake8 - 3.8: build, wheel - 3.7: build, wheel - - -[testenv:flake8] -basepython = python -deps = flake8 -commands = flake8 sofar tests - -# Release tooling -[testenv:build] -basepython = python -skip_install = true -deps = - wheel - setuptools -commands = - python setup.py -q sdist bdist_wheel - - -[testenv] -setenv = - PYTHONPATH = {toxinidir} -deps = - -r{toxinidir}/requirements_dev.txt -; If you want to make tox run the tests with the same versions, create a -; requirements.txt with the pinned versions and uncomment the following line: -; -r{toxinidir}/requirements.txt -commands = - pip install -U pip - py.test --basetemp={envtmpdir} - - -[testenv:wheel] -wheel_build_env = build -wheel = - cover: false - nocov: true From 08128ecad17d76c16fb58069688f3fcf1aa7d3e1 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Sun, 30 Jul 2023 18:31:50 +0200 Subject: [PATCH 04/61] remove ignores for .tox folder --- .gitignore | 1 - setup.cfg | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9bfd4fa8..9e819fda 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,6 @@ pip-log.txt # Unit test / coverage reports .coverage -.tox .coverage.* nosetests.xml coverage.xml diff --git a/setup.cfg b/setup.cfg index b7fac823..31397bf6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -15,7 +15,7 @@ replace = __version__ = '{new_version}' universal = 1 [flake8] -exclude = .git, .tox, docs +exclude = .git, docs [aliases] test = pytest From 30f3ca63539da2e1ec28c8a9def7a1df2887f956 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Sun, 30 Jul 2023 18:32:13 +0200 Subject: [PATCH 05/61] remove tox dependencies --- requirements_dev.txt | 2 -- setup.py | 1 - 2 files changed, 3 deletions(-) diff --git a/requirements_dev.txt b/requirements_dev.txt index 15432d2a..23112161 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -3,7 +3,6 @@ bump2version wheel watchdog flake8 -tox coverage Sphinx twine @@ -14,7 +13,6 @@ numpy>=1.14.0 scipy>=1.5.0 deepdiff insipid-sphinx-theme -tox-wheel autodocsumm netCDF4 beautifulsoup4 diff --git a/setup.py b/setup.py index 36d536c7..1b64f44e 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,6 @@ 'wheel', 'watchdog', 'flake8', - 'tox', 'coverage', 'Sphinx', 'twine' From 56186434b9b00aeb969ecef4b07ac0b07148ca15 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Sat, 16 Sep 2023 17:29:27 +0200 Subject: [PATCH 06/61] update handling of verification according to sofaconventions.org non-stable conventions are now flagged by version < 1.0 and are not verified by default --- sofar/io.py | 10 ++++++++-- sofar/sofa.py | 20 ++++++++++++++++++-- tests/test_io.py | 12 ++++++++---- tests/test_sofa_upgrade_conventions.py | 11 ++++++++++- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/sofar/io.py b/sofar/io.py index 3d66921d..d9c2954b 100644 --- a/sofar/io.py +++ b/sofar/io.py @@ -9,7 +9,7 @@ from .utils import _verify_convention_and_version, _atleast_nd -def read_sofa(filename, verify=True, verbose=True): +def read_sofa(filename, verify=None, verbose=True): """ Read SOFA file from disk and convert it to SOFA object. @@ -24,7 +24,9 @@ def read_sofa(filename, verify=True, verbose=True): Verify and update the SOFA object by calling :py:func:`~Sofa.verify`. This helps to find potential errors in the default values and is thus recommended. If reading a file does not work, try to call `Sofa` with - ``verify=False``. The default is ``True``. + ``verify=False``. The default is ``None`` defaults to ``True`` for + stable conventions with versions of 1.0 or higher and to ``False`` + otherwise. verbose : bool, optional Print the names of detected custom variables and attributes. The default is ``True`` @@ -200,6 +202,10 @@ def _read_netcdf(filename, verify, verbose, mode): "----------------------------------\n" f"{', '.join(custom)}")) + # set default for verify + if verify is None: + verify = True if parse(version) >= parse('1.0') else False + # update api if verify: try: diff --git a/sofar/sofa.py b/sofar/sofa.py index 6b660e5f..6d0803db 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -5,6 +5,7 @@ import platform import numpy as np import warnings +from packaging.version import parse from copy import deepcopy import sofar as sf from .utils import (_nd_newaxis, _atleast_nd, _get_conventions, @@ -30,7 +31,9 @@ class Sofa(): Verify the SOFA object by calling :py:func:`~Sofa.verify`. This helps to find potential errors in the default values and is thus recommended If creating a file does not work, try to call `Sofa` with - ``verify=False``. The default is ``True``. + ``verify=False``. The default ``None`` defaults to ``True`` for + stable conventions with versions of 1.0 or higher and to ``False`` + otherwise. Returns ------- @@ -85,7 +88,7 @@ class Sofa(): _read_only_attr = [] def __init__(self, convention, mandatory=False, version="latest", - verify=True): + verify=None): """See class docstring""" # get convention @@ -100,11 +103,24 @@ def __init__(self, convention, mandatory=False, version="latest", # add attributes with default values self._convention_to_sofa(mandatory) + # set default for verify + version = \ + self._convention['GLOBAL_SOFAConventionsVersion']['default'] + if verify is None: + verify = True if parse(version) >= parse('1.0') else False + # add and update the API # (mandatory=False can not be verified because some conventions # have default values that have optional variables as dependencies) if verify and not mandatory: self.verify(mode="read") + # warning for preliminary conventions if verification is bypassed + elif parse(version) < parse('1.0'): + warnings.warn(UserWarning(( + f"Detected preliminary conventions version {version}. " + "Upgrade data to version >= 1.0 if possible. Preliminary " + "conventions might change in the future, which could " + "invalidate data that was written before the changes."))) self.protected = True else: diff --git a/tests/test_io.py b/tests/test_io.py index 805d5934..83afad80 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -13,6 +13,7 @@ import numpy as np import numpy.testing as npt from netCDF4 import Dataset +from packaging.version import parse def test_read_write_sofa(capfd): @@ -165,11 +166,14 @@ def test_roundtrip(mandatory): for name, version in names_versions: print(f"Testing: {name} {version}") - if name in deprecations["GLOBAL:SOFAConventions"]: - # deprecated conventions can not be written + # writing deprecated and proposed conventions is not tested + if name in deprecations["GLOBAL:SOFAConventions"] or \ + parse(version) < parse('1.0'): sofa = sf.Sofa(name, mandatory, version, verify=False) - with pytest.warns(UserWarning, match="deprecations"): - sofa.verify(mode="read") + # non stable conventions are not verified + if parse(version) >= parse('1.0'): + with pytest.warns(UserWarning, match="deprecations"): + sofa.verify(mode="read") else: # test full round-trip for other conventions file = os.path.join(temp_dir.name, name + ".sofa") diff --git a/tests/test_sofa_upgrade_conventions.py b/tests/test_sofa_upgrade_conventions.py index 2cf098bf..d61c8a68 100644 --- a/tests/test_sofa_upgrade_conventions.py +++ b/tests/test_sofa_upgrade_conventions.py @@ -85,10 +85,15 @@ def test_upgrade_conventions(path, capfd): out, _ = capfd.readouterr() # don't verify conventions that might require user action after - if os.path.basename(path) in ["FreeFieldDirectivityTF_1.0.json"]: + if os.path.basename(path) in [ + "FreeFieldDirectivityTF_1.0.json", + "SingleTrackedAudio_0.1.json", + "SingleTrackedAudio_0.2.json"]: # FreeFieldDirectivityTF_1.0 # - optional dependency GLOBAL_EmitterDescription # might need to be added + # SingleTrackedAudio_0.x + # - can be updated to multiple conventions depending on the content verify = False else: verify = True @@ -98,5 +103,9 @@ def test_upgrade_conventions(path, capfd): sofa.upgrade_convention(target, verify=verify) out, _ = capfd.readouterr() assert "Upgrading" in out + elif deprecated: + sofa.upgrade_convention() + out, _ = capfd.readouterr() + assert "is missing upgrade rules" in out else: assert not deprecated From 234a907550c667d20ee00b32482c1e6a62f71067 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Sat, 16 Sep 2023 22:15:08 +0200 Subject: [PATCH 07/61] use 'auto' as new default for the verify parameter --- sofar/io.py | 4 ++-- sofar/sofa.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sofar/io.py b/sofar/io.py index d9c2954b..2119c4c4 100644 --- a/sofar/io.py +++ b/sofar/io.py @@ -9,7 +9,7 @@ from .utils import _verify_convention_and_version, _atleast_nd -def read_sofa(filename, verify=None, verbose=True): +def read_sofa(filename, verify='auto', verbose=True): """ Read SOFA file from disk and convert it to SOFA object. @@ -24,7 +24,7 @@ def read_sofa(filename, verify=None, verbose=True): Verify and update the SOFA object by calling :py:func:`~Sofa.verify`. This helps to find potential errors in the default values and is thus recommended. If reading a file does not work, try to call `Sofa` with - ``verify=False``. The default is ``None`` defaults to ``True`` for + ``verify=False``. The default is ``'auto'`` defaults to ``True`` for stable conventions with versions of 1.0 or higher and to ``False`` otherwise. verbose : bool, optional diff --git a/sofar/sofa.py b/sofar/sofa.py index 6d0803db..ec23deb5 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -31,7 +31,7 @@ class Sofa(): Verify the SOFA object by calling :py:func:`~Sofa.verify`. This helps to find potential errors in the default values and is thus recommended If creating a file does not work, try to call `Sofa` with - ``verify=False``. The default ``None`` defaults to ``True`` for + ``verify=False``. The default ``'auto'`` defaults to ``True`` for stable conventions with versions of 1.0 or higher and to ``False`` otherwise. @@ -88,7 +88,7 @@ class Sofa(): _read_only_attr = [] def __init__(self, convention, mandatory=False, version="latest", - verify=None): + verify='auto'): """See class docstring""" # get convention @@ -106,7 +106,7 @@ def __init__(self, convention, mandatory=False, version="latest", # set default for verify version = \ self._convention['GLOBAL_SOFAConventionsVersion']['default'] - if verify is None: + if verify == 'auto': verify = True if parse(version) >= parse('1.0') else False # add and update the API @@ -408,7 +408,7 @@ def inspect(self, file=None, issue_handling="print"): console. issue_handling : str, optional Defines how issues detected during verification of the SOFA object - are handeled (see :py:func:`~sofar.sofar.Sofa.verify`) + are handled (see :py:func:`~sofar.sofar.Sofa.verify`) ``'raise'`` Warnings and errors are raised if issues are detected From 2509a0cc7fc903a02ee5eff7e59d278f8d928a39 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Tue, 26 Sep 2023 10:59:19 +0200 Subject: [PATCH 08/61] complete new handling of verify parameter --- sofar/io.py | 2 +- sofar/sofa.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sofar/io.py b/sofar/io.py index 2119c4c4..bf36f9cc 100644 --- a/sofar/io.py +++ b/sofar/io.py @@ -203,7 +203,7 @@ def _read_netcdf(filename, verify, verbose, mode): f"{', '.join(custom)}")) # set default for verify - if verify is None: + if verify == 'auto': verify = True if parse(version) >= parse('1.0') else False # update api diff --git a/sofar/sofa.py b/sofar/sofa.py index ec23deb5..157b1dd5 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -711,7 +711,7 @@ def _add_custom_api_entry(self, key, value, flags, dimensions, dtype): setattr(self, key, value) self.protected = True - def upgrade_convention(self, target=None, verify=True): + def upgrade_convention(self, target=None, verify='auto'): """ Upgrade Sofa data to newer conventions. @@ -729,7 +729,9 @@ def upgrade_convention(self, target=None, verify=True): conventions to which the data can be updated. verify : bool, optional Flag to specify if the data should be verified after the upgrade - using :py:func:`~Sofa.verify`. The default is ``True``. + using :py:func:`~Sofa.verify`. The default ``'auto'`` defaults to + ``True`` for stable conventions with versions of 1.0 or higher and + to ``False`` otherwise. Returns ------- @@ -872,6 +874,10 @@ def upgrade_convention(self, target=None, verify=True): if upgrade["message"] is not None: print(upgrade["message"]) + # set default for verify + if verify == 'auto': + version = self.GLOBAL_SOFAConventionsVersion + verify = True if parse(version) >= parse('1.0') else False if verify: self.verify() From 7823ffb99a2df056e88dfcb3a7a37daa57ad6efe Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Tue, 26 Sep 2023 11:01:58 +0200 Subject: [PATCH 09/61] fix dead if case --- sofar/sofa.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sofar/sofa.py b/sofar/sofa.py index 6b660e5f..76aae11f 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -745,7 +745,6 @@ def upgrade_convention(self, target=None, verify=True): # check for upgrades -------------------------------------------------- if is_deprecated: - version_matched = False # check if upgrade is available for this convention if convention_current not in upgrade: print((f"Convention {convention_current} v{version_current} is" @@ -755,7 +754,6 @@ def upgrade_convention(self, target=None, verify=True): # check if upgrade is available for this version for from_to in upgrade[convention_current]["from_to"]: if version_current in from_to[0]: - version_matched = True targets = from_to[1] if target in targets: @@ -773,9 +771,6 @@ def upgrade_convention(self, target=None, verify=True): print(upgrades) return targets break - if not version_matched: - print((f"Convention {convention_current} v{version_current} is" - " outdated but is missing upgrade rules")) else: print((f"Convention {convention_current} v{version_current} " "is up to date")) From d3b37e6d594d139468992f99377c839bbe43efca Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Tue, 26 Sep 2023 14:53:08 +0200 Subject: [PATCH 10/61] Update sofa_conventions submodule --- sofar/sofa_conventions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sofar/sofa_conventions b/sofar/sofa_conventions index 6e26140f..7af10142 160000 --- a/sofar/sofa_conventions +++ b/sofar/sofa_conventions @@ -1 +1 @@ -Subproject commit 6e26140f36360e12fe0c384f60d22bac4778883f +Subproject commit 7af1014284e7c02bf8e2e995d728fe250f69b730 From 8a41b9195b438bd5a9edcc895448207e101da9cd Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Tue, 26 Sep 2023 15:14:07 +0200 Subject: [PATCH 11/61] Update description of conventions in docs --- docs/resources/conventions.py | 28 +- docs/resources/conventions.rst | 2666 +++++++++++++++++++++++++------- 2 files changed, 2104 insertions(+), 590 deletions(-) diff --git a/docs/resources/conventions.py b/docs/resources/conventions.py index 3cbe4252..c7aae37f 100644 --- a/docs/resources/conventions.py +++ b/docs/resources/conventions.py @@ -17,6 +17,11 @@ with open(upgrade_rules) as file: upgrade_rules = json.load(file) +deprecation_rules = os.path.join( + os.path.dirname(paths[0]), '..', 'rules', 'deprecations.json') +with open(deprecation_rules) as file: + deprecation_rules = json.load(file) + # write general information --------------------------------------------------- docs = ( '.. _conventions_introduction:\n\n' @@ -86,15 +91,20 @@ # name new convention if current convention is deprecated if deprecated: - if name not in upgrade_rules: - upgrade_to = None - for upgrade in upgrade_rules[name]['from_to']: - if version in upgrade[0]: - upgrade_to = upgrade[1] - references = [f':ref:`{u} <{u}>`' for u in upgrade_to] - ':ref:`{label} <{reference}>`' - docs += ('This convention is deprecated. ' - f'Use {", ".join(references)} instead.\n\n') + # upgrade rules give best feedback + if name in upgrade_rules: + for upgrade in upgrade_rules[name]['from_to']: + if version in upgrade[0]: + upgrade_to = upgrade[1] + references = [f':ref:`{u} <{u}>`' for u in upgrade_to] + ':ref:`{label} <{reference}>`' + docs += ('This convention is deprecated. ' + f'Use {", ".join(references)} instead.\n\n') + # deprecations are used if no upgrade rules are available + elif name in deprecation_rules['GLOBAL:SOFAConventions']: + docs += ("This convention is deprecated. Use " + f"{deprecation_rules['GLOBAL:SOFAConventions'][name]} " + "instead.\n\n") # name purpose of the convention docs += f'{convention["GLOBAL:SOFAConventions"]["comment"]}\n\n' diff --git a/docs/resources/conventions.rst b/docs/resources/conventions.rst index 75592287..72e04a12 100644 --- a/docs/resources/conventions.rst +++ b/docs/resources/conventions.rst @@ -35,7 +35,8 @@ In the following, SOFA conventions are described in tables with the information Conventions =========== -* :ref:`FreeFieldDirectivityTF v1.0 ` +* :ref:`AnnotatedEmitterAudio v0.2 ` +* :ref:`AnnotatedReceiverAudio v0.2 ` * :ref:`FreeFieldDirectivityTF v1.1 ` * :ref:`FreeFieldHRIR v1.0 ` * :ref:`FreeFieldHRTF v1.0 ` @@ -52,6 +53,9 @@ Conventions * :ref:`SimpleHeadphoneIR v1.0 ` * :ref:`SingleRoomMIMOSRIR v1.0 ` * :ref:`SingleRoomSRIR v1.0 ` +* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` +* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` +* :ref:`FreeFieldDirectivityTF v1.0 (deprecated) ` * :ref:`GeneralFIRE v1.0 (deprecated) ` * :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` * :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` @@ -61,15 +65,17 @@ Conventions * :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` * :ref:`SingleRoomDRIR v0.2 (deprecated) ` * :ref:`SingleRoomDRIR v0.3 (deprecated) ` +* :ref:`SingleTrackedAudio v0.1 (deprecated) ` +* :ref:`SingleTrackedAudio v0.2 (deprecated) ` Current ======= -.. _FreeFieldDirectivityTF_1.0: +.. _AnnotatedEmitterAudio_0.2: + +**AnnotatedEmitterAudio v0.2** -**FreeFieldDirectivityTF v1.0** -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. .. list-table:: :widths: 20 50 25 30 100 @@ -91,125 +97,100 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF + - AnnotatedEmitterAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF + - 0.2 - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - + * - GLOBAL_APIName (*attribute*) - - - m - - * - GLOBAL_DateCreated (*attribute*) + - r, m - + * - GLOBAL_APIVersion (*attribute*) - - - m - - * - GLOBAL_DateModified (*attribute*) + - r, m - + * - GLOBAL_ApplicationName (*attribute*) - - - m - - * - GLOBAL_APIName (*attribute*) - - - - r, m + * - GLOBAL_ApplicationVersion (*attribute*) - - * - GLOBAL_APIVersion (*attribute*) - - - - r, m - * - GLOBAL_AuthorContact (*attribute*) - - - m - - * - GLOBAL_Organization (*attribute*) - - + * - GLOBAL_Comment (*attribute*) - - - m - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - m - - * - GLOBAL_ApplicationName (*attribute*) + * - GLOBAL_DataType (*attribute*) + - Audio - + - r, m - + * - GLOBAL_History (*attribute*) - - - * - GLOBAL_ApplicationVersion (*attribute*) - - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission - + - m - - * - GLOBAL_Comment (*attribute*) + * - GLOBAL_Organization (*attribute*) - - - m - - * - GLOBAL_History (*attribute*) - - - - + * - GLOBAL_References (*attribute*) - - - * - GLOBAL_References (*attribute*) - - + * - GLOBAL_RoomType (*attribute*) + - free field - + - m - * - GLOBAL_Origin (*attribute*) - - - - - * - GLOBAL_DatabaseName (*attribute*) + * - GLOBAL_DateCreated (*attribute*) - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) + * - GLOBAL_DateModified (*attribute*) - - + - m - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) + * - GLOBAL_Title (*attribute*) - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the microphone array during the measurements. + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - @@ -220,159 +201,124 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) - cartesian - - m - - * - ListenerView_Units (*attribute*) + * - ReceiverPosition_Units (*attribute*) - metre - - m - - * - ListenerUp (*double*) - - [0, 0, 1] + * - SourcePosition (*double*) + - [0, 0, 0] - IC, MC - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 1] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian - - m - - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre + * - SourcePosition_Units (*attribute*) + - metre - - m - - * - SourcePosition (*double*) + * - EmitterPosition (*double*) - [0, 0, 0] - - IC, MC + - eC, eCM - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) - cartesian - - m - - * - SourcePosition_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) - metre - - m - - * - SourcePosition_Reference (*attribute*) - - - - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC - m - - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments - * - SourceView (*double*) + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - Orientation of the acoustic source (instrument) - * - SourceView_Type (*attribute*) + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) - cartesian - - m - - * - SourceView_Units (*attribute*) + * - ListenerView_Units (*attribute*) - metre - - m - - * - SourceView_Reference (*attribute*) - - - - + * - M (*double*) + - 0 - m - - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time - - m - - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian + - Narrative name for M + * - M_Units (*attribute*) + - second - - m + - Units used for M + * - Response (*string*) + - [''] + - I, C, S - - * - EmitterPosition_Units (*attribute*) - - metre + - the subject’s response + * - Response_Type (*attribute*) - - - m - - * - EmitterDescription (*string*) - - [''] - - IS, MS - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M + - type depends on the dimension + * - Response_LongName (*attribute*) - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N + - narrative description of the response type + * - Data_Emitter (*double*) + - [0, 0] + - In, En - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - + - audio data at the emitter(s); n=number of audio samples + * - Data_SamplingRate (*double*) + - 44100 + - I - m - - * - N_Units (*attribute*) + * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum + - :ref:`back to top ` -.. _FreeFieldDirectivityTF_1.1: +.. _AnnotatedReceiverAudio_0.2: + +**AnnotatedReceiverAudio v0.2** -**FreeFieldDirectivityTF v1.1** -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. .. list-table:: :widths: 20 50 25 30 100 @@ -394,91 +340,334 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF + - AnnotatedReceiverAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.1 + - 0.2 - - r, m - - * - GLOBAL_DataType (*attribute*) - - TF + * - GLOBAL_APIName (*attribute*) + - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) + * - GLOBAL_APIVersion (*attribute*) - - - - m + - r, m - - * - GLOBAL_DateCreated (*attribute*) + * - GLOBAL_ApplicationName (*attribute*) - - - - m - - * - GLOBAL_DateModified (*attribute*) - + * - GLOBAL_ApplicationVersion (*attribute*) - - - m - - * - GLOBAL_APIName (*attribute*) - - - - r, m + * - GLOBAL_AuthorContact (*attribute*) - - * - GLOBAL_APIVersion (*attribute*) - + - m - - - r, m + * - GLOBAL_Comment (*attribute*) - - * - GLOBAL_AuthorContact (*attribute*) - - - - m - - * - GLOBAL_Organization (*attribute*) + * - GLOBAL_DataType (*attribute*) + - Audio + - + - r, m + - + * - GLOBAL_History (*attribute*) + - - - - - m - * - GLOBAL_License (*attribute*) - No license provided, ask the author for permission - - m - - * - GLOBAL_ApplicationName (*attribute*) - - - - + * - GLOBAL_Organization (*attribute*) - - - * - GLOBAL_ApplicationVersion (*attribute*) + - m - + * - GLOBAL_References (*attribute*) - - - - * - GLOBAL_Comment (*attribute*) - + * - GLOBAL_RoomType (*attribute*) + - free field - + - m - + * - GLOBAL_Origin (*attribute*) - - * - GLOBAL_History (*attribute*) - - - + * - GLOBAL_DateCreated (*attribute*) - - * - GLOBAL_References (*attribute*) - + - m - + * - GLOBAL_DateModified (*attribute*) - - - * - GLOBAL_Origin (*attribute*) + - m + - + * - GLOBAL_Title (*attribute*) + - + - + - m + - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the head. IC if not tracked, MC if tracked. + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - metre + - + - m + - + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM + - m + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ReceiverPosition_Units (*attribute*) + - metre + - + - m + - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - metre + - + - m + - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eC, eCM + - m + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) + - cartesian + - + - m + - + * - EmitterPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - M (*double*) + - 0 + - m + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time + - + - m + - Narrative name for M + * - M_Units (*attribute*) + - second + - + - m + - Units used for M + * - Response (*string*) + - [''] + - I, C, S + - + - the subject’s response + * - Response_Type (*attribute*) + - + - + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - + - + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - In, Rn + - m + - (binaural) audio data at the receivers; n=number of audio samples + * - Data_SamplingRate (*double*) + - 44100 + - I + - m + - + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - + +:ref:`back to top ` + +.. _FreeFieldDirectivityTF_1.1: + +**FreeFieldDirectivityTF v1.1** + +This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 2.1 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - FreeFieldDirectivityTF + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 1.1 + - + - r, m + - + * - GLOBAL_DataType (*attribute*) + - TF + - + - r, m + - We store frequency-dependent data here + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - The room information can be arbitrary, but the spatial setup assumes free field. + * - GLOBAL_Title (*attribute*) + - + - + - m + - + * - GLOBAL_DateCreated (*attribute*) + - + - + - m + - + * - GLOBAL_DateModified (*attribute*) + - + - + - m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_AuthorContact (*attribute*) + - + - + - m + - + * - GLOBAL_Organization (*attribute*) + - + - + - m + - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m + - + * - GLOBAL_ApplicationName (*attribute*) + - + - + - + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_Comment (*attribute*) + - + - + - + - + * - GLOBAL_History (*attribute*) + - + - + - + - + * - GLOBAL_References (*attribute*) + - + - + - + - + * - GLOBAL_Origin (*attribute*) - - - @@ -4192,180 +4381,1178 @@ For measuring SRIRs in a single room with a single excitation source (e.g., a lo - 0 - II - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian + - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units + * - RoomCorners_Type (*attribute*) + - cartesian + - + - + - + * - RoomCorners_Units (*attribute*) + - metre + - + - + - + * - ListenerPosition (*double*) + - [0, 0, 0] + - MC + - m + - + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - ReceiverDescriptions (*string*) + - [''] + - RS, RSM + - + - R-dependent version of the attribute ReceiverDescription + * - ReceiverPosition (*double*) + - [0, 0, 0] + - IC, RCI, RCM + - m + - + * - ReceiverPosition_Type (*attribute*) + - spherical + - + - m + - Can be of any type enabling both spatially discrete and spatially continuous representations. + * - ReceiverPosition_Units (*attribute*) + - degree, degree, metre + - + - m + - + * - ReceiverView (*double*) + - [1, 0, 0] + - RCI, RCM + - + - + * - ReceiverUp (*double*) + - [0, 0, 1] + - RCI, RCM + - + - + * - ReceiverView_Type (*attribute*) + - cartesian + - + - + - + * - ReceiverView_Units (*attribute*) + - metre + - + - + - + * - SourcePosition (*double*) + - [0, 0, 1] + - MC + - m + - + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - metre + - + - m + - + * - SourceView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - SourceView_Type (*attribute*) + - cartesian + - + - m + - + * - SourceView_Units (*attribute*) + - metre + - + - m + - + * - EmitterDescriptions (*string*) + - [''] + - ES, ESM + - + - E-dependent version of the attribute EmitterDescription + * - EmitterPosition (*double*) + - [0, 0, 0] + - eCI, eCM + - m + - + * - EmitterPosition_Type (*attribute*) + - spherical + - + - m + - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. + * - EmitterPosition_Units (*attribute*) + - degree, degree, metre + - + - m + - + * - EmitterView (*double*) + - [1, 0, 0] + - ECI, ECM + - + - + * - EmitterUp (*double*) + - [0, 0, 1] + - ECI, ECM + - + - + * - EmitterView_Type (*attribute*) + - cartesian + - + - + - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. + * - EmitterView_Units (*attribute*) + - metre + - + - + - + * - MeasurementDate (*double*) + - 0 + - M + - + - Optional M-dependent date and time of the measurement + * - Data_IR (*double*) + - 0 + - mrn + - m + - Impulse responses + * - Data_SamplingRate (*double*) + - 48000 + - I, M + - m + - Sampling rate of the samples in Data.IR and Data.Delay + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - Unit of the sampling rate + * - Data_Delay (*double*) + - 0 + - IR, MR + - m + - Additional delay of each IR (in samples) + +:ref:`back to top ` + +Deprecated +========== + +.. _AnnotatedEmitterAudio_0.1: + +**AnnotatedEmitterAudio v0.1** + +This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. + + + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 2.1 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - AnnotatedEmitterAudio + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 0.1 + - + - r, m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_ApplicationName (*attribute*) + - + - + - + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_AuthorContact (*attribute*) + - + - + - m + - + * - GLOBAL_Comment (*attribute*) + - + - + - + - + * - GLOBAL_DataType (*attribute*) + - Audio + - + - r, m + - + * - GLOBAL_History (*attribute*) + - + - + - + - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m + - + * - GLOBAL_Organization (*attribute*) + - + - + - m + - + * - GLOBAL_References (*attribute*) + - + - + - + - + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - + * - GLOBAL_Origin (*attribute*) + - + - + - + - + * - GLOBAL_DateCreated (*attribute*) + - + - + - m + - + * - GLOBAL_DateModified (*attribute*) + - + - + - m + - + * - GLOBAL_Title (*attribute*) + - + - + - m + - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the head. IC if not tracked, MC if tracked. + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - metre + - + - m + - + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM + - m + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ReceiverPosition_Units (*attribute*) + - metre + - + - m + - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - metre + - + - m + - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eC, eCM + - m + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) + - cartesian + - + - m + - + * - EmitterPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - M (*double*) + - 0 + - m + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time + - + - m + - Narrative name for M + * - M_Units (*attribute*) + - second + - + - m + - Units used for M + * - Response (*attribute*) + - + - I, C, S + - + - the subject’s response + * - Response_Type (*attribute*) + - + - I, C, S + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - S + - + - narrative description of the response type + * - Data_Emitter (*double*) + - [0, 0] + - In, En + - m + - audio data at the emitter(s); n=number of audio samples + * - Data_SamplingRate (*double*) + - 44100 + - I + - m + - + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - + +:ref:`back to top ` + +.. _AnnotatedReceiverAudio_0.1: + +**AnnotatedReceiverAudio v0.1** + +This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. + + + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 2.1 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - AnnotatedReceiverAudio + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 0.1 + - + - r, m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_ApplicationName (*attribute*) + - + - + - + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_AuthorContact (*attribute*) + - + - + - m + - + * - GLOBAL_Comment (*attribute*) + - + - + - + - + * - GLOBAL_DataType (*attribute*) + - Audio + - + - r, m + - + * - GLOBAL_History (*attribute*) + - + - + - + - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m + - + * - GLOBAL_Organization (*attribute*) + - + - + - m + - + * - GLOBAL_References (*attribute*) + - + - + - + - + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - + * - GLOBAL_Origin (*attribute*) + - + - + - + - + * - GLOBAL_DateCreated (*attribute*) + - + - + - m + - + * - GLOBAL_DateModified (*attribute*) + - + - + - m + - + * - GLOBAL_Title (*attribute*) + - + - + - m + - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the head. IC if not tracked, MC if tracked. + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - metre + - + - m + - + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM + - m + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ReceiverPosition_Units (*attribute*) + - metre + - + - m + - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - metre + - + - m + - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eC, eCM + - m + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) + - cartesian + - + - m + - + * - EmitterPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - M (*double*) + - 0 + - m + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time + - + - m + - Narrative name for M + * - M_Units (*attribute*) + - second + - + - m + - Units used for M + * - Response (*attribute*) + - + - I, C, S + - + - the subject’s response + * - Response_Type (*attribute*) + - + - I, C, S + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - S + - + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - In, Rn + - m + - (binaural) audio data at the receivers; n=number of audio samples + * - Data_SamplingRate (*double*) + - 44100 + - I + - m + - + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - + +:ref:`back to top ` + +.. _FreeFieldDirectivityTF_1.0: + +**FreeFieldDirectivityTF v1.0** + +This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. + +This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 2.1 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - FreeFieldDirectivityTF + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 1.0 + - + - r, m + - + * - GLOBAL_DataType (*attribute*) + - TF + - + - r, m + - We store frequency-dependent data here + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - The room information can be arbitrary, but the spatial setup assumes free field. + * - GLOBAL_Title (*attribute*) + - + - + - m + - + * - GLOBAL_DateCreated (*attribute*) + - + - + - m + - + * - GLOBAL_DateModified (*attribute*) + - + - + - m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_AuthorContact (*attribute*) + - + - + - m + - + * - GLOBAL_Organization (*attribute*) + - + - + - m + - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m + - + * - GLOBAL_ApplicationName (*attribute*) + - + - + - + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_Comment (*attribute*) + - + - + - m + - + * - GLOBAL_History (*attribute*) + - + - + - + - + * - GLOBAL_References (*attribute*) + - + - + - + - + * - GLOBAL_Origin (*attribute*) + - + - + - + - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - Name of the database. Used for classification of the data + * - GLOBAL_Musician (*attribute*) + - + - + - + - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. + * - GLOBAL_Description (*attribute*) + - + - + - + - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. + * - GLOBAL_SourceType (*attribute*) + - + - + - m + - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' + * - GLOBAL_SourceManufacturer (*attribute*) + - + - + - m + - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the microphone array during the measurements. + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the microphone array + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Up vector of the microphone array + * - ReceiverPosition (*double*) + - [0, 0, 1] + - IC, RC, RCM + - m + - Positions of the microphones during the measurements (relative to the Listener) + * - ReceiverPosition_Type (*attribute*) + - spherical + - + - m + - + * - ReceiverPosition_Units (*attribute*) + - degree, degree, metre + - + - m + - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the acoustic source (instrument) + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - metre + - + - m + - + * - SourcePosition_Reference (*attribute*) + - + - + - m + - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments + * - SourceView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the acoustic source (instrument) + * - SourceView_Type (*attribute*) + - cartesian + - + - m + - + * - SourceView_Units (*attribute*) + - metre + - + - m + - + * - SourceView_Reference (*attribute*) + - + - + - m + - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Up vector of the acoustic source (instrument) + * - SourceUp_Reference (*attribute*) + - + - + - m + - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments + * - EmitterPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. + * - EmitterPosition_Type (*attribute*) + - cartesian + - + - m + - + * - EmitterPosition_Units (*attribute*) + - metre + - + - m + - + * - EmitterDescription (*string*) + - [''] + - IS, MS + - + - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. + * - MIDINote (*double*) + - 0 + - I, M + - + - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. + * - Description (*string*) + - [''] + - MS + - + - This variable is used when the description varies with M. + * - SourceTuningFrequency (*double*) + - 440 + - I, M + - + - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. + * - N (*double*) + - 0 + - N + - m + - Frequency values + * - N_LongName (*attribute*) + - frequency + - + - m + - + * - N_Units (*attribute*) + - hertz + - + - m + - Units used for N + * - Data_Real (*double*) + - 0 + - mrn + - m + - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. + * - Data_Imag (*double*) + - 0 + - MRN + - m + - Imaginary part of the complex spectrum + +:ref:`back to top ` + +.. _GeneralFIRE_1.0: + +**GeneralFIRE v1.0** + +This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. + +This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 1.0 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - GeneralFIRE + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 1.0 + - + - r, m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_ApplicationName (*attribute*) + - - - - - * - RoomCorners_Units (*attribute*) - - metre + * - GLOBAL_ApplicationVersion (*attribute*) - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - * - ListenerPosition_Type (*attribute*) - - cartesian + * - GLOBAL_AuthorContact (*attribute*) + - - - m - - * - ListenerPosition_Units (*attribute*) - - metre + * - GLOBAL_Comment (*attribute*) - - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - m - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m + * - GLOBAL_DataType (*attribute*) + - FIRE - - * - ListenerView_Type (*attribute*) - - cartesian + - r, m + - We use FIR datatype which in addition depends on Emitters (E) + * - GLOBAL_History (*attribute*) - - - m - - * - ListenerView_Units (*attribute*) - - metre - - - m - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - m - - * - ReceiverPosition_Type (*attribute*) - - spherical + * - GLOBAL_Organization (*attribute*) - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - m - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM + * - GLOBAL_References (*attribute*) - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - * - ReceiverView_Type (*attribute*) - - cartesian + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - The room information can be arbitrary + * - GLOBAL_Origin (*attribute*) - - - - * - ReceiverView_Units (*attribute*) - - metre - + * - GLOBAL_DateCreated (*attribute*) - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - m - - * - SourcePosition_Type (*attribute*) - - cartesian + * - GLOBAL_DateModified (*attribute*) + - - - m - - * - SourcePosition_Units (*attribute*) - - metre + * - GLOBAL_Title (*attribute*) - - - m - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - m - - * - SourceUp (*double*) - - [0, 0, 1] + * - ListenerPosition (*double*) + - [0, 0, 0] - IC, MC - m - - * - SourceView_Type (*attribute*) + * - ListenerPosition_Type (*attribute*) - cartesian - - m - - * - SourceView_Units (*attribute*) + * - ListenerPosition_Units (*attribute*) - metre - - m - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) + * - ReceiverPosition (*double*) - [0, 0, 0] - - eCI, eCM + - rCI, rCM - m - - * - EmitterPosition_Type (*attribute*) - - spherical + * - ReceiverPosition_Type (*attribute*) + - cartesian - - m - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre + - + * - ReceiverPosition_Units (*attribute*) + - metre - - m - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM + * - SourcePosition (*double*) + - [0, 0, 1] + - IC, MC + - m - + * - SourcePosition_Type (*attribute*) + - spherical - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM + - m - + * - SourcePosition_Units (*attribute*) + - degree, degree, metre - - * - EmitterView_Type (*attribute*) + - m + - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eCI, eCM + - m + - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E + * - EmitterPosition_Type (*attribute*) - cartesian - + - m - - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterView_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) - metre - + - m - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement * - Data_IR (*double*) - 0 - - mrn + - mREn - m - Impulse responses * - Data_SamplingRate (*double*) - 48000 - - I, M + - I - m - Sampling rate of the samples in Data.IR and Data.Delay * - Data_SamplingRate_Units (*attribute*) @@ -4375,22 +5562,19 @@ For measuring SRIRs in a single room with a single excitation source (e.g., a lo - Unit of the sampling rate * - Data_Delay (*double*) - 0 - - IR, MR + - IRE, MRE - m - Additional delay of each IR (in samples) :ref:`back to top ` -Deprecated -========== - -.. _GeneralFIRE_1.0: +.. _MultiSpeakerBRIR_0.3: -**GeneralFIRE v1.0** +**MultiSpeakerBRIR v0.3** -This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. +This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined +This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. .. list-table:: :widths: 20 50 25 30 100 @@ -4412,12 +5596,12 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIRE + - MultiSpeakerBRIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 0.3 - - r, m - @@ -4477,10 +5661,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - * - GLOBAL_RoomType (*attribute*) - - free field + - reverberant - - m - - The room information can be arbitrary + - * - GLOBAL_Origin (*attribute*) - - @@ -4501,6 +5685,21 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - name of the database to which these data belong + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database + * - GLOBAL_RoomDescription (*attribute*) + - + - + - + - narrative description of the room * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -4517,7 +5716,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - ReceiverPosition (*double*) - - [0, 0, 0] + - [[0, 0.09, 0], [0, -0.09, 0]] - rCI, rCM - m - @@ -4561,36 +5760,76 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - m - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - EmitterUp (*double*) + - [0, 0, 1] + - ECI, ECM + - + - When EmitterUp provided, EmitterView must be provided as well + * - EmitterView (*double*) + - [1, 0, 0] + - ECI, ECM + - + - When EmitterView provided, EmitterUp must be provided as well + * - EmitterView_Type (*attribute*) + - cartesian + - + - + - + * - EmitterView_Units (*attribute*) + - metre + - + - + - * - Data_IR (*double*) - - 0 + - [1, 1] - mREn - m - - Impulse responses + - * - Data_SamplingRate (*double*) - 48000 - I - m - - Sampling rate of the samples in Data.IR and Data.Delay + - * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the sampling rate + - * - Data_Delay (*double*) - - 0 + - [0, 0] - IRE, MRE - m - - Additional delay of each IR (in samples) + - :ref:`back to top ` -.. _MultiSpeakerBRIR_0.3: +.. _SimpleFreeFieldHRIR_0.4: -**MultiSpeakerBRIR v0.3** +**SimpleFreeFieldHRIR v0.4** -This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. +This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. -This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. +This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant .. list-table:: :widths: 20 50 25 30 100 @@ -4612,12 +5851,12 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - MultiSpeakerBRIR + - SimpleFreeFieldHRIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 + - 0.4 - - r, m - @@ -4649,13 +5888,13 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - - FIRE + - FIR - - r, m - - We use FIR datatype which in addition depends on Emitters (E) + - * - GLOBAL_History (*attribute*) - - @@ -4677,7 +5916,7 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - - * - GLOBAL_RoomType (*attribute*) - - reverberant + - free field - - m - @@ -4711,11 +5950,6 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - - m - ID of the subject from the database - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - narrative description of the room * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -4727,7 +5961,7 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - m - * - ListenerPosition_Units (*attribute*) - - metre + - meter - - m - @@ -4742,7 +5976,7 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - m - * - ReceiverPosition_Units (*attribute*) - - metre + - meter - - m - @@ -4750,14 +5984,14 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - [0, 0, 1] - IC, MC - m - - + - Source position is assumed to vary for different directions/positions around the listener * - SourcePosition_Type (*attribute*) - spherical - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - degree, degree, meter - - m - @@ -4765,14 +5999,14 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - [0, 0, 0] - eCI, eCM - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E + - * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - metre + - meter - - m - @@ -4792,33 +6026,13 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - m - * - ListenerView_Units (*attribute*) - - metre + - meter - - m - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - When EmitterUp provided, EmitterView must be provided as well - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - When EmitterView provided, EmitterUp must be provided as well - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - * - Data_IR (*double*) - [1, 1] - - mREn + - mRn - m - * - Data_SamplingRate (*double*) @@ -4833,19 +6047,19 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - * - Data_Delay (*double*) - [0, 0] - - IRE, MRE + - IR, MR - m - :ref:`back to top ` -.. _SimpleFreeFieldHRIR_0.4: +.. _SimpleFreeFieldTF_0.4: -**SimpleFreeFieldHRIR v0.4** +**SimpleFreeFieldTF v0.4** -This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. +This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant +This conventions is for TFs created under conditions where room information is irrelevant .. list-table:: :widths: 20 50 25 30 100 @@ -4867,7 +6081,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR + - SimpleFreeFieldTF - - r, m - @@ -4907,7 +6121,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - * - GLOBAL_DataType (*attribute*) - - FIR + - TF - - r, m - @@ -4921,6 +6135,11 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - m - + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - GLOBAL_Organization (*attribute*) - - @@ -4961,11 +6180,6 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - m - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -5046,32 +6260,37 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - m - - * - Data_IR (*double*) - - [1, 1] - - mRn + * - N (*double*) + - 0 + - N - m - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m + * - N_LongName (*attribute*) + - frequency - - * - Data_SamplingRate_Units (*attribute*) + - + - + * - N_Units (*attribute*) - hertz - + - + - + * - Data_Real (*double*) + - [1, 1] + - mRn - m - - * - Data_Delay (*double*) + * - Data_Imag (*double*) - [0, 0] - - IR, MR + - MRN - m - :ref:`back to top ` -.. _SimpleFreeFieldTF_0.4: +.. _SimpleFreeFieldTF_1.0: -**SimpleFreeFieldTF v0.4** +**SimpleFreeFieldTF v1.0** This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. @@ -5102,7 +6321,7 @@ This conventions is for TFs created under conditions where room information is i - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 + - 1.0 - - r, m - @@ -5207,7 +6426,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5222,7 +6441,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5237,7 +6456,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - SourcePosition_Units (*attribute*) - - degree, degree, meter + - degree, degree, metre - - m - @@ -5252,7 +6471,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5272,7 +6491,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - ListenerView_Units (*attribute*) - - meter + - metre - - m - @@ -5292,7 +6511,7 @@ This conventions is for TFs created under conditions where room information is i - - * - Data_Real (*double*) - - [1, 1] + - [0, 0] - mRn - m - @@ -5304,13 +6523,13 @@ This conventions is for TFs created under conditions where room information is i :ref:`back to top ` -.. _SimpleFreeFieldTF_1.0: +.. _SimpleHeadphoneIR_0.1: -**SimpleFreeFieldTF v1.0** +**SimpleHeadphoneIR v0.1** -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. +This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. -This conventions is for TFs created under conditions where room information is irrelevant +Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -5332,12 +6551,12 @@ This conventions is for TFs created under conditions where room information is i - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF + - SimpleHeadphoneIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 0.1 - - r, m - @@ -5369,13 +6588,13 @@ This conventions is for TFs created under conditions where room information is i * - GLOBAL_Comment (*attribute*) - - - - + - m - * - GLOBAL_DataType (*attribute*) - - TF + - FIR - - r, m - - + - We will store IRs here * - GLOBAL_History (*attribute*) - - @@ -5386,11 +6605,6 @@ This conventions is for TFs created under conditions where room information is i - - m - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database * - GLOBAL_Organization (*attribute*) - - @@ -5405,7 +6619,7 @@ This conventions is for TFs created under conditions where room information is i - free field - - m - - + - Room type is not relevant here * - GLOBAL_Origin (*attribute*) - - @@ -5430,7 +6644,47 @@ This conventions is for TFs created under conditions where room information is i - - - m - - name of the database to which these data belong + - Correspondence to a database + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - Correspondence to a subject from the database + * - GLOBAL_ListenerDescription (*attribute*) + - + - + - m + - Narrative description of the listener (or mannequin) + * - GLOBAL_SourceDescription (*attribute*) + - + - + - m + - Narrative description of the headphones + * - GLOBAL_SourceManufacturer (*attribute*) + - + - + - m + - Name of the headphones manufacturer + * - GLOBAL_SourceModel (*attribute*) + - + - + - m + - Name of the headphone model. Must uniquely describe the headphones of the manufacturer + * - GLOBAL_SourceURI (*attribute*) + - + - + - m + - URI of the headphone specifications + * - GLOBAL_ReceiverDescription (*attribute*) + - + - + - m + - Narrative description of the microphones + * - GLOBAL_EmitterDescription (*attribute*) + - + - + - m + - Narrative description of the headphone drivers * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -5442,7 +6696,7 @@ This conventions is for TFs created under conditions where room information is i - m - * - ListenerPosition_Units (*attribute*) - - metre + - meter - - m - @@ -5457,91 +6711,91 @@ This conventions is for TFs created under conditions where room information is i - m - * - ReceiverPosition_Units (*attribute*) - - metre + - meter - - m - * - SourcePosition (*double*) - - [0, 0, 1] + - [0, 0, 0] - IC, MC - m - - Source position is assumed to vary for different directions/positions around the listener + - Default: Headphones are located at the position of the listener * - SourcePosition_Type (*attribute*) - spherical - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - degree, degree, meter - - m - * - EmitterPosition (*double*) - - [0, 0, 0] + - [[0, 0.09, 0], [0, -0.09, 0]] - eCI, eCM - m - - + - Default: Reflects the correspondence of each emitter to each receiver * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - metre + - meter - - m - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m + * - SourceManufacturer (*string*) + - [''] + - MS - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m + - Optional M-dependent version of the attribute SourceManufucturer + * - SourceModel (*string*) + - [''] + - MS - - * - ListenerView_Type (*attribute*) - - cartesian + - Optional M-dependent version of the attribute SourceModel + * - ReceiverDescription (*string*) + - [''] + - MS - - - m + - Optional M-dependent version of the attribute ReceiverDescription + * - EmitterDescription (*string*) + - [''] + - MS - - * - ListenerView_Units (*attribute*) - - metre + - Optional M-dependent version of the attribute EmitterDescription + * - MeasurementDate (*double*) + - 0 + - M - + - Optional M-dependent date and time of the measurement + * - Data_IR (*double*) + - [1, 1] + - mRn - m - - * - N (*double*) - - 0 - - N + * - Data_SamplingRate (*double*) + - 48000 + - I - m - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) + * - Data_SamplingRate_Units (*attribute*) - hertz - - - - - - * - Data_Real (*double*) - - [0, 0] - - mRn - m - - * - Data_Imag (*double*) + * - Data_Delay (*double*) - [0, 0] - - MRN + - IR, MR - m - :ref:`back to top ` -.. _SimpleHeadphoneIR_0.1: +.. _SimpleHeadphoneIR_0.2: -**SimpleHeadphoneIR v0.1** +**SimpleHeadphoneIR v0.2** This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. @@ -5572,7 +6826,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 + - 0.2 - - r, m - @@ -5712,7 +6966,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5727,7 +6981,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5742,7 +6996,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - SourcePosition_Units (*attribute*) - - degree, degree, meter + - degree, degree, metre - - m - @@ -5757,7 +7011,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - @@ -5787,7 +7041,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - Optional M-dependent date and time of the measurement * - Data_IR (*double*) - - [1, 1] + - [0, 0] - mRn - m - @@ -5809,13 +7063,13 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T :ref:`back to top ` -.. _SimpleHeadphoneIR_0.2: +.. _SingleRoomDRIR_0.2: -**SimpleHeadphoneIR v0.2** +**SingleRoomDRIR v0.2** -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. +This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. +This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -5837,7 +7091,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR + - SingleRoomDRIR - - r, m - @@ -5880,7 +7134,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - FIR - - r, m - - We will store IRs here + - * - GLOBAL_History (*attribute*) - - @@ -5902,10 +7156,10 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - * - GLOBAL_RoomType (*attribute*) - - free field + - reverberant - - m - - Room type is not relevant here + - * - GLOBAL_Origin (*attribute*) - - @@ -5930,47 +7184,262 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) + - + * - GLOBAL_RoomDescription (*attribute*) - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) + - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - + * - ListenerPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerPosition_Units (*attribute*) + - meter + - + - m + - + * - ReceiverPosition (*double*) + - [0, 0, 0] + - rCI, rCM + - m + - + * - ReceiverPosition_Type (*attribute*) + - cartesian + - + - m + - + * - ReceiverPosition_Units (*attribute*) + - meter + - + - m + - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - + * - SourcePosition_Type (*attribute*) + - cartesian + - + - m + - + * - SourcePosition_Units (*attribute*) + - meter + - + - m + - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eCI, eCM + - m + - + * - EmitterPosition_Type (*attribute*) + - cartesian + - + - m + - + * - EmitterPosition_Units (*attribute*) + - meter + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - SourceView (*double*) + - [-1, 0, 0] + - IC, MC + - m + - + * - SourceView_Type (*attribute*) + - cartesian + - + - m + - + * - SourceView_Units (*attribute*) + - metre + - + - m + - + * - Data_IR (*double*) + - [1] + - mRn + - m + - + * - Data_SamplingRate (*double*) + - 48000 + - I + - m + - + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - + * - Data_Delay (*double*) + - [0] + - IR, MR + - m + - + +:ref:`back to top ` + +.. _SingleRoomDRIR_0.3: + +**SingleRoomDRIR v0.3** + +This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. + +This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA + - + - r, m + - + * - GLOBAL_Version (*attribute*) + - 1.0 + - + - r, m + - + * - GLOBAL_SOFAConventions (*attribute*) + - SingleRoomDRIR + - + - r, m + - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 0.3 + - + - r, m + - + * - GLOBAL_APIName (*attribute*) + - + - + - r, m + - + * - GLOBAL_APIVersion (*attribute*) + - + - + - r, m + - + * - GLOBAL_ApplicationName (*attribute*) + - + - + - + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_AuthorContact (*attribute*) + - + - + - m + - + * - GLOBAL_Comment (*attribute*) + - + - + - m + - + * - GLOBAL_DataType (*attribute*) + - FIR + - + - r, m + - + * - GLOBAL_History (*attribute*) + - + - + - + - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m + - + * - GLOBAL_Organization (*attribute*) + - + - + - m + - + * - GLOBAL_References (*attribute*) + - + - + - + - + * - GLOBAL_RoomType (*attribute*) + - reverberant + - + - m + - + * - GLOBAL_Origin (*attribute*) - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) + * - GLOBAL_DateCreated (*attribute*) - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) + - + * - GLOBAL_DateModified (*attribute*) - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) + - + * - GLOBAL_Title (*attribute*) - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) + - + * - GLOBAL_DatabaseName (*attribute*) - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) + - + * - GLOBAL_RoomDescription (*attribute*) - - - m - - Narrative description of the headphone drivers + - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -5987,8 +7456,8 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - [0, 0, 0] + - RCI, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -6005,22 +7474,22 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - [0, 0, 0] - IC, MC - m - - Default: Headphones are located at the position of the listener + - * - SourcePosition_Type (*attribute*) - - spherical + - cartesian - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - metre - - m - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] + - [0, 0, 0] - eCI, eCM - m - - Default: Reflects the correspondence of each emitter to each receiver + - * - EmitterPosition_Type (*attribute*) - cartesian - @@ -6031,34 +7500,49 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - m - - * - SourceManufacturer (*string*) - - [''] - - MS + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS + * - ListenerView_Type (*attribute*) + - cartesian - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS + - m - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - SourceView (*double*) + - [-1, 0, 0] + - IC, MC + - m + - + * - SourceView_Type (*attribute*) + - cartesian + - + - m + - + * - SourceView_Units (*attribute*) + - metre + - + - m - - - Optional M-dependent date and time of the measurement * - Data_IR (*double*) - - [0, 0] - - mRn + - [0] + - mrn - m - * - Data_SamplingRate (*double*) @@ -6072,20 +7556,20 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - Data_Delay (*double*) - - [0, 0] + - [0] - IR, MR - m - :ref:`back to top ` -.. _SingleRoomDRIR_0.2: +.. _SingleTrackedAudio_0.1: -**SingleRoomDRIR v0.2** +**SingleTrackedAudio v0.1** + +This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -6102,17 +7586,17 @@ This convention stores arbitrary number of receivers while providing an informat - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR + - SingleTrackedAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 + - 0.1 - - r, m - @@ -6144,7 +7628,7 @@ This convention stores arbitrary number of receivers while providing an informat * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - FIR @@ -6172,7 +7656,7 @@ This convention stores arbitrary number of receivers while providing an informat - - * - GLOBAL_RoomType (*attribute*) - - reverberant + - free field - - m - @@ -6196,43 +7680,33 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - IC, RC, RCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - @@ -6240,29 +7714,29 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 0] - IC, MC - m - - + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - cartesian - - m - * - SourcePosition_Units (*attribute*) - - meter + - metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - eC, eCM - m - - + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - @@ -6270,12 +7744,12 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 1] - IC, MC - m - - + - Must be of the same dimensionality as ListenerView. * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - + - Orientation of the head. IC if not tracked, MC if tracked. * - ListenerView_Type (*attribute*) - cartesian - @@ -6286,33 +7760,48 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC + * - M (*double*) + - 0 - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - m + - Time stamp of the measurements in M,defines the size of M. + * - EmitterUp (*double*) + - [0, 0, 0] + - EC, ECM - - * - SourceView_Type (*attribute*) + - Must be of the same dimensionality as EmitterView. + * - EmitterView (*double*) + - [0, 0, 0] + - EC, ECM + - + - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. + * - EmitterView_Type (*attribute*) - cartesian - - - m - - * - SourceView_Units (*attribute*) + - + * - EmitterView_Units (*attribute*) - metre - - - m - - * - Data_IR (*double*) - - [1] - - mRn + - + * - M_LongName (*attribute*) + - time + - - m + - Narrative name for M + * - M_Units (*attribute*) + - second - + - m + - Units used for M + * - Data_Sample (*double*) + - [0, 0] + - rn + - m + - n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - @@ -6321,21 +7810,16 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - :ref:`back to top ` -.. _SingleRoomDRIR_0.3: +.. _SingleTrackedAudio_0.2: -**SingleRoomDRIR v0.3** +**SingleTrackedAudio v0.2** + +This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -6352,17 +7836,17 @@ This convention stores arbitrary number of receivers while providing an informat - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR + - SingleTrackedAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 + - 0.2 - - r, m - @@ -6394,7 +7878,7 @@ This convention stores arbitrary number of receivers while providing an informat * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - FIR @@ -6422,7 +7906,7 @@ This convention stores arbitrary number of receivers while providing an informat - - * - GLOBAL_RoomType (*attribute*) - - reverberant + - free field - - m - @@ -6446,21 +7930,11 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - @@ -6472,10 +7946,10 @@ This convention stores arbitrary number of receivers while providing an informat - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - RCI, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - IC, RC, RCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - @@ -6490,7 +7964,7 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 0] - IC, MC - m - - + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - cartesian - @@ -6503,9 +7977,9 @@ This convention stores arbitrary number of receivers while providing an informat - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - eC, eCM - m - - + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - @@ -6520,12 +7994,12 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 1] - IC, MC - m - - + - Must be of the same dimensionality as ListenerView. * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - + - Orientation of the head. IC if not tracked, MC if tracked. * - ListenerView_Type (*attribute*) - cartesian - @@ -6536,33 +8010,68 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m + * - EmitterUp (*double*) + - [0, 0, 0] + - EC, ECM - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m + - Must be of the same dimensionality as EmitterView. + * - EmitterView (*double*) + - [0, 0, 0] + - EC, ECM - - * - SourceView_Type (*attribute*) + - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. + * - EmitterView_Type (*attribute*) - cartesian - - - m - - * - SourceView_Units (*attribute*) + - + * - EmitterView_Units (*attribute*) - metre - + - + - + * - M (*double*) + - 0 - m + - m + - Time stamp of the measurements in M,defines the size of M. + * - M_LongName (*attribute*) + - time - - * - Data_IR (*double*) - - [0] - - mrn - m + - Narrative name for M + * - M_Units (*attribute*) + - second - + - m + - Units used for M + * - Response (*attribute*) + - + - S, C, I + - + - the subject’s response + * - Response_Type (*attribute*) + - + - S, C, I + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - Date + - S + - + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - nR + - + - (binaural) audio data at the receivers; n=number of audio samples + * - Data_Emitter (*double*) + - [0, 0] + - nE + - + - (source) audio data at the emitters; n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - @@ -6571,11 +8080,6 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - :ref:`back to top ` From 1a8072f0623892eff350c4776f90ffadc093bbfc Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 27 Sep 2023 11:46:36 +0200 Subject: [PATCH 12/61] remove mentions of deprecate AES69-2020 --- sofar/io.py | 12 ++++++------ sofar/sofa.py | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sofar/io.py b/sofar/io.py index 3d66921d..b274dafc 100644 --- a/sofar/io.py +++ b/sofar/io.py @@ -39,7 +39,7 @@ def read_sofa(filename, verify=True, verbose=True): 1. Missing dimensions are appended when writing the SOFA object to disk. E.g., if ``sofa.Data_IR`` is of shape (1, 2) it is written as an array - of shape (1, 2, 1) because the SOFA standard AES69-2020 defines it as a + of shape (1, 2, 1) because the SOFA standard AES69 defines it as a three dimensional array with the dimensions (`M: measurements`, `R: receivers`, `N: samples`) 2. When reading data from a SOFA file, array data is always returned as @@ -48,7 +48,7 @@ def read_sofa(filename, verify=True, verbose=True): after writing and reading to and from disk. 3. One dimensional arrays with only one element will be converted to scalar values. E.g. ``sofa.Data_SamplingRate`` is stored as an array of shape - (1, ) inside SOFA files (according to the SOFA standard AES69-2020) but + (1, ) inside SOFA files (according to the SOFA standard AES69) but will be a scalar inside SOFA objects after reading from disk. """ @@ -90,7 +90,7 @@ def read_sofa_as_netcdf(filename): 1. Missing dimensions are appended when writing the SOFA object to disk. E.g., if ``sofa.Data_IR`` is of shape (1, 2) it is written as an array - of shape (1, 2, 1) because the SOFA standard AES69-2020 defines it as a + of shape (1, 2, 1) because the SOFA standard AES69 defines it as a three dimensional array with the dimensions (`M: measurements`, `R: receivers`, `N: samples`) 2. When reading data from a SOFA file, array data is always returned as @@ -99,7 +99,7 @@ def read_sofa_as_netcdf(filename): after writing and reading to and from disk. 3. One dimensional arrays with only one element will be converted to scalar values. E.g. ``sofa.Data_SamplingRate`` is stored as an array of shape - (1, ) inside SOFA files (according to the SOFA standard AES69-2020) but + (1, ) inside SOFA files (according to the SOFA standard AES69) but will be a scalar inside SOFA objects after reading from disk. """ return _read_netcdf(filename, False, False, mode="netcdf") @@ -234,7 +234,7 @@ def write_sofa(filename: str, sofa: sf.Sofa, compression=4): 1. Missing dimensions are appended when writing the SOFA object to disk. E.g., if ``sofa.Data_IR`` is of shape (1, 2) it is written as an array - of shape (1, 2, 1) because the SOFA standard AES69-2020 defines it as a + of shape (1, 2, 1) because the SOFA standard AES69 defines it as a three dimensional array with the dimensions (`M: measurements`, `R: receivers`, `N: samples`) 2. When reading data from a SOFA file, array data is always returned as @@ -243,7 +243,7 @@ def write_sofa(filename: str, sofa: sf.Sofa, compression=4): after writing and reading to and from disk. 3. One dimensional arrays with only one element will be converted to scalar values. E.g. ``sofa.Data_SamplingRate`` is stored as an array of shape - (1, ) inside SOFA files (according to the SOFA standard AES69-2020) but + (1, ) inside SOFA files (according to the SOFA standard AES69) but will be a scalar inside SOFA objects after reading from disk. """ _write_sofa(filename, sofa, compression, verify=True) diff --git a/sofar/sofa.py b/sofar/sofa.py index 76aae11f..88c05079 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -60,7 +60,7 @@ class Sofa(): ``sofa.Data_IR`` is converted to a numpy array of shape (1, 2) 2. Missing dimensions are appended when writing the SOFA object to disk, i.e., ``sofa.Data_IR`` is written as an array of shape (1, 2, 1) because - the SOFA standard AES69-2020 defines it as a three dimensional array + the SOFA standard AES69 defines it as a three dimensional array with the dimensions (`M: measurements`, `R: receivers`, `N: samples`) 3. When reading data from a SOFA file, array data is always returned as numpy arrays and singleton trailing dimensions are discarded (numpy @@ -68,7 +68,7 @@ class Sofa(): after writing and reading to and from disk. 4. One dimensional arrays with only one element will be converted to scalar values. E.g. ``sofa.Data_SamplingRate`` is stored as an array of shape - (1, ) inside SOFA files (according to the SOFA standard AES69-2020) but + (1, ) inside SOFA files (according to the SOFA standard AES69) but will be a scalar inside SOFA objects after reading from disk. @@ -1095,7 +1095,7 @@ def verify(self, issue_handling="raise", mode="write"): current_error = "" for key in keys: - # AES69-2020 Sec. 4.7.1 + # AES69 Sec. 4.7.1 if key.startswith("PRIVATE") or key.startswith("API"): current_error += "- " + key + "\n" if (key.startswith("GLOBAL") and not key.startswith("GLOBAL_")) or\ @@ -1458,7 +1458,7 @@ def _verify_unit(test, ref, unit_aliases): or not isinstance(ref[0], str): raise TypeError("ref must be a list of length 1 containing a str") - # Following the SOFA standard AES69-2020, units may be separated by + # Following the SOFA standard AES69, units may be separated by # `, ` (comma and space), `,` (comma only), and ` ` (space only). # (regexp ', ?' matches ', ' and ',') units_ref = re.split(', ?', ref[0]) @@ -1496,7 +1496,7 @@ def _get_reference_unit(test, unit_aliases): ------- reference_units : str """ - # Following the SOFA standard AES69-2020, units may be separated by + # Following the SOFA standard AES69, units may be separated by # `, ` (comma and space), `,` (comma only), and ` ` (space only). # (regexp ', ?' matches ', ' and ',') units_test = re.split(', ?| ', test.lower()) From deb235a45bdc7774955ae8c98bf9978e463dfc90 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 27 Sep 2023 11:48:05 +0200 Subject: [PATCH 13/61] Update sofa_conventions submodule --- sofar/sofa_conventions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sofar/sofa_conventions b/sofar/sofa_conventions index 7af10142..ff4660a3 160000 --- a/sofar/sofa_conventions +++ b/sofar/sofa_conventions @@ -1 +1 @@ -Subproject commit 7af1014284e7c02bf8e2e995d728fe250f69b730 +Subproject commit ff4660a38bd075851d19116e7b5fea5d2b24f03f From 6bfa60335496c639aa73b70d35cd9930c1705586 Mon Sep 17 00:00:00 2001 From: Marco Berzborn Date: Fri, 8 Dec 2023 18:55:22 +0100 Subject: [PATCH 14/61] add badges to README.rst --- README.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.rst b/README.rst index 4aecec6f..4ad34982 100644 --- a/README.rst +++ b/README.rst @@ -2,6 +2,14 @@ Readme ====== +.. image:: https://badge.fury.io/py/sofar.svg + :target: https://badge.fury.io/py/sofar +.. image:: https://readthedocs.org/projects/sofar/badge/?version=latest + :target: https://sofar.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status +.. image:: https://circleci.com/gh/pyfar/sofar.svg?style=shield + :target: https://circleci.com/gh/pyfar/sofar + Sofar is maybe the most complete Python package for the SOFA file format so far. SOFA files store spatially distributed acoustic data such as impulse responses or transfer functions. They are defined by the AES69-2022 standard From b7cfdf849a04fe629a741a26c1d9b4c05b1471f5 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Tue, 4 Jun 2024 10:03:10 +0200 Subject: [PATCH 15/61] fix typos --- sofar/sofa.py | 24 ++++++++++++------------ sofar/update_conventions.py | 2 +- sofar/utils.py | 2 +- tests/test_io.py | 2 +- tests/test_sofa.py | 2 +- tests/test_sofa_verify.py | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/sofar/sofa.py b/sofar/sofa.py index 8485a935..03355e96 100644 --- a/sofar/sofa.py +++ b/sofar/sofa.py @@ -168,7 +168,7 @@ def list_dimensions(self): M number of measurements N - number of samles, frequencies, SOS coefficients + number of samples, frequencies, SOS coefficients (depending on self.GLOBAL_DataType) R Number of receivers or SH coefficients @@ -188,7 +188,7 @@ def list_dimensions(self): # Check if the dimensions can be updated self._update_dimensions() - # get verbose description for dimesion N + # get verbose description for dimension N if self.GLOBAL_DataType.startswith("FIR"): N_verbose = "samples" elif self.GLOBAL_DataType.startswith("TF"): @@ -392,7 +392,7 @@ def inspect(self, file=None, issue_handling="print"): console. issue_handling : str, optional Defines how issues detected during verification of the SOFA object - are handeled (see :py:func:`~sofar.sofar.Sofa.verify`) + are handled (see :py:func:`~sofar.sofar.Sofa.verify`) ``'raise'`` Warnings and errors are raised if issues are detected @@ -403,7 +403,7 @@ def inspect(self, file=None, issue_handling="print"): ``'ignore'`` Issues are ignored, i.e., not raised, printed, or returned. - The default is ``print'``. + The default is ``'print'``. """ # update the private attribute `_convention` to make sure the required @@ -538,7 +538,7 @@ def add_variable(self, name, value, dtype, dimensions): # add numeric data sofa.add_variable("Temperature", 25.1, "double", "MI") - # add GLOBAL and Variable attribtue + # add GLOBAL and Variable attribute sofa.add_entry( "GLOBAL_DateMeasured", "8.08.2021", "attribute", None) sofa.add_entry( @@ -569,7 +569,7 @@ def add_attribute(self, name, value): import sofar as sf sofa = sf.Sofa("GeneralTF") - # add GLOBAL and Variable attribtue + # add GLOBAL and Variable attribute sofa.add_attribute("GLOBAL_DateMeasured", "8.08.2021") sofa.add_attribute("Data_Real_Units", "Pascal") @@ -905,7 +905,7 @@ def verify(self, issue_handling="raise", mode="write"): Parameters ---------- issue_handling : str, optional - Defines how detected issues are handeled + Defines how detected issues are handled ``'raise'`` Warnings and errors are raised if issues are detected @@ -993,7 +993,7 @@ def verify(self, issue_handling="raise", mode="write"): elif dtype == "double": # multiple checks needed because sofar does not force the user - # to initally pass data as numpy arrays + # to initially pass data as numpy arrays if not isinstance(value, (np.int_, np.float_, np.double, np.ndarray)): current_error += (f"- {key} must be int, float or numpy " @@ -1007,7 +1007,7 @@ def verify(self, issue_handling="raise", mode="write"): elif dtype == "string": # multiple checks needed because sofar does not force the user - # to initally pass data as numpy arrays + # to initially pass data as numpy arrays if not isinstance(value, (str, np.ndarray)): current_error += (f"- {key} must be string or numpy array " f"but is {type(value)}\n") @@ -1215,7 +1215,7 @@ def verify(self, issue_handling="raise", mode="write"): [self._api[d.upper()] if d != "S" else 1 for d in dim]) # get shape for comparison to correct length by cropping and - # appending singelton dimensions if required + # appending singleton dimensions if required shape_compare = shape_act[:len(shape_ref)] for _ in range(len(shape_ref) - len(shape_compare)): shape_compare += (1, ) @@ -1294,7 +1294,7 @@ def verify(self, issue_handling="raise", mode="write"): for key_dep, ref_dep in items: if key_dep == "_dimensions": - # requires specific dimension(s) to have a vertain size + # requires specific dimension(s) to have a certain size for dim in rules[key]["specific"][test]["_dimensions"]: # possible sizes dim_ref = \ @@ -1391,7 +1391,7 @@ def verify(self, issue_handling="raise", mode="write"): @staticmethod def _verify_value(test, ref, unit_aliases, key): """ - Check a value agains the SOFA standard for Sofa.verify() + Check a value against the SOFA standard for Sofa.verify() Parameters ---------- diff --git a/sofar/update_conventions.py b/sofar/update_conventions.py index ad1c038b..db4e0625 100644 --- a/sofar/update_conventions.py +++ b/sofar/update_conventions.py @@ -56,7 +56,7 @@ def update_conventions(conventions_path=None, assume_yes=False): # coping with keyboard input print(("Are you sure that you want to update the conventions? " "Read the documentation before continuing. " - "If updateing breaks sofar it has to be re-installed" + "If updating breaks sofar it has to be re-installed" "(y/n)")) response = input() if response != "y": diff --git a/sofar/utils.py b/sofar/utils.py index 5389167f..7d45a544 100644 --- a/sofar/utils.py +++ b/sofar/utils.py @@ -143,7 +143,7 @@ def equals(sofa_a, sofa_b, verbose=True, exclude=None): ``'GLOBAL'`` Exclude all global attributes, i.e., fields starting with 'GLOBAL:' ``'DATE'`` - Exclude date attributs, i.e., fields that contain 'Date' + Exclude date attributes, i.e., fields that contain 'Date' ``'ATTR'`` Exclude all attributes, i.e., fields that contain ':' diff --git a/tests/test_io.py b/tests/test_io.py index 805d5934..258e01de 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -182,7 +182,7 @@ def test_roundtrip(mandatory): def test_roundtrip_multidimensional_string_variable(): """ - Test writing and reading multidimensional string variables (Wringting + Test writing and reading multidimensional string variables (Writing string variables with one dimension is done in the other roundtrip test). """ diff --git a/tests/test_sofa.py b/tests/test_sofa.py index 83772617..69e3af39 100644 --- a/tests/test_sofa.py +++ b/tests/test_sofa.py @@ -252,7 +252,7 @@ def test_add_entry(): # variable without dimensions with raises(ValueError, match="dimensions must be provided"): sofa.add_variable("TemperatureCelsius", 25.1, "double", None) - # invalid dimensins + # invalid dimensions with pytest.warns(UserWarning, match="Added custom dimension T"): sofa.add_variable("TemperatureCelsius", [25.1, 25.2], "double", "T") # attribute with missing variable diff --git a/tests/test_sofa_verify.py b/tests/test_sofa_verify.py index 561465f7..367eb189 100644 --- a/tests/test_sofa_verify.py +++ b/tests/test_sofa_verify.py @@ -11,7 +11,7 @@ # get verification rules _, unit_aliases, _, _ = sf.Sofa._verification_rules() -# directory containing the verificatin data +# directory containing the verification data basedir = os.path.join(os.path.dirname(__file__), "..", "sofar", "sofa_conventions", "data") From 5cf0f78c06915a061eabac3491c21bd91e67123b Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Wed, 15 May 2024 08:51:20 +0200 Subject: [PATCH 16/61] Initial commit --- docs/resources/conventions.rst | 8085 -------------------------------- docs/sofar.Sofa.rst | 6 + docs/sofar.functions.rst | 2 +- 3 files changed, 7 insertions(+), 8086 deletions(-) delete mode 100644 docs/resources/conventions.rst diff --git a/docs/resources/conventions.rst b/docs/resources/conventions.rst deleted file mode 100644 index 72e04a12..00000000 --- a/docs/resources/conventions.rst +++ /dev/null @@ -1,8085 +0,0 @@ -.. _conventions_introduction: - -Introduction -============ - -SOFA conventions specify what data and metadata must be stored in a SOFA file. Different conventions can be used to store different types of data,e.g., head-related impulse responses or musical instrument directivities.It is advised to always use the conventions that is most specific for thedata. - -In the following, SOFA conventions are described in tables with the information - -* **Name:** The Name of the data. The prefix *GLOBAL* denotes global attribute, i.e., attributes that pertain the entire data set. Underscores denote attributes that are data specific. E.g., *SourcePosition_Units* denotes the *Units* of the data *SourcePosition*. -* **Type:** The Type of the data. - - * **Attribute:** A verbose description given by a string - * **Double:** A numeric array of data - * **String:** A string array of data - -* **Default:** The default value -* **Dimensions:** The dimensions of the data. Lower case letters denote the data that sets the dimension. - - * **E:** Number of emitters - * **R:** Number of receivers - * **M:** Number of measurements - * **N:** Number of samples or frequency bins of the data - * **C:** Number of coordinates (always 3) - * **I:** Unity dimentions (always 1) - * **S:** Lengths of the longest string contained in the data (detected automatically) - -* **Flags:** - - * **r:** read only data. Data can be written if flag is missing. - * **m:** mandatory data. Data is optional if flag is missing - -.. _conventions: - -Conventions -=========== - -* :ref:`AnnotatedEmitterAudio v0.2 ` -* :ref:`AnnotatedReceiverAudio v0.2 ` -* :ref:`FreeFieldDirectivityTF v1.1 ` -* :ref:`FreeFieldHRIR v1.0 ` -* :ref:`FreeFieldHRTF v1.0 ` -* :ref:`GeneralFIR-E v2.0 ` -* :ref:`GeneralFIR v1.0 ` -* :ref:`GeneralSOS v1.0 ` -* :ref:`GeneralTF-E v1.0 ` -* :ref:`GeneralTF v1.0 ` -* :ref:`GeneralTF v2.0 ` -* :ref:`SimpleFreeFieldHRIR v1.0 ` -* :ref:`SimpleFreeFieldHRSOS v1.0 ` -* :ref:`SimpleFreeFieldHRTF v1.0 ` -* :ref:`SimpleFreeFieldSOS v1.0 ` -* :ref:`SimpleHeadphoneIR v1.0 ` -* :ref:`SingleRoomMIMOSRIR v1.0 ` -* :ref:`SingleRoomSRIR v1.0 ` -* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` -* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` -* :ref:`FreeFieldDirectivityTF v1.0 (deprecated) ` -* :ref:`GeneralFIRE v1.0 (deprecated) ` -* :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` -* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` -* :ref:`SimpleFreeFieldTF v0.4 (deprecated) ` -* :ref:`SimpleFreeFieldTF v1.0 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.1 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.3 (deprecated) ` -* :ref:`SingleTrackedAudio v0.1 (deprecated) ` -* :ref:`SingleTrackedAudio v0.2 (deprecated) ` - -Current -======= - -.. _AnnotatedEmitterAudio_0.2: - -**AnnotatedEmitterAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.2: - -**AnnotatedReceiverAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _FreeFieldDirectivityTF_1.1: - -**FreeFieldDirectivityTF v1.1** - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.1 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Type of the coordinate system used. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - Units of the coordinates. - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., 'The bell' for a trumpet or 'On the front plate between the low- and mid/high-frequency unit' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - View vector for the orientation. - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., 'Viewing direction of the bell' for a trumpet or 'Perpendicular to the front plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., 'Along the keys, keys up' for a trumpet or 'Perpendicular to the top plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position. In a simple settings, a single emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - MS, ES, MES - - - - A more detailed description of the Emitters. For example, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _FreeFieldHRIR_1.0: - -**FreeFieldHRIR v1.0** - -An extension of SimpleFreeFieldHRIR in order to consider more complex data sets described in spatially continuous representation. Each HRTF direction corresponds to an emitter, and a consistent measurement for a single listener and all directions is described by a set of the emitter positions surrounding the listener. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Short name of the listener (as for example the subject ID). - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0, 0] - - mrne - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _FreeFieldHRTF_1.0: - -**FreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant and stored as SH coefficients - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mrne - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRNE - - m - - - -:ref:`back to top ` - -.. _GeneralFIR-E_2.0: - -**GeneralFIR-E v2.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _GeneralFIR_1.0: - -**GeneralFIR v1.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _GeneralSOS_1.0: - -**GeneralSOS v1.0** - -This conventions follows GeneralFIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0]]] - - mrn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _GeneralTF-E_1.0: - -**GeneralTF-E v1.0** - -This conventions stores TFs depending in the Emiiter for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralTF - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - We store frequency-dependent data depending on the emitter here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrne - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRNE - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF_1.0: - -**GeneralTF v1.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mRn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF_2.0: - -**GeneralTF v2.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_1.0: - -**SimpleFreeFieldHRIR v1.0** - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - SourceView_Type (*attribute*) - - cartesian - - - - - - - * - SourceView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRSOS_1.0: - -**SimpleFreeFieldHRSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleFreeFieldHRTF_1.0: - -**SimpleFreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldSOS_1.0: - -**SimpleFreeFieldSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_1.0: - -**SimpleHeadphoneIR v1.0** - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescriptions (*string*) - - [''] - - MS - - - - R-dependent version of the attribute ReceiverDescription - * - EmitterDescriptions (*string*) - - [''] - - MS - - - - E-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomMIMOSRIR_1.0: - -**SingleRoomMIMOSRIR v1.0** - -Single-room multiple-input multiple-output spatial room impulse responses, depending on Emitters - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomMIMOSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - Shall be FIR-E - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature - * - RoomVolume (*double*) - - 0 - - I, MI - - - - Volume of the room - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement. - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _SingleRoomSRIR_1.0: - -**SingleRoomSRIR v1.0** - -For measuring SRIRs in a single room with a single excitation source (e.g., a loudspeaker) and a listener containing an arbitrary number of omnidirectional receivers (e.g., a microphone array). - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - Shall be FIR - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature. - * - RoomVolume (*double*) - - 0 - - I, M - - - - Volume of the room. - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume. - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -Deprecated -========== - -.. _AnnotatedEmitterAudio_0.1: - -**AnnotatedEmitterAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.1: - -**AnnotatedReceiverAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _FreeFieldDirectivityTF_1.0: - -**FreeFieldDirectivityTF v1.0** - -This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 1] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the acoustic source (instrument) - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescription (*string*) - - [''] - - IS, MS - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralFIRE_1.0: - -**GeneralFIRE v1.0** - -This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIRE - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mREn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _MultiSpeakerBRIR_0.3: - -**MultiSpeakerBRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. - -This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - MultiSpeakerBRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - narrative description of the room - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - When EmitterUp provided, EmitterView must be provided as well - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - When EmitterView provided, EmitterUp must be provided as well - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [1, 1] - - mREn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRE, MRE - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_0.4: - -**SimpleFreeFieldHRIR v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_0.4: - -**SimpleFreeFieldTF v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [1, 1] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_1.0: - -**SimpleFreeFieldTF v1.0** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.1: - -**SimpleHeadphoneIR v0.1** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.2: - -**SimpleHeadphoneIR v0.2** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.2: - -**SingleRoomDRIR v0.2** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.3: - -**SingleRoomDRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0] - - mrn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.1: - -**SingleTrackedAudio v0.1** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Data_Sample (*double*) - - [0, 0] - - rn - - m - - n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.2: - -**SingleTrackedAudio v0.2** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - S, C, I - - - - the subject’s response - * - Response_Type (*attribute*) - - - - S, C, I - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - Date - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - nR - - - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_Emitter (*double*) - - [0, 0] - - nE - - - - (source) audio data at the emitters; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst index 2a9187de..1ebdd1b1 100644 --- a/docs/sofar.Sofa.rst +++ b/docs/sofar.Sofa.rst @@ -12,3 +12,9 @@ sofar refer to the :ref:`quick_tour`. :undoc-members: :show-inheritance: :exclude-members: + +.. autoclass:: sofar.Sofastream + :members: + :undoc-members: + :show-inheritance: + :exclude-members: diff --git a/docs/sofar.functions.rst b/docs/sofar.functions.rst index 22994288..18859428 100644 --- a/docs/sofar.functions.rst +++ b/docs/sofar.functions.rst @@ -11,4 +11,4 @@ refer to the :ref:`quick_tour`. :members: :undoc-members: :show-inheritance: - :exclude-members: Sofa + :exclude-members: Sofa, Sofastream From b57a76c70c9b9e16981aa063b4e8234038799ad2 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Wed, 15 May 2024 09:03:32 +0200 Subject: [PATCH 17/61] missing files --- sofar/__init__.py | 3 + sofar/sofastream.py | 118 +++++++++++++++++++++++++++++++++++++++ tests/test_sofastream.py | 36 ++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 sofar/sofastream.py create mode 100644 tests/test_sofastream.py diff --git a/sofar/__init__.py b/sofar/__init__.py index 96232a49..8c918636 100644 --- a/sofar/__init__.py +++ b/sofar/__init__.py @@ -8,6 +8,8 @@ from .sofa import Sofa +from .sofastream import Sofastream + from .io import read_sofa, read_sofa_as_netcdf, write_sofa from .utils import (list_conventions, @@ -18,6 +20,7 @@ __all__ = ['Sofa', + 'Sofastream', 'update_conventions', 'list_conventions', 'read_sofa', diff --git a/sofar/sofastream.py b/sofar/sofastream.py new file mode 100644 index 00000000..805af1b3 --- /dev/null +++ b/sofar/sofastream.py @@ -0,0 +1,118 @@ +from netCDF4 import Dataset +import numpy as np + +class Sofastream(): + """ + Get specific data from sofa-file without reading entire file into memory. + + :class:`Sofastream` opens a sofa-file and retreives only the requested + data. To access certain data just append its name to your + :class:`Sofastream`-instance, e.g. ``'.GLOBAL_RoomType'``. + :class:`Sofastream` uses the namespace of sofar – for more information on + available data and its associated names refer to the :ref:`conventions + section `. Also make sure to check the examples + below on how to use :class:`Sofastream`. + + Parameters + ---------- + filename : str + Full path to a sofa-file + + Returns + -------- + sofastream : Sofastream + + Notes + ----- + Accessing data: + + Sofastream is supposed to be used within a with-statement. To acces data + append the corresponding name to your instance of :class:`Sofastream`. + + Depending on the type of the requested data you either get the values + directly or need to slice the returned variable: + + - If an attribute is called, its value is returned directly. + - If a variable is called, a netCDF4-variable is returned. To get the + values it needs to be sliced (see examples). + + Examples + -------- + Get an attribute from a sofa-file: + + >>> from sofar import Sofastream + >>> filename = "path/to/file.sofa" + >>> with Sofastream(filename) as file: + >>> data = file.GLOBAL_RoomType + >>> print(data) + free field + + Get a variable from a sofa-file: + + >>> with Sofastream(filename) as file: + >>> data = file.Data_IR + >>> print(data) + + float64 Data.IR(M, R, N) + unlimited dimensions: + current shape = (11950, 2, 256) + filling on, default _FillValue of 9.969209968386869e+36 used + + What is returned is a `netCDF-variable`. To access the values (in this + example the IRs) the variable needs to be sliced: + + >>> with Sofastream(filename) as file: + >>> data = file.Data_IR + >>> # get all values + >>> all_irs = data[:] + >>> print(all_irs.shape) + (11950, 2, 256) + >>> # get data from first channel + >>> specific_irs = data[:,0,:] + >>> print(specific_irs.shape) + (11950, 256) + """ + + def __init__(self, filename): + self._filename = filename + + def __enter__(self): + self._file = Dataset(self._filename, mode="r") + return self + + def __exit__(self, *args): + self._file.close() + + def __getattr__(self, name): + # get netCDF4-attributes and -variable-keys from sofa-file + dset_variables = np.array([key for key in self._file.variables.keys()]) + dset_attributes = np. asarray(self._file.ncattrs()) + + # remove delimiter from passed sofar-attribute + name = name.replace('_', '') + name = name.replace('GLOBAL', '') + + # remove delimiter from netCDF4-attributes and -variables + variables_to_search = np.char.replace(dset_variables, '.', '') + attributes_to_search = np.char.replace(dset_attributes, ':', '') + + # get value if passed attribute points to a netCDF4-variable + if name in variables_to_search: + # get variable name in netCDF-namespace + idx = np.where(name == variables_to_search) + key = dset_variables[idx][0] + # get variable from sofa-file + self._data = self._file.variables[key] + + # get value if passed attribute points to a netCDF4-attribute + elif name in attributes_to_search: + # get attribute name in netCDF-namespace + idx = np.where(name == attributes_to_search) + key = dset_attributes[idx][0] + # get attribute value from sofa-file + self._data = self._file.getncattr(key) + + else: + raise ValueError("attribute is not in dataset") + + return self._data diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py new file mode 100644 index 00000000..3df6bfc1 --- /dev/null +++ b/tests/test_sofastream.py @@ -0,0 +1,36 @@ +from sofar import Sofastream +import pytest +from pytest import raises +import netCDF4 +import numpy as np +import os + + +def test_sofastream_output(): + filename = os.path.join(os.getcwd(), 'tests', 'test_io_data', + 'FABIAN_HRIR_measured_HATO_0.sofa') + + with Sofastream(filename) as file: + obj = file + var = file.Data_IR + var_data = var[:] + att_data = file.GLOBAL_RoomType + + # check Sofastream instance + isinstance(obj, Sofastream) + # check returned variable type + isinstance(var, netCDF4._netCDF4.Variable) + # variable values + isinstance(var_data, np.ma.core.MaskedArray) + assert var_data.shape == (11950, 2, 256) + # attribute values + isinstance(att_data, str) + assert att_data == "free field" + +def test_sofastream_warnings(): + filename = os.path.join(os.getcwd(), 'tests', 'test_io_data', + 'FABIAN_HRIR_measured_HATO_0.sofa') + + with Sofastream(filename) as file: + with raises(ValueError, match="attribute is not in dataset"): + file.Wrong_Attribute From 092865d220185ee5bad69c7c37147e43c0df3399 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Wed, 22 May 2024 17:40:52 +0200 Subject: [PATCH 18/61] tempfile testing, SofaStream.inspect(), _Type & _Units --- docs/sofar.Sofa.rst | 2 +- docs/sofar.functions.rst | 2 +- sofar/__init__.py | 4 +- sofar/sofastream.py | 153 ++++++++++++++++++++++++++++++--------- tests/test_sofastream.py | 42 ++++++++--- 5 files changed, 152 insertions(+), 51 deletions(-) diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst index 1ebdd1b1..cad29be9 100644 --- a/docs/sofar.Sofa.rst +++ b/docs/sofar.Sofa.rst @@ -13,7 +13,7 @@ sofar refer to the :ref:`quick_tour`. :show-inheritance: :exclude-members: -.. autoclass:: sofar.Sofastream +.. autoclass:: sofar.SofaStream :members: :undoc-members: :show-inheritance: diff --git a/docs/sofar.functions.rst b/docs/sofar.functions.rst index 18859428..04e8745e 100644 --- a/docs/sofar.functions.rst +++ b/docs/sofar.functions.rst @@ -11,4 +11,4 @@ refer to the :ref:`quick_tour`. :members: :undoc-members: :show-inheritance: - :exclude-members: Sofa, Sofastream + :exclude-members: Sofa, SofaStream diff --git a/sofar/__init__.py b/sofar/__init__.py index 8c918636..57500010 100644 --- a/sofar/__init__.py +++ b/sofar/__init__.py @@ -8,7 +8,7 @@ from .sofa import Sofa -from .sofastream import Sofastream +from .sofastream import SofaStream from .io import read_sofa, read_sofa_as_netcdf, write_sofa @@ -20,7 +20,7 @@ __all__ = ['Sofa', - 'Sofastream', + 'SofaStream', 'update_conventions', 'list_conventions', 'read_sofa', diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 805af1b3..75551351 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -1,33 +1,33 @@ from netCDF4 import Dataset import numpy as np -class Sofastream(): +class SofaStream(): """ - Get specific data from sofa-file without reading entire file into memory. + Get specific data from SOFA-file without reading entire file into memory. - :class:`Sofastream` opens a sofa-file and retreives only the requested + :class:`SofaStream` opens a SOFA-file and retreives only the requested data. To access certain data just append its name to your - :class:`Sofastream`-instance, e.g. ``'.GLOBAL_RoomType'``. - :class:`Sofastream` uses the namespace of sofar – for more information on + :class:`SofaStream`-instance, e.g. ``'.GLOBAL_RoomType'``. + :class:`SofaStream` uses the namespace of sofar – for more information on available data and its associated names refer to the :ref:`conventions section `. Also make sure to check the examples - below on how to use :class:`Sofastream`. + below on how to use :class:`SofaStream`. Parameters ---------- filename : str - Full path to a sofa-file + Full path to a SOFA-file Returns -------- - sofastream : Sofastream + sofastream : SofaStream Notes ----- Accessing data: - Sofastream is supposed to be used within a with-statement. To acces data - append the corresponding name to your instance of :class:`Sofastream`. + SofaStream is supposed to be used within a with-statement. To acces data + append the corresponding name to your instance of :class:`SofaStream`. Depending on the type of the requested data you either get the values directly or need to slice the returned variable: @@ -38,18 +38,18 @@ class Sofastream(): Examples -------- - Get an attribute from a sofa-file: + Get an attribute from a SOFA-file: - >>> from sofar import Sofastream + >>> from sofar import SofaStream >>> filename = "path/to/file.sofa" - >>> with Sofastream(filename) as file: + >>> with SofaStream(filename) as file: >>> data = file.GLOBAL_RoomType >>> print(data) free field - Get a variable from a sofa-file: + Get a variable from a SOFA-file: - >>> with Sofastream(filename) as file: + >>> with SofaStream(filename) as file: >>> data = file.Data_IR >>> print(data) @@ -61,7 +61,7 @@ class Sofastream(): What is returned is a `netCDF-variable`. To access the values (in this example the IRs) the variable needs to be sliced: - >>> with Sofastream(filename) as file: + >>> with SofaStream(filename) as file: >>> data = file.Data_IR >>> # get all values >>> all_irs = data[:] @@ -84,35 +84,118 @@ def __exit__(self, *args): self._file.close() def __getattr__(self, name): - # get netCDF4-attributes and -variable-keys from sofa-file + # get netCDF4-attributes and -variable-keys from SOFA-file dset_variables = np.array([key for key in self._file.variables.keys()]) - dset_attributes = np. asarray(self._file.ncattrs()) + dset_attributes = np.asarray(self._file.ncattrs()) # remove delimiter from passed sofar-attribute - name = name.replace('_', '') - name = name.replace('GLOBAL', '') + name_netcdf = name.replace( + 'GLOBAL_', '').replace('Data_', 'Data.') - # remove delimiter from netCDF4-attributes and -variables - variables_to_search = np.char.replace(dset_variables, '.', '') - attributes_to_search = np.char.replace(dset_attributes, ':', '') + # Handle variable-attributes (e.g. '_Units' and '_Type') + var_attr = None + if "_Units" in name_netcdf or "_Type" in name_netcdf: + name_split = name_netcdf.split('_') + name_netcdf = name_split[0] + var_attr = name_split[1] # get value if passed attribute points to a netCDF4-variable - if name in variables_to_search: - # get variable name in netCDF-namespace - idx = np.where(name == variables_to_search) - key = dset_variables[idx][0] - # get variable from sofa-file - self._data = self._file.variables[key] + if name_netcdf in dset_variables: + # get variable from SOFA-file + self._data = self._file.variables[name_netcdf] + if var_attr is not None: + self._data = getattr(self._data, var_attr) # get value if passed attribute points to a netCDF4-attribute - elif name in attributes_to_search: - # get attribute name in netCDF-namespace - idx = np.where(name == attributes_to_search) - key = dset_attributes[idx][0] - # get attribute value from sofa-file - self._data = self._file.getncattr(key) + elif name_netcdf in dset_attributes: + # get attribute value from SOFA-file + self._data = self._file.getncattr(name_netcdf) else: raise ValueError("attribute is not in dataset") return self._data + + def inspect(self, file=None): + """ + Get information about the data inside a SOFA-file + + Prints all relevant information about attributes, variables and their + shape, dimensions and values that are contained in a SOFA-file. + + Parameters + ---------- + file : str + Full path of a file under which the information is to be stored in + plain text. The default ``None`` only print the information to the + console. + """ + + ## Catch Error if Attribute not in Dataset?? + + # Header of inspect-print + info_str = ( + f"{self._file.getncattr('SOFAConventions')} " + f"{self._file.getncattr('SOFAConventionsVersion')} " + f"(SOFA version {self._file.getncattr('Version')})") + info_str += "\n" + "-" * len(info_str) + "\n" + + # information for attributes + for attr in self._file.ncattrs(): + + value = self._file.getncattr(attr) + sofar_attr = f"GLOBAL_{attr}" + info_str += sofar_attr + ' : ' + str(value) + '\n' + + # information for variables + for key in self._file.variables.keys(): + # get values, shape and dimensions + data = self._file[key] + shape = data.shape + dimensions = data.dimensions + + # add variable name to info-string + info_str += key.replace('.', '_') + ' : ' + + # pad shape if required (trailing single dimensions are + # discarded following the numpy default) + while len(shape) < len(dimensions): + shape += (1, ) + + # add value for scalars + if data.size == 1: + info_str += str(data[:][0]) + '\n' + + # Handle multidimensional data + else: + # make verbose shape, e.g., '(M=100, R=2, N=128, ' + shape_verbose = "(" + for s, d in zip(shape, dimensions): + shape_verbose += f"{d}={s}, " + + # add shape information + info_str += shape_verbose[:-2] + ")\n" + # add value information if not too much + if data.size < 7: + info_str += " " + \ + str(np.squeeze(data[:])).replace("\n", "\n ") + "\n" + + # Add variable-attributes to info string (e.g. 'Type' or 'Units) + for att_ in [a for a in self._file[key].ncattrs()]: + info_str += (key.replace('.', '_') + f'_{att_} : ' + + getattr(data, att_) + '\n') + + # write to text file + if file is not None: + with open(file, 'w') as f_id: + f_id.write(info_str + "\n") + + # print to console + print(info_str) + +# %% + +fn = r'C:\Users\HP\Downloads\FABIAN_HRIR_measured_HATO_0.sofa' + +with SofaStream(fn) as file: + file.inspect() diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py index 3df6bfc1..b4876ff2 100644 --- a/tests/test_sofastream.py +++ b/tests/test_sofastream.py @@ -1,36 +1,54 @@ -from sofar import Sofastream -import pytest +from sofar import SofaStream +import sofar as sf +from tempfile import TemporaryDirectory from pytest import raises import netCDF4 import numpy as np import os +tempdir = TemporaryDirectory() +filename = os.path.join(tempdir.name, "test_sofastream.sofa") +sofa = sf.Sofa("SimpleFreeFieldHRIR") + +sofa.Data_IR = np.array([[0, 1], [2, 3], [4, 5]]) +sofa.GLOBAL_RoomType = "free field" +sofa.Data_SamplingRate_Units = "hertz" +sf.write_sofa(filename, sofa) def test_sofastream_output(): - filename = os.path.join(os.getcwd(), 'tests', 'test_io_data', - 'FABIAN_HRIR_measured_HATO_0.sofa') - with Sofastream(filename) as file: + with SofaStream(filename) as file: obj = file var = file.Data_IR var_data = var[:] + var_attr = file.Data_SamplingRate_Units att_data = file.GLOBAL_RoomType - # check Sofastream instance - isinstance(obj, Sofastream) + # check SofaStream instance + isinstance(obj, SofaStream) # check returned variable type isinstance(var, netCDF4._netCDF4.Variable) # variable values isinstance(var_data, np.ma.core.MaskedArray) - assert var_data.shape == (11950, 2, 256) + np.testing.assert_array_equal(var_data.squeeze(), sofa.Data_IR) + assert var_attr == 'hertz' # attribute values isinstance(att_data, str) - assert att_data == "free field" + assert att_data == sofa.GLOBAL_RoomType def test_sofastream_warnings(): - filename = os.path.join(os.getcwd(), 'tests', 'test_io_data', - 'FABIAN_HRIR_measured_HATO_0.sofa') - with Sofastream(filename) as file: + with SofaStream(filename) as file: with raises(ValueError, match="attribute is not in dataset"): file.Wrong_Attribute + +def test_sofastream_inspect(capfd): + with SofaStream(filename) as file: + file.inspect() + out, _ = capfd.readouterr() + assert "GLOBAL_SOFAConventions : SimpleFreeFieldHRIR" in out + assert "Data_SamplingRate_Units : hertz" in out + assert ("Data_IR : (M=3, R=2, N=1)\n" + " [[0. 1.]\n" + " [2. 3.]\n" + " [4. 5.]]") in out From b430e5b835aebafdeab6f2085e448db2f1fec227 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Wed, 22 May 2024 17:47:48 +0200 Subject: [PATCH 19/61] cleanup & fix failed docs build --- sofar/sofastream.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 75551351..0e3f0b5e 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -120,7 +120,7 @@ def inspect(self, file=None): """ Get information about the data inside a SOFA-file - Prints all relevant information about attributes, variables and their + Prints all information about attributes, variables and their shape, dimensions and values that are contained in a SOFA-file. Parameters @@ -131,8 +131,6 @@ def inspect(self, file=None): console. """ - ## Catch Error if Attribute not in Dataset?? - # Header of inspect-print info_str = ( f"{self._file.getncattr('SOFAConventions')} " @@ -192,10 +190,3 @@ def inspect(self, file=None): # print to console print(info_str) - -# %% - -fn = r'C:\Users\HP\Downloads\FABIAN_HRIR_measured_HATO_0.sofa' - -with SofaStream(fn) as file: - file.inspect() From d27bc2a49637694add332f442d2d342b95505357 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Thu, 23 May 2024 08:15:10 +0200 Subject: [PATCH 20/61] test_sofastream: tempfile fixture, test for inspect() txt-output --- tests/test_sofastream.py | 46 ++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py index b4876ff2..089c2105 100644 --- a/tests/test_sofastream.py +++ b/tests/test_sofastream.py @@ -2,22 +2,26 @@ import sofar as sf from tempfile import TemporaryDirectory from pytest import raises +import pytest import netCDF4 import numpy as np import os -tempdir = TemporaryDirectory() -filename = os.path.join(tempdir.name, "test_sofastream.sofa") -sofa = sf.Sofa("SimpleFreeFieldHRIR") +# Temporary SOFA-file +@pytest.fixture +def temp_sofa_file(tmp_path_factory): -sofa.Data_IR = np.array([[0, 1], [2, 3], [4, 5]]) -sofa.GLOBAL_RoomType = "free field" -sofa.Data_SamplingRate_Units = "hertz" -sf.write_sofa(filename, sofa) + filename = tmp_path_factory.mktemp("data") / "test_sofastream.sofa" + sofa = sf.Sofa("SimpleFreeFieldHRIR") + sofa.Data_IR = np.array([[0, 1], [2, 3], [4, 5]]) + sofa.GLOBAL_RoomType = "free field" + sofa.Data_SamplingRate_Units = "hertz" + sf.write_sofa(filename, sofa) + return filename -def test_sofastream_output(): +def test_sofastream_output(temp_sofa_file): - with SofaStream(filename) as file: + with SofaStream(temp_sofa_file) as file: obj = file var = file.Data_IR var_data = var[:] @@ -30,21 +34,26 @@ def test_sofastream_output(): isinstance(var, netCDF4._netCDF4.Variable) # variable values isinstance(var_data, np.ma.core.MaskedArray) - np.testing.assert_array_equal(var_data.squeeze(), sofa.Data_IR) + np.testing.assert_array_equal(var_data.squeeze(), + np.array([[0, 1], [2, 3], [4, 5]])) assert var_attr == 'hertz' # attribute values isinstance(att_data, str) - assert att_data == sofa.GLOBAL_RoomType + assert att_data == "free field" -def test_sofastream_warnings(): +def test_sofastream_warnings(temp_sofa_file): - with SofaStream(filename) as file: + with SofaStream(temp_sofa_file) as file: with raises(ValueError, match="attribute is not in dataset"): file.Wrong_Attribute -def test_sofastream_inspect(capfd): - with SofaStream(filename) as file: - file.inspect() +def test_sofastream_inspect(capfd, temp_sofa_file): + + tempdir = TemporaryDirectory() + inspect_file = os.path.join(tempdir.name, "info.txt") + + with SofaStream(temp_sofa_file) as file: + file.inspect(inspect_file) out, _ = capfd.readouterr() assert "GLOBAL_SOFAConventions : SimpleFreeFieldHRIR" in out assert "Data_SamplingRate_Units : hertz" in out @@ -52,3 +61,8 @@ def test_sofastream_inspect(capfd): " [[0. 1.]\n" " [2. 3.]\n" " [4. 5.]]") in out + + # check text file + with open(inspect_file, "r") as out_inspect: + text = out_inspect.readlines() + assert out == "".join(text) From 38adc4fb03c678c3f5c57b7461ad604744848140 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Wed, 29 May 2024 08:50:51 +0200 Subject: [PATCH 21/61] changes according to reviews from ahms5 and f-brinkmann --- sofar/sofastream.py | 53 ++++++++++++++-------------------------- tests/conftest.py | 27 ++++++++++++++++++++ tests/test_sofastream.py | 33 +++++++++---------------- 3 files changed, 58 insertions(+), 55 deletions(-) create mode 100644 tests/conftest.py diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 0e3f0b5e..0daf17e2 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -1,17 +1,13 @@ from netCDF4 import Dataset import numpy as np + class SofaStream(): """ - Get specific data from SOFA-file without reading entire file into memory. + Get data from SOFA-file without reading entire file into memory. - :class:`SofaStream` opens a SOFA-file and retreives only the requested - data. To access certain data just append its name to your - :class:`SofaStream`-instance, e.g. ``'.GLOBAL_RoomType'``. - :class:`SofaStream` uses the namespace of sofar – for more information on - available data and its associated names refer to the :ref:`conventions - section `. Also make sure to check the examples - below on how to use :class:`SofaStream`. + :class:`SofaStream` opens a SOFA-file and retrieves only the requested + data. See the examples below on how to use :class:`SofaStream`. Parameters ---------- @@ -20,29 +16,15 @@ class SofaStream(): Returns -------- - sofastream : SofaStream - - Notes - ----- - Accessing data: - - SofaStream is supposed to be used within a with-statement. To acces data - append the corresponding name to your instance of :class:`SofaStream`. - - Depending on the type of the requested data you either get the values - directly or need to slice the returned variable: - - - If an attribute is called, its value is returned directly. - - If a variable is called, a netCDF4-variable is returned. To get the - values it needs to be sliced (see examples). + sofa_stream : SofaStream Examples -------- Get an attribute from a SOFA-file: - >>> from sofar import SofaStream + >>> import sofar as sf >>> filename = "path/to/file.sofa" - >>> with SofaStream(filename) as file: + >>> with sf.SofaStream(filename) as file: >>> data = file.GLOBAL_RoomType >>> print(data) free field @@ -71,6 +53,8 @@ class SofaStream(): >>> specific_irs = data[:,0,:] >>> print(specific_irs.shape) (11950, 256) + + If you want to use all the data from a SOFA-file use :class:`SOFA` instead. """ def __init__(self, filename): @@ -94,10 +78,8 @@ def __getattr__(self, name): # Handle variable-attributes (e.g. '_Units' and '_Type') var_attr = None - if "_Units" in name_netcdf or "_Type" in name_netcdf: - name_split = name_netcdf.split('_') - name_netcdf = name_split[0] - var_attr = name_split[1] + if "_" in name_netcdf: + name_netcdf, var_attr = name_netcdf.split('_') # get value if passed attribute points to a netCDF4-variable if name_netcdf in dset_variables: @@ -112,7 +94,7 @@ def __getattr__(self, name): self._data = self._file.getncattr(name_netcdf) else: - raise ValueError("attribute is not in dataset") + raise AttributeError(f"{name} is not contained in SOFA-file") return self._data @@ -120,8 +102,11 @@ def inspect(self, file=None): """ Get information about the data inside a SOFA-file - Prints all information about attributes, variables and their - shape, dimensions and values that are contained in a SOFA-file. + Prints the values of all attributes and variables with six or less + entries and the shapes and type of all numeric and string variables. + When printing the values of arrays, single dimensions are discarded for + easy of display, i.e., an array of shape (1, 3, 2) will be displayed as + an array of shape (3, 2). Parameters ---------- @@ -135,8 +120,8 @@ def inspect(self, file=None): info_str = ( f"{self._file.getncattr('SOFAConventions')} " f"{self._file.getncattr('SOFAConventionsVersion')} " - f"(SOFA version {self._file.getncattr('Version')})") - info_str += "\n" + "-" * len(info_str) + "\n" + f"(SOFA version {self._file.getncattr('Version')})\n") + info_str += "-" * len(info_str) + "\n" # information for attributes for attr in self._file.ncattrs(): diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..c854b3fc --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,27 @@ +import pytest +import numpy as np +import sofar as sf + + +# Temporary SOFA-file +@pytest.fixture +def temp_sofa_file(tmp_path_factory): + """ + Temporary small SOFA file. + To be used when data needs to be read from a SOFA file for testing. + Contains custom data for "Data_IR", "GLOBAL_RoomType" and + "Data_SamplingRate_Units". + + Returns + ------- + filename : SOFA file + Filename of temporary SOFA file + """ + + filename = tmp_path_factory.mktemp("data") / "test_sofastream.sofa" + sofa = sf.Sofa("SimpleFreeFieldHRIR") + sofa.Data_IR = np.array([[0, 1], [2, 3], [4, 5]]) + sofa.GLOBAL_RoomType = "free field" + sofa.Data_SamplingRate_Units = "hertz" + sf.write_sofa(filename, sofa) + return filename diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py index 089c2105..bcdc2087 100644 --- a/tests/test_sofastream.py +++ b/tests/test_sofastream.py @@ -1,23 +1,11 @@ from sofar import SofaStream -import sofar as sf from tempfile import TemporaryDirectory from pytest import raises -import pytest import netCDF4 import numpy as np import os +import sofar as sf -# Temporary SOFA-file -@pytest.fixture -def temp_sofa_file(tmp_path_factory): - - filename = tmp_path_factory.mktemp("data") / "test_sofastream.sofa" - sofa = sf.Sofa("SimpleFreeFieldHRIR") - sofa.Data_IR = np.array([[0, 1], [2, 3], [4, 5]]) - sofa.GLOBAL_RoomType = "free field" - sofa.Data_SamplingRate_Units = "hertz" - sf.write_sofa(filename, sofa) - return filename def test_sofastream_output(temp_sofa_file): @@ -41,12 +29,15 @@ def test_sofastream_output(temp_sofa_file): isinstance(att_data, str) assert att_data == "free field" -def test_sofastream_warnings(temp_sofa_file): + +def test_sofastream_attribute_error(temp_sofa_file): with SofaStream(temp_sofa_file) as file: - with raises(ValueError, match="attribute is not in dataset"): + with raises(AttributeError, + match="Wrong_Attribute is not contained in SOFA-file"): file.Wrong_Attribute + def test_sofastream_inspect(capfd, temp_sofa_file): tempdir = TemporaryDirectory() @@ -55,12 +46,12 @@ def test_sofastream_inspect(capfd, temp_sofa_file): with SofaStream(temp_sofa_file) as file: file.inspect(inspect_file) out, _ = capfd.readouterr() - assert "GLOBAL_SOFAConventions : SimpleFreeFieldHRIR" in out - assert "Data_SamplingRate_Units : hertz" in out - assert ("Data_IR : (M=3, R=2, N=1)\n" - " [[0. 1.]\n" - " [2. 3.]\n" - " [4. 5.]]") in out + + sofa = sf.read_sofa(temp_sofa_file) + sofa.inspect() + out_sofa, _ = capfd.readouterr() + + assert out_sofa == out # check text file with open(inspect_file, "r") as out_inspect: From 621bd2bdd213e888a5a57f187173638b2e5e0927 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Fri, 31 May 2024 11:26:38 +0200 Subject: [PATCH 22/61] hint in read_sofa and SofaStream docs; add conventions.rst to gitignore --- .gitignore | 3 +++ sofar/io.py | 3 +++ sofar/sofastream.py | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9e819fda..4139717f 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,6 @@ docs/_build # Private tests tests/private + +# Automatically created conventions-file +docs/resources/conventions.rst diff --git a/sofar/io.py b/sofar/io.py index f431257f..352dfe09 100644 --- a/sofar/io.py +++ b/sofar/io.py @@ -16,6 +16,9 @@ def read_sofa(filename, verify='auto', verbose=True): Numeric data is returned as floats or numpy float arrays unless they have missing data, in which case they are returned as numpy masked arrays. + If you want to read only parts of the data of a large sofa file use + :class:`SofaStream` instead. + Parameters ---------- filename : str diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 0daf17e2..c1530489 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -9,6 +9,9 @@ class SofaStream(): :class:`SofaStream` opens a SOFA-file and retrieves only the requested data. See the examples below on how to use :class:`SofaStream`. + If you want to use all the data from a SOFA-file use :class:`Sofa` + class and :func:`read_sofa` function instead. + Parameters ---------- filename : str @@ -53,8 +56,6 @@ class SofaStream(): >>> specific_irs = data[:,0,:] >>> print(specific_irs.shape) (11950, 256) - - If you want to use all the data from a SOFA-file use :class:`SOFA` instead. """ def __init__(self, filename): From 9a3df69e9b96cb1402bb618a22149c698b161630 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Mon, 3 Jun 2024 16:49:29 +0200 Subject: [PATCH 23/61] Top level docstring to point out the differences between Sofa & SofaStream --- docs/sofar.Sofa.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst index cad29be9..a6ad9c35 100644 --- a/docs/sofar.Sofa.rst +++ b/docs/sofar.Sofa.rst @@ -3,9 +3,14 @@ SOFA objects ============ -This section documents sofar SOFA objects. Functions that work on SOFA objects -are described in the :ref:`sofar_functions` guide. For examples on how to use -sofar refer to the :ref:`quick_tour`. +Sofar offers two classes to handle data from SOFA files: +The :py:class:`~sofar.Sofa` class is used to read and write entire SOFA files. +To open a SOFA file without reading the entire file into memory, +:py:class:`~sofar.SofaStream` enables partial reading of data. + +This section documents sofar SOFA objects and SofaStream. Functions that work +on SOFA objects are described in the :ref:`sofar_functions` guide. For examples +on how to use sofar refer to the :ref:`quick_tour`. .. autoclass:: sofar.Sofa :members: From ecd491c64b151cfb999303c3a10b71e81b77208d Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Tue, 4 Jun 2024 11:21:14 +0200 Subject: [PATCH 24/61] changes in SofaStream docstring according to ahms5 --- sofar/sofastream.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sofar/sofastream.py b/sofar/sofastream.py index c1530489..2bcb74a8 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -4,10 +4,11 @@ class SofaStream(): """ - Get data from SOFA-file without reading entire file into memory. + Read desired data from SOFA-file directly from disk without loading entire + file into memory. :class:`SofaStream` opens a SOFA-file and retrieves only the requested - data. See the examples below on how to use :class:`SofaStream`. + data. If you want to use all the data from a SOFA-file use :class:`Sofa` class and :func:`read_sofa` function instead. @@ -20,6 +21,7 @@ class and :func:`read_sofa` function instead. Returns -------- sofa_stream : SofaStream + A SofaStream object which reads directly from the file. Examples -------- From 6e1dea219f0aaf8455626c4a809955e8260a2031 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 5 Jun 2024 12:30:12 +0200 Subject: [PATCH 25/61] remove files that are generated when building docs --- docs/_static/css/custom.css | 8 - docs/resources/conventions.rst | 8085 -------------------------------- 2 files changed, 8093 deletions(-) delete mode 100644 docs/_static/css/custom.css delete mode 100644 docs/resources/conventions.rst diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css deleted file mode 100644 index cbf825f0..00000000 --- a/docs/_static/css/custom.css +++ /dev/null @@ -1,8 +0,0 @@ - -html[data-theme="light"] { - --pst-color-primary: #18609d; /* pyfar blue as primary color */ -} - -html[data-theme="dark"] { - --pst-color-primary: #18609d; /* pyfar blue as primary color */ -} diff --git a/docs/resources/conventions.rst b/docs/resources/conventions.rst deleted file mode 100644 index 72e04a12..00000000 --- a/docs/resources/conventions.rst +++ /dev/null @@ -1,8085 +0,0 @@ -.. _conventions_introduction: - -Introduction -============ - -SOFA conventions specify what data and metadata must be stored in a SOFA file. Different conventions can be used to store different types of data,e.g., head-related impulse responses or musical instrument directivities.It is advised to always use the conventions that is most specific for thedata. - -In the following, SOFA conventions are described in tables with the information - -* **Name:** The Name of the data. The prefix *GLOBAL* denotes global attribute, i.e., attributes that pertain the entire data set. Underscores denote attributes that are data specific. E.g., *SourcePosition_Units* denotes the *Units* of the data *SourcePosition*. -* **Type:** The Type of the data. - - * **Attribute:** A verbose description given by a string - * **Double:** A numeric array of data - * **String:** A string array of data - -* **Default:** The default value -* **Dimensions:** The dimensions of the data. Lower case letters denote the data that sets the dimension. - - * **E:** Number of emitters - * **R:** Number of receivers - * **M:** Number of measurements - * **N:** Number of samples or frequency bins of the data - * **C:** Number of coordinates (always 3) - * **I:** Unity dimentions (always 1) - * **S:** Lengths of the longest string contained in the data (detected automatically) - -* **Flags:** - - * **r:** read only data. Data can be written if flag is missing. - * **m:** mandatory data. Data is optional if flag is missing - -.. _conventions: - -Conventions -=========== - -* :ref:`AnnotatedEmitterAudio v0.2 ` -* :ref:`AnnotatedReceiverAudio v0.2 ` -* :ref:`FreeFieldDirectivityTF v1.1 ` -* :ref:`FreeFieldHRIR v1.0 ` -* :ref:`FreeFieldHRTF v1.0 ` -* :ref:`GeneralFIR-E v2.0 ` -* :ref:`GeneralFIR v1.0 ` -* :ref:`GeneralSOS v1.0 ` -* :ref:`GeneralTF-E v1.0 ` -* :ref:`GeneralTF v1.0 ` -* :ref:`GeneralTF v2.0 ` -* :ref:`SimpleFreeFieldHRIR v1.0 ` -* :ref:`SimpleFreeFieldHRSOS v1.0 ` -* :ref:`SimpleFreeFieldHRTF v1.0 ` -* :ref:`SimpleFreeFieldSOS v1.0 ` -* :ref:`SimpleHeadphoneIR v1.0 ` -* :ref:`SingleRoomMIMOSRIR v1.0 ` -* :ref:`SingleRoomSRIR v1.0 ` -* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` -* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` -* :ref:`FreeFieldDirectivityTF v1.0 (deprecated) ` -* :ref:`GeneralFIRE v1.0 (deprecated) ` -* :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` -* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` -* :ref:`SimpleFreeFieldTF v0.4 (deprecated) ` -* :ref:`SimpleFreeFieldTF v1.0 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.1 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.3 (deprecated) ` -* :ref:`SingleTrackedAudio v0.1 (deprecated) ` -* :ref:`SingleTrackedAudio v0.2 (deprecated) ` - -Current -======= - -.. _AnnotatedEmitterAudio_0.2: - -**AnnotatedEmitterAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.2: - -**AnnotatedReceiverAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _FreeFieldDirectivityTF_1.1: - -**FreeFieldDirectivityTF v1.1** - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.1 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Type of the coordinate system used. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - Units of the coordinates. - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., 'The bell' for a trumpet or 'On the front plate between the low- and mid/high-frequency unit' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - View vector for the orientation. - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., 'Viewing direction of the bell' for a trumpet or 'Perpendicular to the front plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., 'Along the keys, keys up' for a trumpet or 'Perpendicular to the top plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position. In a simple settings, a single emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - MS, ES, MES - - - - A more detailed description of the Emitters. For example, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _FreeFieldHRIR_1.0: - -**FreeFieldHRIR v1.0** - -An extension of SimpleFreeFieldHRIR in order to consider more complex data sets described in spatially continuous representation. Each HRTF direction corresponds to an emitter, and a consistent measurement for a single listener and all directions is described by a set of the emitter positions surrounding the listener. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Short name of the listener (as for example the subject ID). - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0, 0] - - mrne - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _FreeFieldHRTF_1.0: - -**FreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant and stored as SH coefficients - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mrne - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRNE - - m - - - -:ref:`back to top ` - -.. _GeneralFIR-E_2.0: - -**GeneralFIR-E v2.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _GeneralFIR_1.0: - -**GeneralFIR v1.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _GeneralSOS_1.0: - -**GeneralSOS v1.0** - -This conventions follows GeneralFIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0]]] - - mrn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _GeneralTF-E_1.0: - -**GeneralTF-E v1.0** - -This conventions stores TFs depending in the Emiiter for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralTF - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - We store frequency-dependent data depending on the emitter here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrne - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRNE - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF_1.0: - -**GeneralTF v1.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mRn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF_2.0: - -**GeneralTF v2.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_1.0: - -**SimpleFreeFieldHRIR v1.0** - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - SourceView_Type (*attribute*) - - cartesian - - - - - - - * - SourceView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRSOS_1.0: - -**SimpleFreeFieldHRSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleFreeFieldHRTF_1.0: - -**SimpleFreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldSOS_1.0: - -**SimpleFreeFieldSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_1.0: - -**SimpleHeadphoneIR v1.0** - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescriptions (*string*) - - [''] - - MS - - - - R-dependent version of the attribute ReceiverDescription - * - EmitterDescriptions (*string*) - - [''] - - MS - - - - E-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomMIMOSRIR_1.0: - -**SingleRoomMIMOSRIR v1.0** - -Single-room multiple-input multiple-output spatial room impulse responses, depending on Emitters - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomMIMOSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - Shall be FIR-E - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature - * - RoomVolume (*double*) - - 0 - - I, MI - - - - Volume of the room - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement. - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _SingleRoomSRIR_1.0: - -**SingleRoomSRIR v1.0** - -For measuring SRIRs in a single room with a single excitation source (e.g., a loudspeaker) and a listener containing an arbitrary number of omnidirectional receivers (e.g., a microphone array). - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - Shall be FIR - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature. - * - RoomVolume (*double*) - - 0 - - I, M - - - - Volume of the room. - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume. - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -Deprecated -========== - -.. _AnnotatedEmitterAudio_0.1: - -**AnnotatedEmitterAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.1: - -**AnnotatedReceiverAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _FreeFieldDirectivityTF_1.0: - -**FreeFieldDirectivityTF v1.0** - -This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 1] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the acoustic source (instrument) - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescription (*string*) - - [''] - - IS, MS - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralFIRE_1.0: - -**GeneralFIRE v1.0** - -This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIRE - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mREn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _MultiSpeakerBRIR_0.3: - -**MultiSpeakerBRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. - -This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - MultiSpeakerBRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - narrative description of the room - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - When EmitterUp provided, EmitterView must be provided as well - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - When EmitterView provided, EmitterUp must be provided as well - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [1, 1] - - mREn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRE, MRE - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_0.4: - -**SimpleFreeFieldHRIR v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_0.4: - -**SimpleFreeFieldTF v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [1, 1] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_1.0: - -**SimpleFreeFieldTF v1.0** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.1: - -**SimpleHeadphoneIR v0.1** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.2: - -**SimpleHeadphoneIR v0.2** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.2: - -**SingleRoomDRIR v0.2** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.3: - -**SingleRoomDRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0] - - mrn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.1: - -**SingleTrackedAudio v0.1** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Data_Sample (*double*) - - [0, 0] - - rn - - m - - n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.2: - -**SingleTrackedAudio v0.2** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - S, C, I - - - - the subject’s response - * - Response_Type (*attribute*) - - - - S, C, I - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - Date - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - nR - - - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_Emitter (*double*) - - [0, 0] - - nE - - - - (source) audio data at the emitters; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - From 70582420ac180dd865dd2acade72e65a7fe84190 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 5 Jun 2024 12:44:18 +0200 Subject: [PATCH 26/61] load header from pyfar --- .gitignore | 7 +++++++ docs/conf.py | 37 ++++++++++++++++++++++++++++++++--- docs/index.rst | 53 +------------------------------------------------- docs/sofar.rst | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 55 deletions(-) create mode 100644 docs/sofar.rst diff --git a/.gitignore b/.gitignore index 9e819fda..b32341e4 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,10 @@ docs/_build # Private tests tests/private + +# ignore downloads from pyfar gallery +docs/header.rst +docs/_static/favicon.ico +docs/_static/header.rst +docs/_static/css/custom.css +docs/resources/logos/pyfar_logos_fixed_size_pyfar.png diff --git a/docs/conf.py b/docs/conf.py index 44b63abd..8406cb07 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,6 +8,8 @@ import os import sys +import urllib3 +import shutil sys.path.insert(0, os.path.abspath('..')) import sofar # noqa @@ -113,20 +115,49 @@ "navbar_start": ["navbar-logo"], "navbar_end": ["navbar-icon-links", "theme-switcher"], "navbar_align": "content", + "header_links_before_dropdown": 8, "icon_links": [ { "name": "GitHub", - "url": "https://github.com/pyfar", + "url": "https://github.com/sofar", "icon": "fa-brands fa-square-github", "type": "fontawesome", }, ], # Configure secondary (right) side bar - "show_toc_level": 3, # Show all subsections of notebooks + "show_toc_level": 3, # Show all subsections of notebooks "secondary_sidebar_items": ["page-toc"], # Omit 'show source' link that that shows notebook in json format "navigation_with_keys": True, } html_context = { - "default_mode": "light" + "default_mode": "light" } + +# redirect index to sofar.html +redirects = { + "index": "sofar.html" +} + +# -- download navbar and style files from gallery ----------------------------- +branch = 'main' +link = f'https://github.com/pyfar/gallery/raw/{branch}/docs/' +folders_in = [ + '_static/css/custom.css', + '_static/favicon.ico', + '_static/header.rst', + 'resources/logos/pyfar_logos_fixed_size_pyfar.png' + ] +c = urllib3.PoolManager() +for file in folders_in: + url = link + file + filename = file + os.makedirs(os.path.dirname(filename), exist_ok=True) + with c.request('GET', url, preload_content=False) as res, open(filename, 'wb') as out_file: + shutil.copyfileobj(res, out_file) + +# replace sofar hard link to internal link +with open("_static/header.rst", "rt") as fin: + with open("header.rst", "wt") as fout: + for line in fin: + fout.write(line.replace(f'https://{project}.readthedocs.io', project)) \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 8b9d96dd..cc508ad0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,52 +1 @@ -Getting Started -=============== - -.. toctree:: - :maxdepth: 1 - - readme - examples - working_with_sofa_files - - -Documentation -============= - -.. toctree:: - :maxdepth: 2 - - sofar.Sofa - sofar.functions - - -SOFA conventions -================ - -.. toctree:: - :maxdepth: 1 - - resources/conventions - -Contributing -=============== - -.. toctree:: - :maxdepth: 2 - - contributing - -Other -===== -.. toctree:: - :maxdepth: 1 - - authors - history - -.. - (removed because it is contained in the new spinx style) - Indices and tables - ================== - * :ref:`genindex` - * :ref:`modindex` - * :ref:`search` +.. include:: header.rst diff --git a/docs/sofar.rst b/docs/sofar.rst new file mode 100644 index 00000000..8b9d96dd --- /dev/null +++ b/docs/sofar.rst @@ -0,0 +1,52 @@ +Getting Started +=============== + +.. toctree:: + :maxdepth: 1 + + readme + examples + working_with_sofa_files + + +Documentation +============= + +.. toctree:: + :maxdepth: 2 + + sofar.Sofa + sofar.functions + + +SOFA conventions +================ + +.. toctree:: + :maxdepth: 1 + + resources/conventions + +Contributing +=============== + +.. toctree:: + :maxdepth: 2 + + contributing + +Other +===== +.. toctree:: + :maxdepth: 1 + + authors + history + +.. + (removed because it is contained in the new spinx style) + Indices and tables + ================== + * :ref:`genindex` + * :ref:`modindex` + * :ref:`search` From ff9ad1d379347c9e063ed23923b41752092d4675 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Wed, 5 Jun 2024 13:31:07 +0200 Subject: [PATCH 27/61] add redirect and fic conf --- .gitignore | 1 + docs/conf.py | 11 ++++++----- docs/resources/sofar.png | Bin 5130 -> 0 bytes requirements_dev.txt | 2 ++ 4 files changed, 9 insertions(+), 5 deletions(-) delete mode 100644 docs/resources/sofar.png diff --git a/.gitignore b/.gitignore index b32341e4..5a27ea10 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,4 @@ docs/_static/favicon.ico docs/_static/header.rst docs/_static/css/custom.css docs/resources/logos/pyfar_logos_fixed_size_pyfar.png +docs/resources/logos/pyfar_logos_fixed_size_sofar.png diff --git a/docs/conf.py b/docs/conf.py index 8406cb07..3092d634 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,6 +29,7 @@ 'autodocsumm', 'sphinx_design', 'sphinx_favicon', + 'sphinx_reredirects', ] # show tocs for classes and functions of modules using the autodocsumm @@ -95,7 +96,7 @@ 'numpy': ('https://numpy.org/doc/stable/', None), 'scipy': ('https://docs.scipy.org/doc/scipy/', None), 'matplotlib': ('https://matplotlib.org/stable/', None), - 'spharpy': ('https://spharpy.readthedocs.io/en/stable/', None) + 'pyfar': ('https://pyfar.readthedocs.io/en/stable/', None), } # -- Options for HTML output ------------------------------------------------- @@ -104,7 +105,7 @@ html_theme = 'pydata_sphinx_theme' html_static_path = ['_static'] html_css_files = ['css/custom.css'] -html_logo = 'resources/sofar.png' +html_logo = 'resources/logos/pyfar_logos_fixed_size_sofar.png' html_title = "sofar" html_favicon = '_static/favicon.ico' @@ -119,7 +120,7 @@ "icon_links": [ { "name": "GitHub", - "url": "https://github.com/sofar", + "url": "https://github.com/pyfar", "icon": "fa-brands fa-square-github", "type": "fontawesome", }, @@ -146,7 +147,7 @@ '_static/css/custom.css', '_static/favicon.ico', '_static/header.rst', - 'resources/logos/pyfar_logos_fixed_size_pyfar.png' + 'resources/logos/pyfar_logos_fixed_size_sofar.png', ] c = urllib3.PoolManager() for file in folders_in: @@ -160,4 +161,4 @@ with open("_static/header.rst", "rt") as fin: with open("header.rst", "wt") as fout: for line in fin: - fout.write(line.replace(f'https://{project}.readthedocs.io', project)) \ No newline at end of file + fout.write(line.replace(f'https://{project}.readthedocs.io', project)) diff --git a/docs/resources/sofar.png b/docs/resources/sofar.png deleted file mode 100644 index 5f7d286c2fff1c00339d0d2b62a8abdd79c45998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5130 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 M7~Z;GrSB5^AHHOj9{>OV diff --git a/requirements_dev.txt b/requirements_dev.txt index be5c9ad7..773489bb 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,6 +6,7 @@ flake8 coverage Sphinx twine + pytest pytest-runner pytest-cov @@ -19,3 +20,4 @@ beautifulsoup4 pydata-sphinx-theme sphinx-design sphinx-favicon +sphinx-reredirects From 7a71cbc183eac6a494492d34f674ffddaaf7155d Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Wed, 5 Jun 2024 13:32:27 +0200 Subject: [PATCH 28/61] remove empty line --- requirements_dev.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements_dev.txt b/requirements_dev.txt index 773489bb..d47461a8 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -6,7 +6,6 @@ flake8 coverage Sphinx twine - pytest pytest-runner pytest-cov From cb1bbd11de90e7be18b91e808681b2dad88eb880 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Wed, 5 Jun 2024 13:35:01 +0200 Subject: [PATCH 29/61] remove old navbar --- docs/_templates/navbar-nav.html | 41 --------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 docs/_templates/navbar-nav.html diff --git a/docs/_templates/navbar-nav.html b/docs/_templates/navbar-nav.html deleted file mode 100644 index 6938a274..00000000 --- a/docs/_templates/navbar-nav.html +++ /dev/null @@ -1,41 +0,0 @@ - From 717b5f522fd155fe5eb24b2e76dace0853cc84ed Mon Sep 17 00:00:00 2001 From: Anne Heimes <64446926+ahms5@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:38:55 +0200 Subject: [PATCH 30/61] Update .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5a27ea10..372e9192 100644 --- a/.gitignore +++ b/.gitignore @@ -74,5 +74,4 @@ docs/header.rst docs/_static/favicon.ico docs/_static/header.rst docs/_static/css/custom.css -docs/resources/logos/pyfar_logos_fixed_size_pyfar.png docs/resources/logos/pyfar_logos_fixed_size_sofar.png From 48ea3f0aa26ea2f1d922e779a01849bb74cd1bbe Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 5 Jun 2024 15:54:29 +0200 Subject: [PATCH 31/61] update readme and remove now deprecated files --- README.rst | 32 ++-- docs/conf.py | 1 + docs/examples.rst | 243 ------------------------------- docs/sofar.Sofa.rst | 4 +- docs/sofar.functions.rst | 4 +- docs/sofar.rst | 4 +- docs/working_with_sofa_files.rst | 139 ------------------ 7 files changed, 28 insertions(+), 399 deletions(-) delete mode 100644 docs/examples.rst delete mode 100644 docs/working_with_sofa_files.rst diff --git a/README.rst b/README.rst index d4118b18..722daa7b 100644 --- a/README.rst +++ b/README.rst @@ -15,13 +15,25 @@ far. SOFA files store spatially distributed acoustic data such as impulse responses or transfer functions. They are defined by the AES69-2022 standard (see references). These are the key features of sofar -* Uses a complete definition of the AES69-2022 standard (see references) maintained at `sofa_conventions`_ * Read, edit, and write SOFA files * Add custom attributes to SOFA files * Full Verification of the content of a SOFA files against AES69-2022 * Upgrade data that uses outdated SOFA conventions * Open license allows unrestricted use * sofar is tested using continuous integration on +* Uses a complete definition of the AES69-2022 standard (see references) maintained at `sofa_conventions`_ + +Getting Started +=============== + +The `sofa and SOFA notebook`_ gives an overview of the most important sofar +functionality and is a good starting point. For processing and visualizing data +inside SOFA files, we recommend the `pyfar package`_ that can read SOFA files +through `pyfar.io.read_sofa` and the in-depth examples contained in the +`pyfar example gallery`_. Check out `read the docs`_ for a complete +documentation of sofar. A more detailed introduction to the SOFA file format +is given by Majdak et. al. 2022 (see references below). All information is also +bundled at `pyfar.org`_. Installation ============ @@ -34,14 +46,7 @@ Use pip to install sofar (Requires Python >= 3.8) -Getting Started -=============== - -Check out `read the docs`_ for example use cases a quick introduction to SOFA -and sofar, and the complete documentation. A more detailed introduction to SOFA -is given by Majdak et. al. 2022 (see references below) Packages related to -sofar are listed at `pyfar.org`_. For more information on the SOFA file format -visit `sofaconventions.org`_. +If the installation fails, please check out the `help section`_. Contributing ============ @@ -49,10 +54,13 @@ Contributing Refer to the `contribution guidelines`_ for more information. .. _sofa_conventions : https://github.com/pyfar/sofa_conventions -.. _contribution guidelines: https://github.com/pyfar/sofar/blob/develop/CONTRIBUTING.rst +.. _sofa and SOFA notebook: https://pyfar-gallery.readthedocs.io/en/latest/gallery/interactive/sofar_introduction.html +.. _pyfar package: https://pyfar.readthedocs.io +.. _pyfar example gallery: https://pyfar-gallery.readthedocs.io/en/latest/examples_gallery.html .. _pyfar.org: https://pyfar.org -.. _read the docs: https://sofar.readthedocs.io/en/stable -.. _sofaconventions.org: https://sofaconventions.org +.. _read the docs: https://sofar.readthedocs.io +.. _help section: https://pyfar-gallery.readthedocs.io/en/latest/help +.. _contribution guidelines: https://sofar.readthedocs.io/en/stable/contributing.html References ========== diff --git a/docs/conf.py b/docs/conf.py index 3092d634..b5b3845d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -97,6 +97,7 @@ 'scipy': ('https://docs.scipy.org/doc/scipy/', None), 'matplotlib': ('https://matplotlib.org/stable/', None), 'pyfar': ('https://pyfar.readthedocs.io/en/stable/', None), + 'gallery': ('https://pyfar-gallery.readthedocs.io/en/latest/', None), } # -- Options for HTML output ------------------------------------------------- diff --git a/docs/examples.rst b/docs/examples.rst deleted file mode 100644 index ac0746eb..00000000 --- a/docs/examples.rst +++ /dev/null @@ -1,243 +0,0 @@ -.. _quick_tour: - -Quick tour of SOFA and sofar ----------------------------- - -If you are new to SOFA and/or sofar, this is a good place to start. SOFA is -short for *Spatially Oriented Format for Acoustics* and is an open file format -for saving acoustic data, as for example head-related impulse responses -(HRIRs). A good places to get more information about SOFA are - -* :ref:`Documentation of the SOFA conventions ` -* The `SOFA paper `_ -* `sofaconventions.org`_. -* The SOFA standard `AES69-2022 `_ - -Creating SOFA objects -===================== - -To cover a variety of data, SOFA offers different `conventions`. A convention -defines, what data can be saved and how it is saved. You should always find the -most specific convention for your data. This will help you to identify relevant -data and meta data that you should provide along the actual acoustic data. -Using sofar, a list of possible conventions can be obtained with - -.. code-block:: python - - import sofar as sf - sf.list_conventions() - -Let us assume, that you want to store head-related impulse responses (HRIRs). -In this case the most specific convention is `SimpleFreeFieldHRIR`. To create -a SOFA object use - -.. code-block:: python - - sofa = sf.Sofa("SimpleFreeFieldHRIR") - -The return value `sofa` is a :code:`sofar.Sofa` object filled with the default -values of the `SimpleFreeFieldHRIR` convention. Note that ``sf.Sofa()`` can -also return a sofa object that has only the mandatory attributes. However, it -is recommended to start with all attributes and discard empty optional -attributes before saving the data. - -.. _getting_information_about_SOFA_objects: - -Getting information about SOFA objects -====================================== - -To get an overview of the convention, go to the -:ref:`documentation of the SOFA conventions `. - -You might have noted from the documentation that three different kinds of -data types can be stored in SOFA files: - -* **Attributes:** - Attributes are meta data stored as strings. There are two kinds of - attributes. Global attributes give information about the entire data stored - in a SOFA file. All entires starting with *GLOBAL* are such attributes. - Specific attributes hold meta data for a certain variable. These attributes - thus start with the name of the variable followed by an underscore, e.g., - *ListenerPosition_Units*. An exception to this rule are the data variables, - e.g, *Data_IR* is not an attribute but a double variable. -* **Double Variables:** - Variables of type *double* store numeric data and can be entered as - numbers, lists, or numpy arrays. -* **String Variables:** - Variables of type *string* store strings and can be entered as strings, - lists of string, or numpy string arrays. - -The data can be mandatory, optional, and read only and must have a shape -(dimension in SOFA language) according to the underlying convention. Read on -for more information. - -To get a quick insight into SOFA objects use - -* ``sofa.inspect`` prints the data stored in a SOFA object or at least gives - the shape in case of large arrays that would clutter the output. This is - helpful when reading data from an existing SOFA object. -* ``sofa.list_dimensions`` prints the dimensions of the data inside the SOFA - object. -* ``sofa.get_dimension`` returns the size of a specific dimension. - -For the *SimpleFreeFieldHRIR* SOFA object we have the following dimensions - -.. code-block:: python - - sofa.list_dimensions - >>> R = 2 receiver (set by ReceiverPosition of dimension RCI, RCM) - >>> E = 1 emitter (set by EmitterPosition of dimension ECI, ECM) - >>> M = 1 measurements (set by Data_IR of dimension MRN) - >>> N = 1 samples (set by Data_IR of dimension MRN) - >>> C = 3 coordinate dimensions, fixed - >>> I = 1 single dimension, fixed - >>> S = 0 maximum string length - -In this case, `M` denotes the number of source -positions for which HRIRs are available, `R` is the number of ears - which is -two - and `N` gives the lengths of the HRIRs in samples. `S` is zero, because -the convention does not have any string variables. `C` is always three, because -coordinates are either given by x, y, and z values or by their azimuth, -elevation and radius in degree. - -It is important to be aware of the dimensions and enter data as determined by -the convention. SOFA sets the `dimensions` -implicitly. This means the dimensions are derived from the data itself, as -indicated by the output of :code:`sofa.list_dimensions` above (*set by...*). In -some cases, variables can have different shapes. An example for this is the -`ReceiverPosition` which can be of shape RCI or RCM. To get a dimension as a -variable use - -.. code-block:: python - - sofa.get_dimension("N) - >>> N = 1 - -Let's assume you downloaded a SOFA file from the `FABIAN database `_ -and want to quickly inspect it. You could use - -.. code-block:: python - - sofa = sf.read_sofa("FABIAN_HRIR_measured_HATO_0.sofa") - sofa.inspect() - >>> GLOBAL_License : Creative Commons (CC-BY). Visit http://creativecommons.org/licenses/by/4.0/ for licence details. - >>> GLOBAL_Organization : Audio Communication Group, TU Berlin, Germany (www.ak.tu-berlin.de) - >>> ReceiverPosition : (R=2, C=3, I=1) - >>> [[ 0. 0.0662 0. ] - >>> [ 0. -0.0662 0. ]] - >>> Data_IR : (M=11950, R=2, N=256) - >>> Data_SamplingRate : 44100.0 - >>> Data_SamplingRate_Units : hertz - -Note that the above does not show the entire information for the sake of -brevity. This will most likely give you a better idea of the data then -looking at the definition of the convention or calling ``sofa.list_dimensions``. - -Adding data to SOFA objects -=========================== - -Data can simply be obtained and entered - -.. code-block:: python - - sofa.Data_IR # prints [0, 0] - sofa.Data_IR = [1, 1] - sofa.SourcePosition = [90, 0, 1.5] - -Now, the SOFA object contains a single HRIR - which is ``1`` for the left -ear and ``1`` for the right ear - for a source at ``0`` degree azimuth, ``90`` -degree elevation and a radius of ``1.5`` meter. Note that you just entered a -list for `Data_IR` although it has to be a three-dimensional double variable. -Sofar handles this in two steps. - -1. When entering data as lists it is converted to a numpy array with at least two dimensions. -2. Missing dimensions are appended when writing the SOFA object to disk. - -You should now fill all mandatory entries of the SOFA object if you were -for real. For this example we'll cut it here for the sake of brevity. Let -us, however, delete an optional entry that we do not need at this point - -.. code-block:: python - - sofa.delete("SourceUp") - -In some cases you might want to add custom data - although third party -applications most likely won't make use of non-standardized data. Try this -to add a temperature value and unit - -.. code-block:: python - - sofa.add_variable("Temperature", 25.1, "double", "MI") - sofa.add_attribute("Temperature_Units", "degree Celsius") - - -After entering the data, the SOFA object should be verified to make sure that -your data can (most likely) be read by other applications. - -.. code-block:: python - - sofa.verify() - -This will check the following - -- Are all mandatory data contained? -- Are the names of variables and attributes in accordance with the SOFA - standard? -- Are the data types in accordance with the SOFA standard? -- Are the dimensions of the variables consistent and in accordance - to the SOFA standard? -- Are the values of attributes consistent and in accordance to the - SOFA standard? - -If any violations are detected, an error is raised. - -Reading and writing SOFA objects -================================ - -Note that you usually do not need to call ``sofa.verify()`` separately because -it is by default called if you create write or read a SOFA object. To write -your SOFA object to disk type - -.. code-block:: python - - sf.write_sofa("your/path/to/SingleHRIR.sofa", sofa) - -It is good to know that SOFA files are essentially netCDF4 files which is -based on HDF5. They can thus be viewed with `HDF View`_. - -To read your sofa file you can use - -.. code-block:: python - - sofa_read = sf.read_sofa("your/path/to/SingleHRIR.sofa") - -And to see that the written and read files contain the same data you can check - -.. code-block:: python - - sf.equals(sofa, sofa_read) - >>> True - -Upgrading SOFA files -==================== - -SOFA conventions might get updates to fix bugs in the conventions, in case -new conventions are introduced, or in case conventions get deprecated. To find -out if SOFA data from a file is up to data load it and call - -.. code-block:: python - - sofa.upgrade_convention() - -which will list upgrade choices or let you know that the convention is already up -to date. - -Next steps -========== - -For detailed information about sofar refer to the :ref:`sofar_SOFA` and :ref:`sofar_functions` documentation. -For examples on how to work with the data inside SOFA files refer to :ref:`working_with_sofa`. - - -.. _sofaconventions.org: https://sofaconventions.org -.. _HDF view: https://www.hdfgroup.org/downloads/hdfview/ \ No newline at end of file diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst index 2a9187de..2ab4ceb8 100644 --- a/docs/sofar.Sofa.rst +++ b/docs/sofar.Sofa.rst @@ -5,7 +5,9 @@ SOFA objects This section documents sofar SOFA objects. Functions that work on SOFA objects are described in the :ref:`sofar_functions` guide. For examples on how to use -sofar refer to the :ref:`quick_tour`. +sofar refer to the +:ref:`sofa and SOFA ` +examples. .. autoclass:: sofar.Sofa :members: diff --git a/docs/sofar.functions.rst b/docs/sofar.functions.rst index 22994288..4e6a28ae 100644 --- a/docs/sofar.functions.rst +++ b/docs/sofar.functions.rst @@ -5,7 +5,9 @@ sofar functions This section documents general functions of the sofar package. Handling data in SOFA objects is described in :ref:`sofar_SOFA`. For examples on how to use sofa -refer to the :ref:`quick_tour`. +refer to the +:ref:`sofa and SOFA ` +examples. .. automodule:: sofar :members: diff --git a/docs/sofar.rst b/docs/sofar.rst index 8b9d96dd..892a66d7 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -2,11 +2,9 @@ Getting Started =============== .. toctree:: - :maxdepth: 1 + :maxdepth: 2 readme - examples - working_with_sofa_files Documentation diff --git a/docs/working_with_sofa_files.rst b/docs/working_with_sofa_files.rst deleted file mode 100644 index d09bff93..00000000 --- a/docs/working_with_sofa_files.rst +++ /dev/null @@ -1,139 +0,0 @@ -.. _working_with_sofa: - -Working with SOFA files ------------------------ - -The :ref:`quick_tour` showed how to access SOFA files. In many cases you will -want to have a closer look at the data inside a SOFA file or use it for further -processing. In this section, you will see examples of how to do that using -`pyfar `_. - - -Retrieving data for specific source and receiver positions -========================================================== - -In most cases SOFA files contain data for lots of source or receiver positions -and it is often important to get data for a specific position. An elegant way -of doing that is to use pyfar Coordinates and Audio objects. Coordinate objects -have built in methods to search specific positions and they can convert between -a large variety of coordinate systems for you. For audio objects, there is -a growing pool of functions for plotting and processing that comes in handy. To -use pyfar install it into you python environment - -.. code:: shell - - $ pip install pyfar - -You have to options to get SOFA data into pyfar. The first option is to load -the SOFA file with :code:`sofar.read_sofa` and then manually generate Audio -and Coordinates objects from the data inside the SOFA file. The second option -is to use :code:`pyfar.read_sofa`, which directly returns the Audio and -Coordinates objects. Lets be lazy and do that - -.. code:: python - - import pyfar as pf - import matplotlib as mpl - import matplotlib.pyplot as plt - - data_ir, source_coordinates, receiver_coordinates = pf.io.read_sofa( - 'FABIAN_HRIR_measured_HATO_0.sofa') - -The SOFA file used in this example is contained head-realated impulse responses -(HRIRs) from the `FABIAN database `_. -Lets find the HRIR for the source position at the left ear on the horizontal -plane. It has an azimuth angle of 90 degrees and an elevation of 0 degrees - -.. code:: python - - index, *_ = source_coordinates.find_nearest_k( - 90, 0, 1.5, k=1, domain='sph', convention='top_elev', unit='deg', show=True) - -The variable ``index = 5930`` tells us where to find data for the desired -source position. Since we used ``show=True`` we also get visual feedback for -checking if we got the correct source - -|source_lateral| - -Note that you get more then the most closest point by using different values -for `k`. It is also possible to all source positions on or in the vicintiy -of the horizontal plane using the ``find_slice`` method of the Coordinates -object. Sources on the horizontal plane have zero degree elevation and thus can -be obtained by - -.. code:: python - - _, mask = source_coordinates.find_slice( - 'elevation', unit='deg', value=0, show=True) - -Again, we get visual feedback if we want - -|source_horizontal| - - -Plotting data -============= - -Ploting can be done with the built in plot functions. For example to take a -look at the time data and magnitude spectra of a single source position - -.. code:: python - - pf.plot.time_freq(data_ir[index]) - -|hrir_lateral| - -Plotting the entire horizontal plane is also a one liner using -``pf.plot.time_freq_2d``, however, a few more lines are required for a nicer -formatting - -.. code:: python - - with pf.plot.context(): - - plt.subplots(2, 1, figsize=(8, 6), sharex=True) - - angles = source_coordinates.get_sph('top_elev', 'deg')[mask, 0] - - ax, qm, cb = pf.plot.time_freq_2d(data_ir[mask, 0], indices=angles, - cmap=mpl.cm.get_cmap(name='coolwarm')) - - ax[0].set_title("Left ear HRIR (Horizontal plane)") - ax[0].set_xlabel("") - ax[0].set_ylim(0, 3) - qm[0].set_clim(-1.5, 1.5) - - ax[1].set_title("Left ear HRTFs (Horizontal plane)") - ax[1].set_xlabel("Azimuth angle in degrees") - ax[1].set_ylim(200, 20e3) - qm[1].set_clim(-25, 25) - - plt.tight_layout - -|hrir_horizontal_plane| - - -Next steps -========== - -For detailed information about sofar refer to the :ref:`sofar_SOFA` and :ref:`sofar_functions` documentation. -Pyfar also offers methods for digital signal processing that wont be detailed -here. A god way to dive into that is the -`pyfar documentation `_ and the -`pyfar examples notebook `_. - -.. |source_lateral| image:: resources/working_with_sofa_source_lateral.png - :width: 500 - :alt: source lateral - -.. |source_horizontal| image:: resources/working_with_sofa_source_horizontal.png - :width: 500 - :alt: source horizontal - -.. |hrir_lateral| image:: resources/working_with_sofa_HRIR_lateral.png - :width: 600 - :alt: HRIR lateral - -.. |hrir_horizontal_plane| image:: resources/working_with_sofar_HRIR_horizontal_plane.jpeg - :width: 600 - :alt: HRIR horizontal plane From 1fa95bee25558873c0a7eba125505809a6a62eb7 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 5 Jun 2024 16:16:11 +0200 Subject: [PATCH 32/61] update contributing --- CONTRIBUTING.rst | 143 +++++------------------------------------------ 1 file changed, 13 insertions(+), 130 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index ddd066ba..b578b933 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -5,37 +5,26 @@ Contributing ============ Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. +helps, and credit will always be given. The following helps you to start +contributing specifically to sofar. Please also consider the +`general contributing guidelines`_ for example regarding the style +of code and documentation and some helpful hints. You can contribute in many ways: Types of Contributions ---------------------- -Report Bugs and Submit Feedback +Report Bugs or Suggest Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The best way to report bugs of send feedback is to open an issue at https://github.com/pyfar/sofar/issues. - -If you are reporting a bug, please include: - -* Your operating system name and version. -* Any details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) +The best place for this is https://github.com/pyfar/sofar/issues. Fix Bugs or Implement Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Look through the GitHub issues for bugs. Anything tagged with "bug" or -"enhancement" is open to whoever wants to implement it. It might be good to -contact us first, to see if anyone is already working on it. +Look through https://github.com/pyfar/sofar/issues for bugs or feature request +and contact us or comment if you are interested in implementing. Write Documentation ~~~~~~~~~~~~~~~~~~~ @@ -89,122 +78,16 @@ Ready to contribute? Here's how to set up `sofar` for local development. 8. Submit a pull request through the GitHub website. -Pull Request Guidelines ------------------------ - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring. -3. The pull request should work for Python 3.7 and 3.8. Check - https://travis-ci.com/pyfar/sofar/pull_requests - and make sure that the tests pass for all supported Python versions. - - -Testing Guidelines ------------------------ -Sofar uses test-driven development based on `three steps `_ and `continuous integration `_ to test and monitor the code. -In the following, you'll find a guideline. Note: these instructions are not generally applicable outside of sofar. - -- The main tool used for testing is `pytest `_. -- All tests are located in the *tests/* folder. -- Make sure that all important parts of sofar are covered by the tests. This can be checked using *coverage* (see below). -- In case of sofar, mainly **state verification** is applied in the tests. This means that the outcome of a function is compared to a desired value (``assert ...``). For more information, it is refered to `Martin Fowler's article `_. - -Tips -~~~~~~~~~~~ -Pytest provides several, sophisticated functionalities which could reduce the effort of implementing tests. - -- Similar tests executing the same code with different variables can be `parametrized `_. -- Feel free to add more recommendations on useful pytest functionalities here. Consider, that a trade-off between easy implemention and good readability of the tests needs to be found. - -You can create an html report on the test `coverage `_ by calling - - $ pytest --cov=. --cov-report=html - - -Writing the Documentation -------------------------- - -Sofar follows the `numpy style guide `_ for the docstring. A docstring has to consist at least of - -- A short and/or extended summary, -- the Parameters section, and -- the Returns section - -Optional fields that are often used are - -- References, -- Examples, and -- Notes - -Here are a few tips to make things run smoothly - -- Use the tags ``:py:func:``, ``:py:mod:``, and ``:py:class:`` to reference sofar functions, modules, and classes: For example ``:py:func:`~sofar.write_sofa``` for a link that displays only the function name. -- Code snippets and values as well as external modules, classes, functions are marked by double ticks \`\` to appear in mono spaced font, e.g., ``x=3`` or ``sofar.Signal``. -- Parameters, returns, and attributes are marked by single ticks \` to appear as emphasized text, e.g., *unit*. -- Use ``[#]_`` and ``.. [#]`` to get automatically numbered footnotes. -- Do not use footnotes in the short summary. Only use footnotes in the extended summary if there is a short summary. Otherwise, it messes with the auto-footnotes. - -See the `Sphinx homepage `_ for more information. - -Building the Documentation --------------------------- - -You can build the documentation of your branch using Sphinx by executing the make script inside the docs folder. - -.. code-block:: console - - $ cd docs/ - $ make html - -After Sphinx finishes you can open the generated html using any browser - -.. code-block:: console - - $ docs/_build/index.html - -Note that some warnings are only shown the first time you build the -documentation. To show the warnings again use - -.. code-block:: console - - $ make clean - -before building the documentation. - - Submodules ~~~~~~~~~~ To update the submodule containing the conventions and verification rules run -$ git submodule update --init --recursive -$ git submodule update --recursive --remote +.. code-block:: bash -and then commit the changes - - -Deploying -~~~~~~~~~ - -A reminder for the maintainers on how to deploy. - -- Commit all changes to develop -- Update HISTORY.rst in develop -- Check if new contributors should be added to AUTHORS.rst -- Merge develop into main - -Switch to main and run:: + $ git submodule update --init --recursive + $ git submodule update --recursive --remote -$ bumpversion patch --verbose # possible: major / minor / patch - -Bumpversion will update all version strings, create and commit tags by default - -$ git push --follow-tags - -Continuous integration will then deploy to PyPI if tests pass. - -- Merge main back into develop +and then commit the changes +.. _general contributing guidelines: https://pyfar-gallery.readthedocs.io/en/latest/contribute/index.html From 365288a86435ac15ea5b50bb32063ec6f7608c93 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Mon, 10 Jun 2024 09:02:02 +0200 Subject: [PATCH 33/61] run cookiecutter to merge into dev --- .circleci/config.yml | 10 +- .coveragerc | 16 - .editorconfig | 21 +- .github/ISSUE_TEMPLATE.md | 18 + .github/PULL_REQUEST_TEMPLATE.md | 9 + .../create_issue_if_cookiecutter.yml | 25 + .gitignore | 145 +- CONTRIBUTING.rst | 173 +- HISTORY.rst | 3 +- LICENSE | 5 +- MANIFEST.in | 7 +- README.rst | 47 +- docs/Makefile | 2 +- docs/_static/css/custom.css | 3 + docs/_templates/navbar-nav.html | 41 - docs/authors.rst | 1 - docs/conf.py | 46 +- docs/examples.rst | 4 +- docs/index.rst | 52 +- docs/make.bat | 72 +- docs/modules.rst | 10 + docs/modules/sofar.rst | 7 + docs/requirements.txt | 3 - docs/resources/conventions.rst | 3646 ++++++++--------- docs/resources/sofar.png | Bin 5130 -> 0 bytes docs/sofar.Sofa.rst | 14 - docs/sofar.functions.rst | 14 - docs/sofar.rst | 38 + docs/working_with_sofa_files.rst | 2 +- environment.yml | 13 + pyproject.toml | 13 + pytest.ini | 1 - requirements_dev.txt | 4 +- setup.cfg | 4 - setup.py | 14 +- 35 files changed, 2226 insertions(+), 2257 deletions(-) delete mode 100644 .coveragerc create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/create_issue_if_cookiecutter.yml delete mode 100644 docs/_templates/navbar-nav.html delete mode 100644 docs/authors.rst create mode 100644 docs/modules.rst create mode 100644 docs/modules/sofar.rst delete mode 100644 docs/requirements.txt delete mode 100644 docs/resources/sofar.png delete mode 100644 docs/sofar.Sofa.rst delete mode 100644 docs/sofar.functions.rst create mode 100644 docs/sofar.rst create mode 100644 environment.yml create mode 100644 pyproject.toml diff --git a/.circleci/config.yml b/.circleci/config.yml index 0dde8f09..81dd413c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -45,7 +45,7 @@ jobs: name: Run tests command: git submodule sync --recursive && git submodule update --recursive --init && pytest - flake: + ruff: parameters: version: description: "version tag" @@ -63,7 +63,7 @@ jobs: pip-dependency-file: requirements_dev.txt - run: name: Flake8 - command: git submodule sync --recursive && git submodule update --recursive --init && flake8 sofar tests + command: git submodule sync --recursive && git submodule update --recursive --init && ruff check test_documentation_build: parameters: @@ -132,7 +132,7 @@ workflows: - "3.10" - "3.11" - "3.12" - - flake: + - ruff: matrix: parameters: version: @@ -168,7 +168,7 @@ workflows: tags: only: /^v[0-9]+(\.[0-9]+)*$/ - - flake: + - ruff: matrix: parameters: version: @@ -203,7 +203,7 @@ workflows: - "3.12" requires: - build_and_test - - flake + - ruff - test_documentation_build filters: branches: diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index f1c2c59a..00000000 --- a/.coveragerc +++ /dev/null @@ -1,16 +0,0 @@ -[paths] -source = - src/sofar - */site-packages/sofar - -[run] -branch = true -source = - sofar - tests -parallel = true - -[report] -show_missing = true -precision = 2 -omit = *migrations* diff --git a/.editorconfig b/.editorconfig index 4000618e..09084781 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,13 +1,24 @@ -# see http://editorconfig.org +# http://editorconfig.org + root = true [*] -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true indent_style = space indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true charset = utf-8 +end_of_line = lf + +[*.yml] +indent_size = 2 -[*.{bat,cmd,ps1}] +[*.bat] +indent_style = tab end_of_line = crlf + +[LICENSE] +insert_final_newline = false + +[Makefile] +indent_style = tab diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..1e133d69 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,18 @@ +## General + +* sofar version: +* Python version: +* Operating System: +* Did you install pyfar via pip: + +## Description + +Describe what you were trying to get done. +Tell us what happened, what went wrong, and what you expected to happen. + +## What I Did + +``` +Paste the command(s) you ran and the output. +If there was a crash, please include the traceback here. +``` diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..dd5be6ff --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +### Which issue(s) are closed by this pull request? + +Closes # + +### Changes proposed in this pull request: + +- +- +- diff --git a/.github/workflows/create_issue_if_cookiecutter.yml b/.github/workflows/create_issue_if_cookiecutter.yml new file mode 100644 index 00000000..ba4337b9 --- /dev/null +++ b/.github/workflows/create_issue_if_cookiecutter.yml @@ -0,0 +1,25 @@ +on: + pull_request: + types: [ labeled ] +name: Create issue if pr gets a cookiecutter label +jobs: + stuff: + permissions: + contents: read + issues: write + name: create issue + environment: test + if: github.event.label.name == 'cookiecutter' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + repository: 'pyfar/cookiecutter-pypackage' + - uses: dacbd/create-issue-action@v2 + with: + title: ${{ github.event.pull_request.title }} + token: ${{ secrets.cookiecutter_PAT }} + owner: pyfar + repo: cookiecutter-pypackage + body: | + apply changes from https://github.com/${{ github.repository }}/pull/${{ github.event.number }} diff --git a/.gitignore b/.gitignore index 9e819fda..ab4bb909 100644 --- a/.gitignore +++ b/.gitignore @@ -1,70 +1,123 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ *.py[cod] +*$py.class # C extensions *.so -# Packages -*.egg -*.egg-info -dist -build -eggs -.eggs -parts -bin -var -sdist -wheelhouse -develop-eggs +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ .installed.cfg -lib -lib64 -venv*/ -env/ -pyvenv*/ -.pytest_cache/ -**/__pycache__/ +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec # Installer logs pip-log.txt +pip-delete-this-directory.txt # Unit test / coverage reports +htmlcov/ .coverage .coverage.* +.cache nosetests.xml coverage.xml -htmlcov +*.cover +.hypothesis/ +.pytest_cache/ # Translations *.mo +*.pot -# Mr Developer -.mr.developer.cfg -.project -.pydevproject -.idea -*.iml -*.komodoproject +# Django stuff: +*.log +local_settings.py +db.sqlite3 -# Complexity -output/*.html -output/*/index.html +# Flask stuff: +instance/ +.webassets-cache -# Sphinx -docs/_build +# Scrapy stuff: +.scrapy -.DS_Store -.vscode -*~ -.*.sw[po] -.build -.ve +# Sphinx documentation +docs/_build/ +docs/_autosummary + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments .env -.cache -.pytest -.bootstrap -.appveyor.token -*.bak +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# vs code +.vscode/ +.idea/ + +# macOS +.DS_Store + +# workaround for failing test discovery in vscode +tests/*/__init__.py +tests/private/ -# Private tests -tests/private +# ignore downloads from pyfar gallery +docs/header.rst +docs/_static/favicon.ico +docs/_static/header.rst +docs/_static/css/custom.css +docs/resources/logos/pyfar_logos_fixed_size_sofar.png diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index ddd066ba..bdb79754 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -5,37 +5,24 @@ Contributing ============ Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. - -You can contribute in many ways: +helps, and credit will always be given. The following helps you to start +contributing specifically to pyfar. Please also consider the +`general contributing guidelines`_ for example regarding the style +of code and documentation and some helpful hints. Types of Contributions ---------------------- -Report Bugs and Submit Feedback +Report Bugs or Suggest Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The best way to report bugs of send feedback is to open an issue at https://github.com/pyfar/sofar/issues. - -If you are reporting a bug, please include: - -* Your operating system name and version. -* Any details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) +The best place for this is https://github.com/pyfar/sofar/issues. Fix Bugs or Implement Features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Look through the GitHub issues for bugs. Anything tagged with "bug" or -"enhancement" is open to whoever wants to implement it. It might be good to -contact us first, to see if anyone is already working on it. +Look through https://github.com/pyfar/sofar/issues for bugs or feature request +and contact us or comment if you are interested in implementing. Write Documentation ~~~~~~~~~~~~~~~~~~~ @@ -47,19 +34,18 @@ articles, and such. Get Started! ------------ -Ready to contribute? Here's how to set up `sofar` for local development. +Ready to contribute? Here's how to set up `sofar` for local development using the command-line interface. Note that several alternative user interfaces exist, e.g., the Git GUI, `GitHub Desktop `_, extensions in `Visual Studio Code `_ ... -1. Fork the `sofar` repo on GitHub. +1. `Fork `_ the `sofar` repo on GitHub. 2. Clone your fork locally and cd into the sofar directory:: - $ git clone --recursive https://github.com/pyfar/sofar.git - $ cd sofar/ - -3. Note that some graphical Git interfaces can not do the recursive clone. If the folder sofar/sofa_conventions is empty try + $ git clone --recursive https://github.com/YOUR_USERNAME/sofar.git + $ cd sofar + Note that some graphical Git interfaces can not do the recursive clone. If the folder sofar/sofa_conventions is empty try:: $ git submodule update --init -4. Install your local copy into a virtualenv. Assuming you have Anaconda or Miniconda installed, this is how you set up your fork for local development:: +3. Install your local copy into a virtualenv. Assuming you have Anaconda or Miniconda installed, this is how you set up your fork for local development:: $ conda create --name sofar python $ conda activate sofar @@ -67,144 +53,27 @@ Ready to contribute? Here's how to set up `sofar` for local development. $ pip install -e . $ pip install -r requirements_dev.txt -5. Create a branch for local development. Indicate the intention of your branch in its respective name (i.e. `feature/branch-name` or `bugfix/branch-name`):: +4. Create a branch for local development. Indicate the intention of your branch in its respective name (i.e. `feature/branch-name` or `bugfix/branch-name`):: $ git checkout -b name-of-your-bugfix-or-feature Now you can make your changes locally. -6. When you're done making changes, check that your changes pass flake8 and the +5. When you're done making changes, check that your changes pass ruff and the tests:: - $ flake8 sofar tests + $ ruff check $ pytest - flake8 test must pass without any warnings for `./sofar` and `./tests` using the default or a stricter configuration. Flake8 ignores `E123/E133, E226` and `E241/E242` by default. If necessary adjust the your flake8 and linting configuration in your IDE accordingly. + ruff must pass without any warnings for `./sofar` and `./tests` using the default or a stricter configuration. Ruff ignores a couple of PEP Errors (see `./pyproject.toml`). If necessary, adjust your linting configuration in your IDE accordingly. -7. Commit your changes and push your branch to GitHub:: +6. Commit your changes and push your branch to GitHub:: $ git add . $ git commit -m "Your detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature -8. Submit a pull request through the GitHub website. - -Pull Request Guidelines ------------------------ - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring. -3. The pull request should work for Python 3.7 and 3.8. Check - https://travis-ci.com/pyfar/sofar/pull_requests - and make sure that the tests pass for all supported Python versions. - - -Testing Guidelines ------------------------ -Sofar uses test-driven development based on `three steps `_ and `continuous integration `_ to test and monitor the code. -In the following, you'll find a guideline. Note: these instructions are not generally applicable outside of sofar. - -- The main tool used for testing is `pytest `_. -- All tests are located in the *tests/* folder. -- Make sure that all important parts of sofar are covered by the tests. This can be checked using *coverage* (see below). -- In case of sofar, mainly **state verification** is applied in the tests. This means that the outcome of a function is compared to a desired value (``assert ...``). For more information, it is refered to `Martin Fowler's article `_. - -Tips -~~~~~~~~~~~ -Pytest provides several, sophisticated functionalities which could reduce the effort of implementing tests. - -- Similar tests executing the same code with different variables can be `parametrized `_. -- Feel free to add more recommendations on useful pytest functionalities here. Consider, that a trade-off between easy implemention and good readability of the tests needs to be found. - -You can create an html report on the test `coverage `_ by calling - - $ pytest --cov=. --cov-report=html - - -Writing the Documentation -------------------------- - -Sofar follows the `numpy style guide `_ for the docstring. A docstring has to consist at least of - -- A short and/or extended summary, -- the Parameters section, and -- the Returns section - -Optional fields that are often used are - -- References, -- Examples, and -- Notes - -Here are a few tips to make things run smoothly - -- Use the tags ``:py:func:``, ``:py:mod:``, and ``:py:class:`` to reference sofar functions, modules, and classes: For example ``:py:func:`~sofar.write_sofa``` for a link that displays only the function name. -- Code snippets and values as well as external modules, classes, functions are marked by double ticks \`\` to appear in mono spaced font, e.g., ``x=3`` or ``sofar.Signal``. -- Parameters, returns, and attributes are marked by single ticks \` to appear as emphasized text, e.g., *unit*. -- Use ``[#]_`` and ``.. [#]`` to get automatically numbered footnotes. -- Do not use footnotes in the short summary. Only use footnotes in the extended summary if there is a short summary. Otherwise, it messes with the auto-footnotes. - -See the `Sphinx homepage `_ for more information. - -Building the Documentation --------------------------- - -You can build the documentation of your branch using Sphinx by executing the make script inside the docs folder. - -.. code-block:: console - - $ cd docs/ - $ make html - -After Sphinx finishes you can open the generated html using any browser - -.. code-block:: console - - $ docs/_build/index.html - -Note that some warnings are only shown the first time you build the -documentation. To show the warnings again use - -.. code-block:: console - - $ make clean - -before building the documentation. - - -Submodules -~~~~~~~~~~ - -To update the submodule containing the conventions and verification rules run - -$ git submodule update --init --recursive -$ git submodule update --recursive --remote - -and then commit the changes - - -Deploying -~~~~~~~~~ - -A reminder for the maintainers on how to deploy. - -- Commit all changes to develop -- Update HISTORY.rst in develop -- Check if new contributors should be added to AUTHORS.rst -- Merge develop into main - -Switch to main and run:: - -$ bumpversion patch --verbose # possible: major / minor / patch - -Bumpversion will update all version strings, create and commit tags by default - -$ git push --follow-tags - -Continuous integration will then deploy to PyPI if tests pass. +7. Submit a pull request on the develop branch through the GitHub website. -- Merge main back into develop +.. _general contributing guidelines: https://pyfar-gallery.readthedocs.io/en/latest/contribute/index.html diff --git a/HISTORY.rst b/HISTORY.rst index 9ebd89f2..32f23c6d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,3 +1,4 @@ +======= History ======= @@ -77,4 +78,4 @@ History 0.1.0 (2021-10-29) ------------------ -* First release on PyPI \ No newline at end of file +* First release on PyPI diff --git a/LICENSE b/LICENSE index d53f9a00..e345fa45 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,6 @@ -Copyright (c) [2021] [The pyfar developers] +MIT License + +Copyright (c) 2021, The pyfar developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -17,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/MANIFEST.in b/MANIFEST.in index c0cc2fae..2f355326 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,3 @@ -include AUTHORS.rst include CONTRIBUTING.rst include HISTORY.rst include LICENSE @@ -10,3 +9,9 @@ recursive-include sofar/sofa_conventions/conventions *.json recursive-include sofar/sofa_conventions/conventions/deprecated *.csv recursive-include sofar/sofa_conventions/conventions/deprecated *.json recursive-include sofar/sofa_conventions/rules *.json + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif diff --git a/README.rst b/README.rst index d4118b18..f8cd73c3 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ -====== -Readme -====== +===== +sofar +===== .. image:: https://badge.fury.io/py/sofar.svg :target: https://badge.fury.io/py/sofar @@ -9,6 +9,9 @@ Readme :alt: Documentation Status .. image:: https://circleci.com/gh/pyfar/sofar.svg?style=shield :target: https://circleci.com/gh/pyfar/sofar +.. image:: https://mybinder.org/badge_logo.svg + :target: https://mybinder.org/v2/gh/pyfar/gallery/main?labpath=docs/gallery/interactive/sofar_introduction.ipynb + Sofar is maybe the most complete Python package for the SOFA file format so far. SOFA files store spatially distributed acoustic data such as impulse @@ -23,6 +26,17 @@ responses or transfer functions. They are defined by the AES69-2022 standard * Open license allows unrestricted use * sofar is tested using continuous integration on +Getting Started +=============== + +The `pyfar workshop`_ gives an overview of the most important pyfar +functionality and is a good starting point. It is part of the +`pyfar example gallery`_ that also contains more specific and in-depth +examples that can be executed interactively without a local installation by +clicking the mybinder.org button on the respective example. The +`pyfar documentation`_ gives a detailed and complete overview of pyfar. All +these information are available from `pyfar.org`_. + Installation ============ @@ -32,27 +46,14 @@ Use pip to install sofar $ pip install sofar -(Requires Python >= 3.8) - -Getting Started -=============== +(Requires Python 3.8 or higher) -Check out `read the docs`_ for example use cases a quick introduction to SOFA -and sofar, and the complete documentation. A more detailed introduction to SOFA -is given by Majdak et. al. 2022 (see references below) Packages related to -sofar are listed at `pyfar.org`_. For more information on the SOFA file format -visit `sofaconventions.org`_. +If the installation fails, please check out the `help section`_. Contributing ============ -Refer to the `contribution guidelines`_ for more information. - -.. _sofa_conventions : https://github.com/pyfar/sofa_conventions -.. _contribution guidelines: https://github.com/pyfar/sofar/blob/develop/CONTRIBUTING.rst -.. _pyfar.org: https://pyfar.org -.. _read the docs: https://sofar.readthedocs.io/en/stable -.. _sofaconventions.org: https://sofaconventions.org +Check out the `contributing guidelines`_ if you want to become part of pyfar. References ========== @@ -65,3 +66,11 @@ P. Majdak, F. Zotter, F. Brinkmann, J. De Muynke, M. Mihocic, and M. Noisternig, "Spatially Oriented Format for Acoustics 2.1: Introduction and Recent Advances", *J. Audio Eng. Soc.*, vol. 70, no. 7/8, pp. 565-584, Jul. 2022. DOI: https://doi.org/10.17743/jaes.2022.0026 + +.. _sofa_conventions : https://github.com/pyfar/sofa_conventions +.. _pyfar workshop: https://mybinder.org/v2/gh/pyfar/gallery/main?labpath=docs/gallery/interactive/pyfar_introduction.ipynb +.. _pyfar example gallery: https://pyfar-gallery.readthedocs.io/en/latest/examples_gallery.html +.. _pyfar documentation: https://pyfar.readthedocs.io +.. _pyfar.org: https://pyfar.org +.. _help section: https://pyfar-gallery.readthedocs.io/en/latest/help +.. _contributing guidelines: https://pyfar.readthedocs.io/en/stable/contributing.html diff --git a/docs/Makefile b/docs/Makefile index 89b0969d..70c74037 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -4,7 +4,7 @@ # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = python -msphinx -SPHINXPROJ = pyfar +SPHINXPROJ = sofar SOURCEDIR = . BUILDDIR = _build diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css index cbf825f0..86b1cea7 100644 --- a/docs/_static/css/custom.css +++ b/docs/_static/css/custom.css @@ -6,3 +6,6 @@ html[data-theme="light"] { html[data-theme="dark"] { --pst-color-primary: #18609d; /* pyfar blue as primary color */ } +html { + --pst-icon-external-link: ""; +} \ No newline at end of file diff --git a/docs/_templates/navbar-nav.html b/docs/_templates/navbar-nav.html deleted file mode 100644 index 6938a274..00000000 --- a/docs/_templates/navbar-nav.html +++ /dev/null @@ -1,41 +0,0 @@ - diff --git a/docs/authors.rst b/docs/authors.rst deleted file mode 100644 index e122f914..00000000 --- a/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py index 44b63abd..63ad54b8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,6 +8,8 @@ import os import sys +import urllib3 +import shutil sys.path.insert(0, os.path.abspath('..')) import sofar # noqa @@ -27,6 +29,7 @@ 'autodocsumm', 'sphinx_design', 'sphinx_favicon', + 'sphinx_reredirects', ] # show tocs for classes and functions of modules using the autodocsumm @@ -37,8 +40,6 @@ # package matplotlib.sphinxext.plot_directive plot_include_source = True -imgmath_latex_preamble = r'\usepackage{array}' - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -63,9 +64,6 @@ # The full version, including alpha/beta/rc tags. release = sofar.__version__ -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = 'en' @@ -91,9 +89,6 @@ # intersphinx mapping intersphinx_mapping = { 'numpy': ('https://numpy.org/doc/stable/', None), - 'scipy': ('https://docs.scipy.org/doc/scipy/', None), - 'matplotlib': ('https://matplotlib.org/stable/', None), - 'spharpy': ('https://spharpy.readthedocs.io/en/stable/', None) } # -- Options for HTML output ------------------------------------------------- @@ -102,7 +97,7 @@ html_theme = 'pydata_sphinx_theme' html_static_path = ['_static'] html_css_files = ['css/custom.css'] -html_logo = 'resources/sofar.png' +html_logo = 'resources/logos/pyfar_logos_fixed_size_sofar.png' html_title = "sofar" html_favicon = '_static/favicon.ico' @@ -113,6 +108,7 @@ "navbar_start": ["navbar-logo"], "navbar_end": ["navbar-icon-links", "theme-switcher"], "navbar_align": "content", + "header_links_before_dropdown": 8, "icon_links": [ { "name": "GitHub", @@ -122,11 +118,39 @@ }, ], # Configure secondary (right) side bar - "show_toc_level": 3, # Show all subsections of notebooks + "show_toc_level": 3, # Show all subsections of notebooks "secondary_sidebar_items": ["page-toc"], # Omit 'show source' link that that shows notebook in json format "navigation_with_keys": True, } html_context = { - "default_mode": "light" + "default_mode": "light" } + +# redirect index to pyfar.html +redirects = { + "index": f"{project}.html" +} + +# -- download navbar and style files from gallery ----------------------------- +branch = 'main' +link = f'https://github.com/pyfar/gallery/raw/{branch}/docs/' +folders_in = [ + '_static/css/custom.css', + '_static/favicon.ico', + '_static/header.rst', + 'resources/logos/pyfar_logos_fixed_size_sofar.png', + ] +c = urllib3.PoolManager() +for file in folders_in: + url = link + file + filename = file + os.makedirs(os.path.dirname(filename), exist_ok=True) + with c.request('GET', url, preload_content=False) as res, open(filename, 'wb') as out_file: + shutil.copyfileobj(res, out_file) + +# replace pyfar hard link to internal link +with open("_static/header.rst", "rt") as fin: + with open("header.rst", "wt") as fout: + for line in fin: + fout.write(line.replace(f'https://{project}.readthedocs.io', project)) diff --git a/docs/examples.rst b/docs/examples.rst index ac0746eb..301f1486 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -235,9 +235,9 @@ to date. Next steps ========== -For detailed information about sofar refer to the :ref:`sofar_SOFA` and :ref:`sofar_functions` documentation. +For detailed information about sofar refer to the :mod:`sofar` documentation. For examples on how to work with the data inside SOFA files refer to :ref:`working_with_sofa`. .. _sofaconventions.org: https://sofaconventions.org -.. _HDF view: https://www.hdfgroup.org/downloads/hdfview/ \ No newline at end of file +.. _HDF view: https://www.hdfgroup.org/downloads/hdfview/ diff --git a/docs/index.rst b/docs/index.rst index 8b9d96dd..8e49aee4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,52 +1,2 @@ -Getting Started -=============== -.. toctree:: - :maxdepth: 1 - - readme - examples - working_with_sofa_files - - -Documentation -============= - -.. toctree:: - :maxdepth: 2 - - sofar.Sofa - sofar.functions - - -SOFA conventions -================ - -.. toctree:: - :maxdepth: 1 - - resources/conventions - -Contributing -=============== - -.. toctree:: - :maxdepth: 2 - - contributing - -Other -===== -.. toctree:: - :maxdepth: 1 - - authors - history - -.. - (removed because it is contained in the new spinx style) - Indices and tables - ================== - * :ref:`genindex` - * :ref:`modindex` - * :ref:`search` +.. include:: header.rst diff --git a/docs/make.bat b/docs/make.bat index 1f4a59ad..006676a6 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -1,36 +1,36 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=pyfar - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=python -msphinx +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=sofar + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The Sphinx module was not found. Make sure you have Sphinx installed, + echo.then set the SPHINXBUILD environment variable to point to the full + echo.path of the 'sphinx-build' executable. Alternatively you may add the + echo.Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 00000000..8ac9ae27 --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,10 @@ +Modules +======= + +The following gives detailed information about all pyfar functions sorted +according to their modules. + +.. toctree:: + :maxdepth: 1 + + modules/sofar diff --git a/docs/modules/sofar.rst b/docs/modules/sofar.rst new file mode 100644 index 00000000..fdf5af64 --- /dev/null +++ b/docs/modules/sofar.rst @@ -0,0 +1,7 @@ +sofar +===== + +.. automodule:: sofar + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 8a8a4047..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -sphinx>=1.3 -sphinx-rtd-theme --e . diff --git a/docs/resources/conventions.rst b/docs/resources/conventions.rst index 72e04a12..1f975d89 100644 --- a/docs/resources/conventions.rst +++ b/docs/resources/conventions.rst @@ -35,47 +35,47 @@ In the following, SOFA conventions are described in tables with the information Conventions =========== -* :ref:`AnnotatedEmitterAudio v0.2 ` -* :ref:`AnnotatedReceiverAudio v0.2 ` -* :ref:`FreeFieldDirectivityTF v1.1 ` +* :ref:`SimpleFreeFieldHRTF v1.0 ` * :ref:`FreeFieldHRIR v1.0 ` -* :ref:`FreeFieldHRTF v1.0 ` -* :ref:`GeneralFIR-E v2.0 ` -* :ref:`GeneralFIR v1.0 ` -* :ref:`GeneralSOS v1.0 ` +* :ref:`FreeFieldDirectivityTF v1.1 ` * :ref:`GeneralTF-E v1.0 ` -* :ref:`GeneralTF v1.0 ` * :ref:`GeneralTF v2.0 ` -* :ref:`SimpleFreeFieldHRIR v1.0 ` +* :ref:`SimpleHeadphoneIR v1.0 ` +* :ref:`AnnotatedReceiverAudio v0.2 ` * :ref:`SimpleFreeFieldHRSOS v1.0 ` -* :ref:`SimpleFreeFieldHRTF v1.0 ` +* :ref:`GeneralSOS v1.0 ` * :ref:`SimpleFreeFieldSOS v1.0 ` -* :ref:`SimpleHeadphoneIR v1.0 ` +* :ref:`GeneralFIR v1.0 ` +* :ref:`GeneralFIR-E v2.0 ` * :ref:`SingleRoomMIMOSRIR v1.0 ` +* :ref:`SimpleFreeFieldHRIR v1.0 ` +* :ref:`FreeFieldHRTF v1.0 ` +* :ref:`AnnotatedEmitterAudio v0.2 ` +* :ref:`GeneralTF v1.0 ` * :ref:`SingleRoomSRIR v1.0 ` -* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` -* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` * :ref:`FreeFieldDirectivityTF v1.0 (deprecated) ` +* :ref:`SingleRoomDRIR v0.2 (deprecated) ` +* :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` +* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` * :ref:`GeneralFIRE v1.0 (deprecated) ` -* :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` -* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` +* :ref:`SingleRoomDRIR v0.3 (deprecated) ` * :ref:`SimpleFreeFieldTF v0.4 (deprecated) ` * :ref:`SimpleFreeFieldTF v1.0 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.1 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.2 (deprecated) ` -* :ref:`SingleRoomDRIR v0.3 (deprecated) ` * :ref:`SingleTrackedAudio v0.1 (deprecated) ` * :ref:`SingleTrackedAudio v0.2 (deprecated) ` +* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` +* :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` +* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` +* :ref:`SimpleHeadphoneIR v0.1 (deprecated) ` Current ======= -.. _AnnotatedEmitterAudio_0.2: - -**AnnotatedEmitterAudio v0.2** +.. _SimpleFreeFieldHRTF_1.0: +**SimpleFreeFieldHRTF v1.0** +This conventions is for HRTFs created under conditions where room information is irrelevant .. list-table:: :widths: 20 50 25 30 100 @@ -97,12 +97,12 @@ Current - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio + - SimpleFreeFieldHRTF - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 + - 1.0 - - r, m - @@ -137,7 +137,7 @@ Current - - * - GLOBAL_DataType (*attribute*) - - Audio + - TF - - r, m - @@ -151,6 +151,11 @@ Current - - m - + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - GLOBAL_Organization (*attribute*) - - @@ -186,11 +191,16 @@ Current - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - name of the database to which these data belong * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the head. IC if not tracked, MC if tracked. + - * - ListenerPosition_Type (*attribute*) - cartesian - @@ -203,9 +213,9 @@ Current - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM + - rCI, rCM - m - - Position of the ears. RC if not tracked, RCM if tracked. + - * - ReceiverPosition_Type (*attribute*) - cartesian - @@ -217,25 +227,25 @@ Current - m - * - SourcePosition (*double*) - - [0, 0, 0] + - [0, 0, 1] - IC, MC - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. + - Source position is assumed to vary for different directions/positions around the listener * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eC, eCM + - eCI, eCM - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. + - * - EmitterPosition_Type (*attribute*) - cartesian - @@ -250,12 +260,12 @@ Current - [0, 0, 1] - IC, MC - m - - Must be of the same dimensionality as ListenerView. + - * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - Orientation of the head. IC if not tracked, MC if tracked. + - * - ListenerView_Type (*attribute*) - cartesian - @@ -266,59 +276,39 @@ Current - - m - - * - M (*double*) + * - N (*double*) - 0 + - N - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second + * - N_LongName (*attribute*) + - frequency - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - + - narrative name of N + * - N_Units (*attribute*) + - hertz - + - m - - - narrative description of the response type - * - Data_Emitter (*double*) + * - Data_Real (*double*) - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I + - mRn - m - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - + * - Data_Imag (*double*) + - [0, 0] + - MRN - m - :ref:`back to top ` -.. _AnnotatedReceiverAudio_0.2: - -**AnnotatedReceiverAudio v0.2** +.. _FreeFieldHRIR_1.0: +**FreeFieldHRIR v1.0** +An extension of SimpleFreeFieldHRIR in order to consider more complex data sets described in spatially continuous representation. Each HRTF direction corresponds to an emitter, and a consistent measurement for a single listener and all directions is described by a set of the emitter positions surrounding the listener. .. list-table:: :widths: 20 50 25 30 100 @@ -340,12 +330,12 @@ Current - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio + - FreeFieldHRIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 + - 1.0 - - r, m - @@ -380,7 +370,7 @@ Current - - * - GLOBAL_DataType (*attribute*) - - Audio + - FIR-E - - r, m - @@ -394,6 +384,11 @@ Current - - m - + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - Short name of the listener (as for example the subject ID). * - GLOBAL_Organization (*attribute*) - - @@ -429,11 +424,16 @@ Current - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - Name of the database to which these data belong * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the head. IC if not tracked, MC if tracked. + - * - ListenerPosition_Type (*attribute*) - cartesian - @@ -446,9 +446,9 @@ Current - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM + - RCI, RCM - m - - Position of the ears. RC if not tracked, RCM if tracked. + - * - ReceiverPosition_Type (*attribute*) - cartesian - @@ -463,29 +463,29 @@ Current - [0, 0, 0] - IC, MC - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. + - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eC, eCM + - IC, ECI, ECM - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. + - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' * - EmitterPosition_Type (*attribute*) - - cartesian + - spherical harmonics - - m - - + - Can be 'spherical harmonics', 'cartesian', or 'spherical' * - EmitterPosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - @@ -493,12 +493,12 @@ Current - [0, 0, 1] - IC, MC - m - - Must be of the same dimensionality as ListenerView. + - * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - Orientation of the head. IC if not tracked, MC if tracked. + - * - ListenerView_Type (*attribute*) - cartesian - @@ -509,44 +509,14 @@ Current - - m - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Receiver (*double*) + * - Data_IR (*double*) - [0, 0] - - In, Rn + - mrne - m - - (binaural) audio data at the receivers; n=number of audio samples + - * - Data_SamplingRate (*double*) - - 44100 - - I + - 48000 + - I, M - m - * - Data_SamplingRate_Units (*attribute*) @@ -554,6 +524,11 @@ Current - - m - + * - Data_Delay (*double*) + - [0, 0] + - IRI, MRI, MRE + - m + - Additional delay of each IR (in samples) :ref:`back to top ` @@ -865,11 +840,11 @@ This conventions stores directivities of acoustic sources (instruments, loudspea :ref:`back to top ` -.. _FreeFieldHRIR_1.0: +.. _GeneralTF-E_1.0: -**FreeFieldHRIR v1.0** +**GeneralTF-E v1.0** -An extension of SimpleFreeFieldHRIR in order to consider more complex data sets described in spatially continuous representation. Each HRTF direction corresponds to an emitter, and a consistent measurement for a single listener and all directions is described by a set of the emitter positions surrounding the listener. +This conventions stores TFs depending in the Emiiter for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralTF .. list-table:: :widths: 20 50 25 30 100 @@ -891,7 +866,7 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRIR + - GeneralTF-E - - r, m - @@ -931,10 +906,10 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - - * - GLOBAL_DataType (*attribute*) - - FIR-E + - TF-E - - r, m - - + - We store frequency-dependent data depending on the emitter here * - GLOBAL_History (*attribute*) - - @@ -945,11 +920,6 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - - m - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Short name of the listener (as for example the subject ID). * - GLOBAL_Organization (*attribute*) - - @@ -964,7 +934,7 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - free field - - m - - + - The room information can be arbitrary * - GLOBAL_Origin (*attribute*) - - @@ -985,11 +955,6 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -1006,8 +971,8 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM + - [0, 0, 0] + - IC, RC, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -1021,10 +986,10 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - m - * - SourcePosition (*double*) - - [0, 0, 0] + - [0, 0, 1] - IC, MC - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener + - In order to store different directions/positions around the listener, SourcePosition is assumed to vary * - SourcePosition_Type (*attribute*) - spherical - @@ -1037,67 +1002,52 @@ An extension of SimpleFreeFieldHRIR in order to consider more complex data sets - * - EmitterPosition (*double*) - [0, 0, 0] - - IC, ECI, ECM + - IC, EC, ECM - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) + * - EmitterPosition_Type (*attribute*) - cartesian - - m - - * - ListenerView_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) - metre - - m - - * - Data_IR (*double*) - - [0, 0] - - mrne + * - N (*double*) + - 0 + - N - m + - Frequency values + * - N_LongName (*attribute*) + - frequency - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - m - - - * - Data_SamplingRate_Units (*attribute*) + - narrative name of N + * - N_Units (*attribute*) - hertz - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRI, MRI, MRE + - Unit of the values given in N + * - Data_Real (*double*) + - 0 + - mrne - m - - Additional delay of each IR (in samples) + - The real part of the complex spectrum + * - Data_Imag (*double*) + - 0 + - MRNE + - m + - The imaginary part of the complex spectrum :ref:`back to top ` -.. _FreeFieldHRTF_1.0: +.. _GeneralTF_2.0: -**FreeFieldHRTF v1.0** +**GeneralTF v2.0** -This conventions is for HRTFs created under conditions where room information is irrelevant and stored as SH coefficients +This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. .. list-table:: :widths: 20 50 25 30 100 @@ -1119,12 +1069,12 @@ This conventions is for HRTFs created under conditions where room information is - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRTF + - GeneralTF - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 2.0 - - r, m - @@ -1159,10 +1109,10 @@ This conventions is for HRTFs created under conditions where room information is - - * - GLOBAL_DataType (*attribute*) - - TF-E + - TF - - r, m - - + - We store frequency-dependent data here * - GLOBAL_History (*attribute*) - - @@ -1173,11 +1123,6 @@ This conventions is for HRTFs created under conditions where room information is - - m - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database * - GLOBAL_Organization (*attribute*) - - @@ -1192,7 +1137,7 @@ This conventions is for HRTFs created under conditions where room information is - free field - - m - - + - The room information can be arbitrary * - GLOBAL_Origin (*attribute*) - - @@ -1213,11 +1158,6 @@ This conventions is for HRTFs created under conditions where room information is - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -1234,8 +1174,8 @@ This conventions is for HRTFs created under conditions where room information is - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM + - [0, 0, 0] + - IC, RC, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -1249,10 +1189,10 @@ This conventions is for HRTFs created under conditions where room information is - m - * - SourcePosition (*double*) - - [0, 0, 0] + - [0, 0, 1] - IC, MC - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener + - In order to store different directions/positions around the listener, SourcePosition is assumed to vary * - SourcePosition_Type (*attribute*) - spherical - @@ -1265,35 +1205,15 @@ This conventions is for HRTFs created under conditions where room information is - * - EmitterPosition (*double*) - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC + - eC, eCM - m - - * - ListenerView_Type (*attribute*) + * - EmitterPosition_Type (*attribute*) - cartesian - - m - - * - ListenerView_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) - metre - - m @@ -1302,7 +1222,7 @@ This conventions is for HRTFs created under conditions where room information is - 0 - N - m - - + - Frequency values * - N_LongName (*attribute*) - frequency - @@ -1312,25 +1232,25 @@ This conventions is for HRTFs created under conditions where room information is - hertz - - m - - + - Unit of the values given in N * - Data_Real (*double*) - - [0, 0] - - mrne + - 0 + - mrn - m - - + - The real part of the complex spectrum * - Data_Imag (*double*) - - [0, 0] - - MRNE + - 0 + - MRN - m - - + - The imaginary part of the complex spectrum :ref:`back to top ` -.. _GeneralFIR-E_2.0: +.. _SimpleHeadphoneIR_1.0: -**GeneralFIR-E v2.0** +**SimpleHeadphoneIR v1.0** -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined +Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -1352,12 +1272,12 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR-E + - SimpleHeadphoneIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 + - 1.0 - - r, m - @@ -1392,10 +1312,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - * - GLOBAL_DataType (*attribute*) - - FIR-E + - FIR - - r, m - - We use FIR datatype which in addition depends on Emitters (E) + - We will store IRs here * - GLOBAL_History (*attribute*) - - @@ -1420,7 +1340,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - free field - - m - - The room information can be arbitrary + - Room type is not relevant here * - GLOBAL_Origin (*attribute*) - - @@ -1441,6 +1361,51 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - Correspondence to a database + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - Correspondence to a subject from the database + * - GLOBAL_ListenerDescription (*attribute*) + - + - + - + - Narrative description of the listener (or mannequin) + * - GLOBAL_SourceDescription (*attribute*) + - + - + - + - Narrative description of the headphones + * - GLOBAL_SourceManufacturer (*attribute*) + - + - + - + - Name of the headphones manufacturer + * - GLOBAL_SourceModel (*attribute*) + - + - + - + - Name of the headphone model. Must uniquely describe the headphones of the manufacturer + * - GLOBAL_SourceURI (*attribute*) + - + - + - + - URI of the headphone specifications + * - GLOBAL_ReceiverDescription (*attribute*) + - + - + - m + - Narrative description of the microphones + * - GLOBAL_EmitterDescription (*attribute*) + - + - + - m + - Narrative description of the headphone drivers * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -1457,8 +1422,8 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rCI, rCM - m - * - ReceiverPosition_Type (*attribute*) @@ -1472,10 +1437,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - SourcePosition (*double*) - - [0, 0, 1] + - [0, 0, 0] - IC, MC - m - - + - Default: Headphones are located at the position of the listener * - SourcePosition_Type (*attribute*) - spherical - @@ -1487,10 +1452,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM + - [[0, 0.09, 0], [0, -0.09, 0]] + - eCI, eCM - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E + - Default: Reflects the correspondence of each emitter to each receiver * - EmitterPosition_Type (*attribute*) - cartesian - @@ -1501,34 +1466,59 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - m - - * - Data_IR (*double*) + * - SourceManufacturer (*string*) + - [''] + - MS + - + - Optional M-dependent version of the attribute SourceManufucturer + * - SourceModel (*string*) + - [''] + - MS + - + - Optional M-dependent version of the attribute SourceModel + * - ReceiverDescriptions (*string*) + - [''] + - MS + - + - R-dependent version of the attribute ReceiverDescription + * - EmitterDescriptions (*string*) + - [''] + - MS + - + - E-dependent version of the attribute EmitterDescription + * - MeasurementDate (*double*) - 0 - - mrne + - M + - + - Optional M-dependent date and time of the measurement + * - Data_IR (*double*) + - [0, 0] + - mRn - m - - Impulse responses + - * - Data_SamplingRate (*double*) - 48000 - I, M - m - - Sampling rate of the samples in Data.IR and Data.Delay + - * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the sampling rate + - * - Data_Delay (*double*) - - 0 - - IRE, MRE + - [0, 0] + - IR, MR - m - - Additional delay of each IR (in samples) + - :ref:`back to top ` -.. _GeneralFIR_1.0: +.. _AnnotatedReceiverAudio_0.2: + +**AnnotatedReceiverAudio v0.2** -**GeneralFIR v1.0** -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined .. list-table:: :widths: 20 50 25 30 100 @@ -1550,12 +1540,12 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR + - AnnotatedReceiverAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 0.2 - - r, m - @@ -1587,13 +1577,13 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - - FIR + - Audio - - r, m - - We store IRs here + - * - GLOBAL_History (*attribute*) - - @@ -1618,7 +1608,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - free field - - m - - The room information can be arbitrary + - * - GLOBAL_Origin (*attribute*) - - @@ -1643,7 +1633,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - @@ -1655,10 +1645,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - @@ -1670,25 +1660,25 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - SourcePosition (*double*) - - [0, 0, 1] + - [0, 0, 0] - IC, MC - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - - spherical + - cartesian - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - eC, eCM - m - - + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - @@ -1699,49 +1689,79 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - - m - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. * - ListenerView (*double*) - [1, 0, 0] - IC, MC - - - - + - m + - Orientation of the head. IC if not tracked, MC if tracked. * - ListenerView_Type (*attribute*) - cartesian - - - + - m - * - ListenerView_Units (*attribute*) - metre - + - m - - - - * - Data_IR (*double*) + * - M (*double*) - 0 - - mrn - m - - Impulse responses + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time + - + - m + - Narrative name for M + * - M_Units (*attribute*) + - second + - + - m + - Units used for M + * - Response (*string*) + - [''] + - I, C, S + - + - the subject’s response + * - Response_Type (*attribute*) + - + - + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - + - + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - In, Rn + - m + - (binaural) audio data at the receivers; n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 - - I, M + - 44100 + - I - m - - Sampling rate of the samples in Data.IR and Data.Delay + - * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) + - :ref:`back to top ` -.. _GeneralSOS_1.0: +.. _SimpleFreeFieldHRSOS_1.0: -**GeneralSOS v1.0** +**SimpleFreeFieldHRSOS v1.0** -This conventions follows GeneralFIR but the data is stored as second-order section (SOS) coefficients. +This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. .. list-table:: :widths: 20 50 25 30 100 @@ -1763,7 +1783,7 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralSOS + - SimpleFreeFieldHRSOS - - r, m - @@ -1831,7 +1851,7 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - free field - - m - - The room information can be arbitrary + - * - GLOBAL_Origin (*attribute*) - - @@ -1852,6 +1872,16 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - name of the database to which these data belong + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -1867,24 +1897,9 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rCI, rCM - m - * - ReceiverPosition_Type (*attribute*) @@ -1901,7 +1916,7 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - [0, 0, 1] - IC, MC - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary + - Source position is assumed to vary for different directions/positions around the listener * - SourcePosition_Type (*attribute*) - spherical - @@ -1927,9 +1942,29 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - - m - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0]]] - - mrn + - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] + - mRn - m - Filter coefficients as SOS coefficients. * - Data_SamplingRate (*double*) @@ -1941,20 +1976,20 @@ This conventions follows GeneralFIR but the data is stored as second-order secti - hertz - - m - - Unit of the sampling rate + - * - Data_Delay (*double*) - - 0 + - [0, 0] - IR, MR - m - Broadband delay (in samples resulting from SamplingRate) :ref:`back to top ` -.. _GeneralTF-E_1.0: +.. _GeneralSOS_1.0: -**GeneralTF-E v1.0** +**GeneralSOS v1.0** -This conventions stores TFs depending in the Emiiter for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralTF +This conventions follows GeneralFIR but the data is stored as second-order section (SOS) coefficients. .. list-table:: :widths: 20 50 25 30 100 @@ -1976,7 +2011,7 @@ This conventions stores TFs depending in the Emiiter for general purposes, i.e., - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF-E + - GeneralSOS - - r, m - @@ -2016,10 +2051,10 @@ This conventions stores TFs depending in the Emiiter for general purposes, i.e., - - * - GLOBAL_DataType (*attribute*) - - TF-E + - SOS - - r, m - - We store frequency-dependent data depending on the emitter here + - Filters described as second-order section (SOS) coefficients * - GLOBAL_History (*attribute*) - - @@ -2080,6 +2115,21 @@ This conventions stores TFs depending in the Emiiter for general purposes, i.e., - - m - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - + - + * - ListenerView_Units (*attribute*) + - metre + - + - + - * - ReceiverPosition (*double*) - [0, 0, 0] - IC, RC, RCM @@ -2112,7 +2162,7 @@ This conventions stores TFs depending in the Emiiter for general purposes, i.e., - * - EmitterPosition (*double*) - [0, 0, 0] - - IC, EC, ECM + - eCI, eCM - m - * - EmitterPosition_Type (*attribute*) @@ -2125,39 +2175,34 @@ This conventions stores TFs depending in the Emiiter for general purposes, i.e., - - m - - * - N (*double*) - - 0 - - N + * - Data_SOS (*double*) + - [[[0, 0, 0, 1, 0, 0]]] + - mrn - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - + - Filter coefficients as SOS coefficients. + * - Data_SamplingRate (*double*) + - 48000 + - I, M - m - - narrative name of N - * - N_Units (*attribute*) + - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay + * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrne - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) + - Unit of the sampling rate + * - Data_Delay (*double*) - 0 - - MRNE + - IR, MR - m - - The imaginary part of the complex spectrum + - Broadband delay (in samples resulting from SamplingRate) :ref:`back to top ` -.. _GeneralTF_1.0: +.. _SimpleFreeFieldSOS_1.0: -**GeneralTF v1.0** +**SimpleFreeFieldSOS v1.0** -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. +This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. .. list-table:: :widths: 20 50 25 30 100 @@ -2179,7 +2224,7 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF + - SimpleFreeFieldSOS - - r, m - @@ -2216,13 +2261,13 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - - TF + - SOS - - r, m - - We store frequency-dependent data here + - Filters described as second-order section (SOS) coefficients * - GLOBAL_History (*attribute*) - - @@ -2247,7 +2292,7 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - free field - - m - - The room information can be arbitrary + - * - GLOBAL_Origin (*attribute*) - - @@ -2268,6 +2313,16 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - name of the database to which these data belong + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -2284,7 +2339,7 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - m - * - ReceiverPosition (*double*) - - [0, 0, 0] + - [[0, 0.09, 0], [0, -0.09, 0]] - rCI, rCM - m - @@ -2302,7 +2357,7 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - [0, 0, 1] - IC, MC - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary + - Source position is assumed to vary for different directions/positions around the listener * - SourcePosition_Type (*attribute*) - spherical - @@ -2328,39 +2383,54 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - - m - - * - N (*double*) - - 0 - - N + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - ListenerView_Type (*attribute*) + - cartesian - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 + - + * - ListenerView_Units (*attribute*) + - metre + - + - m + - + * - Data_SOS (*double*) + - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - mRn - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN + - Filter coefficients as SOS coefficients. + * - Data_SamplingRate (*double*) + - 48000 + - I - m - - The imaginary part of the complex spectrum + - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay + * - Data_SamplingRate_Units (*attribute*) + - hertz + - + - m + - + * - Data_Delay (*double*) + - [0, 0] + - IR, MR + - m + - Broadband delay (in samples resulting from SamplingRate) :ref:`back to top ` -.. _GeneralTF_2.0: +.. _GeneralFIR_1.0: -**GeneralTF v2.0** +**GeneralFIR v1.0** -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. +This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined .. list-table:: :widths: 20 50 25 30 100 @@ -2382,12 +2452,12 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF + - GeneralFIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 + - 1.0 - - r, m - @@ -2419,13 +2489,13 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA * - GLOBAL_Comment (*attribute*) - - - - + - m - * - GLOBAL_DataType (*attribute*) - - TF + - FIR - - r, m - - We store frequency-dependent data here + - We store IRs here * - GLOBAL_History (*attribute*) - - @@ -2518,7 +2588,7 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - * - EmitterPosition (*double*) - [0, 0, 0] - - eC, eCM + - eCI, eCM - m - * - EmitterPosition_Type (*attribute*) @@ -2531,39 +2601,49 @@ This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA - - m - - * - N (*double*) + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - + - + * - ListenerView_Type (*attribute*) + - cartesian + - + - + - + * - ListenerView_Units (*attribute*) + - metre + - + - + - + * - Data_IR (*double*) - 0 - - N + - mrn - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - + - Impulse responses + * - Data_SamplingRate (*double*) + - 48000 + - I, M - m - - narrative name of N - * - N_Units (*attribute*) + - Sampling rate of the samples in Data.IR and Data.Delay + * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) + - Unit of the sampling rate + * - Data_Delay (*double*) - 0 - - MRN + - IR, MR - m - - The imaginary part of the complex spectrum + - Additional delay of each IR (in samples) :ref:`back to top ` -.. _SimpleFreeFieldHRIR_1.0: +.. _GeneralFIR-E_2.0: -**SimpleFreeFieldHRIR v1.0** +**GeneralFIR-E v2.0** -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant +This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined .. list-table:: :widths: 20 50 25 30 100 @@ -2585,12 +2665,12 @@ This convention set is for HRIRs recorded under free-field conditions or other I - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR + - GeneralFIR-E - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 2.0 - - r, m - @@ -2625,10 +2705,10 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - * - GLOBAL_DataType (*attribute*) - - FIR + - FIR-E - - r, m - - + - We use FIR datatype which in addition depends on Emitters (E) * - GLOBAL_History (*attribute*) - - @@ -2653,7 +2733,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - free field - - m - - + - The room information can be arbitrary * - GLOBAL_Origin (*attribute*) - - @@ -2674,16 +2754,6 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -2700,8 +2770,8 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - [0, 0, 0] + - IC, RC, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -2718,7 +2788,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - [0, 0, 1] - IC, MC - m - - Source position is assumed to vary for different directions/positions around the listener + - * - SourcePosition_Type (*attribute*) - spherical - @@ -2731,9 +2801,9 @@ This convention set is for HRIRs recorded under free-field conditions or other I - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - IC, EC, ECM - m - - + - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E * - EmitterPosition_Type (*attribute*) - cartesian - @@ -2744,74 +2814,34 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - m - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - SourceView_Type (*attribute*) - - cartesian - - - - - - - * - SourceView_Units (*attribute*) - - metre - - - - - - * - Data_IR (*double*) - - [0, 0] - - mRn + - 0 + - mrne - m - - + - Impulse responses * - Data_SamplingRate (*double*) - 48000 - I, M - m - - + - Sampling rate of the samples in Data.IR and Data.Delay * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - + - Unit of the sampling rate * - Data_Delay (*double*) - - [0, 0] - - IR, MR + - 0 + - IRE, MRE - m - - + - Additional delay of each IR (in samples) :ref:`back to top ` -.. _SimpleFreeFieldHRSOS_1.0: +.. _SingleRoomMIMOSRIR_1.0: -**SimpleFreeFieldHRSOS v1.0** +**SingleRoomMIMOSRIR v1.0** -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. +Single-room multiple-input multiple-output spatial room impulse responses, depending on Emitters .. list-table:: :widths: 20 50 25 30 100 @@ -2833,7 +2863,7 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRSOS + - SingleRoomMIMOSRIR - - r, m - @@ -2842,437 +2872,379 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - - r, m - - * - GLOBAL_APIName (*attribute*) - - + * - GLOBAL_DataType (*attribute*) + - FIR-E - - r, m + - Shall be FIR-E + * - GLOBAL_RoomType (*attribute*) + - shoebox - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m + - m + - Shall be 'shoebox' or 'dae' + * - GLOBAL_Title (*attribute*) - - * - GLOBAL_ApplicationName (*attribute*) - + - m - + * - GLOBAL_DateCreated (*attribute*) - - - * - GLOBAL_ApplicationVersion (*attribute*) + - m - + * - GLOBAL_DateModified (*attribute*) - - + - m - - * - GLOBAL_AuthorContact (*attribute*) + * - GLOBAL_APIName (*attribute*) - - - - m + - r, m - - * - GLOBAL_Comment (*attribute*) + * - GLOBAL_APIVersion (*attribute*) - - + - r, m - + * - GLOBAL_AuthorContact (*attribute*) - - * - GLOBAL_DataType (*attribute*) - - SOS - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) + - m - + * - GLOBAL_Organization (*attribute*) - - + - m - * - GLOBAL_License (*attribute*) - No license provided, ask the author for permission - - m - - * - GLOBAL_Organization (*attribute*) + * - GLOBAL_ApplicationName (*attribute*) - - - - m - - * - GLOBAL_References (*attribute*) - + * - GLOBAL_ApplicationVersion (*attribute*) - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - m + * - GLOBAL_Comment (*attribute*) - - * - GLOBAL_Origin (*attribute*) - - - + * - GLOBAL_History (*attribute*) - - * - GLOBAL_DateCreated (*attribute*) - - - - m - - * - GLOBAL_DateModified (*attribute*) + * - GLOBAL_References (*attribute*) - - - - m - - * - GLOBAL_Title (*attribute*) - + * - GLOBAL_Origin (*attribute*) - - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) + * - GLOBAL_DatabaseName (*attribute*) - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m + - Name of the database. Used for classification of the data. + * - GLOBAL_RoomShortName (*attribute*) - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - m - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m + - Short name of the Room + * - GLOBAL_RoomDescription (*attribute*) - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - m + - Informal verbal description of the room + * - GLOBAL_RoomLocation (*attribute*) - - * - ReceiverPosition_Units (*attribute*) - - metre - - - m - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical + - Location of the room + * - GLOBAL_RoomGeometry (*attribute*) - - - m - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m + - URI to a file describing the room geometry. + * - GLOBAL_ListenerShortName (*attribute*) - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - m - - * - EmitterPosition_Units (*attribute*) - - metre - - - m + * - GLOBAL_ListenerDescription (*attribute*) - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - * - ListenerView_Type (*attribute*) - - cartesian - - - m + * - GLOBAL_ReceiverShortName (*attribute*) - - * - ListenerView_Units (*attribute*) - - metre - - - m - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - m + * - GLOBAL_ReceiverDescription (*attribute*) - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleFreeFieldHRTF_1.0: - -**SimpleFreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - r, m - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - r, m + * - GLOBAL_SourceShortName (*attribute*) - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRTF - - - r, m - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - r, m + * - GLOBAL_SourceDescription (*attribute*) - - * - GLOBAL_APIName (*attribute*) - - - - r, m - - * - GLOBAL_APIVersion (*attribute*) + * - GLOBAL_EmitterShortName (*attribute*) - - - - r, m - - * - GLOBAL_ApplicationName (*attribute*) - + * - GLOBAL_EmitterDescription (*attribute*) - - - - * - GLOBAL_ApplicationVersion (*attribute*) - + * - RoomTemperature (*double*) + - 0 + - I, M - + - Temperature during measurements, given in Kelvin. + * - RoomTemperature_Units (*attribute*) + - kelvin - - - * - GLOBAL_AuthorContact (*attribute*) + - Units of the room temperature + * - RoomVolume (*double*) + - 0 + - I, MI - + - Volume of the room + * - RoomVolume_Units (*attribute*) + - cubic metre - - - m - - * - GLOBAL_Comment (*attribute*) + - Units of the room volume + * - RoomCornerA (*double*) + - [0, 0, 0] + - IC, MC - - + * - RoomCornerB (*double*) + - [1, 2, 3] + - IC, MC - - - * - GLOBAL_DataType (*attribute*) - - TF + * - RoomCorners (*double*) + - 0 + - II - - - r, m + - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units + * - RoomCorners_Type (*attribute*) + - cartesian - - * - GLOBAL_History (*attribute*) - - + * - RoomCorners_Units (*attribute*) + - metre - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - + * - ListenerPosition (*double*) + - [0, 0, 0] + - MC - m - - * - GLOBAL_ListenerShortName (*attribute*) - - + * - ListenerPosition_Type (*attribute*) + - cartesian - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - + * - ListenerPosition_Units (*attribute*) + - metre - - m - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC - m - - * - GLOBAL_Origin (*attribute*) - - - - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m - + * - ListenerView_Type (*attribute*) + - cartesian - - * - GLOBAL_DateCreated (*attribute*) + - m - + * - ListenerView_Units (*attribute*) + - metre - - m - - * - GLOBAL_DateModified (*attribute*) - - + * - ReceiverDescriptions (*string*) + - [''] + - RS, RSM - + - R-dependent version of the attribute ReceiverDescription + * - ReceiverPosition (*double*) + - [0, 0, 0] + - IC, RCI, RCM - m - - * - GLOBAL_Title (*attribute*) + * - ReceiverPosition_Type (*attribute*) + - spherical - + - m + - Can be of any type enabling both spatially discrete and spatially continuous representations. + * - ReceiverPosition_Units (*attribute*) + - degree, degree, metre - - m - - * - GLOBAL_DatabaseName (*attribute*) + * - ReceiverView (*double*) + - [1, 0, 0] + - RCI, RCM - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m + * - ReceiverUp (*double*) + - [0, 0, 1] + - RCI, RCM - - * - ListenerPosition_Type (*attribute*) + - + * - ReceiverView_Type (*attribute*) - cartesian - - - m - - * - ListenerPosition_Units (*attribute*) + - + * - ReceiverView_Units (*attribute*) - metre - - - m - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - + * - SourcePosition (*double*) + - [0, 0, 1] + - MC - m - - * - ReceiverPosition_Type (*attribute*) + * - SourcePosition_Type (*attribute*) - cartesian - - m - - * - ReceiverPosition_Units (*attribute*) + * - SourcePosition_Units (*attribute*) - metre - - m - - * - SourcePosition (*double*) + * - SourceView (*double*) + - [1, 0, 0] + - IC, MC + - m + - + * - SourceUp (*double*) - [0, 0, 1] - IC, MC - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical + - + * - SourceView_Type (*attribute*) + - cartesian - - m - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + * - SourceView_Units (*attribute*) + - metre - - m - + * - EmitterDescriptions (*string*) + - [''] + - ES, ESM + - + - E-dependent version of the attribute EmitterDescription * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - IC, ECI, ECM - m - - + - Can be of any type enabling both spatially discrete and spatially continuous representations. * - EmitterPosition_Type (*attribute*) - - cartesian + - spherical - - m - * - EmitterPosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - - * - ListenerUp (*double*) + * - EmitterView (*double*) + - [1, 0, 0] + - ECI, ECM + - + - + * - EmitterUp (*double*) - [0, 0, 1] - - IC, MC - - m + - ECI, ECM - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - * - ListenerView_Type (*attribute*) + * - EmitterView_Type (*attribute*) - cartesian - - - m - - * - ListenerView_Units (*attribute*) - - metre - - - m + * - EmitterView_Units (*attribute*) + - metre + - + - + - + * - MeasurementDate (*double*) + - 0 + - M - - * - N (*double*) + - Optional M-dependent date and time of the measurement. + * - Data_IR (*double*) - 0 - - N + - mrne - m - - - * - N_LongName (*attribute*) - - frequency - - + - Impulse responses + * - Data_SamplingRate (*double*) + - 48000 + - I, M - m - - narrative name of N - * - N_Units (*attribute*) + - Sampling rate of the samples in Data.IR and Data.Delay + * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN + - Unit of the sampling rate + * - Data_Delay (*double*) + - 0 + - IRI, MRI, MRE - m - - + - Additional delay of each IR (in samples) :ref:`back to top ` -.. _SimpleFreeFieldSOS_1.0: +.. _SimpleFreeFieldHRIR_1.0: -**SimpleFreeFieldSOS v1.0** +**SimpleFreeFieldHRIR v1.0** -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. +This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant .. list-table:: :widths: 20 50 25 30 100 @@ -3289,12 +3261,12 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldSOS + - SimpleFreeFieldHRIR - - r, m - @@ -3334,10 +3306,10 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - - * - GLOBAL_DataType (*attribute*) - - SOS + - FIR - - r, m - - Filters described as second-order section (SOS) coefficients + - * - GLOBAL_History (*attribute*) - - @@ -3473,16 +3445,36 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - - m - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - + - + * - SourceView (*double*) + - [1, 0, 0] + - IC, MC + - + - + * - SourceView_Type (*attribute*) + - cartesian + - + - + - + * - SourceView_Units (*attribute*) + - metre + - + - + - + * - Data_IR (*double*) + - [0, 0] - mRn - m - - Filter coefficients as SOS coefficients. + - * - Data_SamplingRate (*double*) - 48000 - - I + - I, M - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay + - * - Data_SamplingRate_Units (*attribute*) - hertz - @@ -3492,15 +3484,15 @@ This convention set follows SimpleFreeFieldHRIR but the data is stored as second - [0, 0] - IR, MR - m - - Broadband delay (in samples resulting from SamplingRate) + - :ref:`back to top ` -.. _SimpleHeadphoneIR_1.0: +.. _FreeFieldHRTF_1.0: -**SimpleHeadphoneIR v1.0** +**FreeFieldHRTF v1.0** -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. +This conventions is for HRTFs created under conditions where room information is irrelevant and stored as SH coefficients .. list-table:: :widths: 20 50 25 30 100 @@ -3522,7 +3514,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR + - FreeFieldHRTF - - r, m - @@ -3562,10 +3554,10 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - * - GLOBAL_DataType (*attribute*) - - FIR + - TF-E - - r, m - - We will store IRs here + - * - GLOBAL_History (*attribute*) - - @@ -3576,6 +3568,11 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - m - + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - GLOBAL_Organization (*attribute*) - - @@ -3590,7 +3587,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - free field - - m - - Room type is not relevant here + - * - GLOBAL_Origin (*attribute*) - - @@ -3615,47 +3612,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers + - Name of the database to which these data belong * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -3673,7 +3630,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - RCI, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -3690,7 +3647,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - [0, 0, 0] - IC, MC - m - - Default: Headphones are located at the position of the listener + - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener * - SourcePosition_Type (*attribute*) - spherical - @@ -3702,73 +3659,73 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - m - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM + - [0, 0, 0] + - IC, ECI, ECM - m - - Default: Reflects the correspondence of each emitter to each receiver + - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' * - EmitterPosition_Type (*attribute*) - - cartesian + - spherical harmonics - - m - - + - Can be 'spherical harmonics', 'cartesian', or 'spherical' * - EmitterPosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - - * - SourceManufacturer (*string*) - - [''] - - MS + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescriptions (*string*) - - [''] - - MS + * - ListenerView_Type (*attribute*) + - cartesian - - - R-dependent version of the attribute ReceiverDescription - * - EmitterDescriptions (*string*) - - [''] - - MS + - m - - - E-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M + * - ListenerView_Units (*attribute*) + - metre - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - m - - * - Data_SamplingRate (*double*) - - 48000 - - I, M + * - N (*double*) + - 0 + - N - m - - * - Data_SamplingRate_Units (*attribute*) + * - N_LongName (*attribute*) + - frequency + - + - m + - narrative name of N + * - N_Units (*attribute*) - hertz - - m - - * - Data_Delay (*double*) + * - Data_Real (*double*) - [0, 0] - - IR, MR + - mrne + - m + - + * - Data_Imag (*double*) + - [0, 0] + - MRNE - m - :ref:`back to top ` -.. _SingleRoomMIMOSRIR_1.0: +.. _AnnotatedEmitterAudio_0.2: + +**AnnotatedEmitterAudio v0.2** -**SingleRoomMIMOSRIR v1.0** -Single-room multiple-input multiple-output spatial room impulse responses, depending on Emitters .. list-table:: :widths: 20 50 25 30 100 @@ -3785,44 +3742,19 @@ Single-room multiple-input multiple-output spatial room impulse responses, depen - r, m - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomMIMOSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - Shall be FIR-E - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) + - 2.1 - + - r, m - - - m + * - GLOBAL_SOFAConventions (*attribute*) + - AnnotatedEmitterAudio - - * - GLOBAL_DateModified (*attribute*) + - r, m - + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 0.2 - - - m + - r, m - * - GLOBAL_APIName (*attribute*) - @@ -3834,336 +3766,404 @@ Single-room multiple-input multiple-output spatial room impulse responses, depen - - r, m - - * - GLOBAL_AuthorContact (*attribute*) + * - GLOBAL_ApplicationName (*attribute*) - - - - m - - * - GLOBAL_Organization (*attribute*) + - + * - GLOBAL_ApplicationVersion (*attribute*) - - - - m - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - m + * - GLOBAL_AuthorContact (*attribute*) - - * - GLOBAL_ApplicationName (*attribute*) - + - m - + * - GLOBAL_Comment (*attribute*) - - - * - GLOBAL_ApplicationVersion (*attribute*) - - + * - GLOBAL_DataType (*attribute*) + - Audio - + - r, m - - * - GLOBAL_Comment (*attribute*) + * - GLOBAL_History (*attribute*) - - - - - * - GLOBAL_History (*attribute*) + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission + - + - m - + * - GLOBAL_Organization (*attribute*) - - + - m - * - GLOBAL_References (*attribute*) - - - - + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - * - GLOBAL_Origin (*attribute*) - - - - - * - GLOBAL_DatabaseName (*attribute*) + * - GLOBAL_DateCreated (*attribute*) - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - + * - GLOBAL_DateModified (*attribute*) - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) + - m - + * - GLOBAL_Title (*attribute*) - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) + - m - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the head. IC if not tracked, MC if tracked. + * - ListenerPosition_Type (*attribute*) + - cartesian - + - m - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) + * - ListenerPosition_Units (*attribute*) + - metre - + - m - + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM + - m + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) + - cartesian - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) + - m - + * - ReceiverPosition_Units (*attribute*) + - metre - + - m - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC + - m + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian - - * - GLOBAL_ListenerDescription (*attribute*) + - m - + * - SourcePosition_Units (*attribute*) + - metre - + - m - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eC, eCM + - m + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) + - cartesian - - * - GLOBAL_ReceiverShortName (*attribute*) + - m - + * - EmitterPosition_Units (*attribute*) + - metre - + - m - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian - - * - GLOBAL_ReceiverDescription (*attribute*) + - m - + * - ListenerView_Units (*attribute*) + - metre - + - m - + * - M (*double*) + - 0 + - m + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time - - * - GLOBAL_SourceShortName (*attribute*) + - m + - Narrative name for M + * - M_Units (*attribute*) + - second - + - m + - Units used for M + * - Response (*string*) + - [''] + - I, C, S - + - the subject’s response + * - Response_Type (*attribute*) - - - * - GLOBAL_SourceDescription (*attribute*) - + - type depends on the dimension + * - Response_LongName (*attribute*) - - - - * - GLOBAL_EmitterShortName (*attribute*) + - narrative description of the response type + * - Data_Emitter (*double*) + - [0, 0] + - In, En + - m + - audio data at the emitter(s); n=number of audio samples + * - Data_SamplingRate (*double*) + - 44100 + - I + - m - + * - Data_SamplingRate_Units (*attribute*) + - hertz - + - m - + +:ref:`back to top ` + +.. _GeneralTF_1.0: + +**GeneralTF v1.0** + +This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. + +.. list-table:: + :widths: 20 50 25 30 100 + :header-rows: 1 + + * - Name (Type) + - Default + - Dim. + - Flags + - Comment + * - GLOBAL_Conventions (*attribute*) + - SOFA - - * - GLOBAL_EmitterDescription (*attribute*) + - r, m - + * - GLOBAL_Version (*attribute*) + - 1.0 - + - r, m - + * - GLOBAL_SOFAConventions (*attribute*) + - GeneralTF - - * - RoomTemperature (*double*) - - 0 - - I, M + - r, m - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin + * - GLOBAL_SOFAConventionsVersion (*attribute*) + - 1.0 - + - r, m - - - Units of the room temperature - * - RoomVolume (*double*) - - 0 - - I, MI + * - GLOBAL_APIName (*attribute*) - - - Volume of the room - * - RoomVolume_Units (*attribute*) - - cubic metre - + - r, m - - - Units of the room volume - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC + * - GLOBAL_APIVersion (*attribute*) - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC + - r, m - + * - GLOBAL_ApplicationName (*attribute*) - - * - RoomCorners (*double*) - - 0 - - II - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - + * - GLOBAL_ApplicationVersion (*attribute*) - - * - RoomCorners_Units (*attribute*) - - metre - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m + * - GLOBAL_AuthorContact (*attribute*) - - * - ListenerPosition_Type (*attribute*) - - cartesian - - m - - * - ListenerPosition_Units (*attribute*) - - metre + * - GLOBAL_Comment (*attribute*) - - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - m - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m + * - GLOBAL_DataType (*attribute*) + - TF - - * - ListenerView_Type (*attribute*) - - cartesian + - r, m + - We store frequency-dependent data here + * - GLOBAL_History (*attribute*) - - - m - - * - ListenerView_Units (*attribute*) - - metre - - - m - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - m - - * - ReceiverPosition_Type (*attribute*) - - spherical + * - GLOBAL_Organization (*attribute*) - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - m - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM + * - GLOBAL_References (*attribute*) - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - * - ReceiverView_Type (*attribute*) - - cartesian + * - GLOBAL_RoomType (*attribute*) + - free field + - + - m + - The room information can be arbitrary + * - GLOBAL_Origin (*attribute*) - - - - * - ReceiverView_Units (*attribute*) - - metre - + * - GLOBAL_DateCreated (*attribute*) - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - m - - * - SourcePosition_Type (*attribute*) - - cartesian + * - GLOBAL_DateModified (*attribute*) + - - - m - - * - SourcePosition_Units (*attribute*) - - metre + * - GLOBAL_Title (*attribute*) - - - m - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - m - - * - SourceUp (*double*) - - [0, 0, 1] + * - ListenerPosition (*double*) + - [0, 0, 0] - IC, MC - m - - * - SourceView_Type (*attribute*) + * - ListenerPosition_Type (*attribute*) - cartesian - - m - - * - SourceView_Units (*attribute*) + * - ListenerPosition_Units (*attribute*) - metre - - m - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) + * - ReceiverPosition (*double*) - [0, 0, 0] - - IC, ECI, ECM - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - EmitterPosition_Type (*attribute*) - - spherical - - + - rCI, rCM - m - - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre + * - ReceiverPosition_Type (*attribute*) + - cartesian - - m - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM + * - ReceiverPosition_Units (*attribute*) + - metre - + - m - - * - EmitterUp (*double*) + * - SourcePosition (*double*) - [0, 0, 1] - - ECI, ECM + - IC, MC + - m + - In order to store different directions/positions around the listener, SourcePosition is assumed to vary + * - SourcePosition_Type (*attribute*) + - spherical - + - m - - * - EmitterView_Type (*attribute*) - - cartesian + * - SourcePosition_Units (*attribute*) + - degree, degree, metre - + - m - + * - EmitterPosition (*double*) + - [0, 0, 0] + - eCI, eCM + - m - - * - EmitterView_Units (*attribute*) - - metre + * - EmitterPosition_Type (*attribute*) + - cartesian - + - m - + * - EmitterPosition_Units (*attribute*) + - metre - - * - MeasurementDate (*double*) - - 0 - - M + - m - - - Optional M-dependent date and time of the measurement. - * - Data_IR (*double*) + * - N (*double*) - 0 - - mrne + - N - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M + - Frequency values + * - N_LongName (*attribute*) + - frequency + - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) + - narrative name of N + * - N_Units (*attribute*) - hertz - - m - - Unit of the sampling rate - * - Data_Delay (*double*) + - Unit of the values given in N + * - Data_Real (*double*) - 0 - - IRI, MRI, MRE + - mRn - m - - Additional delay of each IR (in samples) + - The real part of the complex spectrum + * - Data_Imag (*double*) + - 0 + - MRN + - m + - The imaginary part of the complex spectrum :ref:`back to top ` @@ -4573,13 +4573,13 @@ For measuring SRIRs in a single room with a single excitation source (e.g., a lo Deprecated ========== -.. _AnnotatedEmitterAudio_0.1: - -**AnnotatedEmitterAudio v0.1** +.. _FreeFieldDirectivityTF_1.0: -This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. +**FreeFieldDirectivityTF v1.0** +This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. +This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. .. list-table:: :widths: 20 50 25 30 100 @@ -4601,100 +4601,125 @@ This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` -.. _AnnotatedReceiverAudio_0.1: - -**AnnotatedReceiverAudio v0.1** +.. _SingleRoomDRIR_0.2: -This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. +**SingleRoomDRIR v0.2** +This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. +This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -4841,17 +4901,17 @@ This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` -.. _FreeFieldDirectivityTF_1.0: +.. _SimpleHeadphoneIR_0.2: -**FreeFieldDirectivityTF v1.0** +**SimpleHeadphoneIR v0.2** -This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. +This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. +Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -5086,57 +5151,62 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - r, m - * - GLOBAL_Version (*attribute*) - - 2.1 + - 1.0 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF + - SimpleHeadphoneIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 0.2 - - r, m - - * - GLOBAL_DataType (*attribute*) - - TF + * - GLOBAL_APIName (*attribute*) + - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) + * - GLOBAL_APIVersion (*attribute*) - - - - m + - r, m - - * - GLOBAL_DateCreated (*attribute*) + * - GLOBAL_ApplicationName (*attribute*) - - - - m - - * - GLOBAL_DateModified (*attribute*) + - + * - GLOBAL_ApplicationVersion (*attribute*) + - + - + - + - + * - GLOBAL_AuthorContact (*attribute*) - - - m - - * - GLOBAL_APIName (*attribute*) + * - GLOBAL_Comment (*attribute*) - - - - r, m + - m - - * - GLOBAL_APIVersion (*attribute*) + * - GLOBAL_DataType (*attribute*) + - FIR + - + - r, m + - We will store IRs here + * - GLOBAL_History (*attribute*) - - - - r, m - - * - GLOBAL_AuthorContact (*attribute*) - + * - GLOBAL_License (*attribute*) + - No license provided, ask the author for permission - - m - @@ -5145,71 +5215,86 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - - m - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m + * - GLOBAL_References (*attribute*) - - * - GLOBAL_ApplicationName (*attribute*) - - - + * - GLOBAL_RoomType (*attribute*) + - free field - - * - GLOBAL_ApplicationVersion (*attribute*) + - m + - Room type is not relevant here + * - GLOBAL_Origin (*attribute*) - - - - - * - GLOBAL_Comment (*attribute*) + * - GLOBAL_DateCreated (*attribute*) - - - m - - * - GLOBAL_History (*attribute*) + * - GLOBAL_DateModified (*attribute*) - - + - m - + * - GLOBAL_Title (*attribute*) - - * - GLOBAL_References (*attribute*) - + - m - + * - GLOBAL_DatabaseName (*attribute*) - - - * - GLOBAL_Origin (*attribute*) + - m + - Correspondence to a database + * - GLOBAL_ListenerShortName (*attribute*) - - + - m + - Correspondence to a subject from the database + * - GLOBAL_ListenerDescription (*attribute*) - - - * - GLOBAL_DatabaseName (*attribute*) + - m + - Narrative description of the listener (or mannequin) + * - GLOBAL_SourceDescription (*attribute*) - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) + - Narrative description of the headphones + * - GLOBAL_SourceManufacturer (*attribute*) - - + - m + - Name of the headphones manufacturer + * - GLOBAL_SourceModel (*attribute*) - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - + - m + - Name of the headphone model. Must uniquely describe the headphones of the manufacturer + * - GLOBAL_SourceURI (*attribute*) - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) + - m + - URI of the headphone specifications + * - GLOBAL_ReceiverDescription (*attribute*) - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) + - Narrative description of the microphones + * - GLOBAL_EmitterDescription (*attribute*) - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' + - Narrative description of the headphone drivers * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the microphone array during the measurements. + - * - ListenerPosition_Type (*attribute*) - cartesian - @@ -5220,38 +5305,18 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - - m - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array * - ReceiverPosition (*double*) - - [0, 0, 1] - - IC, RC, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rCI, rCM - m - - Positions of the microphones during the measurements (relative to the Listener) + - * - ReceiverPosition_Type (*attribute*) - - spherical + - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre + - metre - - m - @@ -5259,57 +5324,22 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - [0, 0, 0] - IC, MC - m - - Position of the acoustic source (instrument) + - Default: Headphones are located at the position of the listener * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the acoustic source (instrument) - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - + - degree, degree, metre - - m - - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - m - - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, MC + - [[0, 0.09, 0], [0, -0.09, 0]] + - eCI, eCM - m - - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. + - Default: Reflects the correspondence of each emitter to each receiver * - EmitterPosition_Type (*attribute*) - cartesian - @@ -5320,61 +5350,61 @@ This conventions stores directivities of acoustic sources (instruments, loudspea - - m - - * - EmitterDescription (*string*) + * - SourceManufacturer (*string*) - [''] - - IS, MS + - MS - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M + - Optional M-dependent version of the attribute SourceManufucturer + * - SourceModel (*string*) + - [''] + - MS - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) + - Optional M-dependent version of the attribute SourceModel + * - ReceiverDescription (*string*) - [''] - MS - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M + - Optional M-dependent version of the attribute ReceiverDescription + * - EmitterDescription (*string*) + - [''] + - MS - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) + - Optional M-dependent version of the attribute EmitterDescription + * - MeasurementDate (*double*) - 0 - - N + - M + - + - Optional M-dependent date and time of the measurement + * - Data_IR (*double*) + - [0, 0] + - mRn - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - + * - Data_SamplingRate (*double*) + - 48000 + - I - m - - * - N_Units (*attribute*) + * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN + - + * - Data_Delay (*double*) + - [0, 0] + - IR, MR - m - - Imaginary part of the complex spectrum + - :ref:`back to top ` -.. _GeneralFIRE_1.0: +.. _AnnotatedEmitterAudio_0.1: -**GeneralFIRE v1.0** +**AnnotatedEmitterAudio v0.1** + +This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. -This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined .. list-table:: :widths: 20 50 25 30 100 @@ -5391,17 +5421,17 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIRE + - AnnotatedEmitterAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 + - 0.1 - - r, m - @@ -5433,13 +5463,13 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - - FIRE + - Audio - - r, m - - We use FIR datatype which in addition depends on Emitters (E) + - * - GLOBAL_History (*attribute*) - - @@ -5464,7 +5494,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - free field - - m - - The room information can be arbitrary + - * - GLOBAL_Origin (*attribute*) - - @@ -5489,7 +5519,7 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - @@ -5501,10 +5531,10 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - @@ -5516,65 +5546,110 @@ This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA - m - * - SourcePosition (*double*) - - [0, 0, 1] + - [0, 0, 0] - IC, MC - m - - + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - - spherical + - cartesian - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - eC, eCM - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - - m - - * - EmitterPosition_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) + - metre + - + - m + - + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian + - + - m + - + * - ListenerView_Units (*attribute*) - metre - - m - - * - Data_IR (*double*) + * - M (*double*) - 0 - - mREn - m - - Impulse responses + - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time + - + - m + - Narrative name for M + * - M_Units (*attribute*) + - second + - + - m + - Units used for M + * - Response (*attribute*) + - + - I, C, S + - + - the subject’s response + * - Response_Type (*attribute*) + - + - I, C, S + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - S + - + - narrative description of the response type + * - Data_Emitter (*double*) + - [0, 0] + - In, En + - m + - audio data at the emitter(s); n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - - Sampling rate of the samples in Data.IR and Data.Delay + - * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) + - :ref:`back to top ` -.. _MultiSpeakerBRIR_0.3: +.. _GeneralFIRE_1.0: -**MultiSpeakerBRIR v0.3** +**GeneralFIRE v1.0** -This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. +This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. -This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. +This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined .. list-table:: :widths: 20 50 25 30 100 @@ -5596,12 +5671,12 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - MultiSpeakerBRIR + - GeneralFIRE - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 + - 1.0 - - r, m - @@ -5661,10 +5736,10 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - - * - GLOBAL_RoomType (*attribute*) - - reverberant + - free field - - m - - + - The room information can be arbitrary * - GLOBAL_Origin (*attribute*) - - @@ -5685,21 +5760,6 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - narrative description of the room * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -5716,7 +5776,7 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] + - [0, 0, 0] - rCI, rCM - m - @@ -5760,76 +5820,36 @@ This convention is for BRIRs recorded in reverberant conditions from multiple lo - - m - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - When EmitterUp provided, EmitterView must be provided as well - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - When EmitterView provided, EmitterUp must be provided as well - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - * - Data_IR (*double*) - - [1, 1] + - 0 - mREn - m - - + - Impulse responses * - Data_SamplingRate (*double*) - 48000 - I - m - - + - Sampling rate of the samples in Data.IR and Data.Delay * - Data_SamplingRate_Units (*attribute*) - hertz - - m - - + - Unit of the sampling rate * - Data_Delay (*double*) - - [0, 0] + - 0 - IRE, MRE - m - - + - Additional delay of each IR (in samples) :ref:`back to top ` -.. _SimpleFreeFieldHRIR_0.4: +.. _SingleRoomDRIR_0.3: -**SimpleFreeFieldHRIR v0.4** +**SingleRoomDRIR v0.3** -This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. +This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant +This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -5851,12 +5871,12 @@ This convention set is for HRIRs recorded under free-field conditions or other I - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR + - SingleRoomDRIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 + - 0.3 - - r, m - @@ -5888,7 +5908,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I * - GLOBAL_Comment (*attribute*) - - - - + - m - * - GLOBAL_DataType (*attribute*) - FIR @@ -5916,7 +5936,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - * - GLOBAL_RoomType (*attribute*) - - free field + - reverberant - - m - @@ -5944,12 +5964,12 @@ This convention set is for HRIRs recorded under free-field conditions or other I - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) + - + * - GLOBAL_RoomDescription (*attribute*) - - - m - - ID of the subject from the database + - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -5961,13 +5981,13 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - [0, 0, 0] + - RCI, RCM - m - * - ReceiverPosition_Type (*attribute*) @@ -5976,22 +5996,22 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - * - SourcePosition (*double*) - - [0, 0, 1] + - [0, 0, 0] - IC, MC - m - - Source position is assumed to vary for different directions/positions around the listener + - * - SourcePosition_Type (*attribute*) - - spherical + - cartesian - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, meter + - metre - - m - @@ -6006,7 +6026,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - @@ -6026,13 +6046,33 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - ListenerView_Units (*attribute*) - - meter + - metre + - + - m + - + * - SourceUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - + * - SourceView (*double*) + - [-1, 0, 0] + - IC, MC + - m + - + * - SourceView_Type (*attribute*) + - cartesian + - + - m + - + * - SourceView_Units (*attribute*) + - metre - - m - * - Data_IR (*double*) - - [1, 1] - - mRn + - [0] + - mrn - m - * - Data_SamplingRate (*double*) @@ -6046,7 +6086,7 @@ This convention set is for HRIRs recorded under free-field conditions or other I - m - * - Data_Delay (*double*) - - [0, 0] + - [0] - IR, MR - m - @@ -6523,13 +6563,13 @@ This conventions is for TFs created under conditions where room information is i :ref:`back to top ` -.. _SimpleHeadphoneIR_0.1: +.. _SingleTrackedAudio_0.1: -**SimpleHeadphoneIR v0.1** +**SingleTrackedAudio v0.1** + +This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -6546,12 +6586,12 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR + - SingleTrackedAudio - - r, m - @@ -6588,13 +6628,13 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - FIR - - r, m - - We will store IRs here + - * - GLOBAL_History (*attribute*) - - @@ -6619,99 +6659,54 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - free field - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) + * - GLOBAL_Origin (*attribute*) - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) + * - GLOBAL_DateCreated (*attribute*) - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) + * - GLOBAL_DateModified (*attribute*) - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) + - + * - GLOBAL_Title (*attribute*) - - - m - - Narrative description of the headphone drivers + - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + - IC, RC, RCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - @@ -6719,64 +6714,94 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - [0, 0, 0] - IC, MC - m - - Default: Headphones are located at the position of the listener + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - - spherical + - cartesian - - m - * - SourcePosition_Units (*attribute*) - - degree, degree, meter + - metre - - m - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM + - [0, 0, 0] + - eC, eCM - m - - Default: Reflects the correspondence of each emitter to each receiver + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - - * - SourceManufacturer (*string*) - - [''] - - MS + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC + - m + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) + - cartesian - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS + - m - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS + * - ListenerView_Units (*attribute*) + - metre - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS + - m - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) + * - M (*double*) - 0 - - M + - m + - m + - Time stamp of the measurements in M,defines the size of M. + * - EmitterUp (*double*) + - [0, 0, 0] + - EC, ECM + - + - Must be of the same dimensionality as EmitterView. + * - EmitterView (*double*) + - [0, 0, 0] + - EC, ECM + - + - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. + * - EmitterView_Type (*attribute*) + - cartesian + - + - + - + * - EmitterView_Units (*attribute*) + - metre + - + - + - + * - M_LongName (*attribute*) + - time - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [1, 1] - - mRn - m + - Narrative name for M + * - M_Units (*attribute*) + - second - + - m + - Units used for M + * - Data_Sample (*double*) + - [0, 0] + - rn + - m + - n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - @@ -6785,21 +6810,16 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - m - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - :ref:`back to top ` -.. _SimpleHeadphoneIR_0.2: +.. _SingleTrackedAudio_0.2: -**SimpleHeadphoneIR v0.2** +**SingleTrackedAudio v0.2** + +This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -6816,12 +6836,12 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR + - SingleTrackedAudio - - r, m - @@ -6858,13 +6878,13 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - FIR - - r, m - - We will store IRs here + - * - GLOBAL_History (*attribute*) - - @@ -6889,7 +6909,7 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - free field - - m - - Room type is not relevant here + - * - GLOBAL_Origin (*attribute*) - - @@ -6910,143 +6930,148 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - + * - ListenerPosition (*double*) + - [0, 0, 0] + - IC, MC - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - + - Position of the head. IC if not tracked, MC if tracked. + * - ListenerPosition_Type (*attribute*) + - cartesian - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - + * - ListenerPosition_Units (*attribute*) + - metre - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - + * - ReceiverPosition (*double*) + - [[0, 0.09, 0], [0, -0.09, 0]] + - IC, RC, RCM - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - + - Position of the ears. RC if not tracked, RCM if tracked. + * - ReceiverPosition_Type (*attribute*) + - cartesian - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - + * - ReceiverPosition_Units (*attribute*) + - metre - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - + * - SourcePosition (*double*) + - [0, 0, 0] + - IC, MC - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - + - Position of the virtual ensemble. IC if not tracked, MC if tracked. + * - SourcePosition_Type (*attribute*) + - cartesian - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - + * - SourcePosition_Units (*attribute*) + - metre - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) + - + * - EmitterPosition (*double*) - [0, 0, 0] - - IC, MC + - eC, eCM - m - - - * - ListenerPosition_Type (*attribute*) + - Position of the virtual source(s). eC if not tracked, eCM if tracked. + * - EmitterPosition_Type (*attribute*) - cartesian - - m - - * - ListenerPosition_Units (*attribute*) + * - EmitterPosition_Units (*attribute*) - metre - - m - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM + * - ListenerUp (*double*) + - [0, 0, 1] + - IC, MC - m - - - * - ReceiverPosition_Type (*attribute*) + - Must be of the same dimensionality as ListenerView. + * - ListenerView (*double*) + - [1, 0, 0] + - IC, MC + - m + - Orientation of the head. IC if not tracked, MC if tracked. + * - ListenerView_Type (*attribute*) - cartesian - - m - - * - ReceiverPosition_Units (*attribute*) + * - ListenerView_Units (*attribute*) - metre - - m - - * - SourcePosition (*double*) + * - EmitterUp (*double*) - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical + - EC, ECM - - - m + - Must be of the same dimensionality as EmitterView. + * - EmitterView (*double*) + - [0, 0, 0] + - EC, ECM - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre + - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. + * - EmitterView_Type (*attribute*) + - cartesian - - - m - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM + - + * - EmitterView_Units (*attribute*) + - metre + - + - + - + * - M (*double*) + - 0 - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian + - m + - Time stamp of the measurements in M,defines the size of M. + * - M_LongName (*attribute*) + - time - - m - - - * - EmitterPosition_Units (*attribute*) - - metre + - Narrative name for M + * - M_Units (*attribute*) + - second - - m + - Units used for M + * - Response (*attribute*) - - * - SourceManufacturer (*string*) - - [''] - - MS + - S, C, I - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS + - the subject’s response + * - Response_Type (*attribute*) - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS + - S, C, I - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS + - type depends on the dimension + * - Response_LongName (*attribute*) + - Date + - S - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - nR - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) + - (binaural) audio data at the receivers; n=number of audio samples + * - Data_Emitter (*double*) - [0, 0] - - mRn - - m + - nE - + - (source) audio data at the emitters; n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - @@ -7055,21 +7080,16 @@ Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. T - - m - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - :ref:`back to top ` -.. _SingleRoomDRIR_0.2: +.. _AnnotatedReceiverAudio_0.1: -**SingleRoomDRIR v0.2** +**AnnotatedReceiverAudio v0.1** + +This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. .. list-table:: :widths: 20 50 25 30 100 @@ -7086,17 +7106,17 @@ This convention stores arbitrary number of receivers while providing an informat - r, m - * - GLOBAL_Version (*attribute*) - - 1.0 + - 2.1 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR + - AnnotatedReceiverAudio - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 + - 0.1 - - r, m - @@ -7128,10 +7148,10 @@ This convention stores arbitrary number of receivers while providing an informat * - GLOBAL_Comment (*attribute*) - - - - m + - - * - GLOBAL_DataType (*attribute*) - - FIR + - Audio - - r, m - @@ -7156,7 +7176,7 @@ This convention stores arbitrary number of receivers while providing an informat - - * - GLOBAL_RoomType (*attribute*) - - reverberant + - free field - - m - @@ -7180,43 +7200,33 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - + - Position of the head. IC if not tracked, MC if tracked. * - ListenerPosition_Type (*attribute*) - cartesian - - m - * - ListenerPosition_Units (*attribute*) - - meter + - metre - - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rC, rCM - m - - + - Position of the ears. RC if not tracked, RCM if tracked. * - ReceiverPosition_Type (*attribute*) - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - meter + - metre - - m - @@ -7224,29 +7234,29 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 0] - IC, MC - m - - + - Position of the virtual ensemble. IC if not tracked, MC if tracked. * - SourcePosition_Type (*attribute*) - cartesian - - m - * - SourcePosition_Units (*attribute*) - - meter + - metre - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eCI, eCM + - eC, eCM - m - - + - Position of the virtual source(s). eC if not tracked, eCM if tracked. * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - meter + - metre - - m - @@ -7254,12 +7264,12 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 1] - IC, MC - m - - + - Must be of the same dimensionality as ListenerView. * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - + - Orientation of the head. IC if not tracked, MC if tracked. * - ListenerView_Type (*attribute*) - cartesian - @@ -7270,33 +7280,43 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC + * - M (*double*) + - 0 - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - m + - Time stamp of the measurements in M, defines the size of M. + * - M_LongName (*attribute*) + - time - - * - SourceView_Type (*attribute*) - - cartesian + - m + - Narrative name for M + * - M_Units (*attribute*) + - second - - m + - Units used for M + * - Response (*attribute*) - - * - SourceView_Units (*attribute*) - - metre + - I, C, S - - - m + - the subject’s response + * - Response_Type (*attribute*) - - * - Data_IR (*double*) - - [1] - - mRn - - m + - I, C, S + - + - type depends on the dimension + * - Response_LongName (*attribute*) + - + - S - + - narrative description of the response type + * - Data_Receiver (*double*) + - [0, 0] + - In, Rn + - m + - (binaural) audio data at the receivers; n=number of audio samples * - Data_SamplingRate (*double*) - - 48000 + - 44100 - I - m - @@ -7305,21 +7325,16 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - :ref:`back to top ` -.. _SingleRoomDRIR_0.3: +.. _MultiSpeakerBRIR_0.3: -**SingleRoomDRIR v0.3** +**MultiSpeakerBRIR v0.3** -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. +This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. +This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. .. list-table:: :widths: 20 50 25 30 100 @@ -7341,7 +7356,7 @@ This convention stores arbitrary number of receivers while providing an informat - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR + - MultiSpeakerBRIR - - r, m - @@ -7381,10 +7396,10 @@ This convention stores arbitrary number of receivers while providing an informat - m - * - GLOBAL_DataType (*attribute*) - - FIR + - FIRE - - r, m - - + - We use FIR datatype which in addition depends on Emitters (E) * - GLOBAL_History (*attribute*) - - @@ -7434,12 +7449,17 @@ This convention stores arbitrary number of receivers while providing an informat - - - m + - name of the database to which these data belong + * - GLOBAL_ListenerShortName (*attribute*) - + - + - m + - ID of the subject from the database * - GLOBAL_RoomDescription (*attribute*) - - - - m - + - narrative description of the room * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC @@ -7456,8 +7476,8 @@ This convention stores arbitrary number of receivers while providing an informat - m - * - ReceiverPosition (*double*) - - [0, 0, 0] - - RCI, RCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - rCI, rCM - m - * - ReceiverPosition_Type (*attribute*) @@ -7471,17 +7491,17 @@ This convention stores arbitrary number of receivers while providing an informat - m - * - SourcePosition (*double*) - - [0, 0, 0] + - [0, 0, 1] - IC, MC - m - * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre + - degree, degree, metre - - m - @@ -7489,7 +7509,7 @@ This convention stores arbitrary number of receivers while providing an informat - [0, 0, 0] - eCI, eCM - m - - + - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E * - EmitterPosition_Type (*attribute*) - cartesian - @@ -7520,29 +7540,29 @@ This convention stores arbitrary number of receivers while providing an informat - - m - - * - SourceUp (*double*) + * - EmitterUp (*double*) - [0, 0, 1] - - IC, MC - - m + - ECI, ECM - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m + - When EmitterUp provided, EmitterView must be provided as well + * - EmitterView (*double*) + - [1, 0, 0] + - ECI, ECM - - * - SourceView_Type (*attribute*) + - When EmitterView provided, EmitterUp must be provided as well + * - EmitterView_Type (*attribute*) - cartesian - - - m - - * - SourceView_Units (*attribute*) + - + * - EmitterView_Units (*attribute*) - metre - - - m + - - * - Data_IR (*double*) - - [0] - - mrn + - [1, 1] + - mREn - m - * - Data_SamplingRate (*double*) @@ -7556,20 +7576,20 @@ This convention stores arbitrary number of receivers while providing an informat - m - * - Data_Delay (*double*) - - [0] - - IR, MR + - [0, 0] + - IRE, MRE - m - :ref:`back to top ` -.. _SingleTrackedAudio_0.1: - -**SingleTrackedAudio v0.1** +.. _SimpleFreeFieldHRIR_0.4: -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. +**SimpleFreeFieldHRIR v0.4** +This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. +This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant .. list-table:: :widths: 20 50 25 30 100 @@ -7586,17 +7606,17 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - r, m - * - GLOBAL_Version (*attribute*) - - 2.1 + - 1.0 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio + - SimpleFreeFieldHRIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 + - 0.4 - - r, m - @@ -7680,63 +7700,73 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - name of the database to which these data belong + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - ID of the subject from the database * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the head. IC if not tracked, MC if tracked. + - * - ListenerPosition_Type (*attribute*) - cartesian - - m - * - ListenerPosition_Units (*attribute*) - - metre + - meter - - m - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM + - rCI, rCM - m - - Position of the ears. RC if not tracked, RCM if tracked. + - * - ReceiverPosition_Type (*attribute*) - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - metre + - meter - - m - * - SourcePosition (*double*) - - [0, 0, 0] + - [0, 0, 1] - IC, MC - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. + - Source position is assumed to vary for different directions/positions around the listener * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre + - degree, degree, meter - - m - * - EmitterPosition (*double*) - [0, 0, 0] - - eC, eCM + - eCI, eCM - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. + - * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - metre + - meter - - m - @@ -7744,64 +7774,29 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - [0, 0, 1] - IC, MC - m - - Must be of the same dimensionality as ListenerView. + - * - ListenerView (*double*) - [1, 0, 0] - IC, MC - m - - Orientation of the head. IC if not tracked, MC if tracked. + - * - ListenerView_Type (*attribute*) - cartesian - - m - * - ListenerView_Units (*attribute*) - - metre - - - - m + - meter - - * - M (*double*) - - 0 - - m - m - - Time stamp of the measurements in M,defines the size of M. - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M_LongName (*attribute*) - - time - + * - Data_IR (*double*) + - [1, 1] + - mRn - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - m - - Units used for M - * - Data_Sample (*double*) - - [0, 0] - - rn - - m - - n=number of audio samples * - Data_SamplingRate (*double*) - - 44100 + - 48000 - I - m - @@ -7810,16 +7805,21 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - - m - + * - Data_Delay (*double*) + - [0, 0] + - IR, MR + - m + - :ref:`back to top ` -.. _SingleTrackedAudio_0.2: - -**SingleTrackedAudio v0.2** +.. _SimpleHeadphoneIR_0.1: -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. +**SimpleHeadphoneIR v0.1** +This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. +Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. .. list-table:: :widths: 20 50 25 30 100 @@ -7836,17 +7836,17 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - r, m - * - GLOBAL_Version (*attribute*) - - 2.1 + - 1.0 - - r, m - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio + - SimpleHeadphoneIR - - r, m - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 + - 0.1 - - r, m - @@ -7878,13 +7878,13 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud * - GLOBAL_Comment (*attribute*) - - - - + - m - * - GLOBAL_DataType (*attribute*) - FIR - - r, m - - + - We will store IRs here * - GLOBAL_History (*attribute*) - - @@ -7909,7 +7909,7 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - free field - - m - - + - Room type is not relevant here * - GLOBAL_Origin (*attribute*) - - @@ -7930,33 +7930,78 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - - m - + * - GLOBAL_DatabaseName (*attribute*) + - + - + - m + - Correspondence to a database + * - GLOBAL_ListenerShortName (*attribute*) + - + - + - m + - Correspondence to a subject from the database + * - GLOBAL_ListenerDescription (*attribute*) + - + - + - m + - Narrative description of the listener (or mannequin) + * - GLOBAL_SourceDescription (*attribute*) + - + - + - m + - Narrative description of the headphones + * - GLOBAL_SourceManufacturer (*attribute*) + - + - + - m + - Name of the headphones manufacturer + * - GLOBAL_SourceModel (*attribute*) + - + - + - m + - Name of the headphone model. Must uniquely describe the headphones of the manufacturer + * - GLOBAL_SourceURI (*attribute*) + - + - + - m + - URI of the headphone specifications + * - GLOBAL_ReceiverDescription (*attribute*) + - + - + - m + - Narrative description of the microphones + * - GLOBAL_EmitterDescription (*attribute*) + - + - + - m + - Narrative description of the headphone drivers * - ListenerPosition (*double*) - [0, 0, 0] - IC, MC - m - - Position of the head. IC if not tracked, MC if tracked. + - * - ListenerPosition_Type (*attribute*) - cartesian - - m - * - ListenerPosition_Units (*attribute*) - - metre + - meter - - m - * - ReceiverPosition (*double*) - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM + - rCI, rCM - m - - Position of the ears. RC if not tracked, RCM if tracked. + - * - ReceiverPosition_Type (*attribute*) - cartesian - - m - * - ReceiverPosition_Units (*attribute*) - - metre + - meter - - m - @@ -7964,114 +8009,64 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - [0, 0, 0] - IC, MC - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. + - Default: Headphones are located at the position of the listener * - SourcePosition_Type (*attribute*) - - cartesian + - spherical - - m - * - SourcePosition_Units (*attribute*) - - metre + - degree, degree, meter - - m - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM + - [[0, 0.09, 0], [0, -0.09, 0]] + - eCI, eCM - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. + - Default: Reflects the correspondence of each emitter to each receiver * - EmitterPosition_Type (*attribute*) - cartesian - - m - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre + - meter - - m - - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - + * - SourceManufacturer (*string*) + - [''] + - MS - - * - EmitterView_Units (*attribute*) - - metre + - Optional M-dependent version of the attribute SourceManufucturer + * - SourceModel (*string*) + - [''] + - MS - + - Optional M-dependent version of the attribute SourceModel + * - ReceiverDescription (*string*) + - [''] + - MS - + - Optional M-dependent version of the attribute ReceiverDescription + * - EmitterDescription (*string*) + - [''] + - MS - - * - M (*double*) + - Optional M-dependent version of the attribute EmitterDescription + * - MeasurementDate (*double*) - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second + - M - + - Optional M-dependent date and time of the measurement + * - Data_IR (*double*) + - [1, 1] + - mRn - m - - Units used for M - * - Response (*attribute*) - - - - S, C, I - - - - the subject’s response - * - Response_Type (*attribute*) - - - - S, C, I - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - Date - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - nR - - - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_Emitter (*double*) - - [0, 0] - - nE - - - (source) audio data at the emitters; n=number of audio samples * - Data_SamplingRate (*double*) - - 44100 + - 48000 - I - m - @@ -8080,6 +8075,11 @@ This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAud - - m - + * - Data_Delay (*double*) + - [0, 0] + - IR, MR + - m + - :ref:`back to top ` diff --git a/docs/resources/sofar.png b/docs/resources/sofar.png deleted file mode 100644 index 5f7d286c2fff1c00339d0d2b62a8abdd79c45998..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5130 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 M7~Z;GrSB5^AHHOj9{>OV diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst deleted file mode 100644 index 2a9187de..00000000 --- a/docs/sofar.Sofa.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. _sofar_SOFA: - -SOFA objects -============ - -This section documents sofar SOFA objects. Functions that work on SOFA objects -are described in the :ref:`sofar_functions` guide. For examples on how to use -sofar refer to the :ref:`quick_tour`. - -.. autoclass:: sofar.Sofa - :members: - :undoc-members: - :show-inheritance: - :exclude-members: diff --git a/docs/sofar.functions.rst b/docs/sofar.functions.rst deleted file mode 100644 index 22994288..00000000 --- a/docs/sofar.functions.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. _sofar_functions: - -sofar functions -=============== - -This section documents general functions of the sofar package. Handling data in -SOFA objects is described in :ref:`sofar_SOFA`. For examples on how to use sofa -refer to the :ref:`quick_tour`. - -.. automodule:: sofar - :members: - :undoc-members: - :show-inheritance: - :exclude-members: Sofa diff --git a/docs/sofar.rst b/docs/sofar.rst new file mode 100644 index 00000000..711c09a4 --- /dev/null +++ b/docs/sofar.rst @@ -0,0 +1,38 @@ +sofar +===== + +.. toctree:: + :caption: Getting Started + :maxdepth: 1 + + readme + examples + working_with_sofa_files + + +.. toctree:: + :caption: Documentation + :maxdepth: 2 + + modules + + +.. toctree:: + :caption: SOFA conventions + :maxdepth: 1 + + resources/conventions + + +.. toctree:: + :caption: Contributing + :maxdepth: 1 + + contributing + + +.. toctree:: + :caption: Other + :maxdepth: 1 + + history diff --git a/docs/working_with_sofa_files.rst b/docs/working_with_sofa_files.rst index d09bff93..8fa1142c 100644 --- a/docs/working_with_sofa_files.rst +++ b/docs/working_with_sofa_files.rst @@ -116,7 +116,7 @@ formatting Next steps ========== -For detailed information about sofar refer to the :ref:`sofar_SOFA` and :ref:`sofar_functions` documentation. +For detailed information about sofar refer to the :mod:`sofar` documentation. Pyfar also offers methods for digital signal processing that wont be detailed here. A god way to dive into that is the `pyfar documentation `_ and the diff --git a/environment.yml b/environment.yml new file mode 100644 index 00000000..e0d5e102 --- /dev/null +++ b/environment.yml @@ -0,0 +1,13 @@ +name: sofar +channels: + - defaults + - conda-forge +dependencies: + - python=3.12 + - pip + - numpy>=1.14.0 + - pip: + - netCDF4 + - beautifulsoup4 + - requests + - packaging diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..59c13b3e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,13 @@ +[tool.ruff] +exclude = [ + ".git", + "docs", + "setup.py", +] +line-length = 79 +lint.ignore = [] +lint.select = [ + "E", + "F", + "W", +] diff --git a/pytest.ini b/pytest.ini index 94aaf7d4..445c908c 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,5 +1,4 @@ # pytest.ini [pytest] norecursedirs = private -filterwarnings = ignore::UserWarning testpaths = tests diff --git a/requirements_dev.txt b/requirements_dev.txt index be5c9ad7..9d8931ad 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -2,7 +2,7 @@ pip bump2version wheel watchdog -flake8 +ruff==0.4.1 coverage Sphinx twine @@ -12,10 +12,10 @@ pytest-cov numpy>=1.14.0 scipy>=1.5.0 deepdiff -tox-wheel autodocsumm netCDF4 beautifulsoup4 pydata-sphinx-theme sphinx-design sphinx-favicon +sphinx-reredirects diff --git a/setup.cfg b/setup.cfg index 05b07279..6597c95b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -13,9 +13,5 @@ replace = __version__ = '{new_version}' [bdist_wheel] universal = 1 - -[flake8] -exclude = .git, docs - [aliases] test = pytest diff --git a/setup.py b/setup.py index 6997705d..11a61306 100644 --- a/setup.py +++ b/setup.py @@ -19,18 +19,20 @@ 'packaging' ] -setup_requirements = ['pytest-runner', ] +setup_requirements = [ + 'pytest-runner', +] test_requirements = [ - 'pip' 'pytest', 'bump2version', 'wheel', 'watchdog', - 'flake8', + 'ruff', 'coverage', 'Sphinx', - 'twine' + 'twine', + 'pydata-sphinx-theme', ] setup( @@ -46,7 +48,7 @@ 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', - 'Programming Language :: Python :: 3.12' + 'Programming Language :: Python :: 3.12', ], description="Maybe the most complete python package for SOFA files so far", install_requires=requirements, @@ -68,5 +70,5 @@ }, version='1.1.3', zip_safe=False, - python_requires='>=3.8' + python_requires='>=3.8', ) From dff2fb2e1573d3d0d5f5074ead945a3ff2ccb104 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Mon, 10 Jun 2024 09:04:48 +0200 Subject: [PATCH 34/61] remove files which are build --- .gitignore | 1 + docs/resources/conventions.rst | 8085 -------------------------------- 2 files changed, 1 insertion(+), 8085 deletions(-) delete mode 100644 docs/resources/conventions.rst diff --git a/.gitignore b/.gitignore index ab4bb909..2edc775b 100644 --- a/.gitignore +++ b/.gitignore @@ -121,3 +121,4 @@ docs/_static/favicon.ico docs/_static/header.rst docs/_static/css/custom.css docs/resources/logos/pyfar_logos_fixed_size_sofar.png +docs/resources/conventions.rst diff --git a/docs/resources/conventions.rst b/docs/resources/conventions.rst deleted file mode 100644 index 1f975d89..00000000 --- a/docs/resources/conventions.rst +++ /dev/null @@ -1,8085 +0,0 @@ -.. _conventions_introduction: - -Introduction -============ - -SOFA conventions specify what data and metadata must be stored in a SOFA file. Different conventions can be used to store different types of data,e.g., head-related impulse responses or musical instrument directivities.It is advised to always use the conventions that is most specific for thedata. - -In the following, SOFA conventions are described in tables with the information - -* **Name:** The Name of the data. The prefix *GLOBAL* denotes global attribute, i.e., attributes that pertain the entire data set. Underscores denote attributes that are data specific. E.g., *SourcePosition_Units* denotes the *Units* of the data *SourcePosition*. -* **Type:** The Type of the data. - - * **Attribute:** A verbose description given by a string - * **Double:** A numeric array of data - * **String:** A string array of data - -* **Default:** The default value -* **Dimensions:** The dimensions of the data. Lower case letters denote the data that sets the dimension. - - * **E:** Number of emitters - * **R:** Number of receivers - * **M:** Number of measurements - * **N:** Number of samples or frequency bins of the data - * **C:** Number of coordinates (always 3) - * **I:** Unity dimentions (always 1) - * **S:** Lengths of the longest string contained in the data (detected automatically) - -* **Flags:** - - * **r:** read only data. Data can be written if flag is missing. - * **m:** mandatory data. Data is optional if flag is missing - -.. _conventions: - -Conventions -=========== - -* :ref:`SimpleFreeFieldHRTF v1.0 ` -* :ref:`FreeFieldHRIR v1.0 ` -* :ref:`FreeFieldDirectivityTF v1.1 ` -* :ref:`GeneralTF-E v1.0 ` -* :ref:`GeneralTF v2.0 ` -* :ref:`SimpleHeadphoneIR v1.0 ` -* :ref:`AnnotatedReceiverAudio v0.2 ` -* :ref:`SimpleFreeFieldHRSOS v1.0 ` -* :ref:`GeneralSOS v1.0 ` -* :ref:`SimpleFreeFieldSOS v1.0 ` -* :ref:`GeneralFIR v1.0 ` -* :ref:`GeneralFIR-E v2.0 ` -* :ref:`SingleRoomMIMOSRIR v1.0 ` -* :ref:`SimpleFreeFieldHRIR v1.0 ` -* :ref:`FreeFieldHRTF v1.0 ` -* :ref:`AnnotatedEmitterAudio v0.2 ` -* :ref:`GeneralTF v1.0 ` -* :ref:`SingleRoomSRIR v1.0 ` -* :ref:`FreeFieldDirectivityTF v1.0 (deprecated) ` -* :ref:`SingleRoomDRIR v0.2 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.2 (deprecated) ` -* :ref:`AnnotatedEmitterAudio v0.1 (deprecated) ` -* :ref:`GeneralFIRE v1.0 (deprecated) ` -* :ref:`SingleRoomDRIR v0.3 (deprecated) ` -* :ref:`SimpleFreeFieldTF v0.4 (deprecated) ` -* :ref:`SimpleFreeFieldTF v1.0 (deprecated) ` -* :ref:`SingleTrackedAudio v0.1 (deprecated) ` -* :ref:`SingleTrackedAudio v0.2 (deprecated) ` -* :ref:`AnnotatedReceiverAudio v0.1 (deprecated) ` -* :ref:`MultiSpeakerBRIR v0.3 (deprecated) ` -* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) ` -* :ref:`SimpleHeadphoneIR v0.1 (deprecated) ` - -Current -======= - -.. _SimpleFreeFieldHRTF_1.0: - -**SimpleFreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _FreeFieldHRIR_1.0: - -**FreeFieldHRIR v1.0** - -An extension of SimpleFreeFieldHRIR in order to consider more complex data sets described in spatially continuous representation. Each HRTF direction corresponds to an emitter, and a consistent measurement for a single listener and all directions is described by a set of the emitter positions surrounding the listener. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Short name of the listener (as for example the subject ID). - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0, 0] - - mrne - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _FreeFieldDirectivityTF_1.1: - -**FreeFieldDirectivityTF v1.1** - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.1 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Type of the coordinate system used. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - Units of the coordinates. - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., 'The bell' for a trumpet or 'On the front plate between the low- and mid/high-frequency unit' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - View vector for the orientation. - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., 'Viewing direction of the bell' for a trumpet or 'Perpendicular to the front plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., 'Along the keys, keys up' for a trumpet or 'Perpendicular to the top plate' for a loudspeaker. Mandatory in order to provide a reference across different sources. - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position. In a simple settings, a single emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - MS, ES, MES - - - - A more detailed description of the Emitters. For example, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF-E_1.0: - -**GeneralTF-E v1.0** - -This conventions stores TFs depending in the Emiiter for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralTF - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - We store frequency-dependent data depending on the emitter here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrne - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRNE - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _GeneralTF_2.0: - -**GeneralTF v2.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mrn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_1.0: - -**SimpleHeadphoneIR v1.0** - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescriptions (*string*) - - [''] - - MS - - - - R-dependent version of the attribute ReceiverDescription - * - EmitterDescriptions (*string*) - - [''] - - MS - - - - E-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.2: - -**AnnotatedReceiverAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRSOS_1.0: - -**SimpleFreeFieldHRSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _GeneralSOS_1.0: - -**GeneralSOS v1.0** - -This conventions follows GeneralFIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0]]] - - mrn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _SimpleFreeFieldSOS_1.0: - -**SimpleFreeFieldSOS v1.0** - -This convention set follows SimpleFreeFieldHRIR but the data is stored as second-order section (SOS) coefficients. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldSOS - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - SOS - - - - r, m - - Filters described as second-order section (SOS) coefficients - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - Data_SOS (*double*) - - [[[0, 0, 0, 1, 0, 0], [0, 0, 0, 1, 0, 0]]] - - mRn - - m - - Filter coefficients as SOS coefficients. - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the coefficients in Data.SOS and the delay in Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - Broadband delay (in samples resulting from SamplingRate) - -:ref:`back to top ` - -.. _GeneralFIR_1.0: - -**GeneralFIR v1.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - - - - * - ListenerView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _GeneralFIR-E_2.0: - -**GeneralFIR-E v2.0** - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIR-E - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 2.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RC, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, EC, ECM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _SingleRoomMIMOSRIR_1.0: - -**SingleRoomMIMOSRIR v1.0** - -Single-room multiple-input multiple-output spatial room impulse responses, depending on Emitters - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomMIMOSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR-E - - - - r, m - - Shall be FIR-E - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature - * - RoomVolume (*double*) - - 0 - - I, MI - - - - Volume of the room - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement. - * - Data_IR (*double*) - - 0 - - mrne - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRI, MRI, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_1.0: - -**SimpleFreeFieldHRIR v1.0** - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - - - - * - SourceView_Type (*attribute*) - - cartesian - - - - - - - * - SourceView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _FreeFieldHRTF_1.0: - -**FreeFieldHRTF v1.0** - -This conventions is for HRTFs created under conditions where room information is irrelevant and stored as SH coefficients - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldHRTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF-E - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Source position is assumed to be the ListenerPosition in order to reflect Emitters surrounding the Listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, ECI, ECM - - m - - Radius in 'spherical harmonics', Position in 'cartesian' and 'spherical' - * - EmitterPosition_Type (*attribute*) - - spherical harmonics - - - - m - - Can be 'spherical harmonics', 'cartesian', or 'spherical' - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - - * - Data_Real (*double*) - - [0, 0] - - mrne - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRNE - - m - - - -:ref:`back to top ` - -.. _AnnotatedEmitterAudio_0.2: - -**AnnotatedEmitterAudio v0.2** - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*string*) - - [''] - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _GeneralTF_1.0: - -**GeneralTF v1.0** - -This conventions stores TFs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined. This convention is based on GeneralFIR. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - In order to store different directions/positions around the listener, SourcePosition is assumed to vary - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - narrative name of N - * - N_Units (*attribute*) - - hertz - - - - m - - Unit of the values given in N - * - Data_Real (*double*) - - 0 - - mRn - - m - - The real part of the complex spectrum - * - Data_Imag (*double*) - - 0 - - MRN - - m - - The imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _SingleRoomSRIR_1.0: - -**SingleRoomSRIR v1.0** - -For measuring SRIRs in a single room with a single excitation source (e.g., a loudspeaker) and a listener containing an arbitrary number of omnidirectional receivers (e.g., a microphone array). - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomSRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - Shall be FIR - * - GLOBAL_RoomType (*attribute*) - - shoebox - - - - m - - Shall be 'shoebox' or 'dae' - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data. - * - GLOBAL_RoomShortName (*attribute*) - - - - - - - - Short name of the Room - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - Informal verbal description of the room - * - GLOBAL_RoomLocation (*attribute*) - - - - - - - - Location of the room - * - GLOBAL_RoomGeometry (*attribute*) - - - - - - - - URI to a file describing the room geometry. - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - - - - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverShortName (*attribute*) - - - - - - - - - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - - - - * - GLOBAL_SourceShortName (*attribute*) - - - - - - - - - * - GLOBAL_SourceDescription (*attribute*) - - - - - - - - - * - GLOBAL_EmitterShortName (*attribute*) - - - - - - - - - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - - - - * - RoomTemperature (*double*) - - 0 - - I, M - - - - Temperature during measurements, given in Kelvin. - * - RoomTemperature_Units (*attribute*) - - kelvin - - - - - - Units of the room temperature. - * - RoomVolume (*double*) - - 0 - - I, M - - - - Volume of the room. - * - RoomVolume_Units (*attribute*) - - cubic metre - - - - - - Units of the room volume. - * - RoomCornerA (*double*) - - [0, 0, 0] - - IC, MC - - - - - * - RoomCornerB (*double*) - - [1, 2, 3] - - IC, MC - - - - - * - RoomCorners (*double*) - - 0 - - II - - - - The value of this attribute is to be ignored. It only exist to for RoomCorners:Type and RoomCorners:Units - * - RoomCorners_Type (*attribute*) - - cartesian - - - - - - - * - RoomCorners_Units (*attribute*) - - metre - - - - - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ReceiverDescriptions (*string*) - - [''] - - RS, RSM - - - - R-dependent version of the attribute ReceiverDescription - * - ReceiverPosition (*double*) - - [0, 0, 0] - - IC, RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - Can be of any type enabling both spatially discrete and spatially continuous representations. - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - ReceiverView (*double*) - - [1, 0, 0] - - RCI, RCM - - - - - * - ReceiverUp (*double*) - - [0, 0, 1] - - RCI, RCM - - - - - * - ReceiverView_Type (*attribute*) - - cartesian - - - - - - - * - ReceiverView_Units (*attribute*) - - metre - - - - - - - * - SourcePosition (*double*) - - [0, 0, 1] - - MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescriptions (*string*) - - [''] - - ES, ESM - - - - E-dependent version of the attribute EmitterDescription - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - spherical - - - - m - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - Shall be 'cartesian' or 'spherical', restricting to spatially discrete emitters. - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - 0 - - mrn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I, M - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IR, MR - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -Deprecated -========== - -.. _FreeFieldDirectivityTF_1.0: - -**FreeFieldDirectivityTF v1.0** - -This convention is deprecated. Use :ref:`FreeFieldDirectivityTF_1.1 ` instead. - -This conventions stores directivities of acoustic sources (instruments, loudspeakers, singers, talkers, etc) in the frequency domain for multiple musical notes in free field. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - FreeFieldDirectivityTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - We store frequency-dependent data here - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary, but the spatial setup assumes free field. - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Name of the database. Used for classification of the data - * - GLOBAL_Musician (*attribute*) - - - - - - - - Narrative description of the musician such as position, behavior, or personal data if not data-protected, e.g., 'Christiane Schmidt sitting on the chair', or 'artificial excitation by R2D2'. - * - GLOBAL_Description (*attribute*) - - - - - - - - Narrative description of a measurement. For musical instruments/singers, the note (C1, D1, etc) or the dynamic (pp., ff., etc), or the string played, the playing style (pizzicato, legato, etc.), or the type of excitation (e.g., hit location of a cymbal). For loudspeakers, the system and driver units. - * - GLOBAL_SourceType (*attribute*) - - - - - - m - - Narrative description of the acoustic source, e.g., 'Violin', 'Female singer', or '2-way loudspeaker' - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Narrative description of the manufacturer of the source, e.g., 'Stradivari, Lady Blunt, 1721' or 'LoudspeakerCompany' - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the microphone array during the measurements. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the microphone array - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the microphone array - * - ReceiverPosition (*double*) - - [0, 0, 1] - - IC, RC, RCM - - m - - Positions of the microphones during the measurements (relative to the Listener) - * - ReceiverPosition_Type (*attribute*) - - spherical - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the acoustic source (instrument) - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source position, e.g., for the trumpet, 'The bell'. Mandatory in order to provide a reference across different instruments - * - SourceView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the acoustic source (instrument) - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - SourceView_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source view, e.g., for the trumpet, 'Viewing direction of the bell'. Mandatory in order to provide a reference across different instruments - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Up vector of the acoustic source (instrument) - * - SourceUp_Reference (*attribute*) - - - - - - m - - Narrative description of the spatial reference of the source up, e.g., for the trumpet, 'Along the keys, keys up'. Mandatory in order to provide a reference across different instruments - * - EmitterPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - A more detailed structure of the Source. In a simple settings, a single Emitter is considered that is collocated with the source. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterDescription (*string*) - - [''] - - IS, MS - - - - A more detailed structure of the source. In a simple setting, a single Emitter is considered that is collocated with the source. In a more complicated setting, this may be the strings of a violin or the units of a loudspeaker. - * - MIDINote (*double*) - - 0 - - I, M - - - - Defines the note played by the source during the measurement. The note is specified a MIDI note by the [https://www.midi.org/specifications-old/item/the-midi-1-0-specification MIDI specifications, version 1.0]. Not mandatory, but recommended for tonal instruments. - * - Description (*string*) - - [''] - - MS - - - - This variable is used when the description varies with M. - * - SourceTuningFrequency (*double*) - - 440 - - I, M - - - - Frequency (in hertz) to which a musical instrument is tuned to corresponding to the note A4 (MIDINote=69). Recommended for tonal instruments. - * - N (*double*) - - 0 - - N - - m - - Frequency values - * - N_LongName (*attribute*) - - frequency - - - - m - - - * - N_Units (*attribute*) - - hertz - - - - m - - Units used for N - * - Data_Real (*double*) - - 0 - - mrn - - m - - Real part of the complex spectrum. The default value 0 indicates that all data fields are initialized with zero values. - * - Data_Imag (*double*) - - 0 - - MRN - - m - - Imaginary part of the complex spectrum - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.2: - -**SingleRoomDRIR v0.2** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.2: - -**SimpleHeadphoneIR v0.2** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [0, 0] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _AnnotatedEmitterAudio_0.1: - -**AnnotatedEmitterAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedEmitterAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedEmitterAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Emitter (*double*) - - [0, 0] - - In, En - - m - - audio data at the emitter(s); n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _GeneralFIRE_1.0: - -**GeneralFIRE v1.0** - -This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 ` instead. - -This conventions stores IRs for general purposes, i.e., only the mandatory, SOFA general metadata are pre-defined - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - GeneralFIRE - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - The room information can be arbitrary - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - 0 - - mREn - - m - - Impulse responses - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - Sampling rate of the samples in Data.IR and Data.Delay - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - Unit of the sampling rate - * - Data_Delay (*double*) - - 0 - - IRE, MRE - - m - - Additional delay of each IR (in samples) - -:ref:`back to top ` - -.. _SingleRoomDRIR_0.3: - -**SingleRoomDRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 ` instead. - -This convention stores arbitrary number of receivers while providing an information about the room. The main application is to store DRIRs for a single room. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleRoomDRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - - * - GLOBAL_RoomDescription (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [0, 0, 0] - - RCI, RCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - SourceUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourceView (*double*) - - [-1, 0, 0] - - IC, MC - - m - - - * - SourceView_Type (*attribute*) - - cartesian - - - - m - - - * - SourceView_Units (*attribute*) - - metre - - - - m - - - * - Data_IR (*double*) - - [0] - - mrn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_0.4: - -**SimpleFreeFieldTF v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [1, 1] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldTF_1.0: - -**SimpleFreeFieldTF v1.0** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 ` instead. - -This conventions is for TFs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldTF - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - TF - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - N (*double*) - - 0 - - N - - m - - - * - N_LongName (*attribute*) - - frequency - - - - - - - * - N_Units (*attribute*) - - hertz - - - - - - - * - Data_Real (*double*) - - [0, 0] - - mRn - - m - - - * - Data_Imag (*double*) - - [0, 0] - - MRN - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.1: - -**SingleTrackedAudio v0.1** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Data_Sample (*double*) - - [0, 0] - - rn - - m - - n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _SingleTrackedAudio_0.2: - -**SingleTrackedAudio v0.2** - -This convention is deprecated. Use AnnotatedEmitterAudio or AnnotatedReceiverAudio instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SingleTrackedAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.2 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - IC, RC, RCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 0] - - EC, ECM - - - - Must be of the same dimensionality as EmitterView. - * - EmitterView (*double*) - - [0, 0, 0] - - EC, ECM - - - - Orientation of the virtual source(s). EC if not tracked, ECM if tracked. - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M,defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - S, C, I - - - - the subject’s response - * - Response_Type (*attribute*) - - - - S, C, I - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - Date - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - nR - - - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_Emitter (*double*) - - [0, 0] - - nE - - - - (source) audio data at the emitters; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _AnnotatedReceiverAudio_0.1: - -**AnnotatedReceiverAudio v0.1** - -This convention is deprecated. Use :ref:`AnnotatedReceiverAudio_0.2 ` instead. - - - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 2.1 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - AnnotatedReceiverAudio - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - Audio - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the head. IC if not tracked, MC if tracked. - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rC, rCM - - m - - Position of the ears. RC if not tracked, RCM if tracked. - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Position of the virtual ensemble. IC if not tracked, MC if tracked. - * - SourcePosition_Type (*attribute*) - - cartesian - - - - m - - - * - SourcePosition_Units (*attribute*) - - metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eC, eCM - - m - - Position of the virtual source(s). eC if not tracked, eCM if tracked. - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - Must be of the same dimensionality as ListenerView. - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - Orientation of the head. IC if not tracked, MC if tracked. - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - M (*double*) - - 0 - - m - - m - - Time stamp of the measurements in M, defines the size of M. - * - M_LongName (*attribute*) - - time - - - - m - - Narrative name for M - * - M_Units (*attribute*) - - second - - - - m - - Units used for M - * - Response (*attribute*) - - - - I, C, S - - - - the subject’s response - * - Response_Type (*attribute*) - - - - I, C, S - - - - type depends on the dimension - * - Response_LongName (*attribute*) - - - - S - - - - narrative description of the response type - * - Data_Receiver (*double*) - - [0, 0] - - In, Rn - - m - - (binaural) audio data at the receivers; n=number of audio samples - * - Data_SamplingRate (*double*) - - 44100 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - -:ref:`back to top ` - -.. _MultiSpeakerBRIR_0.3: - -**MultiSpeakerBRIR v0.3** - -This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 ` instead. - -This convention is for BRIRs recorded in reverberant conditions from multiple loudspeaker sources at a number of listener orientations. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - MultiSpeakerBRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.3 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIRE - - - - r, m - - We use FIR datatype which in addition depends on Emitters (E) - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - reverberant - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - GLOBAL_RoomDescription (*attribute*) - - - - - - - - narrative description of the room - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - metre - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - metre - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, metre - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - Each speaker is represented as an emitter. Use EmitterPosition to represent the position of a particular speaker. Size of EmitterPosition determines E - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - metre - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - metre - - - - m - - - * - EmitterUp (*double*) - - [0, 0, 1] - - ECI, ECM - - - - When EmitterUp provided, EmitterView must be provided as well - * - EmitterView (*double*) - - [1, 0, 0] - - ECI, ECM - - - - When EmitterView provided, EmitterUp must be provided as well - * - EmitterView_Type (*attribute*) - - cartesian - - - - - - - * - EmitterView_Units (*attribute*) - - metre - - - - - - - * - Data_IR (*double*) - - [1, 1] - - mREn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IRE, MRE - - m - - - -:ref:`back to top ` - -.. _SimpleFreeFieldHRIR_0.4: - -**SimpleFreeFieldHRIR v0.4** - -This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 ` instead. - -This convention set is for HRIRs recorded under free-field conditions or other IRs created under conditions where room information is irrelevant - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleFreeFieldHRIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.4 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - name of the database to which these data belong - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - ID of the subject from the database - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 1] - - IC, MC - - m - - Source position is assumed to vary for different directions/positions around the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [0, 0, 0] - - eCI, eCM - - m - - - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - ListenerUp (*double*) - - [0, 0, 1] - - IC, MC - - m - - - * - ListenerView (*double*) - - [1, 0, 0] - - IC, MC - - m - - - * - ListenerView_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerView_Units (*attribute*) - - meter - - - - m - - - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - -.. _SimpleHeadphoneIR_0.1: - -**SimpleHeadphoneIR v0.1** - -This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 ` instead. - -Conventions for IRs with a 1-to-1 correspondence between emitter and receiver. The main application for this convention is to store headphone IRs recorded for each emitter and each ear. - -.. list-table:: - :widths: 20 50 25 30 100 - :header-rows: 1 - - * - Name (Type) - - Default - - Dim. - - Flags - - Comment - * - GLOBAL_Conventions (*attribute*) - - SOFA - - - - r, m - - - * - GLOBAL_Version (*attribute*) - - 1.0 - - - - r, m - - - * - GLOBAL_SOFAConventions (*attribute*) - - SimpleHeadphoneIR - - - - r, m - - - * - GLOBAL_SOFAConventionsVersion (*attribute*) - - 0.1 - - - - r, m - - - * - GLOBAL_APIName (*attribute*) - - - - - - r, m - - - * - GLOBAL_APIVersion (*attribute*) - - - - - - r, m - - - * - GLOBAL_ApplicationName (*attribute*) - - - - - - - - - * - GLOBAL_ApplicationVersion (*attribute*) - - - - - - - - - * - GLOBAL_AuthorContact (*attribute*) - - - - - - m - - - * - GLOBAL_Comment (*attribute*) - - - - - - m - - - * - GLOBAL_DataType (*attribute*) - - FIR - - - - r, m - - We will store IRs here - * - GLOBAL_History (*attribute*) - - - - - - - - - * - GLOBAL_License (*attribute*) - - No license provided, ask the author for permission - - - - m - - - * - GLOBAL_Organization (*attribute*) - - - - - - m - - - * - GLOBAL_References (*attribute*) - - - - - - - - - * - GLOBAL_RoomType (*attribute*) - - free field - - - - m - - Room type is not relevant here - * - GLOBAL_Origin (*attribute*) - - - - - - - - - * - GLOBAL_DateCreated (*attribute*) - - - - - - m - - - * - GLOBAL_DateModified (*attribute*) - - - - - - m - - - * - GLOBAL_Title (*attribute*) - - - - - - m - - - * - GLOBAL_DatabaseName (*attribute*) - - - - - - m - - Correspondence to a database - * - GLOBAL_ListenerShortName (*attribute*) - - - - - - m - - Correspondence to a subject from the database - * - GLOBAL_ListenerDescription (*attribute*) - - - - - - m - - Narrative description of the listener (or mannequin) - * - GLOBAL_SourceDescription (*attribute*) - - - - - - m - - Narrative description of the headphones - * - GLOBAL_SourceManufacturer (*attribute*) - - - - - - m - - Name of the headphones manufacturer - * - GLOBAL_SourceModel (*attribute*) - - - - - - m - - Name of the headphone model. Must uniquely describe the headphones of the manufacturer - * - GLOBAL_SourceURI (*attribute*) - - - - - - m - - URI of the headphone specifications - * - GLOBAL_ReceiverDescription (*attribute*) - - - - - - m - - Narrative description of the microphones - * - GLOBAL_EmitterDescription (*attribute*) - - - - - - m - - Narrative description of the headphone drivers - * - ListenerPosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - - * - ListenerPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ListenerPosition_Units (*attribute*) - - meter - - - - m - - - * - ReceiverPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - rCI, rCM - - m - - - * - ReceiverPosition_Type (*attribute*) - - cartesian - - - - m - - - * - ReceiverPosition_Units (*attribute*) - - meter - - - - m - - - * - SourcePosition (*double*) - - [0, 0, 0] - - IC, MC - - m - - Default: Headphones are located at the position of the listener - * - SourcePosition_Type (*attribute*) - - spherical - - - - m - - - * - SourcePosition_Units (*attribute*) - - degree, degree, meter - - - - m - - - * - EmitterPosition (*double*) - - [[0, 0.09, 0], [0, -0.09, 0]] - - eCI, eCM - - m - - Default: Reflects the correspondence of each emitter to each receiver - * - EmitterPosition_Type (*attribute*) - - cartesian - - - - m - - - * - EmitterPosition_Units (*attribute*) - - meter - - - - m - - - * - SourceManufacturer (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceManufucturer - * - SourceModel (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute SourceModel - * - ReceiverDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute ReceiverDescription - * - EmitterDescription (*string*) - - [''] - - MS - - - - Optional M-dependent version of the attribute EmitterDescription - * - MeasurementDate (*double*) - - 0 - - M - - - - Optional M-dependent date and time of the measurement - * - Data_IR (*double*) - - [1, 1] - - mRn - - m - - - * - Data_SamplingRate (*double*) - - 48000 - - I - - m - - - * - Data_SamplingRate_Units (*attribute*) - - hertz - - - - m - - - * - Data_Delay (*double*) - - [0, 0] - - IR, MR - - m - - - -:ref:`back to top ` - From 34f6311e304d3387b32801e719a7d2ff053cf1e1 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Mon, 10 Jun 2024 09:24:33 +0200 Subject: [PATCH 35/61] apply changes from #89 --- CONTRIBUTING.rst | 14 +- README.rst | 47 +++--- docs/examples.rst | 243 ------------------------------- docs/sofar.rst | 2 - docs/working_with_sofa_files.rst | 139 ------------------ 5 files changed, 36 insertions(+), 409 deletions(-) delete mode 100644 docs/examples.rst delete mode 100644 docs/working_with_sofa_files.rst diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index bdb79754..90e6ed58 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -6,7 +6,7 @@ Contributing Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. The following helps you to start -contributing specifically to pyfar. Please also consider the +contributing specifically to sofar. Please also consider the `general contributing guidelines`_ for example regarding the style of code and documentation and some helpful hints. @@ -76,4 +76,16 @@ Ready to contribute? Here's how to set up `sofar` for local development using th 7. Submit a pull request on the develop branch through the GitHub website. +Submodules +~~~~~~~~~~ + +To update the submodule containing the conventions and verification rules run + +.. code-block:: bash + + $ git submodule update --init --recursive + $ git submodule update --recursive --remote + +and then commit the changes + .. _general contributing guidelines: https://pyfar-gallery.readthedocs.io/en/latest/contribute/index.html diff --git a/README.rst b/README.rst index f8cd73c3..722daa7b 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ -===== -sofar -===== +====== +Readme +====== .. image:: https://badge.fury.io/py/sofar.svg :target: https://badge.fury.io/py/sofar @@ -9,33 +9,31 @@ sofar :alt: Documentation Status .. image:: https://circleci.com/gh/pyfar/sofar.svg?style=shield :target: https://circleci.com/gh/pyfar/sofar -.. image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/pyfar/gallery/main?labpath=docs/gallery/interactive/sofar_introduction.ipynb - Sofar is maybe the most complete Python package for the SOFA file format so far. SOFA files store spatially distributed acoustic data such as impulse responses or transfer functions. They are defined by the AES69-2022 standard (see references). These are the key features of sofar -* Uses a complete definition of the AES69-2022 standard (see references) maintained at `sofa_conventions`_ * Read, edit, and write SOFA files * Add custom attributes to SOFA files * Full Verification of the content of a SOFA files against AES69-2022 * Upgrade data that uses outdated SOFA conventions * Open license allows unrestricted use * sofar is tested using continuous integration on +* Uses a complete definition of the AES69-2022 standard (see references) maintained at `sofa_conventions`_ Getting Started =============== -The `pyfar workshop`_ gives an overview of the most important pyfar -functionality and is a good starting point. It is part of the -`pyfar example gallery`_ that also contains more specific and in-depth -examples that can be executed interactively without a local installation by -clicking the mybinder.org button on the respective example. The -`pyfar documentation`_ gives a detailed and complete overview of pyfar. All -these information are available from `pyfar.org`_. +The `sofa and SOFA notebook`_ gives an overview of the most important sofar +functionality and is a good starting point. For processing and visualizing data +inside SOFA files, we recommend the `pyfar package`_ that can read SOFA files +through `pyfar.io.read_sofa` and the in-depth examples contained in the +`pyfar example gallery`_. Check out `read the docs`_ for a complete +documentation of sofar. A more detailed introduction to the SOFA file format +is given by Majdak et. al. 2022 (see references below). All information is also +bundled at `pyfar.org`_. Installation ============ @@ -46,14 +44,23 @@ Use pip to install sofar $ pip install sofar -(Requires Python 3.8 or higher) +(Requires Python >= 3.8) If the installation fails, please check out the `help section`_. Contributing ============ -Check out the `contributing guidelines`_ if you want to become part of pyfar. +Refer to the `contribution guidelines`_ for more information. + +.. _sofa_conventions : https://github.com/pyfar/sofa_conventions +.. _sofa and SOFA notebook: https://pyfar-gallery.readthedocs.io/en/latest/gallery/interactive/sofar_introduction.html +.. _pyfar package: https://pyfar.readthedocs.io +.. _pyfar example gallery: https://pyfar-gallery.readthedocs.io/en/latest/examples_gallery.html +.. _pyfar.org: https://pyfar.org +.. _read the docs: https://sofar.readthedocs.io +.. _help section: https://pyfar-gallery.readthedocs.io/en/latest/help +.. _contribution guidelines: https://sofar.readthedocs.io/en/stable/contributing.html References ========== @@ -66,11 +73,3 @@ P. Majdak, F. Zotter, F. Brinkmann, J. De Muynke, M. Mihocic, and M. Noisternig, "Spatially Oriented Format for Acoustics 2.1: Introduction and Recent Advances", *J. Audio Eng. Soc.*, vol. 70, no. 7/8, pp. 565-584, Jul. 2022. DOI: https://doi.org/10.17743/jaes.2022.0026 - -.. _sofa_conventions : https://github.com/pyfar/sofa_conventions -.. _pyfar workshop: https://mybinder.org/v2/gh/pyfar/gallery/main?labpath=docs/gallery/interactive/pyfar_introduction.ipynb -.. _pyfar example gallery: https://pyfar-gallery.readthedocs.io/en/latest/examples_gallery.html -.. _pyfar documentation: https://pyfar.readthedocs.io -.. _pyfar.org: https://pyfar.org -.. _help section: https://pyfar-gallery.readthedocs.io/en/latest/help -.. _contributing guidelines: https://pyfar.readthedocs.io/en/stable/contributing.html diff --git a/docs/examples.rst b/docs/examples.rst deleted file mode 100644 index 301f1486..00000000 --- a/docs/examples.rst +++ /dev/null @@ -1,243 +0,0 @@ -.. _quick_tour: - -Quick tour of SOFA and sofar ----------------------------- - -If you are new to SOFA and/or sofar, this is a good place to start. SOFA is -short for *Spatially Oriented Format for Acoustics* and is an open file format -for saving acoustic data, as for example head-related impulse responses -(HRIRs). A good places to get more information about SOFA are - -* :ref:`Documentation of the SOFA conventions ` -* The `SOFA paper `_ -* `sofaconventions.org`_. -* The SOFA standard `AES69-2022 `_ - -Creating SOFA objects -===================== - -To cover a variety of data, SOFA offers different `conventions`. A convention -defines, what data can be saved and how it is saved. You should always find the -most specific convention for your data. This will help you to identify relevant -data and meta data that you should provide along the actual acoustic data. -Using sofar, a list of possible conventions can be obtained with - -.. code-block:: python - - import sofar as sf - sf.list_conventions() - -Let us assume, that you want to store head-related impulse responses (HRIRs). -In this case the most specific convention is `SimpleFreeFieldHRIR`. To create -a SOFA object use - -.. code-block:: python - - sofa = sf.Sofa("SimpleFreeFieldHRIR") - -The return value `sofa` is a :code:`sofar.Sofa` object filled with the default -values of the `SimpleFreeFieldHRIR` convention. Note that ``sf.Sofa()`` can -also return a sofa object that has only the mandatory attributes. However, it -is recommended to start with all attributes and discard empty optional -attributes before saving the data. - -.. _getting_information_about_SOFA_objects: - -Getting information about SOFA objects -====================================== - -To get an overview of the convention, go to the -:ref:`documentation of the SOFA conventions `. - -You might have noted from the documentation that three different kinds of -data types can be stored in SOFA files: - -* **Attributes:** - Attributes are meta data stored as strings. There are two kinds of - attributes. Global attributes give information about the entire data stored - in a SOFA file. All entires starting with *GLOBAL* are such attributes. - Specific attributes hold meta data for a certain variable. These attributes - thus start with the name of the variable followed by an underscore, e.g., - *ListenerPosition_Units*. An exception to this rule are the data variables, - e.g, *Data_IR* is not an attribute but a double variable. -* **Double Variables:** - Variables of type *double* store numeric data and can be entered as - numbers, lists, or numpy arrays. -* **String Variables:** - Variables of type *string* store strings and can be entered as strings, - lists of string, or numpy string arrays. - -The data can be mandatory, optional, and read only and must have a shape -(dimension in SOFA language) according to the underlying convention. Read on -for more information. - -To get a quick insight into SOFA objects use - -* ``sofa.inspect`` prints the data stored in a SOFA object or at least gives - the shape in case of large arrays that would clutter the output. This is - helpful when reading data from an existing SOFA object. -* ``sofa.list_dimensions`` prints the dimensions of the data inside the SOFA - object. -* ``sofa.get_dimension`` returns the size of a specific dimension. - -For the *SimpleFreeFieldHRIR* SOFA object we have the following dimensions - -.. code-block:: python - - sofa.list_dimensions - >>> R = 2 receiver (set by ReceiverPosition of dimension RCI, RCM) - >>> E = 1 emitter (set by EmitterPosition of dimension ECI, ECM) - >>> M = 1 measurements (set by Data_IR of dimension MRN) - >>> N = 1 samples (set by Data_IR of dimension MRN) - >>> C = 3 coordinate dimensions, fixed - >>> I = 1 single dimension, fixed - >>> S = 0 maximum string length - -In this case, `M` denotes the number of source -positions for which HRIRs are available, `R` is the number of ears - which is -two - and `N` gives the lengths of the HRIRs in samples. `S` is zero, because -the convention does not have any string variables. `C` is always three, because -coordinates are either given by x, y, and z values or by their azimuth, -elevation and radius in degree. - -It is important to be aware of the dimensions and enter data as determined by -the convention. SOFA sets the `dimensions` -implicitly. This means the dimensions are derived from the data itself, as -indicated by the output of :code:`sofa.list_dimensions` above (*set by...*). In -some cases, variables can have different shapes. An example for this is the -`ReceiverPosition` which can be of shape RCI or RCM. To get a dimension as a -variable use - -.. code-block:: python - - sofa.get_dimension("N) - >>> N = 1 - -Let's assume you downloaded a SOFA file from the `FABIAN database `_ -and want to quickly inspect it. You could use - -.. code-block:: python - - sofa = sf.read_sofa("FABIAN_HRIR_measured_HATO_0.sofa") - sofa.inspect() - >>> GLOBAL_License : Creative Commons (CC-BY). Visit http://creativecommons.org/licenses/by/4.0/ for licence details. - >>> GLOBAL_Organization : Audio Communication Group, TU Berlin, Germany (www.ak.tu-berlin.de) - >>> ReceiverPosition : (R=2, C=3, I=1) - >>> [[ 0. 0.0662 0. ] - >>> [ 0. -0.0662 0. ]] - >>> Data_IR : (M=11950, R=2, N=256) - >>> Data_SamplingRate : 44100.0 - >>> Data_SamplingRate_Units : hertz - -Note that the above does not show the entire information for the sake of -brevity. This will most likely give you a better idea of the data then -looking at the definition of the convention or calling ``sofa.list_dimensions``. - -Adding data to SOFA objects -=========================== - -Data can simply be obtained and entered - -.. code-block:: python - - sofa.Data_IR # prints [0, 0] - sofa.Data_IR = [1, 1] - sofa.SourcePosition = [90, 0, 1.5] - -Now, the SOFA object contains a single HRIR - which is ``1`` for the left -ear and ``1`` for the right ear - for a source at ``0`` degree azimuth, ``90`` -degree elevation and a radius of ``1.5`` meter. Note that you just entered a -list for `Data_IR` although it has to be a three-dimensional double variable. -Sofar handles this in two steps. - -1. When entering data as lists it is converted to a numpy array with at least two dimensions. -2. Missing dimensions are appended when writing the SOFA object to disk. - -You should now fill all mandatory entries of the SOFA object if you were -for real. For this example we'll cut it here for the sake of brevity. Let -us, however, delete an optional entry that we do not need at this point - -.. code-block:: python - - sofa.delete("SourceUp") - -In some cases you might want to add custom data - although third party -applications most likely won't make use of non-standardized data. Try this -to add a temperature value and unit - -.. code-block:: python - - sofa.add_variable("Temperature", 25.1, "double", "MI") - sofa.add_attribute("Temperature_Units", "degree Celsius") - - -After entering the data, the SOFA object should be verified to make sure that -your data can (most likely) be read by other applications. - -.. code-block:: python - - sofa.verify() - -This will check the following - -- Are all mandatory data contained? -- Are the names of variables and attributes in accordance with the SOFA - standard? -- Are the data types in accordance with the SOFA standard? -- Are the dimensions of the variables consistent and in accordance - to the SOFA standard? -- Are the values of attributes consistent and in accordance to the - SOFA standard? - -If any violations are detected, an error is raised. - -Reading and writing SOFA objects -================================ - -Note that you usually do not need to call ``sofa.verify()`` separately because -it is by default called if you create write or read a SOFA object. To write -your SOFA object to disk type - -.. code-block:: python - - sf.write_sofa("your/path/to/SingleHRIR.sofa", sofa) - -It is good to know that SOFA files are essentially netCDF4 files which is -based on HDF5. They can thus be viewed with `HDF View`_. - -To read your sofa file you can use - -.. code-block:: python - - sofa_read = sf.read_sofa("your/path/to/SingleHRIR.sofa") - -And to see that the written and read files contain the same data you can check - -.. code-block:: python - - sf.equals(sofa, sofa_read) - >>> True - -Upgrading SOFA files -==================== - -SOFA conventions might get updates to fix bugs in the conventions, in case -new conventions are introduced, or in case conventions get deprecated. To find -out if SOFA data from a file is up to data load it and call - -.. code-block:: python - - sofa.upgrade_convention() - -which will list upgrade choices or let you know that the convention is already up -to date. - -Next steps -========== - -For detailed information about sofar refer to the :mod:`sofar` documentation. -For examples on how to work with the data inside SOFA files refer to :ref:`working_with_sofa`. - - -.. _sofaconventions.org: https://sofaconventions.org -.. _HDF view: https://www.hdfgroup.org/downloads/hdfview/ diff --git a/docs/sofar.rst b/docs/sofar.rst index 711c09a4..b27a249b 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -6,8 +6,6 @@ sofar :maxdepth: 1 readme - examples - working_with_sofa_files .. toctree:: diff --git a/docs/working_with_sofa_files.rst b/docs/working_with_sofa_files.rst deleted file mode 100644 index 8fa1142c..00000000 --- a/docs/working_with_sofa_files.rst +++ /dev/null @@ -1,139 +0,0 @@ -.. _working_with_sofa: - -Working with SOFA files ------------------------ - -The :ref:`quick_tour` showed how to access SOFA files. In many cases you will -want to have a closer look at the data inside a SOFA file or use it for further -processing. In this section, you will see examples of how to do that using -`pyfar `_. - - -Retrieving data for specific source and receiver positions -========================================================== - -In most cases SOFA files contain data for lots of source or receiver positions -and it is often important to get data for a specific position. An elegant way -of doing that is to use pyfar Coordinates and Audio objects. Coordinate objects -have built in methods to search specific positions and they can convert between -a large variety of coordinate systems for you. For audio objects, there is -a growing pool of functions for plotting and processing that comes in handy. To -use pyfar install it into you python environment - -.. code:: shell - - $ pip install pyfar - -You have to options to get SOFA data into pyfar. The first option is to load -the SOFA file with :code:`sofar.read_sofa` and then manually generate Audio -and Coordinates objects from the data inside the SOFA file. The second option -is to use :code:`pyfar.read_sofa`, which directly returns the Audio and -Coordinates objects. Lets be lazy and do that - -.. code:: python - - import pyfar as pf - import matplotlib as mpl - import matplotlib.pyplot as plt - - data_ir, source_coordinates, receiver_coordinates = pf.io.read_sofa( - 'FABIAN_HRIR_measured_HATO_0.sofa') - -The SOFA file used in this example is contained head-realated impulse responses -(HRIRs) from the `FABIAN database `_. -Lets find the HRIR for the source position at the left ear on the horizontal -plane. It has an azimuth angle of 90 degrees and an elevation of 0 degrees - -.. code:: python - - index, *_ = source_coordinates.find_nearest_k( - 90, 0, 1.5, k=1, domain='sph', convention='top_elev', unit='deg', show=True) - -The variable ``index = 5930`` tells us where to find data for the desired -source position. Since we used ``show=True`` we also get visual feedback for -checking if we got the correct source - -|source_lateral| - -Note that you get more then the most closest point by using different values -for `k`. It is also possible to all source positions on or in the vicintiy -of the horizontal plane using the ``find_slice`` method of the Coordinates -object. Sources on the horizontal plane have zero degree elevation and thus can -be obtained by - -.. code:: python - - _, mask = source_coordinates.find_slice( - 'elevation', unit='deg', value=0, show=True) - -Again, we get visual feedback if we want - -|source_horizontal| - - -Plotting data -============= - -Ploting can be done with the built in plot functions. For example to take a -look at the time data and magnitude spectra of a single source position - -.. code:: python - - pf.plot.time_freq(data_ir[index]) - -|hrir_lateral| - -Plotting the entire horizontal plane is also a one liner using -``pf.plot.time_freq_2d``, however, a few more lines are required for a nicer -formatting - -.. code:: python - - with pf.plot.context(): - - plt.subplots(2, 1, figsize=(8, 6), sharex=True) - - angles = source_coordinates.get_sph('top_elev', 'deg')[mask, 0] - - ax, qm, cb = pf.plot.time_freq_2d(data_ir[mask, 0], indices=angles, - cmap=mpl.cm.get_cmap(name='coolwarm')) - - ax[0].set_title("Left ear HRIR (Horizontal plane)") - ax[0].set_xlabel("") - ax[0].set_ylim(0, 3) - qm[0].set_clim(-1.5, 1.5) - - ax[1].set_title("Left ear HRTFs (Horizontal plane)") - ax[1].set_xlabel("Azimuth angle in degrees") - ax[1].set_ylim(200, 20e3) - qm[1].set_clim(-25, 25) - - plt.tight_layout - -|hrir_horizontal_plane| - - -Next steps -========== - -For detailed information about sofar refer to the :mod:`sofar` documentation. -Pyfar also offers methods for digital signal processing that wont be detailed -here. A god way to dive into that is the -`pyfar documentation `_ and the -`pyfar examples notebook `_. - -.. |source_lateral| image:: resources/working_with_sofa_source_lateral.png - :width: 500 - :alt: source lateral - -.. |source_horizontal| image:: resources/working_with_sofa_source_horizontal.png - :width: 500 - :alt: source horizontal - -.. |hrir_lateral| image:: resources/working_with_sofa_HRIR_lateral.png - :width: 600 - :alt: HRIR lateral - -.. |hrir_horizontal_plane| image:: resources/working_with_sofar_HRIR_horizontal_plane.jpeg - :width: 600 - :alt: HRIR horizontal plane From f2a25c3e05cffcc023a46faba64a0e3485e188b5 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Wed, 12 Jun 2024 16:17:43 +0200 Subject: [PATCH 36/61] fix doc --- docs/conf.py | 1 + docs/modules.rst | 10 ---------- docs/modules/sofar.rst | 7 ------- 3 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 docs/modules.rst delete mode 100644 docs/modules/sofar.rst diff --git a/docs/conf.py b/docs/conf.py index 72191574..86da3654 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -89,6 +89,7 @@ # intersphinx mapping intersphinx_mapping = { 'numpy': ('https://numpy.org/doc/stable/', None), + 'gallery': ('https://pyfar-gallery.readthedocs.io/en/latest/', None), } # -- Options for HTML output ------------------------------------------------- diff --git a/docs/modules.rst b/docs/modules.rst deleted file mode 100644 index 8ac9ae27..00000000 --- a/docs/modules.rst +++ /dev/null @@ -1,10 +0,0 @@ -Modules -======= - -The following gives detailed information about all pyfar functions sorted -according to their modules. - -.. toctree:: - :maxdepth: 1 - - modules/sofar diff --git a/docs/modules/sofar.rst b/docs/modules/sofar.rst deleted file mode 100644 index fdf5af64..00000000 --- a/docs/modules/sofar.rst +++ /dev/null @@ -1,7 +0,0 @@ -sofar -===== - -.. automodule:: sofar - :members: - :undoc-members: - :show-inheritance: From b5f67cdc95996cbf9b1f50136446521fcdc04c75 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Wed, 12 Jun 2024 16:38:29 +0200 Subject: [PATCH 37/61] fix typo --- docs/resources/conventions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/conventions.py b/docs/resources/conventions.py index c7aae37f..1fe5f78c 100644 --- a/docs/resources/conventions.py +++ b/docs/resources/conventions.py @@ -49,7 +49,7 @@ ' * **M:** Number of measurements\n' ' * **N:** Number of samples or frequency bins of the data\n' ' * **C:** Number of coordinates (always 3)\n' - ' * **I:** Unity dimentions (always 1)\n' + ' * **I:** Unity dimensions (always 1)\n' ' * **S:** Lengths of the longest string contained in the data ' '(detected automatically)\n\n' '* **Flags:**\n\n' From f061d6c37434336013af41f21696f5e248160343 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Wed, 12 Jun 2024 20:47:17 +0200 Subject: [PATCH 38/61] separately download and update conventions --- sofar/update_conventions.py | 193 ++++++++++++++++++++---------------- tests/test_utils.py | 26 +++-- 2 files changed, 126 insertions(+), 93 deletions(-) diff --git a/sofar/update_conventions.py b/sofar/update_conventions.py index db4e0625..1ead7f8c 100644 --- a/sofar/update_conventions.py +++ b/sofar/update_conventions.py @@ -1,10 +1,12 @@ import contextlib import os +import shutil import re import glob import json import requests from bs4 import BeautifulSoup +from tempfile import TemporaryDirectory def update_conventions(conventions_path=None, assume_yes=False): @@ -20,9 +22,9 @@ def update_conventions(conventions_path=None, assume_yes=False): https://www.sofaconventions.org/conventions/ and https://www.sofaconventions.org/conventions/deprecated/. 2. - Convert csv files to json files to be read by sofar. + Notify which conventions would be added or updated. 3. - Notify which conventions were newly added or updated. + Convert csv files to json files to be read by sofar. The csv and json files are stored at sofar/conventions. Sofar works only on the json files. To get a list of all currently available SOFA conventions @@ -41,28 +43,16 @@ def update_conventions(conventions_path=None, assume_yes=False): ``None``, which saves the conventions inside the sofar package. Conventions saved under a different path can not be used by sofar. This parameter was added mostly for testing and debugging. - response : bool, optional + assume_yes : bool, optional - ``True`` - Updating the conventions must be confirmed by typing "y". ``False`` + Updating the conventions must be confirmed by typing "y". + ``True`` The conventions are updated without confirmation. - The default is ``True`` + The default is ``False`` """ - if not assume_yes: - # these lines were only tested manually. I was too lazy to write a test - # coping with keyboard input - print(("Are you sure that you want to update the conventions? " - "Read the documentation before continuing. " - "If updating breaks sofar it has to be re-installed" - "(y/n)")) - response = input() - if response != "y": - print("Updating the conventions was canceled.") - return - # url for parsing and downloading the convention files urls = ("https://www.sofaconventions.org/conventions/", "https://www.sofaconventions.org/conventions/deprecated/") @@ -93,80 +83,113 @@ def update_conventions(conventions_path=None, assume_yes=False): if not os.path.isdir(os.path.join(conventions_path, "deprecated")): os.mkdir(os.path.join(conventions_path, "deprecated")) - # Loop and download conventions if they changed + # Loop and download conventions to temporary directory if they changed updated = False - for convention in conventions: - # exclude these conventions - if convention.startswith(("General_", "GeneralString_")): - continue - - # get filename and url - is_standardized = convention in standardized - standardized_csv = os.path.join(conventions_path, convention) - deprecated_csv = os.path.join( - conventions_path, "deprecated", convention) - url = ( - f"{urls[0]}/{convention}" - if is_standardized - else f"{urls[1]}/{convention}" - ) + update = [] + deprecate = [] - # download SOFA convention definitions to package directory - data = requests.get(url) - # remove windows style line breaks and trailing tabs - data = data.content.replace(b"\r\n", b"\n").replace(b"\t\n", b"\n") - - # check if convention needs to be added or updated - if is_standardized and not os.path.isfile(standardized_csv): - # add new standardized convention - updated = True - with open(standardized_csv, "wb") as file: - file.write(data) - print(f"- added convention: {convention[:-4]}") - if is_standardized and os.path.isfile(standardized_csv): - # check for update of a standardized convention - with open(standardized_csv, "rb") as file: - data_current = b"".join(file.readlines()) - data_current = data_current.replace( - b"\r\n", b"\n").replace(b"\t\n", b"\n") - if data_current != data: + with TemporaryDirectory() as temp: + os.mkdir(os.path.join(temp, 'deprecated')) + for convention in conventions: + + # exclude these conventions + if convention.startswith(("General_", "GeneralString_")): + continue + + # get filename and url + is_standardized = convention in standardized + standardized_csv = os.path.join(conventions_path, convention) + deprecated_csv = os.path.join( + conventions_path, "deprecated", convention) + url = ( + f"{urls[0]}/{convention}" + if is_standardized + else f"{urls[1]}/{convention}" + ) + + # download SOFA convention definitions to package directory + data = requests.get(url) + # remove windows style line breaks and trailing tabs + data = data.content.replace(b"\r\n", b"\n").replace(b"\t\n", b"\n") + + # check if convention needs to be added or updated + if is_standardized and not os.path.isfile(standardized_csv): + # add new standardized convention + updated = True + with open(os.path.join(temp, convention), "wb") as file: + file.write(data) + print(f"- add convention: {convention[:-4]}") + update.append(convention) + if is_standardized and os.path.isfile(standardized_csv): + # check for update of a standardized convention + with open(standardized_csv, "rb") as file: + data_current = b"".join(file.readlines()) + data_current = data_current.replace( + b"\r\n", b"\n").replace(b"\t\n", b"\n") + if data_current != data: + updated = True + with open(os.path.join(temp, convention), "wb") as file: + file.write(data) + print(f"- update convention: {convention[:-4]}") + update.append(convention) + elif not is_standardized and os.path.isfile(standardized_csv): + # deprecate standardized convention updated = True - with open(standardized_csv, "wb") as file: + with open(os.path.join(temp, 'deprecated', convention), "wb") \ + as file: file.write(data) - print(f"- updated convention: {convention[:-4]}") - elif not is_standardized and os.path.isfile(standardized_csv): - # deprecate standardized convention - updated = True - with open(deprecated_csv, "wb") as file: - file.write(data) - os.remove(standardized_csv) - os.remove(f"{standardized_csv[:-3]}json") - print(f"- deprecated convention: {convention[:-4]}") - elif not is_standardized and os.path.isfile(deprecated_csv): - # check for update of a deprecated convention - with open(deprecated_csv, "rb") as file: - data_current = b"".join(file.readlines()) - data_current = data_current.replace( - b"\r\n", b"\n").replace(b"\t\n", b"\n") - if data_current != data: + print(f"- deprecate convention: {convention[:-4]}") + deprecate.append(convention) + elif not is_standardized and os.path.isfile(deprecated_csv): + # check for update of a deprecated convention + with open(deprecated_csv, "rb") as file: + data_current = b"".join(file.readlines()) + data_current = data_current.replace( + b"\r\n", b"\n").replace(b"\t\n", b"\n") + if data_current != data: + updated = True + with open(os.path.join(temp, 'deprecated', convention), + "wb") as file: + file.write(data) + print(f"- update deprecated convention: {convention[:-4]}") + update.append(os.path.join('deprecated', convention)) + elif not is_standardized and not os.path.isfile(deprecated_csv): + # add new deprecation updated = True - with open(deprecated_csv, "wb") as file: + with open(os.path.join(temp, 'deprecated', convention), "wb") \ + as file: file.write(data) - print(f"- updated deprecated convention: {convention[:-4]}") - elif not is_standardized and not os.path.isfile(deprecated_csv): - # add new deprecation - updated = True - with open(deprecated_csv, "wb") as file: - file.write(data) - print(f"- added deprecated convention: {convention[:-4]}") - - if updated: - # compile json files from csv file - _compile_conventions(conventions_path) - print("... done.") - else: - print("... conventions already up to date.") + print(f"- add deprecated convention: {convention[:-4]}") + update.append(os.path.join('deprecated', convention)) + + if updated and not assume_yes: + # these lines were only tested manually. I was too lazy to write a + # test coping with keyboard input + print(("\nDo you want to update the conventions above? (y/n)\n" + "Read the documentation before continuing. " + "If updating breaks sofar it has to be re-installed")) + response = input() + if response != "y": + print("\nUpdating the conventions was canceled.") + return + + if updated: + for convention in update: + shutil.copy(os.path.join(temp, convention), + os.path.join(conventions_path, convention)) + for convention in deprecate: + os.remove(os.path.join(conventions_path, convention)) + os.remove( + os.path.join(conventions_path, f"{convention[:-3]}json")) + shutil.copy( + os.path.join(temp, 'deprecated', convention), + os.path.join(conventions_path, 'deprecated', convention)) + # compile json files from csv file + _compile_conventions(conventions_path) + print("... done.") + else: + print("... conventions already up to date.") def _compile_conventions(conventions_path=None): diff --git a/tests/test_utils.py b/tests/test_utils.py index 37279fb1..f00134da 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -98,22 +98,32 @@ def test_update_conventions(capfd): # first run to test if conventions were updated sf.update_conventions(conventions_path=work_dir, assume_yes=True) out, _ = capfd.readouterr() - assert "added convention: GeneralTF_2.0" in out - assert "updated convention: GeneralFIR_1.0" in out - assert "deprecated convention: MultiSpeakerBRIR_0.3" in out + assert "add convention: GeneralTF_2.0" in out + assert os.path.isfile(os.path.join(work_dir, "GeneralTF_2.0.csv")) + assert "update convention: GeneralFIR_1.0" in out + assert "deprecate convention: MultiSpeakerBRIR_0.3" in out assert not os.path.isfile( os.path.join(work_dir, "MultiSpeakerBRIR_0.3.csv")) assert not os.path.isfile( os.path.join(work_dir, "MultiSpeakerBRIR_0.3.json")) - assert "updated deprecated convention: SimpleFreeFieldHRIR_0.4" in out - assert "added deprecated convention: SimpleFreeFieldTF_0.4" in out + assert os.path.isfile( + os.path.join(work_dir, "deprecated", "MultiSpeakerBRIR_0.3.csv")) + assert os.path.isfile( + os.path.join(work_dir, "deprecated", "MultiSpeakerBRIR_0.3.json")) + assert "update deprecated convention: SimpleFreeFieldHRIR_0.4" in out + assert "add deprecated convention: SimpleFreeFieldTF_0.4" in out + assert os.path.isfile( + os.path.join(work_dir, "deprecated", "SimpleFreeFieldTF_0.4.csv")) + assert os.path.isfile( + os.path.join(work_dir, "deprecated", "SimpleFreeFieldTF_0.4.json")) # second run to make sure that up to date conventions are not overwritten sf.update_conventions(conventions_path=work_dir, assume_yes=True) out, _ = capfd.readouterr() - assert "added" not in out - assert "updated" not in out - assert "deprecated" not in out + assert "add" not in out + assert "update" not in out + assert "deprecate" not in out + assert "already up to date" in out def test__compile_conventions(): From 8cb7dc3153deffed88e9b02a8fec104d9b5448ef Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 13 Jun 2024 08:48:13 +0200 Subject: [PATCH 39/61] Delete environment.yml --- environment.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 environment.yml diff --git a/environment.yml b/environment.yml deleted file mode 100644 index e0d5e102..00000000 --- a/environment.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: sofar -channels: - - defaults - - conda-forge -dependencies: - - python=3.12 - - pip - - numpy>=1.14.0 - - pip: - - netCDF4 - - beautifulsoup4 - - requests - - packaging From 9b8925d7c1e91c8e0fff4b2172749706e3795113 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 13 Jun 2024 09:00:50 +0200 Subject: [PATCH 40/61] update outdated link to examples that are now in the gallery --- docs/sofar.Sofa.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst index a6ad9c35..6f7ede83 100644 --- a/docs/sofar.Sofa.rst +++ b/docs/sofar.Sofa.rst @@ -10,7 +10,9 @@ To open a SOFA file without reading the entire file into memory, This section documents sofar SOFA objects and SofaStream. Functions that work on SOFA objects are described in the :ref:`sofar_functions` guide. For examples -on how to use sofar refer to the :ref:`quick_tour`. +on how to use sofar refer to the +:ref:`sofa and SOFA ` +examples. .. autoclass:: sofar.Sofa :members: From cd3671bfa3f20b8d9b1025152489c4e30ed4ff25 Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Thu, 13 Jun 2024 10:06:27 +0200 Subject: [PATCH 41/61] initial commit: get_dimension and list_dimensions --- sofar/sofastream.py | 102 +++++++++++++++++++++++++++++++++++++++ tests/test_sofastream.py | 67 +++++++++++++++++++++++++ 2 files changed, 169 insertions(+) diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 2bcb74a8..68ae5a74 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -101,6 +101,108 @@ def __getattr__(self, name): return self._data + @property + def list_dimensions(self): + """ + Print the dimensions of the SOFA-file + + See :py:func:`~SofaStream.inspect` to see the shapes of the data inside + the SOFA-file and :py:func:`~SofaStream.get_dimension` to get the + size/value of a specific dimensions as integer number. + + The SOFA standard defines the following dimensions that are used + to define the shape of the data entries: + + M + number of measurements + N + number of samles, frequencies, SOS coefficients + (depending on self.GLOBAL_DataType) + R + Number of receivers or SH coefficients + (depending on ReceiverPosition_Type) + E + Number of emitters or SH coefficients + (depending on EmitterPosition_Type) + S + Maximum length of a string in a string array + C + Size of the coordinate dimension. This is always three. + I + Single dimension. This is always one. + + """ + dim = self._file.dimensions + + # get verbose description for dimesion N + if self._file.getncattr('DataType').startswith("FIR"): + N_verbose = "samples" + elif self._file.getncattr('DataType').startswith("TF"): + N_verbose = "frequencies" + elif self._file.getncattr('DataType').startswith("SOS"): + N_verbose = "SOS coefficients" + + # get verbose description for dimensions R and E + R_verbose = ( + "receiver spherical harmonics coefficients" + if 'harmonic' + in self._file.variables['ReceiverPosition'].getncattr('Type') + else "receiver" + ) + E_verbose = ( + "emitter spherical harmonics coefficients" + if 'harmonic' + in self._file.variables['EmitterPosition'].getncattr('Type') + else "emitter" + ) + + dimensions = { + "M": "measurements", + "N": N_verbose, + "R": R_verbose, + "E": E_verbose, + "S": "maximum string length", + "C": "coordinate dimensions, fixed", + "I": "single dimension, fixed"} + + info_str = "" + for key, value in dim.items(): + value = value.size + dim_info = dimensions[key] if key in dimensions \ + else "custom dimension" + + info_str += f"{key} = {value} {dim_info}" + '\n' + + print(info_str) + + def get_dimension(self, dimension): + """ + Get size of a SOFA dimension + + SOFA dimensions specify the shape of the data contained in a SOFA-file + object. For a list of all dimensions see :py:func:`~list_dimensions`. + + Parameters + ---------- + dimension : str + The dimension as a string, e.g., ``'N'``. + + Returns + ------- + size : int + the size of the queried dimension. + """ + + # get dimensons from SOFA-file + dims = self._file.dimensions + + if dimension not in dims.keys(): + raise ValueError(( + f"{dimension} is not a valid dimension. " + "See Sofa.list_dimensions for a list of valid dimensions.")) + + return dims[dimension].size + def inspect(self, file=None): """ Get information about the data inside a SOFA-file diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py index bcdc2087..e3c23723 100644 --- a/tests/test_sofastream.py +++ b/tests/test_sofastream.py @@ -57,3 +57,70 @@ def test_sofastream_inspect(capfd, temp_sofa_file): with open(inspect_file, "r") as out_inspect: text = out_inspect.readlines() assert out == "".join(text) + + +def test_list_dimensions(capfd, tmp_path_factory): + + filename = tmp_path_factory.mktemp("data") / "test_sofastream_dim.sofa" + + # test FIR Data + sofa = sf.Sofa("GeneralFIR") + sf.write_sofa(filename, sofa) + with SofaStream(filename) as file: + file.list_dimensions + out, _ = capfd.readouterr() + assert "N = 1 samples" in out + + # test TF Data + sofa = sf.Sofa("GeneralTF") + sf.write_sofa(filename, sofa) + with SofaStream(filename) as file: + file.list_dimensions + out, _ = capfd.readouterr() + assert "N = 1 frequencies" in out + + # test SOS Data + sofa = sf.Sofa("SimpleFreeFieldHRSOS") + sf.write_sofa(filename, sofa) + with SofaStream(filename) as file: + file.list_dimensions + out, _ = capfd.readouterr() + assert "N = 6 SOS coefficients" in out + + # test non spherical harmonics data + sofa = sf.Sofa("GeneralFIR") + sf.write_sofa(filename, sofa) + with SofaStream(filename) as file: + file.list_dimensions + out, _ = capfd.readouterr() + assert "E = 1 emitter" in out + assert "R = 1 receiver" in out + + # test spherical harmonics data + sofa.EmitterPosition_Type = "spherical harmonics" + sofa.ReceiverPosition_Type = "spherical harmonics" + sofa.EmitterPosition_Units = "degree, degree, metre" + sofa.ReceiverPosition_Units = "degree, degree, metre" + sf.write_sofa(filename, sofa) + with SofaStream(filename) as file: + file.list_dimensions + out, _ = capfd.readouterr() + assert "E = 1 emitter spherical harmonics coefficients" in out + assert "R = 1 receiver spherical harmonics coefficients" in out + + +def test_get_dimensions(tmp_path_factory): + """Test getting the size of dimensions""" + filename = tmp_path_factory.mktemp("data") / "test_sofastream_dim.sofa" + + # test FIR Data + sofa = sf.Sofa("GeneralFIR") + sf.write_sofa(filename, sofa) + + with SofaStream(filename) as file: + size = file.get_dimension('N') + assert size == 1 + + # test wrong dimension error + with raises(ValueError, match="Q is not a valid dimension"): + file.get_dimension("Q") From 6b1f5dec4449b00cdfe0684413626f168385b2ee Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Thu, 13 Jun 2024 15:38:09 +0200 Subject: [PATCH 42/61] restructure module index page --- docs/documentation.rst | 11 ++++++ docs/getting_started.rst | 5 +++ docs/index.rst | 80 +++++++++++++++++++++++++--------------- docs/other.rst | 4 ++ 4 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 docs/documentation.rst create mode 100644 docs/getting_started.rst create mode 100644 docs/other.rst diff --git a/docs/documentation.rst b/docs/documentation.rst new file mode 100644 index 00000000..e47a5ab6 --- /dev/null +++ b/docs/documentation.rst @@ -0,0 +1,11 @@ +.. _documentation: + +Documentation +============= + + +.. toctree:: + :maxdepth: 2 + + sofar.Sofa + sofar.functions diff --git a/docs/getting_started.rst b/docs/getting_started.rst new file mode 100644 index 00000000..1929c211 --- /dev/null +++ b/docs/getting_started.rst @@ -0,0 +1,5 @@ +.. _getting_started: + +.. include:: readme.rst +.. include:: examples.rst +.. include:: working_with_sofa_files.rst diff --git a/docs/index.rst b/docs/index.rst index 8b9d96dd..4da26a30 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,48 +1,70 @@ -Getting Started -=============== +.. _index: -.. toctree:: - :maxdepth: 1 +Sofar +===== - readme - examples - working_with_sofa_files +Python package for handling SOFA files. +SOFA files store spatially distributed acoustic data such as head-related +transfer functions. Sofar can read, create, write, manipulate, and verify SOFA +files. -Documentation -============= +.. grid:: 1 2 2 3 + :gutter: 4 -.. toctree:: - :maxdepth: 2 + .. grid-item-card:: + :link: getting_started + :link-type: ref + :text-align: center - sofar.Sofa - sofar.functions + Getting Started + ^^^^ + .. image:: resources/sofar.png + :width: 200 px -SOFA conventions -================ + .. grid-item-card:: + :link: documentation + :link-type: ref + :text-align: center -.. toctree:: - :maxdepth: 1 + Documentation + ^^^^ - resources/conventions + .. image:: resources/sofar.png + :width: 200 px -Contributing -=============== + .. grid-item-card:: + :link: conventions_introduction + :link-type: ref + :text-align: center -.. toctree:: - :maxdepth: 2 + SOFA conventions + ^^^^ - contributing + .. image:: resources/sofar.png + :width: 200 px -Other -===== -.. toctree:: - :maxdepth: 1 + .. grid-item-card:: + :link: contributing.html + :text-align: center + + Contributing + ^^^^ + + .. image:: resources/sofar.png + :width: 200 px + + .. grid-item-card:: + :link: other + :link-type: ref + :text-align: center - authors - history + Other + ^^^^ + .. image:: resources/sofar.png + :width: 200 px .. (removed because it is contained in the new spinx style) Indices and tables diff --git a/docs/other.rst b/docs/other.rst new file mode 100644 index 00000000..2ac25ab3 --- /dev/null +++ b/docs/other.rst @@ -0,0 +1,4 @@ +.. _other: + +.. include:: authors.rst +.. include:: history.rst From a27c26a9b73304f4a92353581c7a00f122322e0c Mon Sep 17 00:00:00 2001 From: Anton Hoyer Date: Thu, 13 Jun 2024 16:45:16 +0200 Subject: [PATCH 43/61] remove unused files --- docs/getting_started.rst | 5 ----- docs/other.rst | 4 ---- 2 files changed, 9 deletions(-) delete mode 100644 docs/getting_started.rst delete mode 100644 docs/other.rst diff --git a/docs/getting_started.rst b/docs/getting_started.rst deleted file mode 100644 index 1929c211..00000000 --- a/docs/getting_started.rst +++ /dev/null @@ -1,5 +0,0 @@ -.. _getting_started: - -.. include:: readme.rst -.. include:: examples.rst -.. include:: working_with_sofa_files.rst diff --git a/docs/other.rst b/docs/other.rst deleted file mode 100644 index 2ac25ab3..00000000 --- a/docs/other.rst +++ /dev/null @@ -1,4 +0,0 @@ -.. _other: - -.. include:: authors.rst -.. include:: history.rst From bb607c9bbefa80a5de074552e59eaaf4eb67a525 Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Fri, 14 Jun 2024 08:49:45 +0200 Subject: [PATCH 44/61] docstring changes from reviews --- sofar/sofastream.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 68ae5a74..02c131bf 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -116,8 +116,8 @@ def list_dimensions(self): M number of measurements N - number of samles, frequencies, SOS coefficients - (depending on self.GLOBAL_DataType) + number of samples, frequencies, SOS coefficients + (depending on GLOBAL_DataType) R Number of receivers or SH coefficients (depending on ReceiverPosition_Type) @@ -179,8 +179,10 @@ def get_dimension(self, dimension): """ Get size of a SOFA dimension - SOFA dimensions specify the shape of the data contained in a SOFA-file - object. For a list of all dimensions see :py:func:`~list_dimensions`. + SOFA dimensions specify the shape of the data contained in a SOFA-file. + For a list of all dimensions see :py:func:`~list_dimensions`, for more + information about the data contained in a SOFA-file use + :py:func:`~inspect`. Parameters ---------- From fe1ed1f9bce2d7478fe4c1d32dc60577974127d6 Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Thu, 20 Jun 2024 15:18:54 +0200 Subject: [PATCH 45/61] add icons, fix warning --- docs/resources/icons/contribute.png | Bin 0 -> 361471 bytes docs/resources/icons/conventions.png | Bin 0 -> 348174 bytes docs/resources/icons/documentation.png | Bin 0 -> 348029 bytes docs/resources/icons/getting_started.png | Bin 0 -> 394969 bytes docs/resources/icons/history.png | Bin 0 -> 426505 bytes docs/sofar.rst | 23 +++++++++++------------ 6 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 docs/resources/icons/contribute.png create mode 100644 docs/resources/icons/conventions.png create mode 100644 docs/resources/icons/documentation.png create mode 100644 docs/resources/icons/getting_started.png create mode 100644 docs/resources/icons/history.png diff --git a/docs/resources/icons/contribute.png b/docs/resources/icons/contribute.png new file mode 100644 index 0000000000000000000000000000000000000000..fb78edd9a88703b1983893c674f348d29cf280ae GIT binary patch literal 361471 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 z%0D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 GZ~O))oGlgr literal 0 HcmV?d00001 diff --git a/docs/resources/icons/getting_started.png b/docs/resources/icons/getting_started.png new file mode 100644 index 0000000000000000000000000000000000000000..8d50fbb1088dd5b4d7ab38832cfa49972b6dbd7a GIT binary patch literal 394969 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�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 literal 0 HcmV?d00001 diff --git a/docs/resources/icons/history.png b/docs/resources/icons/history.png new file mode 100644 index 0000000000000000000000000000000000000000..4be44b0724ae92ccc874ada4de6719cfce43fa5f GIT binary patch literal 426505 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

65ZJA73T*lg}&2cCcn(L3JaVv*ICHl4+}ei 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 G;r|8V+#<68 literal 426505 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

-#_=LVrk6fglQPJ z6NO;Tm+&T@yt_&?c^d_gH4y|lA|EBTl zn|&=XtLSn-z=D%nBGY(hM@dp-mTr)iik6B|4(w_@A51h9ZSsD${=51kjmuM2#XmeI` zJs(w1)TZF&@A&Lk-v8XAcm|jS-}&6Bh^h_X98UAkRSAw2%y(u_>htkBdOucZvc}#U z5flPNEGz%i1~DEWFVXlrvq#@%GuaUM=yIYwVsf6vwq4SpxLTP}G^ zeWu6#6UkomYi*Y;6I9cD-hgc$3fR7U;JHV~CW6>BdXrOM@SwcA!S{iy{}pKaW_$1T zAomHn#V%WGd+)H8x=ekaHuhuSi5AgaHIgSGz17z*@&Tekko1Xriap_SCpv`^&2}bw zl=OX)X@fB?zO1+iTwf4|f2Tnw>LtnWdd@fao5&l312wB&`9)}(F9!!!uProJGUB}ays8Ct3%ukdOz3#8rOr{wHdM`^M2+r4eN{6#dkuc@KpG*k}%{^E{nv`ugL{9x*!5H)F z$fr7G!~Aep7e1}-H#~cQV#yir2l$V*2D4uJJsD=@;-KgRLjr?=SRUuQ$|)Df0YBEc zweYjoie6kRnxZOAa6zXIN(M>HT{OPRAnAtol{yBiz967A`Mw7+nST10KmPRj5S6>a z_KP%p%PhTP)@ApYt)Ji4x1&4y$gcuKTD0}m&M~p{R+!e&i-VeRv8$rjjS=|InKi@7 zFxfSIF~2R1dEWFO^L=^2U*~vcbVXoBC-$cmX`RO7s{3lDq3&Njs^0jhdW`Pl2s$(6ene+I!nsq|d6$zt@}8>-jL;Sq*)P`4N1f{(`?1 z7k}E5C)7g%q26ZJ+3@(jhP}HZlr;D0#_eT!l3q6^<0&&AH!qFxBKD~M*Ak2;C4+xB zPC$&H)4&}i<;bU4Eo~&#^B8RJ?H##fNT542&fi0zyxNhI}#rWc7*I6?OXreryW2)f?f=bw1`+zR^Cpw*{` zD|LR)W`=q0es>hXq#VwK1LNI`r}h!>uD%n9cV!%p=%U8RxWsj&OrCMS4-Oo98RN4V zvPv2Pv}YV7{0d{p1>^1i^Dw1fRYr~Ds-ib{QdE_3xnvRyeZ@aM7$8ko&L8JVl$ zyG`2?f!YVd6G{gXgzxDj!?WevMr7Z$BzHVg6?V^z^yx`Zzj)>?Wy8Po!KJnt6rubt zL$zXZEi?~P(rewib*(7tDQ+8X*C=&qm`_GhIG!BlG3sD`QR1IffP#J zprtYRjV5N#;Pm%&(-fzPlyjTQ$8^??pk;Q6(cIPXN2fO!Kewf_q*#6Y4OQ zIJ(C>>lsecXSGc;E|c#9=aKDO>2i}FEDFlR|7KlN6yLasuh>p%7wW2qNY=@3+=YtJ z6AYVBt^+Td1z;iAkRIQVjBN+mdxNC(l`d9f-suksthzs3i&(Z6r)~CF1R{Z^ zd@S(Oj|7^qkEqPLd(ZNglIC);KO+j;pSDFZLgng-qDSR%4MfW{SF@Ge)vYrE`DO?p z>j79^q%GO`54v1ONYS;TOV^5~D|VD6r9wUT7U%W?gQK}y^=GrAykML_$pmruKu_YG zI&I)uVG69rT18g!5h(6ZKNi*kv~9bP#w=(6{2s&;3|p)qUbfx6^iz2Oc_K7r1yhCR zq`C`9b?5#y9oK0B4i1h3RSjvfdR2Ym6d`X%lfT32E<1j~ak`PNGVk^$S(we+00<)d zt-ru<{ZCHE@7!-RP-qVgnEERLQS?qeaQg{BHV=aX|G0Hgm+W!}s|tBk4V##*$dxp$ z@}z2sh3oZV=$+2w#n;`GaKU^@YT3-{x^)D-sJ~X^gbJCE*}e;7Akmcl$Famc2!3lV zVrW|x)hb%~fRh-tn*u?^o>6|FTpcu?*aW)4%1+wTjhRoMgAsfLGcGCY1Np2g4+F`d z2vf72=yJ*ry#OG*rG4c@f$Byw)g_OQrp$nwBsYe#o_EQOt@{gJr=F&+@kau>bzkzs z=$ir8!!tl^dy6pxQZWS+TJEm zU#asF!LIh+I;|*y`*nZ~1Z*wTnP04Pit;dw=wQfDe22Jtv^&m z^Pr@sE*<6qYJ;T}Qnk^1bf^^2IcV+1S#?-DRSt1OW?~V0y{UUZGvM8{NZG(FFRpsH zcD4Q1e@Wq^1=%k@0by`rns!cx;Em&?aF>9{%?bd|C&WS;&Duum6nq^kDjfp;*^{ro z83O$s#yrM)9rDy4dum0TA#hh&t#sg;EqGGvl_K&o&IO|!Dx^8dH2^>UDZw6_`Hslr z-5K3FITR)=jTw0u28&q=0UAe@lt|K1A++TW56dr0Wwb`+b2}S+7N4G1_|xDdyGKvARq?!9&OAFnBJ4LX|8-dg-=UirrxS6TTU$T$q3#x- zcgyVRNUSC%*`S-o)GYl72Ldg&Fv@i6B0qz*ZW-Tf6W1_gTt#UM_$-9+6PZ>eMYenl zxfb6bxt4w(hi7x@pDFgebummx@lB1F%~pmMoYhZ<6LWrn1nbYg4{n<40z`;8)mM)) zgJ@e#ia@V!T^8uo4T7!%x)|KXlaVD9>)4~H3`c{hm%m_j@$O&hlP@M@Ai%@KRgbEt zustPK_4wizZTR9)$|(8vvK0z{q$6-Xm%N}3f39S%r!)DIb%Na6I$`HtB;fhq(T+H- zag9#6OC(LBRj#YCTp{~RYg(4-7ekbfG7z&6@ilCz0(Z8+n#6TT8|QGPu>veqz8(PN z@*~$Ae7+rI#tIn25k6yJfvbGZdwrl&+}`U?9nM38Vdk;dyC^#&s3TGghfYun4ZyspI-uGItv+PqDP@pv3BHS&@Z;Q*GG%>vLzt_h9-QY9zr%vwk;Sibd~tCe%&|=KW(iJ*QR<{z4U3SqwlV= z^@^xF9|1M@Gp?X{KM8cw<`5tLv7W;qxuahjGG%$B&iLiYrf8;+$zwXZ_CeW}f)G#ry8v3>n@=J#XtFV67#7d;lmFw@B3mr9;QdnxTMssb zthaG<0y-)~$rS&mF8kv}B#zLKn9Jp|EN!`#Ja^60=Qcq_7EM!B6+6ArpUZO`aEmiU zmg50~18LPvs;#;=7~KWI`hDbXHVu_pu{182;hn!P4U+SOzp^JbJJ*B3eA`AUdX{Ey zEg7g~4DG$jSIpK@;r8DsrDV=A*L9&n%%2adS5k&+nj$V?6Xxq|aM}bj#@&BnWgXJH zd`-GQ74(Kpt{bN=QncAmVl5h+KHE3CY`+cMs!cY7AMc`a8S1Ru>FouW;wzZ^4KutW zphS~6n_d3Vr=MsOyqtrlR)@!M%=ajR^pjS( z8dI5RWzC5`?Gs(Lne0$twHI~^B&+RHC)tDJf}&@7H%p?Vt=r4?6JKk5wZyw;9$WwP zz6KvEj})Y3R?OjR!0K%!10!t#*0M2r3A_p|zFL$gDUysR2j`U4Fw4>mq2#_zIv)p| zZ!+g=Amriq*uw*LtYht%piKj_?`|zgmA3v|#w6Mp$(%;k2u$Tis%FFl4v$wqeeTQ) zVur6J{%P3yQ0O3=h_7jPfN(dzdb-h?)<+v8X=f+ExXkMTG0bi?2Pot=G2jxxfGL<% z|DLLqP0GrBX<=89m|CI8m%0&kmnT!D45yys)A~xl3jwqQ3ZNxuUs{F4ooTDCY%b>8 zt3~%8Ru??1{zz(H_r+cK=$0g{TAc<|%&McRL8gg@ughJaEs=&zewKoln2UZ|G>eHg zMnSc8R;gKd5s{UWe=~2;FfM2lrT+}u4uM11LSd85t}R+{v01n;Es)l7$EZAg@Zy@a zj6avWQsE#k^yXXC8Ud<&$&k8yvu=!;^y=_?&62oCTShGzM&WY9)Cp!-Aa@1^sQ4H# zbzAO>x(k+C_Rv0f$?oUG|8W4M?0aDhowtzYK^%Pa!&SWHD#*YOxfvEY;mB@+aFa?q}>6YzJZ6DR% za{`Te%uL`m+mgm9*N!J!&4jIbMP~K3=mZ~tyGfv}l_x|bu!rwpoi9J66smf;PE$2^ zV7$P9meS@^aSGe*ucG537L%xN_}+Xa;C;TT?!7D+Xbl6kQ`*o*p7!O_=e9x36>zM- zpKZZceWEr_WbY?01%S zZsgo#8d2fB-Ue1c`Hz3B*CIswQ0IE{0slO~owmQbL{3uYz$`aYE<3TL`O;qj#LShq zX@xQ6`zTB)ulVOB9R{!OtL;`9H^b@8;ldo_Qo;C0E}Bd1 zTNq~OC3@*p$GXk%9ZZQl{D?ktHty}Nev8KcjrKRDe`w2l4SzLt+ts4=3QM3IYb|#k zRtJ(OQ|Da!G6}u4o>jM=Qi;8(uz*u1 zvX%QY@J~m11&+>Pd>9(q&Q&yiGra2`dPb3>P(!snb9QXQVqJ}ltFx#HZ`4arMA8oV1C8v@;Y-@Us=Q6>`?9}0CJ~OM0=>Ii{8(k98uym!@CHZp?%#clT&&QNO#Z+f3#gk z;6~+T!|$y?0t~Zn*edx)3~&jf^av$eye|#>z)z8@jb-JzkE!}yew^Hx$LMzP==w{U zA^`F?+COulU-sm!@CrGObrZB+q2*)7X=ApTe&c6?HwJObW5kU;5B^qbca**gJdDE_ z<#uYi=0W}p(QBrplyV%xnc2*r8ISSh`q^8vRVzeuMR6gP5|s-X>rfA8wIdfznO_{= z{G7M7>%y9CCFLZ%3z9S~Q&n5Leu4Q<@nXa}f@VaJtGKzEZ+kbFvaF>hN`Gxp@@XxM z9h(D5&ZmS`%N?dWiL_iUpDqXkE5{LR8ny($3-C}y#R+Jd47m82-f^TrBUCKEK)jl6 zr1Y5AK7+arQXB-cJgogQmE%|}H5jo}1!ezkA&)>#HnD&L%BEkj6o0ljLdYll1o4zp zx?a6K?zZDtu7VLX%|@*t7n7{}v;&@QfL!Hx{`*#r4%##u#9r&Ilz%g3W*)gNvZeR> zAvoI2e;yh0n$3yy!v1=vrt41`#0N0t<95dv6VU-)J6QZAw=QEw@(dJ8n?p(2X~OxX zxCz8Kk)GVLIzs3DimZ&|Ql!zNnddw2K2-mz?5En_^Z?tt;-q8r;ph~Lz(XTC^a6U0kS z$KFD21WoR}lDIA6aL>q=LEsSV*P725tGy2Kt>d(#8gDn$@8~mB^nFBMXkxXXGwl z(Hi0Tkt%;INDZeT!>Bpu3c%tB#Wr?j`?a4`=K~`nN~UZpp}eW%jXCsnetEIH7g zfwR)WH-OBSX%A&+j9P_&h}}f~Af_w_Vo!dqTes94(S}DzWFYXQ=m>4?GrC>stN_7; zJubNP&A;UB_bkeWA?~|c6o0jd{3+#I7$!~51&@ZMKo+6gp)nz(I1 zWfpC4!|>0U-fd>E#S;?kLN2H5{E{JB3Wn&l&-%jKoo?3ZanEOaKP<1gcsw5^(xxcxB zKNLE5j{h*-S@);9wQ%2Eq`M2Y_1VD{WlR&8rIJWjKU&$yMhiF~R< zpXrfnyeZ_Ouo_GE$h0{Z>q8uU$1(AOiRra34a|_fZm$Ne$L_T!i*n4v|fec8xy0Wa|PSNvNuig`b1hVzUAF7OYK*1zkSeshUcgA`fR=P&5S=g@96eR zw{_j#-rKdy;!%6MPFtMv$EIGmx8+ zDpyQN+x;gMC*PyL$i3G+P3@n(d3N2$Do=`0v1*+0=u4Dxl2iFCk>Y8CCci%(JL!#D zc=)G3a$(DGSPeB9QYA2!3cv#@e{yIM0*S2~S**08b>?B)xG8tlEu-xUmX(nl5aRW$X`BN*YV87Q}cS3+yaxLULZ37E3^ zifF1_g?C;Vg_rx~)+TEvSNaueS=WE(aS5BxD$%{K4(^oZ@bX(r%B52zP1xd#_)j*5 z(Xp)TM_*!9I~SqQ+&}GR>-%Frm0RWrgn(`&w-@?zG3m7Xo0|Kor>O(7T?g;ND-X1X zZikoBQH65vd&e+CV`vnHP2DKybl-}UkER~c_m_`HY%5u?FKv+mHQ)(a-TwAD!PA)N z|Dm&!m?oQ5`_ks8S4swYAUqWfb9Av|lN7E6saB9yveJ=#Ep!b(k1G1|R4>BAi z3RSEHvwagwm+Gy$!%+|sVV;m@SJXxZOOGXEm^KU?xsqbiOyN++%@zoA9IdP!so`wq z>tCz{X#}i?^v}+Ayr!^SV2y3#DJ%)%y(+^QTQvxOcCoyk!Ej~$1sXrE2reY%kY1+V z-ei%N6v3bQE_CU_$pR3^QC)J$b-H(Z#lWg&V+v3>M)3A`=r(RS^sG{R$!|idd9*s?G<_O zwerOcWXxH6prsSo&ad-{d@&Y`77VroPgh^mBhA6_q)|yTypJPxorb_+>JQ`|IPW!X z0L)!^SBp0DVh7nofkdy;KIxcUdWnWDGr~Bf^#-bZR2JQJ>?!*wIvesbcdOg^;i<^b=?xWzF*E}gg~?s zg0IW}?v%zp)BL(e_S5jD#0fo-srFMK*Y|Dor2 zRBXe8Fq>U_E23m0)$nEg5Qv%Ef0K{!k9P4Xlf`NEba|To$T;<>Z6#J@t-Yi^%gsgXcW!4NdQQSh(-?@rb_e2< z;A|#>k~4$=pBv1mz6)89Km}I!%RUlWg_9s0uHSv=sjCB3u6{2YoFU6p=zB(OIbQ`F@}L6bM%8DE!?n|lPsbpfg)2o69ryd$$sces8y0Q_xE7rC-BCtM zgP$D{Ac25MI9w*!I-|!78}EH-Hy(QKfJ3E1eK}ic(L5drw>vaVFs?#@Pn`g1%HKI= zo_$33S|3PxASfT}$ABOqnk?(F&(oE;JWst#pj3-P2A*j|t*q>$1vzdBP5g^)6Uc6g0pqY6y{Lup(o9SyDQ>7Kj#Nx zu|y^3_;pkMOi)WrS=c|@bB1?ZBvv~LCCyl%P@iC!65zyWkPAj_)Z)Dby(S{Hulz?* zM9BhO4X|bj$rgLyhN~Q<1L3!@Wq_t$?Kivcg$C&qkej()x~i)7&SP=}lGu%z$4;^V z*hi)ZWVh4Idk=)C)mF7Bei&K;fS>2Jxe(LZHg|6Yw!1Ro&XrS z6EFhU+GM^dNaz#j-t$YC_4&`$-q`c+W1SR2{v0VK=RAy$Syje!tcmoEuT~W zq+{KVknURW_pj^#=6D;;FamS4e*;U5n#@h$%mOj<3Mw5nYd-?UY|GUmRAl@NEsK^k zqcBmujUiV+`lBx=XcyYM{o#f+J%iSGK+yA|MZg5Jy_*%Rk{6$~fjc*%is~a;Xn2=| zW%lo)t3^q?rBEA70jUYzTCzYo5Fpj_;>kZ!*$_0rjM=PV%!ZYyC$D409v9m2LH3rF zZbI~fRyGL;$f^q1uUcLexn!YEB@V&W&+s;n1Pgb$+l9-zh4BLwIOUd0IB+7IQ-7dm ztom-{^#a0l8A0cE<}If#(UBs2TDFECBL~DXs+!EAux~Y^f{GSshoSGAt5_v4=E2`? z?xX-8cG5A?m}5NRs9d<1Fjq4M=)PWI4x6)i4XSU{)V6c@s$4%d$OW-n4L5Y7lg>gb z;5OdRc8w?jN)#{btQ;MnBMSjXFQCJo=k%be@7u;vFnjB0-M)8_fexE79o`~|Qxwyt z#M~O{MIN<_Sh*dJ$dkQgz%uncn;I}eGiG~3eHZBm44?NNv7K2ugKqo}vj|IiCFLLd zQ~J1ywF2>;#GA=G`|nF*Mc#P4#+vz}VXEOsN;~&|g_EfCI#G}KRO^joqq2U5%njOk z0anz*KREi%zuQT(%~e~pgerqV@+Z1j7LyG%hGC+{20ypi%#y~qu^me&h7 z)a4Q<+_mtE(%KhgRmobf&xIJ%Ng2-5zsU&tEs7|+Ez?i4zU!DY0T7oE5ElZnN|jT- z)2_ZK=e^f~nxT_wyKyBqgPx|sHaK+?V7@|PhkcB)Q9_Rw&G&ecbO$5}J88}(>6|4- zqON2<1hl$YGNQ)1lX?WBka~@S_vY`z5)NBQ^%CUo-b5^%q{B{m)ca)G$4T$7#Z;*Z zL~5M=7Le0{asru*B8OnuW+|=~4Wn$D@_h=-SW8|@YUe7!3e6DaM;!h%P`ghlvt`uy zs=>AXff-T0k0b{h5k4$W8y!>>4&SsA!BF7vH#^Jkv%|%hh*9MSIJD_!BD1FCyFGO+ zav;(iOi9*nn-zgN(9k^R@l5%?^~mXvW7K?v4T1QFY}5iCfMNlXFOA0kR7&W~%H*;& zS{0!8%sE0SvFD>z@i>oqGAEO;j<2#fLclG@Lfaq3Z+;FYA)wg_osEEW-bi~@X^>$rb=e~RUNODFz5M^W^+ zr@SvQYu3V0o{v1)kX?hDK2|M5v}6{;kkf4)vJlEo$-f!3mb-2G^=iVq$9rR)HT>xUf)3Hjs|PWgo1O*YpAqRMjx_SmxfYSBdGgS#mg zwu>YWNfaYU%}K8$XA-Lo%J*kMrp;px*a?i&4)(?m1iX~R)snn_4S_tg-Mc6$jvioz4t0>P)Q`m}dx59ec_S08p%}A}{JxOI|QWpR}x* z-N|M$Tn0;XTaIz81FJD5mHm8tRhnrY+d02_+_sXMncnrZs-w*VC*NbW z2z@gXv0S6(6A&)sQD%I6JnswxocfdD95TDk9Tt=;LkXUa;cyizkWGoiEi%8Rz5*RZ z{LTve>R$v~9YvN)y%z!g6#a+wl4-dnz?BHhqeasp2*uo1lCH0RzRa>h(SxCev~4{{ zTeW3rg`}8?k+*I)W&1hjHykaN(8)|To0=tk_uE4-dL7CF%XO-Wy-sW%hBT#NGjn4mqJFmH zJKx%M_$p~@s9!g(TRfPO{^R<0X*(~Ni3x=8A*gS?d~KRSdt4S|RSG`04YjtIiPVg4 zoMH)qm*z{xykj;i^z=sGuQIu*=Fubm{SfNgFsxw|xS?Fku?}^YM|x_*&Bnzn$umZU zRL8Y`+~uptG}4w4c}4Wd9kr3`?l0*i4@KQVyWZ&^)UsP(1>IeT1OnhMpTk01sxBZ< znOcVzQJ@BdT#FV-m4`y9kGI~i>&2^ z<0z|Ejs@%yoz!RaGm~`@x_36(lWV;l^7MHQFFH}@-p<^&@04O)>FLnk6$1uz**Mi@ zRR8W7cfMIU{NZ`ePfvE8<|4b%vusA6CCmT#*_P}6>h%7yKfc*)ex|r!Rn6>(>zx<8 z8|?nCSHFL)cW$@rHo>l!9>)g#chBRantFneEGuZFQd z*D6{R#6#t)%8-DeGuGtZ8_D^(WdMAPTBE-ksgz-}#m=7Tv|yt=j*jth zDuaEWrb_E7B(*=T=WNW(XKMXRaP(?7EA1|GOIFEd&=VK@gFYY7{@Y%jPd7#{k1U(- z^M>pcI@LeGBM!yF#IxIWl|`|QmR0F&?V}e}rz+k4F1s|jy%YL}Y-spRzaw5ozvBXW z7i48gu^i!p?w!%SZvPgiertC9u{pl6WxuDsBA;Aesf%aRc9lOErz%Bsc+0+~)u=D! z9|2CffJ*;+jq?m7i>#zIKhBq*exmak^heoHc-wtx1rj?+le0?~W$Yiq}a)wj)J!-Sx??_1Zygkk`UV1q)X7GfO+dAz% z?>@sjiU5&Bj}xlxNOATfEflRYYW;)cmd^xcbrc0zkvK@tBiZN)fUWY78sFUzeH>Q( z1J;<=mcoi;jT?bBRY$h)Eh^dPMABN_vZelU%E+DNE25Vls^OkrZoXQyNJp}j>;3E! z?hbCkgmV#}RFo6Yv! zvs_OpH8FUj8Q$K62%E8nA5k9s6qm=4>~9U80AA@~neET-`;xG46nkp>mhD-N=ur>w z0k4Bb&+uMFd%)K!GLhIFco}I2hDQT0(jn;Ce)_muKU~d8Atan6NWejMzhpQZL*z(j z_)*Im$M&p@RIOGZcZ{kh_4{`R-=_SBX4HYe+e0QmnjYTmfwJ~XnE507{9F@w!NO<7 zmLuFC9SeV>H&7pMZmPCYHJlvGwREzJC@InRo-XzM92=tCf{?xAXIz4h2n^Q=DlT2@ z*G=<#QslZBIK%Nn?Pyxkt`=c=DY7h#Aw#1tkb#}~640+8Yh7dv9p{rKfSuOw1rI=O zQ~Ll(iN$STB^|d)t+9elK@lBFGMJsGl6!xoiaeye+sPwjUU#7a{7|R$dlMo$KL;Ri z3?qst?^wb@@*XJQr#LPFHY1bYxjBp@U0FnK5v7tNhBfkk2-=M_oc( zwndV6_G9JgWAZ+1{Ob2k#XYJ~1mom2`663Rxqj@W3t^|$chMxjz}`1@U>f_J_Wv|9 z&5l$q<}v#e>jQy-kw{G5zt>y6v}K|;Mx`%kWHl8TnG!pvG%jmyoFYr7TTFW-M7Ox- zH{-7st=1W%{y|D}0W>fGR;*JLzZ=h$CL#Tx=Ulef!Gxul=rX&=mbdF&V<94 zCbDkj=?-vSTM9a$OJTG>r}dyfhnlfVlf26^pEopqH45lyU%j5%?jb#`9;fOxx}s~q za1dmzmdYv!;!XlT=kSG;Ch!0$$XTc!Ou>AxcC}ZIO#{)*i)vRZ z+!evY-t26%&R?3U^Zf&hX}Nh*Eh<@zn%ZT6P@QCNLEdHc|GYrz6l!SyDWx!-zVVLq{tY` zqv@Z5#W}b#AorB~P&CyzuhmATZOhPV zPTgkD*QXxBT~Vk#C1tkFB1=mDp&_4Z$pN72Q+w?%Gw@G=dz)qz)cjM~I1s|O1D@9? zT2>%Wr3+!yO-Pt*EwPe@%%a0y_MXQY2=kx&ZfpH#GM%h|RG3k-{l&zr#Qp~aCbH#Z zMwi%MD~Xn}6VvH?ZaY@HIbe@MmBK9Q9A~=?2tv6mwa@JOx{0be#Xg-HH|u?q;d5+% z5tw*BG|LvX2EoG|zOE=M1ntog3i_U9J`tHd!MlGyYuhiNBxE2!hMeiajnZ&iCjmaA~E2q=*9*TA^tDACaK4tXesU@hGU*zoGqI0NZR zEtC{em_vo7o08%5{DL;Br59_1V@s1X$i!YgBujEArMUMP`GwR<=!ar=$E}`2#_W3 zPJel+Upoy_OJgWq@zzK_(hfXrVpc4HEvqp36ApQO{Uu`fnH^k5)9*mw1d1Ytt9(}X zP=;nY92=e7jSF~>P;(LSgiY9Z6tDN3`ge)=OAvqBW8|}OhFkKD5pz-Fk-N3zGI6TW z+OJTcVNC}^6i9N*>JxkHz2>Lb7C0H}ZwM=pg4OM!*7uJ@;cyc!H_Mp?L*RZlMri&O zGRJp{fquO~%A@Kp+_1#i~x6TX^%Nhr|g#ZA5Ux&a3Nq1gGg|D&Trj6E!k- zj_;C~&JhomDG)~-o~Wx$dj7{a%V-I>NuPMm^0Xg$vQ+#{9uNLAM-fTXqy$u2A0O+V zq&{i_B&R9}^Wc}(`gOP6>nOcU(Wj1prbJ*;E>$dgVnvgpS>oEx9s?%QOAbeTWcKg! zOUCuUnivy~QRzLq9zl?&!hFkowM+4X`rP~Q_C<7s2DMxM5U2wfq&=8Q7u!LFQmd5> z1Ulm^t$lJ|QI}@g`#wHy?9J5^CM_;J$=kav5B+j?)Eotpn}s`+3pYiTv6zL`z95JF z)$S-yh3CaBUwg0bP~p{gOFyA<-=2SFcBF^2!vc79_O+A!RO~>1e--NUEH=$&juB7`DA_iZoii@Cm zF>kl~3A-t{wo<_zuI?dwO%IjVPlc|}0#M4{!tNjkK5rjbWWpqa|I@tU60vjp56mND zu&qeX9F_KX54f7qV_$7O>95N@`yB{O|6$S~&b=I&GzOb`IpL=~Z=(>txKJhGYQ@o0 zyW$&0tD3-FNEpw#P6<<$vQ8d=*(ruUFI;ino=xE#z~G z?WSJn6`jp(8Jr)S?g(5?N4?5|Jnd7kM-Ctp9Q$6Ib4+L3tOjZ7%4Y3jv|h5?eGmkG zb%pwn34~D&iY9BZQh`xcB{xWsQ;2F8+-auCfd~=v_K#LhYh3XZ*+4`nt+22mD(OoV zVg3XYwr?@!(uLKE>K8{_b~(cNFL8eShW2IhOUY4JeYvtn*yE8Z5Kp=}fS#evs;E6s zMo~g^#<1D$HzBm4u!8!dt4zrQgu1YoRf!cXnQq) zl-i?s@PudY8Dos*nyIOYg_seaH`g!o=~-GcQ8it00aoX!6I%*1pJVn&?=9)yrR8pi z0lgU4{zm6aq2?h|s5uaGO%FRRMR#YSG8}Nmw=cY5v<{xlb~lr&83{V`X4Y4Q6oDm> zXrCA8sadxNVZ;}80HT{Lgv};!r<(_*exoI;DD%*`EfYIOmM|IKEZ2Q6|15QjiiU0OUqVWYvLTj4RIIDX_gQ+`egp0{A}NO5(VcLh zPKW-_QMfAN4!fv#AwEYInX*(YA{^XA3utD)#OZ=&!>0{1HDg~#Q|6?$qWS!eRgWjC z!gAx_Ush}PiePPh4!rF0=;cv>j#p#JZDe7qjJlMiVWLk(b<+5?7E~Aq%1V1b6Y|T) zTY1wvfwFF&-0k5qMFK<^oD%%5c8Iqu2t9yNw&j0lj?^gNJ4)!SWJKf~>k7%Co^S3* zR_b4Ds!1p+C!DS;Zw0`D9e#4>6Z6O=FJ2(@{Be`+i#fN5J8nci-0SNuPe+px&nF{Z z$}~8d5<{HX4zN8zzUr_kF?QdOyYuf$FDAUWR2Z3Yc&6W;{4J-FYw{^4a6+eE>aQ7P zu~j*q94vdw;0>J(-q1t_XsRjPP=^9+*0)vLg=~&2Yy4q-&UMsa<0zpeFUl+N&;uj8 zYu{7-h{bI+tyPu5eTQW`9;@F0&zkHPTAJ}gW*^SI0wvMHEp@e9Dka3P?@+om{<0jE z5s8Rq)uW(Sv1Q4msxgR|tob~Ay9olTA71PsTE{@VHQeFrVY!k(T`Wd@QiMvGH?HRe zQ>t>Zjh_H(?-N^Q!zAW9?~a&Z>D#v3Bcvz}Wr)$Ur0CSlPMT+eu;lq4COD9;Q)Tzj z%!vaMEKZKs44pFgHf28%YuN;oM{aT~ z_jKm%nZGA>xA|c3)IZ<+RC)Ci{ou4e)qPLC2#7>sRneWdXDLADqrby}S|EvjYnz`; zx%?^D;^SCwWe=ZHnMGc*&F7~bbUojG&2N;x7J$n=RGmkMdmzd8r}Xcg%dOwMyP2qA zW#Mz2twZIy!>_f?o`$kzV_zeiZB=i(khhSfA9~A3Pdl&3VoCZO-v#|oe;g1;-7ceU zn=Tb|@Ek&$WKxf5c00hg-pw&6HY^ zhpuV%i7Ly4r|eT%wEE#de!wOwg1$GN-w%WUtfeJ4Z)(m@u}HT+7WZAvQHl~m%A2z4 zc9tdDbd|68J8#^ELV*|_zf=rSR&U;ol7vaZQq9w(Ns+}v(uZEW_rP{=y1g${%#{Su z@_rgl=^n&6C+bdy(Z4P3Eh@TLzl68MqW|mM-^dWG(dm-wH#L1H8+AF5eW@z36F-qWYj9Hu4!p3Ij654Yv& z^ZQn+8xiHdC9T{J3vOF~;MYww@D z3_Rt7`gM_6fp?EBte>D-7Sh-Q=cP^w#hE@+*)?8I_!nMr_D4l*dilv0r{*9g+Evyv zv(Qtq<#1By{f||r>tDQxNOFg~8~69c+e?cgtflA3xT{}`+aO>}Vo#8}V;Tb$7b?Q+ za`Nk6G+Aa3-cICFsj!zJDHm z_T@l|ValD>wxdurAd}TU=qHbU+F$zull+pFxTq+iLh40+A&c#$H29qI+Bp7_fWcos zNptjFFrbt2x5+S4TCp%}&b#?rhYkMfapX=&v6hW(@#hmn=ikJ>dG=CW(1F%Q&H1p15#y5y*Ph>>qo892&YCo; zL%Vq;90tA1-=%ZcQ{E6bs=;gdPS)UCH-E3j0dQNOuM7U-UmB9KT)*Yn;0yYHDi_1W z;S5WR)hPhJGKwFbi#~P%IB_DXS)FvZ`RaS+xZ!uj_4X|E7D+!g;QQk?Eadw*`$93j zrAw3KH*EMHN&G|nq0@mU!`O`j3;tT&KZ6y>bqtx4kN-+U#0%J6Bx`PcZ14^I(_N}N zQ6*y1wNB9 z6rLZKQ;?8s@l47f8nzTGv1fKR{mianpkUAJlXeg$p66e`<*`l7IQM_m{KQs8hg>-Y z!djN`~cED|8W+GjXi%_?ubpx%yn82yKx(fp++s{oBu;Z@x+PSTQ*b$*6GFNe=?ViaOC z`+XHb%7{tqWV`n9sJDwvXx?7ZTy`eaepA>PBgRkEvk0i2j|hF`7HGVF?DylP29w(*@hBD#;1{RVpKu17+Qeb z4Yc3}@m!2B0oL=ESY zNf?vt?J17JB!x0rOinpFko=3xq7_g{6(4FFJw*~d7+vczqRX~JCg9Fpj~94&+7Vt* zs!kI_3U?KZ2j*%)`Anmx%oU47TAV!FLaQ!6nRnywoNiZo<-WT2>mD1p0kgW@`6E-> zC9mh~ZvG2@`u7_p)#_PY^9sM7-T%rP&ztim-M1NbQ0eb|Y(dwxISzFhf8&zHV25L0 zSQtH-JLS&bK5FpymLI%!<|~HZ=!NV4(i~pIKjvXg!&?5lb$nTF_tZ)i=+{|(i8j9& zwSb)qcmgo^bEE6sQSR^>FL0@+*Udw1U+gjXBmSvgy7(mvDfGu)G^^{*>&|^_|EBsc zu`l^=INf4}Ef3weXrJQ_FY@@W*{hJRD(xNP@PNbbmv50Q^XVe@6x@c~IQ|IFml%9e z^ZrJuL&7`Ux^vYNpP3(i$KX%+XUlFe8NGXVRIZfG>4B~MDG0f%3dv2LV%(jMkf#%keqzJ!eoj(x<8{tz1^p&QRSa)eX%e0q1%~yYMj_mHx0*oSXHc7wDGO2ajckR2Vqv{)E$PUmRFh5 z{QMIyPw6NdHk=OrdHHZJE@g6DWR*aj(#6#2Yga`9ls@`6W@Wygaq3HMC#Luoe57 zJHQ1OZPPOeT%7sf@Lj^&4-O^cTCFi4(vL+nkrN-vY8U%LcL$3KjkZIZ~; zJp8U{qRO4byOzKCQPU`bX}40_k-Ku`p1&jbnmEe> zQDp`%qnzP)I(U0o93iP+ro#(AzCOf@=!5dW2r?T_!Fz5Hd(Q)2JM$z_B%sQTd;V_V zzh|t2h*SX*UE)IyIdpVL z|I!4D%t^rQcG+eLWLrN`RJQ8>0LF%?>_`)8z4rXQMewQ#BCp!l6G^J63gJUVCPcmB z@po9uTm&Gh|7_;9CVeeH&CNsZeC)Q(6#)phSg)PQimZeX6C;?qP3()L!<^LA1FwJe zaursuc=TOhRN1k=J8@XLGM*pK&*6FV=4ZxU-QXhuAL_!E0lM5Am%$XPTc;8ooPEbH+eQLZC9ld*J) zJ@!HeKI{6Dmvs|CrkUPSU$;G++)^Oou)mh)mM%0t2+csm@x1=)7LTrd%rGJ=9+juWY1np_We~%npc{dQW$2RBMrwY&<83jAZ|Z zA}iZ%Hpj=5OFu1Udw&5}8O4*=_Ty&&%~HjNd`D511rJwx3a)OmK%s8FoNOtVwo}r^ zaG?^5J6W}oSTw403+}za1rwvFL;5?JF z8zv^InbsET&=7hfz+`t>^OBdlWbV@%cIUgrC#S6zZMADMt=ls=LI+cpUh7!if>)UpWFM_UOu-|kLX!#;}3$TJ`sCrai}6@fyK+-vr$AybK~DH zPm{VK3{-c+`K&HHpQW}r$@hXC20eElk)XDu5Kif6GNKdvvZkedb}Xh?+~$WzHf|!+ z?U#OFnRs1`jg{9!5A$6>mIyorxUtm2LcmkVJrfb#eKFIk2bO=N`n;HvH*Yod;9{`{ zFR*7pXv-P6kW9YS<%wBc1@L%hnG=RwBcKKW@BJT~PUqG}_c`dZ+s zE$5337}mQ*V(-(18~E5D4sHy6Uh{B>?*_;Fnk^?ArgvVj{-eEPzOwq}uYX;+^?Hx@ zdc5<;^&uW(-}_>w?C>DxiCunrNB&w?-wRhCO`cRxFm+zrH$ej*-DptNowelb+ZPQ> z;zhFEw+{O$sDQae9wrggp=7y>6d$Av@U%+;c=>b6UW-w=z^{5#Hj6EaSz=K?5cj-K z0(woBEaGot)8vRGtd$o~wxcM^u<63ZemUO6Qd6yq$P!A{t%)i+04U_jT@$4@S)n4Y ztO;&^<#*VbVI7D{yGO!Bt4m^kt{(6+mpE!x^v~e$O8h^*dVp0y&?Nnk#77&O;WJ-e5wf(4B{nOQ>#8jH9JtZnX zpI13s)UxRhFxG#U3ri4t@>=Z-=gUkPgXmXVor@w8B=JnlDDD zOxgWi4Zqr$YZcKh`LuTX&r(hk>PN7cejIbC`xRj0re4z@mz?Ofi0M_U@#fW+ZU(_; zWGQ&#&+2GfbCwc-X~ADh)zpe;h|L#N8;@JcyKrs~>FQde*7{%ZN6S#IBlV43J};&- zXZZx^MJu{St#OdZWSQ+IB}t4Ne%OUm|3|P*Nu4jEBr^E|5_Uf z*7|K!AOsm*xzsZL(L7wNNR_JGpZ2gqBX23_rH}AmI$oscM4gQ~wqYtq64~HhQo%{4 znlD83I?JNns8S#LnlR~r!~0&oRSIj-u3t6#>{_n1tD-u;{uu&CXFF3wziU4&ipaxO znBhOp=RBf?Q6U8W+&&B3? z9a+0QWg6%&lRzI}j zgTDB;-z7(vNci`zZO8G)dK8pB_mChQs0?)xq65AVLgEzMsRw znXGRzB?)|QaVu5io6lXTQpth1?)D`nHW_h6BK1bfDQvS&Jjr@6$c)QEK5nlSK?4tW z)Z6VSOQUa37tEAqv502hn#p8Mqki{Ap$R%8{%vd-97tORhdOkU7uNlRd%ca<*f}>b zLbK_sJ!Q0?*zM{KQ+mByG#-*?W22Ctf*?@yBa}NWkq@ASVgk>Bo_wTY0$(8zSxR@& z&}3>lanIIFQt#WfV7>5rMol?V1Pt77($GM_wLX$lqXCKv&C8 z(xA9f5J6Tg7I|zYocki$48&~|de>nhQckhgE4IhXkUb{YvgnsTG0Uu5?>siTYr9x>Phb8qTq@b*xKslzEi)WL%H-8vgnZifOHdO&fH-$Q&c6Z3%vDY zwv3o1K>z5nl~9Kjx&vf5E+77Rx^}J~7Os9M zu#CNTOws+RzowcyDq;pNno_fDMSg7a?y_>9Xo$W2^bD@CJE_7t1>+kFYZSx5wvu({ z6zbnhzQ&}*PlCOTQQfw7>0O@H&0Vo>p#Ob~_N;g_wwp&vte*R9H)EzzkIhl=%;I@m93 zjLno(N-E*e&$cUFEjGv&N~fUQ6}?V0g)5PuleJZ;YxK1M3A{6gIr%DLlw}{Oa6#qC z@wTU@f$%&Vx1myhL>eb=U>m6EnqFo2T?81PBmOpO&E=*vPu&fkQGr9GSjX$G3Oi0a zOu^PNgr~h5^Gz`oZK{s4W6pk@Kncqwy?uC$F& zkiDwfXNqLY?XXul5QqKRy&FHbVl6hg7h($gw(mZwIzrlBEMbX@BqTn;G+b~Nj8SWT zXi^sQC?hr!XErYSKU#pFaLm>RNLP5Xx+ zX>CpT{fXDsy=nPH%qHd6 zJ)SsoTf2TU{H>zS*B!c@IlA}5?%(-(tWtHB_L;5f{B@tL{fatW`(|?AKPMF2-DmeX zm-}}h-PWDewBTP%Fv>-1HZQ@!t%2Lij^F7YeueIIPj@eWR6%>$S(CqgB*Ilerx6UT zJ3GcvkmImf-dA|AI;UK;dUMt+-?*|BiVN5JIh>7<{y)CHJRr(y{r|P)+P$~n-s)-# zNnJ;1QBgCNM6j(&DQ^+^L15?X3r&u` zNd@9Zi&jt-{5Y=i|5|R@C^AK;1S~)0AojKE%F~xrMLkB3(@DWnoRi@`Y_yF&bE&#W zUwupWQqFN3v!miou{a~+*%=-D=RnjU99)+csjotY;(VujkgiS+`7XZOlpMW-3KGgy zA5%rCQ5Z&i8Yh!*MOXHe-@htx4==k^on;Uv)mwQkxD{Ep8dVzSeC<%-+(1F3Gv`_3 z_gK(^vwE@8s!a=3BRf;nafdQ|^hNVHzI-Dl956GNi0C8b3{OjQ_!BmHDqX*ylgNI1 zc-|c=)phgve)mvW{itc}|J!MBn1iBPP>GB0rL0Tyr6`x_g{;mdu55wBLRAaYqRA+6 z&-J+zdINT#1UG>GG{y*#4E)UgCCH%rf~C)-C0t zz6$3yebsW*w^-N`kgU#vHhuXh_)tcNxzAD6tv*Fn`sO&dj2`d>vC@h^UX1!nlZ_z$ z2H}y!Uwc?LiQG>o`Pg-8*EaK=7_R&-QvzNg5>O;czkYz1?Mzqq%<$|pik0~4!#bOn ziBz@5N-?Q%S>`S`VA~n0+&@rMaSaSIP>i?yiK@0>X&cc;Jw{N)oO8(+&x5tLl4K`G zU&uDc`~eZnHuGxAW2LCJfC8LL9=@T-9Mzr5g+%8_AQ8qjPVU-9u?ppzX@r_^vS*9( zVbuK2J|qjw)_f6rNPV>DfuT$(=V*O82^T)Xq&WV~K1Q#f+OL}NKCCqwd%Opm2QCV) zpWh05vr%+oYFGDSgE+~v${Q-H$Ov%jL`>18YKs0%gfSoe9$X_RCh9a-n*HSx)!x;( zQmAK(Q9|V>YCyXQGQl}M)gddU2)`v^tl8YZ3FZ{mWZ9O#SY2=s=T|t-)>qC%4W8e( z6rJ@9_W^cE_;}@=AacRus3*gpp3Lhjac+8olt_HJ>V1Xh=_HdSUt3&hm+}<%`oI=q z3-su2s2o1AO&Qi@U5qE|k%1AdTkmQy@)}QQ*Z|fY@H%@hrsXghd ziG<*eF^sqf$~?u?DknmGT!i{SDoISqrE2Qnnq122qe=#2wg5H>#>_)uNv5&HXzDHe zS^`qmqMj)~Ci?89YAR@wA7;0?fq1$}1EkICN|7DR`F94jv+&Zl`N_b?hcf7X9;QRb zn7CcM_zJJ9f6${2siG{%9~wU!}lecXK5 z%zH)yj~qS#)LyNW?=AN1{IOB*Pj%~*R?ae+n#sgu`r?YskWb$2u~9@G$}m*c=8h~U zRyskH4D%kgVL1O%HFcgV>?E_JwzUtV_NfKO5Z2ykd*flA{+9SkuNF{aF8R)!COdA$ zoqH4kD$k|o()nBsDmNt%KQjjfREl7e46aRc@0?4Pv^AjONp9pmOcgbi_wCL1$2bif zg>bVCR=YniJ~Xx!vtTg5yzM!tA+&GoT{zKn%1>Nl+91zwdd@5i$64^9ER^Vj_;?vC zkh9&+30%KB(?K*dAwvH`vMi`uIN4*&u)I%b&nS**ZhB85i0Rb-ME48Lf3Tcb|C@rHCep!| zryPjBY4rV`$9m4V&mc79oDzsB$#NL=$Yt~z$9z>&?yj||s_d7E9n1>-Qdo~6hsjE;R?Q*N)A z9}chTd>W!>EMMCnh8Y;jy*Gx7YXG35BrlPv8?MK-lOqZ2nM-_hhtVpy);v5f&h;d( z;u2azE1YAg?Vx5Rpy;2g!?!Wdhf3?={)~vJKiIHLT-dK{mCK|@J+!Z;e5wK|6E25Z zM1yd5MulrJH8m(UN$tOE6)vnEwc?VdY8_B=DKu}dYC^{Va#4wqxeEt@zMDm5l{c8C zD|4lF5#au7bG|oMIFS*ShTV-@ediwK@+%oGKh9mJR&V0Qo~DQAPwF*9vb8U&tf@J9 zrwgw4gEcdcNH|<7Hfpr^&+xJqY?(l*P$t;+MuCgrq6$v6dUj)5-@xreOWYTMfFdr- zAf38Kq>SY_MuadPk~_BfeTDIye`Q_EPhkaYRF?O@T8>p^1H{K$}9#o$b>|$P=0=L1l z+ywu!5K-F}PW2d**px>iKfSPfe4qyze~$)A6>fSl?T)H8_@tgC(SP4@6#{Y$&*R4p zrd_L>-Pq(tp#Gs?^ATy3v^$ii6J2k{bctbjjc53+GRunwN!HZFF3h~qAnV?)DqwWT z?lfw%wd2|=S@(sWEyjSL{Dj^m{95cDPMNi#QWh$6eBm@$(^3eN$IU@efhk<(r(?ug zr|^G%le_ZF;~8iKrIeB`1he8?(p=*@>7!dI`so}>EFVN#Hyq6WHL=LrZY(w1U zI5VlQJ2tK``$^7vJ;b8O;1>0(P<4Zr|C<1t(ircCG4kUTqNY*SXR*L9bXDMH`u=I` z(H7I)%gF3O-7HtE>sesg*p^$ycJL0QQ~6JITS5b&IO|67~}dbMdtq0N0{=GImtNod%W)@Sntk zoK=w>P^0;NEf;^8R<>J$vO#hCpVWfP&XGq*t62W$0 zA<};xwXR_21dL92nhacfX}Y5L?3_-^h+81)B51y7IOh^+KriwF0_Y&R!GGrD`@zWV z_|6;#rd6?EuhkbdDE>u&+KU5_Dx+pg zy0m0075wz9~)v8M<$jK@M)eK$%Q!d@Zl!Z8rd9(84ir{UH| z3rYVrhV(k8`#m|7KWg4?^)l!MH%hTV2DBVT}tY>@#s-3RgBKr4QcNYcY96kD74sJC&Y+hx+0bEK zgL6`;0{~n(aKb({YK-wOL|lJ({(HR^;}n?7a=4Qk64zSfcZFOqvJkrF?oX!swLs`s z{pfyOHTKJ?Kd#Z8g5pPN&JGR^QiabG=eOL_W{KPWF>1mVXZM_0kn5R?C`7VVv%b+i z#aw-kG*Y=Ll4Dz8E5iP7)KXqUOeC$h@%Ad<_(OH(r?9#5HMB%L0M#mr#%5gD$D^A9 zqQ}k`;j+2rKZ+n2a9yJxR&yWSz+2_tWfB0c=b4f+d(MDJ$pw9ecyvdjd#(9W@()(f z&ev)ssbvq1mgkIa4t$oeIeX!<+ff~JoN9h0Gsh+Vg1g}Pm(OpE9jbe{LVwd2ZiroJ zjqME)s5s8i)~>msdy}Etx;DdBr!_P+c{z-F1&ZFE>aqFm+Ey*v2g@ z8BOIww*og1)NC^D+j^^5`P=Q{ly-wn(T!4aD-TuKMn8mro*}rjz>Q|D4Xm`b(}sU@ zo2rUvNN<%*tLklEA}NJt1I)k{uV`Q=!e#kU2iV84X7+LDd%C3vA}GZOjb9hYEJH9P zNg^~x_%aatfg34oU{yx9be!}_Q&uC63y$4vU;_Jd2pK9^$R$mcMKpiq7+2Na(Ltqy zya{l!F!vN{nYkj$p5AdnX$U0apb`r@1Ek|gSa8C(s_35nE_TD5N4+wRqROv9Ss@tP zInAp=kZVYLkc?attWq>NBhY+57*#>^gsrYY)je9p7Oy9_$6K$o0VQT{fE&ftCI(K4 z@fukXU0YG_(_M2etto$7Q47E`^!+*#lYXP$MOW3IbFtUk-pbPS?bS(?{#WPH;`S4{ zKs+gTQRmi{07Gs_7>pEASi!jjhGJvd+$woi(YEq=!c@B`Olg@)@QVl=*AjNOIb>GH z31jSGm@!&0HRp+}okE^z|5}(K1KH|0zQf^WtQ5o)Coc(YZlL#`o!x1pG@+q_^h;^l zFOP=7;7E}-5)SynowGYmc+qopj+!gg6>|1R^Wi)b2dY}C-(%ie@SyK62DuVG#2lrC zKMBA~+_?;@=huo|VFOzfwy`nv3_&dOrJFG_V>GI3(m9whvg>5=b`@@ntzW8NAo-Vl zueOrr_lgGKHeF%gMn9fSev}K2S~?zDV0CR-OTgD_g;mmBHz~=u`>1_~Oictqm5M7V z3}95(sH9rcIy_u@!Hivyxc&AJX+G%?ROinf#8dB(5$PbIW`CXmCGaByEyXDzbgMax z*kJ#*R+)V%_gxf(H0gH@l^K~- z!|a`<$N7;k&J731I1T(7e@@+26c`8dnLDeHRU#n zT+G)DQ|9Xsa%5i@%8(xs#^!NQ_v z8PN_U=J_IAWyNEAwu)>Y8GU6sm{=LfZ{XtZ`!N97Ky+k$ykCQUb#-6)CpW}8dv;bK z=1Ti-fnb9S4o-81L{Hf`FNb7F>u#?R@#sIE^C@GXcgR3(0}iQ^Ys$$r!os5p(27VF z&L>GM2SXa&3n*U_O#?=azdbCjvy-U;pe$k%*$yT|p=M1sbezhrlQSTm<$6#Yylf^( zwwS0JMx3YC?-Ir)rVcmK(0y7(fmn^dFTST)8(VD>)AfTkAREiX>1y_|4NpN}Utb?} z#h29z^g&H73{ESq6>I-e=K=^5R3VDbh6QrDxgBDgr4J$X%Rs{@&Ff^wUwr<;P^o6f0~CgJaL@a+CRE8)Hwcw05;A#C7NB7Gu)5 zkpPAXB8+C(ze^WD{?F?Q%=5=K#GWE?oiP80D_8;l5KEV|{qiPI(ZEdcLC6J=4jo>r zZLH%?1HJRpznzJV9gh&WNcfttt0&M214;n>gA{5QVd9x)5>X?E_D4OM5e9`IY#P{x zVy8kcYLaS_x`zwTwM{Xc9Igtb6@3@k!3-N`8VvJ6QDv@)5Es>1ARszK9tE5URJqKrY)!zf=p zW^ta;hbl) z99_(>td_jc(g6V!7_QM(ohRV4H@e{6Cpgb)R)op9pc=!dWyMWM2yd4|Tjl50Nv#o} z>cb_%-ek$XDprmkBgweO!UdemFN~hu#7fSQUNNy5i4}vdJqRVBV0<*db&GkFBuVN? z2K+L6R3h+hQnfIQ0PW8t?~_H;S;TeNS3G5IC;DHcy{`rFNZjyc{G~}$kEl-1+5mco z6Y{`pbAn6%n3^oyl$RGFRn~wm*BSh%)u(X?cu?f`4+xfDJA0n4KW3izj{djFM%_mS z!Ac~S&{gEU9FEAZwWm0Rg4mo(Iit0ekSyMMh0Q=A0wjIb#srWDHbQoxWLLiz9iB?6 z=%@y1gAzb7Ns`7L_^IcNA(6y_@JQh)Ykh#m ztS%L>AWHx9^cr%i$v%@{1()jsWOgLxW+Qe~KHM$}Q zGlZLZ-3yz~n0rb5RwRv>PJTQnPedO=9BYlbIwlrTls&M z&&qk;J7?e1Z+jn+KAn=dj+Zg>f=oo%9<9WS2kgqDs9m#8} zA4VC_vfW25w=g=HI+o1!w>YSPynlo2>;F`9Z8_G-{E7cDNE+O7>y&oXE zMFV@)3HQfwDsRSlbS^4{D7@JtDZA&aIMK6Zx!#^69O;32*eEQ|O+ta63rOdq=s{KC z>61FFW767$AA+Q?zy?~d_eOTgP5UMXdrlS6Up~W=+Vqh8h1DOoaJhP`Nyba>mF!hF zn`4@4I7#jA)iXRvm4MOD$y2P}+(34|;gxmcPbcA^Q!u&T9jEwurYNXw!XsBtQfY;p z>d!;JJ*>-j@z8U{NB-S%Ycgi1h_F)8IM-&!5XZ$qthN7_hYUn%rJ*I9pqinuX)1UZ z^MhvcsQCH2d;rYRkLt>1jMd-rHQRxk4_A04Xn)FY#Rj77KwxR;dX8`D?3&?81%lk5 zKdVpAf>1Q%(viGxWEpC8ZSfx!Gd#U0oHF<^tC>Y{n`1Yxw6--U$crnj1I4(cJQK71 zd>LIEfvdA+t$pCOw6)5Ij{4&Tl5&vVwl{FK9(aKlqvwYgl2Z$2-iUYcrc_q5Ax8Zi z7k?>5lu}cEL9hQ4<`Rf9KYTUJSj47G%>QshuR5E`nKoyzdLb5POeyO zgVl}yu;o@TuC&d7t(-H(0k=tyddhy^P|%fOR;is|c;%tyb1QDR*iJl^oD0&yCy6Wg zntix=c?$yY#Vwfn@$}ShWK8|yR%b=NiT1|-ix}``Q90?N^Lq{pq9#{R|HsAo745ltGx3BlUBo734k6LRN@DE?U1x$3z-7g7w{U ze2NyZ352xfd_V6J0abhJhnbBt62!%<6**0<9K-cqOkS5po$2N*er666$9B&3oY5Z{ zQ}qOqVTuNh0x8y6vjpD}xfApqv|0$K{rHBQ#{b6^2f}*g@Wpo#O?Ok zP%i2fS8ODnPAbqZK=Ed*hIsgp`aB8%)xG0on%tr9hQ;M8AqANs`v2;_s`ll%cu0o= zBTyL2-;zk}O+A~d$<1>?WaKWK0B=nn!2uwOh2`IP|7Kex#n3o^Q#rEjKvjF;(Yg2 zo7y7DMXdGw@MLvy{!?6C03103)iy8|SKGHsTZEujXFU8zNc0?2*_ZlfPSrHPbhXK< z4F$?&4x{Id(|o?tdc4?$l=6EAKJoSpPs6r$E0{(xmZF)26~2S#FI7_>Q+1pMOPag+ zz$=^Q6ZpBsm?b@ny)`}6o;MC&`rz47a)`A=S-B|$;tp}ZwW-yvq=#HI#N6TTH5h1> z0idxA(3oJ_vA0&ClBYgPMAu1vA>qwNKPpAc_xRrMX$OL{4Tm@S2Ul8KONZW7YytQW zoAx;HfAx_Y<gq5k^%yb&ICkLDN)6LqKBMz ziFl8GpAPBfRn~!eQ5@O=k6GHZUWf$}0)Z;1Kv%Pp2B=Xp$U!QVWwcDa$q05OBM==E zUu02L&Rk^~bCq8RimkVG%4)|%=6H&0NN}J7h?*tPX+U73JM%<&L{v@?o#IEAHz9nRh zb0&HDX8kFc$yAC1}`mXL4i zv@um;ej&0mu}^C=a0ZUpG0K{SU833;qb(Fh`(_;I5EG=0_&6YStxlF>{0>B~^l}^B z4{k3*`oab2yCS#6fgQuiVQ^Te;bI%T1Q@>9YCKDK zHGYiQ+f5QgRARZ{mh>3bf*^Qo7HY|bZx*qB(_P>{a5LWNII>H`f`n z`c4qFH^-MTZ0e1ABrSkfm^n)RN=Z5(0per=otvcRs|`KVey9s@D{9E1vMK_RRgt3h zBWrwiVERrehg&4gyr7Gsb!!@Mlel_@G-4cJD99z&(< zH6f0oGy6XF`F|=PfX}co=81C}QiN;Kgq8Zn9b#zM-_rL`Q_j#k7yRa=0a6-wzoUCD zXl1>Tan7$PUneaRH524p(TfyohUA=Q_mZ4(8z7~6-|Tryf&BeJ{m9F3C_;+6G^`2f zF}?%jNir2x4mmMAT|+P|>*98lngJfy#YwzhPfN`i_s+S37{)Hl%}Ue{Rrgg@HH!)L zL6_R&uDG#W&UhR^GLanK8Y#RUow#V7i~7d|X>r6VGZHWCAgz4+`xnC}weGQ&!44YS za2eov4a}+l&x`+pIE5TN&;evaKULW@Y+L*XaqD&OWC+khZyHd(1iA3FF-`Uymv#}8 zN;wfOzJV1k9hpN&21_E=jRR7mC;F6$IZ`27(n77`8CVSmdNpR#tMNZUk9UHm%Qr@v z(Berq?hJkgti9R=lqdx{_@?c7%C?i{6|97m#m*C$@w!!`k)W>t_)|n3B%7eN8Kfq~ zMsgFt6dNW}`$6(=2jb>@ccR#fadWA70@FR-8lrz)J{1Y*&cz78U z#OlB4vehQ+TJa)yCy|5Jm1I}ji7V^pnf0Z3GCh0uQ79!@jgzii*x%w7nfi4*Pm-?f zBSlpl68`K}11jiM$Jp?MT6)Og)&$AydLVdqJzb)ifjF7q)fkWP)eTQ_#Vg^R=%_9# zhB@w!PbU?LLdoXDuFfe$iGy`&7j}?%(2zgYkKw+14*?Oq(A9MOkTX6jlk{-wVN-PJ zI9c%T380*D0q+>j_gp-yiVR=v#8TrI5krUy7Ygi|)d@QRU+S&b;Az5M*(g$Qu zP}NKtp!E}j@AzTId}15)X4`*+&<+US&j6*rE_T7tafr;gF60wmO~bAnhY(?LP=GLl zkVd%SNqa#=9SYr?CG0;T?L`XMbMt*IoJ^wE`cV!vSg85T|1irF@?$XBJp_uB+6b6> zz7$j&CX?Ek;JX}Ili7-6MJS1Z0*IXNSEI3d6*7(vU@n7TXZew?y=s&|(F=oq_#??B zMMZmVUAp<+(99QJf8ou~Ul`-`_Z-_N-g+`}*%RMPoVNX`i>Y%;EVMy&)T##c|(b&=!?tvQsC{#OsN( z(xi|L$>JLER2Uy__`CF9;%JQ1vg#6DA)8OU_gOFMxsr}LDn*$=t*-h&pvl7_?<@>P z+$rGp{?FrH8Kh!S?!9r0s~vIzE*zaA8zPlJtxm<;dbN+w({-=c$#lh0+GkdLd^o_)`<+I2GKs$qgwG!8^gKM4kJld+KPYrU@!<@@w7mlWC3*$S! zg32l;Yd*ZnA#WWDC<>DqzcED}{>os6J|o1?YUIU_8I?LCS2!Ryf}9~&Z5TSNZkXAd zqWjC&?~%SvjU3BK8VcNV^R^mV(thAOQVB>L_2l3jg7VBZxIK-HqN?Gy5Z%C4b&&gH z^;^RES-yFNM?e|HGy4}zX55D2Umh{H$i0)4YYf{qEF&GP(lG{Mi!dXTym65g(VxPH zL9MkE3}{W0Q6zEik3LdA5STa@^tJl?S8uM`f*_UbxUo!j9{iCnHtRRh=@UnCk}ezt+JCF8r0_|uRaP#7tuz++(o0~SCDUNMi+02-AwP4Z zCXENWrta#xZ0N%1r_Pf(lK~CCAwdt&iu2tpo1Af` zN#`Ku91q!0A+nYV%w5bLrhgc0`IZ8_B|_xcpIR+)-9C4fP8R2U9kKzg=6|6bcQ|hF z{>Y+$GAcguFPp+L6;%dP!CRY*OLcA=aSW(a0isCtP6Nv^_>Zt!RB_wpDn*4P$-aM= z$*^KV8-6p99u>}YL_dMVJS-wt4BzEZL*TmBx z*O_-X=bkJ7W%zsj#gIIS~dK`md=BEh3<*K-@@jTVw1-4*oJsuG|^*NG?XwhT?;r$vD1`aP`lp zU%jbEO~ZF@KYI940a=$QV1SU!3YX%Py*T zqXMS)4-zP$CAJcmn2t3Revl3s63bbBFmaAUo~5`E=lHmoAMF(YHu}>v<;P7dZATlr zzRY}sgezwXquUW8j0qx=E5@bgx`(?My=y`?@Bq}1ads zt49J*hBvkVJBV`oRxoiuVl^$}<$`+^R5AVheBnwaL3kmiHi{+EJ~Dvp+paL-)FyD#lMSMv2usB9(Th5%TqVh^e3k%By!KphDoiVB z)5Pf3`8E7jDXae_#)@-vNfI9b*wF8x7(^+oo&|KnzP)fXc7A8R(BcqgK)*S^B%%UL#&p95zAkoFgBxOp0* z6l1eurmdU^?IB4_Da3qvMlB-7rci5aBn^0{GcF2R217LGP;gvIcBp8Y|y zp$Wf_;Ucd@IOORyGqR#W`9LR0U+0St*cC~P?FgT8marCSjuaN%MBMv~!Rs|dKg3oN zV0GlCz2fR*gjc4I#OEAijkw`5J&0Dl5a%9l5*cMfDGk0c@9S^yd@E=WSbfl5|nbG{60;S&&cVY0~1ztUZtPr3(D8BnFEXd7Wv| zkP^-a;8pQ(&^m)LadXX1oLYaK6aVXjrNh(rJkn>-#rv43`s14aH?#S(m_6Mb?DCVX z_An?jpA3RyDzLc&vF)>3nYMlCAGF!j6#80JjF7uuRF;jR!qZyBrs~4fL?RC8%pU5k z1UxTqC~E~5IO^ejS2Dmkmk!Tu@Idk1NkOgpT+IGF!t8{|R@VYqwtmV)mKrA4!jBi? z^*6NmtmDyP!U8nwV)eZXMuil(1J)m~qV!`n)(Tj3pZd^9Yx0UQ- zc?_;}fkR#wNKTTI$c@}e2x{%nnc+l5MQc>5`XnM-f4kWP3K~c)|kt9_>^#$wsEDO68wKaoKN~G4nM5c z`EAu+uwjVmQ*gh-1;??Rzu#lK%H)Om*Izj5V}tEPawo}NkqJCi{RV7^44<=WI7#+{ z$Akefb__k5;vP^Y&RvvCGV$h1$v!e3$=s{Y1;bUorEmqO(M-}R9~0lJb~2TzX|+RM z1qxORu)xGx4r2LdK-~qOKR0I-%oE-${1X$(v?4`!KZ`u1ena4n!|F%5Bfj(=ad0Vu z1gQK+*=}RI{3e>-kaXO>9R?E$DyzHkC)Yod-xk!i@wv9S(sZzzeIOz~hgYu%G4q+6 z)u&7+;sYZzDTvTSA1Q5|fctgm!#^3z?}<)cfS9UOkL@JG&25xJvx7TN~MU#N+P;(RAi<0RfQ>0t3^$v0Yqwe+vsn#T+|@&~$yOAq}Lm-=ls@IvBM zvQdqP@2hz(_y!mN@xsm%up6qE9w$3lD_E}W_=TgVrFmq`cZVQI8QKU?5(^ zBmwHN+{Y|)k(xGeCt)-^!U>AAO4XZ;P{dP$WrxoE117^t_825w_Z~~T{cQ~xA@LV` z#egx4@H=MOO}#Y!I1*6Xo;b0vlH5_a`cIfYJL-&61@{UUTJa)vlqsI&(ge68&oKD!( zhxNVU31kn`>z2DzUy8V_X4;g3i+RrEpza`1m)g7g*S2n*rK4Ph<pwt~{X=GKj@3t?tm%(If#6Q$1n zzm~1DbeS7N?_SKS7ZoN=`3La-TZ+2oNMp@*T_+`5x1VF&1R_7aW~BwG!pli^_XVUY zb!e0KeEGy}8%1nu1_~Ri9y8`~t4}j-K?&S+@W5Q5M!f2e*oNj_-SJ^fpLWbC$Pp=Y zob>WweWE@M(J+lU|0tri4jcnxLk2}cPQuTFBzppn#sR~9wmN)%XR>Jf&raY`u0Lkb zQwo{O(r8$g4+mq@mE~HMQT4nc40`i14EoMv23^xi*+u`q8iZ$eK63uaH=OyHg)QUxcW;UYUgsZ zce>I=K{74FKI+w45kCJpvj(Fd*Pt|$agU0B7ZDS3F%UQP7wd;m3*men(_O-9(;K#{bLqudZ4gQSF8$C4UOI7m$H4=GB5PSpiaIz5d39w!3!~S;He*M* zsSVdzS4HhJtdD(5xl4hL$2kJm;2?Gp-9SF)D-iW&4KWxy^+^GSW+k;M=J;1Y?Q91K zBE@}$Hg()7^x623)@IR{`eZ?y$ z)>)mny;p4~ZvT?VdQ6)1tJo0zcCN8O&EXibB|rK}&Z=sgwrHVrGC4+Z=PRAKSG;s$ z-6CA66AO}!^Wz^gm%b@1SywH?AE&P+SrqooeX$|dx>4KRs!r_JiF)Z*k6H5Kd49{Z zkj~gme$$oa$d^t`5+48^=)a^?+^MVhtQmm0OD!9I)PT+ERal?#-Fww@)0MO&6)$Jn zqRbhKDqIx*hPmAQOIcrGtZo-@D3X}V8}U0r7X)BFuTFsJr#6E%H+@*1F}rfwltIx# z7>}IiVnYCZ$vF7zcNbMeNFQbNWzGB(CrR%7tvR161J5xnhiVy?S2vr#`wiBY>i#aS zbj`|NP-;Ptq2e597j+F0r}1J<=5^y_s#^Dm^$iYhznHh$7DWX1s)K{k>!+Ec=Hnky zDM*~}S(k!~)24`XmlkkbVDKrecZ|D9ln2+Z$<*#auxiU5(_jS4H5Tu>q)DvJC zS?GRcEzr6|K_rH&Gg3QTge@8F%X2OTdTz@oFB;c2%6&_|t!kUDIH+EVQzY^;XS7bF zKXc8>-ivuLi#q3m^asR1_0kYMEpBX2Wj#obxj)mT;MTM$0n&0&=*CT)ChAh+5p0mUr zco4Iv@l5=uX&Tk$5LCWUyC>$mOXzBUcWWfP?&Y@>kfXVjlhjl(CUoTcscdi;M^?61&G}67i7kqwfX5Uwrnjr8A4t!SvZ~8^bYCJLhR#m%`I$X$(7Z! z+z($hjo62BZEowz_`8Tc+(@(hf!LdkE+V*)r%|kG$Ilgg`YMzOf~e#i48Y~B3b5~ zE4ymI)4SjADfH1oOMV={ppBCVF5(G}pXc0N*rxSJCS#UVH8Yjb0mx#na7kp;M`ayb z2X%2y^TvY*T5x6O@CvYaeB@)A+=MdkX3vnlA<)@EM#Gcz+elcT~ z*`*4c>PI>rku+ry*gHZhzuB$Vnq0|NtVYkYDNU0Q$|~>Ujy3yRp6Tt`W}T4y6<48} zeUEcVaw!-Ta;>8NP7Ud9KER}A=#W*n*x9i^4St5Zx8;`qu zg;zCyOaR)*J|P#1Q(kpxFwdpu#xtW~)w{3i9boCfCFx3Cj^t7yj6=juB-#GXeszjV zK{=J2r>am=aDq$sOIN<3s1Fv+m}Zzx7ix5K{603SkJ8{Ex^9xnSD9UnzG0so4B5qT1oB9BIeBikx*DSf(?m?StM?ETRqakYOZ+=Z2*dk0rj;( zwa!fTr>t2CNP7^QDR3OhYY*#PsG~YuGp=AU?J44YQlyRB0RmjrZeVJ-j4$b^<{@TlKCB3gj{QBshf&NGSBa~y$S<2dj+Ov9f=%lGkR;9HQPo24 z5$lzci=CmTS05AP%Cl*q4Rd)|Zy_%A5FkrjT8dU^``;6y(St&MGp7`^fadCGi zg?m^*9dFO@4PDooBgt0E_Yn4evCf=pw!&Sfz|r_1>yb<8X2u}->lj_jhRkA^83d79 z7wOzqItUvj87n!ikmG*3Dww(;hud7mSkzFhZjSiEwvmVblh7|M;^p$chh@=i2?{?J z{*eUVq>W^AHmplk8*Wu4qClR_EUGvhy! zHin;4RyRk^ze@5#$>Zos;xm##1RE}Ci(UZPily~v>P53DkKF#BqxxI`G*fp12w$2l zlj9(R>OK8pmI=ev;!mzFErGCabQB%t#29WQI6R&6Q(fPoD{?<_8G$|_T3d8wz49QT|LjHAVm9%q&pEjjWAi%jg zc};V#@y00aYk+kM8ADrlSFrs9TZv^Rj~(s;ObB~n7^&<3$0pO&tvZkW$> z6l42&cU=Vl21%d;pr) z&(}Y*$Sq9$)Q<0-Iq;?G_&*)}pR!x_8vmcat5(0%czwsDRk`zr;k-{?IFa!n!^P{l zkEeaerDY6+zwZ(LwVI^2qF{uN^yj<5`oq`4ObGutTc6chW8=3tRoI@!EMd<}_~wNA z2<>gYt$Q4f6|h^eW3-Y(S{ZszL5{BokEMU9+}C!195IxXJgC0gM#?aZexlOWYp2%a z+x+jZmYkMOme!NRQu1j2ai;=j9?7l+PJ7z#C_0s>{ekh{v}|vRUDh~%)wo>jA+0BN zlRO&ROUczi(psUNPX|Tuua)@d&#h^HgZx{iJVp7(D3^JmEu!5*)F}LB{}Wxex5?G- zD|Qpa9@#i3+I>Z7sGVnM%zrrrCYyQft_3hO#alC4irLVeKcOTQ{0-vro&LDt2M_a0KZqo?+aBw8r(l7h z73~LqJF8&(l>6F~jK-fylF*M@A&*|-^WKhGTCzly1Bpk0UBQluL+6DyQ|v0|_c1M` znzxP>>=y7Kd4tO7pj`&eIFKaf9NA5l9;+5!rWY};$|wx}wYpFvEG&!sW}Q=?xU{M9 zqJTAx!{BnZ)1uDBukDUZ#iWGTjK5gvjKZJ8qbVKXt2UnXqp}0}Gk!S5E@QW- zNr(*Ijhj&7Lx(KR45{bSrxWYYhe+T}T>%#VvdhWUTTqS{!9nD_SD7t+%b2h9_jc?| z{dQ7ecE}jX6Wg`cy0xTM>`QvGxE&;tTc{VsJ93t78_wQX>M(lj*o65SZps}sEQp(O zK6FL-k@l>`;HFafIPq`>@fG0(;>vlUhWb;+CX&`LMD^Uf&`c4@^I65IzUaS11WL83 zBnzWFQeQ;Ovi{V)u^m2up^wi0#ji>~6b^xFL^ZmBW)Fm4nBPebl}i2%{n>pbrD=kh zWJq?|(>NsRO%pTkoU1d?z14y>B!>0K(pO7Ty)cENALmaQOE4F|YAf87DTIzoL9!@lPa3qqS%BQhU6D zV4t+r%$Z-xaA(e+UQzDo#wpTfxcUACx|#yL6){dzq%lhfq?BRDmO1@LZqja6_12!o zsRGdI|BEhGY)#en=~6K88uAj%N@Q{V;~A@%1{?gg!cRsJ5}%GT*JQH%KKDuN(>_47GM&e9Oa5B7Nj!AYbtTPQO~<3HC7I#X%E7X7ik|& zI>S&eBf6-CNvf?v2^JV$D)y~_b4!OiF zBAv)7jRESGFtx=dLI#RVU~B^$`v}+^%&e$7s2Wn6i5sOB8>Tnu1+u?2WRx5ZXsWc zw|)%#8f1XWoJ}SRFjp^Pdv+7CpHPp0$}KdT3W>R11ud%nI{EwA?b^ z4sRqA?m*=G&1~mS0uau;s_q0zM+{oyeB?cizL0*Wz z2E}`{(lNdgx6CENlVmp74#agwdQ)U=P6tCa1|b^+9R`D^s`^dWx1GNW5}V!Y0zel@ zhh$;TB-*FAQ%4T@#zT5Ur}Bnc&eCR?`xn5CdrRX9BG4>roaBUHiC$8RpBYPPEm$Ai znmvWHD%N|XAEU_(`rU56qGW~(jv|KG#=f_sXaTYNtDfLLA@_{p5jrN8b`bm14?vc8 zMX4_sM1HJ&_%|2^sP(MT^jloJ+jc=<^(Cp>eTj6WcM9`HYiHPZtQ80`qH6w!Xe~>^ z`#O?DGS%*qh2ihB1kEa!A!tWm(tF*pw{@7a!QRg!5K#!3`wxM}rXVb&wn8Lx9cVn@ zC^}Yv8X>scy5R}_gY&v6YfdGuOLOCKv$b_g-i^&vh zS!Ui2_bEfvsz8l=O_Uu-wx~lVAv&RTD{;@QYqT||JLa4@c6q%PB$-Z`rqvLp)rn!F z$#w8}Ooup>T$a@6tM$yI{xp=Kp3NJ&k^Da>xTw}N9cqbe6qbGDcNawgWRbRxLm3RY z*a}T22oEJH`1bQnaW3TLe1~xDgT}5v?7?&aLj|m+?02jZL<~)ZoY#pMv1VJeMq|FT z7*sI|H`}~A@=^TmdSsjo zs-E(n36hd&ejc`BkGSTy%G!IZFAStMXS;=FHbq;hu3)*BNy~`0at`Q_$p?JR1un;$ z-5F~k5{EV**+7#A7)Z`fr|ljHUnz3BkyzdKU~y?egAGo~4PIW6)VO@vN1SC4JY!eI zaH?o`+k>^U;!?|Ee*AV&RMvi`#qv&O+d#wJw)Q{olspN`)*`Ya#yjnM#9wXFJp?9q0UQD z+poX?-#+8Nsc3t;$f?q9aC?6Ft=18jVV9A{tsR{eE-?-}R$ZSoW^iq(+(R~0b{_}Y z1Mg>CQBp;q;kxcH15M4J@$!A@5!gb_U0vYJmqIvh0ib4BTlu|c(^jMuwY04Wu3cW1 zwWo1;`i?iiMUhBI)^_jXokL-5DH*LdJ}3~kcUJhq-N8aG`_q`Bz*6~C+0Y7rf6XNn zS$(ynf!_Df+-5IdSpbQ0vt-5C7&B2O|Af_WlOn#RP&O6&;vTVocsNY6rIqP%ZhOvlAJC8^fwpIx8BZ-^G&M;XKz3_Gw%R;gq&7-7QpzQAZ0* zOe(uCf#}OEQMPR8^o6G-V|$=!1SUpa7v82!^!nM!xn#TbB`79fw1_e- ztK34Z(=K{|hN~8pTTgz}8-orxDl%<<{djvxmEF!JcWKKN<%PUIMNR9v-HoeNi02yH zZm%fZWL~|FOSr|B=})0(GZhiIAbkp$6hu-d6FJF72)bOo8CvGM|4$Fa9 zXj#cP^T?5(Fze=Kd#ZXnH$?P|FySN>0ri31LT%x_7Q^aPO69f#*h8C85iIR-s|j^^ zFjUmmzyJE(wt$ZE@i%?FoF1iS$Zed4e+t;0bm}$R=$@~=H7_2`6}JVMj)gavfh2A3AU zHj#L6qG3LDA5fT(sSaaj_<59zv7@sJTNmjl$i7zCUyzjNJn{|Sr*>9UAjw?y4jimU z=Z^0DlZl@+hm^{P-VNd;30uDEmkv$%so`k*vE?oQ=U=n#*}s;Ke{ubtO9u- z)!AN8K`T}E3gs0gouA27HLopdSngonVa-z~qP-_!*tsxW@jDiEZtU(|jF8dqe>3fx zQD>)=99&QPAwZfbO1Yve|6`ovE7irTMczcRdh3B>=z0K>=Iyx+A(^k5zbfjV)y2j0 z!&B9nproXt4&rK`;rgFH5nVVx7ahR9#GAL0>hPW0|3vAD3gn#myEWL{_^Q$V`Ws;z zPDF2+4-rc`n_{jUuZzQT8!j|!_k4|S4x4-;I-1m@#NE-7fUdU`x`m0qHq&lA7RI;c z069>;M2amroZ3wAKb*V_Hv^Gn`87ZaoJ<#|;36+7B8yJbDCm%T7q(wJAV6;4UVU!M zYJD!i9`yb1xaM(DSNJ}ZC?j{6=47}`^4>Y&v$FMvlTqaKBY=q<+YquovuQAqGs`1i z8BFm5+|w8uIUP-A?zaY5dh(W?=tLUOD#pvHra=|0$ddCehwrRQRSSiIW@`{4XC)fv zNc+jZPrh8>K1_eGIDl-te2walPpfzz{G9KYez_tu$TvhfbWk0EL+N3t(=xE-aB@nJ zZ)IkHzvXGNxf59*AO+T?Lt`$onmKnz>So%dh?;=atd2nO$R^>?fgoRBQQ?+*$V@r=&$KOi{~ulIRGQh)metp(ZFI(Hu{FcTsL)GjQwx z_yIxAKk>1@ynEtRoNj4vAiL=1W}k1Lbt9yq+dRBe1y&cIlA_?^RF5%^Pw7?jz3O7Q zZQ++Uthw)c4ywbu^Pw+3-2t}+fJ#DTCE0PRTn*e!^?K`L@ z_*G*sGzkN?*J3$|dF8Moo=lU-nqR@3Ok7W zRBjkq<^X)y4PJ_G+pOQgsT^n9Kp%r?N~SK}R@s(M1JK#fwzpB9hgdJ4ZJ_2c!~9G; zQXjPvu@+alUnv@YtRU(78yY!md$WwAQB7m$caAIe*~9<|h)3!^ zOh)`{RRFca)TFB8rE+qdKjs6!NrfqQZVQEHHQzSE&ZL*Q8{5@>lGy#h*0}_u&iRio zwl48m?#6``3pW3?E+;OmKW={bbmCe*$(TvTD(FO&db(@X0E42iN~h2s7!%_R3Oc=%XsS@16m>`!m*XBZ8OCWg^SSYtHf zhw4c(2c{@pn4*aaZ&I4k0yn~z6B9lc3`x`N1W_hy-;^u=eT2;4=qJo^UZ^!{_(m5l z=mD@$*mbsFT|FmCz07#H$6}sC%z+8m)P{!Pc8N-#5%( zVU^AhBMT%b+2Hon0$3%#ddp)4neYyYq7009QXMnM>VZs&c3GFT*%$taoFJy+_* zL^qC%)*ZisIXxvE!U+kr~KGPKN4lLsf9#_n+y1VL2Ij{Eq=~ zjo%C1C^wx0@_CL_zPW(h7i9J%ULrG{1>>K=4f$FlABhNQX^`)7!k3W3&5qOh2ror6 zVdtW*KcZ%GIiW&C-%cA;RWifxIJy}9PFY2)a5J$*(@eWe)MWD|Nn%#t)S@nNbhO}R z#@>B&HyG?EZAvBa+gC!qMnC)(@Izpc#EsZmANs7E*k$-g&O)h`AUU~&#wxE?+zzQF zS!etw{rlB$5c=x9Ce01mvIM9Azl(fQXCyKWeYsmp9VG-4IIa_*fUpB<07@bMsI|~q zdWy--YF06(#=kpKrd}q+X(dVg15kqS_L7VCmn%M$9!Khf>R0)sfqPw(v1minlfB6!1{u(R2F5qyJ zHieI6wM^J3i8uO3m7@*{)4oC)FEX3lw6))(FXg zNdUq^?;U)z!tD zr7^331^M`M01zJ$(EMrKe1yV`Jx|W>M~0so@`cqEg-S_w%Gl%DxXCKZu$-#xtMro+ z*n3cowM48iS6A%ZWL{$4VyKVC4MvRYj(23PlI;3TkPFTNGmeEIvZAsyHV(oQicjYj zNbJ}_ET0Zn7cFfO1^)aNANOz?G8_O8!T>q<38%AFc0t6|JyjlfczpS>F_Pv^W(X$9 z2xm-pe2vyGk-Lg_-h~SxzV#yFZLMxf$~F%;D>3Uwk%_XNmGCLa*v4cMRCWM0{{(Fh z@8jPW3ke`jpzU@>x3CjV#Sm4$(;k~EMLLy@;%xu}zJAIzaBw6bS1C#= ztIneOV(TtzY4Iy1ht`-+wc|==oFI7PX81|sJgYkNG6MT;qbMLY*7=ER-|tT5{TBQcdTW^W z|M6_6A7u|R%N;i|EtfyxeA<48l1N~kQ38*bz6`tM78a$aqJ*+~h(7g~#+mfBZW3$0 zJkC*t8vV28_TIjQ@Q(eK6UkYohn1;>&5D<;U~ zNsZ(t0>{6khy=d2?&a(*wCs14q?qJ%waZSqbd;D2i)2K_Sj@NgG`e7$M^+4Z9?lyi zanN=kWP-G?twpW?kfe4Y2qZBAXSE02CWJk;v(B|%VED|sr;ioj8V8cNEpfe*AZpfO zAOU2J2nlnQ4}sIW?muJkS)UKeHNa@y>58LR&i>cfaZ>Ak^bD00+ED?hPfP44UKEh% zq-byCQS%-!=h!zp)u9uvf=lC^=EiKGZ0b3z#wz#qO@kE4eIvFCt`X84b8h@$b8 zBrq%tCxt8c4}@M%pnJWG)h05j2zo9?0`2h60a6ET)B~fMTp^0jgzNDSEl#_$&gZos zJ`hf4|BtYsE*;s_db-bBIpj!UAZQHnGwM5hR+}d2h$zWMKBz zb0o9q$WKL8JI^rUQ^%(m(w<{EFBImsLgZ&Vu(aVxHxy-XNC)0hc?%IQsm&}Yi8!!U znEXa0yt4h=T$cMBMDDl@nuJp+R=WmCTuahK;E6%>b_jX#JL55bx$pm{M96Y;PSJ`y zV_qySv+-65@K!WvpX76s!uDcnrh>wD^o6yZ6z$VM#07PgUm^76nzBV*xeIW=C9anI z_OYSM;#3f=W)EMA=tAT@DH^URflLpP{l9UEa84~S34nBtF9nLTGAGu#5-t(9v5JWl z4ON-9B*}yLL7rl20h(+PER=qM9Ok;+(`nEUe~hob#{i4#e7si{0JiiR=vbv zoA@_gG7MtyuHGaP0OuA;5)Anth;2YR<<4euNJ{hbP`GXH89K~J{Fx!2R$mHX#ta26 zgElpGq6+{r$tY}4{G9QqqEm1HPHZ*}i_`T=?wK?5 zp3l7JGoSf9!3fP;q8@KYpW~FkjaVKSJ@-9eZu`+LWQcyq|8x_5 zC%B?QVI~XEqAW~{gl(pKd0uPU3HkhykDluQ1T!Qc`0ZL2@1IqkEMX_F6~W(M>Cxi1)R@lPDnyXy;ym|_(AK#w;qcp zvk938$$|^Udr@raW1y>6{LuTx>&?gD3>^DqnbTgz&VX?V>jm&I#c;fa6GRq;S~@3r zszGBuSU>GtBp7GU8!qwk^h0RSa}b;FNB~Alri*p!;_Ej~%MyGEkt~hU3Q8`~ZW>p( z8P%}51YN&DJlO|X2xNC=wm8`!0p{UpVRHr@nJ>D`$DX`RB(y8qT_YQshbK5!wV4Lg zHebAZYi(rD$#*Rt=4H3`lCO2vw4UpSX*TzaeQlVR)e*bf`q9hgk-Cq3rZnk9c*d4so+M;J#!EZ zINJ2kn8eiM(tz52@A;MQiU)uSI4ZB<>JG=X0grxR*r>M9XX7|!yXMGShqT^m1nx1F z)sdHT3%dM8{OI?@>!FS$?QcNnJuwL>s>^v~D^_s+cC5!4$)iPoxab5~nqJW(L zf{L2lIxgp(7400|%QKB_lS`?-)4myp1HD%psLMb1mzKY$r~(@TpKiwbw}&?VFJCO% zB6)$gm%?XleJ+BowM!bt7%K8|kLE$ol+lFoyBo~yIFk)p@&Z}{o-mOk&M#JbKof=^ ze4`hdLhMWWAvd3Dj+`~<$oRhJ;WLqrUNKGc89t|swfGj&gM(Rn&BBmzZ=D=zSf(4Y z!tF7P4{ zh3FZ^ex@+kZ{YTsI>ddQ-ekJB%6g)k)Uy_X@A84$*Ab^7u}$#>TcY8A>X-a_=%J}i zB$=P{16X!F^Qesfs&biPrY#%$*2!meiEXRqq#iv9JJiYsM2hyrAubDBL>CsdMF4ugDBkmm8LhTgI+P6Wd$We#giK#fM!r`?lO-@ z%!;E92;|vIS~R$xwrD(Qd=0jojd%ZSZ8$e!yjk}Mn)ek1ZUY&In3#&s^^g3LY^c?R z2cJ2Bs04@CL+4tz9uR>$nxB_TXaK;?6hnNBZybadG!aAdy)?l&O#!$?XpU}IW8KVv zKI?ySF|<~SuHDW#3*e?9y21(Rmwsu^GI4IvKVWh(ys?@Fx&G3qv_kevoIhLu7yey| z?FSrQd&M4`QmGggXFf(kUs2vOA;d80SDzpr0$!W&TU~nwS{QlOM~7F-UCjm4>MMaP zOS91l1LZNp&#|#1HhdR-$PKP5F%5w;D(?_#s>Z^-yJJ3-Ho><`{{+I}YLJk%PFW6I z73824QnXR?+K5}e0MoKP;KnyIuR1qX*rx-;aiIX2HbQL(hG-+8Z`lM0Z?-`Dt>O)`%aq z0h;NMDYI+TNlcsYeOz+XVUTL#p>%j89{V&cJzq5d+jDl!={V(inW(9lHWW+?>+dwC zvw{T4+%IH}b+wteg}htFu$vaKncQhHVc2aoCo&GbZ&NqMaIt7f!_}SpVW|FUtj84T z@LQqgtE$S1XEB09<2K$n13vQlpAwZ#T88W`af=n+5=20s(j1P=Hvwe{I5uQBjD9E3 z%w>HA=N`A^Oo&+&NcfP*!=;g;f8vYvV+@xnE9S_T|5@|c60ccHM6an0S?TuoP9m;! z)_LzoSG;=~g#8qmx1@30I~H@%t^_~y5}f$suz=b6WxmRW$mmeB4iWU(SJ~q@8FEXE zB=sE!r-p5=4VeDTqP%Hgt6gWS_taJI8M#g{=Ak8{3^inZWPGPR0HYjpZ)HvJO~Q?Z z`!KG~zG414Z9H541k9x)4A1J0)(i@di<$H8PeYTMi?Ll;TYSYXfS<)f*u%F`3*cG+4EpNDb zyIM~=c$rmx;4H7&x|rA2~{2Nl@B9u^#L*qA-WxcT0?TTmyp-glI?5fwYh4` zI@ZptKB$63>d3B^yF7?vki`6@tnCOmk%L~Ujd=^K=aO2`n4 znmfB!mQ{E#ws*wW6}(YoaupX9gBbE3XhtWLL}vGG`T#b&j^Nz8LDo&S75f zl5o40dx8_KN)P9y$%bi7r5KK9UY0g<Vm})>o+F0UTqfUdv+3!b2kFTi;&2xf4?GPA$m^;$j?cfVzK@EL`MTcI#QTAoM4^ zEY6FLAgkUiRt^tUI7x`(WW_b~(E;Rt5NtZ~Z}H?0)km^iQm>pPPvIByDt* zy1Ml6ZZcymGAl>W)~zU#o5vxReFlj`=8m)LTZcdx)zz5cOjj_&IW$MkmFrn15)df6 zP|8d)@b19bs57TzjUX8~u#Gh5kkYcPJ(sOXVeHKTuS(i0rV9*_Gw8eGu^uVn!QvXb z23>0D;Vonr+U#ooI+h5J`K2G=KqA((cTU`C=@&|joEp1o>p3UbWhCE}JL%wI+mM%t zfcFWTH%On2sarRX#Af^*2}?>UDyj_2<3a^qySXu6;+@pO5(wmkww`9trA>k1qN zt<9w|>Xc|FOgS$VcPU8v7;}u>x+RWM>m1R#ITv9ZuS9gE>F?N?I8^k7tduLSvPcvs z@m<%-so-ZVUR#~w8IP9e0P^V`C9p(kEDn zGP)K5pXD5mm|jAjXCHC3Q4ofhKDLCoWtYp*=|s>*ot>`RhrWYTyeq7xUN{H`O=Fmc zw86{R+6|P;Z^nA`QpXZYy7ta|bp8%;F?vo#<{tg`l`5=z86oF_=3X`}^jj&(X>-`X z?MG3!%h*NHK9}d#6iLhm*l(1z$K=Hp)4}zkL`3S*){>{1bJSsTP@~5Sh>i*`9@*5O zd6^B?;QA~gS&`bq$s6I4eE=K4FoeRXDvs z9~G5YYa1RsrTL6(HK<*pAOkZ%E+oHQo1VA>|N9xG2P1?rq#~3`rgENQ?M>dB} zdW}sBy&QIl^;#Hraoxr0ATfv=5nCR>D7;iQ>82g{hox+T;YAw3BdTpyJ<}YCWrnxB z(_Xy#9FyuSBnh`9RA+8h!t5>4)Y=^GVPjN@1e5ckupMe{As@86l=XM^N58JHN>V}Bu~HUujBL36iv z!EY~HB3-_dBTxMk+|b_gh6iIlCZ2$j6fNDT6J9v+T85-qL$!udIAbPPRdEi0njpflLbH+tts{H1p;6nA zyDX~$v$fdqS2mZZGV7|vIY2JhW##NK(#uNRT73IB@{Z*puC3A@=wA8S>-Nh&hqP7!tNU7a%$iiaB!_VDT<4lh&BT{|r_ju%N5!k4OgWC>B~*!QEop`^~1tAeHl zzY4TzKOnLuGvtd18mLfZv|Sr2gQ8C}6CeCeTQ#mZXE3phk&LM|IK&SICFUwsa8_6j z_S1+tS3LF4MhKp#r^C6-cEto?a87 zdu6b(*GG5tE}Ueaa>}00G8-@AsI@XU-KY3(@<()`$;-v2b=mbumsj%l$T`RuJDhMI z>#{=p^Kiqeh+cY&wxSR1cxw zB4!DuPWQU?QDSUIC9+E;*CLyu{uvNZz;!zki6&=3jaMRbZR7f*nExSd{iT?389~NY zF=5xdsvf365XSMZq>$JE`7m`(fLVln6$cX!OH8SHU(8_72O~wwA;yR(W;tkzCF=K$ zb3?R1j-7?kw^9ZF&e3wWEJ5SQYz`?P4N%${Mj4V2dQwxRf&(L}kj<#V_NU3b%esuM z0}lr#9@kxYbA~qQ>Toqc*-*WSfy1|(sqzMF%MFZ>O-pe2 zWlBBXroU$YN`)%fx*UFL#mkZqjeyQYIuq|fGBcC@yA;LF8IQ0`bWY)eC}q*Fm-3@> z7l-{)N_^lyC?#33F4>Zxkh;V#xmC*5o3d4n&=8=AO38#*DuyRx=gi?whkNr?>AF;8 zObTkeU)DdS$;1Z2yfn$r2Un_)I(v zH0}P&D=e$)uf{m~&a-Kq64A%xAE_RbI4_~PeU^++O(Q&Rw5^uMh@z{DHkS^tbAty} zFC;9?J;hP`~^D;3y1Hor^-3@;?B0Jv4HQ$j66qQq1P#Lde5Qj}#q{0GPA z+NX$Q6F8ehO1ykMXP10d)T$IES)WT1)=HzQ^M{cJ+ikh!^?`Hb3s@oUDJJu_yct1e z6=w@L;*m6zgt^MVpTWO26`7W>g^?)c`*vGu&h^(!7gdKF3rIw=OsKW_j9?_RtmREHvzoKTWi)UU zX<*dJ*6%UgGNO%-w52LIFbOq^bSN}G{Yu;B+9VYs8Z^%nYNqL&Hp}Bd zQLnh=j=pEdVyPZ`yl4Y>odg43`~0%11VRe~dYi07eRxQAO+}q-l>?u? zX(wAheSI11xfahOtwvwdwE!@-VBv03Wx&_1@<4DHxA1-0$$Kn4^ep$MRY* zzJN@3laSpKRZg{@Gkle=w?(hU;cy6rq{%sRBg?~Ie5>ZcGpBmMTUi=8h|`|dv@@r- zW$8>J9P*^3@OwDP7LG^7jH@A^*`YWDr%VmoR9l2rzBo_R#`15*${MNP2iv;ruK=rW z1<}zQ7M?!&HZoMWH-$R-BI;oHD(}>u54nihpX8w~f_?@gkQl|ZyePd=3jy zV~4*H57;GYmjT=Li^{EA->rT5`i)Qo&s551ngB(%pY2}PC*@;!4L$s100|7chNQ&_N9qH&_}guuR}0 z^U6ewwj2^tXm)8QPhgW%AIJ+%0eE#!hJ|r6rVZ$os?KEp+1?gWIc`l)7!cKyEw^V0 zmfx_&#`a}#E!um|l%r@deAECODa`jkN${Ea^7^Z&-fl~oL~AFr6=%}`$RDZRu5I6? zk%@eO$SlPb@EE$Y^L)4tad*Uj*!;3umv}SQx61s__->ks5+ZbBPCorRgjW#lUUuYa z_$5+k>d}&)CK_Ig#vYs56_c)5qB}}-G^CK-0f+v;3yu|Ji7F}gjC{m} zc#`b|`4yF=ZW0gbOZW_nqcmukb{I8SA%(`aHK%;4O52#y9{J4fpv(!fXN|qs+DGLP zM>x2N{DpoueuPy`;;8M{J|AVki5hO}9A?cXgE50KWov>Ihm0>2B0EngNcpsPY`rjYdW?Y`S`FO!p9Q%eU7(Y3o|j?CBePbUFXOh7+TDp5@L zD3%xlB@Yf7D#$A`R;U`EOwoiCUCa$fY*Qd(ac%s_Noi`08o$MM56*~b02NI}dizg; zgu=3wg_Sd6IPyqhkbFf~A} z!x@8lW7pTZ#X8v{7J*^q5)P&)jr@t zNWQfDgj_5e&ifbD%(gcZ4f3_Jd}ZNTB>yDl?p}-SUx@}sId8!{=V-VRS#8~#mtFTr zi_U+w6MUs30_64;(^$4J6rOa%@puG@vC!3w%b*phXXPfUl1m5dQ#E#sO-t{rbl07@ z3ZMGR=Wwo}*=5|TpvJ&!s%Z8Uu+|zFMTMUbe5<-Sm@UD!?Kd8K1j)w z-MSh){>|fNMMDKLq+V%mlLw-c4urJj(Cy_OloYJuML6rCSU{?148yVNQVU3=`P+~R8IurJ^d z)~_=&*f+Om2yzX`)c{jpHdQodO_i9}k}$7kKAiF!SCiqARQprEm@9~$xw)oUUR?Wn zwme6BS^%yvWZd4ZXZT_K2VjR<0>juvthnfH+$H19WaM(Jk$T*x$qr?6C;8YVjB zZLDP@ySWRpEy0nOZyY>vdEU|b4Y@r&=`pQx&8an^BYV$yHtTEc1^8QY58}{ z9hP5Oep%jEc&MOm%2Vh47f#W+HytUS`_MdB+h1yCO!g7or24cx^-45co8*^+^$eCl zTt6XS9fpv4L}oyHmOmzhEdQ9v5OuIx*tC*dtwLEnRB!pIswhn9;Q?8@Ey*kQlbh^v zc#d7w@JA0nGdyp119>v!g{HkkV>7>u54tloX4_ivJjk>o$VMkW;}4~Tyvc575>gJh zNdv9pLpE8?c$&#f1zWM1gMG?7bGI?hHOK$xKY5=y(B>bjzdFWHM;0M1iIQQ*yqViy z-pN8vv%sFT-egmmP(7F!BV?CHxwxln{&$m(r0P!-=MtwtrUBNYiv8q0)sj!^L8Qi+ zg{e$-r5^f(Ni)bo;WE4xJ2~(+T}sc~>;7D2IIyKX zbsAIJGnZXQOd|1U7h3G&5s=T)4C)p$WoSf}yF>`KIZASym&}%1?4P9ji<+()D}05w zE@i%T2Zosk&Nzp8<#W+V+8iSxHG?TeTfZXPgWB~sRw;4N9yYimNe&t@ALT(W_P7qW zV~*93xi{FOtdu>k-6tYaA(g&nU$0%0%Lw2PHB9lR4yLgnQ+6m#kEYUdl5}TX$ zA{yI9WHr5E?#AjH%+a2-oH_0s!e*;2$pfjW6;jqtS!1~UZPvy+QK%pj21^e&3DUQ&Wf11 z9OkAgQB->gTbf5cAKa!QZo-1qN843QMOKKNz~qcnn74g&zGQxN7#Xh;Tg=ddg(5by zdLS>9qaiQ?Q_z(2$Py#k{>(c{+xZmx-8-7qgGrM|L^&a&FiWzGMWZjS+7o16BECDQ zOHMSztD4o-*!>k=JikC(Q_Fv-t+8jn97mQc(#;Ho$I;Vi-y@Ta>`FMtM*Ge-!-UyVk7**69}QxUXPlC`8b(zl zvBk=;Y%+XfS#y6(`sdDNEL(%HWJzB6&9`e^3@N09j`ziUm4%G0NZ4`|WPO|1<+{n_ zMDe&IGf3h&U&hWC!cW=cP>QrTF0i$IK+-=nM!kT&&dynG+)<##E(9EYCWemOM14BJeZuOHOd!{B3xt5DEs^foe!8xpPYxYp_mGn<{73c zAar6So>)6XlHI!RkFqjs18V){xeCOmZ}bX^Y$O{Wxk!SqeIVk6CS;~V{&q58x?lRs zO6;c}fS`q70n6yQcw@(Ea_0EUaei4hlj9 zQyPUrBpY#2yM^rtLV8mid#d>S0mZ)D01nSb0@K)07|IUM7a_kUvojnll~nc?OU#~u z$etI6q;!JA!{W@J&lKr|Vg-#<=y>(Q;$|0voyf@Asp;ehjT;P?AgCotO03>arg0xs z#FZqLc&TM9Jd>t$?@sYsNU9Kt|K7&JvQ`q!FrMyV-jN5b}bTel)w8V7sn z-F|)-XB@DpJ)}~xBGb?<73h|Z`Jf3?rKK9{RI{+AsqG%)y7&T+rg{Oha zD^@C8L*|=k#=bikYUL;eHOY9Vh)$5M{V*miW2Q2|uPC-_E!s5`&d6~j9b$`RKavWb zO@AIImD)1@Y}mf&6#takI+FG{bE2v|ft556csK+q39ZIjl$FaW*O_qTY)>d76)9#4 ztw)VwMF6TdIj!Vl;PIF`jihu&nl1*J8e`a#ctIh_iiX|Nxj4Y{ZQsO#N0kaFQ0kSf zUxn>!8)|UZr6X&+w$HVR;Nu%!OfFlcNQn1?hcZ+ZDp!(acu51{bXLY#km@QnADTL^ zlwJ+3IQ{VJUnebn>}6qCUYzmK z4d2H&Ogw$McG$6`FfR-bdXXOcic-;C39S?-EB zHq)W827MAX9f%f$q$k47Y2ww7!x=l}f)HH1^S~^YYOJ4NSK8K0(hneKrC|G2raD$E zgteRrE>kL`&)BYo=rh%OJo7KHyQbp6^4&98TdStEZ(ZwHjS({dxk>dC;5B#oWRN4n z2M2wlSdXVl+cH!|IA*-+4&mLOQ)?&dQc%e0k3~A{{*S(K*6sr=qk%9#E3`T|v0Wz~ zW^7ci_5hn)+@Dg)aL9(%dRD12PXZJ~vz5$yDF-%D9O#So{7eqJkza8Er{-p`7Hr1% z9;v(8rfNhMO5{~{{CTwD#4`J;nep->1ikBCC1j^=xE7lTuRS<@EMFmL1SSCzZH>iP$)<%H0&d*+JWEX7c3@1NRySv9+) z{iRe3p&jR-K6ady1L4X5wB>}M`H}udZou7eX0P)Hl39LqKSHebb52*>z*1^KnwoYgwC=^_sm$*)E5*B{i#c# zxh1O-Yd`$3kJc5QbqmTHH`RqEUt4BBsG|idec5G7RYFp~5J;9BnloHIxZ1}#pr8Ip zoOpKd3X<9eSo$`glJmZjh25g~l}gf!{iD=o95@+}Q}WZ|xs=6Q_b5rSJ_^ICB*4d}JT{<4m8Us3Qd<;3>R8+h3Po#4>^b*3S%dM1 zn9mis9huwC7u2ZAM-|7nIT~&p$!JX5dAH_i7nigB)TJe{^MpNh|x3n9x=~QqMPs8}ko&hQ)*wMrREf(teeQk$k1u%PY(DVZT zA)U1y2amhvxu!>+{J@)K`_ezUUtxw23YLqbvg5>xq)y{@yONmo?z;8C?H517c@pg# zYOFer*w>2^`sA-8~Fsz_isMK35aSD;OLNjz%{Gx_;rj!O`f7K-bUzS+b$;JiBF4f7Gw1pI_%!o9>Ir>B;ih z?b-n8vsVdx5Psv8wFz#}zwz=L-S``S2^-DaYL@QId|rE?;I}o5JiTHSYZ1XLS2*3o zTCuZ#yXyj+K7QlH0j5B4fF&Tf1XF?F6hVRD6u~KiA|Ty3MNl~Y1r%X9^@pk5d;vJv z|2nY6k~zQ}V2S{}@d=Lt!F6H@2u=}HApQjto>=mq1Ym8pQ?UvS?yc8%d@y=w%gcAO zb|xv-^u`zS6bNoDk$~XlC@K)#-p46|B0z7PA|xO6n zOo8A_Aqfa>EujLzDS}f3MS$KoMMyw!il73)DS`sQ&?1gCSS8|r9}_Iv;&Wa#?z3i` z^+liN<4OX8k1Hw=d|Xi=7~_imkNn21B@`2GEs=oW))FcZe>iJN*TK&zf}+8-2nh(T zMNom@S_B1xQv|07ihy+E6hYzO6hVRD6hVRb9khsdt0oRd7L7^5T{rp#-hE_=+gMt5 zw;R{aDI8oor$F!pJOzR;;3Xjbq!baA@9Dzw1&~1DbiwI@B0z7PE+ioSq;%0;7|1tH z5fl@yQBWW_MMyw!il73)DS}f3MS$KoMMyyWUKBARKYSXFH_!_AUKw((|Jt%me%Q9?$lKD@^#cc(1Kd>}c*5sfXmAduNN|ea6me@%hN=+B>pJhvZz1s=;`Oz`PHWTVsd&~;2U>$pd#{rc6YGft-bFb z`T|HV;b8x>VAJQ7ZX93^a5vfD<|qmW_wS=XaEjm*!6~8}0`v=~2nqzJ2nxjiStn+R zSC_wWfH}Zj!~y9T4iu2Z=x@9DVqU_D+xw`z{IBeNyJZd_7Y6+{xx=qGaZ#xF%pd{5 ziHiyZR~{)4oFX_yPz0nKrw9rMrw9rJrw9rJ*CIGYP*IR>oFXV3oFXU?oFXJ3xE4VL z;y;=qVnh7;{+chqe~>i)<3y+w@a{M6bx85xR!9j5ZiS=*@xQV{j&AHetbXMi2bcrg zT|77kQ#?2aOF(dn;1t0rqB{cg8>a{f2u=}HAh?=Ff#6yMrwEFGbo;YV#IGkp?FPxM zFaJSyn_E@-)%$<6k&IPy4zPp@H}g{I;1W!M;5$JS2u=~4BB&@xH%<{04o(pi2u=|a z5L}C(0>LSQQv^kT-u`_Q@!8k!occ9i0I5RU97Q{Zo1-WY|0avIaw1e(kM6gBQ?0tc z)a)DAb0{GHJ`ywQfi7P;aZxZhaZw;RMMyyWS?uUt$bkKkQv}6@Qv?NqQ-lNrrwA$# zoFX_yPz30WQ-lNrrwA$#oFXU?T#NX9D1w~`m6qM@#_i}74sJ)MKyVWj1%jKPBp^6N zaEhP^&>N=+3IwMJ2?$ORR3Nw(!6||wKyQB*il}(#@}__63m}2Q>4FLerwa-M*C_sE zbU~Y|c>6slLYwVWtil_5>-8NUj2_zZ^4)ha-p8$w6clcSq(E>hBn5(RR7gN@ir^GM z5ui6t5flhc5fTubBB(%cErL@7MS$KoMMyw!il73)DS`sQwFpiT6ane>yHP|yRDv2s z-ltu2bF%keP38UX?e-o);Fd=U2)8^^ApR^H6=nlL_VxF$Jjx0sf8YR1uyBB>cyJD; zKyVJGKyZrS6hTEny8U-jME|K}Lj_^TZ1vxseW_b>l)vz$5XFXDOC%tEx22G|%yED@ zz};kmo1-Wke>e_4)?k&0wml|Tw8iJVYTRc%uuI4DZvUfpdzVh;YfTEqf2ShZr6+&w z;~$Q=x-^zcFqhyi;((9bT0-&Q))EN_P7zcf_#{Vx;1t0rf+8T@I7Lu6I7Lt(I7Lt( z{*YS4{;G+?dkDfL;jSC~0`ESu#BD6^c8b6sx!Y;mxb2(*!EJmL2yP*vK=9ok2?$OR e|Fslx=eH#nj<}tE;s|Mh`Z Date: Sat, 22 Jun 2024 09:49:42 +0200 Subject: [PATCH 47/61] add docstrings to private class methods --- sofar/sofastream.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sofar/sofastream.py b/sofar/sofastream.py index 02c131bf..70c36b39 100644 --- a/sofar/sofastream.py +++ b/sofar/sofastream.py @@ -61,16 +61,28 @@ class and :func:`read_sofa` function instead. """ def __init__(self, filename): + """Initialize a new SofaStream object (see documentation above)""" self._filename = filename def __enter__(self): + """ + Executed when entering a ``with`` statement + (see documentation above). + """ self._file = Dataset(self._filename, mode="r") return self def __exit__(self, *args): + """ + Executed when exiting a ``with`` statement + (see documentation above). + """ self._file.close() def __getattr__(self, name): + """ + Executed when accessing data within a with statement + (see documentation above).""" # get netCDF4-attributes and -variable-keys from SOFA-file dset_variables = np.array([key for key in self._file.variables.keys()]) dset_attributes = np.asarray(self._file.ncattrs()) From 27f2021191c946242a581ac7849c8449ce762cba Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Tue, 25 Jun 2024 16:32:46 +0200 Subject: [PATCH 48/61] add fa-icons, hide section navigation on main page --- docs/conf.py | 3 +++ docs/resources/icons/contribute.png | Bin 25431 -> 0 bytes docs/resources/icons/conventions.png | Bin 24053 -> 0 bytes docs/resources/icons/documentation.png | Bin 24708 -> 0 bytes docs/resources/icons/getting_started.png | Bin 33563 -> 0 bytes docs/resources/icons/history.png | Bin 39186 -> 0 bytes docs/sofar.rst | 32 ++++++++++++++++------- 7 files changed, 25 insertions(+), 10 deletions(-) delete mode 100644 docs/resources/icons/contribute.png delete mode 100644 docs/resources/icons/conventions.png delete mode 100644 docs/resources/icons/documentation.png delete mode 100644 docs/resources/icons/getting_started.png delete mode 100644 docs/resources/icons/history.png diff --git a/docs/conf.py b/docs/conf.py index 86da3654..501be602 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -104,6 +104,9 @@ # -- HTML theme options # https://pydata-sphinx-theme.readthedocs.io/en/stable/user_guide/layout.html +html_sidebars = { + "sofar": [] +} html_theme_options = { "navbar_start": ["navbar-logo"], diff --git a/docs/resources/icons/contribute.png b/docs/resources/icons/contribute.png deleted file mode 100644 index 79bf481ef2c0289d9ac263f58eaf9329f4691529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25431 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 diff --git a/docs/resources/icons/conventions.png b/docs/resources/icons/conventions.png deleted file mode 100644 index 18e235804ab7dd0f3bd47bb09a5f879c244179b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24053 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

65ZJA73T*lg}&2cCcn(L3JaVv*ICHl4+}ei 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 G;r|8V+#<68 diff --git a/docs/sofar.rst b/docs/sofar.rst index 35e3cc3d..5ca616cf 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -57,8 +57,11 @@ files. **Getting Started** ^^^^ - .. image:: resources/icons/getting_started.png - :width: 200 px + .. raw:: html + + + .. grid-item-card:: :link: documentation @@ -68,8 +71,10 @@ files. **Documentation** ^^^^ - .. image:: resources/icons/documentation.png - :width: 200 px + .. raw:: html + + .. grid-item-card:: :link: conventions_introduction @@ -79,8 +84,11 @@ files. **SOFA conventions** ^^^^ - .. image:: resources/icons/conventions.png - :width: 200 px + .. raw:: html + + + .. grid-item-card:: :link: contributing.html @@ -89,8 +97,10 @@ files. **Contributing** ^^^^ - .. image:: resources/icons/contribute.png - :width: 200 px + .. raw:: html + + .. grid-item-card:: :link: history.html @@ -99,5 +109,7 @@ files. **History** ^^^^ - .. image:: resources/icons/history.png - :width: 200 px + .. raw:: html + + From 6e2e4b09c0e03f594d95c9ea335f00bcca980ac0 Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Thu, 27 Jun 2024 09:44:27 +0200 Subject: [PATCH 49/61] add header to index.rst --- docs/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index cc508ad0..77404de0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1 +1,4 @@ +sofar +===== + .. include:: header.rst From 6ba95677883f02e6ecf5d8efa05fa2643950a32a Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Thu, 27 Jun 2024 11:32:32 +0200 Subject: [PATCH 50/61] larger logos, draft logo css class --- docs/_static/css/fa_icon_style_draft.css | 7 +++++++ docs/conf.py | 3 ++- docs/sofar.rst | 16 ++++++---------- 3 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 docs/_static/css/fa_icon_style_draft.css diff --git a/docs/_static/css/fa_icon_style_draft.css b/docs/_static/css/fa_icon_style_draft.css new file mode 100644 index 00000000..c9a3f9f4 --- /dev/null +++ b/docs/_static/css/fa_icon_style_draft.css @@ -0,0 +1,7 @@ +/* to be moved to custom.css on gallery once approved */ + +.icon-style { + color: #18609d; + font-size: 5.2rem; + margin: 1rem; +} diff --git a/docs/conf.py b/docs/conf.py index 501be602..3c64fd23 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -97,7 +97,8 @@ html_theme = 'pydata_sphinx_theme' html_static_path = ['_static'] -html_css_files = ['css/custom.css'] +html_css_files = ['css/custom.css', + 'css/fa_icon_style_draft.css'] # to be removed html_logo = 'resources/logos/pyfar_logos_fixed_size_sofar.png' html_title = "sofar" html_favicon = '_static/favicon.ico' diff --git a/docs/sofar.rst b/docs/sofar.rst index 5ca616cf..a43d5e38 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -59,8 +59,7 @@ files. .. raw:: html - + .. grid-item-card:: @@ -73,8 +72,7 @@ files. .. raw:: html - + .. grid-item-card:: :link: conventions_introduction @@ -86,8 +84,7 @@ files. .. raw:: html - + .. grid-item-card:: @@ -99,8 +96,7 @@ files. .. raw:: html - + .. grid-item-card:: :link: history.html @@ -111,5 +107,5 @@ files. .. raw:: html - + + From c6ee1fb494b43bcd5bb0cdbbdd685c0d8e57e2e5 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Thu, 27 Jun 2024 15:29:59 +0200 Subject: [PATCH 51/61] remove header in left side bar --- docs/sofar.rst | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/docs/sofar.rst b/docs/sofar.rst index a43d5e38..4ffebade 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -2,42 +2,13 @@ sofar ===== .. toctree:: - :caption: Getting Started - :maxdepth: 1 - :hidden: - - readme - - -.. toctree:: - :caption: Documentation :maxdepth: 2 :hidden: + readme documentation - - -.. toctree:: - :caption: SOFA conventions - :maxdepth: 1 - :hidden: - resources/conventions - - -.. toctree:: - :caption: Contributing - :maxdepth: 1 - :hidden: - contributing - - -.. toctree:: - :caption: Other - :maxdepth: 1 - :hidden: - history From fb5671598c4fc7dca1835416422b61cf3d2378e2 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 27 Jun 2024 15:44:53 +0200 Subject: [PATCH 52/61] fix headings --- README.rst | 8 +++++--- docs/resources/conventions.py | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 722daa7b..336464f1 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,8 @@ -====== -Readme -====== +.. raw:: html + +

+ +


.. image:: https://badge.fury.io/py/sofar.svg :target: https://badge.fury.io/py/sofar diff --git a/docs/resources/conventions.py b/docs/resources/conventions.py index 1fe5f78c..783c2be9 100644 --- a/docs/resources/conventions.py +++ b/docs/resources/conventions.py @@ -25,7 +25,8 @@ # write general information --------------------------------------------------- docs = ( '.. _conventions_introduction:\n\n' - 'Introduction\n============\n\n' + 'SOFA Conventions\n' + '================\n\n' 'SOFA conventions specify what data and metadata must be stored in a SOFA ' 'file. Different conventions can be used to store different types of data,' 'e.g., head-related impulse responses or musical instrument directivities.' From 9a59371d7ba0f40c689cab5d67e0879d0c9e1a31 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Thu, 27 Jun 2024 15:58:16 +0200 Subject: [PATCH 53/61] small doc improvements --- CONTRIBUTING.rst | 13 +++++++------ README.rst | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 90e6ed58..0873d5f6 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -41,11 +41,12 @@ Ready to contribute? Here's how to set up `sofar` for local development using th $ git clone --recursive https://github.com/YOUR_USERNAME/sofar.git $ cd sofar - Note that some graphical Git interfaces can not do the recursive clone. If the folder sofar/sofa_conventions is empty try:: + +3. Note that some graphical Git interfaces can not do the recursive clone. If the folder sofar/sofa_conventions is empty try:: $ git submodule update --init -3. Install your local copy into a virtualenv. Assuming you have Anaconda or Miniconda installed, this is how you set up your fork for local development:: +4. Install your local copy into a virtualenv. Assuming you have Anaconda or Miniconda installed, this is how you set up your fork for local development:: $ conda create --name sofar python $ conda activate sofar @@ -53,13 +54,13 @@ Ready to contribute? Here's how to set up `sofar` for local development using th $ pip install -e . $ pip install -r requirements_dev.txt -4. Create a branch for local development. Indicate the intention of your branch in its respective name (i.e. `feature/branch-name` or `bugfix/branch-name`):: +5. Create a branch for local development. Indicate the intention of your branch in its respective name (i.e. `feature/branch-name` or `bugfix/branch-name`):: $ git checkout -b name-of-your-bugfix-or-feature Now you can make your changes locally. -5. When you're done making changes, check that your changes pass ruff and the +6. When you're done making changes, check that your changes pass ruff and the tests:: $ ruff check @@ -67,13 +68,13 @@ Ready to contribute? Here's how to set up `sofar` for local development using th ruff must pass without any warnings for `./sofar` and `./tests` using the default or a stricter configuration. Ruff ignores a couple of PEP Errors (see `./pyproject.toml`). If necessary, adjust your linting configuration in your IDE accordingly. -6. Commit your changes and push your branch to GitHub:: +7. Commit your changes and push your branch to GitHub:: $ git add . $ git commit -m "Your detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature -7. Submit a pull request on the develop branch through the GitHub website. +8. Submit a pull request on the develop branch through the GitHub website. Submodules diff --git a/README.rst b/README.rst index 722daa7b..e18c4191 100644 --- a/README.rst +++ b/README.rst @@ -26,7 +26,7 @@ responses or transfer functions. They are defined by the AES69-2022 standard Getting Started =============== -The `sofa and SOFA notebook`_ gives an overview of the most important sofar +The `sofar and SOFA notebook`_ gives an overview of the most important sofar functionality and is a good starting point. For processing and visualizing data inside SOFA files, we recommend the `pyfar package`_ that can read SOFA files through `pyfar.io.read_sofa` and the in-depth examples contained in the @@ -54,7 +54,7 @@ Contributing Refer to the `contribution guidelines`_ for more information. .. _sofa_conventions : https://github.com/pyfar/sofa_conventions -.. _sofa and SOFA notebook: https://pyfar-gallery.readthedocs.io/en/latest/gallery/interactive/sofar_introduction.html +.. _sofar and SOFA notebook: https://pyfar-gallery.readthedocs.io/en/latest/gallery/interactive/sofar_introduction.html .. _pyfar package: https://pyfar.readthedocs.io .. _pyfar example gallery: https://pyfar-gallery.readthedocs.io/en/latest/examples_gallery.html .. _pyfar.org: https://pyfar.org From d51ec5ee2a2e34e0b72c636a889342a6c118f7ce Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Thu, 27 Jun 2024 16:01:42 +0200 Subject: [PATCH 54/61] fix intent in sofa conventions --- docs/resources/conventions.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/resources/conventions.py b/docs/resources/conventions.py index 783c2be9..f7ec6c0f 100644 --- a/docs/resources/conventions.py +++ b/docs/resources/conventions.py @@ -58,7 +58,7 @@ ' * **m:** mandatory data. Data is optional if flag is missing\n\n') # write table of content ------------------------------------------------------ -docs += '.. _conventions:\n\nConventions\n===========\n\n' +docs += '.. _conventions:\n\nConventions\n-----------\n\n' for path, name_version in zip(paths, names_versions): name, version = name_version @@ -70,7 +70,7 @@ docs += f'* :ref:`{label} <{reference}>`\n' # write conventions ----------------------------------------------------------- -docs += '\nCurrent\n=======\n\n' +docs += '\nCurrent\n-------\n\n' # loop conventions deprecated = False @@ -83,7 +83,7 @@ # write section title if 'deprecated' in path and not deprecated: - docs += 'Deprecated\n==========\n\n' + docs += 'Deprecated\n----------\n\n' deprecated = True # write convention name, version From 641f9727a90e039fced7b6e398170fe991df1f2a Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 27 Jun 2024 18:49:23 +0200 Subject: [PATCH 55/61] restructure section 'documentation' --- docs/api_reference.rst | 15 +++++++++++++++ docs/documentation.rst | 11 ----------- docs/sofar.Sofa.rst | 16 ---------------- docs/sofar.functions.rst | 16 ---------------- docs/sofar.rst | 6 +++--- sofar/__init__.py | 3 --- 6 files changed, 18 insertions(+), 49 deletions(-) create mode 100644 docs/api_reference.rst delete mode 100644 docs/documentation.rst delete mode 100644 docs/sofar.Sofa.rst delete mode 100644 docs/sofar.functions.rst diff --git a/docs/api_reference.rst b/docs/api_reference.rst new file mode 100644 index 00000000..636b7f77 --- /dev/null +++ b/docs/api_reference.rst @@ -0,0 +1,15 @@ +.. _api_reference: + +API Reference +============= + + +This section documents sofar SOFA objects and functions. For examples on how to +use sofar refer to the +:ref:`sofa and SOFA ` +examples. + +.. automodule:: sofar + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/documentation.rst b/docs/documentation.rst deleted file mode 100644 index e47a5ab6..00000000 --- a/docs/documentation.rst +++ /dev/null @@ -1,11 +0,0 @@ -.. _documentation: - -Documentation -============= - - -.. toctree:: - :maxdepth: 2 - - sofar.Sofa - sofar.functions diff --git a/docs/sofar.Sofa.rst b/docs/sofar.Sofa.rst deleted file mode 100644 index 2ab4ceb8..00000000 --- a/docs/sofar.Sofa.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. _sofar_SOFA: - -SOFA objects -============ - -This section documents sofar SOFA objects. Functions that work on SOFA objects -are described in the :ref:`sofar_functions` guide. For examples on how to use -sofar refer to the -:ref:`sofa and SOFA ` -examples. - -.. autoclass:: sofar.Sofa - :members: - :undoc-members: - :show-inheritance: - :exclude-members: diff --git a/docs/sofar.functions.rst b/docs/sofar.functions.rst deleted file mode 100644 index 4e6a28ae..00000000 --- a/docs/sofar.functions.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. _sofar_functions: - -sofar functions -=============== - -This section documents general functions of the sofar package. Handling data in -SOFA objects is described in :ref:`sofar_SOFA`. For examples on how to use sofa -refer to the -:ref:`sofa and SOFA ` -examples. - -.. automodule:: sofar - :members: - :undoc-members: - :show-inheritance: - :exclude-members: Sofa diff --git a/docs/sofar.rst b/docs/sofar.rst index 4ffebade..aa374464 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -6,7 +6,7 @@ sofar :hidden: readme - documentation + api_reference resources/conventions contributing history @@ -34,11 +34,11 @@ files. .. grid-item-card:: - :link: documentation + :link: api_reference :link-type: ref :text-align: center - **Documentation** + **API Reference** ^^^^ .. raw:: html diff --git a/sofar/__init__.py b/sofar/__init__.py index 4d004c68..51763bf4 100644 --- a/sofar/__init__.py +++ b/sofar/__init__.py @@ -1,7 +1,4 @@ # -*- coding: utf-8 -*- - -"""Top-level package for sofar.""" - __author__ = """The pyfar developers""" __email__ = 'info@pyfar.org' __version__ = '1.1.4' From 1a67743fee58347e7193f794c1bce99f94a54c92 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Fri, 28 Jun 2024 09:17:07 +0200 Subject: [PATCH 56/61] fix typo --- docs/api_reference.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api_reference.rst b/docs/api_reference.rst index 636b7f77..04cfe7c8 100644 --- a/docs/api_reference.rst +++ b/docs/api_reference.rst @@ -6,7 +6,7 @@ API Reference This section documents sofar SOFA objects and functions. For examples on how to use sofar refer to the -:ref:`sofa and SOFA ` +:ref:`sofar and SOFA ` examples. .. automodule:: sofar From 9d419faa9162f3773d0fb4beeaf991d1c1253182 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Fri, 28 Jun 2024 09:48:33 +0200 Subject: [PATCH 57/61] merge module documentation from develop and current branch --- docs/api_reference.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/api_reference.rst b/docs/api_reference.rst index 04cfe7c8..e8e2a53d 100644 --- a/docs/api_reference.rst +++ b/docs/api_reference.rst @@ -3,11 +3,16 @@ API Reference ============= +This section documents sofar objects and functions. Sofar contains functions +for reading, writing and comparing SOFA files, functions to handle SOFA +conventions, and two classes to handle data from SOFA files. The +:py:class:`~sofar.Sofa` class is used to read and write entire SOFA files. To +open a SOFA file without reading the entire file into memory, +:py:class:`~sofar.SofaStream` enables partial reading of data. -This section documents sofar SOFA objects and functions. For examples on how to -use sofar refer to the +For examples on how to use sofar refer to the :ref:`sofar and SOFA ` -examples. +notebook and the documentation below. .. automodule:: sofar :members: From ade94c9ad38be04b46429b4d3ba14ec7e142dc05 Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Fri, 28 Jun 2024 10:20:40 +0200 Subject: [PATCH 58/61] remove draft css, style now coming from gallery's custom.css --- docs/_static/css/fa_icon_style_draft.css | 7 ------- docs/conf.py | 3 +-- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 docs/_static/css/fa_icon_style_draft.css diff --git a/docs/_static/css/fa_icon_style_draft.css b/docs/_static/css/fa_icon_style_draft.css deleted file mode 100644 index c9a3f9f4..00000000 --- a/docs/_static/css/fa_icon_style_draft.css +++ /dev/null @@ -1,7 +0,0 @@ -/* to be moved to custom.css on gallery once approved */ - -.icon-style { - color: #18609d; - font-size: 5.2rem; - margin: 1rem; -} diff --git a/docs/conf.py b/docs/conf.py index 3c64fd23..501be602 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -97,8 +97,7 @@ html_theme = 'pydata_sphinx_theme' html_static_path = ['_static'] -html_css_files = ['css/custom.css', - 'css/fa_icon_style_draft.css'] # to be removed +html_css_files = ['css/custom.css'] html_logo = 'resources/logos/pyfar_logos_fixed_size_sofar.png' html_title = "sofar" html_favicon = '_static/favicon.ico' From 127c4e2783d96bdedb1e9e20fbf7ae859b46d87d Mon Sep 17 00:00:00 2001 From: hoyer-a Date: Fri, 28 Jun 2024 12:41:40 +0200 Subject: [PATCH 59/61] fix typos --- docs/api_reference.rst | 2 +- docs/sofar.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api_reference.rst b/docs/api_reference.rst index e8e2a53d..dda6650f 100644 --- a/docs/api_reference.rst +++ b/docs/api_reference.rst @@ -8,7 +8,7 @@ for reading, writing and comparing SOFA files, functions to handle SOFA conventions, and two classes to handle data from SOFA files. The :py:class:`~sofar.Sofa` class is used to read and write entire SOFA files. To open a SOFA file without reading the entire file into memory, -:py:class:`~sofar.SofaStream` enables partial reading of data. +:py:class:`~sofar.SofaStream` enables partially reading data. For examples on how to use sofar refer to the :ref:`sofar and SOFA ` diff --git a/docs/sofar.rst b/docs/sofar.rst index aa374464..db1a61d5 100644 --- a/docs/sofar.rst +++ b/docs/sofar.rst @@ -50,7 +50,7 @@ files. :link-type: ref :text-align: center - **SOFA conventions** + **SOFA Conventions** ^^^^ .. raw:: html From 9ff76b974934d0d64b5c9782d641d4b96278fb31 Mon Sep 17 00:00:00 2001 From: Anne Heimes Date: Mon, 15 Jul 2024 15:50:11 +0200 Subject: [PATCH 60/61] remove unused files --- docs/_static/css/custom.css | 11 ----------- docs/_static/favicon.ico | Bin 15406 -> 0 bytes 2 files changed, 11 deletions(-) delete mode 100644 docs/_static/css/custom.css delete mode 100644 docs/_static/favicon.ico diff --git a/docs/_static/css/custom.css b/docs/_static/css/custom.css deleted file mode 100644 index 86b1cea7..00000000 --- a/docs/_static/css/custom.css +++ /dev/null @@ -1,11 +0,0 @@ - -html[data-theme="light"] { - --pst-color-primary: #18609d; /* pyfar blue as primary color */ -} - -html[data-theme="dark"] { - --pst-color-primary: #18609d; /* pyfar blue as primary color */ -} -html { - --pst-icon-external-link: ""; -} \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico deleted file mode 100644 index 0c96ea3a00a4706507435f6ad5b082f4d0a9ab72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 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 From 1689038eb7c3ea7a88649f6364dc35946c83a4d1 Mon Sep 17 00:00:00 2001 From: Fabian Brinkmann Date: Thu, 29 Aug 2024 13:42:32 +0200 Subject: [PATCH 61/61] update for release 1.2.0 --- HISTORY.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index c0b85ee4..023a8d06 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -2,6 +2,12 @@ History ======= +1.2.0 (2024-08-29) +------------------ +* Feature: Introduce `SofaStream` class for reading parts of large Sofa files without reading the entire file (PR #90, 97) +* Documentation: Add improved landing page for documentation on readthedocs.io and harmonize documentation (PR #80, 87, 88, 89, 92, 95, 96, 98, 101, 103, 105, 106, 107) +* Enhancement: When manually updateing the conventions with `sofar.update_conventions`, the conventions are first downloaded to a temporary folder and compared to the existing conventions without overriding them (they were directly overridden before). The user is then informed about the changes and can continue or abort updating the conventions (PR #94) + 1.1.4 (2024-06-15) ------------------ * Update for numpy 2.0 (PR #100)

-#_=LVrk6fglQPJ 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 e|Fslx=eH#nj<}tE;s|Mh`Z Date: Thu, 20 Jun 2024 15:44:32 +0200 Subject: [PATCH 46/61] replace unnecessary large image files --- docs/resources/icons/contribute.png | Bin 361471 -> 25431 bytes docs/resources/icons/conventions.png | Bin 348174 -> 24053 bytes docs/resources/icons/documentation.png | Bin 348029 -> 24708 bytes docs/resources/icons/getting_started.png | Bin 394969 -> 33563 bytes docs/resources/icons/history.png | Bin 426505 -> 39186 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/resources/icons/contribute.png b/docs/resources/icons/contribute.png index fb78edd9a88703b1983893c674f348d29cf280ae..79bf481ef2c0289d9ac263f58eaf9329f4691529 100644 GIT binary patch literal 25431 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 literal 361471 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 z%0D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 GZ~O))oGlgr diff --git a/docs/resources/icons/getting_started.png b/docs/resources/icons/getting_started.png index 8d50fbb1088dd5b4d7ab38832cfa49972b6dbd7a..8bfce6b91db399cfdda67d49e4fdda1f1b7bcbed 100644 GIT binary patch literal 33563 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�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 diff --git a/docs/resources/icons/history.png b/docs/resources/icons/history.png index 4be44b0724ae92ccc874ada4de6719cfce43fa5f..d6fbcfa60ef63ae9295d9d02d6e9e9dc731a1f39 100644 GIT binary patch literal 39186 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