Giter Site home page Giter Site logo

libmodplug's People

Contributors

alicelr avatar eltoder avatar funman avatar h3xx avatar hannob avatar jackbister avatar jarikomppa avatar konstanty avatar pkoshevoy avatar sagamusix avatar scop avatar sezero avatar tonyvroon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

libmodplug's Issues

AMF Player (ReadAMF?) can't play correctly .amf files from Cannon Fodder 2 soundtrack

Hi, how explained into this topic:
https://discourse.libsdl.org/t/back-to-integrate-mikmod-into-sdl2-mixer/25465

trying to play these .AMF musics, modplug return a "biiip" bad sound on precise points of the song.
In particular the two songs listed:

  • 02 - Menu.amf: you can heard some “biiip” whistle near at 38sec and 40sec
  • 03 - Heli Animation.amf: same “biip” at the very start of song

Tried to play them even with Winamp or VLC and same error: can you confirm if they use your plugin/codec?

Public Domain declaration has problems

COPYING says ModPlug-XMMS and libmodplug are now in the public domain. However, dedicating works to Public Domain is a legal gray area in jurisdictions where public domain or mechanisms for dedicating a work to it prematurely aren't recognized.

Suggest switching to something like CC0 for a backup solution where public domain might be problematic.

0.8.9.0: compile time warnings

Fists just summary stats:

[tkloczko@ss-desktop SPECS]$ rpmbuild -ba --with check --with failing_tests libmodplug.spec --quiet 2>&1 | grep -- -W | sed 's/.*\[//; s/\]//' | sort | uniq -c | sort -nr
     80 -Wregister
     12 -Wsign-compare
      8 -Wunused-result
      8 -Wunused-but-set-variable
      2 -Wmisleading-indentation
      1 -Wodr
      1 -Wlto-type-mismatch

and extracted all warnings from stderr with autoconf (2.71) warnings:

autoreconf: export WARNINGS=
autoreconf: Entering directory '.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy --force
autoreconf: configure.ac: not using Intltool
autoreconf: configure.ac: not using Gtkdoc
autoreconf: running: aclocal --force -I m4
autoreconf: running: /usr/bin/autoconf --force
configure.ac:30: warning: The macro `AC_HEADER_STDC' is obsolete.
configure.ac:30: You should run autoupdate.
./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from...
configure.ac:30: the top level
configure.ac:58: warning: The macro `AC_TRY_COMPILE' is obsolete.
configure.ac:58: You should run autoupdate.
./lib/autoconf/general.m4:2847: AC_TRY_COMPILE is expanded from...
configure.ac:58: the top level
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:21: installing './compile'
configure.ac:8: installing './missing'
src/Makefile.am: installing './depcomp'
autoreconf: Leaving directory '.'
load_okt.cpp: In member function 'BOOL CSoundFile::ReadOKT(const BYTE*, DWORD)':
load_okt.cpp:46:28: warning: variable 'npatterns' set but not used [-Wunused-but-set-variable]
   46 |         UINT nsamples = 0, npatterns = 0, norders = 0;
      |                            ^~~~~~~~~
load_mod.cpp: In member function 'void CSoundFile::ConvertModCommand(MODCOMMAND*) const':
load_mod.cpp:42:33: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   42 |                                 if ((param == 0xFF) && (m_nSamples == 15)) command = 0; break;
      |                                 ^~
load_mod.cpp:42:89: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   42 |                                 if ((param == 0xFF) && (m_nSamples == 15)) command = 0; break;
      |                                                                                         ^~~~~
load_it.cpp: In member function 'BOOL CSoundFile::ReadIT(const BYTE*, DWORD)':
load_it.cpp:166:27: warning: variable 'channels_used' set but not used [-Wunused-but-set-variable]
  166 |         BYTE chnmask[64], channels_used[64];
      |                           ^~~~~~~~~~~~~
load_it.cpp: In function 'void ITUnpack8Bit(signed char*, DWORD, LPBYTE, DWORD, BOOL)':
load_it.cpp:1221:15: warning: variable 'wHdr' set but not used [-Wunused-but-set-variable]
 1221 |         DWORD wHdr = 0;
      |               ^~~~
load_it.cpp: In function 'void ITUnpack16Bit(signed char*, DWORD, LPBYTE, DWORD, BOOL)':
load_it.cpp:1303:15: warning: variable 'wHdr' set but not used [-Wunused-but-set-variable]
 1303 |         DWORD wHdr = 0;
      |               ^~~~
