From 00634f68cc0fc187068c9df08a4ea3564938c60a Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 1 Sep 2024 13:16:10 +1000 Subject: [PATCH] AudioStream: Rewrite and integrate expander --- data/resources/thirdparty.html | 345 ------ dep/CMakeLists.txt | 2 - dep/freesurround/CMakeLists.txt | 10 - dep/freesurround/GPL.txt | 339 ------ dep/freesurround/freesurround.vcxproj | 26 - dep/freesurround/freesurround.vcxproj.filters | 10 - .../include/freesurround_decoder.h | 191 --- dep/freesurround/src/channelmaps.cpp | 612 ---------- dep/freesurround/src/freesurround_decoder.cpp | 319 ----- duckstation.sln | 31 - src/util/CMakeLists.txt | 4 +- src/util/audio_stream.cpp | 696 ++++++++--- src/util/audio_stream.h | 61 +- src/util/audio_stream_channel_maps.inl | 1022 +++++++++++++++++ src/util/util.props | 2 +- src/util/util.vcxproj | 7 +- src/util/util.vcxproj.filters | 1 + 17 files changed, 1582 insertions(+), 2096 deletions(-) delete mode 100644 dep/freesurround/CMakeLists.txt delete mode 100644 dep/freesurround/GPL.txt delete mode 100644 dep/freesurround/freesurround.vcxproj delete mode 100644 dep/freesurround/freesurround.vcxproj.filters delete mode 100644 dep/freesurround/include/freesurround_decoder.h delete mode 100644 dep/freesurround/src/channelmaps.cpp delete mode 100644 dep/freesurround/src/freesurround_decoder.cpp create mode 100644 src/util/audio_stream_channel_maps.inl 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/util/CMakeLists.txt b/src/util/CMakeLists.txt
index b57d72d7f..c37eff443 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -1,6 +1,7 @@
 add_library(util
   audio_stream.cpp
   audio_stream.h
+  audio_stream_channel_maps.inl
   cd_image.cpp
   cd_image.h
   cd_image_bin.cpp
@@ -77,7 +78,7 @@ target_precompile_headers(util PRIVATE "pch.h")
 target_include_directories(util PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
 target_include_directories(util PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
 target_link_libraries(util PUBLIC common simpleini imgui)
-target_link_libraries(util PRIVATE libchdr JPEG::JPEG PNG::PNG WebP::libwebp ZLIB::ZLIB SoundTouch::SoundTouchDLL xxhash Zstd::Zstd reshadefx)
+target_link_libraries(util PRIVATE libchdr JPEG::JPEG PNG::PNG WebP::libwebp ZLIB::ZLIB SoundTouch::SoundTouchDLL xxhash Zstd::Zstd reshadefx kissfft)
 
 if(ENABLE_X11)
   target_compile_definitions(util PRIVATE "-DENABLE_X11=1")
@@ -184,7 +185,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..3447510a2 100644
--- a/src/util/audio_stream.cpp
+++ b/src/util/audio_stream.cpp
@@ -1,7 +1,8 @@
 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin 
-// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
+// SPDX-License-Identifier: PolyForm-Strict-1.0.0
 
 #include "audio_stream.h"
+#include "audio_stream_channel_maps.inl"
 #include "host.h"
 
 #include "common/align.h"
@@ -12,13 +13,10 @@
 #include "common/settings_interface.h"
 #include "common/timer.h"
 
+#include "kiss_fftr.h"
 #include "soundtouch/SoundTouch.h"
 #include "soundtouch/SoundTouchDLL.h"
 
-#ifndef __ANDROID__
-#include "freesurround_decoder.h"
-#endif
-
 #include 
 #include 
 #include 
@@ -28,15 +26,25 @@ Log_SetChannel(AudioStream);
 
 static constexpr bool LOG_TIMESTRETCH_STATS = false;
 
-static constexpr const std::array, static_cast(AudioExpansionMode::Count)>
+namespace {
+struct ExpansionChannelSetup
+{
+  const ExpandLUT* channel_lut;
+  const s8* channel_xsf;
+  u8 output_channels;
+  bool has_lfe;
+};
+
+static constexpr const std::array(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
+    {CHANNEL_LUT_STEREO, CHANNEL_LUT_STEREO_XSF, static_cast(2), false},   // Disabled
+    {CHANNEL_LUT_STEREO, CHANNEL_LUT_STEREO_XSF, static_cast(3), true},    // StereoLFE
+    {CHANNEL_LUT_4POINT1, CHANNEL_LUT_4POINT1_XSF, static_cast(4), false}, // Quadraphonic
+    {CHANNEL_LUT_4POINT1, CHANNEL_LUT_4POINT1_XSF, static_cast(5), true},  // QuadraphonicLFE
+    {CHANNEL_LUT_5POINT1, CHANNEL_LUT_5POINT1_XSF, static_cast(6), true},  // Surround51
+    {CHANNEL_LUT_7POINT1, CHANNEL_LUT_7POINT1_XSF, static_cast(8), true},  // Surround71
   }};
+} // namespace
 
 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 +53,118 @@ 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);
+  expansion_mode =
+    AudioStream::ParseExpansionMode(
+      si.GetStringValue(section, "ExpansionMode", AudioStream::GetExpansionModeName(DEFAULT_EXPANSION_MODE)).c_str())
+      .value_or(DEFAULT_EXPANSION_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);
+
+  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);
+}
+
 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_output_channels(s_expansion_channel_count[static_cast(parameters.expansion_mode)].output_channels)
 {
 }
 
