diff --git a/data/resources/thirdparty.html b/data/resources/thirdparty.html index 4fdaf29db..a4d7288c4 100644 --- a/data/resources/thirdparty.html +++ b/data/resources/thirdparty.html @@ -880,351 +880,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -

FreeSurround - https://hydrogenaud.io/index.php/topic,52235.0.html

-
-Copyright (C) 2007-2010 Christian Kothe
-
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C)   
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  , 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
-
-

lunasvg - https://github.com/sammycage/lunasvg

 MIT License
diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt
index 816f4a6ad..af356870f 100644
--- a/dep/CMakeLists.txt
+++ b/dep/CMakeLists.txt
@@ -27,8 +27,6 @@ disable_compiler_warnings_for_target(cubeb)
 disable_compiler_warnings_for_target(speex)
 add_subdirectory(kissfft EXCLUDE_FROM_ALL)
 disable_compiler_warnings_for_target(kissfft)
-add_subdirectory(freesurround EXCLUDE_FROM_ALL)
-disable_compiler_warnings_for_target(freesurround)
 
 if(ENABLE_OPENGL)
   add_subdirectory(glad EXCLUDE_FROM_ALL)
diff --git a/dep/freesurround/CMakeLists.txt b/dep/freesurround/CMakeLists.txt
deleted file mode 100644
index 88bfde90a..000000000
--- a/dep/freesurround/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-set(SRCS
-  include/freesurround_decoder.h
-  src/channelmaps.cpp
-  src/freesurround_decoder.cpp
-)
-
-add_library(freesurround ${SRCS})
-target_include_directories(freesurround PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/src")
-target_include_directories(freesurround INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
-target_link_libraries(freesurround PUBLIC kissfft)
diff --git a/dep/freesurround/GPL.txt b/dep/freesurround/GPL.txt
deleted file mode 100644
index d511905c1..000000000
--- a/dep/freesurround/GPL.txt
+++ /dev/null
@@ -1,339 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    
-    Copyright (C)   
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  , 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/dep/freesurround/freesurround.vcxproj b/dep/freesurround/freesurround.vcxproj
deleted file mode 100644
index 6558dfbc3..000000000
--- a/dep/freesurround/freesurround.vcxproj
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-  
-  
-    {1B0366E5-6F82-47B4-9FDD-D699C86AA077}
-  
-  
-    
-    
-  
-  
-    
-  
-  
-    
-      {a81d3f54-c58a-4b2d-8076-d4e483db2e65}
-    
-  
-  
-  
-    
-      $(ProjectDir)include;$(ProjectDir)src;$(ProjectDir)..\kissfft\include;%(AdditionalIncludeDirectories)
-    
-  
-  
-
\ No newline at end of file
diff --git a/dep/freesurround/freesurround.vcxproj.filters b/dep/freesurround/freesurround.vcxproj.filters
deleted file mode 100644
index ace857d20..000000000
--- a/dep/freesurround/freesurround.vcxproj.filters
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-  
-    
-    
-  
-  
-    
-  
-
\ No newline at end of file
diff --git a/dep/freesurround/include/freesurround_decoder.h b/dep/freesurround/include/freesurround_decoder.h
deleted file mode 100644
index c83dd2aca..000000000
--- a/dep/freesurround/include/freesurround_decoder.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// SPDX-FileCopyrightText: 2007-2010 Christian Kothe, 2024 Connor McLaughlin 
-// SPDX-License-Identifier: GPL-2.0+
-
-#pragma once
-
-#include "kiss_fftr.h"
-
-#include 
-#include 
-#include 
-#include 
-#include 
-
-/**
- * The FreeSurround decoder.
- */
-class FreeSurroundDecoder
-{
-public:
-  /**
-   * The supported output channel setups.
-   * A channel setup is defined by the set of channels that are present. Here is a graphic
-   * of the cs_5point1 setup: http://en.wikipedia.org/wiki/File:5_1_channels_(surround_sound)_label.svg
-   */
-  enum class ChannelSetup
-  {
-    Stereo,
-    Surround41,
-    Surround51,
-    Surround71,
-    Legacy, // same channels as cs_5point1 but different upmixing transform; does not support the focus control
-    MaxCount
-  };
-
-  static constexpr int grid_res = 21; // resolution of the lookup grid
-  using LUT = const float (*)[grid_res];
-
-  /**
-   * Create an instance of the decoder.
-   * @param setup The output channel setup -- determines the number of output channels
-   *			   and their place in the sound field.
-   * @param blocksize Granularity at which data is processed by the decode() function.
-   *				   Must be a power of two and should correspond to ca. 10ms worth of single-channel
-   *				   samples (default is 4096 for 44.1Khz data). Do not make it shorter or longer
-   *				   than 5ms to 20ms since the granularity at which locations are decoded
-   *				   changes with this.
-   */
-  FreeSurroundDecoder(ChannelSetup setup = ChannelSetup::Surround51, unsigned blocksize = 4096);
-  ~FreeSurroundDecoder();
-
-  /**
-   * Decode a chunk of stereo sound. The output is delayed by half of the blocksize.
-   * This function is the only one needed for straightforward decoding.
-   * @param input Contains exactly blocksize (multiplexed) stereo samples, i.e. 2*blocksize numbers.
-   * @return A pointer to an internal buffer of exactly blocksize (multiplexed) multichannel samples.
-   *		  The actual number of values depends on the number of output channels in the chosen
-   *		  channel setup.
-   */
-  float* Decode(float* input);
-
-  /**
-   * Flush the internal buffer.
-   */
-  void Flush();
-
-  // --- soundfield transformations
-  // These functions allow to set up geometric transformations of the sound field after it has been decoded.
-  // The sound field is best pictured as a 2-dimensional square with the listener in its
-  // center which can be shifted or stretched in various ways before it is sent to the
-  // speakers. The order in which these transformations are applied is as listed below.
-
-  /**
-   * Allows to wrap the soundfield around the listener in a circular manner.
-   * Determines the angle of the frontal sound stage relative to the listener, in degrees.
-   * A setting of 90° corresponds to standard surround decoding, 180° stretches the front stage from
-   * ear to ear, 270° wraps it around most of the head. The side and rear content of the sound
-   * field is compressed accordingly behind the listerer. (default: 90, range: [0°..360°])
-   */
-  void SetCircularWrap(float v);
-
-  /**
-   * Allows to shift the soundfield forward or backward.
-   * Value range: [-1.0..+1.0]. 0 is no offset, positive values move the sound
-   * forward, negative values move it backwards. (default: 0)
-   */
-  void SetShift(float v);
-
-  /**
-   * Allows to scale the soundfield backwards.
-   * Value range: [0.0..+5.0] -- 0 is all compressed to the front, 1 is no change, 5 is scaled 5x backwards (default: 1)
-   */
-  void SetDepth(float v);
-
-  /**
-   * Allows to control the localization (i.e., focality) of sources.
-   * Value range: [-1.0..+1.0] -- 0 means unchanged, positive means more localized, negative means more ambient
-   * (default: 0)
-   */
-  void SetFocus(float v);
-
-  // --- rendering parameters
-  // These parameters control how the sound field is mapped onto speakers.
-
-  /**
-   * Set the presence of the front center channel(s).
-   * Value range: [0.0..1.0] -- fully present at 1.0, fully replaced by left/right at 0.0 (default: 1).
-   * The default of 1.0 results in spec-conformant decoding ("movie mode") while a value of 0.7 is
-   * better suited for music reproduction (which is usually mixed without a center channel).
-   */
-  void SetCenterImage(float v);
-
-  /**
-   * Set the front stereo separation.
-   * Value range: [0.0..inf] -- 1.0 is default, 0.0 is mono.
-   */
-  void SetFrontSeparation(float v);
-
-  /**
-   * Set the rear stereo separation.
-   * Value range: [0.0..inf] -- 1.0 is default, 0.0 is mono.
-   */
-  void SetRearSeparation(float v);
-
-  // --- bass redirection (to LFE)
-
-  /**
-   * Enable/disable LFE channel (default: false = disabled)
-   */
-  void SetBassRedirection(bool v);
-
-  /**
-   * Set the lower end of the transition band, in Hz/Nyquist (default: 40/22050).
-   */
-  void SetLowCutoff(float v);
-
-  /**
-   * Set the upper end of the transition band, in Hz/Nyquist (default: 90/22050).
-   */
-  void SetHighCutoff(float v);
-
-  // --- info
-
-  /**
-   * Number of samples currently held in the buffer.
-   */
-  unsigned GetSamplesBuffered();
-
-private:
-  using cplx = std::complex;
-
-  struct ChannelMap
-  {
-    std::span luts;
-    const float* xsf;
-  };
-
-  static const std::array(ChannelSetup::MaxCount)> s_channel_maps;
-
-  void BufferedDecode(float* input);
-
-  // get the index (and fractional offset!) in a piecewise-linear channel allocation grid
-  static int MapToGrid(double& x);
-
-  // constants
-  const ChannelMap& cmap; // the channel setup
-  unsigned N, C;          // number of samples per input/output block, number of output channels
-
-  // parameters
-  float circular_wrap;    // angle of the front soundstage around the listener (90°=default)
-  float shift;            // forward/backward offset of the soundstage
-  float depth;            // backward extension of the soundstage
-  float focus;            // localization of the sound events
-  float center_image;     // presence of the center speaker
-  float front_separation; // front stereo separation
-  float rear_separation;  // rear stereo separation
-  float lo_cut, hi_cut;   // LFE cutoff frequencies
-  bool use_lfe;           // whether to use the LFE channel
-
-  // FFT data structures
-  std::vector lt, rt, dst; // left total, right total (source arrays), time-domain destination buffer array
-  std::vector lf, rf;        // left total / right total in frequency domain
-  kiss_fftr_cfg forward = nullptr;
-  kiss_fftr_cfg inverse = nullptr; // FFT buffers
-
-  // buffers
-  bool buffer_empty = true;              // whether the buffer is currently empty or dirty
-  std::vector inbuf;              // stereo input buffer (multiplexed)
-  std::vector outbuf;             // multichannel output buffer (multiplexed)
-  std::vector wnd;               // the window function, precomputed
-  std::vector> signal; // the signal to be constructed in every channel, in the frequency domain
-};
diff --git a/dep/freesurround/src/channelmaps.cpp b/dep/freesurround/src/channelmaps.cpp
deleted file mode 100644
index d6d818611..000000000
--- a/dep/freesurround/src/channelmaps.cpp
+++ /dev/null
@@ -1,612 +0,0 @@
-// SPDX-FileCopyrightText: 2007-2010 Christian Kothe, 2024 Connor McLaughlin 
-// SPDX-License-Identifier: GPL-2.0+
-
-#include "freesurround_decoder.h"
-
-// clang-format off
-// static constexpr const float map_stereo_ang[] = {-27,27};
-static constexpr const float map_stereo_xsf[] = {-1,1};
-// static constexpr const float map_stereo_ysf[] = {1,1};
-// static constexpr const channel_id map_stereo_id[] = {ci_front_left,ci_front_right,ci_lfe};
-
-static constexpr const float map_stereo_lf[21][21] = {
-   {0.89443f,0.88524f,0.87458f,0.86193f,0.84742f,0.83047f,0.81079f,0.78857f,0.76362f,0.73631f,0.70763f,0.67665f,0.64566f,0.61552f,0.58534f,0.55766f,0.53151f,0.50762f,0.48547f,0.46573f,0.44721f},
-   {0.89755f,0.87472f,0.86612f,0.85527f,0.84283f,0.82769f,0.80772f,0.78219f,0.75429f,0.72489f,0.69458f,0.66356f,0.63344f,0.60389f,0.57501f,0.54892f,0.52695f,0.50759f,0.49065f,0.47592f,0.44112f},
-   {0.90095f,0.88263f,0.86463f,0.85404f,0.84112f,0.81939f,0.79647f,0.77027f,0.74204f,0.71371f,0.68556f,0.65692f,0.62867f,0.60011f,0.57242f,0.54621f,0.52095f,0.50185f,0.48478f,0.46223f,0.4341f},
-   {0.90493f,0.89124f,0.87451f,0.85436f,0.83602f,0.81484f,0.78982f,0.7639f,0.73649f,0.708f,0.67884f,0.64889f,0.61965f,0.5909f,0.56273f,0.53649f,0.51235f,0.49068f,0.46842f,0.44689f,0.42579f},
-   {0.90935f,0.89967f,0.88515f,0.86118f,0.83546f,0.81421f,0.78928f,0.76394f,0.73562f,0.70473f,0.67234f,0.63865f,0.60548f,0.57409f,0.5446f,0.51768f,0.49394f,0.47308f,0.45005f,0.43044f,0.41628f},
-   {0.91439f,0.90835f,0.8916f,0.87077f,0.84576f,0.81654f,0.79414f,0.76796f,0.738f,0.70338f,0.66454f,0.62424f,0.58439f,0.54783f,0.51607f,0.48945f,0.46806f,0.44967f,0.43169f,0.41295f,0.40509f},
-   {0.91999f,0.91639f,0.90136f,0.88119f,0.85747f,0.82956f,0.79891f,0.77322f,0.74276f,0.70354f,0.65538f,0.60316f,0.55904f,0.52739f,0.50105f,0.46894f,0.43968f,0.41993f,0.40718f,0.39424f,0.39222f},
-   {0.92644f,0.9241f,0.9116f,0.89398f,0.87092f,0.84203f,0.80896f,0.77654f,0.74815f,0.70562f,0.64332f,0.58646f,0.55102f,0.52708f,0.49359f,0.45559f,0.41942f,0.38954f,0.37761f,0.37267f,0.37675f},
-   {0.93328f,0.93254f,0.92229f,0.90504f,0.88134f,0.85208f,0.81768f,0.7839f,0.74647f,0.70855f,0.63549f,0.58487f,0.56076f,0.52616f,0.49005f,0.44864f,0.40794f,0.36999f,0.34436f,0.34665f,0.35949f},
-   {0.94079f,0.94125f,0.93189f,0.91311f,0.88749f,0.85631f,0.8194f,0.78057f,0.74338f,0.70163f,0.63671f,0.60162f,0.56723f,0.53186f,0.49174f,0.44781f,0.40347f,0.35901f,0.32088f,0.31729f,0.33938f},
-   {0.94868f,0.94932f,0.94007f,0.9189f,0.88975f,0.85124f,0.80805f,0.75887f,0.71167f,0.67363f,0.64218f,0.61199f,0.5782f,0.54f,0.49837f,0.4526f,0.40118f,0.3514f,0.3043f,0.28639f,0.31623f},
-   {0.95692f,0.95638f,0.94428f,0.91841f,0.8832f,0.83951f,0.7853f,0.73414f,0.69534f,0.66315f,0.63602f,0.61218f,0.58072f,0.54574f,0.50443f,0.45716f,0.40639f,0.35175f,0.29649f,0.26018f,0.29081f},
-   {0.96498f,0.96276f,0.94676f,0.91627f,0.8745f,0.82172f,0.76172f,0.71817f,0.68426f,0.66051f,0.62994f,0.60192f,0.58139f,0.54844f,0.5103f,0.46277f,0.40965f,0.35109f,0.28981f,0.23919f,0.26285f},
-   {0.97256f,0.96914f,0.94756f,0.91234f,0.86412f,0.80293f,0.74426f,0.70593f,0.68146f,0.65506f,0.62468f,0.59559f,0.57167f,0.55047f,0.51487f,0.46757f,0.41278f,0.35109f,0.2847f,0.21785f,0.23325f},
-   {0.97977f,0.97551f,0.94873f,0.90549f,0.85129f,0.78757f,0.73384f,0.70417f,0.67727f,0.64923f,0.62014f,0.59112f,0.56478f,0.54094f,0.51536f,0.47061f,0.4185f,0.35479f,0.27753f,0.19394f,0.20077f},
-   {0.9859f,0.97906f,0.94933f,0.90364f,0.84461f,0.7748f,0.73864f,0.70505f,0.6742f,0.64447f,0.61554f,0.5866f,0.55834f,0.53048f,0.50205f,0.47467f,0.41886f,0.35115f,0.27107f,0.18027f,0.16808f},
-   {0.99106f,0.97904f,0.95594f,0.90263f,0.84046f,0.79665f,0.74764f,0.70961f,0.67426f,0.64169f,0.61091f,0.58092f,0.55049f,0.51961f,0.4893f,0.45375f,0.41836f,0.34667f,0.24954f,0.17965f,0.13422f},
-   {0.99504f,0.97686f,0.94808f,0.90616f,0.87005f,0.82768f,0.77496f,0.72517f,0.68125f,0.64279f,0.60765f,0.5735f,0.53901f,0.50302f,0.46667f,0.42437f,0.38174f,0.33637f,0.26284f,0.18498f,0.10039f},
-   {0.99787f,0.97282f,0.93896f,0.92728f,0.91154f,0.86712f,0.82157f,0.76586f,0.70571f,0.65384f,0.60893f,0.56563f,0.52269f,0.47746f,0.42876f,0.38009f,0.31978f,0.29601f,0.27766f,0.19432f,0.066244f},
-   {0.99945f,0.96755f,0.9602f,0.94951f,0.93442f,0.91368f,0.87956f,0.82681f,0.76608f,0.70193f,0.63578f,0.56816f,0.50585f,0.44097f,0.37308f,0.31653f,0.27698f,0.24634f,0.22321f,0.20651f,0.033221f},
-   {1.000000f,0.99854f,0.99377f,0.9845f,0.96987f,0.94832f,0.91914f,0.87965f,0.83195f,0.77384f,0.70711f,0.63203f,0.55339f,0.47409f,0.39234f,0.31565f,0.24192f,0.17365f,0.10973f,0.052336f,7.8496e-017f}};
-
-static constexpr const float map_stereo_rf[21][21] = {
-   {0.44721f,0.46513f,0.48487f,0.50702f,0.53092f,0.55707f,0.58534f,0.61495f,0.64566f,0.67665f,0.70658f,0.73631f,0.76362f,0.78812f,0.81079f,0.83007f,0.84705f,0.86158f,0.87425f,0.88493f,0.89443f},
-   {0.44091f,0.47587f,0.49021f,0.50752f,0.52648f,0.54843f,0.57451f,0.6034f,0.63295f,0.66338f,0.69439f,0.72464f,0.75386f,0.78179f,0.80734f,0.82734f,0.84251f,0.85523f,0.86585f,0.87468f,0.89745f},
-   {0.43392f,0.46211f,0.48471f,0.50144f,0.52081f,0.54578f,0.57199f,0.59968f,0.62825f,0.65666f,0.68541f,0.71353f,0.74165f,0.76989f,0.79612f,0.81907f,0.84102f,0.85378f,0.86458f,0.88258f,0.90087f},
-   {0.42556f,0.4465f,0.46827f,0.49061f,0.51198f,0.53606f,0.56263f,0.59061f,0.61925f,0.64863f,0.67871f,0.70782f,0.73615f,0.76373f,0.78979f,0.81451f,0.83582f,0.85431f,0.87445f,0.89102f,0.90482f},
-   {0.41603f,0.43027f,0.44962f,0.47284f,0.49384f,0.51738f,0.54427f,0.57368f,0.6051f,0.63829f,0.67221f,0.7044f,0.7353f,0.76362f,0.78911f,0.81401f,0.83539f,0.86106f,0.88491f,0.8996f,0.90924f},
-   {0.40482f,0.41257f,0.43125f,0.44919f,0.46765f,0.48935f,0.51575f,0.54739f,0.58411f,0.62399f,0.66441f,0.70314f,0.73778f,0.76766f,0.79398f,0.81646f,0.84558f,0.8705f,0.89137f,0.90817f,0.91428f},
-   {0.39194f,0.39388f,0.40671f,0.41966f,0.43944f,0.46877f,0.50098f,0.52725f,0.55873f,0.60277f,0.65524f,0.70322f,0.74248f,0.77305f,0.79885f,0.8294f,0.85732f,0.88113f,0.90115f,0.91624f,0.91987f},
-   {0.37644f,0.37227f,0.37711f,0.38933f,0.41907f,0.45539f,0.49353f,0.52703f,0.55093f,0.58615f,0.64317f,0.70533f,0.74803f,0.77648f,0.8089f,0.84182f,0.8707f,0.89389f,0.9114f,0.92394f,0.92631f},
-   {0.35915f,0.34622f,0.34393f,0.36975f,0.40779f,0.44861f,0.48988f,0.52622f,0.56072f,0.58475f,0.63541f,0.70834f,0.74642f,0.78388f,0.81756f,0.85205f,0.88119f,0.90487f,0.92211f,0.93239f,0.93315f},
-   {0.339f,0.31682f,0.32073f,0.35905f,0.40342f,0.44785f,0.4917f,0.53187f,0.56716f,0.60159f,0.63667f,0.70158f,0.7434f,0.78057f,0.81937f,0.85635f,0.88742f,0.91312f,0.93183f,0.94111f,0.94065f},
-   {0.31623f,0.28631f,0.30427f,0.3514f,0.40119f,0.45261f,0.49838f,0.54f,0.5782f,0.61199f,0.64217f,0.67362f,0.71167f,0.75889f,0.80807f,0.85125f,0.88977f,0.91889f,0.94006f,0.9493f,0.94868f},
-   {0.29034f,0.25984f,0.29645f,0.35181f,0.40636f,0.45739f,0.5045f,0.54571f,0.58075f,0.61218f,0.63603f,0.66314f,0.69534f,0.73428f,0.78552f,0.83978f,0.8833f,0.91845f,0.94425f,0.95628f,0.95678f},
-   {0.26232f,0.23897f,0.28988f,0.35116f,0.40968f,0.46304f,0.51041f,0.54855f,0.58139f,0.60193f,0.62996f,0.66062f,0.68426f,0.71834f,0.76187f,0.82209f,0.87469f,0.91637f,0.94679f,0.96269f,0.96484f},
-   {0.23266f,0.21746f,0.28484f,0.3513f,0.41299f,0.46772f,0.51511f,0.55049f,0.57186f,0.59573f,0.6247f,0.65513f,0.68168f,0.70596f,0.74457f,0.80329f,0.86436f,0.91252f,0.94764f,0.96907f,0.97242f},
-   {0.20011f,0.19377f,0.27774f,0.3551f,0.41877f,0.47085f,0.51539f,0.54113f,0.56487f,0.59129f,0.62017f,0.64943f,0.67749f,0.70442f,0.73389f,0.78798f,0.85164f,0.90576f,0.94884f,0.97545f,0.97964f},
-   {0.16735f,0.18021f,0.2713f,0.35149f,0.41919f,0.47472f,0.50234f,0.53073f,0.5586f,0.58686f,0.61556f,0.64474f,0.6745f,0.70534f,0.73902f,0.77487f,0.84502f,0.90392f,0.94947f,0.97903f,0.98577f},
-   {0.13341f,0.17975f,0.24983f,0.34704f,0.41842f,0.45412f,0.48964f,0.5198f,0.5508f,0.58122f,0.61094f,0.6419f,0.6745f,0.71002f,0.74813f,0.79718f,0.84054f,0.90295f,0.9561f,0.97906f,0.99095f},
-   {0.099504f,0.18519f,0.2632f,0.33642f,0.38219f,0.42465f,0.46712f,0.50346f,0.53941f,0.57392f,0.60769f,0.64324f,0.68168f,0.72574f,0.77558f,0.82818f,0.87048f,0.90621f,0.94829f,0.97694f,0.99495f},
-   {0.065281f,0.19467f,0.27771f,0.29655f,0.32038f,0.38061f,0.42917f,0.47786f,0.52322f,0.56623f,0.609f,0.6545f,0.70642f,0.76654f,0.82216f,0.8676f,0.91195f,0.92761f,0.93899f,0.97296f,0.9978f},
-   {0.032183f,0.20655f,0.22377f,0.24703f,0.27778f,0.31734f,0.37412f,0.44199f,0.50657f,0.5692f,0.63593f,0.70292f,0.7669f,0.82752f,0.88018f,0.91412f,0.93482f,0.94983f,0.96045f,0.96758f,0.99942f},
-   {7.8496e-017f,0.054079f,0.11147f,0.17537f,0.24362f,0.3173f,0.39394f,0.47562f,0.55484f,0.63338f,0.70711f,0.77494f,0.83292f,0.88048f,0.91982f,0.94888f,0.9703f,0.98481f,0.99396f,0.99863f,1.000000f}};
-
-// static constexpr const float map_4point1_ang[] = {-27,27,-105,105};
-static constexpr const float map_4point1_xsf[] = {-1,1,-1,1};
-// static constexpr const float map_4point1_ysf[] = {1,1,-1,-1};
-// static constexpr const channel_id map_4point1_id[] = {ci_front_left,ci_front_right,ci_back_left,ci_back_right,ci_lfe};
-
-static constexpr const float map_4point1_lf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.054079f,0.13605f,0.11031f,0.083738f,0.058746f,0.03616f,0.022585f,0.018356f,0.012179f,0.0043961f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.11103f,0.16562f,0.18635f,0.15778f,0.12791f,0.12403f,0.10709f,0.090176f,0.070512f,0.049741f,0.027549f,0.011727f,0.0013628f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.17535f,0.20208f,0.21809f,0.22862f,0.21842f,0.20197f,0.18341f,0.15706f,0.13031f,0.10103f,0.068601f,0.041975f,0.018696f,0.0039144f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24362f,0.24543f,0.25563f,0.27972f,0.28786f,0.26979f,0.24789f,0.21805f,0.18569f,0.14921f,0.10871f,0.073541f,0.041097f,0.017152f,0.0038597f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.3173f,0.29703f,0.31848f,0.33006f,0.33185f,0.32708f,0.30247f,0.27305f,0.23691f,0.19431f,0.14844f,0.10174f,0.061737f,0.03134f,0.011327f,0.0027159f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.39394f,0.36121f,0.3753f,0.38051f,0.37698f,0.36547f,0.34958f,0.3221f,0.28469f,0.23727f,0.18262f,0.12638f,0.083376f,0.055926f,0.035607f,0.011267f,0.0038302f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.47562f,0.43164f,0.43211f,0.42875f,0.41905f,0.40425f,0.38486f,0.3601f,0.3262f,0.27779f,0.21259f,0.15374f,0.11534f,0.092532f,0.055768f,0.031114f,0.016973f,0.0038919f,0.000000f,0.000000f,0.000000f},
-   {0.55484f,0.49969f,0.48676f,0.47535f,0.45999f,0.4406f,0.41747f,0.39084f,0.3589f,0.31565f,0.24497f,0.18988f,0.16127f,0.11527f,0.083186f,0.061436f,0.040831f,0.018492f,0.0013084f,0.000000f,0.000000f},
-   {0.63203f,0.56664f,0.53922f,0.51913f,0.49762f,0.47305f,0.44521f,0.41467f,0.38246f,0.34456f,0.28169f,0.24152f,0.1898f,0.15351f,0.12607f,0.10138f,0.073199f,0.041753f,0.011636f,0.000000f,0.000000f},
-   {0.70711f,0.63601f,0.5915f,0.56154f,0.5324f,0.49872f,0.46317f,0.42387f,0.38431f,0.34937f,0.31849f,0.28164f,0.24488f,0.21244f,0.18245f,0.14826f,0.10854f,0.068473f,0.027433f,0.000000f,0.000000f},
-   {0.77384f,0.7028f,0.64182f,0.59999f,0.5611f,0.52035f,0.47318f,0.42773f,0.39037f,0.35676f,0.34937f,0.34453f,0.31539f,0.27747f,0.23686f,0.19392f,0.14881f,0.1006f,0.049384f,0.0043772f,0.000000f},
-   {0.83292f,0.76642f,0.69548f,0.63988f,0.59007f,0.53795f,0.48146f,0.43778f,0.40135f,0.39034f,0.38431f,0.3824f,0.35884f,0.32588f,0.28429f,0.2365f,0.18525f,0.12989f,0.070085f,0.011962f,0.000000f},
-   {0.88048f,0.82659f,0.75196f,0.68173f,0.61966f,0.55557f,0.49389f,0.45152f,0.43774f,0.42776f,0.42387f,0.41451f,0.39065f,0.36002f,0.32174f,0.27262f,0.21753f,0.15652f,0.089694f,0.018075f,0.000000f},
-   {0.91982f,0.87898f,0.80369f,0.72266f,0.64727f,0.57793f,0.51602f,0.49394f,0.48142f,0.47314f,0.46315f,0.44506f,0.41722f,0.38449f,0.34948f,0.30197f,0.24734f,0.18313f,0.10655f,0.022264f,0.000000f},
-   {0.94888f,0.91176f,0.84521f,0.76937f,0.68766f,0.60203f,0.57788f,0.55561f,0.53794f,0.52028f,0.49868f,0.47276f,0.44023f,0.40381f,0.36503f,0.32695f,0.26927f,0.20135f,0.12342f,0.035717f,0.000000f},
-   {0.9703f,0.92966f,0.89031f,0.80673f,0.72356f,0.6876f,0.64713f,0.61943f,0.5899f,0.56088f,0.53232f,0.49722f,0.45953f,0.41857f,0.37646f,0.33123f,0.28771f,0.21775f,0.12737f,0.058204f,0.000000f},
-   {0.98481f,0.94077f,0.8973f,0.84179f,0.80663f,0.76916f,0.72238f,0.68134f,0.63953f,0.59955f,0.56144f,0.51865f,0.47475f,0.42817f,0.38012f,0.32941f,0.27908f,0.22844f,0.15705f,0.083257f,0.000000f},
-   {0.99396f,0.94647f,0.89932f,0.89719f,0.89008f,0.84488f,0.80323f,0.75136f,0.69482f,0.64113f,0.59135f,0.53856f,0.48604f,0.43137f,0.37452f,0.3177f,0.25473f,0.21738f,0.18614f,0.10958f,0.000000f},
-   {0.99855f,0.94808f,0.94637f,0.94057f,0.92934f,0.91132f,0.87838f,0.82589f,0.76558f,0.70182f,0.63578f,0.56555f,0.49868f,0.43048f,0.35999f,0.29603f,0.24451f,0.20108f,0.16489f,0.1358f,0.000000f},
-   {1.000000f,0.99854f,0.99377f,0.9845f,0.96987f,0.94832f,0.91914f,0.87965f,0.83195f,0.77384f,0.70711f,0.63203f,0.55339f,0.47409f,0.39234f,0.31565f,0.24192f,0.17365f,0.10973f,0.052336f,0.000000f}};
-
-static constexpr const float map_4point1_rf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0043772f,0.011962f,0.018075f,0.022264f,0.035717f,0.058204f,0.083257f,0.10958f,0.13592f,0.052336f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013084f,0.011636f,0.027472f,0.049384f,0.070085f,0.089694f,0.10655f,0.12342f,0.12737f,0.15705f,0.18623f,0.16489f,0.10973f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0038919f,0.018492f,0.041753f,0.068513f,0.1006f,0.12983f,0.15652f,0.18313f,0.20135f,0.21775f,0.22851f,0.21738f,0.20108f,0.17363f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0038302f,0.016973f,0.040831f,0.073199f,0.10859f,0.14876f,0.1852f,0.21753f,0.24734f,0.26927f,0.28776f,0.27908f,0.25473f,0.24451f,0.24192f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.002725f,0.011267f,0.031114f,0.061436f,0.10138f,0.14831f,0.19392f,0.2365f,0.27257f,0.30197f,0.327f,0.33123f,0.32934f,0.31761f,0.29589f,0.31565f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0039191f,0.011379f,0.035584f,0.055812f,0.083146f,0.12603f,0.18248f,0.23686f,0.28429f,0.32174f,0.34952f,0.36503f,0.37646f,0.38012f,0.37444f,0.35999f,0.39234f},
-   {0.000000f,0.000000f,0.000000f,0.0039822f,0.017152f,0.03134f,0.055926f,0.09249f,0.11527f,0.15351f,0.21247f,0.27743f,0.32588f,0.36005f,0.38449f,0.40381f,0.41852f,0.42817f,0.43128f,0.43048f,0.47409f},
-   {0.000000f,0.000000f,0.0013628f,0.018696f,0.041097f,0.061737f,0.083376f,0.11538f,0.16121f,0.18976f,0.24491f,0.31539f,0.35887f,0.39065f,0.41717f,0.44023f,0.45953f,0.47475f,0.48597f,0.49857f,0.55339f},
-   {0.000000f,0.000000f,0.011806f,0.042039f,0.073541f,0.10174f,0.12638f,0.15373f,0.18988f,0.24145f,0.28167f,0.34454f,0.38236f,0.41451f,0.445f,0.47276f,0.49722f,0.51865f,0.53856f,0.56555f,0.63203f},
-   {0.000000f,8.5322e-019f,0.027472f,0.068532f,0.10862f,0.14835f,0.18253f,0.21252f,0.24491f,0.28164f,0.31849f,0.34939f,0.38433f,0.42389f,0.46318f,0.49872f,0.53237f,0.56148f,0.59141f,0.63586f,0.70711f},
-   {0.000000f,0.0045097f,0.049741f,0.10103f,0.14921f,0.19436f,0.23726f,0.27779f,0.31563f,0.34453f,0.34938f,0.35677f,0.39034f,0.42771f,0.47314f,0.52028f,0.56081f,0.59955f,0.64113f,0.70182f,0.77384f},
-   {0.000000f,0.012179f,0.070512f,0.13031f,0.18569f,0.23696f,0.28468f,0.3262f,0.35886f,0.38246f,0.38432f,0.39033f,0.40136f,0.43778f,0.48142f,0.53794f,0.58984f,0.63945f,0.69482f,0.76558f,0.83195f},
-   {0.000000f,0.018356f,0.090176f,0.15706f,0.21803f,0.27305f,0.32214f,0.36006f,0.39088f,0.41462f,0.42388f,0.42773f,0.43778f,0.45153f,0.49394f,0.55555f,0.61943f,0.68134f,0.75136f,0.82586f,0.87965f},
-   {0.000000f,0.022585f,0.10709f,0.1837f,0.24789f,0.30247f,0.34954f,0.38486f,0.41747f,0.44521f,0.46317f,0.47313f,0.48141f,0.49393f,0.51604f,0.57793f,0.64713f,0.7226f,0.80323f,0.87839f,0.91914f},
-   {0.000000f,0.03616f,0.12403f,0.20197f,0.26986f,0.32703f,0.36552f,0.40423f,0.4406f,0.47305f,0.49872f,0.5204f,0.538f,0.55557f,0.57793f,0.60205f,0.6876f,0.76916f,0.84488f,0.91132f,0.94832f},
-   {0.000000f,0.058746f,0.12802f,0.21842f,0.2878f,0.33185f,0.37704f,0.41905f,0.45997f,0.4976f,0.53237f,0.5611f,0.59007f,0.61958f,0.64727f,0.6877f,0.7236f,0.80663f,0.89008f,0.92934f,0.96987f},
-   {0.000000f,0.083896f,0.15778f,0.22854f,0.27982f,0.33006f,0.38081f,0.42882f,0.47533f,0.51919f,0.56149f,0.59999f,0.63988f,0.68173f,0.72294f,0.76935f,0.80673f,0.84179f,0.89719f,0.94057f,0.9845f},
-   {0.000000f,0.11031f,0.18625f,0.21822f,0.25563f,0.31848f,0.3753f,0.43211f,0.48676f,0.5393f,0.59144f,0.64182f,0.69546f,0.75192f,0.80366f,0.84518f,0.89031f,0.8973f,0.8993f,0.94637f,0.99377f},
-   {0.000000f,0.13592f,0.16581f,0.20208f,0.24559f,0.29703f,0.36121f,0.43162f,0.49969f,0.56664f,0.63593f,0.7028f,0.76638f,0.82659f,0.87898f,0.91171f,0.92966f,0.94077f,0.94647f,0.94806f,0.99846f},
-   {7.8496e-017f,0.054079f,0.11147f,0.17537f,0.24362f,0.3173f,0.39394f,0.47562f,0.55484f,0.63338f,0.70711f,0.77494f,0.83292f,0.88048f,0.91982f,0.94888f,0.9703f,0.98481f,0.99396f,0.99863f,1.000000f}};
-
-static constexpr const float map_4point1_ls[21][21] = {
-   {1.000000f,0.99863f,0.99396f,0.98481f,0.9703f,0.94888f,0.91914f,0.88048f,0.83195f,0.77384f,0.70834f,0.63338f,0.55484f,0.47562f,0.39394f,0.3173f,0.24362f,0.17537f,0.11147f,0.054079f,-7.8496e-017f},
-   {0.99854f,0.94804f,0.94647f,0.94043f,0.92966f,0.91177f,0.87898f,0.82659f,0.76643f,0.70248f,0.63602f,0.56664f,0.49969f,0.43164f,0.36121f,0.29703f,0.24559f,0.20208f,0.16581f,0.13592f,0.000000f},
-   {0.99373f,0.94619f,0.89929f,0.8973f,0.89f,0.84522f,0.80369f,0.75196f,0.69549f,0.64182f,0.59149f,0.53909f,0.48676f,0.43211f,0.3753f,0.31848f,0.25563f,0.21817f,0.18628f,0.11031f,0.000000f},
-   {0.98443f,0.94057f,0.89693f,0.84178f,0.80673f,0.76938f,0.72295f,0.68173f,0.63988f,0.59999f,0.56152f,0.51902f,0.47535f,0.42864f,0.38061f,0.33006f,0.27965f,0.22857f,0.15778f,0.083896f,0.000000f},
-   {0.96987f,0.92924f,0.89008f,0.8064f,0.72353f,0.68753f,0.64727f,0.61961f,0.59007f,0.5611f,0.53236f,0.49762f,0.45999f,0.41905f,0.37687f,0.33185f,0.28785f,0.21842f,0.12802f,0.058746f,0.000000f},
-   {0.94832f,0.91132f,0.84488f,0.76916f,0.6876f,0.60199f,0.57793f,0.55557f,0.53786f,0.52026f,0.49866f,0.47305f,0.4406f,0.40425f,0.36538f,0.32707f,0.2697f,0.20197f,0.12403f,0.03616f,0.000000f},
-   {0.91914f,0.87839f,0.80323f,0.72262f,0.64697f,0.57779f,0.51599f,0.49381f,0.48147f,0.4732f,0.46311f,0.44521f,0.41747f,0.38486f,0.34957f,0.30247f,0.24789f,0.18361f,0.10709f,0.022585f,0.000000f},
-   {0.87965f,0.82586f,0.75136f,0.68116f,0.61943f,0.55563f,0.49394f,0.45149f,0.43778f,0.42773f,0.42381f,0.41464f,0.39077f,0.36007f,0.32202f,0.27305f,0.21805f,0.15706f,0.090176f,0.018356f,0.000000f},
-   {0.83195f,0.76558f,0.69482f,0.63955f,0.58992f,0.53794f,0.48142f,0.43767f,0.40132f,0.39038f,0.38425f,0.38246f,0.35885f,0.3262f,0.2847f,0.23683f,0.18569f,0.13031f,0.070512f,0.012179f,0.000000f},
-   {0.77494f,0.70182f,0.64105f,0.59937f,0.5609f,0.52028f,0.47314f,0.42777f,0.39034f,0.35673f,0.34932f,0.34449f,0.31565f,0.27779f,0.23728f,0.19424f,0.14921f,0.10103f,0.049741f,0.0045097f,0.000000f},
-   {0.70711f,0.63577f,0.59134f,0.56143f,0.53234f,0.49869f,0.46315f,0.42387f,0.38431f,0.34937f,0.3185f,0.28163f,0.2449f,0.21252f,0.18253f,0.14834f,0.1086f,0.068513f,0.027472f,-8.5322e-019f,0.000000f},
-   {0.63338f,0.56555f,0.53856f,0.51865f,0.49722f,0.47263f,0.44507f,0.41451f,0.38241f,0.34452f,0.2816f,0.24145f,0.18988f,0.15379f,0.12638f,0.10174f,0.073541f,0.042039f,0.011806f,0.000000f,0.000000f},
-   {0.55339f,0.49871f,0.48607f,0.47475f,0.45953f,0.44013f,0.41724f,0.39065f,0.35885f,0.31539f,0.24485f,0.1898f,0.16119f,0.11535f,0.083376f,0.061737f,0.041097f,0.018696f,0.0013628f,0.000000f,0.000000f},
-   {0.47409f,0.43048f,0.43138f,0.42817f,0.41859f,0.40381f,0.38442f,0.36003f,0.32583f,0.27748f,0.21245f,0.15351f,0.11527f,0.092466f,0.055926f,0.03134f,0.017152f,0.0039822f,0.000000f,0.000000f,0.000000f},
-   {0.39234f,0.35999f,0.37455f,0.38033f,0.37646f,0.36503f,0.34948f,0.32174f,0.28429f,0.23686f,0.18246f,0.12608f,0.083197f,0.055812f,0.03557f,0.011379f,0.0039191f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.31565f,0.29607f,0.31773f,0.32943f,0.33124f,0.32696f,0.30198f,0.27263f,0.2365f,0.19392f,0.14828f,0.10138f,0.061436f,0.031114f,0.011267f,0.002725f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24192f,0.24451f,0.25473f,0.27908f,0.28772f,0.26927f,0.24734f,0.21753f,0.18526f,0.14882f,0.10856f,0.073199f,0.040831f,0.01704f,0.0038302f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.17365f,0.20108f,0.21738f,0.22846f,0.21775f,0.20135f,0.18335f,0.15652f,0.12991f,0.1006f,0.068474f,0.041753f,0.018492f,0.0038919f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.10973f,0.16489f,0.18616f,0.15705f,0.12737f,0.12342f,0.10655f,0.089694f,0.070085f,0.049384f,0.027446f,0.011636f,0.0013628f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.052332f,0.13583f,0.10958f,0.083257f,0.058204f,0.035717f,0.022438f,0.018227f,0.011962f,0.0043772f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_4point1_rs[21][21] = {
-   {-7.8496e-017f,0.052336f,0.10973f,0.17365f,0.24192f,0.31565f,0.39394f,0.47409f,0.55484f,0.63338f,0.70587f,0.77384f,0.83195f,0.87965f,0.91914f,0.94832f,0.96987f,0.9845f,0.99377f,0.99854f,1.000000f},
-   {0.000000f,0.13583f,0.16489f,0.20208f,0.24451f,0.29589f,0.35999f,0.43048f,0.49857f,0.56633f,0.63558f,0.70182f,0.76558f,0.82586f,0.87839f,0.91132f,0.92934f,0.94057f,0.94637f,0.94804f,0.99863f},
-   {0.000000f,0.11031f,0.18615f,0.21738f,0.25552f,0.31761f,0.37444f,0.43128f,0.48597f,0.53856f,0.59121f,0.64167f,0.69482f,0.75136f,0.80323f,0.84488f,0.89008f,0.89725f,0.89927f,0.94647f,0.99396f},
-   {0.000000f,0.083257f,0.15778f,0.22845f,0.27908f,0.32934f,0.38061f,0.42817f,0.47475f,0.51865f,0.56131f,0.59998f,0.63948f,0.6818f,0.72306f,0.76916f,0.80688f,0.84174f,0.8973f,0.94077f,0.98473f},
-   {0.000000f,0.058746f,0.12737f,0.2183f,0.28772f,0.33167f,0.37646f,0.41852f,0.45953f,0.49722f,0.53221f,0.56083f,0.58986f,0.61943f,0.64753f,0.6876f,0.72348f,0.80673f,0.89031f,0.92966f,0.9703f},
-   {0.000000f,0.035717f,0.12342f,0.20135f,0.26927f,0.32696f,0.36503f,0.40381f,0.44057f,0.47309f,0.49858f,0.52028f,0.53794f,0.55557f,0.57829f,0.60191f,0.688f,0.76938f,0.84522f,0.91177f,0.94888f},
-   {0.000000f,0.022264f,0.10655f,0.18361f,0.24774f,0.30233f,0.34948f,0.3848f,0.41719f,0.44502f,0.46308f,0.47314f,0.48142f,0.49394f,0.51592f,0.57793f,0.64727f,0.72306f,0.80369f,0.87898f,0.91982f},
-   {0.000000f,0.018075f,0.089694f,0.15698f,0.21753f,0.27257f,0.32174f,0.36002f,0.39065f,0.41451f,0.4238f,0.42773f,0.43804f,0.45143f,0.49424f,0.55557f,0.61961f,0.68173f,0.75196f,0.82659f,0.88048f},
-   {0.000000f,0.011962f,0.070085f,0.12983f,0.1852f,0.2365f,0.28429f,0.32614f,0.35884f,0.38237f,0.38425f,0.39034f,0.40127f,0.43778f,0.48142f,0.53827f,0.59007f,0.63988f,0.69549f,0.76643f,0.83292f},
-   {0.000000f,0.0043772f,0.049741f,0.10103f,0.14876f,0.19392f,0.23686f,0.27743f,0.31539f,0.34452f,0.34932f,0.35669f,0.39034f,0.42773f,0.47315f,0.52061f,0.5611f,0.59999f,0.64182f,0.7028f,0.77494f},
-   {0.000000f,-8.5322e-019f,0.027447f,0.068465f,0.10853f,0.14825f,0.18244f,0.21244f,0.24485f,0.28161f,0.31849f,0.34932f,0.38425f,0.42381f,0.46314f,0.49869f,0.53239f,0.56152f,0.59147f,0.63596f,0.70711f},
-   {0.000000f,0.000000f,0.011636f,0.041753f,0.073199f,0.1017f,0.12603f,0.15351f,0.18976f,0.24145f,0.28164f,0.34451f,0.38246f,0.41464f,0.44521f,0.47305f,0.49762f,0.51919f,0.5393f,0.56664f,0.63338f},
-   {0.000000f,0.000000f,0.0013084f,0.018492f,0.040831f,0.061737f,0.083146f,0.11527f,0.16121f,0.18988f,0.2449f,0.31565f,0.35887f,0.39092f,0.41747f,0.4406f,0.45999f,0.47535f,0.48676f,0.49969f,0.55484f},
-   {0.000000f,0.000000f,0.000000f,0.0038919f,0.016973f,0.031114f,0.056058f,0.092505f,0.11557f,0.15374f,0.21251f,0.27779f,0.3262f,0.36008f,0.38486f,0.40425f,0.41905f,0.42882f,0.43211f,0.43164f,0.47562f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0038302f,0.011267f,0.0356f,0.055926f,0.083376f,0.12638f,0.18252f,0.23728f,0.2847f,0.32214f,0.34955f,0.36552f,0.37704f,0.38081f,0.3753f,0.36121f,0.39394f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0027341f,0.011405f,0.03134f,0.061737f,0.10174f,0.14834f,0.19436f,0.23696f,0.27305f,0.30247f,0.32704f,0.33185f,0.33006f,0.31848f,0.29703f,0.3173f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0039191f,0.017152f,0.041097f,0.073541f,0.10862f,0.14921f,0.18569f,0.21805f,0.24789f,0.26986f,0.28782f,0.27982f,0.25563f,0.24559f,0.24362f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0039822f,0.018696f,0.042039f,0.068554f,0.10103f,0.13031f,0.15706f,0.1837f,0.20197f,0.21842f,0.22858f,0.21822f,0.20208f,0.17537f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013628f,0.011806f,0.027511f,0.049741f,0.070512f,0.090176f,0.10709f,0.12403f,0.12802f,0.15778f,0.1863f,0.16581f,0.11147f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-8.5322e-019f,0.0045097f,0.012179f,0.018356f,0.022585f,0.03616f,0.058746f,0.083896f,0.11031f,0.136f,0.054075f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-7.8496e-017f}};
-
-// static constexpr const float map_5point1_ang[] = {-27,0,27,-105,105};
-static constexpr const float map_5point1_xsf[] = {-1,0,1,-1,1};
-// static constexpr const float map_5point1_ysf[] = {1,1,1,-1,-1};
-// static constexpr const channel_id map_5point1_id[] = {ci_front_left,ci_front_center,ci_front_right,ci_back_left,ci_back_right,ci_lfe};
-
-static constexpr const float map_5point1_lf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.054079f,0.13605f,0.11031f,0.083738f,0.058746f,0.03616f,0.022585f,0.018356f,0.012179f,0.0043961f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.11103f,0.16562f,0.18635f,0.15778f,0.12791f,0.12403f,0.10709f,0.090176f,0.070512f,0.049741f,0.027549f,0.011727f,0.0013628f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.17535f,0.20208f,0.21809f,0.22862f,0.21842f,0.20197f,0.18341f,0.15706f,0.13031f,0.10103f,0.068601f,0.041975f,0.018696f,0.0039144f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24362f,0.24543f,0.25563f,0.27972f,0.28786f,0.26979f,0.24789f,0.21805f,0.18569f,0.14921f,0.10871f,0.073541f,0.041097f,0.017152f,0.0038597f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.3173f,0.29703f,0.31848f,0.33006f,0.33185f,0.32571f,0.30203f,0.27305f,0.23691f,0.19431f,0.14844f,0.10174f,0.061737f,0.03134f,0.010908f,0.0013625f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.39394f,0.36121f,0.3753f,0.38051f,0.37306f,0.35451f,0.33178f,0.30958f,0.28023f,0.23726f,0.18262f,0.12638f,0.07899f,0.043546f,0.017841f,0.00044495f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.47562f,0.43164f,0.43211f,0.42477f,0.4019f,0.37291f,0.34131f,0.31385f,0.29675f,0.2674f,0.21259f,0.14347f,0.086077f,0.046322f,0.012467f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.55484f,0.49969f,0.48539f,0.45665f,0.41889f,0.37886f,0.33895f,0.30764f,0.28138f,0.2723f,0.23279f,0.14674f,0.083778f,0.032293f,0.0048976f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.63203f,0.56664f,0.52742f,0.47709f,0.42408f,0.37424f,0.33419f,0.30176f,0.27482f,0.25011f,0.23665f,0.1471f,0.082204f,0.040759f,0.015195f,0.0028496f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.70711f,0.63601f,0.56403f,0.49301f,0.42572f,0.37154f,0.33227f,0.30051f,0.27246f,0.24769f,0.22385f,0.17996f,0.13303f,0.089089f,0.051572f,0.021112f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.77384f,0.69829f,0.59208f,0.49896f,0.42627f,0.37547f,0.33559f,0.30342f,0.27695f,0.2532f,0.24555f,0.24096f,0.202f,0.15312f,0.099312f,0.049149f,0.01419f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.83292f,0.75424f,0.62497f,0.51188f,0.43577f,0.38288f,0.34157f,0.31064f,0.28485f,0.27588f,0.27011f,0.26791f,0.24233f,0.19874f,0.14444f,0.081488f,0.031102f,0.0022352f,0.000000f,0.000000f,0.000000f},
-   {0.88048f,0.80823f,0.66178f,0.53219f,0.45043f,0.39421f,0.35046f,0.32046f,0.30985f,0.30176f,0.29791f,0.28855f,0.26277f,0.22895f,0.1783f,0.11122f,0.048526f,0.0073556f,0.000000f,0.000000f,0.000000f},
-   {0.91982f,0.8564f,0.6966f,0.55364f,0.46596f,0.41011f,0.36623f,0.3499f,0.34025f,0.33348f,0.32389f,0.30536f,0.27602f,0.24046f,0.19967f,0.13416f,0.066173f,0.014462f,0.000000f,0.000000f,0.000000f},
-   {0.94888f,0.8756f,0.72118f,0.58509f,0.49378f,0.42727f,0.40951f,0.39303f,0.37927f,0.36377f,0.34295f,0.31626f,0.28156f,0.24129f,0.19667f,0.15218f,0.075526f,0.017441f,0.000000f,0.000000f,0.000000f},
-   {0.9703f,0.87092f,0.76228f,0.60765f,0.51716f,0.48514f,0.45531f,0.43328f,0.40894f,0.38299f,0.35389f,0.31939f,0.27862f,0.23237f,0.18465f,0.12881f,0.081296f,0.019071f,0.000000f,0.000000f,0.000000f},
-   {0.98481f,0.85688f,0.73952f,0.62982f,0.5767f,0.53382f,0.4939f,0.46098f,0.42667f,0.39124f,0.35254f,0.31034f,0.26195f,0.20782f,0.15167f,0.09417f,0.04946f,0.016531f,0.000000f,0.000000f,0.000000f},
-   {0.99396f,0.83616f,0.71307f,0.68155f,0.64457f,0.57478f,0.52315f,0.47464f,0.42859f,0.38222f,0.33181f,0.27965f,0.21975f,0.15464f,0.094607f,0.047925f,0.0098814f,0.0024671f,0.000000f,0.000000f,0.000000f},
-   {0.99855f,0.81216f,0.78057f,0.73849f,0.68375f,0.61653f,0.5369f,0.46213f,0.39741f,0.33339f,0.26339f,0.19725f,0.13069f,0.067274f,0.019339f,0.0021311f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {1.000000f,0.94446f,0.8823f,0.80914f,0.72626f,0.63102f,0.52519f,0.40402f,0.27711f,0.14046f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_5point1_cf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019269f,0.00062925f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00059225f,0.001914f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0055425f,0.0155f,0.025167f,0.017695f,0.0063155f,1.0116e-005f,0.000000f,0.000000f,0.0062031f,0.017508f,0.025125f,0.015305f,0.0054168f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.0056317f,0.024256f,0.044322f,0.061583f,0.065405f,0.041656f,0.014688f,4.0817e-019f,0.014527f,0.041389f,0.065342f,0.061236f,0.044002f,0.024003f,0.005504f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.0019274f,0.02644f,0.05812f,0.08731f,0.11105f,0.11767f,0.10963f,0.061306f,0.017226f,0.061006f,0.10958f,0.11735f,0.11066f,0.086884f,0.057744f,0.026151f,0.0018503f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.016697f,0.059451f,0.104f,0.13974f,0.15702f,0.15962f,0.15223f,0.13355f,0.063692f,0.13353f,0.15211f,0.15945f,0.15675f,0.13934f,0.10352f,0.059047f,0.016456f,0.000000f,0.000000f},
-   {0.000000f,1.2068e-018f,0.038851f,0.096919f,0.15087f,0.17987f,0.18511f,0.17445f,0.15817f,0.14379f,0.13384f,0.14378f,0.15816f,0.17444f,0.18509f,0.17981f,0.15076f,0.096821f,0.038797f,0.000000f,0.000000f},
-   {0.000000f,0.0063777f,0.070344f,0.14288f,0.19068f,0.2049f,0.19453f,0.1758f,0.16036f,0.14645f,0.14681f,0.14646f,0.16036f,0.1758f,0.19453f,0.20473f,0.19031f,0.14227f,0.06984f,0.0061903f,0.000000f},
-   {0.000000f,0.017224f,0.099719f,0.18101f,0.21822f,0.2193f,0.19777f,0.17979f,0.16475f,0.16187f,0.16149f,0.16187f,0.16477f,0.1798f,0.19777f,0.21922f,0.21792f,0.18045f,0.099116f,0.016918f,0.000000f},
-   {0.000000f,0.02596f,0.12753f,0.21148f,0.23925f,0.22819f,0.20284f,0.18535f,0.18085f,0.17814f,0.17812f,0.17814f,0.18084f,0.18536f,0.20284f,0.22818f,0.23901f,0.21095f,0.12685f,0.025562f,0.000000f},
-   {0.000000f,0.03194f,0.15144f,0.23904f,0.2564f,0.23733f,0.21182f,0.20371f,0.19964f,0.19751f,0.19694f,0.1975f,0.19963f,0.20369f,0.21184f,0.23733f,0.25621f,0.23853f,0.15068f,0.031485f,0.000000f},
-   {0.000000f,0.051138f,0.17541f,0.26062f,0.27419f,0.24713f,0.23812f,0.22985f,0.2244f,0.22133f,0.22022f,0.22132f,0.22439f,0.22984f,0.2381f,0.24715f,0.274f,0.26009f,0.17455f,0.050511f,0.000000f},
-   {0.000000f,0.08308f,0.18105f,0.28155f,0.29188f,0.28632f,0.27128f,0.26327f,0.25585f,0.25151f,0.25234f,0.2515f,0.25584f,0.26325f,0.27127f,0.28627f,0.29189f,0.28098f,0.18013f,0.082312f,0.000000f},
-   {0.000000f,0.11865f,0.22314f,0.29977f,0.32517f,0.33282f,0.32312f,0.31164f,0.30095f,0.2946f,0.29542f,0.29459f,0.30094f,0.31163f,0.32308f,0.33259f,0.32473f,0.29967f,0.22211f,0.11774f,0.000000f},
-   {0.000000f,0.15601f,0.26339f,0.30497f,0.3472f,0.38198f,0.39609f,0.39135f,0.3765f,0.36616f,0.36703f,0.36615f,0.37649f,0.39123f,0.39574f,0.3814f,0.34627f,0.30393f,0.26322f,0.15497f,0.000000f},
-   {0.000000f,0.19222f,0.23448f,0.28578f,0.34732f,0.4169f,0.48293f,0.51439f,0.52067f,0.52104f,0.52661f,0.52086f,0.52026f,0.51365f,0.48176f,0.41543f,0.34579f,0.28436f,0.23319f,0.19202f,0.000000f},
-   {1.1102e-016f,0.076479f,0.15764f,0.24801f,0.34452f,0.44874f,0.55712f,0.67263f,0.78467f,0.89574f,1.000000f,0.89382f,0.78261f,0.67046f,0.55485f,0.4464f,0.34213f,0.24558f,0.15519f,0.074014f,0.000000f}};
-
-static constexpr const float map_5point1_rf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0043772f,0.011962f,0.018075f,0.022264f,0.035717f,0.058204f,0.083257f,0.10958f,0.13592f,0.052336f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013084f,0.011636f,0.027472f,0.049384f,0.070085f,0.089694f,0.10655f,0.12342f,0.12737f,0.15705f,0.18623f,0.16489f,0.10973f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0038919f,0.018492f,0.041753f,0.068513f,0.1006f,0.12983f,0.15652f,0.18313f,0.20135f,0.21775f,0.22851f,0.21738f,0.20108f,0.17363f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0038302f,0.016973f,0.040831f,0.073199f,0.10859f,0.14876f,0.1852f,0.21753f,0.24734f,0.26927f,0.28776f,0.27908f,0.25473f,0.24451f,0.24192f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013625f,0.010822f,0.031114f,0.061436f,0.10138f,0.14831f,0.19392f,0.2365f,0.27257f,0.30156f,0.32564f,0.33123f,0.32934f,0.31761f,0.29589f,0.31565f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00041878f,0.017789f,0.0433f,0.07868f,0.12602f,0.18248f,0.23686f,0.2799f,0.30936f,0.33175f,0.35421f,0.37263f,0.38012f,0.37444f,0.35999f,0.39234f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.01238f,0.046242f,0.085813f,0.14312f,0.21247f,0.26716f,0.29661f,0.31385f,0.34119f,0.3727f,0.40155f,0.42428f,0.43128f,0.43048f,0.47409f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0048489f,0.032179f,0.083684f,0.14641f,0.23272f,0.27225f,0.28139f,0.30767f,0.33894f,0.3788f,0.4187f,0.45626f,0.48466f,0.49857f,0.55339f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0029287f,0.015357f,0.040874f,0.082238f,0.14702f,0.23663f,0.25012f,0.27481f,0.30176f,0.33418f,0.37423f,0.42403f,0.4769f,0.52692f,0.56555f,0.63203f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0019397f,0.021156f,0.051639f,0.089163f,0.13307f,0.17997f,0.22386f,0.24772f,0.27249f,0.30054f,0.33231f,0.37158f,0.42577f,0.49302f,0.56398f,0.63586f,0.70711f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.01438f,0.049473f,0.099723f,0.15348f,0.20226f,0.24098f,0.24557f,0.25321f,0.27695f,0.30342f,0.33559f,0.37551f,0.42626f,0.49895f,0.59175f,0.69745f,0.77384f},
-   {0.000000f,0.000000f,0.000000f,0.0023122f,0.031384f,0.081894f,0.14485f,0.19907f,0.24237f,0.268f,0.27012f,0.27589f,0.28486f,0.31064f,0.34157f,0.38293f,0.43576f,0.51188f,0.62473f,0.75361f,0.83195f},
-   {0.000000f,0.000000f,0.000000f,0.0075151f,0.048878f,0.11169f,0.17871f,0.229f,0.263f,0.28867f,0.29793f,0.30177f,0.3099f,0.32047f,0.3505f,0.39422f,0.45043f,0.53218f,0.66167f,0.80779f,0.87965f},
-   {0.000000f,0.000000f,0.000000f,0.014677f,0.066587f,0.13466f,0.19976f,0.24081f,0.2763f,0.30555f,0.32392f,0.33349f,0.34026f,0.3499f,0.36625f,0.41012f,0.46596f,0.55393f,0.69668f,0.85613f,0.91914f},
-   {0.000000f,0.000000f,0.000000f,0.017689f,0.075976f,0.15229f,0.19715f,0.24172f,0.28192f,0.31654f,0.343f,0.3639f,0.37933f,0.39305f,0.40957f,0.42729f,0.49385f,0.58524f,0.72145f,0.8756f,0.94832f},
-   {0.000000f,0.000000f,0.000000f,0.019339f,0.081415f,0.12939f,0.18521f,0.2329f,0.27908f,0.31978f,0.35395f,0.38326f,0.40917f,0.43346f,0.45546f,0.48528f,0.5172f,0.60794f,0.76272f,0.87113f,0.96987f},
-   {0.000000f,0.000000f,0.000000f,0.016574f,0.049892f,0.094728f,0.15233f,0.20846f,0.26255f,0.31088f,0.35261f,0.39169f,0.42708f,0.46137f,0.49449f,0.53421f,0.57711f,0.6299f,0.74014f,0.85731f,0.9845f},
-   {0.000000f,0.000000f,0.000000f,0.0025743f,0.010122f,0.048381f,0.095227f,0.15539f,0.22053f,0.28038f,0.33191f,0.38291f,0.42927f,0.47532f,0.52386f,0.57553f,0.64546f,0.68239f,0.71318f,0.83679f,0.99377f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0022432f,0.019725f,0.067908f,0.13152f,0.19821f,0.26356f,0.3345f,0.39855f,0.46338f,0.53833f,0.61802f,0.68515f,0.7397f,0.78158f,0.8123f,0.99846f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.14292f,0.27953f,0.40639f,0.52748f,0.63323f,0.72837f,0.81116f,0.88423f,0.94629f,1.000000f}};
-
-static constexpr const float map_5point1_ls[21][21] = {
-   {1.000000f,0.99863f,0.99396f,0.98481f,0.9703f,0.94888f,0.91914f,0.88048f,0.83195f,0.77384f,0.70834f,0.63338f,0.55484f,0.47562f,0.39394f,0.3173f,0.24362f,0.17537f,0.11147f,0.054079f,-7.8496e-017f},
-   {0.99854f,0.94804f,0.94647f,0.94043f,0.92966f,0.91177f,0.87898f,0.82659f,0.76643f,0.70248f,0.63602f,0.56664f,0.49969f,0.43164f,0.36121f,0.29703f,0.24559f,0.20208f,0.16581f,0.13592f,0.000000f},
-   {0.99373f,0.94619f,0.89929f,0.8973f,0.89f,0.84522f,0.80369f,0.75196f,0.69549f,0.64182f,0.59149f,0.53909f,0.48676f,0.43211f,0.3753f,0.31848f,0.25563f,0.21817f,0.18628f,0.11031f,0.000000f},
-   {0.98443f,0.94057f,0.89693f,0.84178f,0.80673f,0.76938f,0.72295f,0.68173f,0.63988f,0.59999f,0.56152f,0.51902f,0.47535f,0.42864f,0.38061f,0.33006f,0.27965f,0.22857f,0.15778f,0.083896f,0.000000f},
-   {0.96987f,0.92924f,0.89008f,0.8064f,0.72353f,0.68753f,0.64727f,0.61961f,0.59007f,0.5611f,0.53236f,0.49762f,0.45999f,0.41905f,0.37687f,0.33185f,0.28785f,0.21842f,0.12802f,0.058746f,0.000000f},
-   {0.94832f,0.91132f,0.84488f,0.76916f,0.6876f,0.60199f,0.57793f,0.55557f,0.53786f,0.52026f,0.49866f,0.47305f,0.4406f,0.40425f,0.36538f,0.32707f,0.2697f,0.20197f,0.12403f,0.03616f,0.000000f},
-   {0.91914f,0.87839f,0.80323f,0.72262f,0.64697f,0.57779f,0.51599f,0.49381f,0.48147f,0.4732f,0.46311f,0.44521f,0.41747f,0.38486f,0.34957f,0.30247f,0.24789f,0.18361f,0.10709f,0.022585f,0.000000f},
-   {0.87965f,0.82586f,0.75136f,0.68116f,0.61943f,0.55563f,0.49394f,0.45149f,0.43778f,0.42773f,0.42381f,0.41464f,0.39077f,0.36007f,0.32202f,0.27305f,0.21805f,0.15706f,0.090176f,0.018356f,0.000000f},
-   {0.83195f,0.76558f,0.69482f,0.63955f,0.58992f,0.53794f,0.48142f,0.43767f,0.40132f,0.39038f,0.38425f,0.38246f,0.35885f,0.3262f,0.2847f,0.23683f,0.18569f,0.13031f,0.070512f,0.012179f,0.000000f},
-   {0.77494f,0.70182f,0.64105f,0.59937f,0.5609f,0.52028f,0.47314f,0.42777f,0.39034f,0.35673f,0.34932f,0.34449f,0.31565f,0.27779f,0.23728f,0.19424f,0.14921f,0.10103f,0.049741f,0.0045097f,0.000000f},
-   {0.70711f,0.63577f,0.59134f,0.56143f,0.53234f,0.49869f,0.46315f,0.42387f,0.38431f,0.34937f,0.3185f,0.28163f,0.2449f,0.21252f,0.18253f,0.14834f,0.1086f,0.068513f,0.027472f,-8.5322e-019f,0.000000f},
-   {0.63338f,0.56555f,0.53856f,0.51865f,0.49722f,0.47263f,0.44507f,0.41451f,0.38241f,0.34452f,0.2816f,0.24145f,0.18988f,0.15379f,0.12638f,0.10174f,0.073541f,0.042039f,0.011806f,0.000000f,0.000000f},
-   {0.55339f,0.49871f,0.48607f,0.47475f,0.45953f,0.44013f,0.41724f,0.39065f,0.35885f,0.31539f,0.24485f,0.1898f,0.16119f,0.11535f,0.083376f,0.061737f,0.041097f,0.018696f,0.0013628f,0.000000f,0.000000f},
-   {0.47409f,0.43048f,0.43138f,0.42817f,0.41859f,0.40381f,0.38442f,0.36003f,0.32583f,0.27748f,0.21245f,0.15351f,0.11527f,0.092466f,0.055926f,0.03134f,0.017152f,0.0039822f,0.000000f,0.000000f,0.000000f},
-   {0.39234f,0.35999f,0.37455f,0.38033f,0.37646f,0.36503f,0.34948f,0.32174f,0.28429f,0.23686f,0.18246f,0.12608f,0.083197f,0.055812f,0.03557f,0.011379f,0.0039191f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.31565f,0.29607f,0.31773f,0.32943f,0.33124f,0.32696f,0.30198f,0.27263f,0.2365f,0.19392f,0.14828f,0.10138f,0.061436f,0.031114f,0.011267f,0.002725f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24192f,0.24451f,0.25473f,0.27908f,0.28772f,0.26927f,0.24734f,0.21753f,0.18526f,0.14882f,0.10856f,0.073199f,0.040831f,0.01704f,0.0038302f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.17365f,0.20108f,0.21738f,0.22846f,0.21775f,0.20135f,0.18335f,0.15652f,0.12991f,0.1006f,0.068474f,0.041753f,0.018492f,0.0038919f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.10973f,0.16489f,0.18616f,0.15705f,0.12737f,0.12342f,0.10655f,0.089694f,0.070085f,0.049384f,0.027446f,0.011636f,0.0013628f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.052332f,0.13583f,0.10958f,0.083257f,0.058204f,0.035717f,0.022438f,0.018227f,0.011962f,0.0043772f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_5point1_rs[21][21] = {
-   {-7.8496e-017f,0.052336f,0.10973f,0.17365f,0.24192f,0.31565f,0.39394f,0.47409f,0.55484f,0.63338f,0.70587f,0.77384f,0.83195f,0.87965f,0.91914f,0.94832f,0.96987f,0.9845f,0.99377f,0.99854f,1.000000f},
-   {0.000000f,0.13583f,0.16489f,0.20208f,0.24451f,0.29589f,0.35999f,0.43048f,0.49857f,0.56633f,0.63558f,0.70182f,0.76558f,0.82586f,0.87839f,0.91132f,0.92934f,0.94057f,0.94637f,0.94804f,0.99863f},
-   {0.000000f,0.11031f,0.18615f,0.21738f,0.25552f,0.31761f,0.37444f,0.43128f,0.48597f,0.53856f,0.59121f,0.64167f,0.69482f,0.75136f,0.80323f,0.84488f,0.89008f,0.89725f,0.89927f,0.94647f,0.99396f},
-   {0.000000f,0.083257f,0.15778f,0.22845f,0.27908f,0.32934f,0.38061f,0.42817f,0.47475f,0.51865f,0.56131f,0.59998f,0.63948f,0.6818f,0.72306f,0.76916f,0.80688f,0.84174f,0.8973f,0.94077f,0.98473f},
-   {0.000000f,0.058746f,0.12737f,0.2183f,0.28772f,0.33167f,0.37646f,0.41852f,0.45953f,0.49722f,0.53221f,0.56083f,0.58986f,0.61943f,0.64753f,0.6876f,0.72348f,0.80673f,0.89031f,0.92966f,0.9703f},
-   {0.000000f,0.035717f,0.12342f,0.20135f,0.26927f,0.32696f,0.36503f,0.40381f,0.44057f,0.47309f,0.49858f,0.52028f,0.53794f,0.55557f,0.57829f,0.60191f,0.688f,0.76938f,0.84522f,0.91177f,0.94888f},
-   {0.000000f,0.022264f,0.10655f,0.18361f,0.24774f,0.30233f,0.34948f,0.3848f,0.41719f,0.44502f,0.46308f,0.47314f,0.48142f,0.49394f,0.51592f,0.57793f,0.64727f,0.72306f,0.80369f,0.87898f,0.91982f},
-   {0.000000f,0.018075f,0.089694f,0.15698f,0.21753f,0.27257f,0.32174f,0.36002f,0.39065f,0.41451f,0.4238f,0.42773f,0.43804f,0.45143f,0.49424f,0.55557f,0.61961f,0.68173f,0.75196f,0.82659f,0.88048f},
-   {0.000000f,0.011962f,0.070085f,0.12983f,0.1852f,0.2365f,0.28429f,0.32614f,0.35884f,0.38237f,0.38425f,0.39034f,0.40127f,0.43778f,0.48142f,0.53827f,0.59007f,0.63988f,0.69549f,0.76643f,0.83292f},
-   {0.000000f,0.0043772f,0.049741f,0.10103f,0.14876f,0.19392f,0.23686f,0.27743f,0.31539f,0.34452f,0.34932f,0.35669f,0.39034f,0.42773f,0.47315f,0.52061f,0.5611f,0.59999f,0.64182f,0.7028f,0.77494f},
-   {0.000000f,-8.5322e-019f,0.027447f,0.068465f,0.10853f,0.14825f,0.18244f,0.21244f,0.24485f,0.28161f,0.31849f,0.34932f,0.38425f,0.42381f,0.46314f,0.49869f,0.53239f,0.56152f,0.59147f,0.63596f,0.70711f},
-   {0.000000f,0.000000f,0.011636f,0.041753f,0.073199f,0.1017f,0.12603f,0.15351f,0.18976f,0.24145f,0.28164f,0.34451f,0.38246f,0.41464f,0.44521f,0.47305f,0.49762f,0.51919f,0.5393f,0.56664f,0.63338f},
-   {0.000000f,0.000000f,0.0013084f,0.018492f,0.040831f,0.061737f,0.083146f,0.11527f,0.16121f,0.18988f,0.2449f,0.31565f,0.35887f,0.39092f,0.41747f,0.4406f,0.45999f,0.47535f,0.48676f,0.49969f,0.55484f},
-   {0.000000f,0.000000f,0.000000f,0.0038919f,0.016973f,0.031114f,0.056058f,0.092505f,0.11557f,0.15374f,0.21251f,0.27779f,0.3262f,0.36008f,0.38486f,0.40425f,0.41905f,0.42882f,0.43211f,0.43164f,0.47562f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0038302f,0.011267f,0.0356f,0.055926f,0.083376f,0.12638f,0.18252f,0.23728f,0.2847f,0.32214f,0.34955f,0.36552f,0.37704f,0.38081f,0.3753f,0.36121f,0.39394f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0027341f,0.011405f,0.03134f,0.061737f,0.10174f,0.14834f,0.19436f,0.23696f,0.27305f,0.30247f,0.32704f,0.33185f,0.33006f,0.31848f,0.29703f,0.3173f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0039191f,0.017152f,0.041097f,0.073541f,0.10862f,0.14921f,0.18569f,0.21805f,0.24789f,0.26986f,0.28782f,0.27982f,0.25563f,0.24559f,0.24362f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0039822f,0.018696f,0.042039f,0.068554f,0.10103f,0.13031f,0.15706f,0.1837f,0.20197f,0.21842f,0.22858f,0.21822f,0.20208f,0.17537f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013628f,0.011806f,0.027511f,0.049741f,0.070512f,0.090176f,0.10709f,0.12403f,0.12802f,0.15778f,0.1863f,0.16581f,0.11147f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-8.5322e-019f,0.0045097f,0.012179f,0.018356f,0.022585f,0.03616f,0.058746f,0.083896f,0.11031f,0.136f,0.054075f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-7.8496e-017f}};
-
-// static constexpr const float map_7point1_ang[] = {-27,0,27,-95,95,-142,142};
-static constexpr const float map_7point1_xsf[] = {-1,0,1,-1,1,-1,1};
-// static constexpr const float map_7point1_ysf[] = {1,1,1,0,0,-1,-1};
-// static constexpr const channel_id map_7point1_id[] = {ci_front_left,ci_front_center,ci_front_right,ci_side_center_left,ci_side_center_right,ci_back_left,ci_back_right,ci_lfe};
-
-static constexpr const float map_7point1_lf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,9.4126e-019f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.0025743f,0.016552f,0.019339f,0.017689f,0.014677f,0.0075151f,0.0023122f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.010122f,0.049892f,0.081385f,0.075976f,0.066587f,0.048878f,0.031384f,0.01438f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.0022432f,0.048381f,0.094728f,0.12939f,0.15091f,0.13421f,0.11169f,0.081894f,0.049473f,0.021188f,0.0029287f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.019725f,0.095227f,0.15233f,0.18129f,0.18619f,0.18195f,0.1662f,0.14038f,0.099716f,0.051668f,0.015357f,0.0004627f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.067908f,0.15539f,0.20448f,0.21574f,0.21038f,0.19727f,0.18275f,0.16961f,0.14309f,0.089211f,0.030602f,0.0029125f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.13152f,0.21916f,0.24385f,0.23799f,0.22019f,0.19777f,0.1798f,0.16484f,0.15891f,0.12092f,0.0391f,0.0061765f,0.0028379f,0.00043186f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.19821f,0.26858f,0.26884f,0.24624f,0.21773f,0.19453f,0.1758f,0.16036f,0.14653f,0.13495f,0.052607f,0.038854f,0.030373f,0.015188f,0.0028496f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {8.6596e-017f,0.26351f,0.30441f,0.28405f,0.24723f,0.21577f,0.19296f,0.17452f,0.15823f,0.14384f,0.13114f,0.13492f,0.12086f,0.089089f,0.051572f,0.021112f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.14292f,0.32999f,0.33317f,0.29065f,0.24843f,0.21902f,0.19594f,0.17746f,0.1625f,0.14962f,0.14386f,0.14651f,0.15886f,0.14285f,0.099312f,0.049149f,0.01419f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.27953f,0.38637f,0.35876f,0.29909f,0.25487f,0.22426f,0.20041f,0.18277f,0.16832f,0.16249f,0.15824f,0.16036f,0.16482f,0.16948f,0.14005f,0.081488f,0.031102f,0.0022352f,0.000000f,0.000000f,0.000000f},
-   {0.40639f,0.44503f,0.38515f,0.31183f,0.26428f,0.23169f,0.20647f,0.18936f,0.18276f,0.17745f,0.17453f,0.1758f,0.17979f,0.18273f,0.16592f,0.11122f,0.048526f,0.0073556f,0.000000f,0.000000f,0.000000f},
-   {0.52748f,0.51574f,0.41678f,0.32546f,0.27415f,0.24175f,0.21641f,0.20646f,0.2004f,0.19593f,0.19298f,0.19453f,0.19777f,0.19716f,0.18189f,0.13374f,0.066173f,0.014462f,0.000000f,0.000000f,0.000000f},
-   {0.63323f,0.58186f,0.4515f,0.34992f,0.2914f,0.25248f,0.24174f,0.23169f,0.22425f,0.219f,0.21579f,0.21773f,0.22013f,0.21018f,0.18585f,0.15082f,0.075526f,0.017441f,0.000000f,0.000000f,0.000000f},
-   {0.72837f,0.62641f,0.51744f,0.37803f,0.31074f,0.29139f,0.27414f,0.26427f,0.25485f,0.24842f,0.24726f,0.24619f,0.23779f,0.2154f,0.18082f,0.12881f,0.081296f,0.019071f,0.000000f,0.000000f,0.000000f},
-   {0.81116f,0.6558f,0.5246f,0.41789f,0.37802f,0.34991f,0.32545f,0.31182f,0.29908f,0.29063f,0.28406f,0.26859f,0.24346f,0.20392f,0.15167f,0.09417f,0.04946f,0.016531f,0.000000f,0.000000f,0.000000f},
-   {0.88423f,0.67127f,0.52691f,0.5245f,0.51721f,0.45136f,0.41661f,0.38495f,0.35851f,0.33283f,0.30436f,0.26801f,0.21844f,0.15464f,0.094607f,0.047925f,0.0098814f,0.0024671f,0.000000f,0.000000f,0.000000f},
-   {0.94622f,0.67633f,0.67099f,0.65523f,0.62554f,0.58081f,0.51465f,0.44406f,0.38544f,0.32902f,0.26339f,0.19725f,0.13069f,0.067274f,0.019339f,0.0021311f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {1.000000f,0.94446f,0.8823f,0.80914f,0.72626f,0.63102f,0.52519f,0.40402f,0.27711f,0.14046f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_7point1_cf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019269f,0.00062925f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00059225f,0.001914f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0055425f,0.0155f,0.025167f,0.017695f,0.0063155f,1.0116e-005f,0.000000f,0.000000f,0.0062031f,0.017508f,0.025125f,0.015305f,0.0054168f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.0056317f,0.024256f,0.044322f,0.061583f,0.065405f,0.041656f,0.014688f,4.0817e-019f,0.014527f,0.041389f,0.065342f,0.061236f,0.044002f,0.024003f,0.005504f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.0019274f,0.02644f,0.05812f,0.08731f,0.11105f,0.11767f,0.10963f,0.061306f,0.017226f,0.061006f,0.10958f,0.11735f,0.11066f,0.086884f,0.057744f,0.026151f,0.0018503f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.016697f,0.059451f,0.104f,0.13974f,0.15702f,0.15962f,0.15223f,0.13355f,0.063692f,0.13353f,0.15211f,0.15945f,0.15675f,0.13934f,0.10352f,0.059047f,0.016456f,0.000000f,0.000000f},
-   {0.000000f,1.2068e-018f,0.038851f,0.096919f,0.15087f,0.17987f,0.18511f,0.17445f,0.15817f,0.14379f,0.13384f,0.14378f,0.15816f,0.17444f,0.18509f,0.17981f,0.15076f,0.096821f,0.038797f,0.000000f,0.000000f},
-   {0.000000f,0.0063777f,0.070344f,0.14288f,0.19068f,0.2049f,0.19453f,0.1758f,0.16036f,0.14645f,0.14681f,0.14646f,0.16036f,0.1758f,0.19453f,0.20473f,0.19031f,0.14227f,0.06984f,0.0061903f,0.000000f},
-   {0.000000f,0.017224f,0.099719f,0.18101f,0.21822f,0.2193f,0.19777f,0.17979f,0.16475f,0.16187f,0.16149f,0.16187f,0.16477f,0.1798f,0.19777f,0.21922f,0.21792f,0.18045f,0.099116f,0.016918f,0.000000f},
-   {0.000000f,0.02596f,0.12753f,0.21148f,0.23925f,0.22819f,0.20284f,0.18535f,0.18085f,0.17814f,0.17812f,0.17814f,0.18084f,0.18536f,0.20284f,0.22818f,0.23901f,0.21095f,0.12685f,0.025562f,0.000000f},
-   {0.000000f,0.03194f,0.15144f,0.23904f,0.2564f,0.23733f,0.21182f,0.20371f,0.19964f,0.19751f,0.19694f,0.1975f,0.19963f,0.20369f,0.21184f,0.23733f,0.25621f,0.23853f,0.15068f,0.031485f,0.000000f},
-   {0.000000f,0.051138f,0.17541f,0.26062f,0.27419f,0.24713f,0.23812f,0.22985f,0.2244f,0.22133f,0.22022f,0.22132f,0.22439f,0.22984f,0.2381f,0.24715f,0.274f,0.26009f,0.17455f,0.050511f,0.000000f},
-   {0.000000f,0.08308f,0.18105f,0.28155f,0.29188f,0.28632f,0.27128f,0.26327f,0.25585f,0.25151f,0.25234f,0.2515f,0.25584f,0.26325f,0.27127f,0.28627f,0.29189f,0.28098f,0.18013f,0.082312f,0.000000f},
-   {0.000000f,0.11865f,0.22314f,0.29977f,0.32517f,0.33282f,0.32312f,0.31164f,0.30095f,0.2946f,0.29542f,0.29459f,0.30094f,0.31163f,0.32308f,0.33259f,0.32473f,0.29967f,0.22211f,0.11774f,0.000000f},
-   {0.000000f,0.15601f,0.26339f,0.30497f,0.3472f,0.38198f,0.39609f,0.39135f,0.3765f,0.36616f,0.36703f,0.36615f,0.37649f,0.39123f,0.39574f,0.3814f,0.34627f,0.30393f,0.26322f,0.15497f,0.000000f},
-   {0.000000f,0.19222f,0.23448f,0.28578f,0.34732f,0.4169f,0.48293f,0.51439f,0.52067f,0.52104f,0.52661f,0.52086f,0.52026f,0.51365f,0.48176f,0.41543f,0.34579f,0.28436f,0.23319f,0.19202f,0.000000f},
-   {1.1102e-016f,0.076479f,0.15764f,0.24801f,0.34452f,0.44874f,0.55712f,0.67263f,0.78467f,0.89574f,1.000000f,0.89382f,0.78261f,0.67046f,0.55485f,0.4464f,0.34213f,0.24558f,0.15519f,0.074014f,0.000000f}};
-
-static constexpr const float map_7point1_rf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0022352f,0.0073556f,0.014462f,0.017441f,0.019071f,0.016531f,0.0024671f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019269f,0.01419f,0.031102f,0.048526f,0.066173f,0.075526f,0.081297f,0.04946f,0.0098814f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0028496f,0.021112f,0.049149f,0.081488f,0.11122f,0.13374f,0.15081f,0.12881f,0.09417f,0.047925f,0.0021311f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00043186f,0.015188f,0.051545f,0.099312f,0.14005f,0.16592f,0.1819f,0.18585f,0.18082f,0.15167f,0.094607f,0.019339f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0028379f,0.030373f,0.089057f,0.14285f,0.16948f,0.18273f,0.19716f,0.21018f,0.2154f,0.20392f,0.15464f,0.067274f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0004627f,0.0029125f,0.0061679f,0.038854f,0.12083f,0.15886f,0.16483f,0.17979f,0.19777f,0.22013f,0.23779f,0.24346f,0.21844f,0.13069f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0029287f,0.015357f,0.030602f,0.0391f,0.052555f,0.13491f,0.14652f,0.16036f,0.1758f,0.19453f,0.21773f,0.24619f,0.26859f,0.26801f,0.19725f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0019397f,0.021156f,0.051639f,0.089163f,0.1209f,0.13493f,0.13114f,0.14385f,0.15824f,0.17453f,0.19297f,0.21578f,0.24725f,0.28402f,0.30431f,0.2633f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.01438f,0.049473f,0.099716f,0.14309f,0.15891f,0.1465f,0.14385f,0.14961f,0.16249f,0.17745f,0.19593f,0.219f,0.24842f,0.29063f,0.33283f,0.32902f,0.14046f},
-   {0.000000f,0.000000f,0.000000f,0.0023122f,0.031384f,0.081894f,0.14038f,0.16961f,0.16482f,0.16036f,0.15824f,0.1625f,0.16831f,0.18276f,0.2004f,0.22425f,0.25485f,0.29908f,0.35851f,0.38544f,0.27711f},
-   {0.000000f,0.000000f,0.000000f,0.0075151f,0.048878f,0.11169f,0.1662f,0.18272f,0.1798f,0.1758f,0.17453f,0.17746f,0.18277f,0.18935f,0.20646f,0.23169f,0.26427f,0.31182f,0.38495f,0.44406f,0.40402f},
-   {0.000000f,0.000000f,0.000000f,0.014677f,0.066587f,0.13421f,0.18194f,0.19727f,0.19777f,0.19453f,0.19297f,0.19594f,0.20041f,0.20647f,0.2164f,0.24174f,0.27414f,0.32545f,0.41661f,0.51465f,0.52519f},
-   {0.000000f,0.000000f,0.000000f,0.017689f,0.075976f,0.15092f,0.18619f,0.21038f,0.22019f,0.21773f,0.21578f,0.21902f,0.22426f,0.23169f,0.24175f,0.25247f,0.29139f,0.34991f,0.45136f,0.58081f,0.63102f},
-   {0.000000f,0.000000f,0.000000f,0.019339f,0.081415f,0.12939f,0.18129f,0.21574f,0.23799f,0.24624f,0.24725f,0.24843f,0.25487f,0.26428f,0.27415f,0.2914f,0.31073f,0.37802f,0.51721f,0.62554f,0.72626f},
-   {0.000000f,0.000000f,0.000000f,0.016574f,0.049892f,0.094728f,0.15233f,0.20448f,0.24385f,0.26884f,0.28405f,0.29065f,0.29909f,0.31183f,0.32546f,0.34992f,0.37803f,0.41787f,0.5245f,0.65523f,0.80914f},
-   {0.000000f,0.000000f,0.000000f,0.0025743f,0.010122f,0.048381f,0.095227f,0.15539f,0.21916f,0.26858f,0.3044f,0.33317f,0.35876f,0.38515f,0.41678f,0.4515f,0.51744f,0.5246f,0.52688f,0.67099f,0.8823f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0022432f,0.019725f,0.067908f,0.13152f,0.19821f,0.26356f,0.32999f,0.38637f,0.44503f,0.51574f,0.58186f,0.62641f,0.6558f,0.67127f,0.6763f,0.94439f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.14292f,0.27953f,0.40639f,0.52748f,0.63323f,0.72837f,0.81116f,0.88423f,0.94629f,1.000000f}};
-
-static constexpr const float map_7point1_lsm[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.076479f,0.1924f,0.15601f,0.11842f,0.08308f,0.051138f,0.03194f,0.02596f,0.017224f,0.006217f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.15701f,0.23422f,0.26354f,0.22314f,0.18089f,0.17541f,0.15144f,0.12753f,0.099719f,0.070344f,0.038959f,0.016585f,0.0019274f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24799f,0.28578f,0.30478f,0.2999f,0.28155f,0.26062f,0.23875f,0.21148f,0.18101f,0.14288f,0.097017f,0.059361f,0.02644f,0.0055357f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.34452f,0.34709f,0.3472f,0.32503f,0.29199f,0.2741f,0.2564f,0.23925f,0.21822f,0.19068f,0.15101f,0.104f,0.05812f,0.024256f,0.0054585f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.44874f,0.4169f,0.38198f,0.33282f,0.28632f,0.24721f,0.23733f,0.22819f,0.21923f,0.20483f,0.17996f,0.13974f,0.08731f,0.044322f,0.015426f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.55712f,0.48293f,0.39609f,0.32283f,0.2712f,0.23804f,0.21189f,0.20278f,0.19777f,0.19453f,0.18519f,0.15702f,0.11105f,0.061583f,0.025231f,0.00062925f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.67263f,0.51439f,0.39135f,0.31154f,0.26327f,0.22985f,0.20371f,0.18541f,0.17979f,0.1758f,0.17449f,0.15962f,0.11761f,0.06551f,0.017632f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.78467f,0.52067f,0.3765f,0.30095f,0.25585f,0.2244f,0.19964f,0.1808f,0.16481f,0.16036f,0.15821f,0.15223f,0.10975f,0.041656f,0.0063155f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.89382f,0.52104f,0.36605f,0.29451f,0.25151f,0.22133f,0.19751f,0.17814f,0.16187f,0.14649f,0.14382f,0.13363f,0.061306f,0.014688f,1.0116e-005f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {1.000000f,0.52679f,0.36715f,0.29551f,0.25242f,0.22029f,0.19701f,0.17818f,0.16155f,0.14686f,0.1311f,0.063705f,0.017218f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.89382f,0.52086f,0.36615f,0.29459f,0.2515f,0.22126f,0.1975f,0.17814f,0.16187f,0.14649f,0.14382f,0.13358f,0.061006f,0.014527f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.78261f,0.52026f,0.37649f,0.30094f,0.25584f,0.22432f,0.19963f,0.18084f,0.1648f,0.16036f,0.1582f,0.15211f,0.10961f,0.041389f,0.0062031f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.67046f,0.51365f,0.39123f,0.31163f,0.26325f,0.22984f,0.20363f,0.1854f,0.17974f,0.1758f,0.17448f,0.15945f,0.11735f,0.065362f,0.017508f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.55485f,0.48176f,0.39574f,0.32282f,0.27127f,0.2381f,0.21189f,0.20284f,0.19777f,0.19453f,0.18513f,0.15675f,0.11066f,0.061236f,0.025146f,0.00059225f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.4464f,0.41543f,0.3814f,0.33259f,0.28621f,0.2472f,0.23726f,0.22818f,0.21922f,0.20473f,0.17984f,0.13934f,0.086884f,0.044002f,0.015305f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.34213f,0.34579f,0.34627f,0.32473f,0.29192f,0.274f,0.25621f,0.23901f,0.21792f,0.19031f,0.1508f,0.10352f,0.057744f,0.024003f,0.0054168f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24558f,0.28436f,0.30393f,0.29971f,0.28098f,0.26009f,0.23836f,0.21095f,0.18045f,0.14227f,0.096837f,0.059047f,0.026151f,0.005504f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.15519f,0.23319f,0.26327f,0.22211f,0.18013f,0.17455f,0.15068f,0.12685f,0.099116f,0.06984f,0.038815f,0.016456f,0.0018503f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.074009f,0.19209f,0.15497f,0.11774f,0.082312f,0.050511f,0.031485f,0.025562f,0.016918f,0.0061903f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_7point1_rsm[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0061903f,0.016918f,0.025562f,0.031485f,0.050511f,0.082312f,0.11774f,0.15497f,0.19222f,0.074014f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0018503f,0.016456f,0.038851f,0.06984f,0.099116f,0.12685f,0.15068f,0.17455f,0.18013f,0.22211f,0.26337f,0.23319f,0.15519f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.005504f,0.026151f,0.059047f,0.096892f,0.14227f,0.18045f,0.21095f,0.23853f,0.26009f,0.28098f,0.29979f,0.30393f,0.28436f,0.24556f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0054168f,0.024003f,0.057744f,0.10352f,0.15084f,0.19031f,0.21792f,0.23901f,0.25621f,0.274f,0.29198f,0.32473f,0.34627f,0.34579f,0.34213f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019269f,0.015305f,0.044002f,0.086884f,0.13934f,0.17988f,0.20473f,0.21922f,0.22818f,0.23733f,0.24725f,0.28627f,0.33259f,0.3814f,0.41543f,0.4464f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00059225f,0.025157f,0.061236f,0.11066f,0.15675f,0.18518f,0.19453f,0.19777f,0.20284f,0.21193f,0.2381f,0.27127f,0.32308f,0.39574f,0.48176f,0.55485f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.017508f,0.065396f,0.11735f,0.15945f,0.17454f,0.1758f,0.1798f,0.18544f,0.20369f,0.22984f,0.26325f,0.31163f,0.39123f,0.51365f,0.67046f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0062031f,0.041389f,0.10962f,0.15211f,0.15825f,0.16036f,0.16483f,0.18084f,0.19963f,0.22439f,0.25584f,0.30094f,0.37649f,0.52026f,0.78261f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.014527f,0.061006f,0.13359f,0.14386f,0.14652f,0.16187f,0.17814f,0.1975f,0.22132f,0.2515f,0.29459f,0.36615f,0.52086f,0.89382f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-4.0817e-019f,0.017202f,0.06369f,0.13113f,0.14689f,0.16158f,0.17821f,0.19705f,0.22033f,0.25247f,0.29557f,0.36722f,0.52689f,1.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,1.0116e-005f,0.014688f,0.061306f,0.13361f,0.14385f,0.14651f,0.16187f,0.17814f,0.19751f,0.22133f,0.25151f,0.2946f,0.36616f,0.52104f,0.89574f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0063155f,0.041656f,0.10967f,0.15223f,0.15823f,0.16036f,0.16482f,0.18085f,0.19964f,0.2244f,0.25585f,0.30095f,0.3765f,0.52067f,0.78467f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.017695f,0.065451f,0.11767f,0.15962f,0.17452f,0.1758f,0.17979f,0.18543f,0.20371f,0.22985f,0.26327f,0.31164f,0.39135f,0.51439f,0.67263f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.00062925f,0.0252f,0.061583f,0.11105f,0.15702f,0.18518f,0.19453f,0.19777f,0.20284f,0.21192f,0.23812f,0.27128f,0.32312f,0.39609f,0.48293f,0.55712f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019397f,0.0155f,0.044322f,0.08731f,0.13974f,0.17992f,0.2049f,0.2193f,0.22819f,0.23733f,0.24724f,0.28632f,0.33282f,0.38198f,0.4169f,0.44874f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0055425f,0.024256f,0.05812f,0.104f,0.15089f,0.19068f,0.21822f,0.23925f,0.2564f,0.27419f,0.292f,0.32517f,0.3472f,0.34732f,0.34452f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0056317f,0.02644f,0.059451f,0.09695f,0.14288f,0.18101f,0.21148f,0.23904f,0.26062f,0.28155f,0.29985f,0.30497f,0.28578f,0.24801f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019274f,0.016697f,0.038906f,0.070344f,0.099719f,0.12753f,0.15144f,0.17541f,0.18105f,0.22314f,0.26347f,0.23448f,0.15764f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-1.2068e-018f,0.0063777f,0.017224f,0.02596f,0.03194f,0.051138f,0.08308f,0.11865f,0.15601f,0.19233f,0.076473f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-1.1102e-016f}};
-
-static constexpr const float map_7point1_ls[21][21] = {
-   {1.000000f,0.99863f,0.99396f,0.98481f,0.9703f,0.94888f,0.91914f,0.88048f,0.83195f,0.77384f,0.70834f,0.63338f,0.55484f,0.47562f,0.39394f,0.3173f,0.24362f,0.17537f,0.11147f,0.054079f,-7.8496e-017f},
-   {0.94446f,0.81199f,0.83616f,0.85669f,0.87092f,0.87561f,0.8564f,0.80823f,0.75425f,0.69808f,0.63602f,0.56664f,0.49969f,0.43164f,0.36121f,0.29703f,0.24559f,0.20208f,0.16581f,0.13592f,0.000000f},
-   {0.88271f,0.78057f,0.71294f,0.73952f,0.76209f,0.72118f,0.69661f,0.66179f,0.62498f,0.59208f,0.56394f,0.52736f,0.48539f,0.43211f,0.3753f,0.31848f,0.25563f,0.21817f,0.18628f,0.11031f,0.000000f},
-   {0.80907f,0.73849f,0.68142f,0.62971f,0.60765f,0.58509f,0.55402f,0.53219f,0.51188f,0.49896f,0.49292f,0.47704f,0.45666f,0.42472f,0.38061f,0.33006f,0.27965f,0.22857f,0.15778f,0.083896f,0.000000f},
-   {0.72626f,0.68381f,0.64457f,0.57657f,0.51706f,0.49372f,0.46596f,0.45043f,0.43577f,0.42627f,0.42558f,0.42408f,0.4189f,0.4019f,0.37301f,0.33185f,0.28785f,0.21842f,0.12802f,0.058746f,0.000000f},
-   {0.63102f,0.61653f,0.57478f,0.53382f,0.48514f,0.42718f,0.41011f,0.39421f,0.38285f,0.37543f,0.37141f,0.37424f,0.37886f,0.37291f,0.35447f,0.32571f,0.2697f,0.20197f,0.12403f,0.03616f,0.000000f},
-   {0.52519f,0.53691f,0.52315f,0.49422f,0.4552f,0.40947f,0.36615f,0.35043f,0.34158f,0.3356f,0.33216f,0.33419f,0.33895f,0.34131f,0.33172f,0.30203f,0.24789f,0.18361f,0.10709f,0.022585f,0.000000f},
-   {0.40402f,0.46214f,0.47464f,0.46087f,0.43328f,0.39304f,0.3499f,0.32038f,0.31064f,0.30342f,0.30041f,0.30177f,0.30761f,0.31375f,0.30955f,0.27305f,0.21805f,0.15706f,0.090176f,0.018356f,0.000000f},
-   {0.27711f,0.39741f,0.42859f,0.42667f,0.40895f,0.37927f,0.34025f,0.30982f,0.28478f,0.27695f,0.27237f,0.27482f,0.28125f,0.29675f,0.28023f,0.23683f,0.18569f,0.13031f,0.070512f,0.012179f,0.000000f},
-   {0.14292f,0.33339f,0.38221f,0.39113f,0.38299f,0.36377f,0.33348f,0.30176f,0.27588f,0.25314f,0.24761f,0.25f,0.2723f,0.2674f,0.23727f,0.19424f,0.14921f,0.10103f,0.049741f,0.0045097f,0.000000f},
-   {0.000000f,0.26327f,0.33172f,0.35247f,0.35385f,0.34292f,0.32385f,0.29788f,0.27007f,0.24552f,0.22579f,0.23659f,0.23272f,0.21252f,0.18253f,0.14834f,0.1086f,0.068513f,0.027472f,-8.5322e-019f,0.000000f},
-   {0.000000f,0.19725f,0.27965f,0.31034f,0.31939f,0.31618f,0.30536f,0.28855f,0.26792f,0.24094f,0.1799f,0.14699f,0.14674f,0.14347f,0.12638f,0.10174f,0.073541f,0.042039f,0.011806f,0.000000f,0.000000f},
-   {0.000000f,0.13069f,0.21975f,0.26195f,0.27862f,0.28151f,0.27602f,0.26277f,0.24232f,0.202f,0.13299f,0.082204f,0.083689f,0.086082f,0.07899f,0.061737f,0.041097f,0.018696f,0.0013628f,0.000000f,0.000000f},
-   {0.000000f,0.067274f,0.15464f,0.20782f,0.23238f,0.24129f,0.24043f,0.22893f,0.19873f,0.15312f,0.089072f,0.040759f,0.032293f,0.046248f,0.043546f,0.03134f,0.017152f,0.0039822f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.019339f,0.094607f,0.15196f,0.18465f,0.19667f,0.19966f,0.1783f,0.14444f,0.099312f,0.051555f,0.015195f,0.0048976f,0.012512f,0.017789f,0.01096f,0.0039191f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.0021311f,0.047925f,0.09417f,0.12885f,0.15216f,0.13421f,0.11122f,0.081488f,0.049149f,0.021112f,0.0028496f,0.000000f,0.000000f,0.00044495f,0.0013625f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.0098814f,0.04946f,0.081296f,0.075526f,0.066173f,0.048526f,0.031102f,0.01419f,0.0019269f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.0024671f,0.016531f,0.019071f,0.017441f,0.014677f,0.0073556f,0.0022352f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_7point1_rs[21][21] = {
-   {-7.8496e-017f,0.052336f,0.10973f,0.17365f,0.24192f,0.31565f,0.39394f,0.47409f,0.55484f,0.63338f,0.70587f,0.77384f,0.83195f,0.87965f,0.91914f,0.94832f,0.96987f,0.9845f,0.99377f,0.99854f,1.000000f},
-   {0.000000f,0.13583f,0.16489f,0.20208f,0.24451f,0.29589f,0.35999f,0.43048f,0.49857f,0.56633f,0.63558f,0.69745f,0.75361f,0.80779f,0.85613f,0.8756f,0.87113f,0.85731f,0.83679f,0.81212f,0.94629f},
-   {0.000000f,0.11031f,0.18615f,0.21738f,0.25552f,0.31761f,0.37444f,0.43128f,0.48466f,0.52692f,0.56374f,0.59228f,0.62473f,0.66167f,0.69668f,0.72145f,0.76272f,0.7402f,0.71303f,0.78158f,0.88423f},
-   {0.000000f,0.083257f,0.15778f,0.22845f,0.27908f,0.32934f,0.38061f,0.42428f,0.45626f,0.4769f,0.4928f,0.49938f,0.51188f,0.53264f,0.55439f,0.58524f,0.6082f,0.62975f,0.68239f,0.7397f,0.8111f},
-   {0.000000f,0.058746f,0.12737f,0.2183f,0.28772f,0.33167f,0.37263f,0.40155f,0.4187f,0.42403f,0.42555f,0.42626f,0.43576f,0.45043f,0.46637f,0.49385f,0.51702f,0.57711f,0.64546f,0.68515f,0.72837f},
-   {0.000000f,0.035717f,0.12342f,0.20135f,0.26927f,0.3256f,0.35421f,0.3727f,0.37913f,0.37456f,0.37139f,0.37551f,0.38293f,0.39422f,0.41047f,0.42708f,0.48557f,0.53421f,0.57553f,0.61802f,0.63323f},
-   {0.000000f,0.022264f,0.10655f,0.18361f,0.24774f,0.30191f,0.3317f,0.3415f,0.33894f,0.33418f,0.33214f,0.33559f,0.34157f,0.3505f,0.36607f,0.40957f,0.45546f,0.49461f,0.52386f,0.53833f,0.52748f},
-   {0.000000f,0.018075f,0.089694f,0.15698f,0.21753f,0.27257f,0.30936f,0.31378f,0.30767f,0.30176f,0.30039f,0.30342f,0.31091f,0.32031f,0.3502f,0.39305f,0.43346f,0.46137f,0.47532f,0.46338f,0.40639f},
-   {0.000000f,0.011962f,0.070085f,0.12983f,0.1852f,0.2365f,0.2799f,0.29688f,0.28132f,0.27481f,0.27235f,0.27695f,0.28472f,0.3099f,0.34026f,0.3796f,0.40917f,0.42708f,0.42927f,0.39855f,0.27953f},
-   {0.000000f,0.0043772f,0.049741f,0.10103f,0.14876f,0.19392f,0.23686f,0.26716f,0.27225f,0.25006f,0.24759f,0.25308f,0.27589f,0.30177f,0.33349f,0.36411f,0.38326f,0.39169f,0.38291f,0.3345f,0.14292f},
-   {0.000000f,-8.5322e-019f,0.027447f,0.068465f,0.10853f,0.14825f,0.18244f,0.21244f,0.23269f,0.23658f,0.22577f,0.24545f,0.27f,0.29779f,0.3238f,0.34289f,0.35387f,0.35252f,0.3318f,0.26339f,-8.6596e-017f},
-   {0.000000f,0.000000f,0.011636f,0.041753f,0.073199f,0.1017f,0.12602f,0.14312f,0.14641f,0.14698f,0.17992f,0.24091f,0.268f,0.28867f,0.30555f,0.31654f,0.31978f,0.31088f,0.28038f,0.19821f,0.000000f},
-   {0.000000f,0.000000f,0.0013084f,0.018492f,0.040831f,0.061737f,0.07868f,0.085813f,0.08366f,0.082238f,0.13301f,0.20226f,0.24232f,0.26304f,0.2763f,0.28192f,0.27908f,0.26255f,0.22053f,0.13152f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.0038919f,0.016973f,0.031114f,0.043546f,0.046224f,0.032368f,0.040874f,0.089105f,0.15348f,0.19907f,0.22896f,0.24081f,0.24172f,0.2329f,0.20846f,0.15539f,0.067908f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.0038302f,0.010822f,0.017781f,0.01238f,0.0048489f,0.015357f,0.051582f,0.099723f,0.14485f,0.17871f,0.1997f,0.19715f,0.18521f,0.15233f,0.095227f,0.019725f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0013625f,0.00044495f,0.000000f,0.000000f,0.0029287f,0.021123f,0.049473f,0.081894f,0.11169f,0.13466f,0.15222f,0.12939f,0.094728f,0.048381f,0.0022432f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0019269f,0.01438f,0.031384f,0.048878f,0.066587f,0.075976f,0.081342f,0.049892f,0.010122f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0023122f,0.0075151f,0.014677f,0.017689f,0.019339f,0.016553f,0.0025743f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,-9.4126e-019f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-// static constexpr const float map_legacy_ang[] = {-27,0,27,-105,105};
-static constexpr const float map_legacy_xsf[] = {-1,0,1,-1,1};
-// static constexpr const float map_legacy_ysf[] = {1,1,1,-1,-1};
-// static constexpr const channel_id map_legacy_id[] = {ci_front_left,ci_front_center,ci_front_right,ci_back_left,ci_back_right,ci_lfe};
-
-static constexpr const float map_legacy_lf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.052559f,0.04973f,0.046444f,0.042638f,0.038255f,0.03325f,0.027609f,0.021357f,0.014571f,0.0073897f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.11043f,0.10453f,0.097663f,0.089681f,0.080466f,0.069928f,0.058038f,0.044859f,0.030571f,0.015481f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.17379f,0.16464f,0.15393f,0.14141f,0.1269f,0.11024f,0.091419f,0.070553f,0.047977f,0.024228f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.24254f,0.23009f,0.21535f,0.19799f,0.1777f,0.1543f,0.12778f,0.098374f,0.066667f,0.03352f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.31623f,0.30059f,0.28179f,0.25935f,0.23285f,0.20203f,0.16696f,0.1281f,0.086387f,0.043173f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.39392f,0.37542f,0.35271f,0.3251f,0.292f,0.25309f,0.20858f,0.15929f,0.10674f,0.05293f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.4741f,0.45334f,0.42712f,0.39444f,0.35446f,0.30682f,0.25196f,0.19128f,0.12717f,0.062479f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.5547f,0.53253f,0.50345f,0.46602f,0.41906f,0.36214f,0.29609f,0.22322f,0.14704f,0.071497f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.63324f,0.61069f,0.57963f,0.538f,0.48415f,0.41759f,0.33971f,0.25408f,0.1657f,0.079698f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.70711f,0.68525f,0.6532f,0.60812f,0.54772f,0.4714f,0.38139f,0.28284f,0.18257f,0.086874f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.77396f,0.75372f,0.72165f,0.67398f,0.60758f,0.52174f,0.41971f,0.30863f,0.19725f,0.092925f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.83205f,0.81408f,0.78279f,0.73335f,0.66169f,0.56695f,0.45356f,0.33085f,0.20953f,0.097849f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.88047f,0.86507f,0.83508f,0.78458f,0.70851f,0.6058f,0.48218f,0.34921f,0.21943f,0.10172f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.91915f,0.90626f,0.87779f,0.82678f,0.74715f,0.63768f,0.50535f,0.36378f,0.22711f,0.10467f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.94868f,0.93803f,0.91103f,0.85983f,0.77748f,0.66259f,0.52322f,0.37484f,0.23285f,0.10684f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.97014f,0.96128f,0.93553f,0.88433f,0.8f,0.68101f,0.53632f,0.38284f,0.23694f,0.10837f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.98478f,0.97723f,0.95242f,0.9013f,0.81561f,0.69373f,0.54531f,0.38828f,0.2397f,0.10939f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.99388f,0.98718f,0.963f,0.91194f,0.82541f,0.70171f,0.55092f,0.39165f,0.2414f,0.11001f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.99862f,0.99237f,0.96853f,0.91751f,0.83055f,0.70589f,0.55385f,0.39341f,0.24228f,0.11034f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {1.000000f,0.99388f,0.97014f,0.91915f,0.83205f,0.70711f,0.5547f,0.39392f,0.24254f,0.11043f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_legacy_cf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.0055256f,0.011611f,0.018273f,0.025503f,0.03325f,0.041414f,0.049832f,0.058284f,0.066507f,0.074227f,0.066507f,0.058284f,0.049832f,0.041414f,0.03325f,0.025503f,0.018273f,0.011611f,0.0055256f,0.000000f},
-   {0.000000f,0.011615f,0.024416f,0.038435f,0.053644f,0.069928f,0.087057f,0.10467f,0.12228f,0.13933f,0.15523f,0.13933f,0.12228f,0.10467f,0.087057f,0.069928f,0.053644f,0.038435f,0.024416f,0.011615f,0.000000f},
-   {0.000000f,0.018294f,0.038482f,0.060606f,0.084599f,0.11024f,0.13713f,0.16462f,0.19191f,0.21805f,0.24214f,0.21805f,0.19191f,0.16462f,0.13713f,0.11024f,0.084599f,0.060606f,0.038482f,0.018294f,0.000000f},
-   {0.000000f,0.025565f,0.053838f,0.084853f,0.11847f,0.1543f,0.19166f,0.22954f,0.26667f,0.30168f,0.33333f,0.30168f,0.26667f,0.22954f,0.19166f,0.1543f,0.11847f,0.084853f,0.053838f,0.025565f,0.000000f},
-   {0.000000f,0.033398f,0.070447f,0.11115f,0.15523f,0.20203f,0.25044f,0.29889f,0.34555f,0.38856f,0.4264f,0.38856f,0.34555f,0.29889f,0.25044f,0.20203f,0.15523f,0.11115f,0.070447f,0.033398f,0.000000f},
-   {0.000000f,0.041713f,0.088178f,0.13933f,0.19467f,0.25309f,0.31287f,0.37167f,0.42694f,0.47637f,0.51832f,0.47637f,0.42694f,0.37167f,0.31287f,0.25309f,0.19467f,0.13933f,0.088178f,0.041713f,0.000000f},
-   {0.000000f,0.050371f,0.10678f,0.16904f,0.23631f,0.30682f,0.37793f,0.44633f,0.50867f,0.56231f,0.60584f,0.56231f,0.50867f,0.44633f,0.37793f,0.30682f,0.23631f,0.16904f,0.10678f,0.050371f,0.000000f},
-   {0.000000f,0.05917f,0.12586f,0.19972f,0.27937f,0.36214f,0.44414f,0.52085f,0.58817f,0.64347f,0.68599f,0.64347f,0.58817f,0.52085f,0.44414f,0.36214f,0.27937f,0.19972f,0.12586f,0.05917f,0.000000f},
-   {0.000000f,0.067855f,0.14491f,0.23057f,0.32277f,0.41759f,0.50957f,0.59285f,0.66281f,0.71728f,0.7566f,0.71728f,0.66281f,0.59285f,0.50957f,0.41759f,0.32277f,0.23057f,0.14491f,0.067855f,0.000000f},
-   {0.000000f,0.076139f,0.1633f,0.26062f,0.36515f,0.4714f,0.57208f,0.65997f,0.7303f,0.78187f,0.8165f,0.78187f,0.7303f,0.65997f,0.57208f,0.4714f,0.36515f,0.26062f,0.1633f,0.076139f,0.000000f},
-   {0.000000f,0.083747f,0.18041f,0.28885f,0.40505f,0.52174f,0.62957f,0.72015f,0.78899f,0.83633f,0.86558f,0.83633f,0.78899f,0.72015f,0.62957f,0.52174f,0.40505f,0.28885f,0.18041f,0.083747f,0.000000f},
-   {0.000000f,0.090453f,0.1957f,0.31429f,0.44113f,0.56695f,0.68034f,0.77198f,0.83812f,0.88064f,0.90453f,0.88064f,0.83812f,0.77198f,0.68034f,0.56695f,0.44113f,0.31429f,0.1957f,0.090453f,0.000000f},
-   {0.000000f,0.096118f,0.20877f,0.33625f,0.47234f,0.6058f,0.72328f,0.81483f,0.87771f,0.9155f,0.93455f,0.9155f,0.87771f,0.81483f,0.72328f,0.6058f,0.47234f,0.33625f,0.20877f,0.096118f,0.000000f},
-   {0.000000f,0.1007f,0.21945f,0.35433f,0.4981f,0.63768f,0.75802f,0.84881f,0.90844f,0.94203f,0.95702f,0.94203f,0.90844f,0.84881f,0.75802f,0.63768f,0.4981f,0.35433f,0.21945f,0.1007f,0.000000f},
-   {0.000000f,0.10423f,0.22776f,0.3685f,0.51832f,0.66259f,0.78484f,0.87462f,0.93138f,0.96153f,0.97333f,0.96153f,0.93138f,0.87462f,0.78484f,0.66259f,0.51832f,0.3685f,0.22776f,0.10423f,0.000000f},
-   {0.000000f,0.10681f,0.23388f,0.379f,0.53333f,0.68101f,0.80448f,0.89329f,0.94776f,0.97529f,0.98473f,0.97529f,0.94776f,0.89329f,0.80448f,0.68101f,0.53333f,0.379f,0.23388f,0.10681f,0.000000f},
-   {0.000000f,0.10858f,0.23811f,0.38627f,0.54374f,0.69373f,0.81797f,0.90598f,0.95879f,0.98449f,0.9923f,0.98449f,0.95879f,0.90598f,0.81797f,0.69373f,0.54374f,0.38627f,0.23811f,0.10858f,0.000000f},
-   {0.000000f,0.10969f,0.24075f,0.39083f,0.55028f,0.70171f,0.82638f,0.91386f,0.9656f,0.99013f,0.99693f,0.99013f,0.9656f,0.91386f,0.82638f,0.70171f,0.55028f,0.39083f,0.24075f,0.10969f,0.000000f},
-   {0.000000f,0.11026f,0.24213f,0.39322f,0.5537f,0.70589f,0.83077f,0.91795f,0.96912f,0.99304f,0.99931f,0.99304f,0.96912f,0.91795f,0.83077f,0.70589f,0.5537f,0.39322f,0.24213f,0.11026f,0.000000f},
-   {0.000000f,0.11043f,0.24254f,0.39392f,0.5547f,0.70711f,0.83205f,0.91915f,0.97014f,0.99388f,1.000000f,0.99388f,0.97014f,0.91915f,0.83205f,0.70711f,0.5547f,0.39392f,0.24254f,0.11043f,0.000000f}};
-
-static constexpr const float map_legacy_rf[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.0073897f,0.014571f,0.021357f,0.027609f,0.03325f,0.038255f,0.042638f,0.046444f,0.04973f,0.052559f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.015481f,0.030571f,0.044859f,0.058038f,0.069928f,0.080466f,0.089681f,0.097663f,0.10453f,0.11043f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.024228f,0.047977f,0.070553f,0.091419f,0.11024f,0.1269f,0.14141f,0.15393f,0.16464f,0.17379f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.03352f,0.066667f,0.098374f,0.12778f,0.1543f,0.1777f,0.19799f,0.21535f,0.23009f,0.24254f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.043173f,0.086387f,0.1281f,0.16696f,0.20203f,0.23285f,0.25935f,0.28179f,0.30059f,0.31623f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.05293f,0.10674f,0.15929f,0.20858f,0.25309f,0.292f,0.3251f,0.35271f,0.37542f,0.39392f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.062479f,0.12717f,0.19128f,0.25196f,0.30682f,0.35446f,0.39444f,0.42712f,0.45334f,0.4741f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.071497f,0.14704f,0.22322f,0.29609f,0.36214f,0.41906f,0.46602f,0.50345f,0.53253f,0.5547f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.079698f,0.1657f,0.25408f,0.33971f,0.41759f,0.48415f,0.538f,0.57963f,0.61069f,0.63324f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.086874f,0.18257f,0.28284f,0.38139f,0.4714f,0.54772f,0.60812f,0.6532f,0.68525f,0.70711f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.092925f,0.19725f,0.30863f,0.41971f,0.52174f,0.60758f,0.67398f,0.72165f,0.75372f,0.77396f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.097849f,0.20953f,0.33085f,0.45356f,0.56695f,0.66169f,0.73335f,0.78279f,0.81408f,0.83205f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.10172f,0.21943f,0.34921f,0.48218f,0.6058f,0.70851f,0.78458f,0.83508f,0.86507f,0.88047f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.10467f,0.22711f,0.36378f,0.50535f,0.63768f,0.74715f,0.82678f,0.87779f,0.90626f,0.91915f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.10684f,0.23285f,0.37484f,0.52322f,0.66259f,0.77748f,0.85983f,0.91103f,0.93803f,0.94868f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.10837f,0.23694f,0.38284f,0.53632f,0.68101f,0.8f,0.88433f,0.93553f,0.96128f,0.97014f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.10939f,0.2397f,0.38828f,0.54531f,0.69373f,0.81561f,0.9013f,0.95242f,0.97723f,0.98478f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.11001f,0.2414f,0.39165f,0.55092f,0.70171f,0.82541f,0.91194f,0.963f,0.98718f,0.99388f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.11034f,0.24228f,0.39341f,0.55385f,0.70589f,0.83055f,0.91751f,0.96853f,0.99237f,0.99862f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.11043f,0.24254f,0.39392f,0.5547f,0.70711f,0.83205f,0.91915f,0.97014f,0.99388f,1.000000f}};
-
-static constexpr const float map_legacy_ls[21][21] = {
-   {1.000000f,0.99862f,0.99388f,0.98478f,0.97014f,0.94868f,0.91915f,0.88047f,0.83205f,0.77396f,0.70711f,0.63324f,0.5547f,0.4741f,0.39392f,0.31623f,0.24254f,0.17379f,0.11043f,0.052559f,0.000000f},
-   {0.99862f,0.99737f,0.99274f,0.98372f,0.96912f,0.94763f,0.91801f,0.87918f,0.83055f,0.77222f,0.70516f,0.63182f,0.5537f,0.4734f,0.39343f,0.31588f,0.24228f,0.1736f,0.1103f,0.052493f,0.000000f},
-   {0.99388f,0.99308f,0.98883f,0.98008f,0.9656f,0.94403f,0.9141f,0.87474f,0.82541f,0.76631f,0.69854f,0.62698f,0.55028f,0.47102f,0.39176f,0.31468f,0.2414f,0.17296f,0.10987f,0.052267f,0.000000f},
-   {0.98478f,0.98482f,0.98129f,0.97306f,0.95879f,0.93708f,0.90658f,0.86623f,0.81561f,0.7551f,0.68606f,0.61781f,0.54374f,0.46643f,0.38853f,0.31236f,0.2397f,0.17172f,0.10903f,0.051833f,0.000000f},
-   {0.97014f,0.97149f,0.96909f,0.96167f,0.94776f,0.92582f,0.89443f,0.85257f,0.8f,0.73744f,0.66667f,0.60336f,0.53333f,0.45908f,0.38333f,0.30861f,0.23694f,0.16971f,0.10768f,0.051131f,0.000000f},
-   {0.94868f,0.95185f,0.95103f,0.94477f,0.93138f,0.90914f,0.87652f,0.83262f,0.77748f,0.71236f,0.6396f,0.58284f,0.51832f,0.44833f,0.37565f,0.30305f,0.23285f,0.16672f,0.10567f,0.050098f,0.000000f},
-   {0.91915f,0.92464f,0.92587f,0.92113f,0.90844f,0.88583f,0.85169f,0.80528f,0.74715f,0.67926f,0.60471f,0.55576f,0.4981f,0.43361f,0.36501f,0.29528f,0.22711f,0.16255f,0.10287f,0.048665f,0.000000f},
-   {0.88047f,0.88868f,0.89238f,0.8895f,0.87771f,0.85472f,0.81886f,0.76969f,0.70851f,0.63818f,0.56257f,0.52214f,0.47234f,0.41445f,0.35094f,0.28491f,0.21943f,0.15697f,0.099153f,0.046773f,0.000000f},
-   {0.83205f,0.84317f,0.84958f,0.84882f,0.83812f,0.81482f,0.77724f,0.72546f,0.66169f,0.58985f,0.5145f,0.4826f,0.44113f,0.39063f,0.3331f,0.27161f,0.20953f,0.14979f,0.094398f,0.044378f,0.000000f},
-   {0.77396f,0.78787f,0.79699f,0.79846f,0.78899f,0.76558f,0.72661f,0.67284f,0.60758f,0.53574f,0.46236f,0.43834f,0.40505f,0.3623f,0.3114f,0.25519f,0.19725f,0.1409f,0.088554f,0.041467f,0.000000f},
-   {0.70711f,0.72332f,0.73485f,0.73843f,0.7303f,0.70711f,0.66742f,0.61283f,0.54772f,0.47781f,0.40825f,0.39094f,0.36515f,0.32998f,0.28604f,0.2357f,0.18257f,0.13031f,0.08165f,0.038069f,0.000000f},
-   {0.63324f,0.65094f,0.66425f,0.6696f,0.66281f,0.64032f,0.60095f,0.54712f,0.48415f,0.41816f,0.3541f,0.34213f,0.32277f,0.2946f,0.25755f,0.21344f,0.1657f,0.11816f,0.073805f,0.03426f,0.000000f},
-   {0.5547f,0.57287f,0.5871f,0.59367f,0.58817f,0.56695f,0.52915f,0.47789f,0.41906f,0.35878f,0.30151f,0.29355f,0.27937f,0.25733f,0.22678f,0.18898f,0.14704f,0.10476f,0.065233f,0.030151f,0.000000f},
-   {0.4741f,0.49168f,0.50587f,0.513f,0.50867f,0.4893f,0.45437f,0.40741f,0.35446f,0.30126f,0.25161f,0.24648f,0.23631f,0.21938f,0.19473f,0.1631f,0.12717f,0.090529f,0.056207f,0.025878f,0.000000f},
-   {0.39392f,0.40998f,0.42322f,0.43026f,0.42694f,0.40994f,0.37901f,0.33779f,0.292f,0.24672f,0.20508f,0.20186f,0.19467f,0.18189f,0.16243f,0.13665f,0.10674f,0.075928f,0.047024f,0.021578f,0.000000f},
-   {0.31623f,0.33005f,0.34164f,0.34803f,0.34555f,0.33129f,0.30521f,0.27072f,0.23285f,0.19587f,0.16222f,0.16026f,0.15523f,0.14577f,0.13081f,0.11043f,0.086387f,0.061417f,0.037959f,0.017371f,0.000000f},
-   {0.24254f,0.25367f,0.26312f,0.26846f,0.26667f,0.25538f,0.23464f,0.20737f,0.1777f,0.149f,0.12309f,0.12191f,0.11847f,0.11166f,0.10056f,0.085126f,0.066667f,0.047375f,0.029235f,0.013351f,0.000000f},
-   {0.17379f,0.18203f,0.18908f,0.19313f,0.19191f,0.18364f,0.1684f,0.14846f,0.1269f,0.10617f,0.087556f,0.086867f,0.084599f,0.07994f,0.072173f,0.061212f,0.047977f,0.034083f,0.021009f,0.0095807f,0.000000f},
-   {0.11043f,0.11578f,0.12038f,0.12304f,0.12228f,0.11695f,0.10712f,0.094287f,0.080466f,0.067231f,0.055385f,0.055007f,0.053644f,0.05077f,0.04591f,0.038984f,0.030571f,0.021713f,0.013375f,0.0060937f,0.000000f},
-   {0.052559f,0.055132f,0.057347f,0.058638f,0.058284f,0.055728f,0.051012f,0.044862f,0.038255f,0.03194f,0.026298f,0.026133f,0.025503f,0.024157f,0.021862f,0.018576f,0.014571f,0.010348f,0.0063719f,0.0029017f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_legacy_rs[21][21] = {
-   {0.000000f,0.052559f,0.11043f,0.17379f,0.24254f,0.31623f,0.39392f,0.4741f,0.5547f,0.63324f,0.70711f,0.77396f,0.83205f,0.88047f,0.91915f,0.94868f,0.97014f,0.98478f,0.99388f,0.99862f,1.000000f},
-   {0.000000f,0.052493f,0.1103f,0.1736f,0.24228f,0.31588f,0.39343f,0.4734f,0.5537f,0.63182f,0.70516f,0.77222f,0.83055f,0.87918f,0.91801f,0.94763f,0.96912f,0.98372f,0.99274f,0.99737f,0.99862f},
-   {0.000000f,0.052267f,0.10987f,0.17296f,0.2414f,0.31468f,0.39176f,0.47102f,0.55028f,0.62698f,0.69854f,0.76631f,0.82541f,0.87474f,0.9141f,0.94403f,0.9656f,0.98008f,0.98883f,0.99308f,0.99388f},
-   {0.000000f,0.051833f,0.10903f,0.17172f,0.2397f,0.31236f,0.38853f,0.46643f,0.54374f,0.61781f,0.68606f,0.7551f,0.81561f,0.86623f,0.90658f,0.93708f,0.95879f,0.97306f,0.98129f,0.98482f,0.98478f},
-   {0.000000f,0.051131f,0.10768f,0.16971f,0.23694f,0.30861f,0.38333f,0.45908f,0.53333f,0.60336f,0.66667f,0.73744f,0.8f,0.85257f,0.89443f,0.92582f,0.94776f,0.96167f,0.96909f,0.97149f,0.97014f},
-   {0.000000f,0.050098f,0.10567f,0.16672f,0.23285f,0.30305f,0.37565f,0.44833f,0.51832f,0.58284f,0.6396f,0.71236f,0.77748f,0.83262f,0.87652f,0.90914f,0.93138f,0.94477f,0.95103f,0.95185f,0.94868f},
-   {0.000000f,0.048665f,0.10287f,0.16255f,0.22711f,0.29528f,0.36501f,0.43361f,0.4981f,0.55576f,0.60471f,0.67926f,0.74715f,0.80528f,0.85169f,0.88583f,0.90844f,0.92113f,0.92587f,0.92464f,0.91915f},
-   {0.000000f,0.046773f,0.099153f,0.15697f,0.21943f,0.28491f,0.35094f,0.41445f,0.47234f,0.52214f,0.56257f,0.63818f,0.70851f,0.76969f,0.81886f,0.85472f,0.87771f,0.8895f,0.89238f,0.88868f,0.88047f},
-   {0.000000f,0.044378f,0.094398f,0.14979f,0.20953f,0.27161f,0.3331f,0.39063f,0.44113f,0.4826f,0.5145f,0.58985f,0.66169f,0.72546f,0.77724f,0.81482f,0.83812f,0.84882f,0.84958f,0.84317f,0.83205f},
-   {0.000000f,0.041467f,0.088554f,0.1409f,0.19725f,0.25519f,0.3114f,0.3623f,0.40505f,0.43834f,0.46236f,0.53574f,0.60758f,0.67284f,0.72661f,0.76558f,0.78899f,0.79846f,0.79699f,0.78787f,0.77396f},
-   {0.000000f,0.038069f,0.08165f,0.13031f,0.18257f,0.2357f,0.28604f,0.32998f,0.36515f,0.39094f,0.40825f,0.47781f,0.54772f,0.61283f,0.66742f,0.70711f,0.7303f,0.73843f,0.73485f,0.72332f,0.70711f},
-   {0.000000f,0.03426f,0.073805f,0.11816f,0.1657f,0.21344f,0.25755f,0.2946f,0.32277f,0.34213f,0.3541f,0.41816f,0.48415f,0.54712f,0.60095f,0.64032f,0.66281f,0.6696f,0.66425f,0.65094f,0.63324f},
-   {0.000000f,0.030151f,0.065233f,0.10476f,0.14704f,0.18898f,0.22678f,0.25733f,0.27937f,0.29355f,0.30151f,0.35878f,0.41906f,0.47789f,0.52915f,0.56695f,0.58817f,0.59367f,0.5871f,0.57287f,0.5547f},
-   {0.000000f,0.025878f,0.056207f,0.090529f,0.12717f,0.1631f,0.19473f,0.21938f,0.23631f,0.24648f,0.25161f,0.30126f,0.35446f,0.40741f,0.45437f,0.4893f,0.50867f,0.513f,0.50587f,0.49168f,0.4741f},
-   {0.000000f,0.021578f,0.047024f,0.075928f,0.10674f,0.13665f,0.16243f,0.18189f,0.19467f,0.20186f,0.20508f,0.24672f,0.292f,0.33779f,0.37901f,0.40994f,0.42694f,0.43026f,0.42322f,0.40998f,0.39392f},
-   {0.000000f,0.017371f,0.037959f,0.061417f,0.086387f,0.11043f,0.13081f,0.14577f,0.15523f,0.16026f,0.16222f,0.19587f,0.23285f,0.27072f,0.30521f,0.33129f,0.34555f,0.34803f,0.34164f,0.33005f,0.31623f},
-   {0.000000f,0.013351f,0.029235f,0.047375f,0.066667f,0.085126f,0.10056f,0.11166f,0.11847f,0.12191f,0.12309f,0.149f,0.1777f,0.20737f,0.23464f,0.25538f,0.26667f,0.26846f,0.26312f,0.25367f,0.24254f},
-   {0.000000f,0.0095807f,0.021009f,0.034083f,0.047977f,0.061212f,0.072173f,0.07994f,0.084599f,0.086867f,0.087556f,0.10617f,0.1269f,0.14846f,0.1684f,0.18364f,0.19191f,0.19313f,0.18908f,0.18203f,0.17379f},
-   {0.000000f,0.0060937f,0.013375f,0.021713f,0.030571f,0.038984f,0.04591f,0.05077f,0.053644f,0.055007f,0.055385f,0.067231f,0.080466f,0.094287f,0.10712f,0.11695f,0.12228f,0.12304f,0.12038f,0.11578f,0.11043f},
-   {0.000000f,0.0029017f,0.0063719f,0.010348f,0.014571f,0.018576f,0.021862f,0.024157f,0.025503f,0.026133f,0.026298f,0.03194f,0.038255f,0.044862f,0.051012f,0.055728f,0.058284f,0.058638f,0.057347f,0.055132f,0.052559f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-
-static constexpr const float map_lfe_lfe[21][21] = {
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f},
-   {0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}};
-// clang-format on
-
-static constexpr const FreeSurroundDecoder::LUT lut_stereo[] = {
-  map_stereo_lf,
-  map_stereo_rf,
-  map_lfe_lfe,
-};
-static constexpr const FreeSurroundDecoder::LUT lut_4point1[] = {
-  map_4point1_lf, map_4point1_rf, map_4point1_ls, map_4point1_rs, map_lfe_lfe,
-};
-static constexpr const FreeSurroundDecoder::LUT lut_5point1[] = {
-  map_5point1_lf, map_5point1_cf, map_5point1_rf, map_5point1_ls, map_5point1_rs, map_lfe_lfe,
-};
-static constexpr const FreeSurroundDecoder::LUT lut_7point1[] = {
-  map_7point1_lf,  map_7point1_cf, map_7point1_rf, map_7point1_lsm,
-  map_7point1_rsm, map_7point1_ls, map_7point1_rs, map_lfe_lfe,
-};
-static constexpr const FreeSurroundDecoder::LUT lut_legacy[] = {
-  map_legacy_lf, map_legacy_cf, map_legacy_rf, map_legacy_ls, map_legacy_rs, map_lfe_lfe,
-};
-
-constinit const std::array(FreeSurroundDecoder::ChannelSetup::MaxCount)>
-  FreeSurroundDecoder::s_channel_maps = {{
-    {lut_stereo, map_stereo_xsf},   // Stereo
-    {lut_4point1, map_4point1_xsf}, // Quadraphonic
-    {lut_5point1, map_5point1_xsf}, // Surround51
-    {lut_7point1, map_7point1_xsf}, // Surround71
-    {lut_legacy, map_legacy_xsf},   // Legacy
-  }};
diff --git a/dep/freesurround/src/freesurround_decoder.cpp b/dep/freesurround/src/freesurround_decoder.cpp
deleted file mode 100644
index 2fa1bdfee..000000000
--- a/dep/freesurround/src/freesurround_decoder.cpp
+++ /dev/null
@@ -1,319 +0,0 @@
-// SPDX-FileCopyrightText: 2007-2010 Christian Kothe, 2024 Connor McLaughlin 
-// SPDX-License-Identifier: GPL-2.0+
-
-#include "freesurround_decoder.h"
-
-#include 
-#include 
-
-static constexpr float pi = 3.141592654f;
-static constexpr float epsilon = 0.000001f;
-
-template
-static inline T sqr(T x)
-{
-  return x * x;
-}
-
-template
-static inline T clamp1(T x)
-{
-  return std::clamp(x, static_cast(-1), static_cast(1));
-}
-
-template
-static inline T sign(T x)
-{
-  return x < static_cast(0) ? static_cast(-1) : (x > static_cast(0) ? static_cast(1) : static_cast(0));
-}
-
-static inline double amplitude(const std::complex& x)
-{
-  return sqrt(sqr(x.real()) + sqr(x.imag()));
-}
-static inline double phase(const std::complex& x)
-{
-  return atan2(x.imag(), x.real());
-}
-static inline std::complex polar(double a, double p)
-{
-  return std::complex(a * std::cos(p), a * std::sin(p));
-}
-
-// get the distance of the soundfield edge, along a given angle
-static inline double edgedistance(double a)
-{
-  return std::min(std::sqrt(1 + sqr(std::tan(a))), std::sqrt(1 + sqr(1 / std::tan(a))));
-}
-
-static void transform_decode(double a, double p, double& x, double& y);
-
-// apply a circular_wrap transformation to some position
-static void transform_circular_wrap(double& x, double& y, double refangle);
-
-// apply a focus transformation to some position
-static void transform_focus(double& x, double& y, double focus);
-
-// get the index (and fractional offset!) in a piecewise-linear channel allocation grid
-int FreeSurroundDecoder::MapToGrid(double& x)
-{
-  const double gp = ((x + 1) * 0.5) * (grid_res - 1);
-  const double i = std::min(static_cast(grid_res - 2), std::floor(gp));
-  x = gp - i;
-  return static_cast(i);
-}
-
-FreeSurroundDecoder::FreeSurroundDecoder(ChannelSetup setup, unsigned blocksize)
-  : cmap(s_channel_maps[static_cast(setup)])
-{
-  N = blocksize;
-  C = static_cast(cmap.luts.size());
-  wnd.resize(blocksize);
-  lt.resize(blocksize);
-  rt.resize(blocksize);
-  dst.resize(blocksize);
-  lf.resize(blocksize / 2 + 1);
-  rf.resize(blocksize / 2 + 1);
-
-  forward = kiss_fftr_alloc(blocksize, 0, 0, 0);
-  inverse = kiss_fftr_alloc(blocksize, 1, 0, 0);
-
-  // allocate per-channel buffers
-  inbuf.resize(3 * N);
-  outbuf.resize((N + N / 2) * C);
-  signal.resize(C, std::vector(N));
-
-  // init the window function
-  for (unsigned k = 0; k < N; k++)
-    wnd[k] = sqrt(0.5 * (1 - cos(2 * pi * k / N)) / N);
-
-  // set default parameters
-  SetCircularWrap(90);
-  SetShift(0);
-  SetDepth(1);
-  SetFocus(0);
-  SetCenterImage(1);
-  SetFrontSeparation(1);
-  SetRearSeparation(1);
-  SetLowCutoff(40.0f / 22050.0f);
-  SetHighCutoff(90.0f / 22050.0f);
-  SetBassRedirection(false);
-}
-
-FreeSurroundDecoder::~FreeSurroundDecoder()
-{
-  kiss_fftr_free(forward);
-  kiss_fftr_free(inverse);
-}
-
-// decode a stereo chunk, produces a multichannel chunk of the same size (lagged)
-float* FreeSurroundDecoder::Decode(float* input)
-{
-  // append incoming data to the end of the input buffer
-  memcpy(&inbuf[N], &input[0], 8 * N);
-  // process first and second half, overlapped
-  BufferedDecode(&inbuf[0]);
-  BufferedDecode(&inbuf[N]);
-  // shift last half of the input to the beginning (for overlapping with a future block)
-  memcpy(&inbuf[0], &inbuf[2 * N], 4 * N);
-  buffer_empty = false;
-  return &outbuf[0];
-}
-
-// flush the internal buffers
-void FreeSurroundDecoder::Flush()
-{
-  memset(&outbuf[0], 0, outbuf.size() * 4);
-  memset(&inbuf[0], 0, inbuf.size() * 4);
-  buffer_empty = true;
-}
-
-// number of samples currently held in the buffer
-unsigned FreeSurroundDecoder::GetSamplesBuffered()
-{
-  return buffer_empty ? 0 : N / 2;
-}
-
-// set soundfield & rendering parameters
-void FreeSurroundDecoder::SetCircularWrap(float v)
-{
-  circular_wrap = v;
-}
-void FreeSurroundDecoder::SetShift(float v)
-{
-  shift = v;
-}
-void FreeSurroundDecoder::SetDepth(float v)
-{
-  depth = v;
-}
-void FreeSurroundDecoder::SetFocus(float v)
-{
-  focus = v;
-}
-void FreeSurroundDecoder::SetCenterImage(float v)
-{
-  center_image = v;
-}
-void FreeSurroundDecoder::SetFrontSeparation(float v)
-{
-  front_separation = v;
-}
-void FreeSurroundDecoder::SetRearSeparation(float v)
-{
-  rear_separation = v;
-}
-void FreeSurroundDecoder::SetLowCutoff(float v)
-{
-  lo_cut = v * (N / 2);
-}
-void FreeSurroundDecoder::SetHighCutoff(float v)
-{
-  hi_cut = v * (N / 2);
-}
-void FreeSurroundDecoder::SetBassRedirection(bool v)
-{
-  use_lfe = v;
-}
-
-// decode a block of data and overlap-add it into outbuf
-void FreeSurroundDecoder::BufferedDecode(float* input)
-{
-  // demultiplex and apply window function
-  for (unsigned k = 0; k < N; k++)
-  {
-    lt[k] = wnd[k] * input[k * 2 + 0];
-    rt[k] = wnd[k] * input[k * 2 + 1];
-  }
-
-  // map into spectral domain
-  kiss_fftr(forward, <[0], (kiss_fft_cpx*)&lf[0]);
-  kiss_fftr(forward, &rt[0], (kiss_fft_cpx*)&rf[0]);
-
-  // compute multichannel output signal in the spectral domain
-  for (unsigned f = 1; f < N / 2; f++)
-  {
-    // get Lt/Rt amplitudes & phases
-    double ampL = amplitude(lf[f]), ampR = amplitude(rf[f]);
-    double phaseL = phase(lf[f]), phaseR = phase(rf[f]);
-    // calculate the amplitude & phase differences
-    double ampDiff = clamp1((ampL + ampR < epsilon) ? 0 : (ampR - ampL) / (ampR + ampL));
-    double phaseDiff = abs(phaseL - phaseR);
-    if (phaseDiff > pi)
-      phaseDiff = 2 * pi - phaseDiff;
-
-    // decode into x/y soundfield position
-    double x, y;
-    transform_decode(ampDiff, phaseDiff, x, y);
-    // add wrap control
-    transform_circular_wrap(x, y, circular_wrap);
-    // add shift control
-    y = clamp1(y - shift);
-    // add depth control
-    y = clamp1(1 - (1 - y) * depth);
-    // add focus control
-    transform_focus(x, y, focus);
-    // add crossfeed control
-    x = clamp1(x * (front_separation * (1 + y) / 2 + rear_separation * (1 - y) / 2));
-
-    // get total signal amplitude
-    double amp_total = sqrt(ampL * ampL + ampR * ampR);
-    // and total L/C/R signal phases
-    double phase_of[] = {phaseL, atan2(lf[f].imag() + rf[f].imag(), lf[f].real() + rf[f].real()), phaseR};
-    // compute 2d channel map indexes p/q and update x/y to fractional offsets in the map grid
-    int p = MapToGrid(x), q = MapToGrid(y);
-    // map position to channel volumes
-    for (unsigned c = 0; c < C - 1; c++)
-    {
-      // look up channel map at respective position (with bilinear interpolation) and build the signal
-      const auto& a = cmap.luts[c];
-      signal[c][f] = polar(amp_total * ((1 - x) * (1 - y) * a[q][p] + x * (1 - y) * a[q][p + 1] +
-                                        (1 - x) * y * a[q + 1][p] + x * y * a[q + 1][p + 1]),
-                           phase_of[1 + (int)sign(cmap.xsf[c])]);
-    }
-
-    // optionally redirect bass
-    if (use_lfe && f < hi_cut)
-    {
-      // level of LFE channel according to normalized frequency
-      double lfe_level = f < lo_cut ? 1 : 0.5 * (1 + cos(pi * (f - lo_cut) / (hi_cut - lo_cut)));
-      // assign LFE channel
-      signal[C - 1][f] = lfe_level * polar(amp_total, phase_of[1]);
-      // subtract the signal from the other channels
-      for (unsigned c = 0; c < C - 1; c++)
-        signal[c][f] *= (1 - lfe_level);
-    }
-  }
-
-  // shift the last 2/3 to the first 2/3 of the output buffer
-  memmove(&outbuf[0], &outbuf[C * N / 2], N * C * 4);
-  // and clear the rest
-  memset(&outbuf[C * N], 0, C * 4 * N / 2);
-  // backtransform each channel and overlap-add
-  for (unsigned c = 0; c < C; c++)
-  {
-    // back-transform into time domain
-    kiss_fftri(inverse, (kiss_fft_cpx*)&signal[c][0], &dst[0]);
-    // add the result to the last 2/3 of the output buffer, windowed (and remultiplex)
-    for (unsigned k = 0; k < N; k++)
-      outbuf[C * (k + N / 2) + c] = static_cast(outbuf[C * (k + N / 2) + c] + (wnd[k] * dst[k]));
-  }
-}
-
-// transform amp/phase difference space into x/y soundfield space
-void transform_decode(double a, double p, double& x, double& y)
-{
-  x = clamp1(1.0047 * a + 0.46804 * a * p * p * p - 0.2042 * a * p * p * p * p +
-             0.0080586 * a * p * p * p * p * p * p * p - 0.0001526 * a * p * p * p * p * p * p * p * p * p * p -
-             0.073512 * a * a * a * p - 0.2499 * a * a * a * p * p * p * p +
-             0.016932 * a * a * a * p * p * p * p * p * p * p -
-             0.00027707 * a * a * a * p * p * p * p * p * p * p * p * p * p +
-             0.048105 * a * a * a * a * a * p * p * p * p * p * p * p -
-             0.0065947 * a * a * a * a * a * p * p * p * p * p * p * p * p * p * p +
-             0.0016006 * a * a * a * a * a * p * p * p * p * p * p * p * p * p * p * p -
-             0.0071132 * a * a * a * a * a * a * a * p * p * p * p * p * p * p * p * p +
-             0.0022336 * a * a * a * a * a * a * a * p * p * p * p * p * p * p * p * p * p * p -
-             0.0004804 * a * a * a * a * a * a * a * p * p * p * p * p * p * p * p * p * p * p * p);
-  y = clamp1(0.98592 - 0.62237 * p + 0.077875 * p * p - 0.0026929 * p * p * p * p * p + 0.4971 * a * a * p -
-             0.00032124 * a * a * p * p * p * p * p * p +
-             9.2491e-006 * a * a * a * a * p * p * p * p * p * p * p * p * p * p +
-             0.051549 * a * a * a * a * a * a * a * a + 1.0727e-014 * a * a * a * a * a * a * a * a * a * a);
-}
-
-// apply a circular_wrap transformation to some position
-void transform_circular_wrap(double& x, double& y, double refangle)
-{
-  if (refangle == 90)
-    return;
-  refangle = refangle * pi / 180;
-  double baseangle = 90 * pi / 180;
-  // translate into edge-normalized polar coordinates
-  double ang = atan2(x, y), len = sqrt(x * x + y * y);
-  len = len / edgedistance(ang);
-  // apply circular_wrap transform
-  if (abs(ang) < baseangle / 2)
-    // angle falls within the front region (to be enlarged)
-    ang *= refangle / baseangle;
-  else
-    // angle falls within the rear region (to be shrunken)
-    ang = pi - (-(((refangle - 2 * pi) * (pi - abs(ang)) * sign(ang)) / (2 * pi - baseangle)));
-  // translate back into soundfield position
-  len = len * edgedistance(ang);
-  x = clamp1(sin(ang) * len);
-  y = clamp1(cos(ang) * len);
-}
-
-// apply a focus transformation to some position
-void transform_focus(double& x, double& y, double focus)
-{
-  if (focus == 0)
-    return;
-  // translate into edge-normalized polar coordinates
-  double ang = atan2(x, y), len = clamp1(sqrt(x * x + y * y) / edgedistance(ang));
-  // apply focus
-  len = focus > 0 ? 1 - pow(1 - len, 1 + focus * 20) : pow(len, 1 - focus * 20);
-  // back-transform into euclidian soundfield position
-  len = len * edgedistance(ang);
-  x = clamp1(sin(ang) * len);
-  y = clamp1(cos(ang) * len);
-}
diff --git a/duckstation.sln b/duckstation.sln
index 9de94a59c..5fbece426 100644
--- a/duckstation.sln
+++ b/duckstation.sln
@@ -60,8 +60,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rapidyaml", "dep\rapidyaml\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "kissfft", "dep\kissfft\kissfft.vcxproj", "{A81D3F54-C58A-4B2D-8076-D4E483DB2E65}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freesurround", "dep\freesurround\freesurround.vcxproj", "{1B0366E5-6F82-47B4-9FDD-D699C86AA077}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|ARM64 = Debug|ARM64
@@ -762,34 +760,6 @@ Global
 		{A81D3F54-C58A-4B2D-8076-D4E483DB2E65}.ReleaseLTCG-Clang|ARM64.Build.0 = ReleaseLTCG-Clang|ARM64
 		{A81D3F54-C58A-4B2D-8076-D4E483DB2E65}.ReleaseLTCG-Clang|x64.ActiveCfg = ReleaseLTCG-Clang|x64
 		{A81D3F54-C58A-4B2D-8076-D4E483DB2E65}.ReleaseLTCG-Clang|x64.Build.0 = ReleaseLTCG-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug|ARM64.ActiveCfg = Debug|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug|x64.ActiveCfg = Debug|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug|x64.Build.0 = Debug|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug-Clang|ARM64.ActiveCfg = Debug-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug-Clang|ARM64.Build.0 = Debug-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug-Clang|x64.ActiveCfg = Debug-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Debug-Clang|x64.Build.0 = Debug-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast|ARM64.ActiveCfg = DebugFast|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast|x64.ActiveCfg = DebugFast|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast|x64.Build.0 = DebugFast|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast-Clang|ARM64.ActiveCfg = DebugFast-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast-Clang|ARM64.Build.0 = DebugFast-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast-Clang|x64.ActiveCfg = DebugFast-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.DebugFast-Clang|x64.Build.0 = DebugFast-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release|ARM64.ActiveCfg = Release|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release|x64.ActiveCfg = Release|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release|x64.Build.0 = Release|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release-Clang|ARM64.ActiveCfg = Release-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release-Clang|ARM64.Build.0 = Release-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release-Clang|x64.ActiveCfg = Release-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.Release-Clang|x64.Build.0 = Release-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG|ARM64.ActiveCfg = ReleaseLTCG|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG|x64.ActiveCfg = ReleaseLTCG|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG|x64.Build.0 = ReleaseLTCG|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG-Clang|ARM64.ActiveCfg = ReleaseLTCG-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG-Clang|ARM64.Build.0 = ReleaseLTCG-Clang|ARM64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG-Clang|x64.ActiveCfg = ReleaseLTCG-Clang|x64
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077}.ReleaseLTCG-Clang|x64.Build.0 = ReleaseLTCG-Clang|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -813,7 +783,6 @@ Global
 		{27B8D4BB-4F01-4432-BC14-9BF6CA458EEE} = {BA490C0E-497D-4634-A21E-E65012006385}
 		{1AD23A8A-4C20-434C-AE6B-0E07759EEB1E} = {BA490C0E-497D-4634-A21E-E65012006385}
 		{A81D3F54-C58A-4B2D-8076-D4E483DB2E65} = {BA490C0E-497D-4634-A21E-E65012006385}
-		{1B0366E5-6F82-47B4-9FDD-D699C86AA077} = {BA490C0E-497D-4634-A21E-E65012006385}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {26E40B32-7C1D-48D0-95F4-1A500E054028}
diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp
index 3b0f0be2f..d2650eef4 100644
--- a/src/core/fullscreen_ui.cpp
+++ b/src/core/fullscreen_ui.cpp
@@ -4987,11 +4987,6 @@ void FullscreenUI::DrawAudioSettingsPage()
     FSUI_CSTR("The audio backend determines how frames produced by the emulator are submitted to the host."), "Audio",
     "Backend", AudioStream::DEFAULT_BACKEND, &AudioStream::ParseBackendName, &AudioStream::GetBackendName,
     &AudioStream::GetBackendDisplayName, AudioBackend::Count);
-  DrawEnumSetting(bsi, FSUI_CSTR("Expansion Mode"),
-                  FSUI_CSTR("Determines how audio is expanded from stereo to surround for supported games."), "Audio",
-                  "ExpansionMode", AudioStreamParameters::DEFAULT_EXPANSION_MODE, &AudioStream::ParseExpansionMode,
-                  &AudioStream::GetExpansionModeName, &AudioStream::GetExpansionModeDisplayName,
-                  AudioExpansionMode::Count);
   DrawEnumSetting(bsi, FSUI_CSTR("Stretch Mode"),
                   FSUI_CSTR("Determines quality of audio when not running at 100% speed."), "Audio", "StretchMode",
                   AudioStreamParameters::DEFAULT_STRETCH_MODE, &AudioStream::ParseStretchMode,
@@ -7341,7 +7336,6 @@ TRANSLATE_NOOP("FullscreenUI", "Depth Clear Threshold");
 TRANSLATE_NOOP("FullscreenUI", "Desktop Mode");
 TRANSLATE_NOOP("FullscreenUI", "Details");
 TRANSLATE_NOOP("FullscreenUI", "Details unavailable for game not scanned in game list.");
-TRANSLATE_NOOP("FullscreenUI", "Determines how audio is expanded from stereo to surround for supported games.");
 TRANSLATE_NOOP("FullscreenUI", "Determines how large the on-screen messages and monitor are.");
 TRANSLATE_NOOP("FullscreenUI", "Determines how much latency there is between the audio being picked up by the host API, and played through speakers.");
 TRANSLATE_NOOP("FullscreenUI", "Determines how much of the area typically not visible on a consumer TV set to crop/hide.");
@@ -7419,7 +7413,6 @@ TRANSLATE_NOOP("FullscreenUI", "Exit And Save State");
 TRANSLATE_NOOP("FullscreenUI", "Exit DuckStation");
 TRANSLATE_NOOP("FullscreenUI", "Exit Without Saving");
 TRANSLATE_NOOP("FullscreenUI", "Exits Big Picture mode, returning to the desktop interface.");
-TRANSLATE_NOOP("FullscreenUI", "Expansion Mode");
 TRANSLATE_NOOP("FullscreenUI", "FMV Chroma Smoothing");
 TRANSLATE_NOOP("FullscreenUI", "Failed to copy text to clipboard.");
 TRANSLATE_NOOP("FullscreenUI", "Failed to delete save state.");
diff --git a/src/core/host.h b/src/core/host.h
index a66e78727..0d3aeae01 100644
--- a/src/core/host.h
+++ b/src/core/host.h
@@ -19,7 +19,6 @@ class Error;
 class SettingsInterface;
 struct WindowInfo;
 enum class AudioBackend : u8;
-enum class AudioExpansionMode : u8;
 enum class AudioStretchMode : u8;
 enum class RenderAPI : u32;
 class AudioStream;
diff --git a/src/core/spu.cpp b/src/core/spu.cpp
index 394ff41c9..0a9138203 100644
--- a/src/core/spu.cpp
+++ b/src/core/spu.cpp
@@ -469,9 +469,8 @@ void SPU::Initialize()
 
 void SPU::CreateOutputStream()
 {
-  INFO_LOG("Creating '{}' audio stream, sample rate = {}, expansion = {}, buffer = {}, latency = {}{}, stretching = {}",
+  INFO_LOG("Creating '{}' audio stream, sample rate = {}, buffer = {}, latency = {}{}, stretching = {}",
            AudioStream::GetBackendName(g_settings.audio_backend), static_cast(SAMPLE_RATE),
-           AudioStream::GetExpansionModeName(g_settings.audio_stream_parameters.expansion_mode),
            g_settings.audio_stream_parameters.buffer_ms, g_settings.audio_stream_parameters.output_latency_ms,
            g_settings.audio_stream_parameters.output_latency_minimal ? " (or minimal)" : "",
            AudioStream::GetStretchModeName(g_settings.audio_stream_parameters.stretch_mode));
diff --git a/src/duckstation-qt/audiosettingswidget.cpp b/src/duckstation-qt/audiosettingswidget.cpp
index c044d2a89..d068cc6d7 100644
--- a/src/duckstation-qt/audiosettingswidget.cpp
+++ b/src/duckstation-qt/audiosettingswidget.cpp
@@ -24,12 +24,6 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsWindow* dialog, QWidget* parent
   for (u32 i = 0; i < static_cast(AudioBackend::Count); i++)
     m_ui.audioBackend->addItem(QString::fromUtf8(AudioStream::GetBackendDisplayName(static_cast(i))));
 
-  for (u32 i = 0; i < static_cast(AudioExpansionMode::Count); i++)
-  {
-    m_ui.expansionMode->addItem(
-      QString::fromUtf8(AudioStream::GetExpansionModeDisplayName(static_cast(i))));
-  }
-
   for (u32 i = 0; i < static_cast(AudioStretchMode::Count); i++)
   {
     m_ui.stretchMode->addItem(
@@ -39,9 +33,6 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsWindow* dialog, QWidget* parent
   SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.audioBackend, "Audio", "Backend",
                                                &AudioStream::ParseBackendName, &AudioStream::GetBackendName,
                                                AudioStream::DEFAULT_BACKEND);
-  SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.expansionMode, "Audio", "ExpansionMode",
-                                               &AudioStream::ParseExpansionMode, &AudioStream::GetExpansionModeName,
-                                               AudioStreamParameters::DEFAULT_EXPANSION_MODE);
   SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.stretchMode, "Audio", "StretchMode",
                                                &AudioStream::ParseStretchMode, &AudioStream::GetStretchModeName,
                                                AudioStreamParameters::DEFAULT_STRETCH_MODE);
@@ -53,11 +44,8 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsWindow* dialog, QWidget* parent
                                                AudioStreamParameters::DEFAULT_OUTPUT_LATENCY_MINIMAL);
   SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.muteCDAudio, "CDROM", "MuteCDAudio", false);
   connect(m_ui.audioBackend, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::updateDriverNames);
-  connect(m_ui.expansionMode, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::onExpansionModeChanged);
-  connect(m_ui.expansionSettings, &QToolButton::clicked, this, &AudioSettingsWidget::onExpansionSettingsClicked);
   connect(m_ui.stretchMode, &QComboBox::currentIndexChanged, this, &AudioSettingsWidget::onStretchModeChanged);
   connect(m_ui.stretchSettings, &QToolButton::clicked, this, &AudioSettingsWidget::onStretchSettingsClicked);
-  onExpansionModeChanged();
   onStretchModeChanged();
   updateDriverNames();
 
@@ -109,11 +97,6 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsWindow* dialog, QWidget* parent
   dialog->registerWidgetHelp(m_ui.muteCDAudio, tr("Mute CD Audio"), tr("Unchecked"),
                              tr("Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable "
                                 "background music in some games."));
-  dialog->registerWidgetHelp(m_ui.expansionMode, tr("Expansion Mode"), tr("Disabled (Stereo)"),
-                             tr("Determines how audio is expanded from stereo to surround for supported games. This "
-                                "includes games that support Dolby Pro Logic/Pro Logic II."));
-  dialog->registerWidgetHelp(m_ui.expansionSettings, tr("Expansion Settings"), tr("N/A"),
-                             tr("These settings fine-tune the behavior of the FreeSurround-based channel expander."));
   dialog->registerWidgetHelp(
     m_ui.stretchMode, tr("Stretch Mode"), tr("Time Stretching"),
     tr("When running outside of 100% speed, adjusts the tempo on audio instead of dropping frames. Produces "
@@ -131,34 +114,6 @@ AudioSettingsWidget::AudioSettingsWidget(SettingsWindow* dialog, QWidget* parent
 
 AudioSettingsWidget::~AudioSettingsWidget() = default;
 
-AudioExpansionMode AudioSettingsWidget::getEffectiveExpansionMode() const
-{
-  return AudioStream::ParseExpansionMode(
-           m_dialog
-             ->getEffectiveStringValue("Audio", "ExpansionMode",
-                                       AudioStream::GetExpansionModeName(AudioStreamParameters::DEFAULT_EXPANSION_MODE))
-             .c_str())
-    .value_or(AudioStreamParameters::DEFAULT_EXPANSION_MODE);
-}
-
-u32 AudioSettingsWidget::getEffectiveExpansionBlockSize() const
-{
-  const AudioExpansionMode expansion_mode = getEffectiveExpansionMode();
-  if (expansion_mode == AudioExpansionMode::Disabled)
-    return 0;
-
-  const u32 config_block_size =
-    m_dialog->getEffectiveIntValue("Audio", "ExpandBlockSize", AudioStreamParameters::DEFAULT_EXPAND_BLOCK_SIZE);
-  return std::has_single_bit(config_block_size) ? config_block_size : std::bit_ceil(config_block_size);
-}
-
-void AudioSettingsWidget::onExpansionModeChanged()
-{
-  const AudioExpansionMode expansion_mode = getEffectiveExpansionMode();
-  m_ui.expansionSettings->setEnabled(expansion_mode != AudioExpansionMode::Disabled);
-  updateLatencyLabel();
-}
-
 void AudioSettingsWidget::onStretchModeChanged()
 {
   const AudioStretchMode stretch_mode =
@@ -253,7 +208,6 @@ void AudioSettingsWidget::updateDeviceNames()
 
 void AudioSettingsWidget::updateLatencyLabel()
 {
-  const u32 expand_buffer_ms = AudioStream::GetMSForBufferSize(SPU::SAMPLE_RATE, getEffectiveExpansionBlockSize());
   const u32 config_buffer_ms =
     m_dialog->getEffectiveIntValue("Audio", "BufferMS", AudioStreamParameters::DEFAULT_BUFFER_MS);
   const u32 config_output_latency_ms =
@@ -270,34 +224,14 @@ void AudioSettingsWidget::updateLatencyLabel()
                                   config_output_latency_ms;
   if (output_latency_ms > 0)
   {
-    if (expand_buffer_ms > 0)
-    {
-      m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (%2 ms buffer + %3 ms expand + %4 ms output)")
-                                     .arg(config_buffer_ms + expand_buffer_ms + output_latency_ms)
-                                     .arg(config_buffer_ms)
-                                     .arg(expand_buffer_ms)
-                                     .arg(output_latency_ms));
-    }
-    else
-    {
-      m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (%2 ms buffer + %3 ms output)")
-                                     .arg(config_buffer_ms + output_latency_ms)
-                                     .arg(config_buffer_ms)
-                                     .arg(output_latency_ms));
-    }
+    m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (%2 ms buffer + %3 ms output)")
+                                   .arg(config_buffer_ms + output_latency_ms)
+                                   .arg(config_buffer_ms)
+                                   .arg(output_latency_ms));
   }
   else
   {
-    if (expand_buffer_ms > 0)
-    {
-      m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (%2 ms expand, minimum output latency unknown)")
-                                     .arg(expand_buffer_ms + config_buffer_ms)
-                                     .arg(expand_buffer_ms));
-    }
-    else
-    {
-      m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (minimum output latency unknown)").arg(config_buffer_ms));
-    }
+    m_ui.bufferingLabel->setText(tr("Maximum Latency: %1 ms (minimum output latency unknown)").arg(config_buffer_ms));
   }
 }
 
@@ -347,95 +281,6 @@ void AudioSettingsWidget::onOutputMutedChanged(int new_state)
   g_emu_thread->setAudioOutputMuted(muted);
 }
 
-void AudioSettingsWidget::onExpansionSettingsClicked()
-{
-  QDialog dlg(QtUtils::GetRootWidget(this));
-  Ui::AudioExpansionSettingsDialog dlgui;
-  dlgui.setupUi(&dlg);
-  dlgui.icon->setPixmap(QIcon::fromTheme(QStringLiteral("volume-up-line")).pixmap(32, 32));
-
-  SettingsInterface* sif = m_dialog->getSettingsInterface();
-  SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.blockSize, "Audio", "ExpandBlockSize",
-                                              AudioStreamParameters::DEFAULT_EXPAND_BLOCK_SIZE, 0);
-  QtUtils::BindLabelToSlider(dlgui.blockSize, dlgui.blockSizeLabel);
-  SettingWidgetBinder::BindWidgetToFloatSetting(sif, dlgui.circularWrap, "Audio", "ExpandCircularWrap",
-                                                AudioStreamParameters::DEFAULT_EXPAND_CIRCULAR_WRAP);
-  QtUtils::BindLabelToSlider(dlgui.circularWrap, dlgui.circularWrapLabel);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.shift, "Audio", "ExpandShift", 100.0f,
-                                                     AudioStreamParameters::DEFAULT_EXPAND_SHIFT);
-  QtUtils::BindLabelToSlider(dlgui.shift, dlgui.shiftLabel, 100.0f);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.depth, "Audio", "ExpandDepth", 10.0f,
-                                                     AudioStreamParameters::DEFAULT_EXPAND_DEPTH);
-  QtUtils::BindLabelToSlider(dlgui.depth, dlgui.depthLabel, 10.0f);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.focus, "Audio", "ExpandFocus", 100.0f,
-                                                     AudioStreamParameters::DEFAULT_EXPAND_FOCUS);
-  QtUtils::BindLabelToSlider(dlgui.focus, dlgui.focusLabel, 100.0f);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.centerImage, "Audio", "ExpandCenterImage", 100.0f,
-                                                     AudioStreamParameters::DEFAULT_EXPAND_CENTER_IMAGE);
-  QtUtils::BindLabelToSlider(dlgui.centerImage, dlgui.centerImageLabel, 100.0f);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.frontSeparation, "Audio", "ExpandFrontSeparation",
-                                                     10.0f, AudioStreamParameters::DEFAULT_EXPAND_FRONT_SEPARATION);
-  QtUtils::BindLabelToSlider(dlgui.frontSeparation, dlgui.frontSeparationLabel, 10.0f);
-  SettingWidgetBinder::BindWidgetToNormalizedSetting(sif, dlgui.rearSeparation, "Audio", "ExpandRearSeparation", 10.0f,
-                                                     AudioStreamParameters::DEFAULT_EXPAND_REAR_SEPARATION);
-  QtUtils::BindLabelToSlider(dlgui.rearSeparation, dlgui.rearSeparationLabel, 10.0f);
-  SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.lowCutoff, "Audio", "ExpandLowCutoff",
-                                              AudioStreamParameters::DEFAULT_EXPAND_LOW_CUTOFF);
-  QtUtils::BindLabelToSlider(dlgui.lowCutoff, dlgui.lowCutoffLabel);
-  SettingWidgetBinder::BindWidgetToIntSetting(sif, dlgui.highCutoff, "Audio", "ExpandHighCutoff",
-                                              AudioStreamParameters::DEFAULT_EXPAND_HIGH_CUTOFF);
-  QtUtils::BindLabelToSlider(dlgui.highCutoff, dlgui.highCutoffLabel);
-
-  connect(dlgui.buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, &dlg, &QDialog::accept);
-  connect(dlgui.buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, [this, &dlg]() {
-    m_dialog->setIntSettingValue("Audio", "ExpandBlockSize",
-                                 m_dialog->isPerGameSettings() ?
-                                   std::nullopt :
-                                   std::optional(AudioStreamParameters::DEFAULT_EXPAND_BLOCK_SIZE));
-
-    m_dialog->setFloatSettingValue("Audio", "ExpandCircularWrap",
-                                   m_dialog->isPerGameSettings() ?
-                                     std::nullopt :
-                                     std::optional(AudioStreamParameters::DEFAULT_EXPAND_CIRCULAR_WRAP));
-    m_dialog->setFloatSettingValue(
-      "Audio", "ExpandShift",
-      m_dialog->isPerGameSettings() ? std::nullopt : std::optional(AudioStreamParameters::DEFAULT_EXPAND_SHIFT));
-    m_dialog->setFloatSettingValue(
-      "Audio", "ExpandDepth",
-      m_dialog->isPerGameSettings() ? std::nullopt : std::optional(AudioStreamParameters::DEFAULT_EXPAND_DEPTH));
-    m_dialog->setFloatSettingValue(
-      "Audio", "ExpandFocus",
-      m_dialog->isPerGameSettings() ? std::nullopt : std::optional(AudioStreamParameters::DEFAULT_EXPAND_FOCUS));
-    m_dialog->setFloatSettingValue("Audio", "ExpandCenterImage",
-                                   m_dialog->isPerGameSettings() ?
-                                     std::nullopt :
-                                     std::optional(AudioStreamParameters::DEFAULT_EXPAND_CENTER_IMAGE));
-    m_dialog->setFloatSettingValue("Audio", "ExpandFrontSeparation",
-                                   m_dialog->isPerGameSettings() ?
-                                     std::nullopt :
-                                     std::optional(AudioStreamParameters::DEFAULT_EXPAND_FRONT_SEPARATION));
-    m_dialog->setFloatSettingValue("Audio", "ExpandRearSeparation",
-                                   m_dialog->isPerGameSettings() ?
-                                     std::nullopt :
-                                     std::optional(AudioStreamParameters::DEFAULT_EXPAND_REAR_SEPARATION));
-    m_dialog->setIntSettingValue("Audio", "ExpandLowCutoff",
-                                 m_dialog->isPerGameSettings() ?
-                                   std::nullopt :
-                                   std::optional(AudioStreamParameters::DEFAULT_EXPAND_LOW_CUTOFF));
-    m_dialog->setIntSettingValue("Audio", "ExpandHighCutoff",
-                                 m_dialog->isPerGameSettings() ?
-                                   std::nullopt :
-                                   std::optional(AudioStreamParameters::DEFAULT_EXPAND_HIGH_CUTOFF));
-
-    dlg.done(0);
-
-    QMetaObject::invokeMethod(this, &AudioSettingsWidget::onExpansionSettingsClicked, Qt::QueuedConnection);
-  });
-
-  dlg.exec();
-  updateLatencyLabel();
-}
-
 void AudioSettingsWidget::onStretchSettingsClicked()
 {
   QDialog dlg(QtUtils::GetRootWidget(this));
diff --git a/src/duckstation-qt/audiosettingswidget.h b/src/duckstation-qt/audiosettingswidget.h
index 1b23d5d54..816a895cd 100644
--- a/src/duckstation-qt/audiosettingswidget.h
+++ b/src/duckstation-qt/audiosettingswidget.h
@@ -10,7 +10,6 @@
 #include 
 
 enum class AudioBackend : u8;
-enum class AudioExpansionMode : u8;
 
 class SettingsWindow;
 
@@ -23,7 +22,6 @@ public:
   ~AudioSettingsWidget();
 
 private Q_SLOTS:
-  void onExpansionModeChanged();
   void onStretchModeChanged();
 
   void updateDriverNames();
@@ -35,13 +33,10 @@ private Q_SLOTS:
   void onFastForwardVolumeChanged(int new_value);
   void onOutputMutedChanged(int new_state);
 
-  void onExpansionSettingsClicked();
   void onStretchSettingsClicked();
 
 private:
   AudioBackend getEffectiveBackend() const;
-  AudioExpansionMode getEffectiveExpansionMode() const;
-  u32 getEffectiveExpansionBlockSize() const;
   void resetVolume(bool fast_forward);
 
   Ui::AudioSettingsWidget m_ui;
diff --git a/src/duckstation-qt/audiosettingswidget.ui b/src/duckstation-qt/audiosettingswidget.ui
index 6a8d4b0fe..e6d46b574 100644
--- a/src/duckstation-qt/audiosettingswidget.ui
+++ b/src/duckstation-qt/audiosettingswidget.ui
@@ -29,51 +29,17 @@
       Configuration
      
      
+      
+       
+        
+         Output Latency:
+        
+       
+      
       
        
       
-      
-       
-      
-      
-       
-        
-         Driver:
-        
-       
-      
-      
-       
-        
-         Maximum latency: 0 frames (0.00ms)
-        
-        
-         Qt::AlignmentFlag::AlignCenter
-        
-       
-      
-      
-       
-        
-         Backend:
-        
-       
-      
-      
-       
-        
-         Stretch Mode:
-        
-       
-      
-      
-       
-        
-         Output Device:
-        
-       
-      
-      
+      
        
         
          
@@ -113,62 +79,21 @@
       
        
       
-      
+      
+       
+        
+         Stretch Mode:
+        
+       
+      
+      
        
         
          Buffer Size:
         
        
       
-      
-       
-        
-         Expansion Mode:
-        
-       
-      
-      
-       
-        
-         Output Latency:
-        
-       
-      
-      
-       
-        
-         
-        
-        
-         
-          
-           Expansion Settings
-          
-          
-           
-          
-         
-        
-       
-      
       
-       
-        
-         
-        
-        
-         
-          
-           Stretch Settings
-          
-          
-           
-          
-         
-        
-       
-      
-      
        
         
          
@@ -207,6 +132,57 @@
         
        
       
+      
+       
+        
+         
+        
+        
+         
+          
+           Stretch Settings
+          
+          
+           
+          
+         
+        
+       
+      
+      
+       
+        
+         Output Device:
+        
+       
+      
+      
+       
+      
+      
+       
+        
+         Driver:
+        
+       
+      
+      
+       
+        
+         Maximum latency: 0 frames (0.00ms)
+        
+        
+         Qt::AlignmentFlag::AlignCenter
+        
+       
+      
+      
+       
+        
+         Backend:
+        
+       
+      
      
     
    
@@ -365,7 +341,7 @@
   
  
  
-  
+  
  
  
 
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index b57d72d7f..c26460c78 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -184,7 +184,6 @@ if(NOT ANDROID)
   )
   target_link_libraries(util PUBLIC
     cubeb
-    freesurround
     SDL2::SDL2
   )
   # FFmpeg loaded dynamically on demand.
