Repository: pyfar/sofar (language: python)

Issue:
remove unused files
files are feshed from gallery
Harmonize docs
- Update readme and contributing according to pyfar https://github.com/pyfar/pyfar/pull/590
- Remove examples and link to gallery instead


Discussion / hints:

Fix patch:
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 9bfd4fa8..2edc775b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,71 +1,124 @@
+# 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
-.tox
 .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
+docs/resources/conventions.rst
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index ddd066ba..0873d5f6 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 sofar. 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,15 +34,15 @@ 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 <https://desktop.github.com/>`_, extensions in `Visual Studio Code <https://code.visualstudio.com/>`_ ...
 
-1. Fork the `sofar` repo on GitHub.
+1. `Fork <https://docs.github.com/en/get-started/quickstart/fork-a-repo/>`_ 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/
+    $ git clone --recursive https://github.com/YOUR_USERNAME/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
+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
 
@@ -73,13 +60,13 @@ Ready to contribute? Here's how to set up `sofar` for local development.
 
    Now you can make your changes locally.
 
-6. When you're done making changes, check that your changes pass flake8 and the
+6. 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::
 
@@ -87,92 +74,7 @@ Ready to contribute? Here's how to set up `sofar` for local development.
     $ 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 <https://martinfowler.com/bliki/TestDrivenDevelopment.html>`_ and `continuous integration <https://en.wikipedia.org/wiki/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 <https://docs.pytest.org/en/stable/index.html>`_.
-- 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 <https://martinfowler.com/articles/mocksArentStubs.html.>`_.
-
-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 <https://docs.pytest.org/en/stable/example/parametrize.html>`_.
-- 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 <https://coverage.readthedocs.io/en/coverage-5.5/>`_ by calling
-
-    $ pytest --cov=. --cov-report=html
-
-
-Writing the Documentation
--------------------------
-
-Sofar follows the `numpy style guide <https://numpydoc.readthedocs.io/en/stable/format.html>`_ 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 <https://www.sphinx-doc.org>`_ 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.
+8. Submit a pull request on the develop branch through the GitHub website.
 
 
 Submodules
@@ -180,31 +82,11 @@ 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
diff --git a/HISTORY.rst b/HISTORY.rst
index 67ebe2f7..023a8d06 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,6 +1,13 @@
+=======
 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)
@@ -81,4 +88,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 56c187b1..a93bea01 100644
--- a/README.rst
+++ b/README.rst
@@ -1,19 +1,41 @@
-======
-Readme
-======
+.. raw:: html
+
+    <h1 align="center">
+    <img src="https://github.com/pyfar/gallery/raw/main/docs/resources/logos/pyfar_logos_fixed_size_sofar.png" width="300">
+    </h1><br>
+
+.. 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
 (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 `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
+`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
 ============
@@ -26,14 +48,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
 ============
@@ -41,10 +56,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
+.. _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
-.. _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/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
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/_static/favicon.ico b/docs/_static/favicon.ico
deleted file mode 100644
index 0c96ea3a..00000000
Binary files a/docs/_static/favicon.ico and /dev/null differ
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 @@
-<div class="navbar-item">
-    <nav class="navbar-nav">
-      <ul class="bd-navbar-elements navbar-nav">
-
-                        <li class="nav-item">
-                            <a class="nav-link" href="https://pyfar-gallery.readthedocs.io">
-                            Home
-                            </a>
-                        </li>
-
-                        <li class="nav-item">
-                            <a class="nav-link" href="https://pyfar-gallery.readthedocs.io/en/stable/examples_gallery.html">
-                                Examples
-                            </a>
-                        </li>
-
-                        <li class="nav-item">
-                            <a class="nav-link" href="https://pyfar.readthedocs.io">
-                              pyfar
-                            </a>
-                          </li>
-
-                        <li class="nav-item">
-                          <a class="nav-link" href="https://sofar.readthedocs.io">
-                            sofar
-                          </a>
-                        </li>
-
-                        <li class="nav-item">
-                          <a class="nav-link" href="https://spharpy.readthedocs.io">
-                            spharpy
-                          </a>
-                        </li>
-
-                        <li class="nav-item">
-                          <a class="nav-link" href="https://pyrato.readthedocs.io">
-                            pyrato
-                          </a>
-                        </li>
-      </ul>
-    </nav></div>
diff --git a/docs/api_reference.rst b/docs/api_reference.rst
new file mode 100644
index 00000000..dda6650f
--- /dev/null
+++ b/docs/api_reference.rst
@@ -0,0 +1,20 @@
+.. _api_reference:
+
+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 partially reading data.
+
+For examples on how to use sofar refer to the
+:ref:`sofar and SOFA <gallery:/gallery/interactive/sofar_introduction.ipynb>`
+notebook and the documentation below.
+
+.. automodule:: sofar
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/docs/authors.rst b/docs/authors.rst
deleted file mode 100644
index e122f914..00000000
--- a/docs/authors.rst
+++ /dev/null
@@ -1,1 +0,0 @@
-.. include:: ../AUTHORS.rst
diff --git a/docs/conf.py b/docs/conf.py
index 44b63abd..501be602 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,7 @@
 # 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)
+    'gallery': ('https://pyfar-gallery.readthedocs.io/en/latest/', None),
     }
 
 # -- Options for HTML output -------------------------------------------------