@@ -316,7 +432,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);
+      m_sample_reader(samples, &m_buffer[rpos * m_output_channels], end);
       rpos += end;
       rpos = (rpos == m_buffer_size) ? 0 : rpos;
     }
@@ -434,16 +550,16 @@ 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 * m_output_channels], data, end * m_output_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 * m_output_channels, start * m_output_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 * m_output_channels], data, num_frames * m_output_channels * sizeof(SampleType));
     wpos += num_frames;
   }
 
@@ -469,12 +585,9 @@ 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);
-
-  if (IsExpansionEnabled())
-    m_expand_buffer = std::make_unique(m_parameters.expand_block_size * NUM_INPUT_CHANNELS);
+  m_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, m_buffer_size * m_output_channels);
+  m_staging_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, CHUNK_SIZE * m_output_channels);
+  m_float_buffer = Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, CHUNK_SIZE * m_output_channels);
 
   DEV_LOG(
     "Allocated buffer of {} frames for buffer of {} ms [expansion {} (block size {}), stretch {}, target size {}].",
@@ -484,7 +597,6 @@ void AudioStream::AllocateBuffer()
 
 void AudioStream::DestroyBuffer()
 {
-  m_expand_buffer.reset();
   m_staging_buffer.reset();
   m_float_buffer.reset();
   m_buffer.reset();
@@ -495,14 +607,8 @@ void AudioStream::DestroyBuffer()
 
 void AudioStream::EmptyBuffer()
 {
-#ifndef __ANDROID__
   if (IsExpansionEnabled())
-  {
-    m_expander->Flush();
-    m_expand_output_buffer = nullptr;
-    m_expand_buffer_pos = 0;
-  }
-#endif
+    ExpandFlush();
 
   if (IsStretchEnabled())
   {
@@ -569,7 +675,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 +687,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 +700,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,47 +710,11 @@ 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
@@ -664,27 +734,27 @@ void AudioStream::EndWrite(u32 num_frames)
     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,
+    S16ChunkToFloat(m_staging_buffer.get(),
+                    &m_expand_inbuf[m_parameters.expand_block_size + (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);
+    if (m_expand_has_block)
+      StretchWriteBlock(&m_expand_outbuf[m_expand_buffer_pos * m_output_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());
+      m_expand_has_block = true;
+      ExpandDecode();
     }
   }
   else
-#endif
   {
     S16ChunkToFloat(m_staging_buffer.get(), m_float_buffer.get(), CHUNK_SIZE * NUM_INPUT_CHANNELS);
     StretchWriteBlock(m_float_buffer.get());
@@ -706,7 +776,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, m_output_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 +818,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 * m_output_channels);
       InternalWriteFrames(m_staging_buffer.get(), tempProgress);
     }
 
@@ -757,7 +827,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 * m_output_channels);
     InternalWriteFrames(m_staging_buffer.get(), CHUNK_SIZE);
   }
 }
@@ -892,115 +962,383 @@ void AudioStream::StretchOverrun()
   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)
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// Channel expander based on FreeSurround: https://hydrogenaud.io/index.php/topic,52235.0.html
+// Rewritten with vectorization, performance improvements and integration for DuckStation.
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static constexpr float EXPAND_PI = 3.141592654f;
+static constexpr float EXPAND_EPSILON = 0.000001f;
+static constexpr GSVector4 EXPAND_VPI = GSVector4::cxpr64(EXPAND_PI);
+
+ALWAYS_INLINE static GSVector4 vsqr(GSVector4 v)
 {
-  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);
+  return v.mul64(v);
+}
+
+ALWAYS_INLINE static GSVector4 vsqrt(GSVector4 v)
+{
+#if 0
+  // for diff purposes
+  return GSVector4::f64(std::sqrt(v.extract64<0>()), std::sqrt(v.extract64<1>()));
 #else
-  expansion_mode = AudioExpansionMode::Disabled;
+  return v.sqrt64();
 #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
+ALWAYS_INLINE static GSVector4 vatan2(GSVector4 x, GSVector4 y)
 {
-  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);
+  return GSVector4::f64(std::atan2(x.extract64<0>(), y.extract64<0>()), std::atan2(x.extract64<1>(), y.extract64<1>()));
 }
 