diff --git a/src/util/audio_stream.cpp b/src/util/audio_stream.cpp
index 9841ce476..6ee4aea82 100644
--- a/src/util/audio_stream.cpp
+++ b/src/util/audio_stream.cpp
@@ -1,5 +1,5 @@
 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin 
-// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
+// SPDX-License-Identifier: CC-BY-NC-ND-4.0
 
 #include "audio_stream.h"
 #include "host.h"
@@ -15,10 +15,6 @@
 #include "soundtouch/SoundTouch.h"
 #include "soundtouch/SoundTouchDLL.h"
 
-#ifndef __ANDROID__
-#include "freesurround_decoder.h"
-#endif
-
 #include 
 #include 
 #include 
@@ -28,16 +24,6 @@ Log_SetChannel(AudioStream);
 
 static constexpr bool LOG_TIMESTRETCH_STATS = false;
 
-static constexpr const std::array, static_cast(AudioExpansionMode::Count)>
-  s_expansion_channel_count = {{
-    {u8(2), u8(2)}, // Disabled
-    {u8(3), u8(3)}, // StereoLFE
-    {u8(5), u8(4)}, // Quadraphonic
-    {u8(5), u8(5)}, // QuadraphonicLFE
-    {u8(6), u8(6)}, // Surround51
-    {u8(8), u8(8)}, // Surround71
-  }};
-
 AudioStream::DeviceInfo::DeviceInfo(std::string name_, std::string display_name_, u32 minimum_latency_)
   : name(std::move(name_)), display_name(std::move(display_name_)), minimum_latency_frames(minimum_latency_)
 {
@@ -45,10 +31,70 @@ AudioStream::DeviceInfo::DeviceInfo(std::string name_, std::string display_name_
 
 AudioStream::DeviceInfo::~DeviceInfo() = default;
 
+void AudioStreamParameters::Load(SettingsInterface& si, const char* section)
+{
+  stretch_mode =
+    AudioStream::ParseStretchMode(
+      si.GetStringValue(section, "StretchMode", AudioStream::GetStretchModeName(DEFAULT_STRETCH_MODE)).c_str())
+      .value_or(DEFAULT_STRETCH_MODE);
+  output_latency_ms = static_cast(std::min(
+    si.GetUIntValue(section, "OutputLatencyMS", DEFAULT_OUTPUT_LATENCY_MS), std::numeric_limits::max()));
+  output_latency_minimal = si.GetBoolValue(section, "OutputLatencyMinimal", DEFAULT_OUTPUT_LATENCY_MINIMAL);
+  buffer_ms = static_cast(
+    std::min(si.GetUIntValue(section, "BufferMS", DEFAULT_BUFFER_MS), std::numeric_limits::max()));
+
+  stretch_sequence_length_ms =
+    static_cast(std::min(si.GetUIntValue(section, "StretchSequenceLengthMS", DEFAULT_STRETCH_SEQUENCE_LENGTH),
+                                   std::numeric_limits::max()));
+  stretch_seekwindow_ms = static_cast(std::min(
+    si.GetUIntValue(section, "StretchSeekWindowMS", DEFAULT_STRETCH_SEEKWINDOW), std::numeric_limits::max()));
+  stretch_overlap_ms = static_cast(std::min(
+    si.GetUIntValue(section, "StretchOverlapMS", DEFAULT_STRETCH_OVERLAP), std::numeric_limits::max()));
+  stretch_use_quickseek = si.GetBoolValue(section, "StretchUseQuickSeek", DEFAULT_STRETCH_USE_QUICKSEEK);
+  stretch_use_aa_filter = si.GetBoolValue(section, "StretchUseAAFilter", DEFAULT_STRETCH_USE_AA_FILTER);
+}
+
+void AudioStreamParameters::Save(SettingsInterface& si, const char* section) const
+{
+  si.SetStringValue(section, "StretchMode", AudioStream::GetStretchModeName(stretch_mode));
+  si.SetUIntValue(section, "BufferMS", buffer_ms);
+  si.SetUIntValue(section, "OutputLatencyMS", output_latency_ms);
+  si.SetBoolValue(section, "OutputLatencyMinimal", output_latency_minimal);
+
+  si.SetUIntValue(section, "StretchSequenceLengthMS", stretch_sequence_length_ms);
+  si.SetUIntValue(section, "StretchSeekWindowMS", stretch_seekwindow_ms);
+  si.SetUIntValue(section, "StretchOverlapMS", stretch_overlap_ms);
+  si.SetBoolValue(section, "StretchUseQuickSeek", stretch_use_quickseek);
+  si.SetBoolValue(section, "StretchUseAAFilter", stretch_use_aa_filter);
+}
+
+void AudioStreamParameters::Clear(SettingsInterface& si, const char* section)
+{
+  si.DeleteValue(section, "StretchMode");
+  si.DeleteValue(section, "ExpansionMode");
+  si.DeleteValue(section, "BufferMS");
+  si.DeleteValue(section, "OutputLatencyMS");
+  si.DeleteValue(section, "OutputLatencyMinimal");
+
+  si.DeleteValue(section, "StretchSequenceLengthMS");
+  si.DeleteValue(section, "StretchSeekWindowMS");
+  si.DeleteValue(section, "StretchOverlapMS");
+  si.DeleteValue(section, "StretchUseQuickSeek");
+  si.DeleteValue(section, "StretchUseAAFilter");
+}
+
+bool AudioStreamParameters::operator!=(const AudioStreamParameters& rhs) const
+{
+  return (std::memcmp(this, &rhs, sizeof(*this)) != 0);
+}
+
+bool AudioStreamParameters::operator==(const AudioStreamParameters& rhs) const
+{
+  return (std::memcmp(this, &rhs, sizeof(*this)) == 0);
+}
+
 AudioStream::AudioStream(u32 sample_rate, const AudioStreamParameters& parameters)
-  : m_sample_rate(sample_rate), m_parameters(parameters),
-    m_internal_channels(s_expansion_channel_count[static_cast(parameters.expansion_mode)].first),
-    m_output_channels(s_expansion_channel_count[static_cast(parameters.expansion_mode)].second)
+  : m_sample_rate(sample_rate), m_parameters(parameters)
 {
 }
 
@@ -62,12 +108,11 @@ std::unique_ptr AudioStream::CreateNullStream(u32 sample_rate, u32
 {
   // no point stretching with no output
   AudioStreamParameters params;
-  params.expansion_mode = AudioExpansionMode::Disabled;
   params.stretch_mode = AudioStretchMode::Off;
   params.buffer_ms = static_cast(buffer_ms);
 
   std::unique_ptr stream(new AudioStream(sample_rate, params));
-  stream->BaseInitialize(&StereoSampleReaderImpl);
+  stream->BaseInitialize();
   return stream;
 }
 
@@ -199,38 +244,6 @@ const char* AudioStream::GetBackendDisplayName(AudioBackend backend)
   return Host::TranslateToCString("AudioStream", s_backend_display_names[static_cast(backend)]);
 }
 
-static constexpr const std::array s_expansion_mode_names = {
-  "Disabled", "StereoLFE", "Quadraphonic", "QuadraphonicLFE", "Surround51", "Surround71",
-};
-static constexpr const std::array s_expansion_mode_display_names = {
-  TRANSLATE_NOOP("AudioStream", "Disabled (Stereo)"), TRANSLATE_NOOP("AudioStream", "Stereo with LFE"),
-  TRANSLATE_NOOP("AudioStream", "Quadraphonic"),      TRANSLATE_NOOP("AudioStream", "Quadraphonic with LFE"),
-  TRANSLATE_NOOP("AudioStream", "5.1 Surround"),      TRANSLATE_NOOP("AudioStream", "7.1 Surround"),
-};
-
-const char* AudioStream::GetExpansionModeName(AudioExpansionMode mode)
-{
-  return (static_cast(mode) < s_expansion_mode_names.size()) ? s_expansion_mode_names[static_cast(mode)] : "";
-}
-
-const char* AudioStream::GetExpansionModeDisplayName(AudioExpansionMode mode)
-{
-  return (static_cast(mode) < s_expansion_mode_display_names.size()) ?
-           Host::TranslateToCString("AudioStream", s_expansion_mode_display_names[static_cast(mode)]) :
-           "";
-}
-
-std::optional AudioStream::ParseExpansionMode(const char* name)
-{
-  for (u8 i = 0; i < static_cast(AudioExpansionMode::Count); i++)
-  {
-    if (std::strcmp(name, s_expansion_mode_names[i]) == 0)
-      return static_cast(i);
-  }
-
-  return std::nullopt;
-}
-
 static constexpr const std::array s_stretch_mode_names = {
   "None",
   "Resample",
@@ -316,7 +329,7 @@ void AudioStream::ReadFrames(SampleType* samples, u32 num_frames)
     // towards the end of the buffer
     if (end > 0)
     {
-      m_sample_reader(samples, &m_buffer[rpos * m_internal_channels], end);
+      std::memcpy(samples, &m_buffer[rpos * NUM_CHANNELS], end * NUM_CHANNELS * sizeof(SampleType));
       rpos += end;
       rpos = (rpos == m_buffer_size) ? 0 : rpos;
     }
@@ -325,7 +338,7 @@ void AudioStream::ReadFrames(SampleType* samples, u32 num_frames)
     const u32 start = frames_to_read - end;
     if (start > 0)
     {
-      m_sample_reader(&samples[end * m_output_channels], &m_buffer[0], start);
+      std::memcpy(&samples[end * NUM_CHANNELS], &m_buffer[0], start * NUM_CHANNELS * sizeof(SampleType));
       rpos = start;
     }
 
@@ -342,19 +355,19 @@ void AudioStream::ReadFrames(SampleType* samples, u32 num_frames)
         static_cast(65536.0f * (static_cast(frames_to_read) / static_cast(num_frames)));
 
       SampleType* resample_ptr =
-        static_cast(alloca(frames_to_read * m_output_channels * sizeof(SampleType)));
-      std::memcpy(resample_ptr, samples, frames_to_read * m_output_channels * sizeof(SampleType));
+        static_cast(alloca(frames_to_read * NUM_CHANNELS * sizeof(SampleType)));
+      std::memcpy(resample_ptr, samples, frames_to_read * NUM_CHANNELS * sizeof(SampleType));
 
       SampleType* out_ptr = samples;
-      const u32 copy_stride = sizeof(SampleType) * m_output_channels;
+      const u32 copy_stride = sizeof(SampleType) * NUM_CHANNELS;
       u32 resample_subpos = 0;
       for (u32 i = 0; i < num_frames; i++)
       {
         std::memcpy(out_ptr, resample_ptr, copy_stride);
-        out_ptr += m_output_channels;
+        out_ptr += NUM_CHANNELS;
 
         resample_subpos += increment;
-        resample_ptr += (resample_subpos >> 16) * m_output_channels;
+        resample_ptr += (resample_subpos >> 16) * NUM_CHANNELS;
         resample_subpos %= 65536u;
       }
 
@@ -363,13 +376,13 @@ void AudioStream::ReadFrames(SampleType* samples, u32 num_frames)
     else
     {
       // no data, fall back to silence
-      std::memset(samples + (frames_to_read * m_output_channels), 0, silence_frames * m_output_channels * sizeof(s16));
+      std::memset(samples + (frames_to_read * NUM_CHANNELS), 0, silence_frames * NUM_CHANNELS * sizeof(s16));
     }
   }
 
   if (m_volume != 100)
   {
-    u32 num_samples = num_frames * m_output_channels;
+    u32 num_samples = num_frames * NUM_CHANNELS;
 
     const u32 aligned_samples = Common::AlignDownPow2(num_samples, 8);
     num_samples -= aligned_samples;
@@ -403,11 +416,6 @@ void AudioStream::ReadFrames(SampleType* samples, u32 num_frames)
   }
 }
 
-void AudioStream::StereoSampleReaderImpl(SampleType* dest, const SampleType* src, u32 num_frames)
-{
-  std::memcpy(dest, src, num_frames * 2 * sizeof(SampleType));
-}
-
 void AudioStream::InternalWriteFrames(s16* data, u32 num_frames)
 {
   const u32 free = m_buffer_size - GetBufferedFramesRelaxed();
@@ -434,28 +442,25 @@ void AudioStream::InternalWriteFrames(s16* data, u32 num_frames)
     const u32 start = num_frames - end;
 
     // start is zero when this chunk reaches exactly the end
-    std::memcpy(&m_buffer[wpos * m_internal_channels], data, end * m_internal_channels * sizeof(SampleType));
+    std::memcpy(&m_buffer[wpos * NUM_CHANNELS], data, end * NUM_CHANNELS * sizeof(SampleType));
     if (start > 0)
-      std::memcpy(&m_buffer[0], data + end * m_internal_channels, start * m_internal_channels * sizeof(SampleType));
+      std::memcpy(&m_buffer[0], data + end * NUM_CHANNELS, start * NUM_CHANNELS * sizeof(SampleType));
 
     wpos = start;
   }
   else
   {
     // no split
-    std::memcpy(&m_buffer[wpos * m_internal_channels], data, num_frames * m_internal_channels * sizeof(SampleType));
+    std::memcpy(&m_buffer[wpos * NUM_CHANNELS], data, num_frames * NUM_CHANNELS * sizeof(SampleType));
     wpos += num_frames;
   }
 
   m_wpos.store(wpos, std::memory_order_release);
 }
 
