Step 22 (3.0, loud XM files: distortion, slow playback)
  - Checked five big XM files (20-30 channels, about 1 MB each) by rendering them with the tracker engine and with libxmp
    (tests/trk_render_host.c, tests/xmp_render2.c):
      * timing: song position (order/row) agrees with libxmp within 1-2 rows over 100 s at 16000, 22050 and 44100 Hz, so the engine
        is not slow by itself; "slower than it should" is the real-time CPU limit (buffer underruns) and goes away with a lower rate;
      * distortion: the sum of 20-30 voices was clamped to 8 bits - 0.8 % and 2.8 % of the samples in two of the files.
        The mixer now has an output limiter: when a frame would leave -128..127 the gain drops at once and recovers over
        about 0.2 s, so the waveform is scaled instead of cut.  Without peaks the output is unchanged (the MED stereo tests pass);
      * the samples of these files are well normalised (none quiet), the high-frequency content matches libxmp.
  - CPU protection (step 16) now takes a cheaper first step: linear interpolation of the mixer is switched off ("CPU too slow:
    mixer interpolation switched off"); only if the engine is still too slow the rate is lowered (22050 -> 16000 -> 11025 Hz).
    Preferences -> Audio -> Interpolation turns it back on.
  - Known: 9 of the 33 MED host tests (command pages, selected state, real files, MIDI trace ...) exit with an error; their results are
    the same with and without the limiter, they were not looked at.

Step 21 (3.0, playlist tabs)
  - The four list tabs are a real radio group now (done by MUI itself): exactly one tab is pressed - the shown list; pressing the
    pressed one changes nothing; pressing another one switches at once.
  - Why they behaved as independent switches before: the call that refreshes the tabs (counts "List 1 (3)" and which tab is pressed)
    was deleted from main.c by mistake when the dead resume-position code was removed (step 17).  Restored; the emulator suite
    suite_tabs.py now checks labels, counts and the pressed tab from the log (TABS lines) after every click.

Step 20 (3.0, MODs with more than 4 channels)
  - 6CHN / 8CHN / 12CH ... (tags xCHN, xxCH, xxCN, FLT8, OCTA, OKTA, CD81, TDZx, FA0x, up to 32 channels) are loaded and played by a
    second build of the MOD replayer (modmix_player.c includes mod_player.c) that drives the software mixer instead of Paula.  The
    effect logic is the same code as the 4-channel hardware player (its host tests still pass).  Amiga panning (left, right, right,
    left ...), loops and sample swaps follow Paula's rules; no hardware filter.  FLT8 pattern pairs are handled.
  - Checked against libxmp by rendering the same files (tests/modmix_render_host.c, tests/xmp_render.c): spectral cosine of the
    first 24 s is 0.91 - 0.98 for 4, 8 and 12 channel files alike; envelope correlation of the 4-channel files 0.98 - 0.999.
    That shows the right notes, tempo and effects; it is not a listening test.  Output level: voices above 3 per side are turned down
    (about 1 % clipped samples on loud 8-channel files, the Normalize option helps).
  - Pause, resume, seek, stop and the end-of-song advance work for the new engine (condition-based emulator suites suite_mod8*.py).
  - Cost: eight software-mixed voices are far heavier than Paula.  On a slow CPU the protection of step 16 lowers the rate
    (22050 -> 16000 -> 11025 Hz) for this engine; in FS-UAE (A1200, 14 MHz) it does so right away.  Not tested on real hardware.
  - The background scan is paused while a software-mixed engine cannot keep up and the scan was running in the same
    window (decrunching a big XPK file in the background was mistaken for an overloaded CPU).
  - tests/run_host_loader_cases_test.sh: 6 / 8 / 12 CH and FLT8 cases (channel count and channel layout).

Step 19 (3.0, Module info button, hidden limits in Preferences)
  - New "Module info" button in the main window, in the row with Filter / Repeat / Shuffle (key I, same as the menu item).
  - Cause of "modules stop at 1:18": MAXTIME=75 saved in the icon (75 s + 2 s fade-out).  Preferences showed "Off" for it because the
    Max time / Skip silence cycles only knew their fixed values; saving Preferences silently wrote Off.  Reproduced in FS-UAE with
    MAXTIME=75 ("Fading out ..." -> "Time limit reached" at about 1:17).  Now a value that is not in the list is shown as
    "Custom: 75 s" and kept unless you pick another entry.  Also: the mixer rate entry reads "Auto (22050 Hz)".
  - The loop-guard change of step 18 stays (it is harmless), but it was not the cause.

Step 18 (3.0, XPK-SQSH, loop guard)
  - XPK files with the SQSH sub-packer (header "XPKF...SQSH", very common for Amiga MODs) are unpacked transparently like PowerPacker files,
    also for the title / length scanner.  Algorithm from the portable decruncher by Bert Jahn as rewritten for libxmp (MIT, LICENSE.libxmp).
    Checked on 15 real packed modules: the 16 reference bytes stored in every XPK header match the output, a mutation run under ASan/UBSan
    does not crash (tests/run_host_xpk_test.sh).  Other XPK sub-packers (NUKE, DLTA ...) are not supported.
  - Of those 15 files, 10 are ordinary 4-channel MODs and play; 5 are 8CHN / 12CH modules, which are still not supported (shown as ERR).
  - Loop guard (a MOD that plays 2 s past its computed length is ended): the cached length was keyed by the module's address; it is now
    set at every load and cleared at every unload, and the status line says "Module ran past its computed length (N s) - next" when
    the guard ends a track.  Reported symptom: modules cut off at about 1:18.  I could not reproduce the cut-off in FS-UAE (In_the_distance
    plays past 95 s with the previous build), so this is a fix of the only mechanism I found that can end a MOD at a fixed time,
    not a confirmed fix.  If it still happens: check Preferences -> Playback (Max time, Skip silence) and the ToolTypes MAXTIME / SILENCE / FADE.

Step 17b (3.0, fix of the previous package)
  - The previous package played every MOD as silence (no length, skipped after a few seconds): a field was added to the module
    structure but the Makefile did not rebuild all files that use it.  Fixed: every object now depends on all project headers, the
    binary was rebuilt from scratch.  The emulator suite now checks that a MOD reports title/length and has its samples in chip RAM
    (tests/emu_test/suite_mod.py), not only that a clock runs.

Step 17 (3.0, files that would not load)
  - Checked our MOD / XM / S3M / MED loaders against the libxmp test corpus (1634 files; tests/loader_triage.c compares with libxmp):
    297 accepted now (264 before), no regressions, no sanitizer errors over the whole corpus.
  - XM: old versions 1.02 / 1.03 (instruments before patterns, 8-byte pattern header), files cut off at the end (missing instruments,
    short sample data), instruments with more than 16 samples (up to 255), ModPlug ADPCM samples, stereo samples (mixed down to mono).
    Sample data of 144 XM files is identical to libxmp's.  OggMod (.oxm, Vorbis samples) is still not supported and the file is rejected.
    Fixed on the way: an XM header with a short order table could be read past its end.
  - MOD: old 15-sample Soundtracker modules (no format tag) are recognised by a conservative heuristic, tried only after every other format
    was ruled out; a last sample that is shorter than the header promises no longer makes the file unloadable; tags M&K!, FEST, N.T.
    are accepted.  6 / 8 channel MODs (6CHN, 8CHN, FLT8, OCTA ...) are still not supported (they need the software mixer).
  - Verified in FS-UAE: 4 old MODs and 4 real XMs (one with 16 channels, one 1.02, truncated ones) that failed before now start and play.
  - tests/run_host_loader_cases_test.sh: synthetic regression cases; tests/xm_compare.c, tests/loader_triage.c: comparison with libxmp.

Step 16 (3.0, protection against slow CPUs, test log)
  - Found with the new test log: pressing a key while the audio task was rendering could deadlock paula_stream_stop() (it aborted the
    audio requests, the task then queued new ones and WaitIO never returned).  This was the cause of the sporadic "frozen window"
    reports in long automated runs and is present in earlier 3.0 builds.  Fixed: the audio task announces that it is busy and stop waits for it.
  - Slow CPUs: every second the player checks that a software-mixed engine produces enough audio (rate/512 buffers per second).
    Below 70 % over several seconds it lowers the mixer rate for that kind of module (22050 -> 16000 -> 11025 Hz), restarts the track
    and says so in the status line; below 11025 Hz it only warns ("CPU too slow for this module").  AUTORATE=NO (Preferences ->
    Audio -> Protect) switches this off.  Tested in FS-UAE (A1200, 14 MHz): 4-channel AHX delivers about 20 % of real time, the rate
    is lowered and the window keeps reacting; it does not make AHX real-time on that CPU.  The audio task also drops its priority below the GUI
    when it cannot keep its buffers filled.
  - Test log: set the AmigaDOS variable AP_TESTLOG (SetEnv AP_TESTLOG RAM:ap.log) and the program writes status lines, load/unload steps,
    scan steps and a heartbeat per second (engine, elapsed time, rate, underruns, list).  tests/emu_test/aptest_helpers.py, suite_basic.py
    and suite_ahx.py use it to wait for conditions instead of fixed delays; the suite covers startup, every format in turn (with a
    damaged file in the list), the AHX overload, GUI reaction afterwards and the list switch.

Step 15 (3.0, four playlists)
  - Four playlists (tabs "List 1" .. "List 4" with item counts above the filter field; Amiga-1 .. Amiga-4).  Every playlist
    operation acts on the shown list.  The player follows the shown list: the playing track finishes, the next one comes
    from the newly shown list.  The playing marker and the "n/m" counter are shown only on the list the track was started from.
  - ENVARC:AmigaPlayer.state keeps all four lists (FILE=, FILE1= .. FILE3=), the current entry of each (CURRENT, CURRENT1 ..)
    and the active tab (ACTIVE=).  Command line / Workbench arguments replace list 1 only.
  - Tested in FS-UAE: restore of three non-empty lists with the second active, switching with the shortcuts while a track
    keeps playing, saving of all lists on quit.  Host test: tests/run_host_state_test.sh (four lists, per-list pruning of missing files).
  - Two bugs found on the way: the main loop re-set the playlist in every pass and the GUI rebuilt its whole list each time
    (fixed: it rebuilds only when the shown list changes); the "playing" path came from the shown list instead of the list the
    track was started from (fixed).
  - Known limit (not new): on a 14 MHz 68020 (FS-UAE A1200) a 4-channel AHX needs about 2.8 times the real-time CPU; the mixer then keeps the
    processor busy and the window stops reacting for a long time (it looked like a hang or crash in long automated test runs; the same
    happens with the previous 3.0 build).  Faster CPUs (030 and up) are not affected.  Lower the mixer rate in Preferences or use
    a faster CPU for AHX/HVL.  Not tested on real hardware.
  - Not done: moving entries between lists (add the same files to another list instead), per-list names.
  - The resume-position idea was dropped completely.

Step 14 (3.0, second round of user requests)
  - Playlist: sort by type / time, remove duplicates (the playing entry is kept), five recent playlists in the Project menu,
    unplayable files are skipped when moving on and shown as ERR (status: "Skipped N unplayable files").
  - No more flicker while titles/lengths are scanned: only the scanned row is redrawn, not the whole list.
  - New Playback menu (volume, mute, seek -/+ 10 s, jump to playing, elapsed/remaining) and a clickable clock; the list has
    keyboard focus at start (cursor keys, Enter).  The Repeat gadget is a plain button now (its label follows the chosen font).
  - Window position is remembered together with its size (ENVARC:AmigaPlayer.state).
  - Fade-out (FADE=seconds, default 2) before MAXTIME / SILENCE move on: hardware master volume for MOD, output gain for
    the software mixers.  Tested: status "Fading out ..." then the next track; the level change itself was not measured.
  - Normalize (NORMALIZE=YES, default): software-mixed formats above a common RMS level (40 of 127) are turned down (fast attack,
    slow release, never boosted).  On the FC test songs the loud FC14 modules go from RMS 62-69 to 36-37, quiet ones are untouched.
    MOD played through hardware Paula is not affected.
  - The loop guard (module played 2 s beyond its computed length counts as finished) is MOD only: tracker_duration_ms()
    for XM/S3M froze the main loop for seconds on a 14 MHz 68020.  This fixes a stall that the previous 3.0 build could show.
  - Resume of the position inside the track after a restart was tried and REMOVED (it broke playback in the first tests).
  - Memory: 14 Avail samples over ~10 cycles of 7 tracks (MOD, XM, IT, AHX, FC14, SID, MOD) in FS-UAE: in-use chip and fast memory
    identical to the byte (the C heap is not returned to the system, so this shows no growth, not that nothing is held).
  - Not done: several playlists (tabs).

AmigaPlayer 2.14 + optional MUI front-end (experimental, compile-tested only)

Files
  AmigaPlayer_2.14_MUI   68020 build (vbcc), MUI with automatic fallback to the classic GUI
  mui_gui.patch          git diff against checkpoint 0e4ffc6 (includes new files and the MUI 3.8 headers
                         include/libraries/mui.h + include/clib/muimaster_protos.h)
  gui_mui.c / gui_mui.h  the new front-end (also inside the patch)

Behaviour
  - GUI=MUI (default): needs MUI 3.8+ (muimaster.library v11). If it is missing or the window cannot be
    opened, the classic GUI starts exactly as before.
  - ToolType GUI=CLASSIC forces the classic GUI.
  - Workbench drag&drop, keyboard shortcuts (A D X I F P Space S [ ]), playlist, volume, POS seek retained.
  - POS seek is committed ~400 ms after the last slider movement.

Step 1 UI (this build)
  - Menus: Project (Add file/dir, Load/Save playlist, About/Help, Quit), Playlist (Remove, Clear, Sort A-Z);
    Amiga-key shortcuts A D L S I Q / X C O.
  - Now-playing panel: title, n/m | format | channels | engine | filter, big clock with remaining time.
  - Multi-column playlist (#, Name, Type); the playing entry is bold with a '>' marker.
  - Repeat off/all/one cycle gadget + Shuffle toggle (GUI=MUI only; initial repeat from LOOPPLAYLIST).
  - Bubble help on buttons.
  - Plain keys kept: P Space S [ ] F, A D X (toolbar), H (shuffle).  'I' is now Amiga-I.

Changes after the first emulator run (MUI 5.0 OS3 in FS-UAE)
  - main() now switches to a private 64 KB stack when the process stack is < 40000 bytes
    (MUI refuses/warns below 32000; a default icon or `Run` gives only 4096).
  - Playlist: single click only SELECTS (for Remove); double click PLAYS.

Step 12 (this build): quality options, seeking, playlist order, M3U
  - Preferences is now split into tabs (Audio / Playback / Display).  New: IT quality (nearest/linear) and IT voices
    (16/32/48/64); FC quality (nearest/linear, default linear) and an optional FC low-pass (~4.9 kHz, off by default:
    a real Amiga already filters Paula's output).  Tooltypes ITINTERP, ITVOICES, FCINTERP, FCFILTER.
  - libxmp is built IT-only (MOD/XM/S3M loaders removed): -16 KB, IT output identical.
  - HVL mixer: voices with volume 0 are skipped (their positions still advance): bit-identical output, 16 channels
    2.6x, 12 channels 1.8x, 4 channels 1.1x faster (FS-UAE A1200, 14 MHz).  Still slower than real time there.
  - VU / oscilloscope: 25 pictures per second (40 ms wake-up), heavy refresh (clock, texts) every 80 ms.
  - Seek for IT (libxmp), AHX/HVL and FC.  The slider needs a length: FC is measured at load, AHX/HVL on a private
    copy in the background (a few seconds on a fast CPU, about a minute on a 14 MHz 68020), IT knows it.  HVL/FC seek
    by replaying the song logic up to the target, a slice per main loop pass, with progress in the status line.
    SID / SAP: no seek (no length).
  - Playlist: Move up / Move down (Amiga-U / Amiga-J, also in the right-mouse menu) keep the selection; "Export M3U..."
    (Project menu) writes #EXTM3U with #EXTINF (seconds, title); Save playlist with a name ending in .m3u does the same.
    Drag & drop sorting is in the source behind -DAP_LIST_DRAG but did not reorder anything in FS-UAE / MUI 5.0.
  - HVSC Songlengths: not implemented on purpose (the database is about 5 MB).

Step 11 (this build): Impulse Tracker (IT) and Future Composer (FC13 / FC14)
  - IT: libxmp-lite (MIT, LICENSE.libxmp) in src/player/xmp, wrapped in src/player/it.  Title and length come from
    the file (scanner: files up to 600 KB), mixing is "nearest" with 48 voices for speed.  Needs the soft-float
    build described below.
  - FC: fc14play replayer (Olav Sorensen, BSD 3-clause, LICENSE.fc14play; GPL was NOT needed) in src/player/fc with
    my own integer Paula (4 voices, DMA loop reload like the hardware, nearest sampling, stereo separation 20%).
    The replayer logic is the original's; the sound of the mixer is simpler than the original BLEP/filter version.
  - Build notes (Makefile handles them): libxmp needs double arithmetic, so those files are compiled with a copy of
    the vc config without -amiga-softfloat (build/aos68k_msoft, generated from $VBCC/config/aos68k - VBCC must be
    set) and linked with -lmsoft; flags -D__amigaos__ -DWORDS_BIGENDIAN=1.  vbcc has a bug: "1.0 * int / int" is
    compiled as an integer division - fixed in xmp/player.c; keep it in mind for any new code with doubles.
    vbcc does not define __amigaos__, so big-endian code paths check __VBCC__ as well (fc_replay.h).
  - Verification: IT - the same libxmp code built with vbcc, run in FS-UAE, renders PCM identical to the host build
    for 14 test modules; ~30,000 damaged modules under ASan/UBSan (tests/run_host_it_fuzz.sh).  FC - register-write
    logs of the replayer are identical to the original for 14 modules on the host (tests/run_host_fc_test.sh) and,
    built with vbcc and run in FS-UAE, for 5 modules (a 6th identical until the emulator run ended); ~20,000 damaged
    modules under ASan/UBSan (tests/run_host_fc_fuzz.sh).  HVL built with vbcc: PCM identical to the host for 11 of
    12 tunes (12th identical until the run ended).
  - Played in the player (FS-UAE, MUI 5): FC14 (horizon), IT (Bidi_Loops: title, length, Module info), FC13 type SMOD
    recognised in the list.  Not tested: FC13 playback in the player, long IT modules, real hardware.
  - The binary is ~474 KB; libxmp-lite still contains its unused MOD/XM/S3M loaders (about 30-50 KB, can be removed).
  - Module info: "CPU too slow?" hint appears when the audio stream reports more than 3 underruns.

Step 10 (this build): AHX and HVL (HivelyTracker) playback
  - New engine src/player/hvl/: the HivelyTracker replayer (Copyright (c) 2006-2018 Pete Gordon, BSD 3-clause,
    LICENSE.hively) renders into the Mix64 stream.  Handles AHX and HVL (4-16 channels, subsongs: use the
    Subsong row / , . keys).  A song counts as finished after one pass (then repeat/shuffle/next apply;
    "Subsongs: play all" steps through the subsongs first).  Titles appear in the playlist; no lengths
    (AHX/HVL loop, so the length is not known without running the song).
  - Changes against the original replayer (all documented in the sources): Amiga types, no stdio/printf,
    integer arithmetic instead of floating point (reproduces the original float32 rounding exactly), sin()
    table precomputed, wave tables allocated at the first load (~400 KB, freed with the last AHX/HVL song),
    and bounds checks for corrupt files (null wave sources, waveform / filter / wave length / note / channel
    / stereo / subsong-start / jump values read from the file, zero-filled margin behind the loaded file).
  - Verification: tests/run_host_hvl_test.sh renders all 12 tunes of the HivelyTracker repository (AHX + HVL)
    with the ORIGINAL replayer and with this port at 22050/44100/16000/11025 Hz incl. subsongs: 48 renders,
    PCM bit-identical.  tests/run_host_hvl_fuzz.sh: ~57,000 randomly damaged files under ASan/UBSan, no error
    (rendering 25 frames each; try HVL_FUZZ_SEED / HVL_FUZZ_N).
  - Performance: 16-channel tunes at 22050 Hz are heavy for a plain 14 MHz 68020 (the mixer is the original
    C code).  Module info shows the audio stream's underrun counter; lower the mixer rate in Preferences if
    it is not zero.  Not tested on real hardware.
  - test_files/hvl_songs: the 12 sample tunes (from the HivelyTracker repository, see its README for credits).

Step 9
  - PowerPacker 2.0 (PP20) files are unpacked transparently by the file loader, so any module format can be
    stored packed (also used by the background scanner).  Module info shows "PowerPacker 2.0, N bytes on disk".
    Implemented in src/system/pp20.c; verified with tests/run_host_pp20_test.sh: 50 generated streams decode
    bit-exact and 16,500 randomly damaged streams are accepted/rejected identically to the public-domain
    reference decruncher (tests/pp20_reference.inc).  PX20 (encrypted) and XPK are not supported.
  - test_files/mod.packed song = PowerPacker-packed MOD made with tests/pp20_pack.py (test-only packer).

Step 8 (this build)
  - Playlist comfort: Filter field (press / , type part of a file name; the list shows the matches and keeps
    the real numbers), Del removes the selected entries, Return plays the active one, several entries can be
    selected (Shift/Ctrl+click adds one, dragging selects a range) and removed together, and the right mouse
    button opens an entry menu (Play / Remove selected / Module info).
  - Titles and lengths: columns Name | Title | Type | Time.  A background scanner (SCAN=YES, Preferences ->
    Scan) reads the visible rows first, then the rest.  MOD/S3M/XM get a length; XM/S3M files larger than
    600 KB only get the title; SID/SAP get the title from the header (no length).  The info line shows the
    playlist total, "+" while some lengths are still unknown.

Step 7
  - State (RESTORE=YES, default): ENVARC:AmigaPlayer.state keeps playlist, current entry, volume, repeat,
    shuffle and the last requester drawers; restored at start when no files are given (missing files are skipped).
    Written at exit.  Preferences -> "Restore" switches it off.
  - Subsongs (SID/SAP): row "< Subsong n / m >" appears for files with several songs; keys , and . ;
    the song is restarted without reloading the file.  Starting a SID takes the same time as starting a track
    (the SID engine pre-renders its first buffers; ~6 s in a 14 MHz emulation, instant on a fast CPU).
  - Max time (MAXTIME=seconds) and Skip silence (SILENCE=seconds), Preferences -> Behaviour:
    when the limit/silence is reached the player moves on (respecting repeat / shuffle).
    Silence is measured on the software mixer's output (XM/S3M/MED-mixer/SAP/SID), threshold peak <= 4 of 127.
    "Subsongs: play all songs" (ALLSUBSONGS=YES) makes the limit step through every subsong before the next file.
  - New tooltypes: RESTORE, MAXTIME, SILENCE, ALLSUBSONGS (written by Preferences -> Save).
  - test_files/: subs3.sid, subs3.sap (3 songs each), silent.sid (generated, for testing).

Step 6
  - Playlist columns: "#" and "Type" are exactly as wide as their longest entry, "Name" takes all the rest
    (long names are clipped at the window edge instead of squeezing Type).  The MUI List class has no
    user-resizable/movable columns; enlarge the window (Save stores its size) for more room.

Step 5
  - Font: Preferences -> Font -> "Choose..." opens the standard ASL font requester (name + size, bitmap and
    outline fonts); "Default" goes back to the MUI font.  Save stores ToolTypes FONTNAME=<name>.font and
    FONTSIZE=<4..80>; the font is applied to the whole player (buttons, panel, list, status, Preferences/Info
    windows) at the next start from the icon.  The clock uses a 1.5x larger size when the font provides one.
    If the font cannot be opened the MUI default is used and the status line says so.
    Known: the text of the Repeat cycle gadget keeps the MUI default font.

Step 4
  - Module names: Amiga-style prefixes are recognised like PC suffixes.  mod.example, MOD.A.PLACE.I,
    mod.1.9.9, xm.song, s3m.song, mmd0.song  ->  Name + Type (MOD/XM/S3M/MMD0...); example.mod works as before.
    A known suffix wins (Mod.Song.mod -> Mod.Song / MOD).  The big title in the info panel uses the same rule.
    "Add dir" also accepts med. / mmd0-3. prefixes now.  (src/playlist/modname.c + host test)
  - Window size: "Save" in Preferences stores the current window content size as ToolTypes
    WINWIDTH / WINHEIGHT; it is restored when the program is started from its icon (Workbench).
    From a CLI the tooltypes are not read (as before).
  - Fixed a buffer overflow in the new tooltype writer (found while testing: the icon got 190 KB of junk).

Step 3
  - File requesters (Add file/dir, Load/Save playlist) run in a helper process: the GUI keeps redrawing and
    the clock keeps running while a requester is open. The playlist is only modified by the main task.
    (ASL requests must be allocated by the task that shows them - that was the cause of a frozen requester.)
  - Stack: `unsigned long __stack = 65536` (vbcc startup) replaces the hand-made StackSwap of earlier builds,
    which crashed on exit when started with a small stack.  Do not use earlier AmigaPlayer_2.14_MUI binaries.
  - VU meters / oscilloscope (MUI only): oscilloscope + L/R VU for mixer engines (XM/S3M/MED/SAP/SID),
    4 channel bars for MOD (hardware Paula).  Taken from the rendered stream buffers - the per-voice
    peak code in the mixer stays disabled.  ToolType VISUALS=YES/NO, "Visuals" in Preferences;
    when off nothing is measured.  Refresh 10 Hz.

Step 2
  - Menus: Project (Module info I, About/Help H), Playlist, Settings (Preferences P).
  - Module info window: file, size, format, title/name, song/patterns/instruments, timing, MOD sample list;
    also for XM/S3M/MED/SAP/SID.
  - Preferences window: mixer rate, interpolation, autoplay, AppWindow, interface (MUI/Classic).
    Use = this session, Save = writes tooltypes into the program icon (other tooltypes preserved,
    icon created if missing, stack 65536).  Mixer rate applies to the next module, interface at restart.
  - Seek: dragging the POS knob works; a plain click on the knob no longer causes a spurious seek.
  - Clock shows 0:00 when nothing is loaded.

Verified in FS-UAE (A1200, KS 3.1, WB 3.1.1, MUI 5.0 os3, 8 MB Fast, 640x512):
  window layout, MOD+XM playback, MOD->XM switch, keys P/Space/S/]/H, double-click play,
  selection vs playing entry, menu bar + Project menu with shortcuts.
Also verified: Playlist menu (Sort A-Z), Remove, Clear, Add file requester opens, POS drag seek,
  Workbench drag&drop, Module info / About / Preferences windows, Save writes AP_MUI.info
  (AUTOPLAY, LOOPPLAYLIST, APPWINDOW, MIXRATE, INTERPOLATE, GUI), classic fallback without MUI.
Step 3 verified in FS-UAE: Add dir requester stays non-blocking (clock runs, window can be dragged over the
  player and redraws), OK adds 5 modules, Cancel, quit while a requester is open exits cleanly, quit from a
  4096-byte stack exits cleanly, MOD bars + XM oscilloscope animate, Visuals off + Save writes VISUALS=NO and
  hides the panel.
Not verified: CPU load of the visuals on a real 14 MHz A1200/PiStorm, Add file / Load / Save playlist through the
  async path (same code as Add dir), MUI 3.8 (tested on 5.0), changing preference values + Use, Load/Save playlist dialogs,
  real hardware / PiStorm.

Verified (earlier): full build, host playlist test, native FS-UAE run of the fallback (no MUI installed) - plays.
NOT verified: MUI runtime path (no MUI runtime in the supplied Workbench HDF).