load_dmf.cpp: In member function 'BOOL CSoundFile::ReadDMF(const BYTE*, DWORD)':
load_dmf.cpp:282:81: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
  282 |                                                                                 else if (!cmd.note) { cmd.note = 0xfe; } break;
      |                                                                                 ^~~~
load_dmf.cpp:282:122: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
  282 |                                                                                 else if (!cmd.note) { cmd.note = 0xfe; } break;
      |                                                                                                                          ^~~~~
load_669.cpp: In member function 'BOOL CSoundFile::Read669(const BYTE*, DWORD)':
load_669.cpp:51:14: warning: variable 'b669Ext' set but not used [-Wunused-but-set-variable]
   51 |         BOOL b669Ext;
      |              ^~~~~~~
load_ams.cpp: In member function 'BOOL CSoundFile::ReadAMS(LPCBYTE, DWORD)':
load_ams.cpp:48:14: warning: variable 'pkinf' set but not used [-Wunused-but-set-variable]
   48 |         BYTE pkinf[MAX_SAMPLES];
      |              ^~~~~
load_psm.cpp: In member function 'BOOL CSoundFile::ReadPSM(LPCBYTE, DWORD)':
load_psm.cpp:103:15: warning: variable 'smpnames' set but not used [-Wunused-but-set-variable]
  103 |         DWORD smpnames[MAX_SAMPLES];
      |               ^~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:678:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  678 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:684:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  684 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:690:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  690 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:696:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  696 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:702:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  702 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:708:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  708 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:714:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  714 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:720:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  720 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:728:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  728 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:734:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  734 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:740:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  740 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:746:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  746 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:752:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  752 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:758:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  758 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono8BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:764:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  764 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Mono16BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:770:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  770 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:780:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  780 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:786:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  786 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:792:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  792 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:798:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  798 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:804:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  804 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:810:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  810 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:816:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  816 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:822:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  822 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:830:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  830 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:836:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  836 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:842:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  842 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:848:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  848 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:854:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  854 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:860:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  860 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono8BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:866:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  866 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FastMono16BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:872:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  872 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:882:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  882 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:888:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  888 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:894:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  894 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:900:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  900 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:906:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  906 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:912:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  912 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:918:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  918 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:924:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  924 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:932:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  932 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:938:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  938 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:944:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  944 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:950:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  950 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:956:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  956 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:962:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  962 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo8BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:968:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  968 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID Stereo16BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:974:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  974 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:988:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
  988 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:995:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
  995 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1002:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1002 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1009:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1009 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1016:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1016 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1023:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1023 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1030:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1030 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1037:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1037 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1045:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1045 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1052:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1052 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1059:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1059 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1066:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1066 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1073:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1073 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1080:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1080 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono8BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1087:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1087 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterMono16BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1094:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1094 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1103:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1103 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1110:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1110 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1117:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1117 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitLinearMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1124:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1124 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1131:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1131 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitSplineMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1138:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1138 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1145:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1145 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitFirFilterMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1152:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1152 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1160:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1160 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1167:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1167 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1174:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1174 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitLinearRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1181:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1181 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1188:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1188 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitSplineRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1195:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1195 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo8BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:291:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  291 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1202:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP8'
 1202 |         SNDMIX_BEGINSAMPLELOOP8
      |         ^~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In function 'VOID FilterStereo16BitFirFilterRampMix(MODCHANNEL*, int*, int*)':
fastmix.cpp:299:37: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  299 |         register MODCHANNEL * const pChn = pChannel;\
      |                                     ^~~~
fastmix.cpp:1209:9: note: in expansion of macro 'SNDMIX_BEGINSAMPLELOOP16'
 1209 |         SNDMIX_BEGINSAMPLELOOP16
      |         ^~~~~~~~~~~~~~~~~~~~~~~~
fastmix.cpp: In member function 'UINT CSoundFile::CreateStereoMix(int)':
fastmix.cpp:1488:30: warning: variable 'nMasterCh' set but not used [-Wunused-but-set-variable]
 1488 |                 UINT nFlags, nMasterCh;
      |                              ^~~~~~~~~
load_pat.cpp: In function 'void pat_init_patnames()':
load_pat.cpp:281:54: warning: ignoring return value of 'char* fgets(char*, int, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  281 | #define _mm_fgets(f,buf,sz)                     fgets(buf,sz,f)
      |                                                 ~~~~~^~~~~~~~~~