@@ -102,17 +98,21 @@
 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'
 
 # -- 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"],
     "navbar_end": ["navbar-icon-links", "theme-switcher"],
     "navbar_align": "content",
+    "header_links_before_dropdown": 8,
     "icon_links": [
         {
           "name": "GitHub",
@@ -122,11 +122,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 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))
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 <conventions_introduction>`
-* The `SOFA paper <https://doi.org/10.17743/jaes.2022.0026>`_
-* `sofaconventions.org`_.
-* The SOFA standard `AES69-2022 <https://www.aes.org/publications/standards/search.cfm?docID=99>`_
-
-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 <conventions_introduction>`.
-
-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 <https://depositonce.tu-berlin.de/handle/11303/6153.5>`_
-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/index.rst b/docs/index.rst
index 8b9d96dd..77404de0 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,52 +1,4 @@
-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
+sofar
 =====
-.. 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/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.py b/docs/resources/conventions.py
index 3cbe4252..f7ec6c0f 100644
--- a/docs/resources/conventions.py
+++ b/docs/resources/conventions.py
@@ -17,10 +17,16 @@
 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'
-    '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.'
@@ -44,7 +50,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'
@@ -52,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
 
@@ -64,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
@@ -77,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
@@ -86,15 +92,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
deleted file mode 100644
index 75592287..00000000
--- a/docs/resources/conventions.rst
+++ /dev/null
@@ -1,6581 +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:`FreeFieldDirectivityTF v1.0 <FreeFieldDirectivityTF_1.0>`
-* :ref:`FreeFieldDirectivityTF v1.1 <FreeFieldDirectivityTF_1.1>`
-* :ref:`FreeFieldHRIR v1.0 <FreeFieldHRIR_1.0>`
-* :ref:`FreeFieldHRTF v1.0 <FreeFieldHRTF_1.0>`
-* :ref:`GeneralFIR-E v2.0 <GeneralFIR-E_2.0>`
-* :ref:`GeneralFIR v1.0 <GeneralFIR_1.0>`
-* :ref:`GeneralSOS v1.0 <GeneralSOS_1.0>`
-* :ref:`GeneralTF-E v1.0 <GeneralTF-E_1.0>`
-* :ref:`GeneralTF v1.0 <GeneralTF_1.0>`
-* :ref:`GeneralTF v2.0 <GeneralTF_2.0>`
-* :ref:`SimpleFreeFieldHRIR v1.0 <SimpleFreeFieldHRIR_1.0>`
-* :ref:`SimpleFreeFieldHRSOS v1.0 <SimpleFreeFieldHRSOS_1.0>`
-* :ref:`SimpleFreeFieldHRTF v1.0 <SimpleFreeFieldHRTF_1.0>`
-* :ref:`SimpleFreeFieldSOS v1.0 <SimpleFreeFieldSOS_1.0>`
-* :ref:`SimpleHeadphoneIR v1.0 <SimpleHeadphoneIR_1.0>`
-* :ref:`SingleRoomMIMOSRIR v1.0 <SingleRoomMIMOSRIR_1.0>`
-* :ref:`SingleRoomSRIR v1.0 <SingleRoomSRIR_1.0>`
-* :ref:`GeneralFIRE v1.0 (deprecated) <GeneralFIRE_1.0>`
-* :ref:`MultiSpeakerBRIR v0.3 (deprecated) <MultiSpeakerBRIR_0.3>`
-* :ref:`SimpleFreeFieldHRIR v0.4 (deprecated) <SimpleFreeFieldHRIR_0.4>`
-* :ref:`SimpleFreeFieldTF v0.4 (deprecated) <SimpleFreeFieldTF_0.4>`
-* :ref:`SimpleFreeFieldTF v1.0 (deprecated) <SimpleFreeFieldTF_1.0>`
-* :ref:`SimpleHeadphoneIR v0.1 (deprecated) <SimpleHeadphoneIR_0.1>`
-* :ref:`SimpleHeadphoneIR v0.2 (deprecated) <SimpleHeadphoneIR_0.2>`
-* :ref:`SingleRoomDRIR v0.2 (deprecated) <SingleRoomDRIR_0.2>`
-* :ref:`SingleRoomDRIR v0.3 (deprecated) <SingleRoomDRIR_0.3>`
-
-Current
-=======
-
-.. _FreeFieldDirectivityTF_1.0:
-
-**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
-   :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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-.. _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 <conventions>`
-
-Deprecated
-==========
-
-.. _GeneralFIRE_1.0:
-
-**GeneralFIRE v1.0**
-
-This convention is deprecated. Use :ref:`GeneralFIR-E_2.0 <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 <conventions>`
-
-.. _MultiSpeakerBRIR_0.3:
-
-**MultiSpeakerBRIR v0.3**
-
-This convention is deprecated. Use :ref:`SingleRoomMIMOSRIR_1.0 <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 <conventions>`
-
-.. _SimpleFreeFieldHRIR_0.4:
-
-**SimpleFreeFieldHRIR v0.4**
-
-This convention is deprecated. Use :ref:`SimpleFreeFieldHRIR_1.0 <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 <conventions>`
-
-.. _SimpleFreeFieldTF_0.4:
-
-**SimpleFreeFieldTF v0.4**
-
-This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 <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 <conventions>`
-
-.. _SimpleFreeFieldTF_1.0:
-
-**SimpleFreeFieldTF v1.0**
-
-This convention is deprecated. Use :ref:`SimpleFreeFieldHRTF_1.0 <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 <conventions>`
-
-.. _SimpleHeadphoneIR_0.1:
-
-**SimpleHeadphoneIR v0.1**
-
-This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 <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 <conventions>`
-
-.. _SimpleHeadphoneIR_0.2:
-
-**SimpleHeadphoneIR v0.2**
-
-This convention is deprecated. Use :ref:`SimpleHeadphoneIR_1.0 <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 <conventions>`
-
-.. _SingleRoomDRIR_0.2:
-
-**SingleRoomDRIR v0.2**
-
-This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 <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 <conventions>`
-
-.. _SingleRoomDRIR_0.3:
-
-**SingleRoomDRIR v0.3**
-
-This convention is deprecated. Use :ref:`SingleRoomSRIR_1.0 <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 <conventions>`
-
diff --git a/docs/resources/sofar.png b/docs/resources/sofar.png
deleted file mode 100644
index 5f7d286c..00000000
Binary files a/docs/resources/sofar.png and /dev/null differ
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..db1a61d5
--- /dev/null
+++ b/docs/sofar.rst
@@ -0,0 +1,82 @@
+sofar
+=====
+
+.. toctree::
+   :maxdepth: 2
+   :hidden:
+
+   readme
+   api_reference
+   resources/conventions
+   contributing
+   history
+
+
+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.
+
+.. grid:: 1 2 2 3
+    :gutter: 4
+
+    .. grid-item-card::
+        :link: readme.html
+        :text-align: center
+
+        **Getting Started**
+        ^^^^
+
+        .. raw:: html
+
+            <i class="fa-solid fa-rocket icon-style"></i>
+
+
+    .. grid-item-card::
+        :link: api_reference
+        :link-type: ref
+        :text-align: center
+
+        **API Reference**
+        ^^^^
+
+        .. raw:: html
+
+            <i class="fa-solid fa-file-lines icon-style"></i>
+
+    .. grid-item-card::
+        :link: conventions_introduction
+        :link-type: ref
+        :text-align: center
+
+        **SOFA Conventions**
+        ^^^^
+
+        .. raw:: html
+
+            <i class="fa-solid fa-book-open icon-style"></i>
+
+
+    .. grid-item-card::
+        :link: contributing.html
+        :text-align: center
+
+        **Contributing**
+        ^^^^
+
+        .. raw:: html
+
+            <i class="fa-solid fa-pen icon-style"></i>
+
+    .. grid-item-card::
+        :link: history.html
+        :text-align: center
+
+        **History**
+        ^^^^
+
+        .. raw:: html
+
+            <i class="fa-solid fa-clock-rotate-left icon-style">
+            </i>
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 <https://pyfar.org>`_.
-
-
-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 <https://depositonce.tu-berlin.de/handle/11303/6153.5>`_.
-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 <https://pyfar.readthedocs.io/en/stable/>`_ and the
-`pyfar examples notebook <https://mybinder.org/v2/gh/pyfar/pyfar/main?filepath=examples%2Fpyfar_demo.ipynb>`_.
-
-.. |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
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/requirements_dev.txt b/requirements_dev.txt
index dc7cc342..9d8931ad 100644
--- a/requirements_dev.txt
+++ b/requirements_dev.txt
@@ -2,8 +2,7 @@ pip
 bump2version
 wheel
 watchdog