-void AudioStream::BaseInitialize(SampleReader sample_reader)
+void AudioStream::BaseInitialize()
 {
-  m_sample_reader = sample_reader;
-
   AllocateBuffer();
-  ExpandAllocate();
   StretchAllocate();
 }
 
@@ -469,22 +474,16 @@ void AudioStream::AllocateBuffer()
   m_buffer_size = GetAlignedBufferSize(((m_parameters.buffer_ms * multiplier) * m_sample_rate) / 1000);
   m_target_buffer_size = GetAlignedBufferSize((m_sample_rate * m_parameters.buffer_ms) / 1000u);
 
-  m_buffer = std::make_unique(m_buffer_size * m_internal_channels);
-  m_staging_buffer = std::make_unique(CHUNK_SIZE * m_internal_channels);
-  m_float_buffer = std::make_unique(CHUNK_SIZE * m_internal_channels);
+  m_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, m_buffer_size * NUM_CHANNELS);
+  m_staging_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, CHUNK_SIZE * NUM_CHANNELS);
+  m_float_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, CHUNK_SIZE * NUM_CHANNELS);
 
-  if (IsExpansionEnabled())
-    m_expand_buffer = std::make_unique(m_parameters.expand_block_size * NUM_INPUT_CHANNELS);
-
-  DEV_LOG(
-    "Allocated buffer of {} frames for buffer of {} ms [expansion {} (block size {}), stretch {}, target size {}].",
-    m_buffer_size, m_parameters.buffer_ms, GetExpansionModeName(m_parameters.expansion_mode),
-    m_parameters.expand_block_size, GetStretchModeName(m_parameters.stretch_mode), m_target_buffer_size);
+  DEV_LOG("Allocated buffer of {} frames for buffer of {} ms [stretch {}, target size {}].", m_buffer_size,
+          m_parameters.buffer_ms, GetStretchModeName(m_parameters.stretch_mode), m_target_buffer_size);
 }
 
 void AudioStream::DestroyBuffer()
 {
-  m_expand_buffer.reset();
   m_staging_buffer.reset();
   m_float_buffer.reset();
   m_buffer.reset();
@@ -495,15 +494,6 @@ void AudioStream::DestroyBuffer()
 
 void AudioStream::EmptyBuffer()
 {
-#ifndef __ANDROID__
-  if (IsExpansionEnabled())
-  {
-    m_expander->Flush();
-    m_expand_output_buffer = nullptr;
-    m_expand_buffer_pos = 0;
-  }
-#endif
-
   if (IsStretchEnabled())
   {
     soundtouch_clear(m_soundtouch);
@@ -559,7 +549,7 @@ void AudioStream::BeginWrite(SampleType** buffer_ptr, u32* num_frames)
 {
   // TODO: Write directly to buffer when not using stretching.
   *buffer_ptr = &m_staging_buffer[m_staging_buffer_pos];
-  *num_frames = CHUNK_SIZE - (m_staging_buffer_pos / NUM_INPUT_CHANNELS);
+  *num_frames = CHUNK_SIZE - (m_staging_buffer_pos / NUM_CHANNELS);
 }
 
 static void S16ChunkToFloat(const s16* src, float* dst, u32 num_samples)
@@ -569,7 +559,7 @@ static void S16ChunkToFloat(const s16* src, float* dst, u32 num_samples)
   const u32 iterations = (num_samples + 7) / 8;
   for (u32 i = 0; i < iterations; i++)
   {
-    const GSVector4i sv = GSVector4i::load(src);
+    const GSVector4i sv = GSVector4i::load(src);
     src += 8;
 
     GSVector4i iv1 = sv.upl16(sv);  // [0, 0, 1, 1, 2, 2, 3, 3]
@@ -581,8 +571,8 @@ static void S16ChunkToFloat(const s16* src, float* dst, u32 num_samples)
     fv1 = fv1 * S16_TO_FLOAT_V;
     fv2 = fv2 * S16_TO_FLOAT_V;
 
-    GSVector4::store(dst + 0, fv1);
-    GSVector4::store(dst + 4, fv2);
+    GSVector4::store(dst + 0, fv1);
+    GSVector4::store(dst + 4, fv2);
     dst += 8;
   }
 }
@@ -594,8 +584,8 @@ static void FloatChunkToS16(s16* dst, const float* src, u32 num_samples)
   const u32 iterations = (num_samples + 7) / 8;
   for (u32 i = 0; i < iterations; i++)
   {
-    GSVector4 fv1 = GSVector4::load(src + 0);
-    GSVector4 fv2 = GSVector4::load(src + 4);
+    GSVector4 fv1 = GSVector4::load(src + 0);
+    GSVector4 fv2 = GSVector4::load(src + 4);
     src += 8;
 
     fv1 = fv1 * FLOAT_TO_S16_V;
@@ -604,91 +594,32 @@ static void FloatChunkToS16(s16* dst, const float* src, u32 num_samples)
     GSVector4i iv2 = GSVector4i(fv2);
 
     const GSVector4i iv = iv1.ps32(iv2);
-    GSVector4i::store(dst, iv);
+    GSVector4i::store(dst, iv);
     dst += 8;
   }
 }
 
-void AudioStream::ExpandAllocate()
-{
-  DebugAssert(!m_expander);
-  if (m_parameters.expansion_mode == AudioExpansionMode::Disabled)
-    return;
-
-#ifndef __ANDROID__
-  static constexpr std::array,
-                              static_cast(AudioExpansionMode::Count)>
-    channel_setup_mapping = {{
-      {FreeSurroundDecoder::ChannelSetup::Stereo, false},     // Disabled
-      {FreeSurroundDecoder::ChannelSetup::Stereo, true},      // StereoLFE
-      {FreeSurroundDecoder::ChannelSetup::Surround41, false}, // Quadraphonic
-      {FreeSurroundDecoder::ChannelSetup::Surround41, true},  // QuadraphonicLFE
-      {FreeSurroundDecoder::ChannelSetup::Surround51, true},  // Surround51
-      {FreeSurroundDecoder::ChannelSetup::Surround71, true},  // Surround71
-    }};
-
-  const auto [fs_setup, fs_lfe] = channel_setup_mapping[static_cast(m_parameters.expansion_mode)];
-
-  m_expander = std::make_unique(fs_setup, m_parameters.expand_block_size);
-  m_expander->SetBassRedirection(fs_lfe);
-  m_expander->SetCircularWrap(m_parameters.expand_circular_wrap);
-  m_expander->SetShift(m_parameters.expand_shift);
-  m_expander->SetDepth(m_parameters.expand_depth);
-  m_expander->SetFocus(m_parameters.expand_focus);
-  m_expander->SetCenterImage(m_parameters.expand_center_image);
-  m_expander->SetFrontSeparation(m_parameters.expand_front_separation);
-  m_expander->SetRearSeparation(m_parameters.expand_rear_separation);
-  m_expander->SetLowCutoff(static_cast(m_parameters.expand_low_cutoff) / m_sample_rate * 2);
-  m_expander->SetHighCutoff(static_cast(m_parameters.expand_high_cutoff) / m_sample_rate * 2);
-#else
-  Panic("Attempting to use expansion on Android.");
-#endif
-}
-
 void AudioStream::EndWrite(u32 num_frames)
 {
   // don't bother committing anything when muted
   if (m_volume == 0)
     return;
 
-  m_staging_buffer_pos += num_frames * NUM_INPUT_CHANNELS;
-  DebugAssert(m_staging_buffer_pos <= (CHUNK_SIZE * NUM_INPUT_CHANNELS));
-  if ((m_staging_buffer_pos / NUM_INPUT_CHANNELS) < CHUNK_SIZE)
+  m_staging_buffer_pos += num_frames * NUM_CHANNELS;
+  DebugAssert(m_staging_buffer_pos <= (CHUNK_SIZE * NUM_CHANNELS));
+  if ((m_staging_buffer_pos / NUM_CHANNELS) < CHUNK_SIZE)
     return;
 
   m_staging_buffer_pos = 0;
 
-  if (!IsExpansionEnabled() && !IsStretchEnabled())
+  if (!IsStretchEnabled())
   {
     InternalWriteFrames(m_staging_buffer.get(), CHUNK_SIZE);
     return;
   }
 
-#ifndef __ANDROID__
-  if (IsExpansionEnabled())
-  {
-    // StretchWriteBlock() overwrites the staging buffer on output, so we need to copy into the expand buffer first.
-    S16ChunkToFloat(m_staging_buffer.get(), m_expand_buffer.get() + m_expand_buffer_pos * NUM_INPUT_CHANNELS,
-                    CHUNK_SIZE * NUM_INPUT_CHANNELS);
-
-    // Output the corresponding block.
-    if (m_expand_output_buffer)
-      StretchWriteBlock(m_expand_output_buffer + m_expand_buffer_pos * m_internal_channels);
-
-    // Decode the next block if we buffered enough.
-    m_expand_buffer_pos += CHUNK_SIZE;
-    if (m_expand_buffer_pos == m_parameters.expand_block_size)
-    {
-      m_expand_buffer_pos = 0;
-      m_expand_output_buffer = m_expander->Decode(m_expand_buffer.get());
-    }
-  }
-  else
-#endif
-  {
-    S16ChunkToFloat(m_staging_buffer.get(), m_float_buffer.get(), CHUNK_SIZE * NUM_INPUT_CHANNELS);
-    StretchWriteBlock(m_float_buffer.get());
-  }
+  S16ChunkToFloat(m_staging_buffer.get(), m_float_buffer.get(), CHUNK_SIZE * NUM_CHANNELS);
+  StretchWriteBlock(m_float_buffer.get());
 }
 
 // Time stretching algorithm based on PCSX2 implementation.
@@ -706,7 +637,7 @@ void AudioStream::StretchAllocate()
 
   m_soundtouch = soundtouch_createInstance();
   soundtouch_setSampleRate(m_soundtouch, m_sample_rate);
-  soundtouch_setChannels(m_soundtouch, m_internal_channels);
+  soundtouch_setChannels(m_soundtouch, NUM_CHANNELS);
 
   soundtouch_setSetting(m_soundtouch, SETTING_USE_QUICKSEEK, m_parameters.stretch_use_quickseek);
   soundtouch_setSetting(m_soundtouch, SETTING_USE_AA_FILTER, m_parameters.stretch_use_aa_filter);
@@ -748,7 +679,7 @@ void AudioStream::StretchWriteBlock(const float* block)
     u32 tempProgress;
     while (tempProgress = soundtouch_receiveSamples(m_soundtouch, m_float_buffer.get(), CHUNK_SIZE), tempProgress != 0)
     {
-      FloatChunkToS16(m_staging_buffer.get(), m_float_buffer.get(), tempProgress * m_internal_channels);
+      FloatChunkToS16(m_staging_buffer.get(), m_float_buffer.get(), tempProgress * NUM_CHANNELS);
       InternalWriteFrames(m_staging_buffer.get(), tempProgress);
     }
 
@@ -757,7 +688,7 @@ void AudioStream::StretchWriteBlock(const float* block)
   }
   else
   {
-    FloatChunkToS16(m_staging_buffer.get(), block, CHUNK_SIZE * m_internal_channels);
+    FloatChunkToS16(m_staging_buffer.get(), block, CHUNK_SIZE * NUM_CHANNELS);
     InternalWriteFrames(m_staging_buffer.get(), CHUNK_SIZE);
   }
 }