-void AudioStreamParameters::Clear(SettingsInterface& si, const char* section)
+ALWAYS_INLINE static GSVector4 vlen(GSVector4 x, GSVector4 y)
 {
-  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");
+  // TODO: Replace with dot product
+  return vsqrt(x.sqr64().add64(y.sqr64()));
 }
 
-bool AudioStreamParameters::operator!=(const AudioStreamParameters& rhs) const
+ALWAYS_INLINE static GSVector4 vsin(GSVector4 v)
 {
-  return (std::memcmp(this, &rhs, sizeof(*this)) != 0);
+  return GSVector4::f64(std::sin(v.extract64<0>()), std::sin(v.extract64<1>()));
 }
 
-bool AudioStreamParameters::operator==(const AudioStreamParameters& rhs) const
+ALWAYS_INLINE static GSVector4 vcos(GSVector4 v)
 {
-  return (std::memcmp(this, &rhs, sizeof(*this)) == 0);
+  return GSVector4::f64(std::cos(v.extract64<0>()), std::cos(v.extract64<1>()));
+}
+
+ALWAYS_INLINE static GSVector4 vsign(GSVector4 x)
+{
+  const GSVector4 zero = GSVector4::zero();
+  const GSVector4 zeromask = x.eq64(zero);
+  const GSVector4 signbit = GSVector4::cxpr64(1.0) | (x & GSVector4::cxpr64(static_cast(0x8000000000000000ULL)));
+  return signbit.blend32(zero, zeromask);
+}
+
+ALWAYS_INLINE static GSVector4 vpow(GSVector4 x, double y)
+{
+  return GSVector4::f64(std::pow(x.extract64<0>(), y), std::pow(x.extract64<1>(), y));
+}
+
+ALWAYS_INLINE_RELEASE static GSVector4 vclamp1(GSVector4 v)
+{
+  return v.max64(GSVector4::cxpr64(-1.0)).min64(GSVector4::cxpr64(1.0));
+}
+
+ALWAYS_INLINE_RELEASE static std::pair GetPolar(GSVector4 a, GSVector4 p)
+{
+  return {a.mul64(vcos(p)), a.mul64(vsin(p))};
+}
+
+ALWAYS_INLINE_RELEASE static GSVector4 EdgeDistance(const GSVector4& a)
+{
+  // TODO: Replace with rcp (but probably not on arm, due to precision...)
+  const GSVector4 tan_a = GSVector4::f64(std::tan(a.extract64<0>()), std::tan(a.extract64<1>()));
+  const GSVector4 v0 = vsqrt(GSVector4::cxpr64(1.0).add64(vsqr(tan_a)));
+  const GSVector4 v1 = vsqrt(GSVector4::cxpr64(1.0).add64(vsqr(GSVector4::cxpr64(1.0).div64(tan_a))));
+  return v0.min64(v1);
+}
+
+ALWAYS_INLINE_RELEASE static void TransformDecode(GSVector4 a, GSVector4 p, GSVector4& x, GSVector4& y)
+{
+  // TODO: pow() instead?
+  // clang-format off
+  x = vclamp1(GSVector4::cxpr64(1.0047).mul64(a).add64(GSVector4::cxpr64(0.46804).mul64(a).mul64(p).mul64(p).mul64(p)).sub64(GSVector4::cxpr64(0.2042).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.0080586).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(GSVector4::cxpr64(0.0001526).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(
+    GSVector4::cxpr64(0.073512).mul64(a).mul64(a).mul64(a).mul64(p)).sub64(GSVector4::cxpr64(0.2499).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.016932).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(
+    GSVector4::cxpr64(0.00027707).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.048105).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(
+    GSVector4::cxpr64(0.0065947).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.0016006).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(
+    GSVector4::cxpr64(0.0071132).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.0022336).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).sub64(
+    GSVector4::cxpr64(0.0004804).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)));
+  y = vclamp1(GSVector4::cxpr64(0.98592).sub64(GSVector4::cxpr64(0.62237).mul64(p)).add64(GSVector4::cxpr64(0.077875).mul64(p).mul64(p)).sub64(GSVector4::cxpr64(0.0026929).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(GSVector4::cxpr64(0.4971).mul64(a).mul64(a).mul64(p)).sub64(
+    GSVector4::cxpr64(0.00032124).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(9.2491e-006).mul64(a).mul64(a).mul64(a).mul64(a).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p).mul64(p)).add64(
+    GSVector4::cxpr64(0.051549).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a)).add64(GSVector4::cxpr64(1.0727e-014).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a).mul64(a)));
+  // clang-format on
+}
+
+ALWAYS_INLINE_RELEASE static void TransformCircularWrap(GSVector4& x, GSVector4& y, double refangle)
+{
+  // TODO: Make angle int instead? Precompute the below.
+  if (refangle == 90.0)
+    return;
+
+  refangle = refangle * EXPAND_PI / 180;
+  const double baseangle = 90 * EXPAND_PI / 180;
+
+  // TODO: Move to caller. This one doesn't have clamp.
+  GSVector4 ang = vatan2(x, y);
+  GSVector4 len = vlen(x, y).div64(EdgeDistance(ang));
+
+  const GSVector4 front = ang.mul64(GSVector4::f64(refangle / baseangle));
+
+  // TODO: Replace div -> mul
+  const GSVector4 back = EXPAND_VPI.sub64(GSVector4::f64(refangle - 2.0 * EXPAND_PI)
+                                            .mul64(EXPAND_VPI.sub64(ang.abs64()))
+                                            .mul64(vsign(ang))
+                                            .div64(GSVector4::f64(2.0 * EXPAND_PI - baseangle))
+                                            .neg64());
+  const GSVector4 cwmask = ang.abs64().lt64(GSVector4::f64(baseangle / 2.0));
+  ang = back.blend32(front, cwmask);
+  len = len.mul64(EdgeDistance(ang));
+  x = vclamp1(vsin(ang).mul64(len));
+  y = vclamp1(vcos(ang).mul64(len));
+}
+
+ALWAYS_INLINE_RELEASE static void TransformFocus(GSVector4& x, GSVector4& y, double focus)
+{
+  if (focus == 0.0)
+    return;
+
+  const GSVector4 ang = vatan2(x, y);
+  GSVector4 len = vclamp1(vlen(x, y).div64(EdgeDistance(ang)));
+  if (focus > 0.0)
+    len = GSVector4::cxpr64(1.0).sub64(vpow(GSVector4::cxpr64(1.0).sub64(len), 1.0 + focus * 20.0));
+  else
+    len = vpow(len, 1.0 - focus * 20.0);
+
+  len = len.mul64(EdgeDistance(ang));
+  x = vclamp1(vsin(ang).mul64(len));
+  y = vclamp1(vcos(ang).mul64(len));
+}
+
+ALWAYS_INLINE_RELEASE static std::pair MapToGrid(GSVector4& x)
+{
+  const GSVector4 gp = x.add64(GSVector4::cxpr64(1.0))
+                         .mul64(GSVector4::cxpr64(0.5))
+                         .mul64(GSVector4::cxpr64(static_cast(EXPAND_GRID_RES - 1)));
+  const GSVector4 i = GSVector4::cxpr64(static_cast(EXPAND_GRID_RES - 2)).min64(gp.floor64());
+  x = gp.sub64(i);
+
+  const GSVector4i ii = i.f64toi32();
+  return {ii.extract32<0>(), ii.extract32<1>()};
+}
+
+void AudioStream::ExpandAllocate()
+{
+  if (m_parameters.expansion_mode == AudioExpansionMode::Disabled)
+    return;
+
+  m_expand_buffer_pos = 0;
+  m_expand_has_block = false;
+
+  const u32 freqdomain_size = (m_parameters.expand_block_size / 2 + 1);
+  m_expand_convbuffer =
+    Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, m_parameters.expand_block_size * 2);
+  m_expand_freqdomain =
+    Common::make_unique_aligned_for_overwrite[]>(VECTOR_ALIGNMENT, freqdomain_size * 2);
+
+  m_expand_fft = kiss_fftr_alloc(m_parameters.expand_block_size, 0, 0, 0);
+  m_expand_ifft = kiss_fftr_alloc(m_parameters.expand_block_size, 1, 0, 0);
+
+  m_expand_inbuf = Common::make_unique_aligned(VECTOR_ALIGNMENT, 3 * m_parameters.expand_block_size);
+  m_expand_outbuf = Common::make_unique_aligned(
+    VECTOR_ALIGNMENT, (m_parameters.expand_block_size + m_parameters.expand_block_size / 2) * m_output_channels);
+  m_expand_signal =
+    Common::make_unique_aligned[]>(VECTOR_ALIGNMENT, freqdomain_size * m_output_channels);
+
+  m_expand_window =
+    Common::make_unique_aligned_for_overwrite(VECTOR_ALIGNMENT, m_parameters.expand_block_size);
+  for (unsigned k = 0; k < m_parameters.expand_block_size; k++)
+  {
+    m_expand_window[k] = std::sqrt(0.5 * (1 - std::cos(2 * EXPAND_PI * k / m_parameters.expand_block_size)) /
+                                   m_parameters.expand_block_size);
+  }
+
+  m_expand_lfe_low_cutoff =
+    (static_cast(m_parameters.expand_low_cutoff) / m_sample_rate * 2.0f) * (m_parameters.expand_block_size / 2);
+  m_expand_lfe_high_cutoff =
+    (static_cast(m_parameters.expand_high_cutoff) / m_sample_rate * 2.0f) * (m_parameters.expand_block_size / 2);
+}
+
+void AudioStream::ExpandFlush()
+{
+  std::memset(m_expand_inbuf.get(), 0, sizeof(float) * 3 * m_parameters.expand_block_size);
+  std::memset(m_expand_outbuf.get(), 0,
+              sizeof(float) * (m_parameters.expand_block_size + m_parameters.expand_block_size / 2) *
+                m_output_channels);
+
+  m_expand_buffer_pos = 0;
+  m_expand_has_block = false;
+}
+
+void AudioStream::ExpandDestroy()
+{
+  if (m_expand_ifft)
+  {
+    kiss_fftr_free(m_expand_ifft);
+    m_expand_ifft = nullptr;
+  }
+
+  if (m_expand_fft)
+  {
+    kiss_fftr_free(m_expand_fft);
+    m_expand_fft = nullptr;
+  }
+
+  m_expand_window.reset();
+  m_expand_signal = {};
+  m_expand_outbuf.reset();
+  m_expand_inbuf.reset();
+
+  m_expand_right_fd.reset();
+  m_expand_freqdomain.reset();
+  m_expand_convbuffer.reset();
+}
+
+ALWAYS_INLINE static void StoreCplxVec(std::complex* dst, const GSVector4& real, const GSVector4& imag)
+{
+  const GSVector4 slow = real.upld(imag);
+  const GSVector4 shigh = real.uphd(imag);
+  GSVector4::store(&dst[0], slow);
+  GSVector4::store(&dst[1], shigh);
+}
+
+void AudioStream::ExpandDecode()
+{
+  for (u32 half = 0; half < 2; half++)
+  {
+    const float* input = &m_expand_inbuf[half ? m_parameters.expand_block_size : 0];
+    const u32 block_size = m_parameters.expand_block_size;
+    const u32 freqdomain_size = block_size / 2 + 1;
+    DebugAssert((block_size % 4) == 0);
+    for (unsigned k = 0; k < block_size; k += 2)
+    {
+      const GSVector4 ivec = GSVector4::load(&input[k * 2]); // L,R,L,R
+      const GSVector4 vwnd = GSVector4::load(&m_expand_window[k]);
+      GSVector4::store(&m_expand_convbuffer[k], GSVector4::f32to64(ivec.xzzw()).mul64(vwnd));
+      GSVector4::store(&m_expand_convbuffer[block_size + k], GSVector4::f32to64(ivec.ywzw()).mul64(vwnd));
+    }
+    kiss_fftr(m_expand_fft, &m_expand_convbuffer[0], reinterpret_cast(&m_expand_freqdomain[0]));
+    kiss_fftr(m_expand_fft, &m_expand_convbuffer[block_size],
+              reinterpret_cast(&m_expand_freqdomain[freqdomain_size]));
+
+    // TODO: This should all actually be +1, because otherwise the last element isn't computed.
+    const ExpansionChannelSetup& csetup = s_expansion_channel_count[static_cast(m_parameters.expansion_mode)];
+    const u32 non_lfe_channels = csetup.output_channels - static_cast(csetup.has_lfe);
+    const u32 iterations = m_parameters.expand_block_size / 2u;
+    for (u32 f = 0; f < iterations; f += 2)
+    {
+      GSVector4 lf_real, lf_imag, rf_real, rf_imag;
+      {
+        GSVector4 lf_low = GSVector4::load(&m_expand_freqdomain[f]);
+        GSVector4 lf_high = GSVector4::load(&m_expand_freqdomain[f + 1]);
+        lf_real = lf_low.upld(lf_high);
+        lf_imag = lf_low.uphd(lf_high);
+        GSVector4 rf_low = GSVector4::load(&m_expand_freqdomain[freqdomain_size + f]);
+        GSVector4 rf_high = GSVector4::load(&m_expand_freqdomain[freqdomain_size + f + 1]);
+        rf_real = rf_low.upld(rf_high);
+        rf_imag = rf_low.uphd(rf_high);
+      }
+
+      const GSVector4 vampL = vlen(lf_real, lf_imag);
+      const GSVector4 vampR = vlen(rf_real, rf_imag);
+      const GSVector4 vphaseL = vatan2(lf_imag, lf_real);
+      const GSVector4 vphaseR = vatan2(rf_imag, rf_real);
+      const GSVector4 vampDiff =
+        vclamp1(vampR.sub64(vampL)
+                  .div64(vampR.add64(vampL))
+                  .blend32(GSVector4::zero(), vampL.add64(vampR).lt64(GSVector4::cxpr64(EXPAND_EPSILON))));
+      GSVector4 vphaseDiff = vphaseL.sub64(vphaseR).abs64();
+      vphaseDiff = vphaseDiff.blend32(GSVector4::cxpr64(2 * EXPAND_PI).sub64(vphaseDiff), vphaseDiff.gt64(EXPAND_VPI));
+
+      // Decode into soundfield position.
+      GSVector4 vx, vy;
+      TransformDecode(vampDiff, vphaseDiff, vx, vy);
+      TransformCircularWrap(vx, vy, m_parameters.expand_circular_wrap);
+      vy = vclamp1(vy.sub64(GSVector4::f64(m_parameters.expand_shift)));
+      vy = vclamp1(GSVector4::cxpr64(1.0).sub64(
+        GSVector4::cxpr64(1.0).sub64(vy).mul64(GSVector4::f64(m_parameters.expand_depth))));
+      TransformFocus(vx, vy, m_parameters.expand_focus);
+
+      // TODO: Replace with * 0.5
+      vx = vclamp1(vx.mul64(GSVector4::f64(m_parameters.expand_front_separation)
+                              .mul64(GSVector4::cxpr64(1.0).add64(vy))
+                              .div64(GSVector4::cxpr64(2.0))
+                              .add64(GSVector4::cxpr64(m_parameters.expand_rear_separation)
+                                       .mul64(GSVector4::cxpr64(1.0).sub64(vy))
+                                       .div64(GSVector4::cxpr64(2.0)))));
+
+      // TODO: Move earlier.
+      const GSVector4 vamp_total = vlen(vampL, vampR);
+      const GSVector4 vphase_of[] = {vphaseL, vatan2(lf_imag.add64(rf_imag), lf_real.add64(rf_real)), vphaseR};
+      const auto [p0, p1] = MapToGrid(vx);
+      const auto [q0, q1] = MapToGrid(vy);
+
+      GSVector4 vinv_lfe_level = GSVector4::cxpr64(1.0);
+      if (csetup.has_lfe && f < m_expand_lfe_high_cutoff)
+      {
+        const GSVector4 vlfe_level =
+          GSVector4::f64((f < m_expand_lfe_high_cutoff) ?
+                           ((f < m_expand_lfe_low_cutoff) ?
+                              1 :
+                              0.5 * (1 + std::cos(EXPAND_PI * (f - m_expand_lfe_low_cutoff) /
+                                                  (m_expand_lfe_high_cutoff - m_expand_lfe_low_cutoff)))) :
+                           0.0,
+                         ((f + 1) < m_expand_lfe_high_cutoff) ?
+                           (((f + 1) < m_expand_lfe_low_cutoff) ?
+                              1 :
+                              0.5 * (1 + std::cos(EXPAND_PI * ((f + 1) - m_expand_lfe_low_cutoff) /
+                                                  (m_expand_lfe_high_cutoff - m_expand_lfe_low_cutoff)))) :
+                           0.0);
+        vinv_lfe_level = GSVector4::cxpr64(1.0).sub64(vlfe_level);
+
+        const auto& [lfereal, lfeimag] = GetPolar(vamp_total, vphase_of[1]);
+        StoreCplxVec(&m_expand_signal[non_lfe_channels * freqdomain_size + f], lfereal.mul64(vlfe_level),
+                     lfeimag.mul64(vlfe_level));
+      }
+
+      for (u32 c = 0; c < non_lfe_channels; c++)
+      {
+        const ExpandLUT& a = csetup.channel_lut[c];
+        const GSVector4 inv_x = GSVector4::cxpr64(1.0).sub64(vx);
+        const GSVector4 inv_y = GSVector4::cxpr64(1.0).sub64(vy);
+        const GSVector4 w0 = GSVector4::f32to64(GSVector4(a[q0][p0], a[q1][p1]));
+        const GSVector4 w1 = GSVector4::f32to64(GSVector4(a[q0][p0 + 1], a[q1][p1 + 1]));
+        const GSVector4 w2 = GSVector4::f32to64(GSVector4(a[q0 + 1][p0], a[q1 + 1][p1]));
+        const GSVector4 w3 = GSVector4::f32to64(GSVector4(a[q0 + 1][p0 + 1], a[q1 + 1][p1 + 1]));
+        const auto& [sreal, simag] = GetPolar(vamp_total.mul64(inv_x.mul64(inv_y)
+                                                                 .mul64(w0)
+                                                                 .add64(vx.mul64(inv_y).mul64(w1))
+                                                                 .add64(inv_x.mul64(vy).mul64(w2))
+                                                                 .add64(vx.mul64(vy).mul64(w3))),
+                                              vphase_of[1 + csetup.channel_xsf[c]]);
+
+        // Subtract LFE from other channels.
+        StoreCplxVec(&m_expand_signal[c * freqdomain_size + f], sreal.mul64(vinv_lfe_level),
+                     simag.mul64(vinv_lfe_level));
+      }
+    }
+
+    std::memmove(&m_expand_outbuf[0], &m_expand_outbuf[m_output_channels * m_parameters.expand_block_size / 2],
+                 m_parameters.expand_block_size * m_output_channels * 4);
+    std::memset(&m_expand_outbuf[m_output_channels * m_parameters.expand_block_size], 0,
+                m_output_channels * 4 * m_parameters.expand_block_size / 2);
+
+    for (u32 c = 0; c < m_output_channels; c++)
+    {
+      // We computed the DC value to avoid masking stores, so zero it out.
+      std::complex* freqdomain = &m_expand_signal[c * freqdomain_size];
+      freqdomain[0] = 0;
+      kiss_fftri(m_expand_ifft, reinterpret_cast(freqdomain), &m_expand_convbuffer[0]);
+
+      // TODO: align, vectorize second half.
+      for (u32 k = 0; k < m_parameters.expand_block_size; k += 2)
+      {
+        const GSVector4 add =
+          GSVector4::load(&m_expand_window[k]).mul64(GSVector4::load(&m_expand_convbuffer[k]));
+        const size_t idx1 = (m_output_channels * (k + m_parameters.expand_block_size / 2) + c);
+        const size_t idx2 = (m_output_channels * ((k + 1) + m_parameters.expand_block_size / 2) + c);
+        m_expand_outbuf[idx1] = static_cast(m_expand_outbuf[idx1] + add.extract64<0>());
+        m_expand_outbuf[idx2] = static_cast(m_expand_outbuf[idx2] + add.extract64<1>());
+      }
+    }
+  }
+
+  std::memcpy(&m_expand_inbuf[0], &m_expand_inbuf[2 * m_parameters.expand_block_size],
+              4 * m_parameters.expand_block_size);
 }