load_pat.cpp:387:25: note: in expansion of macro '_mm_fgets'
  387 |                         _mm_fgets(mmcfg, line, PATH_MAX);
      |                         ^~~~~~~~~
load_pat.cpp:281:54: warning: ignoring return value of 'char* fgets(char*, int, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  281 | #define _mm_fgets(f,buf,sz)                     fgets(buf,sz,f)
      |                                                 ~~~~~^~~~~~~~~~
load_pat.cpp:433:25: note: in expansion of macro '_mm_fgets'
  433 |                         _mm_fgets(mmcfg, line, PATH_MAX);
      |                         ^~~~~~~~~
load_pat.cpp: In function 'void pat_read_waveheader(FILE*, WaveHeader*, int)':
load_pat.cpp:284:54: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  284 | #define _mm_read_UBYTES(buf,sz,f)               fread(buf,sz,1,f)
      |                                                 ~~~~~^~~~~~~~~~~~
load_pat.cpp:517:33: note: in expansion of macro '_mm_read_UBYTES'
  517 |                                 _mm_read_UBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat);
      |                                 ^~~~~~~~~~~~~~~
load_pat.cpp:284:54: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  284 | #define _mm_read_UBYTES(buf,sz,f)               fread(buf,sz,1,f)
      |                                                 ~~~~~^~~~~~~~~~~~
load_pat.cpp:525:33: note: in expansion of macro '_mm_read_UBYTES'
  525 |                                 _mm_read_UBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat);
      |                                 ^~~~~~~~~~~~~~~
load_pat.cpp:284:54: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  284 | #define _mm_read_UBYTES(buf,sz,f)               fread(buf,sz,1,f)
      |                                                 ~~~~~^~~~~~~~~~~~
load_pat.cpp:542:9: note: in expansion of macro '_mm_read_UBYTES'
  542 |         _mm_read_UBYTES((BYTE *)hw, sizeof(WaveHeader), mmpat);
      |         ^~~~~~~~~~~~~~~
load_pat.cpp: In function 'void pat_read_layerheader(FILE*, LayerHeader*)':
load_pat.cpp:284:54: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  284 | #define _mm_read_UBYTES(buf,sz,f)               fread(buf,sz,1,f)
      |                                                 ~~~~~^~~~~~~~~~~~
load_pat.cpp:486:9: note: in expansion of macro '_mm_read_UBYTES'
  486 |         _mm_read_UBYTES((BYTE *)hl, sizeof(LayerHeader), mmpat);
      |         ^~~~~~~~~~~~~~~
load_pat.cpp: In function 'void pat_readpat(int, char*, int)':
load_pat.cpp:285:54: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  285 | #define _mm_read_SBYTES(buf,sz,f)               fread(buf,sz,1,f)
      |                                                 ~~~~~^~~~~~~~~~~~
load_pat.cpp:695:9: note: in expansion of macro '_mm_read_SBYTES'
  695 |         _mm_read_SBYTES(dest, num, mmpat);
      |         ^~~~~~~~~~~~~~~
load_abc.cpp: In function 'ABCTRACK* abc_locate_track(ABCHANDLE*, const char*, int)':
load_abc.cpp:829:23: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
  829 |         for( i=0; i+1 < sizeof(vc) && *voice && *voice != ']' && *voice != '%' && !isspace(*voice); voice++ )   // can work with inline voice instructions
      |                   ~~~~^~~~~~~~~~~~
load_abc.cpp: In function 'void abc_add_chord(const char*, ABCHANDLE*, ABCTRACK*, uint32_t)':
load_abc.cpp:1499:21: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 1499 |         for( i=0; i < sizeof(s) - 1 && p[i] && p[i] != '"' && p[i] != '/' && p[i] != '(' && p[i] != ')' && p[i] != ' '; i++ ) s[i] = p[i];
      |                   ~~^~~~~~~~~~~~~~~