@@ -891,116 +822,3 @@ void AudioStream::StretchOverrun()
   const u32 discard = CHUNK_SIZE * 2;
   m_rpos.store((m_rpos.load(std::memory_order_acquire) + discard) % m_buffer_size, std::memory_order_release);
 }
-
-void AudioStreamParameters::Load(SettingsInterface& si, const char* section)
-{
-  stretch_mode =
-    AudioStream::ParseStretchMode(
-      si.GetStringValue(section, "StretchMode", AudioStream::GetStretchModeName(DEFAULT_STRETCH_MODE)).c_str())
-      .value_or(DEFAULT_STRETCH_MODE);
-#ifndef __ANDROID__
-  expansion_mode =
-    AudioStream::ParseExpansionMode(
-      si.GetStringValue(section, "ExpansionMode", AudioStream::GetExpansionModeName(DEFAULT_EXPANSION_MODE)).c_str())
-      .value_or(DEFAULT_EXPANSION_MODE);
-#else
-  expansion_mode = AudioExpansionMode::Disabled;
-#endif
-  output_latency_ms = static_cast(std::min(
-    si.GetUIntValue(section, "OutputLatencyMS", DEFAULT_OUTPUT_LATENCY_MS), std::numeric_limits::max()));
-  output_latency_minimal = si.GetBoolValue(section, "OutputLatencyMinimal", DEFAULT_OUTPUT_LATENCY_MINIMAL);
-  buffer_ms = static_cast(
-    std::min(si.GetUIntValue(section, "BufferMS", DEFAULT_BUFFER_MS), std::numeric_limits::max()));
-
-  stretch_sequence_length_ms =
-    static_cast(std::min(si.GetUIntValue(section, "StretchSequenceLengthMS", DEFAULT_STRETCH_SEQUENCE_LENGTH),
-                                   std::numeric_limits::max()));
-  stretch_seekwindow_ms = static_cast(std::min(
-    si.GetUIntValue(section, "StretchSeekWindowMS", DEFAULT_STRETCH_SEEKWINDOW), std::numeric_limits::max()));
-  stretch_overlap_ms = static_cast(std::min(
-    si.GetUIntValue(section, "StretchOverlapMS", DEFAULT_STRETCH_OVERLAP), std::numeric_limits::max()));
-  stretch_use_quickseek = si.GetBoolValue(section, "StretchUseQuickSeek", DEFAULT_STRETCH_USE_QUICKSEEK);
-  stretch_use_aa_filter = si.GetBoolValue(section, "StretchUseAAFilter", DEFAULT_STRETCH_USE_AA_FILTER);
-
-  expand_block_size = static_cast(std::min(
-    si.GetUIntValue(section, "ExpandBlockSize", DEFAULT_EXPAND_BLOCK_SIZE), std::numeric_limits::max()));
-  expand_block_size = std::clamp(
-    Common::IsPow2(expand_block_size) ? expand_block_size : Common::NextPow2(expand_block_size), 128, 8192);
-  expand_circular_wrap =
-    std::clamp(si.GetFloatValue(section, "ExpandCircularWrap", DEFAULT_EXPAND_CIRCULAR_WRAP), 0.0f, 360.0f);
-  expand_shift = std::clamp(si.GetFloatValue(section, "ExpandShift", DEFAULT_EXPAND_SHIFT), -1.0f, 1.0f);
-  expand_depth = std::clamp(si.GetFloatValue(section, "ExpandDepth", DEFAULT_EXPAND_DEPTH), 0.0f, 5.0f);
-  expand_focus = std::clamp(si.GetFloatValue(section, "ExpandFocus", DEFAULT_EXPAND_FOCUS), -1.0f, 1.0f);
-  expand_center_image =
-    std::clamp(si.GetFloatValue(section, "ExpandCenterImage", DEFAULT_EXPAND_CENTER_IMAGE), 0.0f, 1.0f);
-  expand_front_separation =
-    std::clamp(si.GetFloatValue(section, "ExpandFrontSeparation", DEFAULT_EXPAND_FRONT_SEPARATION), 0.0f, 10.0f);
-  expand_rear_separation =
-    std::clamp(si.GetFloatValue(section, "ExpandRearSeparation", DEFAULT_EXPAND_REAR_SEPARATION), 0.0f, 10.0f);
-  expand_low_cutoff =
-    static_cast(std::min(si.GetUIntValue(section, "ExpandLowCutoff", DEFAULT_EXPAND_LOW_CUTOFF), 100));
-  expand_high_cutoff =
-    static_cast(std::min(si.GetUIntValue(section, "ExpandHighCutoff", DEFAULT_EXPAND_HIGH_CUTOFF), 100));
-}
-
-void AudioStreamParameters::Save(SettingsInterface& si, const char* section) const
-{
-  si.SetStringValue(section, "StretchMode", AudioStream::GetStretchModeName(stretch_mode));
-  si.SetStringValue(section, "ExpansionMode", AudioStream::GetExpansionModeName(expansion_mode));
-  si.SetUIntValue(section, "BufferMS", buffer_ms);
-  si.SetUIntValue(section, "OutputLatencyMS", output_latency_ms);
-  si.SetBoolValue(section, "OutputLatencyMinimal", output_latency_minimal);
-
-  si.SetUIntValue(section, "StretchSequenceLengthMS", stretch_sequence_length_ms);
-  si.SetUIntValue(section, "StretchSeekWindowMS", stretch_seekwindow_ms);
-  si.SetUIntValue(section, "StretchOverlapMS", stretch_overlap_ms);
-  si.SetBoolValue(section, "StretchUseQuickSeek", stretch_use_quickseek);
-  si.SetBoolValue(section, "StretchUseAAFilter", stretch_use_aa_filter);
-
-  si.SetUIntValue(section, "ExpandBlockSize", expand_block_size);
-  si.SetFloatValue(section, "ExpandCircularWrap", expand_circular_wrap);
-  si.SetFloatValue(section, "ExpandShift", expand_shift);
-  si.SetFloatValue(section, "ExpandDepth", expand_depth);
-  si.SetFloatValue(section, "ExpandFocus", expand_focus);
-  si.SetFloatValue(section, "ExpandCenterImage", expand_center_image);
-  si.SetFloatValue(section, "ExpandFrontSeparation", expand_front_separation);
-  si.SetFloatValue(section, "ExpandRearSeparation", expand_rear_separation);
-  si.SetUIntValue(section, "ExpandLowCutoff", expand_low_cutoff);
-  si.SetUIntValue(section, "ExpandHighCutoff", expand_high_cutoff);
-}
-
-void AudioStreamParameters::Clear(SettingsInterface& si, const char* section)
-{
-  si.DeleteValue(section, "StretchMode");
-  si.DeleteValue(section, "ExpansionMode");
-  si.DeleteValue(section, "BufferMS");
-  si.DeleteValue(section, "OutputLatencyMS");
-  si.DeleteValue(section, "OutputLatencyMinimal");
-
-  si.DeleteValue(section, "StretchSequenceLengthMS");
-  si.DeleteValue(section, "StretchSeekWindowMS");
-  si.DeleteValue(section, "StretchOverlapMS");
-  si.DeleteValue(section, "StretchUseQuickSeek");
-  si.DeleteValue(section, "StretchUseAAFilter");
-
-  si.DeleteValue(section, "ExpandBlockSize");
-  si.DeleteValue(section, "ExpandCircularWrap");
-  si.DeleteValue(section, "ExpandShift");
-  si.DeleteValue(section, "ExpandDepth");
-  si.DeleteValue(section, "ExpandFocus");
-  si.DeleteValue(section, "ExpandCenterImage");
-  si.DeleteValue(section, "ExpandFrontSeparation");
-  si.DeleteValue(section, "ExpandRearSeparation");
-  si.DeleteValue(section, "ExpandLowCutoff");
-  si.DeleteValue(section, "ExpandHighCutoff");
-}
-
-bool AudioStreamParameters::operator!=(const AudioStreamParameters& rhs) const
-{
-  return (std::memcmp(this, &rhs, sizeof(*this)) != 0);
-}
-
-bool AudioStreamParameters::operator==(const AudioStreamParameters& rhs) const
-{
-  return (std::memcmp(this, &rhs, sizeof(*this)) == 0);
-}
diff --git a/src/util/audio_stream.h b/src/util/audio_stream.h
index 05297e083..9222e97a4 100644
--- a/src/util/audio_stream.h
+++ b/src/util/audio_stream.h
@@ -1,12 +1,14 @@
 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin 
-// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
+// SPDX-License-Identifier: CC-BY-NC-ND-4.0
 
 #pragma once
 
+#include "common/align.h"
 #include "common/types.h"
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -15,11 +17,12 @@
 class Error;
 class SettingsInterface;
 
-class FreeSurroundDecoder;
 namespace soundtouch {
 class SoundTouch;
 }
 
+struct kiss_fftr_state;
+
 enum class AudioBackend : u8
 {
   Null,
@@ -41,21 +44,9 @@ enum class AudioStretchMode : u8
   Count
 };
 
-enum class AudioExpansionMode : u8
-{
-  Disabled,
-  StereoLFE,
-  Quadraphonic,
-  QuadraphonicLFE,
-  Surround51,
-  Surround71,
-  Count
-};
-
 struct AudioStreamParameters
 {
   AudioStretchMode stretch_mode = DEFAULT_STRETCH_MODE;
-  AudioExpansionMode expansion_mode = DEFAULT_EXPANSION_MODE;
   u16 buffer_ms = DEFAULT_BUFFER_MS;
   u16 output_latency_ms = DEFAULT_OUTPUT_LATENCY_MS;
   bool output_latency_minimal = DEFAULT_OUTPUT_LATENCY_MINIMAL;
@@ -67,19 +58,7 @@ struct AudioStreamParameters
   bool stretch_use_quickseek = DEFAULT_STRETCH_USE_QUICKSEEK;
   bool stretch_use_aa_filter = DEFAULT_STRETCH_USE_AA_FILTER;
 
-  float expand_circular_wrap = DEFAULT_EXPAND_CIRCULAR_WRAP;
-  float expand_shift = DEFAULT_EXPAND_SHIFT;
-  float expand_depth = DEFAULT_EXPAND_DEPTH;
-  float expand_focus = DEFAULT_EXPAND_FOCUS;
-  float expand_center_image = DEFAULT_EXPAND_CENTER_IMAGE;
-  float expand_front_separation = DEFAULT_EXPAND_FRONT_SEPARATION;
-  float expand_rear_separation = DEFAULT_EXPAND_REAR_SEPARATION;
-  u16 expand_block_size = DEFAULT_EXPAND_BLOCK_SIZE;
-  u8 expand_low_cutoff = DEFAULT_EXPAND_LOW_CUTOFF;
-  u8 expand_high_cutoff = DEFAULT_EXPAND_HIGH_CUTOFF;
-
   static constexpr AudioStretchMode DEFAULT_STRETCH_MODE = AudioStretchMode::TimeStretch;
-  static constexpr AudioExpansionMode DEFAULT_EXPANSION_MODE = AudioExpansionMode::Disabled;
 #ifndef __ANDROID__
   static constexpr u16 DEFAULT_BUFFER_MS = 50;
   static constexpr u16 DEFAULT_OUTPUT_LATENCY_MS = 20;
@@ -88,16 +67,6 @@ struct AudioStreamParameters
   static constexpr u16 DEFAULT_OUTPUT_LATENCY_MS = 20;
 #endif
   static constexpr bool DEFAULT_OUTPUT_LATENCY_MINIMAL = false;
-  static constexpr u16 DEFAULT_EXPAND_BLOCK_SIZE = 2048;
-  static constexpr float DEFAULT_EXPAND_CIRCULAR_WRAP = 90.0f;
-  static constexpr float DEFAULT_EXPAND_SHIFT = 0.0f;
-  static constexpr float DEFAULT_EXPAND_DEPTH = 1.0f;
-  static constexpr float DEFAULT_EXPAND_FOCUS = 0.0f;
-  static constexpr float DEFAULT_EXPAND_CENTER_IMAGE = 1.0f;
-  static constexpr float DEFAULT_EXPAND_FRONT_SEPARATION = 1.0f;
-  static constexpr float DEFAULT_EXPAND_REAR_SEPARATION = 1.0f;
-  static constexpr u8 DEFAULT_EXPAND_LOW_CUTOFF = 40;
-  static constexpr u8 DEFAULT_EXPAND_HIGH_CUTOFF = 90;
 
   static constexpr u16 DEFAULT_STRETCH_SEQUENCE_LENGTH = 30;
   static constexpr u16 DEFAULT_STRETCH_SEEKWINDOW = 20;
@@ -119,11 +88,8 @@ class AudioStream
 public:
   using SampleType = s16;
 
-  static constexpr u32 NUM_INPUT_CHANNELS = 2;
-  static constexpr u32 MAX_OUTPUT_CHANNELS = 8;
+  static constexpr u32 NUM_CHANNELS = 2;
   static constexpr u32 CHUNK_SIZE = 64;
-  static constexpr u32 MIN_EXPANSION_BLOCK_SIZE = 256;
-  static constexpr u32 MAX_EXPANSION_BLOCK_SIZE = 4096;
 
 #ifndef __ANDROID__
   static constexpr AudioBackend DEFAULT_BACKEND = AudioBackend::Cubeb;
@@ -152,17 +118,11 @@ public:
   static const char* GetBackendName(AudioBackend backend);
   static const char* GetBackendDisplayName(AudioBackend backend);
 
-  static const char* GetExpansionModeName(AudioExpansionMode mode);
-  static const char* GetExpansionModeDisplayName(AudioExpansionMode mode);
-  static std::optional ParseExpansionMode(const char* name);
-
   static const char* GetStretchModeName(AudioStretchMode mode);
   static const char* GetStretchModeDisplayName(AudioStretchMode mode);
   static std::optional ParseStretchMode(const char* name);
 
   ALWAYS_INLINE u32 GetSampleRate() const { return m_sample_rate; }
-  ALWAYS_INLINE u32 GetInternalChannels() const { return m_internal_channels; }
-  ALWAYS_INLINE u32 GetOutputChannels() const { return m_internal_channels; }
   ALWAYS_INLINE u32 GetBufferSize() const { return m_buffer_size; }
   ALWAYS_INLINE u32 GetTargetBufferSize() const { return m_target_buffer_size; }
   ALWAYS_INLINE u32 GetOutputVolume() const { return m_volume; }
@@ -195,37 +155,14 @@ public:
   static std::unique_ptr CreateNullStream(u32 sample_rate, u32 buffer_ms);
 
 protected:
-  enum ReadChannel : u8
-  {
-    READ_CHANNEL_FRONT_LEFT,
-    READ_CHANNEL_FRONT_CENTER,
-    READ_CHANNEL_FRONT_RIGHT,
-    READ_CHANNEL_SIDE_LEFT,
-    READ_CHANNEL_SIDE_RIGHT,
-    READ_CHANNEL_REAR_LEFT,
-    READ_CHANNEL_REAR_RIGHT,
-    READ_CHANNEL_LFE,
-    READ_CHANNEL_NONE
-  };
-
-  using SampleReader = void (*)(SampleType* dest, const SampleType* src, u32 num_frames);
-
   AudioStream(u32 sample_rate, const AudioStreamParameters& parameters);
-  void BaseInitialize(SampleReader sample_reader);
+  void BaseInitialize();
 
   void ReadFrames(SampleType* samples, u32 num_frames);
 
-  template
-  static void SampleReaderImpl(SampleType* dest, const SampleType* src, u32 num_frames);
-  static void StereoSampleReaderImpl(SampleType* dest, const SampleType* src, u32 num_frames);
-
   u32 m_sample_rate = 0;
   u32 m_volume = 100;
   AudioStreamParameters m_parameters;
-  u8 m_internal_channels = 0;
-  u8 m_output_channels = 0;
   bool m_stretch_inactive = false;
   bool m_filling = false;
   bool m_paused = false;
@@ -251,7 +188,6 @@ private:
                                                                 const AudioStreamParameters& parameters, Error* error);
 #endif
 