diff --git a/src/util/audio_stream.h b/src/util/audio_stream.h
index 05297e083..d51a85371 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: PolyForm-Strict-1.0.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,
@@ -67,13 +70,14 @@ 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;
+  float expand_circular_wrap =
+    DEFAULT_EXPAND_CIRCULAR_WRAP;            // Angle of the front soundstage around the listener (90=default).
+  float expand_shift = DEFAULT_EXPAND_SHIFT; // Forward/backward offset of the soundstage.
+  float expand_depth = DEFAULT_EXPAND_DEPTH; // Backward extension of the soundstage.
+  float expand_focus = DEFAULT_EXPAND_FOCUS; // Localization of the sound events.
+  float expand_center_image = DEFAULT_EXPAND_CENTER_IMAGE;         // Presence of the center speaker.
+  float expand_front_separation = DEFAULT_EXPAND_FRONT_SEPARATION; // Front stereo separation.
+  float expand_rear_separation = DEFAULT_EXPAND_REAR_SEPARATION;   // Rear stereo 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;
@@ -161,8 +165,8 @@ public:
   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 GetInternalChannels() const { return m_output_channels; }
+  ALWAYS_INLINE u32 GetOutputChannels() const { return m_output_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; }
@@ -224,7 +228,6 @@ protected:
   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;