load_abc.cpp: In function 'void abc_set_parts(char**, char*)':
load_abc.cpp:1833:56: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
 1833 |         for( i=0; p[i] && p[i] != '%' && j < size && i < size; i++ ) {
      |                                                      ~~^~~~~~
load_abc.cpp:1839:54: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
 1839 |                                         for( k = n; k<j; k++ ) q[k-1] = q[k];   // shift to the left...
      |                                                     ~^~
load_abc.cpp:1874:20: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
 1874 |         for( i=0; i<j; i++ ) {
      |                   ~^~
load_abc.cpp:1877:36: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
 1877 |                         for( k=i; k<j; k++ ) q[k] = q[k+1];
      |                                   ~^~
load_abc.cpp: In function 'int abc_MIDI_drum(const char*, ABCHANDLE*)':
load_abc.cpp:2979:41: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 2979 |                 if( !isdigit(*p) && len < sizeof(h->drum)-1 ) {
      |                                     ~~~~^~~~~~~~~~~~~~~~~~~
load_abc.cpp:2983:25: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 2983 |                 if (len >= sizeof(h->drum)-1) {
      |                     ~~~~^~~~~~~~~~~~~~~~~~~~
load_abc.cpp: In function 'int abc_MIDI_gchord(const char*, ABCHANDLE*)':
load_abc.cpp:3033:41: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 3033 |                 if( !isdigit(*p) && len < sizeof(h->gchord)-1 && !isdigit(p[1]) ) { *q++ = '1'; len ++; }
      |                                     ~~~~^~~~~~~~~~~~~~~~~~~~~
load_abc.cpp:3034:25: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 3034 |                 if (len >= sizeof(h->gchord)-1) {
      |                     ~~~~^~~~~~~~~~~~~~~~~~~~~~
load_abc.cpp: In function 'void abc_metric_gchord(ABCHANDLE*, int, int)':
load_abc.cpp:3080:34: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
 3080 |                         if (dest >= sizeof(h->gchord))
      |                             ~~~~~^~~~~~~~~~~~~~~~~~~~
load_abc.cpp: In member function 'BOOL CSoundFile::ReadABC(const uint8_t*, DWORD)':
load_abc.cpp:3935:64: warning: comparison of integer expressions of different signedness: 'int' and 'DWORD' {aka 'unsigned int'} [-Wsign-compare]
 3935 |                                         if (mmstack[mmsp]->pos < dwMemLength) {
      |                                             ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
load_abc.cpp: In function 'MMFILE* mmfopen(const char*, const char*)':
load_abc.cpp:447:14: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  447 |         fread(&mmfile[1],1,len,fp);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~
load_abc.cpp:428:3: warning: type 'struct MMFILE' violates the C++ One Definition Rule [-Wodr]
  428 | } MMFILE;
      |   ^
load_mid.cpp:108:3: note: a different type is defined in another translation unit
  108 | } MMFILE;
      |   ^
load_abc.cpp:426:13: note: the first difference of corresponding definitions is field 'sz'
  426 |         int sz;
      |             ^
load_mid.cpp:106:22: note: a field of same name but different type is defined in another translation unit
  106 |         unsigned int sz;
      |                      ^
load_abc.cpp:428:3: note: type 'int' should match type 'unsigned int'
  428 | } MMFILE;
      |   ^
snd_dsp.cpp:102:12: warning: type of 'MixSoundBuffer' does not match original declaration [-Wlto-type-mismatch]
  102 | extern int MixSoundBuffer[MIXBUFFERSIZE*2];
      |            ^
fastmix.cpp:17:5: note: array types have different bounds
   17 | int MixSoundBuffer[MIXBUFFERSIZE*4];
      |     ^
fastmix.cpp:17:5: note: 'MixSoundBuffer' was previously declared here
libtool: warning: remember to run 'libtool --finish /usr/lib64'

replacement setenv() in load_abc is broken

replacement setenv() in load_abc is broken: it frees the buffer memory after feeding it to putenv(), but it needs to stay persistent. See the putenv() manpage for it. I don't have a patch for this.

S3M requires 6 bytes after last pattern before end of file

The S3M file loader requires patterns to end at least 6 bytes before the end of the file:

if ((!len) || (nInd + len > dwMemLength - 6)

I have some S3M files that lack this padding. They seem to play fine in MilkyTracker, but libmodplug drops the final pattern due to the lack of padding. I cannot find any documentation for why it should be necessary to include.

Is it necessary? Can the - 6 not be simply removed?

How to convert a "Set Global Volume" mod function to ULT function?

I'm reverse engineering an old DOS game's custom music file format which highly resembles the ULT format, including its functions.

However, the game file also uses the 0x10 function, Set Global Volume. (Essentially, the game's instruction format is note,instrument,func1,func2,func2_param,func1_param bytes.) However, this function code can't fit into an ULT instruction because func1 & func2 are nibbles in the byte. I know Fast Tracker ][ introduced this 0x10 command.

I managed to write a converter in C# that outputs an ULT file (playable by VLC player), however, it doesn't sound right as some tracks are louder or quieter than when the game plays it. Probably because I converted the 0x10 function into 0x0C (Set Volume) incorrectly. (Remembering the 0x10 parameter value and adding it to each subsequent 0x0C parameter use. I tried using the global volume as a maximum and rescaling 0x0C volume amounts relative to it, which resulted in very quiet music.)

My question is, how do I correctly interpret such 0x10 functions and turn them into 0x0C functions? In other terms, if I have 0x10(0x07) and 0x0C(0x20), what would be the equivalent argument y if there was just 0x0C(y).

Thank you for your time.

Having trouble looping sounds

The library isn't looping my sounds, even with the setting mLoopCount set to -1.

Why is this line commented?

//if (!m_nRepeatCount)

It will always run the return FALSE on the next line and invalidate some lines of code.
The loop will work again if I uncomment this line and line 401.

Seeking to invalid position doesn't report failure

Seeking to invalid position doesn't report failure, and falls back to playing from 0 - making it impossible to tell if seek position was invalid. The library already detects invalid position, but it should also notify user that it wasn't valid. Many other playback libraries (not necessarily module players) fail to produce output when seeked to invalid position, so there's a suggestion that libmodplug does the same.

[Question] How to compile libmodplug under windows

Is it possible? I tried by using mingw compiler and it fails with this error:

G:\modplugtools\modplugtools\snd_dsp.cpp|40|error: definition of static data member 'CSoundFile::m_nXBassDepth' of dllimport'd class|

Enhancing libmodplug's playback support for MIDI files and other "instrument-free" music formats

The following is an enhancement request for libmodplug's support for playing MIDI files (.mid).

  • Support for software synthesis of MIDI files using other instrument source formats besides Timidity's patch format (e.g., downloadable sounds [DLS]; .sbk; SoundFont2 .sf2; OPL2, OPL3, and other FM instrument banks). In this sense, the source code in the projects fluidsynth, libADLMIDI, libOPNMIDI, and OPL3BankEditor may be useful here. Moreover, Timidity's patch format appears to support SoundFont 2 already, but it's cumbersome in libmodplug to specify a directory containing timidity.cfg as opposed to specifying the SoundFont file (.sf2) directly.
  • If not already supported, support seeking of MIDI files such that a pause and resume function can be offered by a media player.
  • Support for popular looping conventions seen in MIDI files, if not already supported.

This request also applies to .abc and other "instrument-free" music formats as it does to MIDI files.

EDIT (Oct. 9): Just as an aside, a public-domain music synthesis library and instrument banks would greatly help improve MIDI playback support across the open-source ecosystem; however, I don't insist on that for purposes of this issue.

Update readme file

"If it sounds wrong there, then send the mod and a bug report to Olivier Lapicque" - Given that Olivier has open-sourced the tracker more than 10 years ago and hasn't worked on it since then, it's probably futile to make him fix a bug in ModPlug Tracker 1.16. :) And reporting the bug to us (OpenMPT team) is of course also futile because our code has quite diverged from the original source drop. So maybe simply remove that part of the readme. :)

Documentation?

Are there any guides on how to call / use this library?

release early, release often

Hi.
Seeing this as a successor to the SourceForge project, can I ask for some official release, pretty please with sugar on top?

  • the sources have version updated to 0.8.9.1 already ...

(see also issue #48)

Crash when reading a specific file

breaking the walls.mdl causes libmodplug to crash when it's loaded:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a75095 in MDLReadBits (bitbuf=@0x7ffffffd6000: 0, bitnum=@0x7ffffffd6004: 24, 
    ibuf=@0x7ffffffd6008: 0x7ffffffff001 <error: Cannot access memory at address 0x7ffffffff001>, n=n@entry=1 '\001') at load_mdl.cpp:497
497         bitbuf |= (((DWORD)(*ibuf++)) << bitnum);
(gdb) bt
#0  0x00007ffff7a75095 in MDLReadBits (bitbuf=@0x7ffffffd6000: 0, bitnum=@0x7ffffffd6004: 24, 
    ibuf=@0x7ffffffd6008: 0x7ffffffff001 <error: Cannot access memory at address 0x7ffffffff001>, n=n@entry=1 '\001') at load_mdl.cpp:497
#1  0x00007ffff7a5e02e in CSoundFile::ReadSample (this=this@entry=0x612c20, pIns=pIns@entry=0x61c320, nFlags=<optimized out>, 
    lpMemFile=lpMemFile@entry=0x7ffffffdbb07 "B\b\221\344\036B\006\317\062<\255g\351=\352\352P\v]\342~\005%X\265\004\374z\017Vd,^:\006{7R\004q\213\f\254\n\217SDi\036\214\032\363\033S\023\312\065>n*\336\352s\367\342\332\024\203@\372\263\071V\003'yRJ\260JE\211\231\353\310\363V5̐\232\240\245\025\300\213H\253t\246$\357\252\301\245\177\363\237ޜB\002W\330&\bY%\312\070\067\223\306J\304*\325\331\060SJ\260v\220\340a\311\360\360\020\061T\230MY\307Ȕ\231%\274\022\224\202\205\235\216\300\217\302k\262Y\221\340<\214J*\240\246\261B\207\003B@\204\313\016\021\r\202N;ة\235L*+\001%2\302I\361\270\357e"..., 
    dwMemLength=dwMemLength@entry=5404) at sndfile.cpp:1420
#2  0x00007ffff7a74a38 in CSoundFile::ReadMDL (this=this@entry=0x612c20, lpStream=<optimized out>, dwMemLength=142719) at load_mdl.cpp:401
#3  0x00007ffff7a5c869 in CSoundFile::Create (this=this@entry=0x612c20, lpStream=lpStream@entry=0x7ffffffda030 "DMDL", 
    dwMemLength=dwMemLength@entry=142719) at sndfile.cpp:152