-  ALWAYS_INLINE bool IsExpansionEnabled() const { return m_parameters.expansion_mode != AudioExpansionMode::Disabled; }
   ALWAYS_INLINE bool IsStretchEnabled() const { return m_parameters.stretch_mode != AudioStretchMode::Off; }
 
   void AllocateBuffer();
@@ -259,10 +195,6 @@ private:
 
   void InternalWriteFrames(SampleType* samples, u32 num_frames);
 
-#ifndef __ANDROID__
-  void ExpandAllocate();
-#endif
-
   void StretchAllocate();
   void StretchDestroy();
   void StretchWriteBlock(const float* block);
@@ -273,8 +205,7 @@ private:
   void UpdateStretchTempo();
 
   u32 m_buffer_size = 0;
-  std::unique_ptr m_buffer;
-  SampleReader m_sample_reader = nullptr;
+  Common::unique_aligned_ptr m_buffer;
 
   std::atomic m_rpos{0};
   std::atomic m_wpos{0};
@@ -295,83 +226,8 @@ private:
   std::array m_average_fullness = {};
 
   // temporary staging buffer, used for timestretching
-  std::unique_ptr m_staging_buffer;
+  Common::unique_aligned_ptr m_staging_buffer;
 
   // float buffer, soundtouch only accepts float samples as input