-flake8
-tox
+ruff==0.4.1
 coverage
 Sphinx
 twine
@@ -13,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 bfab1bd4..90ca6d50 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -13,9 +13,5 @@ replace = __version__ = '{new_version}'
 
 [bdist_wheel]
 universal = 1
-
-[flake8]
-exclude = .git, .tox, docs
-
 [aliases]
 test = pytest
diff --git a/setup.py b/setup.py
index ec8c3dda..02ff1a8f 100644
--- a/setup.py
+++ b/setup.py
@@ -19,19 +19,20 @@
     'packaging'
 ]
 
-setup_requirements = ['pytest-runner', ]
+setup_requirements = [
+    'pytest-runner',
+]
 
 test_requirements = [
-    'pip'
     'pytest',
     'bump2version',
     'wheel',
     'watchdog',
-    'flake8',
-    'tox',
+    'ruff',
     'coverage',
     'Sphinx',
-    'twine'
+    'twine',
+    'pydata-sphinx-theme',
 ]
 
 setup(
@@ -47,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,
@@ -69,5 +70,5 @@
     },
     version='1.1.4',
     zip_safe=False,
-    python_requires='>=3.8'
+    python_requires='>=3.8',
 )
diff --git a/sofar/__init__.py b/sofar/__init__.py
index 4d004c68..29659a76 100644
--- a/sofar/__init__.py
+++ b/sofar/__init__.py
@@ -1,13 +1,12 @@
 # -*- coding: utf-8 -*-
