Skip to content

v0.1.0.nightly2309052316

Pre-release
Pre-release
Compare
Choose a tag to compare
@github-actions github-actions released this 05 Sep 23:32
· 1083 commits to trunk since this release

Anklang 0.1.0.nightly2309052316

Development version - may contain bugs or compatibility issues.

Merge branch 'version-fixes'    # 2022-07-29 Tim Janik 61e8d05
    * version-fixes:
      ASE: remove unneeded version postfix from AnklangSynthEngine
      MISC: version.sh: fix development postfix for shallow versions
      MISC: version.sh: fix build id with development postfix
      MISC: Makefile.mk, version.sh: fix release tag missing 'v'-prefix

Merge branch 'jack-driver'    # 2022-07-29 Tim Janik cc1cb08
    * jack-driver:
      DOC: ch-install.md: merge jack howto into driver-setup section
      DOC: ch-install.md: add chapter about download and installation
      ASE: main.cc: print the real executable_name() for --version and usage
      ASE: driver.cc: load jackdriver.so
      ASE: Makefile.mk: optionally build jackdriver.so
      MISC: config-checks.mk: check if jack.pc >= 0.125.0 is present
    	Jack 0.125.0 ships with Ubuntu-20.04.
      ASE: driver-jack.cc: turn into a working PCM driver for Ase
      ASE: driver-jack.cc: adapto to Ase namespace
      ASE: merge original Jack driver by Stefan Westerfeld
    	  Initial version of Jack driver using the new driver API
    	  Add minimal jack howto
    	  Block SIGPIPE to avoid crashes when jackd dies
    	  Driver: return read and write latency for a pcm driver separately
    		For instance for synchronizing the play position pointer ui with the audio
    		buffering, you want to know how much write latency you have, but don't care
    		about the amount of read latency.
    	  Add list with possible improvements from PR 31
    		https://github.com/tim-janik/beast/pull/31
    	  Add some minor fixes as requested in review
      ASE: engine.cc: consistently calculate buffer size for multiple channels
      ASE: datautils.hh: add fast_copy() for floats and ints
      ASE: driver-alsa.cc: adjust debug messages, remove unused variable
      ASE: main.cc: require command line options to enable JSIPC logging

Merge branch 'freeverb'    # 2022-07-31 Tim Janik 554794d
    * freeverb:
      DEVICES: freeverb/freeverb.cc: turn into a working AudioProcessor for Ase
      DEVICES: freeverb/freeverb.cc: make query_info() const, i.e. MT-Safe
      DEVICES: freeverb/freeverb.cc: move all code completely into Anon namespace
      DEVICES: freeverb/freeverb.cc: use explicit add_param() IDs and fix arguments
      DEVICES: freeverb: implement STK and VLC damping
    	Avoid reinforcing feedback loop in the original damping code,
    	by providing VLC and STK damping modes. The latter is likely
    	closest to the original intention so it is now the default.
    	This also reorders some parameters and removes the original
    	freezing mode, that does not really make sense for Processors.
      DEVICES: freeverb/freeverb.cc: add Freeverb Processor
      DEVICES: freeverb/revmodel.cpp: fix missing `int i` decls
      DEVICES: freeverb/Freeverb*: remove unused vst files
      DEVICES: freeverb/: fix up whitespace and \n without \r everywhere
      DEVICES: freeverb/: Freeverb - free public domain reverb SOURCE CODE
    	Freeverb - Free, studio-quality reverb SOURCE CODE in the public domain
    	Written by Jezar at Dreampoint - http://www.dreampoint.co.uk
      DEVICES: freeverb/Makefile.mk: add source file to devices/4ase.ccfiles
      DEVICES: freeverb/GNUmakefile: allow subdir builds
      DEVICES: Makefile.mk: add dependencies, clean rule, etc for devices/ sources
      DEVICES: blepsynth/Makefile.mk: simply add source files to devices/4ase.ccfiles
      UI: b/contextmenu.vue: allow 0 as valid menuitem.uri value
      UI: b/cliplist.vue: only call non-null Shell.piano_current_tick()
      README.md: fix manual link

Merge branch 'dist-tarball' - create distribution tarballs    # 2022-08-06 Tim Janik 50d9c06
    Adjust versioning and build rules to support proper distribution tarballs
    that will build without .git/ history.
    
    * dist-tarball:
      MISC: Dockerfile-apt: provide zstd
      MISC: Makefile.mk: re-enable nightly asset builds
      Makefile.mk: work around git 2.25.1 not handling Format:%(describe:match)
    	Ubuntu 20.04 still runs git 2.25.1.
      MISC: version.sh: work around git 2.25.1 not handling Format:%(describe:match)
    	Ubuntu 20.04 still runs git 2.25.1.
      MISC: Dockerfile-apt: add universal-ctags
      MISC: dbuild.sh: recognize --help
      Makefile.mk: use wildcard for toplevel CLEANFILES
      MISC: Makefile.mk: list Nightly changes
      MISC: Makefile.mk: fix upload-release
      MISC: Makefile.mk: use TARBALL version for build-assets
      MISC: Makefile.mk: minor fixups
      MISC: Makefile.mk: only check-copyright if .git/ exists
      MISC: Makefile.mk: remove versioned ChangeLog generation
      Makefile.mk: ChangeLog: use slightly longer hashes
      Makefile.mk: fix ChangeLog range
      Makefile.mk: use ls-tree.lst to generate TAGS
      MISC: Makefile.mk: use ls-tree.lst
      DOC: Makefile.mk: use ls-tree.lst
      Makefile.mk: create and distribute ls-tree.lst
      MISC: config-utils.mk: provide only $(HAVE_GIT) which is true if .git/ exists
    	Using the old WITHGIT or WITHOUTGIT did not really work.
      MISC: Makefile.mk: avoid -j, rely on MAKEFLAGS for parallel submakes
      MISC: Makefile.mk: build-nightly: create and build dist tarball
      MISC: dbuild.sh: use .dlcache subdir for dockerized ccache
      MISC: Makefile.mk: build-assets: build from sources in $(TARBALL)
      MISC: Makefile.mk: record and use artifacts in build-assets
      MISC: Makefile.mk: add 'build-version' rule
      MISC: Makefile.mk: call version.sh --make-nightly for nightly builds
      MISC: Makefile.mk: check nightly versions
      MISC: Makefile.mk: add 'versioned-manuals' rule
      DOC: Makefile.mk: use packaged doc/copyright if Git is missing
      GITHUB: workflows/testing.yml: build with --no-tex and SKIP_LATEX=true
    	Only the PDF manuals need Tex, skipping LaTex installation
    	significantly speeds up the CI builds.
      MISC: dbuild.sh: add --no-tex (replaces --tex)
      MISC: Dockerfile-apt: default to building with Tex
      DOC: Makefile.mk: build PDF manuals, unless SKIP_LATEX=true
      DOC: Makefile.mk: skip misc/mkcopyright.py if .git is not present
      MISC: mkdeb.sh: use `misc/version.sh --commit-hash` instead of git
      MISC: version.sh: add --commit-hash
      MISC: version.sh: remove extra version printout for --make-nightly
      MISC: version.sh: add --help and --make-nightly
      MISC: version.sh: use the same COMMITINFO for archives and .git repos
      Makefile.mk: dist: allow packaging with NEWS.md worktree changes
      Makefile.mk: simplify make dist
      Makefile.mk: add hard dependency on ctags-universal
    	Builds from Git need ctags-universal to reliably generate TAGS for
    	make dist.
      Makefile.mk: provide $(builddir) and $>/ early on
      Makefile.mk: check misc/version.sh execution
      ASE: Makefile.mk: add missing minizip/mz_zip.h dependency
      DOC: copyright.ini: list freeverb sources under Public Domain dedication
      DEVICES: freeverb/freeverb.cc: license under MPL-2.0

Merge branch 'docker-caching'    # 2022-08-11 Tim Janik 433f9bd
    * docker-caching:
      MISC: dbuild.sh: skip TeX during docker image build with -T
      MISC: Dockerfile.focal: cleanup early to shrink docker image, possibly skip TeX
      MISC: dbuild.sh: use misc/Dockerfile.focal by default, remove -d, change -f
      MISC: Dockerfile.focal: rename from Dockerfile-apt, use FROM ubuntu:20.04
      ASE: Makefile.mk: add missing dependencies for includes
      ASE: sortnet.hh: include <functional> for std::less
      Makefile.mk: use `ctags` executable
      GITHUB: workflows/testing.yml: fix cache-hit detection
      GITHUB: workflows/testing.yml: skip docker caching on cache miss
      GITHUB: workflows/testing.yml: invalidate cache if misc/dbuild.sh changes
      GITHUB: workflows/testing.yml: remove docker image test
      MISC: get rid of --no-tex and $NO_TEX (now unused)
      GITHUB: workflows/testing.yml: remove '--no-tex'
    	Avoiding Tex installation was only needed without docker image caching.
      MISC: dbuild.sh: fix SIGPIPE when searching docker image for INITIALIZE
      MISC: dbuild.sh: debug wrong INITIALIZE setting
      MISC: dbuild.sh: use 'ubuntu:20.04' as base instead of 'ubuntu:focal'
    	Both are tags for the same image, but the former is already present
    	on Github's stock system.
      GITHUB: workflows/testing.yml: fix grep exit status
      GITHUB: workflows/testing.yml: invalidate cache if misc/Dockerfile-apt changes
      GITHUB: workflows/testing.yml: stop forcing a docker build step
      GITHUB: workflows/testing.yml: upgrade to actions/[email protected]
      GITHUB: workflows/testing.yml: cache docker image via github cache
      GITHUB: workflows/testing.yml: find version inside docker
      GITHUB: workflows/testing.yml: always use the same build arg for docker
      MISC: version.sh: ignore missing tags in Format:%(describe) workaround

Merge branch 'arch-ci'    # 2022-08-11 Tim Janik 76c6214
    * arch-ci:
      .gitignore: add ignores
      GITHUB: workflows/testing.yml: cleanup after each platform build
      GITHUB: workflows/testing.yml: build and test on arch, cache arch docker image
      MISC: Dockerfile.arch: setup archlinux dependencies for building Anklang
    	Use upstream CastXML, the AUR version seems outdated and broken.

Merge branch 'dockerize-asset-builds'    # 2022-08-11 Tim Janik 2fd2f5f
    * dockerize-asset-builds:
      MISC: Makefile.mk: adjust release-message
      MISC: Makefile.mk: export $V for build scripts
      MISC: Makefile.mk: simplify builds, merge upload-nightly and upload-release
      Makefile.mk: fix ls-tree.lst generation in tarballs
      MISC: mkassets.sh: extract release info, make AppImage
      MISC: mkAppImage.sh: move AppImage build logic here
      MISC: mkassets.sh: build binary packages from tarball
      MISC: mkdeb.sh: pass $V to make
      MISC: dbuild.sh: pass $V into docker env
      MISC: dbuild.sh: remove unused .dbuild/ handling
      MISC: Dockerfile.focal: reduce layers
      MISC: Dockerfile.focal: always become 'builder' user, prepare /ootbuild/

Merge branch 'fix-scripts'    # 2022-08-12 Tim Janik a169887
    * fix-scripts:
      MISC: mkassets.sh: handle unbound $V
      MISC: mkdeb.sh: handle unbound $V
      MISC: mkAppImage.sh: handle unbound $V
      MISC: dbuild.sh: handle unbound $V