-  std::unique_ptr m_float_buffer;
-
-#ifndef __ANDROID__
-  std::unique_ptr m_expander;
-
-  // block buffer for expansion
-  std::unique_ptr m_expand_buffer;
-  float* m_expand_output_buffer = nullptr;
-  u32 m_expand_buffer_pos = 0;
-#endif
+  Common::unique_aligned_ptr m_float_buffer;
 };
-
-template
-void AudioStream::SampleReaderImpl(SampleType* dest, const SampleType* src, u32 num_frames)
-{
-  static_assert(READ_CHANNEL_NONE == MAX_OUTPUT_CHANNELS);
-  static constexpr const std::array, u8>,
-                                    static_cast(AudioExpansionMode::Count)>
-    luts = {{
-      // FL FC FR SL SR RL RR LFE
-      {{0, -1, 1, -1, -1, -1, -1, -1}, 2}, // Disabled
-      {{0, -1, 1, -1, -1, -1, -1, 2}, 3},  // StereoLFE
-      {{0, -1, 1, -1, -1, 2, 3, -1}, 5},   // Quadraphonic
-      {{0, -1, 2, -1, -1, 2, 3, 4}, 5},    // QuadraphonicLFE
-      {{0, 1, 2, -1, -1, 3, 4, 5}, 6},     // Surround51
-      {{0, 1, 2, 3, 4, 5, 6, 7}, 8},       // Surround71
-    }};
-  constexpr const auto& lut = luts[static_cast(mode)].first;
-  for (u32 i = 0; i < num_frames; i++)
-  {
-    if constexpr (c0 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c0] >= 0 && lut[c0] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c0]];
-    }
-    if constexpr (c1 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c1] >= 0 && lut[c1] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c1]];
-    }
-    if constexpr (c2 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c2] >= 0 && lut[c2] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c2]];
-    }
-    if constexpr (c3 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c3] >= 0 && lut[c3] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c3]];
-    }
-    if constexpr (c4 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c4] >= 0 && lut[c4] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c4]];
-    }
-    if constexpr (c5 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c5] >= 0 && lut[c5] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c5]];
-    }
-    if constexpr (c6 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c6] >= 0 && lut[c6] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c6]];
-    }
-    if constexpr (c7 != READ_CHANNEL_NONE)
-    {
-      static_assert(lut[c7] >= 0 && lut[c7] < MAX_OUTPUT_CHANNELS);
-      *(dest++) = src[lut[c7]];
-    }
-
-    src += luts[static_cast(mode)].second;
-  }
-}
-
diff --git a/src/util/cubeb_audio_stream.cpp b/src/util/cubeb_audio_stream.cpp
index 754c8a3d7..85579c44d 100644
--- a/src/util/cubeb_audio_stream.cpp
+++ b/src/util/cubeb_audio_stream.cpp
@@ -116,37 +116,11 @@ bool CubebAudioStream::Initialize(const char* driver_name, const char* device_na
     return false;
   }
 
