diff --git a/build/android_ndk/Android.mk b/build/android_ndk/Android.mk
index 2ffb6ef74d0..2e5d72ca2d6 100644
--- a/build/android_ndk/Android.mk
+++ b/build/android_ndk/Android.mk
@@ -196,8 +196,9 @@ LOCAL_SRC_FILES += \
soundlib/Load_stm.cpp \
soundlib/Load_stp.cpp \
soundlib/Load_symmod.cpp \
- soundlib/Load_ult.cpp \
soundlib/Load_uax.cpp \
+ soundlib/Load_ult.cpp \
+ soundlib/Load_unic.cpp \
soundlib/Load_wav.cpp \
soundlib/Load_xm.cpp \
soundlib/Load_xmf.cpp \
diff --git a/build/autotools/Makefile.am b/build/autotools/Makefile.am
index 8084f1bba81..9351c9144f1 100644
--- a/build/autotools/Makefile.am
+++ b/build/autotools/Makefile.am
@@ -438,6 +438,7 @@ MPT_FILES_SOUNDLIB += soundlib/Load_stp.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_symmod.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_uax.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_ult.cpp
+MPT_FILES_SOUNDLIB += soundlib/Load_unic.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_wav.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_xm.cpp
MPT_FILES_SOUNDLIB += soundlib/Load_xmf.cpp
diff --git a/build/vs2017winxp/OpenMPT-ANSI.vcxproj b/build/vs2017winxp/OpenMPT-ANSI.vcxproj
index dc14d1fbe04..4c925bfef84 100644
--- a/build/vs2017winxp/OpenMPT-ANSI.vcxproj
+++ b/build/vs2017winxp/OpenMPT-ANSI.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters b/build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2017winxp/OpenMPT-ANSI.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxp/OpenMPT-UTF8.vcxproj b/build/vs2017winxp/OpenMPT-UTF8.vcxproj
index 41165ad91fd..66a6adaeeb1 100644
--- a/build/vs2017winxp/OpenMPT-UTF8.vcxproj
+++ b/build/vs2017winxp/OpenMPT-UTF8.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters b/build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2017winxp/OpenMPT-UTF8.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxp/OpenMPT.vcxproj b/build/vs2017winxp/OpenMPT.vcxproj
index 33fd15c93a2..f3b9e947e42 100644
--- a/build/vs2017winxp/OpenMPT.vcxproj
+++ b/build/vs2017winxp/OpenMPT.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxp/OpenMPT.vcxproj.filters b/build/vs2017winxp/OpenMPT.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxp/OpenMPT.vcxproj.filters
+++ b/build/vs2017winxp/OpenMPT.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxp/libopenmpt-small.vcxproj b/build/vs2017winxp/libopenmpt-small.vcxproj
index 65822c1d193..5d3053d3d9c 100644
--- a/build/vs2017winxp/libopenmpt-small.vcxproj
+++ b/build/vs2017winxp/libopenmpt-small.vcxproj
@@ -1033,6 +1033,7 @@
+
diff --git a/build/vs2017winxp/libopenmpt-small.vcxproj.filters b/build/vs2017winxp/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2017winxp/libopenmpt-small.vcxproj.filters
+++ b/build/vs2017winxp/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxp/libopenmpt.vcxproj b/build/vs2017winxp/libopenmpt.vcxproj
index c143c7f8d08..83cae72d8db 100644
--- a/build/vs2017winxp/libopenmpt.vcxproj
+++ b/build/vs2017winxp/libopenmpt.vcxproj
@@ -1033,6 +1033,7 @@
+
diff --git a/build/vs2017winxp/libopenmpt.vcxproj.filters b/build/vs2017winxp/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2017winxp/libopenmpt.vcxproj.filters
+++ b/build/vs2017winxp/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxp/libopenmpt_test.vcxproj b/build/vs2017winxp/libopenmpt_test.vcxproj
index 6c7e98b861b..242f83efc0c 100644
--- a/build/vs2017winxp/libopenmpt_test.vcxproj
+++ b/build/vs2017winxp/libopenmpt_test.vcxproj
@@ -1074,6 +1074,7 @@
+
diff --git a/build/vs2017winxp/libopenmpt_test.vcxproj.filters b/build/vs2017winxp/libopenmpt_test.vcxproj.filters
index c912baaf30c..ca6c3148706 100644
--- a/build/vs2017winxp/libopenmpt_test.vcxproj.filters
+++ b/build/vs2017winxp/libopenmpt_test.vcxproj.filters
@@ -1382,6 +1382,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj b/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj
index e47cb63d2b8..d969f83e852 100644
--- a/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj
+++ b/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj.filters b/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2017winxpansi/OpenMPT-ANSI.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj b/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj
index f501b5d595b..fbd1bff5f5e 100644
--- a/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj
+++ b/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj.filters b/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2017winxpansi/OpenMPT-UTF8.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/OpenMPT.vcxproj b/build/vs2017winxpansi/OpenMPT.vcxproj
index 54352372f71..a76fb73f4c7 100644
--- a/build/vs2017winxpansi/OpenMPT.vcxproj
+++ b/build/vs2017winxpansi/OpenMPT.vcxproj
@@ -1402,6 +1402,7 @@
+
diff --git a/build/vs2017winxpansi/OpenMPT.vcxproj.filters b/build/vs2017winxpansi/OpenMPT.vcxproj.filters
index a67fb686cc5..294a1c27658 100644
--- a/build/vs2017winxpansi/OpenMPT.vcxproj.filters
+++ b/build/vs2017winxpansi/OpenMPT.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/libopenmpt-small.vcxproj b/build/vs2017winxpansi/libopenmpt-small.vcxproj
index af521974810..9a13c4481f4 100644
--- a/build/vs2017winxpansi/libopenmpt-small.vcxproj
+++ b/build/vs2017winxpansi/libopenmpt-small.vcxproj
@@ -1033,6 +1033,7 @@
+
diff --git a/build/vs2017winxpansi/libopenmpt-small.vcxproj.filters b/build/vs2017winxpansi/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2017winxpansi/libopenmpt-small.vcxproj.filters
+++ b/build/vs2017winxpansi/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/libopenmpt.vcxproj b/build/vs2017winxpansi/libopenmpt.vcxproj
index 7bebfd09dfe..55334fe8e76 100644
--- a/build/vs2017winxpansi/libopenmpt.vcxproj
+++ b/build/vs2017winxpansi/libopenmpt.vcxproj
@@ -1033,6 +1033,7 @@
+
diff --git a/build/vs2017winxpansi/libopenmpt.vcxproj.filters b/build/vs2017winxpansi/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2017winxpansi/libopenmpt.vcxproj.filters
+++ b/build/vs2017winxpansi/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2017winxpansi/libopenmpt_test.vcxproj b/build/vs2017winxpansi/libopenmpt_test.vcxproj
index 08c60bfc72f..7c9b46dd4d1 100644
--- a/build/vs2017winxpansi/libopenmpt_test.vcxproj
+++ b/build/vs2017winxpansi/libopenmpt_test.vcxproj
@@ -1074,6 +1074,7 @@
+
diff --git a/build/vs2017winxpansi/libopenmpt_test.vcxproj.filters b/build/vs2017winxpansi/libopenmpt_test.vcxproj.filters
index c912baaf30c..ca6c3148706 100644
--- a/build/vs2017winxpansi/libopenmpt_test.vcxproj.filters
+++ b/build/vs2017winxpansi/libopenmpt_test.vcxproj.filters
@@ -1382,6 +1382,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/OpenMPT-ANSI.vcxproj b/build/vs2019win7/OpenMPT-ANSI.vcxproj
index b0cd3685e7a..dc58392b004 100644
--- a/build/vs2019win7/OpenMPT-ANSI.vcxproj
+++ b/build/vs2019win7/OpenMPT-ANSI.vcxproj
@@ -1421,6 +1421,7 @@
+
diff --git a/build/vs2019win7/OpenMPT-ANSI.vcxproj.filters b/build/vs2019win7/OpenMPT-ANSI.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2019win7/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2019win7/OpenMPT-ANSI.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/OpenMPT-UTF8.vcxproj b/build/vs2019win7/OpenMPT-UTF8.vcxproj
index 96975d49367..9b2d729d891 100644
--- a/build/vs2019win7/OpenMPT-UTF8.vcxproj
+++ b/build/vs2019win7/OpenMPT-UTF8.vcxproj
@@ -1421,6 +1421,7 @@
+
diff --git a/build/vs2019win7/OpenMPT-UTF8.vcxproj.filters b/build/vs2019win7/OpenMPT-UTF8.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2019win7/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2019win7/OpenMPT-UTF8.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/OpenMPT.vcxproj b/build/vs2019win7/OpenMPT.vcxproj
index e7fdb5f62cb..5634fd2f097 100644
--- a/build/vs2019win7/OpenMPT.vcxproj
+++ b/build/vs2019win7/OpenMPT.vcxproj
@@ -1421,6 +1421,7 @@
+
diff --git a/build/vs2019win7/OpenMPT.vcxproj.filters b/build/vs2019win7/OpenMPT.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2019win7/OpenMPT.vcxproj.filters
+++ b/build/vs2019win7/OpenMPT.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/libopenmpt-small.vcxproj b/build/vs2019win7/libopenmpt-small.vcxproj
index aeb95ab7538..84c4aff8c7a 100644
--- a/build/vs2019win7/libopenmpt-small.vcxproj
+++ b/build/vs2019win7/libopenmpt-small.vcxproj
@@ -1030,6 +1030,7 @@
+
diff --git a/build/vs2019win7/libopenmpt-small.vcxproj.filters b/build/vs2019win7/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2019win7/libopenmpt-small.vcxproj.filters
+++ b/build/vs2019win7/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/libopenmpt.vcxproj b/build/vs2019win7/libopenmpt.vcxproj
index 0c0a290d182..9cdd8cfde03 100644
--- a/build/vs2019win7/libopenmpt.vcxproj
+++ b/build/vs2019win7/libopenmpt.vcxproj
@@ -1030,6 +1030,7 @@
+
diff --git a/build/vs2019win7/libopenmpt.vcxproj.filters b/build/vs2019win7/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2019win7/libopenmpt.vcxproj.filters
+++ b/build/vs2019win7/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2019win7/libopenmpt_test.vcxproj b/build/vs2019win7/libopenmpt_test.vcxproj
index c7a70c034d0..02c4092d273 100644
--- a/build/vs2019win7/libopenmpt_test.vcxproj
+++ b/build/vs2019win7/libopenmpt_test.vcxproj
@@ -1071,6 +1071,7 @@
+
diff --git a/build/vs2019win7/libopenmpt_test.vcxproj.filters b/build/vs2019win7/libopenmpt_test.vcxproj.filters
index 828ba41e628..e79f9f2ec38 100644
--- a/build/vs2019win7/libopenmpt_test.vcxproj.filters
+++ b/build/vs2019win7/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/OpenMPT-ANSI.vcxproj b/build/vs2022win10/OpenMPT-ANSI.vcxproj
index ed60bb49236..5e58f5e6175 100644
--- a/build/vs2022win10/OpenMPT-ANSI.vcxproj
+++ b/build/vs2022win10/OpenMPT-ANSI.vcxproj
@@ -2235,6 +2235,7 @@
+
diff --git a/build/vs2022win10/OpenMPT-ANSI.vcxproj.filters b/build/vs2022win10/OpenMPT-ANSI.vcxproj.filters
index 22f21229842..d5559bc84de 100644
--- a/build/vs2022win10/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2022win10/OpenMPT-ANSI.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/OpenMPT-UTF8.vcxproj b/build/vs2022win10/OpenMPT-UTF8.vcxproj
index be7d02d84ae..a13b3bb9c05 100644
--- a/build/vs2022win10/OpenMPT-UTF8.vcxproj
+++ b/build/vs2022win10/OpenMPT-UTF8.vcxproj
@@ -2235,6 +2235,7 @@
+
diff --git a/build/vs2022win10/OpenMPT-UTF8.vcxproj.filters b/build/vs2022win10/OpenMPT-UTF8.vcxproj.filters
index 22f21229842..d5559bc84de 100644
--- a/build/vs2022win10/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2022win10/OpenMPT-UTF8.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/OpenMPT.vcxproj b/build/vs2022win10/OpenMPT.vcxproj
index 75c3a17da1e..d1bf838cd5a 100644
--- a/build/vs2022win10/OpenMPT.vcxproj
+++ b/build/vs2022win10/OpenMPT.vcxproj
@@ -2235,6 +2235,7 @@
+
diff --git a/build/vs2022win10/OpenMPT.vcxproj.filters b/build/vs2022win10/OpenMPT.vcxproj.filters
index 22f21229842..d5559bc84de 100644
--- a/build/vs2022win10/OpenMPT.vcxproj.filters
+++ b/build/vs2022win10/OpenMPT.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/libopenmpt-small.vcxproj b/build/vs2022win10/libopenmpt-small.vcxproj
index aa05c159b7c..a075376a8f1 100644
--- a/build/vs2022win10/libopenmpt-small.vcxproj
+++ b/build/vs2022win10/libopenmpt-small.vcxproj
@@ -1718,6 +1718,7 @@
+
diff --git a/build/vs2022win10/libopenmpt-small.vcxproj.filters b/build/vs2022win10/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win10/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/libopenmpt.vcxproj b/build/vs2022win10/libopenmpt.vcxproj
index 8b4c2ffb2c0..91e6c3624bd 100644
--- a/build/vs2022win10/libopenmpt.vcxproj
+++ b/build/vs2022win10/libopenmpt.vcxproj
@@ -1718,6 +1718,7 @@
+
diff --git a/build/vs2022win10/libopenmpt.vcxproj.filters b/build/vs2022win10/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10/libopenmpt.vcxproj.filters
+++ b/build/vs2022win10/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10/libopenmpt_test.vcxproj b/build/vs2022win10/libopenmpt_test.vcxproj
index 73acb23af06..572e04b4e24 100644
--- a/build/vs2022win10/libopenmpt_test.vcxproj
+++ b/build/vs2022win10/libopenmpt_test.vcxproj
@@ -1789,6 +1789,7 @@
+
diff --git a/build/vs2022win10/libopenmpt_test.vcxproj.filters b/build/vs2022win10/libopenmpt_test.vcxproj.filters
index 30a862387a5..df958784c72 100644
--- a/build/vs2022win10/libopenmpt_test.vcxproj.filters
+++ b/build/vs2022win10/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/OpenMPT-ANSI.vcxproj b/build/vs2022win10clang/OpenMPT-ANSI.vcxproj
index 1c75441384e..fd454102082 100644
--- a/build/vs2022win10clang/OpenMPT-ANSI.vcxproj
+++ b/build/vs2022win10clang/OpenMPT-ANSI.vcxproj
@@ -2191,6 +2191,7 @@
+
diff --git a/build/vs2022win10clang/OpenMPT-ANSI.vcxproj.filters b/build/vs2022win10clang/OpenMPT-ANSI.vcxproj.filters
index 49fe0b71802..fe9cfe197d6 100644
--- a/build/vs2022win10clang/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2022win10clang/OpenMPT-ANSI.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/OpenMPT-UTF8.vcxproj b/build/vs2022win10clang/OpenMPT-UTF8.vcxproj
index a7956bb2c90..f8347b62746 100644
--- a/build/vs2022win10clang/OpenMPT-UTF8.vcxproj
+++ b/build/vs2022win10clang/OpenMPT-UTF8.vcxproj
@@ -2191,6 +2191,7 @@
+
diff --git a/build/vs2022win10clang/OpenMPT-UTF8.vcxproj.filters b/build/vs2022win10clang/OpenMPT-UTF8.vcxproj.filters
index 49fe0b71802..fe9cfe197d6 100644
--- a/build/vs2022win10clang/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2022win10clang/OpenMPT-UTF8.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/OpenMPT.vcxproj b/build/vs2022win10clang/OpenMPT.vcxproj
index 6389568c64e..9015d133ad9 100644
--- a/build/vs2022win10clang/OpenMPT.vcxproj
+++ b/build/vs2022win10clang/OpenMPT.vcxproj
@@ -2191,6 +2191,7 @@
+
diff --git a/build/vs2022win10clang/OpenMPT.vcxproj.filters b/build/vs2022win10clang/OpenMPT.vcxproj.filters
index 49fe0b71802..fe9cfe197d6 100644
--- a/build/vs2022win10clang/OpenMPT.vcxproj.filters
+++ b/build/vs2022win10clang/OpenMPT.vcxproj.filters
@@ -2165,6 +2165,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/libopenmpt-small.vcxproj b/build/vs2022win10clang/libopenmpt-small.vcxproj
index 5c0d3a967d4..d3821e1fbe3 100644
--- a/build/vs2022win10clang/libopenmpt-small.vcxproj
+++ b/build/vs2022win10clang/libopenmpt-small.vcxproj
@@ -1636,6 +1636,7 @@
+
diff --git a/build/vs2022win10clang/libopenmpt-small.vcxproj.filters b/build/vs2022win10clang/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10clang/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win10clang/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/libopenmpt.vcxproj b/build/vs2022win10clang/libopenmpt.vcxproj
index a0cb5c0d86b..7a73bd0d65c 100644
--- a/build/vs2022win10clang/libopenmpt.vcxproj
+++ b/build/vs2022win10clang/libopenmpt.vcxproj
@@ -1636,6 +1636,7 @@
+
diff --git a/build/vs2022win10clang/libopenmpt.vcxproj.filters b/build/vs2022win10clang/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10clang/libopenmpt.vcxproj.filters
+++ b/build/vs2022win10clang/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10clang/libopenmpt_test.vcxproj b/build/vs2022win10clang/libopenmpt_test.vcxproj
index b95b0540ac6..c55b2d5f34d 100644
--- a/build/vs2022win10clang/libopenmpt_test.vcxproj
+++ b/build/vs2022win10clang/libopenmpt_test.vcxproj
@@ -1707,6 +1707,7 @@
+
diff --git a/build/vs2022win10clang/libopenmpt_test.vcxproj.filters b/build/vs2022win10clang/libopenmpt_test.vcxproj.filters
index 30a862387a5..df958784c72 100644
--- a/build/vs2022win10clang/libopenmpt_test.vcxproj.filters
+++ b/build/vs2022win10clang/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10uwp/libopenmpt-small.vcxproj b/build/vs2022win10uwp/libopenmpt-small.vcxproj
index 574f0b8e4ac..6893ee9fd59 100644
--- a/build/vs2022win10uwp/libopenmpt-small.vcxproj
+++ b/build/vs2022win10uwp/libopenmpt-small.vcxproj
@@ -1730,6 +1730,7 @@
+
diff --git a/build/vs2022win10uwp/libopenmpt-small.vcxproj.filters b/build/vs2022win10uwp/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10uwp/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win10uwp/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win10uwp/libopenmpt.vcxproj b/build/vs2022win10uwp/libopenmpt.vcxproj
index 59d4951bc70..4bc06510336 100644
--- a/build/vs2022win10uwp/libopenmpt.vcxproj
+++ b/build/vs2022win10uwp/libopenmpt.vcxproj
@@ -1730,6 +1730,7 @@
+
diff --git a/build/vs2022win10uwp/libopenmpt.vcxproj.filters b/build/vs2022win10uwp/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win10uwp/libopenmpt.vcxproj.filters
+++ b/build/vs2022win10uwp/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/OpenMPT-ANSI.vcxproj b/build/vs2022win7/OpenMPT-ANSI.vcxproj
index 340a03519d5..cbe50421f0e 100644
--- a/build/vs2022win7/OpenMPT-ANSI.vcxproj
+++ b/build/vs2022win7/OpenMPT-ANSI.vcxproj
@@ -1441,6 +1441,7 @@
+
diff --git a/build/vs2022win7/OpenMPT-ANSI.vcxproj.filters b/build/vs2022win7/OpenMPT-ANSI.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2022win7/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2022win7/OpenMPT-ANSI.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/OpenMPT-UTF8.vcxproj b/build/vs2022win7/OpenMPT-UTF8.vcxproj
index 39207f25f0b..208bdeeef6d 100644
--- a/build/vs2022win7/OpenMPT-UTF8.vcxproj
+++ b/build/vs2022win7/OpenMPT-UTF8.vcxproj
@@ -1441,6 +1441,7 @@
+
diff --git a/build/vs2022win7/OpenMPT-UTF8.vcxproj.filters b/build/vs2022win7/OpenMPT-UTF8.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2022win7/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2022win7/OpenMPT-UTF8.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/OpenMPT.vcxproj b/build/vs2022win7/OpenMPT.vcxproj
index ee9436786d0..f9cb7837609 100644
--- a/build/vs2022win7/OpenMPT.vcxproj
+++ b/build/vs2022win7/OpenMPT.vcxproj
@@ -1441,6 +1441,7 @@
+
diff --git a/build/vs2022win7/OpenMPT.vcxproj.filters b/build/vs2022win7/OpenMPT.vcxproj.filters
index c6f080d53b6..eacb81750f5 100644
--- a/build/vs2022win7/OpenMPT.vcxproj.filters
+++ b/build/vs2022win7/OpenMPT.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/libopenmpt-small.vcxproj b/build/vs2022win7/libopenmpt-small.vcxproj
index bc810bc3f20..dc4c8094dce 100644
--- a/build/vs2022win7/libopenmpt-small.vcxproj
+++ b/build/vs2022win7/libopenmpt-small.vcxproj
@@ -1050,6 +1050,7 @@
+
diff --git a/build/vs2022win7/libopenmpt-small.vcxproj.filters b/build/vs2022win7/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win7/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win7/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/libopenmpt.vcxproj b/build/vs2022win7/libopenmpt.vcxproj
index 25d01f365d3..683dcbd2c4b 100644
--- a/build/vs2022win7/libopenmpt.vcxproj
+++ b/build/vs2022win7/libopenmpt.vcxproj
@@ -1050,6 +1050,7 @@
+
diff --git a/build/vs2022win7/libopenmpt.vcxproj.filters b/build/vs2022win7/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win7/libopenmpt.vcxproj.filters
+++ b/build/vs2022win7/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win7/libopenmpt_test.vcxproj b/build/vs2022win7/libopenmpt_test.vcxproj
index e1f42567138..21eef28ba0e 100644
--- a/build/vs2022win7/libopenmpt_test.vcxproj
+++ b/build/vs2022win7/libopenmpt_test.vcxproj
@@ -1091,6 +1091,7 @@
+
diff --git a/build/vs2022win7/libopenmpt_test.vcxproj.filters b/build/vs2022win7/libopenmpt_test.vcxproj.filters
index 828ba41e628..e79f9f2ec38 100644
--- a/build/vs2022win7/libopenmpt_test.vcxproj.filters
+++ b/build/vs2022win7/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/OpenMPT-ANSI.vcxproj b/build/vs2022win8/OpenMPT-ANSI.vcxproj
index e5a95ee427d..f546ad20364 100644
--- a/build/vs2022win8/OpenMPT-ANSI.vcxproj
+++ b/build/vs2022win8/OpenMPT-ANSI.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win8/OpenMPT-ANSI.vcxproj.filters b/build/vs2022win8/OpenMPT-ANSI.vcxproj.filters
index 8e1e8fed960..8bfcc0ab324 100644
--- a/build/vs2022win8/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2022win8/OpenMPT-ANSI.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/OpenMPT-UTF8.vcxproj b/build/vs2022win8/OpenMPT-UTF8.vcxproj
index 8a2e1a562d3..c8710d3e9b6 100644
--- a/build/vs2022win8/OpenMPT-UTF8.vcxproj
+++ b/build/vs2022win8/OpenMPT-UTF8.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win8/OpenMPT-UTF8.vcxproj.filters b/build/vs2022win8/OpenMPT-UTF8.vcxproj.filters
index 8e1e8fed960..8bfcc0ab324 100644
--- a/build/vs2022win8/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2022win8/OpenMPT-UTF8.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/OpenMPT.vcxproj b/build/vs2022win8/OpenMPT.vcxproj
index efe7a8c6be9..0c015e42d71 100644
--- a/build/vs2022win8/OpenMPT.vcxproj
+++ b/build/vs2022win8/OpenMPT.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win8/OpenMPT.vcxproj.filters b/build/vs2022win8/OpenMPT.vcxproj.filters
index 8e1e8fed960..8bfcc0ab324 100644
--- a/build/vs2022win8/OpenMPT.vcxproj.filters
+++ b/build/vs2022win8/OpenMPT.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/libopenmpt-small.vcxproj b/build/vs2022win8/libopenmpt-small.vcxproj
index c34e7003126..9c76e0ab9d6 100644
--- a/build/vs2022win8/libopenmpt-small.vcxproj
+++ b/build/vs2022win8/libopenmpt-small.vcxproj
@@ -1375,6 +1375,7 @@
+
diff --git a/build/vs2022win8/libopenmpt-small.vcxproj.filters b/build/vs2022win8/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win8/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win8/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/libopenmpt.vcxproj b/build/vs2022win8/libopenmpt.vcxproj
index b90e9f31c2b..e146160904e 100644
--- a/build/vs2022win8/libopenmpt.vcxproj
+++ b/build/vs2022win8/libopenmpt.vcxproj
@@ -1375,6 +1375,7 @@
+
diff --git a/build/vs2022win8/libopenmpt.vcxproj.filters b/build/vs2022win8/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win8/libopenmpt.vcxproj.filters
+++ b/build/vs2022win8/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win8/libopenmpt_test.vcxproj b/build/vs2022win8/libopenmpt_test.vcxproj
index d53c67af8fd..867cfff00e6 100644
--- a/build/vs2022win8/libopenmpt_test.vcxproj
+++ b/build/vs2022win8/libopenmpt_test.vcxproj
@@ -1431,6 +1431,7 @@
+
diff --git a/build/vs2022win8/libopenmpt_test.vcxproj.filters b/build/vs2022win8/libopenmpt_test.vcxproj.filters
index 09708311a89..722dcf501fc 100644
--- a/build/vs2022win8/libopenmpt_test.vcxproj.filters
+++ b/build/vs2022win8/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/OpenMPT-ANSI.vcxproj b/build/vs2022win81/OpenMPT-ANSI.vcxproj
index a73044c43b1..1a7e5105e9e 100644
--- a/build/vs2022win81/OpenMPT-ANSI.vcxproj
+++ b/build/vs2022win81/OpenMPT-ANSI.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win81/OpenMPT-ANSI.vcxproj.filters b/build/vs2022win81/OpenMPT-ANSI.vcxproj.filters
index a67152e04df..709db9f5e1c 100644
--- a/build/vs2022win81/OpenMPT-ANSI.vcxproj.filters
+++ b/build/vs2022win81/OpenMPT-ANSI.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/OpenMPT-UTF8.vcxproj b/build/vs2022win81/OpenMPT-UTF8.vcxproj
index 1a0be1287a4..7dd3eb24ff0 100644
--- a/build/vs2022win81/OpenMPT-UTF8.vcxproj
+++ b/build/vs2022win81/OpenMPT-UTF8.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win81/OpenMPT-UTF8.vcxproj.filters b/build/vs2022win81/OpenMPT-UTF8.vcxproj.filters
index a67152e04df..709db9f5e1c 100644
--- a/build/vs2022win81/OpenMPT-UTF8.vcxproj.filters
+++ b/build/vs2022win81/OpenMPT-UTF8.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/OpenMPT.vcxproj b/build/vs2022win81/OpenMPT.vcxproj
index 5ee77f3b9a2..1ecbdd441d7 100644
--- a/build/vs2022win81/OpenMPT.vcxproj
+++ b/build/vs2022win81/OpenMPT.vcxproj
@@ -1829,6 +1829,7 @@
+
diff --git a/build/vs2022win81/OpenMPT.vcxproj.filters b/build/vs2022win81/OpenMPT.vcxproj.filters
index a67152e04df..709db9f5e1c 100644
--- a/build/vs2022win81/OpenMPT.vcxproj.filters
+++ b/build/vs2022win81/OpenMPT.vcxproj.filters
@@ -2207,6 +2207,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/libopenmpt-small.vcxproj b/build/vs2022win81/libopenmpt-small.vcxproj
index 4cd73f8f92a..4e0542be29c 100644
--- a/build/vs2022win81/libopenmpt-small.vcxproj
+++ b/build/vs2022win81/libopenmpt-small.vcxproj
@@ -1375,6 +1375,7 @@
+
diff --git a/build/vs2022win81/libopenmpt-small.vcxproj.filters b/build/vs2022win81/libopenmpt-small.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win81/libopenmpt-small.vcxproj.filters
+++ b/build/vs2022win81/libopenmpt-small.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/libopenmpt.vcxproj b/build/vs2022win81/libopenmpt.vcxproj
index 01f64707639..f08138e2661 100644
--- a/build/vs2022win81/libopenmpt.vcxproj
+++ b/build/vs2022win81/libopenmpt.vcxproj
@@ -1375,6 +1375,7 @@
+
diff --git a/build/vs2022win81/libopenmpt.vcxproj.filters b/build/vs2022win81/libopenmpt.vcxproj.filters
index 56ca214b744..3039d51f940 100644
--- a/build/vs2022win81/libopenmpt.vcxproj.filters
+++ b/build/vs2022win81/libopenmpt.vcxproj.filters
@@ -1334,6 +1334,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/vs2022win81/libopenmpt_test.vcxproj b/build/vs2022win81/libopenmpt_test.vcxproj
index 7641f95f437..1f3b8f332aa 100644
--- a/build/vs2022win81/libopenmpt_test.vcxproj
+++ b/build/vs2022win81/libopenmpt_test.vcxproj
@@ -1431,6 +1431,7 @@
+
diff --git a/build/vs2022win81/libopenmpt_test.vcxproj.filters b/build/vs2022win81/libopenmpt_test.vcxproj.filters
index 682c515a736..54c64584833 100644
--- a/build/vs2022win81/libopenmpt_test.vcxproj.filters
+++ b/build/vs2022win81/libopenmpt_test.vcxproj.filters
@@ -1388,6 +1388,9 @@
soundlib
+
+ soundlib
+
soundlib
diff --git a/build/xcode-ios/libopenmpt.xcodeproj/project.pbxproj b/build/xcode-ios/libopenmpt.xcodeproj/project.pbxproj
index f67e6b42054..aa0ee423041 100644
--- a/build/xcode-ios/libopenmpt.xcodeproj/project.pbxproj
+++ b/build/xcode-ios/libopenmpt.xcodeproj/project.pbxproj
@@ -75,6 +75,7 @@
81C26ED360DF89053CE8E513 /* Load_gmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D668A71B68F6710DD1CF155B /* Load_gmc.cpp */; };
8479AC1F9F461AD1A316B25F /* Load_digi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D14936A73E714519400434E7 /* Load_digi.cpp */; };
84A9E60B844CC93DBEA17C4B /* MixerLoops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B810F0D30F7663C5C1847F13 /* MixerLoops.cpp */; };
+ 84F9B8439FC626F5A396BE83 /* Load_unic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */; };
8676CA3F6593E471419D407F /* Load_gt2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 10E0ADC7A36E77B90C471C07 /* Load_gt2.cpp */; };
8751165421750B86D19AEC94 /* mptStringBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C510221C396A670EB74DF05C /* mptStringBuffer.cpp */; };
877C818BA248F03DA61987CB /* Load_puma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DB68B53DADE99C5DC718993 /* Load_puma.cpp */; };
@@ -488,6 +489,7 @@
9E737DF712CDC2E990B14C37 /* Distortion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Distortion.h; path = ../../soundlib/plugins/dmo/Distortion.h; sourceTree = ""; };
9E8AC865F88BDF57BFD2D6A5 /* tests_binary.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = tests_binary.hpp; path = ../../src/mpt/binary/tests/tests_binary.hpp; sourceTree = ""; };
9EB0D073130B156590EE9EB3 /* Compressor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Compressor.h; path = ../../soundlib/plugins/dmo/Compressor.h; sourceTree = ""; };
+ 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Load_unic.cpp; path = ../../soundlib/Load_unic.cpp; sourceTree = ""; };
9F187E69B9E4ED1BBDB584A9 /* outputfile.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = outputfile.hpp; path = ../../src/mpt/io_file/outputfile.hpp; sourceTree = ""; };
9F2E1C1AF92F330CC0762A5A /* BuildSettingsCompiler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BuildSettingsCompiler.h; path = ../../common/BuildSettingsCompiler.h; sourceTree = ""; };
9FCB791A628BD98CBFC0B75A /* dos_memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = dos_memory.hpp; path = ../../src/mpt/osinfo/dos_memory.hpp; sourceTree = ""; };
@@ -1352,6 +1354,7 @@
7D070D1F43950491B1972B5F /* Load_symmod.cpp */,
54393E69E6C7085B4F9FACA9 /* Load_uax.cpp */,
7FD19A57125F64497B380897 /* Load_ult.cpp */,
+ 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */,
694D3F69FBDB095B64B3ADA9 /* Load_wav.cpp */,
2A6435F76EB2DB69B0DA1437 /* Load_xm.cpp */,
2EF17543C17F3F352A57E383 /* Load_xmf.cpp */,
@@ -1695,6 +1698,7 @@
CF116C1742F9E3C965479257 /* Load_symmod.cpp in Sources */,
4174F40120920E33FC9B6A41 /* Load_uax.cpp in Sources */,
F4EF37CFD40C5201B015AE0F /* Load_ult.cpp in Sources */,
+ 84F9B8439FC626F5A396BE83 /* Load_unic.cpp in Sources */,
BD3885019C559F33785EFB41 /* Load_wav.cpp in Sources */,
00BB926F99087821C74F78AF /* Load_xm.cpp in Sources */,
F57A8B7BD497A5ADB0A101BB /* Load_xmf.cpp in Sources */,
diff --git a/build/xcode-macosx/libopenmpt.xcodeproj/project.pbxproj b/build/xcode-macosx/libopenmpt.xcodeproj/project.pbxproj
index 2852ec529b0..3691e179fb6 100644
--- a/build/xcode-macosx/libopenmpt.xcodeproj/project.pbxproj
+++ b/build/xcode-macosx/libopenmpt.xcodeproj/project.pbxproj
@@ -76,6 +76,7 @@
81C26ED360DF89053CE8E513 /* Load_gmc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D668A71B68F6710DD1CF155B /* Load_gmc.cpp */; };
8479AC1F9F461AD1A316B25F /* Load_digi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D14936A73E714519400434E7 /* Load_digi.cpp */; };
84A9E60B844CC93DBEA17C4B /* MixerLoops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B810F0D30F7663C5C1847F13 /* MixerLoops.cpp */; };
+ 84F9B8439FC626F5A396BE83 /* Load_unic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */; };
8676CA3F6593E471419D407F /* Load_gt2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 10E0ADC7A36E77B90C471C07 /* Load_gt2.cpp */; };
8751165421750B86D19AEC94 /* mptStringBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C510221C396A670EB74DF05C /* mptStringBuffer.cpp */; };
877C818BA248F03DA61987CB /* Load_puma.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DB68B53DADE99C5DC718993 /* Load_puma.cpp */; };
@@ -488,6 +489,7 @@
9E737DF712CDC2E990B14C37 /* Distortion.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Distortion.h; path = ../../soundlib/plugins/dmo/Distortion.h; sourceTree = ""; };
9E8AC865F88BDF57BFD2D6A5 /* tests_binary.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = tests_binary.hpp; path = ../../src/mpt/binary/tests/tests_binary.hpp; sourceTree = ""; };
9EB0D073130B156590EE9EB3 /* Compressor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Compressor.h; path = ../../soundlib/plugins/dmo/Compressor.h; sourceTree = ""; };
+ 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Load_unic.cpp; path = ../../soundlib/Load_unic.cpp; sourceTree = ""; };
9F187E69B9E4ED1BBDB584A9 /* outputfile.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = outputfile.hpp; path = ../../src/mpt/io_file/outputfile.hpp; sourceTree = ""; };
9F2E1C1AF92F330CC0762A5A /* BuildSettingsCompiler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BuildSettingsCompiler.h; path = ../../common/BuildSettingsCompiler.h; sourceTree = ""; };
9FCB791A628BD98CBFC0B75A /* dos_memory.hpp */ = {isa = PBXFileReference; lastKnownFileType = text; name = dos_memory.hpp; path = ../../src/mpt/osinfo/dos_memory.hpp; sourceTree = ""; };
@@ -1352,6 +1354,7 @@
7D070D1F43950491B1972B5F /* Load_symmod.cpp */,
54393E69E6C7085B4F9FACA9 /* Load_uax.cpp */,
7FD19A57125F64497B380897 /* Load_ult.cpp */,
+ 9EEAF28B0C1300FD0DA5F0CB /* Load_unic.cpp */,
694D3F69FBDB095B64B3ADA9 /* Load_wav.cpp */,
2A6435F76EB2DB69B0DA1437 /* Load_xm.cpp */,
2EF17543C17F3F352A57E383 /* Load_xmf.cpp */,
@@ -1695,6 +1698,7 @@
CF116C1742F9E3C965479257 /* Load_symmod.cpp in Sources */,
4174F40120920E33FC9B6A41 /* Load_uax.cpp in Sources */,
F4EF37CFD40C5201B015AE0F /* Load_ult.cpp in Sources */,
+ 84F9B8439FC626F5A396BE83 /* Load_unic.cpp in Sources */,
BD3885019C559F33785EFB41 /* Load_wav.cpp in Sources */,
00BB926F99087821C74F78AF /* Load_xm.cpp in Sources */,
F57A8B7BD497A5ADB0A101BB /* Load_xmf.cpp in Sources */,
diff --git a/common/versionNumber.h b/common/versionNumber.h
index 394ceaa1b6e..a367dfc62ac 100644
--- a/common/versionNumber.h
+++ b/common/versionNumber.h
@@ -16,4 +16,4 @@
#define VER_MAJORMAJOR 1
#define VER_MAJOR 32
#define VER_MINOR 00
-#define VER_MINORMINOR 25
+#define VER_MINORMINOR 26
diff --git a/contrib/fuzzing/all_formats.dict b/contrib/fuzzing/all_formats.dict
index 7882bebf19e..247a05370b5 100644
--- a/contrib/fuzzing/all_formats.dict
+++ b/contrib/fuzzing/all_formats.dict
@@ -251,6 +251,9 @@ symmod="SymM\x00\x00\x00\x01\xFF\xFF\xFF\xFF\x00\x00\x00"
ult="MAS_UTrack_V004"
+#unic="UNIC"
+#unic="\x00\x00\x00\x00"
+
umx="\xC1\x83\x2A\x9E"
umx="music"
umx="sound"
diff --git a/installer/filetypes-multi-arch-per-arch-retro.iss b/installer/filetypes-multi-arch-per-arch-retro.iss
index 8457561515c..d7fe128a66d 100644
--- a/installer/filetypes-multi-arch-per-arch-retro.iss
+++ b/installer/filetypes-multi-arch-per-arch-retro.iss
@@ -97,6 +97,7 @@ Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAsso
Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".symmod"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ult"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".umx"; ValueData: {#OpenMPTFile}; Components: {#Component}
+Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".unic"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wow"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKLM; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".xmf"; ValueData: {#OpenMPTFile}; Components: {#Component}
diff --git a/installer/filetypes-multi-arch-per-arch.iss b/installer/filetypes-multi-arch-per-arch.iss
index 9e4f78e62e1..4fe649c9a47 100644
--- a/installer/filetypes-multi-arch-per-arch.iss
+++ b/installer/filetypes-multi-arch-per-arch.iss
@@ -97,6 +97,7 @@ Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssoc
Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".symmod"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ult"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".umx"; ValueData: {#OpenMPTFile}; Components: {#Component}
+Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".unic"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wow"; ValueData: {#OpenMPTFile}; Components: {#Component}
Root: HKA; Subkey: "SOFTWARE\Clients\Media\{#OpenMPTarch}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".xmf"; ValueData: {#OpenMPTFile}; Components: {#Component}
diff --git a/installer/filetypes-multi-arch-retro.iss b/installer/filetypes-multi-arch-retro.iss
index c81e6815b04..36c3eab10fe 100644
--- a/installer/filetypes-multi-arch-retro.iss
+++ b/installer/filetypes-multi-arch-retro.iss
@@ -72,6 +72,7 @@ Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes";
Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".symmod"; ValueData: ""
Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".ult"; ValueData: ""
Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".umx"; ValueData: ""
+Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".unic"; ValueData: ""
Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".wow"; ValueData: ""
Root: HKLM; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".xmf"; ValueData: ""
diff --git a/installer/filetypes-multi-arch.iss b/installer/filetypes-multi-arch.iss
index 0a07e1a9f06..bde59d32849 100644
--- a/installer/filetypes-multi-arch.iss
+++ b/installer/filetypes-multi-arch.iss
@@ -72,6 +72,7 @@ Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; V
Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".symmod"; ValueData: ""
Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".ult"; ValueData: ""
Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".umx"; ValueData: ""
+Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".unic"; ValueData: ""
Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".wow"; ValueData: ""
Root: HKA; Subkey: "SOFTWARE\Classes\Applications\OpenMPT.exe\SupportedTypes"; ValueType: string; ValueName: ".xmf"; ValueData: ""
diff --git a/soundlib/Load_unic.cpp b/soundlib/Load_unic.cpp
new file mode 100644
index 00000000000..dade7cbd644
--- /dev/null
+++ b/soundlib/Load_unic.cpp
@@ -0,0 +1,254 @@
+/*
+ * Load_unic.cpp
+ * -------------
+ * Purpose: UNIC Tracker v1 loader
+ * Notes : UNIC Tracker is actually a module packer, not a stand-alone tracker software.
+ * Support is mostly included to avoid such modules being recognized as regular M.K. MODs.
+ * UNIC files without file signature are not supported.
+ * Authors: OpenMPT Devs
+ * Based on ProWizard by Asle
+ * The OpenMPT source code is released under the BSD lUNICnse. Read LUNICNSE for more details.
+ */
+
+
+#include "stdafx.h"
+#include "Loaders.h"
+#include "MODTools.h"
+
+OPENMPT_NAMESPACE_BEGIN
+
+
+static bool ValidateUNICSampleHeader(const MODSampleHeader &sampleHeader)
+{
+ if(CountInvalidChars(mpt::as_span(sampleHeader.name).subspan(0, 20)))
+ return false;
+ int16be finetune;
+ memcpy(&finetune, &sampleHeader.name[20], sizeof(int16be));
+ if(finetune < -42 || finetune > 8) // African Dreams.unic has finetune = -42
+ return false;
+ if(sampleHeader.finetune != 0 || sampleHeader.volume > 64)
+ return false;
+ if(sampleHeader.length >= 0x8000 || sampleHeader.loopStart >= 0x8000 || sampleHeader.loopLength >= 0x8000)
+ return false;
+ if(!sampleHeader.length && (sampleHeader.loopStart > 0 || sampleHeader.loopLength > 1 || finetune != 0))
+ return false;
+ if(sampleHeader.length && sampleHeader.length < sampleHeader.loopStart + sampleHeader.loopLength)
+ return false;
+ return true;
+}
+
+
+static bool ValidateUNICPatternEntry(const std::array data, SAMPLEINDEX lastSample)
+{
+ if(data[0] > 0x74)
+ return false;
+ if((data[0] & 0x3F) > 0x24)
+ return false;
+ const uint8 command = (data[1] & 0x0F), param = data[2];
+ if(command == 0x0C && param > 80) // Mastercoma.unic has values > 64
+ return false;
+ if(command == 0x0B && param > 0x7F)
+ return false;
+ if(command == 0x0D && param > 0x40)
+ return false;
+ if(uint8 instr = ((data[0] >> 2) & 0x30) | ((data[1] >> 4) & 0x0F); instr > lastSample)
+ return false;
+ return true;
+}
+
+
+struct UNICFileHeader
+{
+ using PatternData = std::array, 64 * 4>;
+
+ std::array title;
+ MODSampleHeader sampleHeaders[31];
+ MODFileHeader fileHeader;
+ std::array magic;
+ PatternData firstPattern;
+
+ struct ValidationResult
+ {
+ uint32 totalSampleSize = 0;
+ SAMPLEINDEX lastSample = 0;
+ uint8 numPatterns = 0;
+ };
+
+ ValidationResult IsValid() const noexcept
+ {
+ if(!IsMagic(magic.data(), "M.K.") && !IsMagic(magic.data(), "UNIC") && !IsMagic(magic.data(), "\0\0\0\0"))
+ return {};
+
+ if(CountInvalidChars(title))
+ return {};
+
+ uint32 totalSampleSize = 0;
+ SAMPLEINDEX lastSample = 0;
+ for(SAMPLEINDEX smp = 1; smp <= 31; smp++)
+ {
+ const MODSampleHeader &sampleHeader = sampleHeaders[smp - 1];
+ if(!ValidateUNICSampleHeader(sampleHeader))
+ return {};
+ totalSampleSize += sampleHeader.length * 2;
+ if(sampleHeader.length)
+ lastSample = smp;
+ }
+ if(totalSampleSize < 256)
+ return {};
+
+ if(!fileHeader.numOrders || fileHeader.numOrders >= 128)
+ return {};
+
+ uint8 numPatterns = 0;
+ for(uint8 pat = 0; pat < 128; pat++)
+ {
+ if(fileHeader.orderList[pat] >= 128 || (pat > fileHeader.numOrders + 1 && fileHeader.orderList[pat] != 0))
+ return {};
+ numPatterns = std::max(numPatterns, fileHeader.orderList[pat].get());
+ }
+ numPatterns++;
+
+ for(const auto data : firstPattern)
+ {
+ if(!ValidateUNICPatternEntry(data, lastSample))
+ return {};
+ }
+
+ return {totalSampleSize, lastSample, numPatterns};
+ }
+
+};
+
+MPT_BINARY_STRUCT(UNICFileHeader, 1084 + 768)
+
+
+CSoundFile::ProbeResult CSoundFile::ProbeFileHeaderUNIC(MemoryFileReader file, const uint64 *pfilesize)
+{
+ UNICFileHeader fileHeader;
+ if(!file.ReadStruct(fileHeader))
+ return ProbeWantMoreData;
+
+ const auto headerValidationResult = fileHeader.IsValid();
+ if(!headerValidationResult.totalSampleSize)
+ return ProbeFailure;
+
+ if(pfilesize && *pfilesize < 1084 + headerValidationResult.numPatterns * 64u * 4u * 3u + headerValidationResult.totalSampleSize)
+ return ProbeFailure;
+
+ return ProbeSuccess;
+}
+
+
+bool CSoundFile::ReadUNIC(FileReader &file, ModLoadingFlags loadFlags)
+{
+ UNICFileHeader fileHeader;
+ file.Rewind();
+ if(!file.ReadStruct(fileHeader))
+ return false;
+
+ const auto headerValidationResult = fileHeader.IsValid();
+ if(!headerValidationResult.totalSampleSize)
+ return false;
+ if(loadFlags == onlyVerifyHeader)
+ return true;
+
+ InitializeGlobals(MOD_TYPE_MOD, 4);
+
+ // Reading patterns (done first to avoid doing unnecessary work if this is a real ProTracker M.K. file)
+ file.Seek(1084);
+ if(!file.CanRead(headerValidationResult.numPatterns * 64u * 4u * 3u))
+ return false;
+ if(loadFlags & loadPatternData)
+ Patterns.ResizeArray(headerValidationResult.numPatterns);
+ uint16 numNotes = 0;
+ ModCommand::INSTR allInstrs = 0;
+ for(PATTERNINDEX pat = 0; pat < headerValidationResult.numPatterns; pat++)
+ {
+ if(!(loadFlags & loadPatternData) || !Patterns.Insert(pat, 64))
+ {
+ UNICFileHeader::PatternData pattern;
+ if(!file.ReadArray(pattern))
+ return false;
+
+ for(const auto data : pattern)
+ {
+ if(!ValidateUNICPatternEntry(data, headerValidationResult.lastSample))
+ return false;
+ }
+ continue;
+ }
+
+ for(ModCommand &m : Patterns[pat])
+ {
+ const auto data = file.ReadArray();
+ if(!ValidateUNICPatternEntry(data, headerValidationResult.lastSample))
+ return false;
+
+ if(data[0] & 0x3F)
+ {
+ m.note = NOTE_MIDDLEC - 13 + (data[0] & 0x3F);
+ numNotes++;
+ }
+ m.instr = ((data[0] >> 2) & 0x30) | ((data[1] >> 4) & 0x0F);
+ allInstrs |= m.instr;
+ ConvertModCommand(m, data[1] & 0x0F, data[2]);
+ }
+ }
+ if(numNotes < 16 || !allInstrs)
+ return false;
+
+ // Reading samples
+ if(!file.CanRead(headerValidationResult.totalSampleSize))
+ return false;
+ m_nSamples = 31;
+ for(SAMPLEINDEX smp = 1; smp <= 31; smp++)
+ {
+ const MODSampleHeader &sampleHeader = fileHeader.sampleHeaders[smp - 1];
+ ModSample &mptSmp = Samples[smp];
+ sampleHeader.ConvertToMPT(mptSmp, true);
+ int16be finetune;
+ memcpy(&finetune, &sampleHeader.name[20], sizeof(int16be));
+ mptSmp.nFineTune = MOD2XMFineTune(-finetune);
+ // Metal Jumpover.unic (and various other files) has incorrect loop starts expressed as DWORDs
+ // But for the flute sample African Dreams.unic this fix doesn't seem to be quite right
+ if(mptSmp.uFlags[CHN_LOOP] && mptSmp.nLoopStart > 0
+ && mptSmp.nLoopStart + mptSmp.nLoopEnd >= mptSmp.nLength - 2
+ && mptSmp.nLoopStart + mptSmp.nLoopEnd <= mptSmp.nLength)
+ {
+ mptSmp.nLoopEnd += mptSmp.nLoopStart;
+ mptSmp.nLoopStart += mptSmp.nLoopStart;
+ }
+
+ m_szNames[smp] = mpt::String::ReadBuf(mpt::String::spacePadded, sampleHeader.name, 20);
+
+ if(!(loadFlags & loadSampleData))
+ continue;
+ SampleIO(
+ SampleIO::_8bit,
+ SampleIO::mono,
+ SampleIO::littleEndian,
+ SampleIO::signedPCM).ReadSample(Samples[smp], file);
+ }
+
+ SetupMODPanning(true);
+ Order().SetDefaultSpeed(6);
+ Order().SetDefaultTempoInt(125);
+ ReadOrderFromArray(Order(), fileHeader.fileHeader.orderList, headerValidationResult.numPatterns);
+ m_nMinPeriod = 113 * 4;
+ m_nMaxPeriod = 856 * 4;
+ m_nSamplePreAmp = 64;
+ m_SongFlags.set(SONG_PT_MODE | SONG_IMPORTED);
+ m_playBehaviour.reset(kMODOneShotLoops);
+ m_playBehaviour.set(kMODIgnorePanning);
+ m_playBehaviour.set(kMODSampleSwap); // untested
+
+ m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeader.title);
+
+ m_modFormat.formatName = UL_("UNIC Tracker");
+ m_modFormat.type = UL_("unic");
+ m_modFormat.charset = mpt::Charset::Amiga_no_C1;
+
+ return true;
+}
+
+OPENMPT_NAMESPACE_END
diff --git a/soundlib/Sndfile.cpp b/soundlib/Sndfile.cpp
index f35a6c3935d..94252ff9bb7 100644
--- a/soundlib/Sndfile.cpp
+++ b/soundlib/Sndfile.cpp
@@ -297,6 +297,7 @@ static constexpr FileFormatLoader ModuleFormatLoaders[] =
MPT_DECLARE_FORMAT(STP),
MPT_DECLARE_FORMAT(DSym),
MPT_DECLARE_FORMAT(STX),
+ MPT_DECLARE_FORMAT(UNIC), // Magic bytes clash with MOD, must be tried first
MPT_DECLARE_FORMAT(MOD),
MPT_DECLARE_FORMAT(ICE),
MPT_DECLARE_FORMAT(KRIS),
diff --git a/soundlib/Sndfile.h b/soundlib/Sndfile.h
index 0a2a9c2be1e..5b6682a8810 100644
--- a/soundlib/Sndfile.h
+++ b/soundlib/Sndfile.h
@@ -842,6 +842,7 @@ class CSoundFile
static ProbeResult ProbeFileHeaderSTP(MemoryFileReader file, const uint64 *pfilesize);
static ProbeResult ProbeFileHeaderSTX(MemoryFileReader file, const uint64 *pfilesize);
static ProbeResult ProbeFileHeaderSymMOD(MemoryFileReader file, const uint64 *pfilesize);
+ static ProbeResult ProbeFileHeaderUNIC(MemoryFileReader file, const uint64 *pfilesize);
static ProbeResult ProbeFileHeaderULT(MemoryFileReader file, const uint64 *pfilesize);
static ProbeResult ProbeFileHeaderXM(MemoryFileReader file, const uint64 *pfilesize);
static ProbeResult ProbeFileHeaderXMF(MemoryFileReader file, const uint64 *pfilesize);
@@ -904,6 +905,7 @@ class CSoundFile
bool ReadSTP(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadSTX(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadSymMOD(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
+ bool ReadUNIC(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadULT(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadXM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadXMF(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
diff --git a/soundlib/Tables.cpp b/soundlib/Tables.cpp
index 79b36b240e1..3a2e034c1f2 100644
--- a/soundlib/Tables.cpp
+++ b/soundlib/Tables.cpp
@@ -111,6 +111,7 @@ static constexpr ModFormatInfo modFormatInfo[] =
{ UL_("Graoumf Tracker"), "gtk" },
{ UL_("Graoumf Tracker 1 / 2"), "gt2" },
{ UL_("UltraTracker"), "ult" },
+ { UL_("UNIC Tracker"), "unic" },
{ UL_("Mod's Grave"), "wow" },
{ UL_("Astroidea XMF"), "xmf" },
// converted formats (no MODTYPE)