Merge branch 'sse+fma-synth-engine' - build releases with SSE + FMA support    # 2022-08-12 Tim Janik 5f77129
    * sse+fma-synth-engine:
      ASE: Makefile.mk: build FMA variant iff MODE=production INSN=sse
      MISC: mkassets.sh: build releases with MODE=production INSN=sse
      MISC: Makefile.mk: remove INSN build remnants

Merge branch 'clap-file-reference'    # 2022-08-24 Tim Janik 031c81f
    * clap-file-reference:
      ASE: clapplugin: clean up load_state() and save_state()
      ASE: *.cc: use operator<< where needed for serialization
      ASE: serialize.hh: add operator>> and operator<< to support pure const serialization
      ASE: serialize.hh: operator&: catch serialization into const at compile time
      ASE: project.cc: merge asset_hashes
      ASE: project.cc: use Error::NO_PROJECT_DIR if anklang.project is missing
      ASE: api.hh: add Error::NO_PROJECT_DIR
      ASE: clapplugin: implement file collection
      ASE: clapplugin.cc: save_state: request plugin_file_reference->save_resources()
      ASE: clapplugin.cc: add CLAP_EXT_FILE_REFERENCE skeleton
      ASE: serialize.cc: use TelemetryField for simple serialization tests
      ASE: serialize: support external serialize(T&,WritNode&) impls via ADL
      ASE: serialize.cc: test tuple serialization
      ASE: project.cc: loader_resolve: lookup and resolve files from project dir
      ASE: project.cc: serialize file hashes as tuple array
      ASE: serialize.hh: serialize tuple<...> types
      UI: b/menubar.vue: use project.saved_filename() as "Save" location
      ASE: api.hh: add Project.saved_filename()
      ASE: Makefile.mk: upgrade to clap-1.1.1.tar.gz
      UI: b/app.js: use save_project()
      ASE: api.hh: rename Project.save_project()
      ASE: project.cc: canonicalize project file name when saving
      ASE: project: properly implement writer_collect()
      ASE: project: add API to collect external files
      ASE: strings: add strings_version_sort()
      ASE: path: add dircontains() to check dir hierarchy and compute relative path
      ASE: path: add copy_file(), use FICLONE ioctl to create CoW clone if possible
    	Currently, FICLONE is supported under Linux for XFS and BTRFS.
    	Use `filefrag -v` to detext or debug shared file extents.
      ASE: path: add file_size(), gracefully handle errors
      ASE: clapplugin: derive ClapPluginHandle from GadgetImpl
      ASE: api.hh: print user notes and allow `rest` argument
      ASE: api.hh: introduce Gadget._project()
      ASE: strings: add string_to_hex()
      ASE: main.cc: add --blake3 <FILE> to test Blake3 hashing
      ASE: compress: add blake3_hash_file() and blake3_hash_string()
      ASE: storage: add stream_reader_from_file()
      ASE: Makefile.mk: compile BLAKE3 with SSE and AVX variants
      ASE: Makefile.mk: provide blake3.h from BLAKE3-1.3.1.tar.gz
      ASE: Makefile.mk: use SOURCE2_O
      MISC: config-uname.mk: add $(call SOURCE2_O) to create object extensions
      ASE: clapplugin.cc: fix warnings
      MISC: config-checks.mk: show sha256sum command used failing downloads

Merge branch 'automatic-backup'    # 2022-08-24 Tim Janik 72174fb
    * automatic-backup:
      ASE: project.cc: automatically backup existing project files
      ASE: path: add glob()
      ASE: path: add rename()
      ASE: utils: add now_strftime()

Merge branch 'remote-gc'    # 2022-09-14 Tim Janik f59890b
    * remote-gc:
      UI: startup.js: renew_gc() on object finalization, report_gc() when requested
      ASE: jsonapi.cc: support renew_gc() and report_gc() to start new GC cycle
    	The basic idea behind remote GB by the UI requesting renew_gc() and the
    	Jsonapi server swapping wrapper tables in response is described here:
    		https://testbit.eu/2014/rapicorn-remote-reference-counting
      ASE: jsonapi.cc: test conscise erase() loop over std::map<>
    	Checks the erase() loop used by Jsonipc over std::map<>, in
    	particular ++end must be avoided for empty maps.
      JSONIPC: jsonipc.hh: support clear/swap/size/move_into for instance ptr map
      MISC: config-uname.mk: use -Og for debugging which improves debug info
    	Using -Og is a better choice than -O0, because some compiler passes that
    	collect debug information are disabled at -O0. (gcc docs)
      UI: startup.js: properly namespace Jsonapi/Trigger
      ASE: jsonapi.cc: properly namespace Jsonapi/Trigger
      DOC: ch-development.md: properly namespace Jsonapi/Trigger
      DOC: ch-development.md: minor update
      UI: startup.js: request Ase.Server via Jsonapi/initialize after handshake
      ASE: jsonapi.cc: provide Ase.Server object as Jsonapi/initialize reply
      JSONIPC: jsonipc.hh: reply to Jsonipc/handshake with protocol version 1
      JSONIPC: jsonipc.js: require Jsonipc/handshake with protocol version 1
      UI: startup.js: maintain $id GC list via Jsonipc.finalization_registration
      JSONIPC: jsonipc.js: call Jsonipc.finalization_registration hook from ctors
      UI: GNUmakefile: allow subdir builds

Merge branch 'low-latency-sched'    # 2022-09-14 Tim Janik 5184d18
    * low-latency-sched:
      ASE: engine.cc: request low latency scheduling for the synthesis engine
      ASE: platform: add sched_{set|get|fast}_priority()
      ASE: dbus: add DBus methods rtkit_make_high_priority + rtkit_get_min_nice_level
      MISC: mkdeb.sh: postinst: add cap_sys_nice to AnklangSynthEngine
      MISC: config-checks.mk: add dbus-1 to ase dependencies
      ASE: utils.cc: allow mixed case debug keys
      ASE: Makefile.mk: use ASEDEPS_CFLAGS and ASEDEPS_LIBS
      MISC: config-checks.mk: provide just ASEDEPS_CFLAGS and ASEDEPS_LIBS for ase/

Merge branch 'build-improvements'    # 2022-09-27 Tim Janik 931a674
    * build-improvements:
      MISC: config-uname.mk: enable link time optimization via -flto for MODE=production
      MISC: Makefile.mk: clean mkdeb/ if left over
      MISC: Dockerfile.focal: install libgtk-3-dev which also provides libdbus-1-dev

Merge branch 'prefault-pages'    # 2022-09-27 Tim Janik 9cf276d
    * prefault-pages:
      ASE: main.cc: prefault heap and stack pages
      ASE: main.cc: tune malloc via mallopt to reduce page fault probability

Merge branch 'fix-gc' - plugs a GC race condition    # 2022-09-27 Tim Janik 6caa570
    * fix-gc:
      JSONIPC: jsonipc.hh: InstanceMap: remove unused swap and move_into
      ASE: jsonapi.cc: fix GC bookkeeping with mark_unused() and purge_unused()
      JSONIPC: jsonipc.hh: InstanceMap: add mark_unused() and purge_unused()
      JSONIPC: jsonipc.hh: add CallbackInfo::classname() to improve error messages

Merge branch 'fix-vue-3.2.28'    # 2022-09-28 Tim Janik 6628472
    * fix-vue-3.2.28:
      UI: b/shell.vue: work around vue-3.2.38 breaking $forceUpdate() before mount()
    	Avoid the Shell calling $forceUpdate() from created().
    	That used to work up until Vue-3.2.27, but with .28 and .29 results in:
    	vue.js:1843 Uncaught (in promise) TypeError: Cannot read properties of null (reading 'id')
    	    at queueJob (vue.js:1843:17)
    	    at i.f.i.f (vue.js:4591:44)
    	Aparently $forceUpdate() calls are now broken before mount().
      UI: Makefile.mk: fix wildcard for lit.js to not catch little.js

Merge branch 'print-class-tree'    # 2022-09-28 Tim Janik 8bde98a
    * print-class-tree:
      DOC: Makefile.mk: anklang-internals: add "Ase Class Inheritance Tree"
      ASE: main: add --class-tree to print the class tree
      JSONIPC: jsonipc.hh: add ClassWalker
      ASE: internal.hh: add assert_unreached()
      ASE: engine: minor fixes

Merge branch 'x11test'    # 2022-10-10 Tim Janik 662fd7a
    * x11test:
      X11TEST: play1note.json: add recording to play a single MIDI note
      GITHUB: workflows/testing.yml: run x11test-v on Ubuntu build and upload result
      Makefile.mk: docuemnt x11test and x11test-v
      Makefile.mk: add x11test, x11test-v to run (headless) end-to-end tests
      X11TEST: replay.sh: play Anklang DevTools recording in Electron via Puppetteer
      X11TEST: ereplay.cjs: use Electron and Puppetteer to replay DevTools recording
      X11TEST: x11rec.sh: run and record a command in a virtual or nested X11 session
      MISC: package.json.in: add puppeteer packages
      MISC: Dockerfile.focal: provide xvfb 9wm ffmpeg