-
-"""Top-level package for sofar."""
-
 __author__ = """The pyfar developers"""
 __email__ = 'info@pyfar.org'
 __version__ = '1.1.4'
 
 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 +17,7 @@
 
 
 __all__ = ['Sofa',
+           'SofaStream',
            'update_conventions',
            'list_conventions',
            'read_sofa',
diff --git a/sofar/io.py b/sofar/io.py
index 3d66921d..352dfe09 100644
--- a/sofar/io.py
+++ b/sofar/io.py
@@ -9,13 +9,16 @@
 from .utils import _verify_convention_and_version, _atleast_nd
 
 
-def read_sofa(filename, verify=True, verbose=True):
+def read_sofa(filename, verify='auto', verbose=True):
     """
     Read SOFA file from disk and convert it to SOFA object.
 
     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
@@ -24,7 +27,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 ``'auto'`` 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``
@@ -39,7 +44,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 +53,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 +95,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 +104,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")
@@ -200,6 +205,10 @@ def _read_netcdf(filename, verify, verbose, mode):
                "----------------------------------\n"
                f"{', '.join(custom)}"))
 
+    # set default for verify
+    if verify == 'auto':
+        verify = True if parse(version) >= parse('1.0') else False
+
     # update api
     if verify:
         try:
@@ -234,7 +243,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 +252,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 0b519d0f..2ec9b870 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 ``'auto'`` defaults to ``True`` for
+        stable conventions with versions of 1.0 or higher and to ``False``
+        otherwise.
 
     Returns
     -------
@@ -60,7 +63,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 +71,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.
 
 
@@ -85,7 +88,7 @@ class Sofa():
     _read_only_attr = []
 
     def __init__(self, convention, mandatory=False, version="latest",
-                 verify=True):
+                 verify='auto'):
         """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 == 'auto':
+                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:
@@ -168,7 +184,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 +204,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 +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
@@ -403,7 +419,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 +554,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 +585,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")
 
@@ -695,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.
 
@@ -713,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
         -------
@@ -745,7 +763,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 +772,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 +789,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"))
@@ -856,6 +869,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()
 
@@ -905,7 +922,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
@@ -1006,7 +1023,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")
@@ -1099,7 +1116,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\
@@ -1214,7 +1231,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, )
@@ -1293,7 +1310,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 = \
@@ -1390,7 +1407,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
         ----------