-  static constexpr const std::array,
-                                    static_cast(AudioExpansionMode::Count)>
-    channel_setups = {{
-      // Disabled
-      {CUBEB_LAYOUT_STEREO, StereoSampleReaderImpl},
-      // StereoLFE
-      {CUBEB_LAYOUT_STEREO_LFE, &SampleReaderImpl},
-      // Quadraphonic
-      {CUBEB_LAYOUT_QUAD, &SampleReaderImpl},
-      // QuadraphonicLFE
-      {CUBEB_LAYOUT_QUAD_LFE,
-       &SampleReaderImpl},
-      // Surround51
-      {CUBEB_LAYOUT_3F2_LFE_BACK,
-       &SampleReaderImpl},
-      // Surround71
-      {CUBEB_LAYOUT_3F4_LFE,
-       &SampleReaderImpl},
-    }};
-
   cubeb_stream_params params = {};
   params.format = CUBEB_SAMPLE_S16LE;
   params.rate = m_sample_rate;
-  params.channels = m_output_channels;
-  params.layout = channel_setups[static_cast(m_parameters.expansion_mode)].first;
+  params.channels = NUM_CHANNELS;
+  params.layout = CUBEB_LAYOUT_STEREO;
   params.prefs = CUBEB_STREAM_PREF_NONE;
 
   u32 latency_frames = GetBufferSizeForMS(
@@ -215,7 +189,7 @@ bool CubebAudioStream::Initialize(const char* driver_name, const char* device_na
     }
   }
 
-  BaseInitialize(channel_setups[static_cast(m_parameters.expansion_mode)].second);
+  BaseInitialize();
 
   char stream_name[32];
   std::snprintf(stream_name, sizeof(stream_name), "%p", this);
diff --git a/src/util/sdl_audio_stream.cpp b/src/util/sdl_audio_stream.cpp
index 3fbd3623a..822863898 100644
--- a/src/util/sdl_audio_stream.cpp
+++ b/src/util/sdl_audio_stream.cpp
@@ -79,30 +79,9 @@ bool SDLAudioStream::OpenDevice(Error* error)
 {
   DebugAssert(!IsOpen());
 
-  static constexpr const std::array(AudioExpansionMode::Count)> sample_readers = {{
-    // Disabled
-    &StereoSampleReaderImpl,
-    // StereoLFE
-    &SampleReaderImpl,
-    // Quadraphonic
-    &SampleReaderImpl,
-    // QuadraphonicLFE
-    &SampleReaderImpl,
-    // Surround51
-    &SampleReaderImpl,
-    // Surround71
-    &SampleReaderImpl,
-  }};
-
   SDL_AudioSpec spec = {};
   spec.freq = m_sample_rate;
-  spec.channels = m_output_channels;
+  spec.channels = NUM_CHANNELS;
   spec.format = AUDIO_S16;
   spec.samples = static_cast(GetBufferSizeForMS(
     m_sample_rate, (m_parameters.output_latency_ms == 0) ? m_parameters.buffer_ms : m_parameters.output_latency_ms));
@@ -119,7 +98,7 @@ bool SDLAudioStream::OpenDevice(Error* error)
 
   DEV_LOG("Requested {} frame buffer, got {} frame buffer", spec.samples, obtained_spec.samples);
 
-  BaseInitialize(sample_readers[static_cast(m_parameters.expansion_mode)]);
+  BaseInitialize();
   SDL_PauseAudioDevice(m_device_id, 0);
 
   return true;
@@ -143,7 +122,7 @@ void SDLAudioStream::CloseDevice()
 void SDLAudioStream::AudioCallback(void* userdata, uint8_t* stream, int len)
 {
   SDLAudioStream* const this_ptr = static_cast(userdata);
-  const u32 num_frames = len / sizeof(SampleType) / this_ptr->m_output_channels;
+  const u32 num_frames = len / sizeof(SampleType) / NUM_CHANNELS;
 
   this_ptr->ReadFrames(reinterpret_cast(stream), num_frames);
 }
diff --git a/src/util/util.props b/src/util/util.props
index 22659e3c2..0e355a7ad 100644
--- a/src/util/util.props
+++ b/src/util/util.props
@@ -6,7 +6,7 @@
     
       %(PreprocessorDefinitions);CPUINFO_SHARED=1;ENABLE_VULKAN=1
       %(PreprocessorDefinitions);ENABLE_OPENGL=1
-      %(AdditionalIncludeDirectories);$(SolutionDir)dep\xxhash\include;$(SolutionDir)dep\freesurround\include;$(SolutionDir)dep\kissfft\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\d3d12ma\include;$(SolutionDir)dep\vulkan\include;$(SolutionDir)dep\ffmpeg\include
+      %(AdditionalIncludeDirectories);$(SolutionDir)dep\xxhash\include;$(SolutionDir)dep\kissfft\include;$(SolutionDir)dep\imgui\include;$(SolutionDir)dep\simpleini\include;$(SolutionDir)dep\libchdr\include;$(SolutionDir)dep\cubeb\include;$(SolutionDir)dep\d3d12ma\include;$(SolutionDir)dep\vulkan\include;$(SolutionDir)dep\ffmpeg\include
       %(AdditionalIncludeDirectories);$(SolutionDir)dep\glad\include
     
   
diff --git a/src/util/util.vcxproj b/src/util/util.vcxproj
index f98030be4..f8e8b2fa5 100644
--- a/src/util/util.vcxproj
+++ b/src/util/util.vcxproj
@@ -211,9 +211,6 @@
     
       {f351c4d8-594a-4850-b77b-3c1249812cce}
     
-    
-      {1b0366e5-6f82-47b4-9fdd-d699c86aa077}
-    
     
       {bb08260f-6fbc-46af-8924-090ee71360c6}