Merge branch 'ci-job-split'    # 2022-10-11 Tim Janik bd540be
    * ci-job-split:
      GITHUB: workflows/testing.yml: split jobs for Ubuntu, Arch, IRC
      DOC: copyright.ini: assume MPL-2 for x11test/*.json

Merge branch 'activate+deactivate'    # 2022-10-12 Tim Janik 4e5ac8b
    * activate+deactivate:
      ASE: object.cc: properly check Connection ptr before use
      ASE: track.cc: remove over eager assertion
      ASE: project.cc: start_playback(): switch current engine project on demand
      Makefile.mk: allow make default to configure INSN
      ASE: project: move activate/deactive to Project
      ASE: engine.cc: fix loss of "change:prefs" notification connection
      ASE: engine: add API to set up exclusive Engine + Project relation
      ASE: track: require Project as parent of track
      ASE: gadget: add flags field to be used for gadgets and derived types
      ASE: clapplugin: rename clap_deactivate() and variants
      ASE: api.hh: use GadgetImpl as parent pointer
      ASE: api.hh: derive Track from Device
      ASE: api.hh: derive Project from Device
      ASE: device: rename and move Device::extract_info() here
      ASE: clapdevice.cc: fix call to inherited methods
      ASE: nativedevice: provide remove_all_devices(), implement activation
      ASE: api.hh: Device: provide _activate() _deactivate() is_active()
      ASE: nativedevice.cc: clarify TODO
      ASE: split DeviceImpl into Device and NativeDevice
      ASE: engine: turn the engine into a global singleton
      ASE: engine: simnply wrap AudioEngineImpl calls into AudioEngine methods
      ASE: engine: rename AudioEngineImpl
      ASE: main: export main_loop_wakeup()

Merge branch 'package-updates'    # 2022-10-12 Tim Janik 84e7c32
    * package-updates:
      ASE: clip.cc: fix macro clash
      MISC: package.json.in: update various npm packages
      Makefile.mk: clean x11test/ output dir

Merge branch 'litelement-menu'    # 2022-10-21 Tim Janik 8032e64
    * litelement-menu:
      X11TEST: play-notes.json: update UI test
      UI: b/*: assign aria-label where appropriate
      UI: b/*.vue: add html id to context menus
      UI: b/menuitem.js: always strip slot_label
      UI: util.js: remove unused dropdown()
      UI: b/color-picker.vue: fix menu and support click-drag selection
      UI: b/contextmenu.js: expose dialog via part=dialog to CSS rules
      UI: b/trackview.vue: popup context menu at cursor
      UI: b/piano-roll.vue: fix popup position
      UI: b/piano-ctrl.js: avoid stealing unhandled key presses
      UI: b/dialog.vue: close on regular Escape presses, avoid stealing Escape
      UI: b/contextmenu.js: stop handled dialog Escape key from bubbling further
      UI: util.js: allow shields without Escape key stealing
      UI: b/choice.vue: fix menu and key handling to work like all menus
      UI: b/contextmenu.js: provide .open read-only property
      UI: b/menuitem.js: remove unused code
      UI: b/contextmenu.js: fix data-contextmenu styling
      UI: b/fed-picklist.vue: remove unused component
      UI: b/devicepanel.vue: fix menu origin and insertion pos
      ASE: nativedevice.cc: fix device insertion order
      UI: b/contextmenu.js: close menu on backdrop clicks
      UI: util.js: dialog_backdrop_mousedown(): close dialogs on backdrop clicks
      UI: b/menubar.vue: use b-contextmenu .activate and .isactive
      UI: b/piano-roll.vue: use b-contextmenu .activate and .isactive
      UI: b/deviceeditor.vue: use b-contextmenu .activate and .isactive
      UI: b/treeselector-item.vue: use frame stamp to ignore duplicate clicks
      UI: b/menubar.vue: use frame stamp to ignore duplicate clicks
      UI: b/contextmenu.js: make FF auto-focus an element on showModal(), like Chrome
      UI: b/contextmenu.js: use frame stamp to ignore duplicate clicks and popup()s
    	Note that keyboard presses, mouse clicks, drag selections and event bubbling can
    	all cause menu item clicks and contextmenu activation.
    	In order to deduplicate multiple events that arise from the same user interaction,
    	*one* popup request and *one* click activation is processed per animation frame.
      UI: util.js: add frame_stamp(), retrieve a timestamp unique per animation frame
      UI: kbd.js: move_focus(): fallback to move focus inside body
      UI: kbd.js: list_focusables(): take [open]:modal in shadow DOMs into account
      UI: kbd.js: list_focusables(): take [open]:modal dialogs into account
      UI: b/treeselector-item.vue: fix single-click menu activation and styling
      UI: b/trackview.vue: fix menu activation
      UI: b/piano-roll.vue: fix menu activation, allow click-drag menu selection
      UI: b/devicepanel.vue: fix menu activation
      UI: b/menubar.vue: allow click-drag menu selection
      UI: b/menuitem.js: use .activate and .isactive callbacks for item activation
      UI: b/contextmenu.js: use .activate and .isactive callbacks for menu activation
      ASE: project.cc: fix some missing notify::dirty emissions
      UI: b/menubar.vue: adapt context menu clicks, popup menus early (mousedown)
      UI: b/menuitem.js: adjust for b-contextmenu as LitElement
      UI: kbd.js: fix keydown_move_focus() for shadow DOMs
      UI: util.js: add prevent_event()
      UI: b/contextmenu.js: port b-contextmenu to LitElement
      UI: b/menuitem.js: use 'b-menurow' CSS selector
      UI: b/menurow.js: port b-menurow to LitElement
      UI: b/menuitem.js: pass b-menurow turn / noturn attributes to button
      UI: util.js: add closest() for shadow DOMs
      UI: b/trackview.vue: always use the b-icon ic="" attribute
      UI: b/menuitem.js: export KeymapEntry as this.keymap_entry
      UI: b/contextmenu.vue: collect and register KeymapEntry props from descendants
      UI: kbd.js: support add+remove of global keymaps
      UI: b/menuitem.js: port b-menuitem to LitElement
      UI: util.js: add lrstrip() and collect_text_content()
      UI: kbd.js: make activeElement and list_focusables shadow DOM aware
    	This allows transparent handling of custom focus navigation and hotkey
    	activation in shadow DOMs.
      UI: util.js: extend has_ancestor() to support open shadow DOMs
      UI: b/contextmenu.vue: support click, keymap, b-contextmenu-menudata on Element
      UI: b/icon.js: port b-icon from vue to LitElement
      UI: util.js: add adopt_style() and add_style_sheet()
      UI: b/*.vue: always use the b-icon ic="" attribute
      GITHUB: workflows/testing.yml: update github actions

Merge branch 'pdf-artifacts'    # 2022-10-25 Tim Janik e0272bd
    * pdf-artifacts:
      GITHUB: workflows/testing.yml: build PDF and upload 'docs' build artifact
      MISC: mkassets.sh: use 'pdf' shorthand in build rule
      DOC: Makefile.mk: require explicit 'pdf' rule to build PDF manuals via TeX
    	By default, only the HTML manuals are built and installed (without TeX
    	dependency). The PDF variants can be built explicitely with `make pdf`.
    	The PDF manuals are installed if they are present at install time.
      GITHUB: workflows/testing.yml: enable CI for 'next' and PRs

Merge branch 'update-sanitizers'    # 2022-10-26 Tim Janik a252fc9
    * update-sanitizers:
      JSONIPC: jsonipc.hh: fix atexit memory leak
      ASE: formatter.hh: properly handle nullptr_t for %p
      ASE: nativedevice.cc: fix signedness
      ASE: serialize.cc: fix unit test memory leak
      UI: Makefile.mk: ignore asan when running AnklangSynthEngine
      DOC: Makefile.mk: ignore asan when running AnklangSynthEngine
      MISC: config-uname.mk: update sanitizer linkage
      GITHUB: workflows/testing.yml: upgrade actions/checkout and actions/cache to v3
      MISC: Dockerfile.focal: comment fixups
      GITHUB: workflows/testing.yml: allow TeX installation during CI builds

Merge branch 'mwc256-prng'    # 2022-10-26 Tim Janik 153071d
    * mwc256-prng:
      ASE: randomhash.cc: add FastRng jump ahead tests
      ASE: main.cc: add --rand64 to generate 64bit FastRng numbers on stdout
    	This can be used to test the PRNG quality with for example PractRand:
    	  AnklangSynthEngine --rand64 | RNG_test stdin64 -multithreaded
      ASE: randomhash: add FastRng, a multiply-with-carry PRNG with period 2^255
      ASE: tests/benchmarks.cc: use 3k as max chunk size to avoid memset benchmarking
      ASE: sortnet.cc: speed up test by reducing the checked 10-element permutations

Merge branch 'loft'    # 2022-10-26 Tim Janik 84ff17e
    * loft:
      ASE: main.cc: configure Loft and concurrently preallocate pages on demand
      ASE: tests/benchmarks.cc: benchmark loft_calloc()
      ASE: loft: add Loft - a lock- and obstruction-free thread memory allocator
    	Squashed commits of Loft development:
    	  ASE: loft: implement mmap() based bump allocator
    	  ASE: loft: implement MpmcStack based bucket allocator
    	  ASE: loft: add loft_alloc()
    	  ASE: loft: add loft_make_unique() and LoftFree::operator()()
    	  ASE: loft: add loft_calloc()
    	  ASE: loft: add multithreaded allocator stress test
    	  ASE: loft: use FastRng for testing
    	  ASE: loft: add loft_bucket_size()
    	  ASE: loft: add loft_get_stats(), loft_stats_string()
    	  ASE: loft: add loft_get_config(), loft_set_config(), config flags
    	  ASE: loft: add loft_grow_preallocate(), loft_set_notifier()
    	  ASE: loft: issue a warning if allocations via syscall happen inline
      ASE: atomics.hh: add MpmcStack.peek
      ASE: atomics.cc: fix signedness
      ASE: atomics.cc: add test for MpmcStack<>
      ASE: atomics.hh: add MpmcStack<>, a lock-free stack for non-reclaimable memory

Merge branch 'opus-wav-flac' - capture engine output    # 2022-10-28 Tim Janik bb7a442
    * opus-wav-flac:
      UI: b/aboutdialog.vue: display FLAC version
      ASE: api: export get_flac_version()
      UI: b/aboutdialog.vue: show Opus version
    	Remove unused Vorbis version.
      ASE: api.hh: export Opus version
    	Remove unused Vorbis and MP3 version export.
      MISC: Dockerfile.focal: provide libopus
      MISC: config-checks.mk: provide ogg-1.3.4 and opus-1.3.1
    	Remvoe Vorbis requirement, which is unused.
      ASE: main.cc: exit with atquit_run() upon SIGINT
      ASE: loop: USignalSource::install_sigaction(): install unix signal handler
      ASE: utils: provide atquit handlers
      ASE: loop.hh: minimize latency of signal handlers by running at high priority
      ASE: main: add -o wavfile to the CLI
      ASE: engine: support engine output capturing into wave files
    	Squashed commits of engine capturing development:
    	  ASE: engine: add queue_capture_start() and queue_capture_stop()
    	  ASE: engine.cc: stall engine once program is aborted (atquit_triggered)
    	  ASE: engine.cc: capture output via wave_writer_create_opus()
    	  ASE: engine.cc: capture output via wave_writer_create_wav()
    	  ASE: engine.cc: capture output via wave_writer_create_flac()
      ASE: wave: add wave file writer for WAV, OPUS, FLAC
    	Squashed commits of wave file development:
    	  ASE: wave.hh: add WaveWriter interface
    	  ASE: wave: add writer for WAV files with support for PCM and FLOAT
    	  ASE: wave: implement Opus writer and export Opus version
    	  ASE: wave.cc: write extension header for FLOAT format
    	    For example SoX(1) complains about float WAV files 'missing extended part of fmt chunk'
    	  ASE: wave: add FLAC writer and export FLAC version
    	  ASE: wave: install atquit handlers to flush/finalize wave files
      ASE: main: load projects without '--preload' and support --play-autostart
      ASE: main.cc: auto-load projects passed on the CLI

Merge branch 'time-autostop'    # 2022-11-03 Tim Janik 6d531e6
    * time-autostop:
      GITHUB: workflows/testing.yml: add repository and gh-user to IRC notifications
      GITHUB: workflows/ircbot.py: support -R for initiating repository name
      GITHUB: workflows/testing.yml: skip IRC bot name
      GITHUB: workflows/ircbot.py: set "YYBOT" as bot name
      ASE: main: add autostop handling and implement -t <time> to trigger autostop
      ASE: project: start_playback(): pass autostop into engine
      ASE: engine: add autostop handling and delay capture until transport is running
      ASE: defs.hh: add D64MAX
      ASE: strings.cc: add string_to_seconds()
      ASE: formatter.cc: test atomic<bool> which is a struct and needs %s
      UI: b/treeselector-item.vue: use ContextMenu.valid_uri() to check valid uri
      UI: b/contextmenu.js: always use valid_uri() for uri in boolean contexts

Merge branch 'swesterfeld-vcf-cutoff-fix'    # 2022-11-03 Tim Janik 203c246
    * swesterfeld-vcf-cutoff-fix:
      DEVICES: blepsynth: fix cutoff frequency modulation for filter
    	Fix frequency scaling problems: the freq_in array now passes its frequency to
    	the filter as plain Hz.

Merge branch 'zoom-ui'    # 2022-11-16 Tim Janik 8e65adf
    * zoom-ui:
      UI: b/menubar.vue: support Zoom In/Out/Reset for Electron
      ELECTRON: main.js: export zoom_level() to allow UI zoom adjustments
      UI: kbd.js: match_key_event: split 'Ctrl++' only once
      DOC: ch-development.md, ch-intro.md: fix testbit.eu URL
      ASE: randomhash: fix testbit.eu URL
      ASE: track.cc: fix MASTER_TRACK flag

Merge branch 'sprite-knob'    # 2022-11-16 Tim Janik 439c3b8
    * sprite-knob:
      MISC: Dockerfile.focal: install librsvg2-bin for rsvg-convert
      UI: remove unused eknob.svg embedding
      UI: b/knob.vue: remove Vue based knob implementation
      UI: b/pro-input.vue: remove unused knob handling
      UI: b/pro-group.vue: use b-knob for scalar Property editing
      UI: b/knob.js: rewrite b-knob as LitElement with sprites
      UI: b/deviceeditor.vue: use Util.extend_property() to cache Property fields
      UI: Makefile.mk: provide control knob sprite assets
      Makefile.mk: include images/knobs/Makefile.mk
      IMAGES: knobs/cknob.svg: add MPL-2.0 license
      IMAGES: knobs/Makefile.mk: build bi- and unidirectional control knob sprites
      IMAGES: knobs/mksprite.py: rotate svg knob and add level indicator
      IMAGES: knobs/cknob.svg: add rotatable control knob
      UI: util.js: wheel_delta: adjust factors for modern Firefox and Chrome versions
      UI: startup.js: set CONFIG.dpr_movement for Chrome<=100 and Gecko
    	As of Firefox-106, dpr_movement is needed and for Chrome-107 it is not.
      UI: util.js: use internal Symbol for request_pointer_lock() state handling
      UI: util.js: fix value updates of extended properties
    	Catch the right event and normalize the value in JS.
      UI: util.js: add methods to handle destroy callbacks on objects
      UI: b/shell.vue: comment fixup
      UI: b/databubble.vue: hook into App.zmove for all event handling
    	Also, fix stuck bubbles when rehovering the same element.
      UI: b/app.js: generate zmove events for pointerdown, pointermove, pointerup
      UI: b/app.js: make sure "mousemove" triggers ZMove updates
      ASE: processor.cc: keep constant number of characters for % values
      ASE: processor: send property notifies early, account for inflight values
      ASE: api.hh: add missing const
      ASE: crawler: use emit_notify() and avoid emit during ctor
      ASE: *.cc: use emit_notify() where possible

Merge branch 'swesterfeld-blepsynth-adsr-time-fix'    # 2022-11-17 Tim Janik 54726cd
    * swesterfeld-blepsynth-adsr-time-fix:
      DEVICES: blepsynth: use non-linear mapping for ADSR times
      ASE: sortnet.hh: update URLs in comments

Merge branch 'cursors'    # 2022-12-22 Tim Janik 32b1518
    * cursors:
      IMAGES: anklangicons.sh: fixes for svgo 2.8.0 and Inkscape >= 1.0
      IMAGES: anklangicons.sh: remove unused cursor commands
      RAND: hotspots.sh: add simple script to debug hotspot coords in cursors
      UI: b/piano-roll.vue: remove AnklangCursors.scss references
      UI: Makefile.mk: remove AnklangCursors.scss copy
      UI: Makefile.mk: copy cursors/cursors.css and all cursor SVGs
      UI: little.js: allow runtime postcss imports from cursors/cursors.css
      UI: cursors/cursors.css: add CSS vars for: cross eraser hresize knife move pen
      UI: cursors/knife.svg: add 28x28 pixel "knife" cursor
      UI: cursors/hresize.svg: add 28x28 pixel "horizontal resize" cursor
      UI: cursors/cross.svg: add 28x28 pixel "cross" cursor
      UI: cursors/move.svg: add 28x28 pixel "move" cursor
      UI: cursors/eraser.svg: make cursor 28x28 pixels
      UI: cursors/pen.svg: make cursor 28x28 pixels
      UI: cursors/: move eraser.svg and pen.svg here

Merge branch 'piano-roll-and-shell-grid-layout'    # 2022-12-22 Tim Janik 5772625
    * piano-roll-and-shell-grid-layout:
      UI: b/pianoroll.js: document piano-roll use and fix hover handling
      UI: b/piano-ctrl.js: add convenient tool registration helpers
      UI: eslintrc.js: allow empty blocks
      UI: util.js: allow PointerDrag cleanup handler
      UI: b/pianoroll.js: fix scroll and select notes_canvas tool on hover
      UI: b/piano-ctrl.js: implement note resize tool
      UI: b/piano-ctrl.js: implement select, paint, erase as dedicated tools
      UI: b/pianoroll.js: context menu cleanup
      UI: b/clipview.vue: let the canvas fill parentElement
      UI: styles.scss, startup.js: turn HFlex & VFlex into LitElement
      UI: b/pianoroll.js: use one source for DPR calculations
      UI: b/pianoroll.js: properly align toolmenu button
      UI: b/pianoroll.js: fix background color
      UI: b/pianoroll.js: add pianorollmenu items
      UI: b/treeselector-item.vue: fix 'event' reference
      UI: b/knob.js: fix 'event' reference
      UI: b/editable.vue: fix 'event' reference
      UI: eslintrc.js: warn if a global 'event' is referenced
      UI: b/piano-ctrl.js: fix merging of selection changes with note modifications
      UI: b/pianoroll.js: handle menu hotkeys
      UI: b/contextmenu.js: fix unmapping in map_kbd_hotkeys()
      UI: kbd.js: handle document.activeElement == null
      UI: b/piano-ctrl.js: stop event if a key was handled
      UI: b/pianoroll.js: grab focus
      UI: b/piano-ctrl.js: adjust piano_roll access patterns
      UI: b/pianoroll.js: provide .srect property, repaint upon changes
      UI: b/pianoroll.js: handle tool menu and hook up piano-ctrl
      UI: theme.scss: move scrollbar styling here to work inside shadow DOMs
      UI: startup.js: turn CGrid into a LitElement to work inside shadow DOMs
      UI: b/pianoroll.js: work around FireFox exception when ctx.font is assigned
      UI: b/shell.vue: allow notification callbacks on get_note_cache()
      UI: b/statusbar.vue: use elementsFromPoint() to find Tips inside shadowRoots
      UI: b/contextmenu.js: support @activate="handler" notifications
      UI: b/menubar.vue: move comment to work around Vue's template child handling
      UI: b/knob.js: ignore hscrolls to allow horizontal device panel scrolling
      UI: b/devicepanel.vue: adjust to b-shell grid layout
      UI: b/pianoroll.js: fix scrollbar style
      UI: b/pianoroll.js: add indicator to show the current tick
      UI: b/shell.vue: use <grid/> for the basic layout
      UI: b/pianoroll.js: implement <b-piano-roll/> as LitElement
      UI: b/pianoroll.js: add skeleton
      UI: b/piano-roll.vue: remove Vue based piano-roll

Merge branch 'documentation-sections'    # 2022-12-22 Tim Janik 11d3cc2
    * documentation-sections:
      DOC: Makefile.mk: link to and search for ui/cursors/
      UI: b/pianoroll.js: add data-f1="#piano-roll" to link F1 to piano roll manual
      UI: b/shell.vue: popup manual on 'F1', support anchors via data-f1="#anchor"
      UI: kbd.js: allow event.keyCode filtering
      DOC: Makefile.mk: include docs from pianoroll and piano-ctrl
      DOC: ch-editing.md: add brief editing introduction
      UI: Makefile.mk: extract Markdown sections from JS files into doc/b/*.md
      UI: xbcomments.js: extract Markdown sections from JavaScript comment blocks

Merge branch 'build-fixes'    # 2022-12-28 Tim Janik 215830f
    * build-fixes:
      UI: Makefile.mk: add missing dependency from ui/colors.js on ui/zcam-js.mjs
    	This fixes postcss errors due to missing zcam-js.mjs.
      X11TEST: play-notes.json: adjust simlpe UI test to UI path changes
      UI: cursors/cursors.css: add MPL-2 copyright

Merge branch 'fix-embed-fd-hangs'    # 2022-12-28 Tim Janik ea7b53b
    * fix-embed-fd-hangs:
      ASE: clapplugin.cc: map PollFD::NVAL to CLAP_POSIX_FD_ERROR
      ASE: loop.*: support POLLWRBAND, always pass on POLLNVAL, POLLERR and POLLHUP

Merge branch 'lit-clipview'    # 2023-01-07 Tim Janik ee3d1f0
    * lit-clipview:
      ASE: api.hh: add Clip.all_notes read-only property
    	Enable property caching UI code for fetching notes and updates.
      UI: b/pianoroll.js: use Util.wrap_ase_object() to fetch Clip notes
      UI: b/piano-ctrl.js: use Util.wrap_ase_object() to fetch Clip notes
      UI: b/clipview.js: use wrap_ase_object() to access Clip properties
      UI: util.js: export the wrapper.js API
      UI: wrapper.js: add AseObject wrapper to cache properties
      UI: startup.js: add class name to GC debug messages
      UI: b/shell.vue: provide Shell.piano_roll
      UI: Makefile.mk: use Vue production build unless MODE=debug
    	This avoids massive memory leaks of Vue components.
      UI: Makefile.mk: fix missing dependency
      MISC: package.json.in: upgrade to vue-3.2.45 and lit-2.5.0
      UI: Makefile.mk: use 'npm --prefer-offline' only when rebuilding
      MISC: config-checks.mk: do not force '--prefer-offline' on npm
      MISC: config-uname.mk: define __UIDEBUG__=1 for MODE=debug
      UI: b/pianoroll.js: remove old debug()
      UI: b/contextmenu.js: remove useless performance hog
      UI: b/tracklist.vue: add new track on dblclick on track list only
      UI: b/pianoroll.js: fix stale play cursor on clip change
      UI: b/clipview.js: port BClipView to LitElement
      UI: b/: use Track.list_launcher_clips()
      ASE: api.hh. track: rename Track.list_launcher_clips()

Merge branch 'lit-cliplist'    # 2023-01-07 Tim Janik 2724283
    * lit-cliplist:
      UI: b/partlist.vue: disable old code
      DOC: Makefile.mk: add docs from b/cliplist.md
      ASE: api.hh: rename Track.launcher_clips() and ass 'notify:launcher_clips'
      UI: b/statusbar.vue: use Util.find_element_from_point()
      UI: b/shell.vue: determine F1 anchor from find_element_from_point()
      UI: util.js: add find_element_from_point(), supporting shadow DOMs
      UI: b/clipview.js: fix properties
      UI: b/cliplist.js: support F1 help for ClipList
      UI: b/cliplist.js: port to LitElement
      UI: b/app.js: add App.zmove_last()
      UI: b/pianoroll.js: minor rename

Merge branch 'lit-editable'    # 2023-01-08 Tim Janik b1b949d
    * lit-editable:
      UI: b/trackview.vue: adjust b-editable use
      UI: b/positionview.vue: adjust property editing
      ASE: project.cc: add missing notifications
      UI: b/editable.js: port <b-editable/> to LitElement

Merge branch 'lit-trackview'    # 2023-01-08 Tim Janik 529af30
    * lit-trackview:
      UI: b/trackview.js: render sound level meter from telemetry
      UI: b/cliplist.js: minor formatting
      ASE: track.cc: add dbspl0 and dbspl1 to telemetry
      ASE: combo: add sound level probing in dB to AudioChain
      ASE: datautils: add square_max()
      ASE: midilib.cc: reserve space to avoid malloc
      ASE: datautils: add square_sum() for FPU floats
      ASE: cxxaux.hh: add ASE_ALIGNED16() and ALIGNMENT16()
      UI: b/app.js: maintain App.current_track, notify <b-trackview/> accordingly
      ASE: track: support midi_channel changes
      UI: b/*.js: fix ${ref} syntax
      UI: b/trackview.js: port <b-trackview/> to LitElement

Merge branch 'lit-tracklist'    # 2023-01-10 Tim Janik 3e64716
    * lit-tracklist:
      UI: b/tracklist.js: hide HEADER and FOOTER
      UI: b/tracklist.js: add scrollshadow at the top
      UI: theme.scss: remove fragile parts of scrollbar styling
      UI: b/tracklist.js: fix layout for few tracks
      UI: b/tracklist.js: support x/y scrolling
      UI: b/cliplist.js: clipview children must not shrink
      UI: b/tracklist.js: port <b-tracklist/> to LitElement
      UI: b/trackview.js: increase width of level meters
      UI: b/clipview.js: use track.$id for colorization
      UI: b/cliplist.js: fix setting of b-clipview.track property
      UI: b/app.js: provide App.project
      ASE: object.cc: skip notifications for objects without shared_ptr
      ASE: api.hh: rename and notify Project.all_tracks() (former list_tracks)

Merge branch 'api-docs'    # 2023-03-03 Tim Janik 63bd26e
    * api-docs:
      GITHUB: workflows/testing.yml: rename CI jobs
      GITHUB: workflows/testing.yml: add step to build and upload API docs
      MISC: Dockerfile.arch: provide doxygen openssh and poxy via pip
      MISC: Dockerfile.arch: first update archlinux-keyring
    	This works around an outdated keyring in the archlinux:latest docker image.
      MISC: dbuild.sh: add support for the docker -p <PORTS> option
      DOC: poxy.sh: setup AUTHOR/COMITTER EMAIL/NAME, GIT_SSH_COMMAND for uploads
      DOC: poxy.sh: provide NODE_PATH
      DOC: poxy.sh: add program doc/ dir to documentation output
      DOC: poxy.sh: add README as main index page
      DOC: poxy.sh: add project version to docs
      DOC: poxy.sh: upload to the `publish` branch
      DOC: poxy.sh: support conditional builds
      DOC: poxy.sh: move build commands into poxy_build function
      DOC: poxy.sh: add -u for upload
      DOC: poxy.sh: support accesskey="f" for Search
      DOC: poxy.sh: support -s to serve html/ contents
      DOC: poxy.sh: add NEWS.md
      DOC: poxy.sh: add ch-scripting.md to UI docs
      DOC: poxy.sh: generate API reference documentation with Poxy
      UI: Makefile.mk: remove rules to build JS docs
      DOC: Makefile.mk: build scripting docs from ui/host.js and ch-scripting.md
      DOC: copyright.ini: fix doc/jsdocrc.json path
      DOC: ch-scripting.md: move here from ui/
      DOC: jsdoc2md.js: generate markdown from *.js via jsdoc-api
      DOC: jsdocrc.json: configure JsDoc to use doc/jsdoc-slashes.js
      DOC: jsdoc-slashes.js: move here from ui/slashcomment.js
      DOC: jsdoc2md.js: guard aganst doclets with non-string name
    	I.e. doclet.meta.code.name can be an Integer.
      MISC: package.json.in: add jsdoc-api
      UI: b/shell.vue: add basic docs
      ASE: testing.hh: document Test namespace
      ASE: api.hh: add docu comment to Ase namespace
      README.md: fix github workflow badge URL

Merge branch 'jsdoc-search'    # 2023-03-05 Tim Janik dc2f640
    * jsdoc-search:
      DOC: poxy.sh: ignore case during search
      UI: util.js: add PointerDrag comment
      DOC: poxy.sh: extend searchdata-v2.js with token list from JS docs
      DOC: poxy.sh: avoid fake 'Export' prefix for JS symbols
      DOC: jsdoc2md.js: use <a/> for anchors, add data-4search to anchors
    	The old empty span anchors could be removed by some HTML processors.
      DOC: poxy.sh: jsdoc2md will now directly generate markdown from JS

Merge branch 'reactive-render'    # 2023-03-08 Tim Janik 6f6d3be
    * reactive-render:
      UI: startup.js: rerender all LitElements and known Vue components on resize
      UI: little.js: export LitComponent, which has reactive render() and updated()
      UI: little.js: add lit_update_all()
      UI: wrapper.js: improve error message for missing getters
      UI: wrapper.js: support reactive_wrapper() callbacks for wrap_ase_object() fields
      UI: wrapper.js: implement define_reactive() and reactive_wrapper()

Merge branch 'build-time-postcss'    # 2023-03-15 Tim Janik 54353a7
    * build-time-postcss:
      UI: split styles into dark, grid, domstyles, mixins, shadow, globals SCSS files
    	globals.scss: styles for the LightDOM only
    	shadow.scss: styles only for ShadowDOM components
    	domstyles.scss: common styles for the LightDOM and ShadowDOM
    	grid.scss: provide <grid/> helpers
    	mixins.scss: base to customize components
    	dark.scss: basic theme, allow switching via import $themename_scss;
    	cursors/cursors.css: provide CSS variables for custom cursors
      UI: cursors/cursors.css: fix quotes
      UI: cursors/cursors.css: introduce --svg-cursor-* variables at :root{} scope
    	This is needed to make cursors.css actualy valid CSS.
      UI: index.html: remove postfix and css validator, load vue-styles.css, fix preloads
      UI: b/clipview.js: use zcam directly
      UI: b/*.js: embed and load CSS via JsExtract
      UI: b/positionview.vue: use $b-lcdscreen-fg, $b-lcdscreen-bg
      UI: b/: fix $b-button-radius $b-button-radius $b-track-meter-gap $b-track-meter-thickness
      UI: b/pianoroll.js: import grid.scss
      UI: b/positionview.vue: use t-lcdscreen-fg, t-lcdscreen-bg
      UI: b/trackview.js: add --track-meter-thickness, --track-meter-gap
      UI: b/*.vue: use --button-radius
      UI: b/*.js: use --button-radius
      UI: b/*.js: use var(--button-radius);
      UI: b/*.vue: use var(--button-radius);
      UI: b/deviceeditor.vue, b/pro-group.vue: use --device-radius
      UI: b/shell.vue: remove unused styles
      UI: b/pianoroll.js: remove useless color assignment
      UI: b/textinput.js: include mixins.scss to use SCSS variable
      UI: b/menuseparator.js: include mixins.scss to use SCSS variable
      UI: b/*.js: extend componenets from LitComponent instead of LitElement
      UI: b/dialog.vue: inline box-shadow styling
      UI: b/pianoroll.js: import grid helpers from grid.css
      UI: b/menubar.vue: specify 'justify-content: space-between' directly
      UI: b/pianoroll.js: rely on global cursors.css import
      UI: startup.js: remove unused postcss import
      UI: jsextract.js: document jsextract.js usage
      UI: jsextract.js: extract JsExtract.scss`` marker snippets into *.jscss files
      UI: little.js: document JsExtract usage
      UI: little.js: fix .css URL construction to always have an extension
      UI: little.js: load <link rel=stylesheet href=shadow.css> into shadow roots
      UI: little.js: add ./shadow.css to LitComponent
      UI: little.js: remove postcss
      UI: little.js: export JsExtract with scss`` and fetch_css()
      UI: little.js: add default define $themename_scss:dark.scss;
    	Also, disable csstree-validator which yields outdated warnings.
      UI: little.js: load shadow.scss into all LitComponent elements
      UI: little.js: LitComponent: always adopt shadow.css in createRenderRoot()
      UI: little.js: CSS import: remove premature fetch + caching, always import all
      UI: little.js: remove cursors/cursors.css from memorized imports
      MISC: package.json.in: add stylelint
      MISC: package.json.in: remove perfectionist-dfd
      UI: sfc-compile.js: extract *.vuecss files
      UI: Makefile.mk: remove csstree-validator and postcss browserify bundling
      UI: Makefile.mk: run stylelint from output dir
      UI: stylelintrc.cjs: add stylelint config
      UI: Makefile.mk: extract, process and run stylelint on *.jscss files
      UI: Makefile.mk: process *.vuecss files
      UI: Makefile.mk: run stylelint on processed styles
      UI: Makefile.mk: generate vue-styles.css
      UI: Makefile.mk: remove Vue css rules
      UI: Makefile.mk: take quoted cursor urls into account
      UI: Makefile.mk: move theming into ui/dark.scss, build .css from .scss
      UI: Makefile.mk: use postcss.js with --map and -i
      UI: Makefile.mk: fix install pattern for ui/b/
      UI: postcss.js: support stdout output
      UI: postcss.js: fix exit code by re-throwing errors
      UI: postcss.js: add -Dvar=value for predefined variables
      UI: postcss.js: add -C <working-dir> to find imports
      UI: postcss.js: directly print PostCSS exceptions to provide useful stacktraces
      UI: postcss.js: support fetching imports from network
      UI: postcss.js: remove perfectionist-dfd, auto-import *.scss unless -i is given
      UI: postcss.js: add zlerp() CSS function
      UI: postcss.js: add zmod4() CSS function
      UI: postcss.js: make source map configurable
      UI: colors.js: add zlerp() for color interpolation
      UI: colors.js: fix missing ZCAM attributes
      UI: colors.js: add zmod4() to debug ZCAM attributes for colors
      UI: colors.js: support missing first zmod() color argument
      DOC: jsdoc2md.js: fix @file docu being ignored in some cases
      DOC: jsdoc2md.js: add anchor to constants
      ASE: websocket.cc: allow caching of duplicate requests within 1 second

Merge branch 'transportinfo', closes #5    # 2023-05-12 Tim Janik 3819f90
    * transportinfo:
      ASE: clapplugin: provide transport information for the plugin
      MISC: config-uname.mk: link -shared: allow undefined symbols with sanitizers

Merge branch 'libstdc++-13'    # 2023-05-17 Tim Janik c0f01a0
    * libstdc++-13:
      ASE: cxxaux.hh: patch up make_shared() to make libstdc++13 happy
    	* Move shared ptr allocator out of function scope (to allow template specialization)
    	* Add rebind<> template to shared ptr allocator which derives from std::allocator
    	* Specialize rebind<> so it yields the same allocator for only the shared ptr
    	  value type
    	* This "fixes" two static assertions that were added in libstdc++13, see:
    	  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=72792#c12
      ASE: cxxaux.hh: remove unused FriendAllocator<>
      ASE: cxxaux.hh: fix missing <string> include
      ASE: loop.hh: always use ASE_DEFINE_MAKE_SHARED() to implement make_shared()
      ASE: formatter.hh: include cstdint for int32_t
      ASE: clapplugin.cc: add missing braces for clap_event_transport_t initializer
      UI: wrapper.js: add missing Util import
      Makefile.mk: add simple rule to generate +compile_commands.json

Merge branch 'g++-fixes'    # 2023-05-17 Tim Janik 8404380
    * g++-fixes:
      ASE: cxxaux.hh: fix internal member typedef name
      ASE: cxxaux.hh: use std::conditional_t<> for rebind::other, fix for g++-12
    	With template specializations, g++-11 and g++-12 error out with "explicit
    	specialization in non-namespace scope", so we use std::conditional_t<> which
    	seems to work with g++-12 and clnag++-15.

Merge branch 'ci-build-updates'    # 2023-05-19 Tim Janik 580cf66
    * ci-build-updates:
      MISC: Makefile.mk: use gh, keed *-dev version number for Nightly releases
    	* Use gh instead of hub to create releases
    	* Keep the development version number for Nightly releases
    	* Add a brief disclaimer about Nightly releases
      MISC: version.sh: simplify, support --commit-date and $RELEASE_VERSION
      GITHUB: workflows/testing.yml: add named step "Fetch last release tag"
      GITHUB: workflows/testing.yml: fetch git history since last release tag
      GITHUB: workflows/testing.yml: update ping deps
      GITHUB: workflows/testing.yml: fix workflow names
      GITHUB: workflows/testing.yml: run (full) docu upload on Ubuntu
      GITHUB: workflows/testing.yml: run X11 tests on Arch
      DOC: poxy.sh: include all Anklang docs in upload
      MISC: Dockerfile.focal: install pip, doxygen and poxy
      MISC: Dockerfile.focal: install twm for x11test
      MISC: Dockerfile.arch: install libgtk3 and libnss for Electron
      MISC: Dockerfile.arch: install xvfb ffmpeg twm for x11test-v
      X11TEST: x11rec.sh: switch to using twm with auto placement
      GITHUB: workflows/testing.yml: use full doc/ install dir as doc artifact
      GITHUB: workflows/testing.yml: test clang builds under Ubuntu
      GITHUB: workflows/testing.yml: remove unused env var from Arch build rule

Merge branch 'nightly-version'    # 2023-05-20 Tim Janik 8459bbb
    * nightly-version:
      MISC: Makefile.mk: update Nightly releases to avoid excessive emails
      MISC: gh_delete_assets.sh: add script to delete all release assets via gh
      README.md: update documentation links
      MISC: version.sh: use 0.1.2.dev3 for development versions for proper ordering
    	Using .dev[0-9] postfixes properly sorts: 0.1.2 < 0.1.2.dev3 < 0.1.3
    	This works for sort -V, dpkg, rpm and PIP versions.
    	See: https://peps.python.org/pep-0440/#public-version-identifiers
      MISC: Makefile.mk: fix typo

Merge branch 'typescript-jsdoc-checks'    # 2023-06-05 Tim Janik 819895c
    * typescript-jsdoc-checks:
      UI: types.d.ts: allow App, Data, Shell Ase globals
      UI: index.html: add importmap to allow lit module imports
      UI: tsconfig.json: configure typescript checks, allow JS type checks + imports
      UI: wrapper.js: add @param type
      UI: little.js: add @ts-check, add types, add explicit exports for tsc
      UI: b/app.js: add @ts-check and missing property decl
      UI: b/cliplist.js: add @ts-check, missing imports, exports and initializations
      UI: b/clipview.js: export class
      UI: wrapper.js: add @ts-check and type annotations
      UI: b/statusbar.vue: use material icons for info and instrument panel
      UI: b/icon.js: fix material-icons size
      UI: Makefile.mk: add 'tscheck', 'stylelint' and 'lint' rules
    	* add 'lint' dependency to run all of stylelint eslint tscheck
    	* add 'tscheck' rule to selectively run typescript checks
    	* add explicit 'stylelint' rule
    	* simplify lit.js rollup
    	* ui/vue.js: leave eslint cache alone
    	* install material-icons from npm
    	* cleanup eslint rule
    	* ui/rebuild: avoid bg jobs, no need to print dir in sub MAKE
      MISC: package.json.in: cleanup serve and rebuild scripts
      MISC: package.json.in: remove eslint script, use make eslint instead
      MISC: package.json.in: install [email protected]
      Makefile.mk: whitespace fix
      GITHUB: workflows/testing.yml: use git fetch --unshallow
    	Apparently `git fetch --shallow-since` does not work with the merge commit
    	created by PR checkouts. Using `git fetch --unshallow` might be less efficient
    	for regular branches, but at least works with trunk and PRs.
      MISC: package.json.in: upgrade lit, electron, vue, postcss, etc
      UI: b/pianoroll.js: fix indicator interacting with the cursor
      MISC: package.json.in: install typescript to enable code checks

Merge branch 'jsdoc-tsimport'    # 2023-06-05 Tim Janik c184b5e
    * jsdoc-tsimport:
      UI: b/cliplist.js: jsdoc-tsimport-plugin does not support a blank after import
      DOC: jsdocrc.json: use jsdoc-tsimport-plugin to parse tsc file imports
    	* Fix JsDoc choking on typescript import statements that import typed from
    	  other JS files.
    	* See also: https://github.com/jsdoc/jsdoc/issues/1645#issuecomment-768293857
      MISC: package.json.in: install jsdoc-tsimport-plugin

Merge branch 'fix-imports'    # 2023-06-06 Tim Janik 1b47b9e
    * fix-imports:
      UI: util.js: add missing Kbd import
      UI: eslintrc.js: remove 'Util' global
      UI: b/*.vue: add missing Util imports
      UI: b/*.js: add missing Util imports

Merge branch 'appimage-dependencies'    # 2023-06-06 Tim Janik 1696a12
    * appimage-dependencies:
      MISC: mkAppImage.sh: reduce workarounds by using linuxdeploy --deploy-deps-only
      MISC: mkAppImage.sh: add ELF dependencies for AnklangSynthEngine and gtk2wrap
    	This adds libFLAC.so, libogg.so, libopus.so and
    	libgdk-x11-2.0.so, libgtk-x11-2.0.so to the AppImage.
    	Closes #13.

Merge branch 'appimage-rpath-fix'    # 2023-06-07 Tim Janik f609e1e
    * appimage-rpath-fix:
      MISC: mkAppImage.sh: avoid `linuxdeploy {-e|-l}` which change binary locations
    	Avoid `linuxdeploy {-e|-l}`, these options change the binary locations by copying.
    	The copies mess up ELF location detection and restoring the original locations
    	causes wrong relative $ORIGIN paths. We just use --deploy-deps-only now, which
    	keeps the binaries in place and correctly adjusts the relative $ORIGIN path.
      MISC: mkAppImage.sh: remove unused command

Merge branch 'swesterfeld-fix-pcg-ub'    # 2023-06-07 Tim Janik 1d49d48
    * swesterfeld-fix-pcg-ub:
      ASE: randomhash: fix undefined behaviour in Pcg32Rng
    	Left shifting a 32bit value by 32 bits is UB.
    * Closes #14

Merge branch 'sorted-vector'    # 2023-06-08 Tim Janik 7b3b380
    * sorted-vector:
      ASE: sortnet: implement SortedVector
      ASE: testing.hh: TFLOATS(): assert float equality within an apsilon
      ASE: combo.cc: add SPL link

Merge branch 'clang-tidy'    # 2023-06-18 Tim Janik 29cc5ff
    * clang-tidy:
      MISC: mkassets.sh: always use /tmp/anklang-mkassets/ for release builds
      GITHUB: workflows/testing.yml: fix key file permissions
      GITHUB: workflows/testing.yml: fixup permissions at CI end
      GITHUB: workflows/testing.yml: remove missing variable reference
      GITHUB: workflows/testing.yml: fix arch perms and focal redirection
      GITHUB: workflows/testing.yml: use $DOCKER_RUN and ghcr.io for all tasks
    	* use $DOCKER_RUN and ghcr.io caching for Focal-Docs
    	* adjusting git.safe.directory is not needed for Lunar
    	* use $DOCKER_RUN and ghcr.io caching for Arch-Replay
      MISC: Dockerfile.focal: remove unused RUNs, rename user to ubuntu
    	* remove unused OOTBUILD, rename builder user to ubuntu
    	* add a comment howto build and run this image
    	* use fixed user and group id of 1000
      MISC: Dockerfile.arch: use fixed user and group ids of 1000
      MISC: Dockerfile.arch: remove unused OOTBUILD and unused poxy
      MISC: Dockerfile.lunar: remove unused OOTBUILD
      GITHUB: workflows/testing.yml: directly use docker run for lunar and fix perms
      MISC: Dockerfile.lunar: upgrade to nodejs-20
      MISC: package.json.in: upgrade npm build tools and electron-25
      MISC: package.json.in: remove unused rollup-plugin-node-resolve
      MISC: Makefile.mk: fix missing directory dependency
      GITHUB: workflows/testing.yml: add Lunar-Clang-Tidy, rename Focal-Docs
      MISC: Dockerfile.lunar: provide build environment with clang-17 on ubuntu:23.04
      MISC: colorize.sh: colorize error, warning, note and special case Emacs
      MISC: Makefile.mk: reimplement clang-tidy and clang-tidy-clean rules
      Makefile.mk: defined CLANG_TIDY
      Makefile.mk: create ls-tree.d and provide $(LS_TREE_LST)

Merge branch 'component-styling'    # 2023-06-21 Tim Janik 234bf99
    * component-styling:
      UI: b/playcontrols.js: use JsExtract.css_url()
      UI: b/icon.js: use JsExtract.css_url()
      UI: b/textinput.js: make this a shadowless component
      UI: little.js: add JsExtract.css_url()
      UI: little.js: use cast to work around TS2425
      UI: b/playcontrols.js: port to LitComponent
      UI: Makefile.mk: remove temporary file
      UI: b/*.vue: remove useless mixins import
      UI: index.html: import globals.css
      UI: globals.scss: import elements.scss which includes mixins
      UI: Makefile.mk: create globals.css and auto-import mixins.scss for vue styles
      UI: elements.scss: rename from domstyles.scss
      UI: b/button-bar.vue: port to LitComponent
      UI: b/*.js: access only LitComponent fields (not LitElement)
      UI: little.js: remove LitElement export
      UI: startup.js: derive from LitComponent (not LitElement)
      UI: b/*.js: derive from LitComponent (not LitElement)
      UI: b/partlist.js: embed and load CSS via JsExtract
      UI: Makefile.mk: fix dependenc for scss rebuilds
      UI: b/partlist.js: import Util
      UI: types.d.ts: declare __DEV__ global
      UI: b/pianoroll.js: extend LitComponent and use reactive_wrapper to track notes
    	Also, merge multiple repaint requests into the same micro task.
      UI: b/clipview.js: leave width to parent
      UI: b/cliplist.js: set 'data-f1' only once suffices
      UI: b/trackview.js: render b-trackview context menu on demand
      UI: b/contextmenu.js: fix close() and synchronize updates
    	* await this.updateComplete before showModal()
    	* properly emit 'close', take nesting into account
      UI: b/partlist.js: port to LitElement
      UI: mixins.scss: add transparent-scrollbars mixin

Merge branch 'InterDisplay', based on InterVariable-4.0 font    # 2023-06-22 Tim Janik 89c9d01
    * InterDisplay:
      UI: dark.scss: add a fallback font stack
      UI: theme.scss: remove outdated font stuff
      UI: mixins.scss: move b-kbd-hotkey here
      UI: elements.scss: use b-font-weight-bold() and b-font-weight-bolder()
      UI: b/*.vue, b/*.js: use b-font-weight-bold() and its variants
      UI: dark.scss: define b-font-weight-{normal|bold|bolder} mixins
      UI: b/menutitle.js: use drop-caps while InterVariable-4.0 small-caps are broken
    	See also: https://github.com/rsms/inter/issues/556#issuecomment-1598010623
      UI: elements.scss: leave font handling to theme, globals and shadow
      UI: b/pianoroll.js: use b-canvas-font
      UI: b/partthumb.vue: use b-canvas-font
      UI: b/clipview.js: use b-canvas-font
      UI: shadow.scss: use b-ui-font() inside shadow DOMs
      UI: globals.scss: make use of b-ui-font()
      UI: dark.scss: configure b-ui-font() for "InterVariable" in InterDisplay style
      UI: globals.scss: leave font-face defs to index.html
      UI: index.html: cleanup preloads, add @font-face for "InterVariable"
      UI: b/icon.js: add small comment
      UI: Makefile.mk: download InterVariable.woff2
      UI: stylelintrc.cjs: disable "font-family-name-quotes" to allow quoted font names

Merge branch 'fix-lit-html'    # 2023-06-22 Tim Janik 31da2dd
    * fix-lit-html:
      UI: b/*.js: fix trailing-solidus in html`` markup
      UI: eslintrc.js: add plugin:lit/recommended to linting rules
      MISC: package.json.in: install eslint-plugin-lit

Merge branch 'inputs-as-litelement'    # 2023-06-27 Tim Janik 2ddfe22
    * inputs-as-litelement:
      X11TEST: play-notes.json: adjust recording for new web components
      ASE: server.cc: listen on "notify" emissions from properties
      ASE: properties.cc: fix notifications, emit notify:identifier
      UI: util.js: turn xprop.value_ into a reactive property
      UI: b/choiceinput.js: take b-objecteditor into account in CSS
      UI: b/pro-input.vue: use @valuechange on b-choiceinput
      UI: b/preferencesdialog.vue: use b-objecteditor
      UI: util.js: avoid extending the same property twice
      UI: util.js: export fullstop()
      UI: Makefile.mk: use tsc with --pretty false only inside emacs
      UI: b/objecteditor.js: port to LitComponent
    	* Turn into shadowless component
    	* Properly prefix CSS classes
    	* Listen on and handle @valuechange events
    	* Do not freeze extended properties that we keep mutating
    	* Remove old resize blocker logic
      UI: startup.js: load basic custom components early on
      UI: b/basics.js: move h-flex, v-flex, c-grid, push-button here, shadowless
    	Make these simple basic containers shadowless, i.e. without shadow root.
      UI: b/pro-input.vue: add support for b-choiceinput
      UI: little.js: export 'nothing' from Lit
      UI: types.d.ts: add debug() global
      UI: b/fed-object.vue: add support for b-choiceinput
      UI: b/choiceinput.js: port to LitComponent, render on demand only
      UI: b/tracklist.js: fix stacking of top border shadow
      UI: b/switchinput.js: allow LEFT/RIGHT/UP/DOWN to toggle
      UI: b/fed-object.vue: add support for b-switchinput
      UI: b/switchinput.js: port to LitComponent
      UI: types.d.ts: declare global CONFIG
      UI: b/fed-object.vue: add support for b-numberinput
      UI: b/numberinput.js: simplify and fix sizing
      UI: b/numberinput.js: port to LitComponent
      UI: b/textinput.js: dispatch value changes as valuechange "event"

Merge branch 'ts-check-lit-components', add ts-check and fix lint issues    # 2023-07-03 Tim Janik a7ea5f4
    * ts-check-lit-components:
      UI: b/app.js: reload UI on project changes
      UI: b/objecteditor.js: fix output
      UI: util.js: add missing type annotations
      UI: kbd.js: add missing type annotations
      UI: b/trackview.js: add @ts-check and missing type annotations
      UI: b/tracklist.js: add @ts-check and missing properties
      UI: b/playcontrols.js: add @ts-check
      UI: b/pianoroll.js: add @ts-check and missing type annotations
      UI: b/piano-ctrl.js: minor type fix
      UI: b/partlist.js: add @ts-check
      UI: b/more.js: add @ts-check
      UI: b/menutitle.js: add @ts-check
      UI: b/menuseparator.js: add @ts-check
      UI: b/menurow.js: add @ts-check
      UI: b/menuitem.js: add @ts-check
      UI: b/knob.js: add @ts-check and missing type annotations
      UI: b/editable.js: add @ts-check
      UI: b/contextmenu.js: add @ts-check and missing type annotations
      UI: b/clipview.js: add @ts-check and missing type
      UI: b/buttonbar.js: add @ts-check
      README.md: escape FIXME keywords
      UI: Makefile.mk: grep for reminders in ui/lint
      DEVICES: Makefile.mk: grep for reminders in devices/lint
      Makefile.mk: at the end of 'all', grep for reminder keywords in known sources
      Makefile.mk: ls-tree.d needs GITCOMMITDEPS, i.e. misc/config-utils.mk
      ASE: Makefile.mk: grep for reminders in ase/lint
      Makefile.mk: add 'lint' as toplevel phony rule
      UI: b/tracklist.js: cleanup CSS
      UI: b/textinput.js: cleanup CSS
      UI: b/switchinput.js: cleanup CSS
      UI: b/shell.vue: cleanup CSS
      UI: b/positionview.js: cleanup CSS
      UI: b/pianoroll.js: cleanup CSS
      UI: b/noteboard.vue: cleanup CSS
      UI: b/menutitle.js: cleanup CSS
      UI: b/menurow.js: cleanup CSS
      UI: b/menuitem.js: cleanup CSS
      UI: b/knob.js: cleanup CSS
      UI: b/icon.js: cleanup CSS
      UI: b/folderview.vue: cleanup CSS
      UI: b/filedialog.vue: cleanup CSS
      UI: b/editable.js: cleanup CSS
      UI: b/dialog.vue: cleanup CSS
      UI: b/databubble.vue: cleanup CSS
      UI: b/contextmenu.js: cleanup CSS
      UI: b/clipview.js: cleanup CSS
      UI: b/basics.js: inlcude v-flex mixin
      UI: theme.scss: fix color syntax
      UI: startup.js: fix import path
      UI: Makefile.mk: use stylelint with -f unix only inside emacs
      UI: Makefile.mk: add missing ui/spinner.scss dependency
      UI: stylelintrc.cjs: ignore whitespace rules
      UI: Makefile.mk: add Ase.server @type
      UI: mixins.scss: add v-flex mixin
      UI: mixins.scss: use $b-font-stack-kbd-mono
      UI: dark.scss: define $b-font-stack-kbd-mono for hotkey rendering
      UI: b/menubar.js: port to LitComponent
    	* Cleanup <b-positionview/> markup
    	* Cleanup CSS
      UI: b/positionview.js: port to LitComponent
      UI: b/basics.js: use h-flex()
      UI: mixins.scss: add h-flex() mixin
      MISC: Dockerfile.arch: install unzip

Merge branch 'poxystyle'    # 2023-07-24 Tim Janik 7134954
    * poxystyle:
      DOC: poxy.sh: allow doc/poxystyle.css to fixup colors
      DOC: poxystyle.css: fix light theme colors and sizes
      UI: b/cliplist.js: minor edit
      README.md: update roadmap with items from Stefan Westerfeld

Merge branch 'modern-normalize'    # 2023-07-24 Tim Janik aa3a6b6
    * modern-normalize:
      UI: little.js: load globals.css into every LitComponent
      UI: index.html: give globals.css precedence over vue-styles.css
      UI: index.html: remvoe shadow.css
      UI: Makefile.mk: remove ui/elements.scss ui/shadow.scss
      Makefile.mk: run 'lint' during `make check`
      UI: remove unused files elements.scss and shadow.scss
      UI: globals.scss: merge styles from elements.scss and shadow.scss
      UI: globals.scss: use normalize.css to normalize latest Chrome & Firefox
      UI: normalize.css: leave font-family setting to our own theme
      MISC: mkcopyright.py: fix MIT License pattern to deal with case and 'd'-ending
      UI: normalize.css: insert MIT License and add Copyright notices
      UI: normalize.css: add renamed modern-normalize.css version 2.0.0
    	Add modern-normalize.css from https://github.com/sindresorhus/modern-normalize
    	licensed MIT.

Merge branch 'dark-palette'    # 2023-07-24 Tim Janik 61e1ecd
    * dark-palette:
      UI: dark.scss, globals.scss: use palette for body colors
      UI: Makefile.mk: add palette.scss to scss files
      UI: palette.scss: add warm grey palette based on ZCAM Jz (lightness) steps

Merge branch 'aboutdialog-lit'    # 2023-07-27 Tim Janik 874535f
    * aboutdialog-lit:
      UI: index.html: add comments to start_view_transition()
      UI: globals.scss: add b-dialog styling
      UI: b/contextmenu.js: use transparent backdrop for menus
      UI: globals.scss: add view-transition-group defaults, add scale0 keyframes
      UI: dark.scss: add b-animation-duration and b-dialog-colors
      UI: tsconfig.json: avoid checks of postcss.js.tst.js
      UI: b/menubar.js: make use of Shell.show_about_dialog()
      UI: b/app.js: leave aboutdialog handling to Shell.show_about_dialog()
      UI: b/shell.vue: use b-aboutdialog.shown, add show_about_dialog(), handle close
    	* Use proper internal state for showing b-aboutdialog
    	* Expose showing/hiding through show_about_dialog()
    	* Allow animated closing of b-aboutdialog with start_view_transition
      UI: b/aboutdialog.js: display Lit version number
      UI: b/aboutdialog.js: port to LitComponent
      UI: eslintrc.js: declare start_view_transition as global symbol
      UI: index.html: define start_view_transition()
    	This is a Vue-aware wrapper around document.startViewTransition() (atm Chrome
    	specific), that still does the right thing on Firefox and has a disable flag.
      UI: Makefile.mk: index.html: add lit_version to config_json

Merge branch 'postcss-normalize-charset'    # 2023-07-27 Tim Janik 746575f
    * postcss-normalize-charset:
      UI: postcss.js: postprocess CSS with postcss-normalize-charset
      MISC: package.json.in: install postcss-normalize-charset
      UI: postcss.js: add support for -I to add include paths

Merge branch 'globalscss-4-litcomponents'    # 2023-07-27 Tim Janik 709f4e9
    * globalscss-4-litcomponents:
      UI: Makefile.mk: run stylelint on ui/globals.css
      UI: b/positionview.js: add CSS to globals.css, avoid shadowRoot
      UI: b/playcontrols.js: add CSS to globals.css, avoid shadowRoot
      UI: b/pianoroll.js: add CSS to globals.css, avoid shadowRoot
      UI: b/partlist.js: add CSS to globals.css, avoid shadowRoot
      UI: globals.scss: only style button and push-button for LightDOM
      UI: b/objecteditor.js: add CSS to globals.css, avoid shadowRoot
      UI: b/switchinput.js: add CSS to globals.css, avoid shadowRoot
      UI: b/numberinput.js: add CSS to globals.css, avoid shadowRoot
      UI: b/textinput.js: add CSS to globals.css, avoid shadowRoot
      UI: b/more.js: add CSS to globals.css, avoid shadowRoot
      UI: b/tracklist.js: add CSS to globals.css, avoid shadowRoot
      UI: b/trackview.js: add CSS to globals.css, avoid shadowRoot
      UI: b/menubar.js: fix b-menuseparator
      UI: b/trackview.js: fix b-menuseparator
      UI: b/menutitle.js: add CSS to globals.css
      UI: b/menuseparator.js: make b-menuseparator a simple HTMLHRElement
      UI: b/menurow.js: add CSS to globals.css, avoid shadowRoot
      UI: b/menuitem.js: add CSS to globals.css
      UI: b/menubar.js: add CSS to globals.css, avoid shadowRoot
      UI: b/knob.js: add CSS to globals.css, avoid shadowRoot
      UI: b/icon.js: add CSS to globals.css
      UI: b/editable.js: add CSS to globals.css
      UI: b/contextmenu.js: add CSS to globals.css
      UI: b/clipview.js: add CSS to globals.css, avoid shadowRoot
      UI: b/cliplist.js: add CSS to globals.css, avoid shadowRoot
      UI: b/choiceinput.js: add CSS to globals.css, avoid shadowRoot
      UI: b/buttonbar.js: add CSS to globals.css, avoid shadowRoot
      UI: b/basics.js: add CSS to globals.css, cleanups
      UI: b/aboutdialog.js: add CSS to globals.css, avoid shadowRoot
      UI: globals.scss: merge contents of grid.scss
      UI: Makefile.mk: fix globals.scss cleanup
      UI: Makefile.mk: include *.jscss contents in globals.css

Merge branch 'csshash-2fix-fouc'    # 2023-07-27 Tim Janik 0b1e7e7
    * csshash-2fix-fouc:
      UI: index.html: mark globals.css as data-4litcomponent
      UI: little.js: clone stylesheet links marked data-4litcomponent into shadowRoot
      UI: index.html: reload vue-styles.css and globals.css once the CSSHASH changes
      UI: Makefile.mk: support @--CSSHASH--@ insertions fro index.html
      ASE: websocket.cc: send "forever" Cache-Control with text/css to reduce FOUC

Merge branch 'globalscss-icon-fonts'    # 2023-07-27 Tim Janik 7a7dd7e
    * globalscss-icon-fonts:
      UI: b/app.js: add comment for spinner testing
      UI: index.html: adjust font resource paths
      UI: globals.scss: import all icon SCSS defs
      UI: dom.js: properly quote font names
      ASE: websocket.cc: use CACHE_AUTO since we do not handle conditional requests
      UI: b/menuseparator.js: fix customElements extends specification
      UI: b/icon.js: leave icon font loading to globals.scss, assert font presence
      UI: b/shell.vue: spinner.scss is already imported by globals.scss
      UI: Makefile.mk: move fonts into ui/ and merge globals.scss dependencies
      UI: globals.scss: rename normalize.scss for merging import
      UI: postcss.js: keep .css imports, include all others
      UI: b/icon.js: assert "Material Icons" font_family instead of loading material-icons.css
      UI: globals.scss: directly include material-icons.css
      UI: Makefile.mk: prepare ui/material-icons.css for globals.css
      UI: dom.js: add font_family_loaded()
      UI: dom.js: add file for DOM utilities

Merge branch 'global-css-rename'    # 2023-07-27 Tim Janik c402d5e
    * global-css-rename:
      UI: index.html: load global.css
      UI: Makefile.mk: generate global.css
      UI: b/shell.vue: fix comment
      UI: global.scss: rename (from globals.scss) b/c it now contains global CSS

Merge branch 'simple-vue-ports'    # 2023-07-27 Tim Janik 1c13e75
    * simple-vue-ports:
      UI: Makefile.mk: adapt make install wildcards
      UI: b/statusbar.js: port to LitComponent
      UI: b/databubble.js: port to native HTML component
      UI: b/partthumb.vue: retire partthumb which is superceded by clipview
      UI: b/hscrollbar.vue: retire hscrollbar code until we really need one
      UI: b/color-picker.vue: retire color picker code until we really need one

Merge branch 'swesterfeld-piano-roll-note-length', closes #15    # 2023-07-27 Tim Janik d115723
    * swesterfeld-piano-roll-note-length:
      UI: b/piano-ctrl.js: cleanup note_duration_delta at the end of a drag
      UI: b/piano-ctrl.js: support resizing multiple notes in a selection

Merge branch 'docker_build_run_clean'    # 2023-07-31 Tim Janik acafef2
    * docker_build_run_clean:
      GITHUB: workflows/testing.yml: remove duplicate chown invokation
      GITHUB: workflows/testing.yml: use misc/docker_build, docker_run, docker_clean
      MISC: docker_clean: cleanup permissions and CI image tag
      MISC: docker_run: run in a CI image built by docker_build
      MISC: docker_build: build a Dockerfile CI image with ghcr.io cache support
      UI: Makefile.mk: make sure all JS files are built before running tscheck

Merge branch 'make-dist-and-assets'    # 2023-07-31 Tim Janik 4694aa8
    * make-dist-and-assets:
      GITHUB: workflows/release.yml: add Ping-IRC job
      GITHUB: workflows/release.yml: use misc/docker_run
      GITHUB: workflows/release.yml: add action to build & create releases from tags
      Makefile.mk: dist: assign release version to misc/version.sh:BAKED_DESCRIBE
      MISC: version.sh: prepare BAKED_DESCRIBE variable to define baked in version
      MISC: version.sh: support lightweight release tags via exact match
      UI: Makefile.mk: fix unintentional tscheck remakes
      DOC: Makefile.mk: add doc/ch-releasing.md to internal manual
      ASE: Makefile.mk: rebuild ase/buildversion*.cc if GITCOMMITDEPS changes
      Makefile.mk: rebuild package.json if GITCOMMITDEPS changes
      MISC: config-utils.mk: take tags and packed-refs into account for GITCOMMITDEPS
      DOC: ch-releasing.md: elaborate on releases and assets
      DOC: ch-releasing.md: start describing versioning and the release process
      MISC: mknews.sh: add development version disclaimer
      MISC: Makefile.mk: remove partial release build rules
      MISC: mkassets.sh: simplify to just make dist and trigger release asset builds
      MISC: mkAppImage.sh: build AppImage in assets/
      MISC: mkAppImage.sh: use tools from appimagetools/ dir
      MISC: Makefile.mk: cache downloads of appimage tools
      Makefile.mk: make dist: also generate assets/ChangeLog
      MISC: mkdeb.sh: create debian package in assets/
      DOC: Makefile.mk: support building assets/pdf
      MISC: Makefile.mk: avoid depending on appimage-runtime-zstd for normal builds
      UI: tsconfig.json: remove exclude section
      Makefile.mk: grep-reminders: only inspect existing files
      Makefile.mk: add recent commits to NEWS.md
      Makefile.mk: build dist tarball in assets/ with high compression
      ASE: main.cc: for --version, show short version and build id
      MISC: config-checks.mk: use version_short
      ELECTRON: Makefile.mk: use version_short
      ASE: Makefile.mk: use version_short
      Makefile.mk: extract version_hash, use version_short for brief version identifiers
    	* Remove version_m.m.m use version_short instead
    	* Remove version_buildid, that is actually version_short + version_hash
      MISC: Makefile.mk: remove unused release-news
      MISC: mknews.sh: generate most recent section of NEWS.md
      MISC: mkdeb.sh: parse hash from misc/version.sh
      MISC: version.sh: reduce logic to produce baked/git/fallback version/hash/date

Merge branch 'poxy-on-jammy'    # 2023-08-02 Tim Janik 3be13e1
    * poxy-on-jammy:
      GITHUB: workflows/testing.yml: run poxy on ubuntu:22.04
      MISC: docker_run: fix interactive invocations
      MISC: Dockerfile.jammy: setup development tools for ubuntu:22.04 builds

Merge branch 'x11test-delay'    # 2023-08-02 Tim Janik 8712b43
    * x11test-delay:
      X11TEST: ereplay.cjs: add delay to mitigate a UI-reload race on project changes
      X11TEST: replay.sh: simplify AnklangSynthEngine executable check

Merge branch 'toggle-as-lit'    # 2023-08-03 Tim Janik 0eba7de
    * toggle-as-lit:
      UI: b/pro-input.vue: handle @valuechange on b-toggle
      UI: b/toggle.js: port to LitComponent

Merge branch 'jsdoc-elements'    # 2023-08-03 Tim Janik 9d0c8de
    * jsdoc-elements:
      DOC: poxystyle.css: fix dark theme colors
      DOC: jsdoc2md.js: use pandoc anchors everywhere with data-4search hints
      DOC: poxy.sh: forbid raw-html and support data-4search on <span/>
      UI: b/*.js: reformat documentation to use @class and @description commands
    	See also: https://jsdoc.app/tags-description.html
      DOC: poxy.sh: parallelize JsDoc processing
      DOC: poxy.sh: fix exit code and compact markdown
      DOC: poxy.sh: add ui/ch-*.md files to poxy docs
      DOC: jsdoc2md.js: allow descriptions of virtual classes as docu sections
      DOC: copyright.ini: assign MPL-2 to ch-*.md documentation files
      DOC: Makefile.mk: integrate ui/ch-component.md
      Makefile.mk: add html/ to CLEANDIRS
      Makefile.mk: clean poxy/ and assets/
      DOC: ch-development.md: explicitely describe ASE
      UI: ch-component.md: describe lit components
      UI: ch-component.md: rename from ui/b/ch-vue.md
      README.md: add Star History Chart

Merge branch 'swesterfeld-piano-roll-move', closes #16    # 2023-08-03 Tim Janik ec26905
    * swesterfeld-piano-roll-move:
      UI: b/piano-ctrl.js: support moving/copying notes with the mouse
      UI: b/cliplist.js: restore user manual docs

Merge branch 'anklang-internals+jsdocs'    # 2023-08-19 Tim Janik b554e80
    * anklang-internals+jsdocs:
      UI: b/basics.js: small docu update
      DOC: Makefile.mk: integrate JS component docs into internal manual
      DOC: jsdoc2md.js: skip extra subsection indentation
      UI: Makefile.mk: optimize *.jscss build, fix anklang-internals.html dependency
      UI: b/*.js: use three hashes '###' to indent docu subsections

Merge branch 'fix-raw-tex'    # 2023-08-19 Tim Janik 64882dc
    * fix-raw-tex:
      UI: xbcomments.js: properly quote special characters in docs
      DOC: Makefile.mk: do not parse source comments as raw_tex

Merge branch 'b-propinput-litcomponent'    # 2023-08-23 Tim Janik a7ab348
    * b-propinput-litcomponent:
      UI: b/propinput.js: port to LitComponent
      UI: b/choiceinput.js: support label attribute as choice tip
      UI: little.js: add LitComponent.request_update_()
      UI: util.js: add addnotify_() and delnotify_() to extended properties
      UI: b/pro-group.vue: use <b-propinput/>
      UI: b/knob.js: simplify
      MISC: package.json.in: extend nodemon delay to reduce conflicts with lint rules
    	Sometimes when ui/lint is triggered, files are written and make serve also runs
    	rebuild rules due to nodemon.

Merge branch 'propgroup-litcomponent'    # 2023-08-30 Tim Janik 3957579
    * propgroup-litcomponent:
      UI: b/pianoroll.js: add todo comment
      UI: b/knob.js: use fixed adjustment factors for wheel events
      UI: util.js: wheel_delta: normalize delta to pixels for modern browsers
    	Work around Firefox changing deltaY vs deltaMode depending on the order
    	of access! Throw away old compat code.
      UI: b/knob.js: fix invalid field access
      UI: b/propgroup.js: avoid shadowRoot
      UI: util.js: refuse pointer lock grabbing on orphans and shadowRoot descendants
      UI: b/propgroup.js: port to LitComponent
      UI: b/deviceeditor.vue: use b-propgroup
      UI: b/propinput.js: support readonly + disabled state
      UI: b/propinput.js: add support for <b-knob/> as property field
      UI: b/propinput.js: let labeled default to false
      UI: b/toggle.js: store pressed button number
      UI: util.js: add uuname()

Merge branch 'fix-unstyled-content-flashing'    # 2023-09-01 Tim Janik 39ac286
    * fix-unstyled-content-flashing:
      UI: b/contextmenu.js: fix layout interference inside flexbox during popup
      UI: index.html: load global.css via style+@import, mark as data-4litcomponent
      UI: little.js: add adopt_component_styles() for simple style+@import cloning
    	This allows to work around FOUC issues with Chrome, see comments.

Merge branch 'rebuild-focal'    # 2023-09-06 Tim Janik 2a4c7de
    * rebuild-focal:
      MISC: Dockerfile.focal: remove NOTEX argument
      MISC: mknews.sh: print news in chronological order