#4  0x00007ffff7a8ff77 in ModPlug_Load (data=0x7ffffffda030, size=142719) at modplug.cpp:88
#5  0x00000000004007a4 in main () at t.c:15

This occurs in master as well as 0.8.8.5.

Midi music get wrong duration && wrong tone

Hello, When I pay a Midi audio,it cannot get the right duration of the audio, also it plays the wrong tone. I do not know how to send the music to you. waiting your reply,Thanks.

Segmentation fault in mmreadUBYTE(MMFILE*)

  1. build ffmpeg with libmodplug support enabled
  2. build mpv against that ffmpeg
  3. play this midi file: https://0x0.st/--fc.mid
  4. Get this backtrace:
(gdb) bt full
#0  0x00007ffff788744e in mmreadUBYTE(MMFILE*) (mmfile=0x7fffe66ee4a0)
    at /home/fratti/Projekte/libmodplug/src/load_mid.cpp:133
        b = 0 '\000'
#1  0x00007ffff7888bab in mid_read_byte(MIDHANDLE*) (h=0x7fffb0001eb0)
    at /home/fratti/Projekte/libmodplug/src/load_mid.cpp:725
#2  0x00007ffff788ae1f in CSoundFile::ReadMID(unsigned char const*, unsigned int)
    (this=0x7fffb000ada0, lpStream=0x7fffb00773c0 "MThd", dwMemLength=5242880)
    at /home/fratti/Projekte/libmodplug/src/load_mid.cpp:1420
        avoid_reentry = 1
        h = 0x7fffb0001eb0
        mm = {
          mm = 0x7fffb00773c0 "MThd",
          sz = 5242880,
          pos = 30022720
        }
        ch = 15
        dmulti = 1
        maxtempo = 126
        panlow = 0
        panhigh = 177
        numchans = -1341688896
        numtracks = 32767
        ttp = 0x0
        t = 13
        numpats = 0
        buf = "\000\000\000\000\b\001\000\000\000\000\000\000%\000\000\000\000\000\000\000\020\355α\377\177\000\000\022\305\342", '\000' <repeats 224 times>
        miditracklen = 2122740291
        runningstatus = 255 '\377'
        cmd = 240 '\360'
        midibyte = "\034"
        metalen = 1768455
        delta = 0
        p = 0x7fffe66ee4c0 ""
#3  0x00007ffff78a7efe in CSoundFile::Create(unsigned char const*, unsigned int)
    (this=0x7fffb000ada0, lpStream=0x7fffb00773c0 "MThd", dwMemLength=5242880)
    at /home/fratti/Projekte/libmodplug/src/sndfile.cpp:147
        bMMCmp = false
        i = -141957232
        pins = 0x7fffb000ada0
#4  0x00007ffff789e7f3 in ModPlug_Load(void const*, int) (data=0x7fffb00773c0, size=5242880)
    at /home/fratti/Projekte/libmodplug/src/modplug.cpp:88
        result = 0x7fffb000ada0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.