@@ -259,9 +262,10 @@ private:
 
   void InternalWriteFrames(SampleType* samples, u32 num_frames);
 
-#ifndef __ANDROID__
   void ExpandAllocate();
-#endif
+  void ExpandDestroy();
+  void ExpandDecode();
+  void ExpandFlush();
 
   void StretchAllocate();
   void StretchDestroy();
@@ -273,7 +277,7 @@ private:
   void UpdateStretchTempo();
 
   u32 m_buffer_size = 0;
-  std::unique_ptr m_buffer;
+  Common::unique_aligned_ptr m_buffer;
   SampleReader m_sample_reader = nullptr;
 
   std::atomic m_rpos{0};
@@ -295,19 +299,25 @@ 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;
+  Common::unique_aligned_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;
+  // expansion data
   u32 m_expand_buffer_pos = 0;
-#endif
+  bool m_expand_has_block = false;
+  float m_expand_lfe_low_cutoff = 0.0f;
+  float m_expand_lfe_high_cutoff = 0.0f;
+  Common::unique_aligned_ptr m_expand_convbuffer;
+  Common::unique_aligned_ptr[]> m_expand_freqdomain;
+  Common::unique_aligned_ptr[]> m_expand_right_fd;
+  kiss_fftr_state* m_expand_fft = nullptr;
+  kiss_fftr_state* m_expand_ifft = nullptr;
+  Common::unique_aligned_ptr m_expand_inbuf;
+  Common::unique_aligned_ptr m_expand_outbuf;
+  Common::unique_aligned_ptr m_expand_window;
+  Common::unique_aligned_ptr[]> m_expand_signal;
 };
 
 template(mode)].second;
   }
 }