@@ -1462,7 +1479,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])
@@ -1500,7 +1517,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())
diff --git a/sofar/sofa_conventions b/sofar/sofa_conventions
index 6e26140f..ff4660a3 160000
--- a/sofar/sofa_conventions
+++ b/sofar/sofa_conventions
@@ -1,1 +1,1 @@
-Subproject commit 6e26140f36360e12fe0c384f60d22bac4778883f
+Subproject commit ff4660a38bd075851d19116e7b5fea5d2b24f03f
diff --git a/sofar/sofastream.py b/sofar/sofastream.py
new file mode 100644
index 00000000..70c36b39
--- /dev/null
+++ b/sofar/sofastream.py
@@ -0,0 +1,296 @@
+from netCDF4 import Dataset
+import numpy as np
+
+
+class SofaStream():
+    """
+    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.
+
+    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
+        Full path to a SOFA-file
+
+    Returns
+    --------
+    sofa_stream : SofaStream
+        A SofaStream object which reads directly from the file.
+
+    Examples
+    --------
+    Get an attribute from a SOFA-file:
+
+        >>> import sofar as sf
+        >>> filename = "path/to/file.sofa"
+        >>> with sf.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)
+        <class 'netCDF4._netCDF4.Variable'>
+        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):
+        """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())
+
+        # remove delimiter from passed sofar-attribute
+        name_netcdf = name.replace(
+            'GLOBAL_', '').replace('Data_', 'Data.')
+
+        # Handle variable-attributes (e.g. '_Units' and '_Type')
+        var_attr = None
+        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:
+            # 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_netcdf in dset_attributes:
+            # get attribute value from SOFA-file
+            self._data = self._file.getncattr(name_netcdf)
+
+        else:
+            raise AttributeError(f"{name} is not contained in SOFA-file")
+
+        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 samples, frequencies, SOS coefficients
+            (depending on 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.
+        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
+        ----------
+        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
+
+        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
+        ----------
+        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.
+        """
+
+        # Header of inspect-print
+        info_str = (
+            f"{self._file.getncattr('SOFAConventions')} "
+            f"{self._file.getncattr('SOFAConventionsVersion')} "
+            f"(SOFA version {self._file.getncattr('Version')})\n")
+        info_str += "-" * 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)
diff --git a/sofar/update_conventions.py b/sofar/update_conventions.py
index ad1c038b..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 updateing 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/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/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


Test patch:
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/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_io.py b/tests/test_io.py
index 805d5934..56511d18 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")
@@ -182,7 +186,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_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
diff --git a/tests/test_sofa_verify.py b/tests/test_sofa_verify.py
index fc980b40..ffd3ff03 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")
 
diff --git a/tests/test_sofastream.py b/tests/test_sofastream.py
new file mode 100644
index 00000000..e3c23723
--- /dev/null
+++ b/tests/test_sofastream.py
@@ -0,0 +1,126 @@
+from sofar import SofaStream
+from tempfile import TemporaryDirectory
+from pytest import raises
+import netCDF4
+import numpy as np
+import os
+import sofar as sf
+
+
+def test_sofastream_output(temp_sofa_file):
+
+    with SofaStream(temp_sofa_file) 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 returned variable type
+        isinstance(var, netCDF4._netCDF4.Variable)
+        # variable values
+        isinstance(var_data, np.ma.core.MaskedArray)
+        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 == "free field"
+
+
+def test_sofastream_attribute_error(temp_sofa_file):
+
+    with SofaStream(temp_sofa_file) as file:
+        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()
+    inspect_file = os.path.join(tempdir.name, "info.txt")
+
+    with SofaStream(temp_sofa_file) as file:
+        file.inspect(inspect_file)
+        out, _ = capfd.readouterr()
+
+    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:
+        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")
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():