-
diff --git a/src/util/audio_stream_channel_maps.inl b/src/util/audio_stream_channel_maps.inl
new file mode 100644
index 000000000..780841c41
--- /dev/null
+++ b/src/util/audio_stream_channel_maps.inl
@@ -0,0 +1,1022 @@
+// SPDX-FileCopyrightText: 2007-2010 Christian Kothe, 2024 Connor McLaughlin 
+// Channel weights originally from FreeSurround: https://hydrogenaud.io/index.php/topic,52235.0.html
+
+#pragma once
+
+static constexpr int EXPAND_GRID_RES = 21;
+using ExpandLUT = const float (*)[EXPAND_GRID_RES];
+
+static constexpr const s8 CHANNEL_LUT_STEREO_XSF[] = {-1, 1};
+static constexpr const float CHANNEL_LUT_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 CHANNEL_LUT_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 s8 CHANNEL_LUT_4POINT1_XSF[] = {-1, 1, -1, 1};
+static constexpr const float CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 s8 CHANNEL_LUT_5POINT1_XSF[] = {-1, 0, 1, -1, 1};
+static constexpr const float CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 s8 CHANNEL_LUT_7POINT1_XSF[] = {-1, 0, 1, -1, 1, -1, 1};
+static constexpr const float CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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 CHANNEL_LUT_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}};
+
+static constexpr const ExpandLUT CHANNEL_LUT_STEREO[] = {
+  CHANNEL_LUT_STEREO_LF,
+  CHANNEL_LUT_STEREO_RF,
+  CHANNEL_LUT_LFE,
+};
+static constexpr const ExpandLUT CHANNEL_LUT_4POINT1[] = {
+  CHANNEL_LUT_4POINT1_LF, CHANNEL_LUT_4POINT1_RF, CHANNEL_LUT_4POINT1_LS, CHANNEL_LUT_4POINT1_RS, CHANNEL_LUT_LFE,
+};
+static constexpr const ExpandLUT CHANNEL_LUT_5POINT1[] = {
+  CHANNEL_LUT_5POINT1_LF, CHANNEL_LUT_5POINT1_CF, CHANNEL_LUT_5POINT1_RF,
+  CHANNEL_LUT_5POINT1_LS, CHANNEL_LUT_5POINT1_RS, CHANNEL_LUT_LFE,
+};
+static constexpr const ExpandLUT CHANNEL_LUT_7POINT1[] = {
+  CHANNEL_LUT_7POINT1_LF,  CHANNEL_LUT_7POINT1_CF, CHANNEL_LUT_7POINT1_RF, CHANNEL_LUT_7POINT1_LSM,
+  CHANNEL_LUT_7POINT1_RSM, CHANNEL_LUT_7POINT1_LS, CHANNEL_LUT_7POINT1_RS, CHANNEL_LUT_LFE,
+};
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..d26547094 100644
--- a/src/util/util.vcxproj
+++ b/src/util/util.vcxproj
@@ -211,12 +211,12 @@
     
       {f351c4d8-594a-4850-b77b-3c1249812cce}
     
-    
-      {1b0366e5-6f82-47b4-9fdd-d699c86aa077}
-    
     
       {bb08260f-6fbc-46af-8924-090ee71360c6}
     
+    
+      {a81d3f54-c58a-4b2d-8076-d4e483db2e65}
+    
     
       {425d6c99-d1c8-43c2-b8ac-4d7b1d941017}
     
@@ -235,6 +235,7 @@
       true
       Document
     
+    
     
       true
     
diff --git a/src/util/util.vcxproj.filters b/src/util/util.vcxproj.filters
index 48eb3ef1e..36b145fe9 100644
--- a/src/util/util.vcxproj.filters
+++ b/src/util/util.vcxproj.filters
@@ -158,5 +158,6 @@
   
     
     
+    
   
 
\ No newline at end of file