Skip to content

Anklang 0.2.0.nightly2402082217

Pre-release
Pre-release
Compare
Choose a tag to compare
@tim-janik tim-janik released this 08 Feb 22:26
· 567 commits to trunk since this release

Anklang 0.2.0.nightly2402082217

Development version - may contain bugs or compatibility issues.

Merge branch 'properties-metadata' - support generic metadata on properties    # 2024-02-08 Tim Janik 5f06a6d
    * properties-metadata:
      devices/saturation/saturation.cc: add "blurb=" prefix and mark translations
      devices/liquidsfz/liquidsfz.cc: add "blurb=" prefix and mark translations
      devices/freeverb/freeverb.cc: add "blurb=" prefix and mark translations
      devices/blepsynth/blepsynth.cc: add "blurb=" prefix and mark translations
      ase/api.hh: introduce metadata() for properties
    	* Add const this qualifier to parameter APIs.
    	* engine.cc: add "descr=" prefix to property metadata
    	* project.cc: add "descr=" prefix to property metadata
      ase/strings: add kvpairs_fetch() and kvpairs_assign()

Merge branch 'MOUSE-WHEEL' - fix mouse wheel handling in modern Chrome and Firefox    # 2024-02-08 Tim Janik 070d91a
    * MOUSE-WHEEL:
      ui/util.js: remove unused wheel2scrollbars
      ui/b/pianoroll.js: reinstante hzoom and vzoom adjustments via Ctrl
      ui/util.js: use Mouse.wheel_delta()
      ui/b/knob.js: use Mouse.wheel_delta()
      ui/b/pianoroll.js: properly scroll via deltaY from Mouse.wheel_delta()
      ui/mouse.js: wheel_delta(): provide .x, .y, .z in pixels
      ui/b/app.js: defer ZMove handling to mouse.js
      ui/mouse.js: include ZMove notification handling
      ui/index.html: start mouse.js early on
      ui/mouse.js: add event_movement() and wheel_delta() to fix event coords
    	Cross browser normalization of movementX,movementY and deltaX,deltaY is a hot mess, see:
    	https://bugs.chromium.org/p/chromium/issues/detail?id=1092358
    	https://bugzilla.mozilla.org/show_bug.cgi?id=1392460
    	https://github.com/w3c/uievents/issues/181
    	https://github.com/w3c/pointerlock/issues/42
    	https://github.com/mdn/content/issues/11811
      ui/index.html: disable modulepreload, it causes module errors in Firefox-122

Merge branch 'GRID-FILE-BROWSER' - use <grid/> for file browser    # 2024-02-08 Tim Janik 8cfd329
    * GRID-FILE-BROWSER:
      misc/package.json.in: fix path of rebuild command
      ui/kbd.js: fix coord check during horizontal focus movement
      ui/b/folderview.vue: use grid with column flow to fix slow flexbox wrapping
      ase/websocket.cc: use "CR" as Chrome abbreviation
      ase/strings.hh: fix spacing
      ase/clapplugin.cc: fix newline

Merge branch 'ATOMIC-STACK' - simple atomic stack based on Loft    # 2024-02-08 Tim Janik 765600a
    * ATOMIC-STACK:
      ase/atomics.cc: add atomic_valuestack_test()
      ase/atomics.hh: add a simple AtomicStack<> with just push, pop, empty
      ase/loft.hh: reduce includes
      ase/loft.hh: allow constexpr Loft::Allocator and export allows_read_after_free
      misc/synsmell.py: escape FI[X]ME
      misc/synsmell.py: reduce false positives for the separate-body check

Merge branch 'SFZ-STRING-PARAM' - pass SFZ instrument as string    # 2024-02-08 Tim Janik 789a493
    * SFZ-STRING-PARAM:
      devices/liquidsfz/liquidsfz.cc: pass instrument name as string param via Quark
      ase/memory.hh: fix missing constexpr for CString::qset()

Merge branch 'pr7/swesterfeld-liquidsfz'    # 2024-02-08 Tim Janik 55480ad
    * pr7/swesterfeld-liquidsfz:
      devices/liquidsfz/Makefile.mk: remove -Iexternal/liquidsfz/lib
    	Includes need to be added to ase/Makefile.mk for all tools to pick them up.
      ase/Makefile.mk: add -Iexternal/liquidsfz/lib
      ASE: add copyright information to liquidsfz meta includers
      ASE: compile liquidsfz library code into ase library
      DEVICES: liquidsfz: prepare code for .sfz file specific parameter handling
      DEVICES: liquidsfz: add include path to external submodule
      EXTERNAL: liquidsfz: add swesterfeld/liquidsfz commit from 2023-11-18 15:15:57
    	git submodule add --name liquidsfz https://github.com/swesterfeld/liquidsfz.git external/liquidsfz
    	git -C external/liquidsfz checkout 590149ea8c83588c17833d7b9b6653f0f6aab6fb
      DEVICES liquidsfz: port to new parameter API
      DEVICES: liquidsfz: move SFZ loading to its own thread
      DEVICES: liquidsfz: add LiquidSFZ device for SFZ support

Merge branch 'LIT-DEVICEEDITOR' - port b-deviceeditor to Lit    # 2024-02-08 Tim Janik 760b00b
    * LIT-DEVICEEDITOR:
      ui/b/deviceeditor.js: point out layout todo
      ui/b/deviceeditor.js: port logic to lit
      ui/b/contextmenu.js: support popup with null origin
      ui/b/deviceeditor.js: convert syntax to valid javascript
      ui/b/deviceeditor.js: replace deviceeditor.vue

Merge branch 'STRING-PROPS' - support String as AudioProcessor property    # 2024-02-08 Tim Janik 2aef82b
    * STRING-PROPS:
      STRING-PROPS: ase/processor: allow temporary String mappings for text parameters
      ase/memory: add CString::temp_quark_impl() to expose quarks in some cases
      ase/memory: introduce CString::qset() which can count quark references
      ase/processor: AudioProcessor: unify IBus+OBus into IOBus
    	Allow non-trivial ~IOBus() execution.
      ase/sndfile.cc: add libmp3lame to assertion about missing MP3 support
      ui/b/propinput.js: start text field support
      ase/parameter.cc: treat is_text() as non-numeric and allow Quark values

Merge branch 'branch-check'    # 2024-01-26 Tim Janik 9d38b0f
    * branch-check:
      GITHUB: workflows/testing.yml: update to actions/upload-artifact@v4
      GITHUB: workflows/testing.yml: only build & upload docs from tim-janik/anklang
      GITHUB: workflows/testing.yml: update to actions/cache@v4
      GITHUB: workflows/testing.yml: use actions/[email protected], fix annotated tag
    	Upgrade to actions/[email protected] and Fix actions/checkout messing up
    	checkouts of annotated tags; actions/checkout#290
    	Also fetch submodule upfront.
      GITHUB: workflows/testing.yml: remove Release-Upload run
      MISC: Makefile.mk: fix script v2.34 invocation
    	The util script from util-linux 2.34 (focal) has no `-O` option.
      GITHUB: workflows/testing.yml: add `make branch-check` and check errors in PRs
      MISC: Makefile.mk: add branch-check rule, $BRANCH_CHECK_EXIT holds error status
      GITHUB: workflows/testing.yml: disable CI on tag pushes
      MISC: mknews.sh: show git command line
      MISC: Makefile.mk: fix missing CLEANDIRS

Merge branch 'clang-tidy+synsmell'    # 2024-01-25 Tim Janik ceaf526
    * clang-tidy+synsmell:
      UI: Makefile.mk: ui/lint: add checks with misc/synsmell.py
      DEVICES: Makefile.mk: devices/lint: add checks with misc/synsmell.py
      ASE: Makefile.mk: ase/lint: add checks with misc/synsmell.py
      MISC: synsmell.py: check syntax for code smells, based on regular expressions
      ASE: Makefile.mk: allow double loop variable tests in mathutils.cc
      ASE: *.cc: fix clang-tidy warnings
      DEVICES: saturation/Makefile.mk: remove -Iexternal/pandaresampler/lib
      DEVICES: blepsynth/Makefile.mk: remove -Iexternal/pandaresampler/lib
      ASE: Makefile.mk: move -Iexternal/pandaresampler/lib here
      MISC: Makefile.mk: clang-tidy: strip $PWD
      MISC: colorize.sh: fix black-on-black coloring
      MISC: Makefile.mk: fix lint-unused rule
      MISC: Makefile.mk: fix lint-cppcheck rule
      MISC: Makefile.mk: clang-tidy: support target specific .CTIDY_FLAGS
      MISC: Makefile.mk: add clang-tidy-check: false exit status on errors/warnings
      MISC: Makefile.mk: clang-tidy: skip empty reports during printout
      MISC: Makefile.mk: clang-tidy: add -march=x86-64-v2 so atomics checks pass

Merge branch 'docker-apt-cache'    # 2024-01-25 Tim Janik 4dcc915
    * docker-apt-cache:
      MISC: version.sh: shorten the logic
      GITHUB: workflows/testing.yml: compress lines
      MISC: cirun: simplify, add -B to trigger build, compress cache
      MISC: Dockerfile.focal: add /var/cache/apt caching
      MISC: mkassets.sh: build release assets with clang

Merge branch 'reduce-make-deps'    # 2024-01-22 Tim Janik 8b6e4a7
    * reduce-make-deps:
      ASE: atomics.cc: add simple AtomicIntrusiveStack test
      MISC: publish.sh: fix git command quoting
      MISC: mknews.sh: fix extraneous commit hash output
      ASE: cxxaux.cc: fix missing unistd.h include for read()
      MISC: Makefile.mk: add appimagetools/ to CLEANDIRS
      MISC: mkAppImage.sh, mkdeb.sh: fetch $pkgdir from out/config.sh
      Makefile.mk: generate config.sh to export pkgdir, etc
      UI: Makefile.mk: add tscheck/ to CLEANDIRS
      IMAGES: knobs/Makefile.mk: add images/ to CLEANDIRS
      MISC: package.json.in: minor fix
      ASE: Makefile.mk: avoid useless rebuilds
      Makefile.mk: TAGS: use sed to compress flood of "Warning: ignoring null tag"
      Makefile.mk: regen TAGS after git changed
      Makefile.mk: avoid touching ls-tree.lst needlessly
      Makefile.mk: avoid npm rebuilds on git changes
      Makefile.mk: avoid needlessly touching package.json

Merge branch 'simpler-assert'    # 2024-01-22 Tim Janik 25b6611
    * simpler-assert:
      ASE: utils: use diag_prefix() for printouts
      ASE: backtrace.*: remove old code
      ASE: cxxaux.hh: add ASE_ASSERT_UNREACHED() and ASE_ASSERT()
      ASE: cxxaux.hh: add assertion_fatal() and bool assertion_failed_fatal
      ASE: cxxaux.cc: add assertion_fatal(), handle $ASE_DEBUG assertion debug keys
    	Check and implement "breakpoint", "backtrace" and "fatal-warnings" in $ASE_DEBUG

Merge branch 'swesterfeld-move-bleptools-to-dspresearch'    # 2024-01-22 Tim Janik a26757d
    * swesterfeld-move-bleptools-to-dspresearch:
      DEVICES: blepsynth: remove design/test tools (moved to dsp-research repo)

Merge branch 'build-fixes'    # 2023-12-05 Tim Janik fce55a4
    * build-fixes:
      DOC: Makefile.mk: work around broken heading anchors in pandoc-1.3.9
      ASE: Makefile.mk: ase/sndfile.cc requires fully built $>/lib/libsndfile.so

Merge branch 'sndfile-1.2.2' - build custom libsndfile    # 2023-11-22 Tim Janik 1ca7ebc
    * sndfile-1.2.2:
      MISC: mkdeb.sh: require libmpg123-0 for installations
      ASE: Makefile.mk: build and link against our own libsndfile.so
      ASE: sndfile.cc: check libsndfile header and build config
      .gitmodules: sort modules
      EXTERNAL: libsndfile: add libsndfile/libsndfile commit from 2023-10-24 09:47:22
    		git submodule add --name libsndfile https://github.com/libsndfile/libsndfile.git external/libsndfile
    		git -C external/libsndfile checkout e486f20fd4b1c7490cde84f22635e1c267ae882b
      MISC: Dockerfile.arch: install mpg123, lame for libsndlfile
      MISC: Dockerfile.focal: install Vorbis, libmpg123, libmp3lame, update Pandoc

Merge branch 'git-shallow'    # 2023-11-22 Tim Janik bdb8273
    * git-shallow:
      MISC: mknews.sh: create NEWS in forward order
      MISC: mknews.sh: handle repos without tags
      MISC: mkassets.sh: fallback to building in /tmp/anklang.tmp/
      MISC: version.sh: support git repos without tags

Merge branch 'swesterfeld-blepsynth-sample-accurate', closes #27    # 2023-11-18 Tim Janik 80927e0
    * swesterfeld-blepsynth-sample-accurate:
      DEVICES: blepsynth: treat negative time offsets as time offset 0 events
      DEVICES: blepsynth: remove debugging code
      DEVICES: blepsynth: change defaults for 2nd oscillator / mix
      DEVICES: blepsynth: remove event offset debug checks
      DEVICES: blepsynth/blepsynth.cc: improve updates for some parameters
      DEVICES: blepsynth/blepsynth.cc: use new filter version from dsp-research
    	 - use better tanh() approximation in filter saturation function
      DEVICES: blepsynth/blepsynth.cc: set more parameter used flags
      DEVICES: blepsynth/blepsynth.cc: use switch for parameter updates
      DEVICES: blepsynth/blepsynth.cc: implement sample accurate event processing

Merge branch 'swesterfeld-saturation', closes #28    # 2023-11-18 Tim Janik be92820
    * swesterfeld-saturation:
      DEVICES: saturation: treat negative time offsets as time offset 0 events
      DEVICES: saturation: remove debugging code
      DEVICES: saturation: port to new parameter API, support in-block events
      DEVICES: saturation: update DSP code
    	 - process left/right in single SaturationDSP object
    	 - parameter smoothing
    	 - performance optimizations
      DEVICES: saturation: add Saturation device

Merge branch 'separate-ci-checks'    # 2023-11-18 Tim Janik afb2db0
    * separate-ci-checks:
      GITHUB: workflows/testing.yml: avoid make all vs make check races
      Makefile.mk: ensure all checks are added $(CHECK_TARGETS)

Merge branch 'simplify-assertions'    # 2023-11-17 Tim Janik b9dcc9b
    * simplify-assertions:
      ASE: queuemux.hh: avoid inlining fallback method `empty()`
      ASE: cxxaux: assertion_failed: simplify many call sites by adding noexcept
      ASE: queuemux.hh: simplify impls by adding noexcept
      ASE: platform.cc: fix up assertion_failed() call
      ASE: engine.cc: use ASE_ASSERT_WARN() instead of one-off special macro
      ASE: cxxaux: assertion_failed: simplify many call sites by using char*
      ASE: cxxaux.hh: simplify compiler errors by avoiding macro indirections
      ASE: internal.hh: simplify compiler errors by avoiding macro indirections

Merge branch 'fix-multiplexer-iterator'    # 2023-11-17 Tim Janik 4756546
    * fix-multiplexer-iterator:
      ASE: queuemux.hh: properly check for more() in iterator equality operator
      ASE: midievent.cc: show hex dump for unknown events

Merge branch 'param-events'    # 2023-11-16 Tim Janik 8f23a2d
    * param-events:
      DEVICES: blepsynth/blepsynth.cc: port to new Parameter API
    	* Start using install_params()
    	* Rename pid_key_[abcdefg]_, add key prefix
    	* Declare all parameter IDs in an enum
    	* Use ase_gettext() multi arg formatting
    	* Construct AudioProcessor with ProcessorSetup&
    	* Add "toggle" hint for piano key properties
    	* Handle PARAM_VALUE events via apply_event()
    	* Start using midi_event_input()
    	* Port remaining OSC1 and OSC2 parameter references
    	* Adjust and check parameter state *after* processing MIDI events
    	* Adjust parameter ID types
      DEVICES: freeverb/freeverb.cc: support new param events
    	* Use install_params(ParameterMap)
    	* Construct AudioProcessor with ProcessorSetup&
    	* Use adjust_all_params() and apply_input_events()
    	* Fix MODE hints and param position
      DEVICES: colorednoise.cc: use adjust_all_params() and apply_input_events()
    	* Port to install_params(ParameterMap)
    	* Construct AudioProcessor with ProcessorSetup&
      DEVICES: Makefile.mk: include colorednoise.cc in the build
      ASE: midilib.cc: use midi_event_input() and midi_event_output()
      ASE: clapplugin.cc: use midi_event_input()
      ASE: engine: allow atomic frame_counter and block_size access
      ASE: engine.cc: use midi_event_output()
      ASE: midievent: rename + rewrite MidiEventReader to read many queues
    	* Base MidiEventReader on QueueMultiplexer<> to turn
    	  it into a multiplexing event queue reader
    	* Rename MidiEventReader (former MidiEventRange)
      ASE: clapplugin.cc: use call_delete<>()
      ASE: cxxaux.hh: add call_delete<> to quickly create delete callbacks
      ASE: rename MidiEventOutput (former MidiEventStream)
      ASE: nativedevice.cc: use AudioProcessor.access_properties()
      ASE: midilib: construct AudioProcessor with ProcessorSetup&
      ASE: api.hh, server.cc: add Server.engine_stats()
      ASE: engine: add AudioEngine.engine_stats()
      ASE: clapplugin.cc: construct AudioProcessor with ProcessorSetup&
      ASE: clapplugin: remove unused flags fiels from params
      ASE: combo: construct AudioProcessor with ProcessorSetup&
      ASE: processor: implement parameter change events
    	* Introduce AudioParams, t0events, install_params(), apply_event()
    	* Implement AudioParams::dirty()
    	* Implement AudioProcessor.access_properties()
    	* Store aseid_ in each AudioProcessor
    	* Add property weak pointers to AudioParams
    	* Support install_params() with an ordinary map<>
    	* Initialize parameter cache with intial value
    	* Disable Property inflight handling code
    	* Rename MidiEventOutput (former MidiEventStream)
    	* Implement multiplexing MIDI event handling
    	* Atomically modify and swap t0events to pass between threads
    	* Leave new/delete of t0events to the main-thread
    	* Add modify_t0events<>() helper to care about atomic swapping
    	* Rename and rewrite get_event_input() and get_event_output()
    	* Introduce RenderContext for rendering specific variables
    	* midi_event_input(): setup multiplexing event queue reader
    	* midi_event_output(): provide writable MIDI event vector
    	* Implement send_param()
    	* Only set dirty and changed for params with property object
    	* Enqueue PARAMCHANGE notification if params changed
    	* Simplify event processing
    	* Provide apply_input_events() to assign PARAM_CHANGE events
    	* Use uint32_t as parameter id type for processors
    	* Provide adjust_all_params() to call adjust_param() for all params
      ASE: midievent: support MidiMessage::PARAM_VALUE
      ASE: midievent: add PARAM_VALUE and make_param_value()
      ASE: parameter: add ParameterMap and support groups
    	* Make `ident` the first Param() field, adjust callers
    	* Add ParameterMap helper type
    	* Support Param.MinMaxStep as double min,max pair
    	* Catch simple cases of duplicate IDs, ident, label
    	* Assign group to new ParameterMap Params
      ASE: queuemux: support iterators and assign via std::array<const Queue*>
      ASE: queuemux: add QueueMultiplexer.assign() and support iterator template arg

Merge branch 'loft-stl-allocator'    # 2023-11-13 Tim Janik 89cc7d6
    * loft-stl-allocator:
      ASE: loft: provide STL allocator adapter Loft::Allocator
      ASE: utils.cc: allow 3 character "unicode" icons
      ASE: cxxaux.cc, utils.cc: for --fatal-warnings, call breakpoint()
    	This allows continuations in gdb sessions.
      ASE: utils.hh: require multiple arguments to ase_gettext() for string_format()

Merge branch 'queuemux'    # 2023-11-13 Tim Janik e1031e5
    * queuemux:
      ASE: queuemux: integrate QueueMultiplexer
      ASE: queuemux.cc: start QueueMultiplexer implementation

Merge branch 'swesterfeld-flexible-adsr', closes #6    # 2023-11-11 Tim Janik 409e87d
    * swesterfeld-flexible-adsr:
      DEVICES: blepsynth/blepsynth.cc: cleanup unneccessary initialization
      DEVICES: blepsynth/blepsynth.cc: introduce flexible ADSR model
    	 - volume envelope can now be analog (exponential) or flexible
    	 - flexible envelope has adjustable attack/decay/release slope
    	 - support changing volume/filter envelope params while note is playing

Merge branch 'swesterfeld-blepsynth-sallen-key-filter', closes #10    # 2023-11-01 Tim Janik 441cbca
    * swesterfeld-blepsynth-sallen-key-filter:
      ASE: resampler2: remove, superseded by pandaresampler
      DEVICES: blepsynth/blepsynth.cc: reorder parameter groups
      DEVICES: blepsynth/Makefile.mk: include external/pandaresampler/lib
      EXTERNAL: pandaresampler: add swesterfeld/pandaresampler commit from 2023-02-14 10:18:45
    	git submodule add --name pandaresampler https://github.com/swesterfeld/pandaresampler.git external/pandaresampler
    	git -C external/pandaresampler checkout 29097dc786b6d75a9deb12e70ec8960a78f7f8f5
      DEVICES: blepsynth: update LadderVCF with drive/reso boost
      DEVICES: blepsynth: optimize filter code if freq/reso/drive are constant
      DEVICES: blepsynth: update LadderVCF, setup cutoff frequency range
      DEVICES: blepsynth: add latency compensation for LadderVCF
      DEVICES: blepsynth: update LadderVCF to version from dsp-research
    	- oversample LadderVCF with factor 4, too
      DEVICES: blepsynth: compensate for SKFilter FIR oversampling delay
      DEVICES: blepsynth: reset filter state on filter type change
      DEVICES: blepsynth: reset SKFilter state if filter mode changes
      DEVICES: blepsynth: make cutoff parameter log-scaled
      DEVICES: blepsynth: rename vcf_ to ladder_filter_; minor cleanups
      DEVICES: blepsynth: implement midi velocity handling and add master gain
      DEVICES: blepsynth: smooth drive / reso input for Sallen-Key Filter
      DEVICES: blepsynth: add Sallen-Key Filter

Merge branch 'constrain-parameters'    # 2023-11-01 Tim Janik fff51b9
    * constrain-parameters:
      UI: b/databubble.js: fix assertion
      ASE: processor.cc: use parameter->dconstrain()
      ASE: parameter: add dconstrain() to convert to double and constrain
      ASE: processor.cc: use Parameter::construct_hints()
      ASE: parameter: export construct_hints(), always use "stepped" hint for bools
      UI: b/propinput.js: give toggles preference over choices
      ASE: processor.cc: remove unused choices from boolean param
      ASE: serialize.cc: call jsonvalue_to_string() directly
      ASE: jsonapi.cc: call jsonobject_to_string() directly
      JSONIPC: jsonipc.hh: always write null instead of NAN, ±Inf
    	Remove JsonWriteFlags from the (template) API.
      JSONIPC: Makefile: fix include path to external/rapidjson/
      EXTERNAL: rapidjson: update Tencent/rapidjson to 2023-09-28 11:36:59 +0200
    	git -C external/rapidjson checkout f9d53419e912910fd8fa57d5705fa41425428c35
    	Among other changes, this provides kWriteNanAndInfNullFlag.
      ASE: parameter: value_from_text(): yield integers for text inputs of choices

Merge branch 'npm-updates'    # 2023-11-01 Tim Janik 8d56822
    * npm-updates:
      MISC: package.json.in: update various minor versions
      Makefile.mk: allow $NPM_INSTALL overrides via config-defaults.mk
    	This allowes e.g.:
    	  NPM_INSTALL = pnpm install --prefer-offline

Merge branch 'g++-bun-pnpm-ci'    # 2023-10-27 Tim Janik 042fd7a
    * g++-bun-pnpm-ci:
      GITHUB: workflows/testing.yml: test Arch builds with g++
      MISC: Dockerfile.arch: provide pnpm as JS package manager
      MISC: Dockerfile.arch: update build comments
      MISC: Dockerfile.focal: provide bun as JS package manager
      MISC: cirun: defer check for docker-buildx-plugin until we actually need it
      Makefile.mk: guard against `prefix := / / ` etc which will confuse `rm -rf`
      EXTERNAL: websocketpp: update zaphoyd/websocketpp to 2022-05-24 18:42:50 2022 -0500
    	git -C external/websocketpp/ checkout b9aeec6eaf3d5610503439b4fae3581d9aff08e8
    	This includes fixes applied after version 0.8.2, in particular it allows g++ to build
    	the sources with C++20 enabled. See:
    	  https://github.com/zaphoyd/websocketpp/issues/991

Merge branch 'bun'    # 2023-10-24 Tim Janik 63e4292
    * bun:
      Makefile.mk: fix up sharp and electron installations with bun
    	At the moment, we need to call the postinstall scripts manually, see:
    	https://github.com/oven-sh/bun/pull/5077
      MISC: config-checks.mk: support bun 1.0.0 as package manager

Merge branch 'pnpm'    # 2023-10-24 Tim Janik f1b37e4
    * pnpm:
      MISC: config-checks.mk: remove unused NPM_INSTALL
      Makefile.mk: save XNPM to defaults and use it to install node_modules/
      MISC: config-checks.mk: check for pnpn, provide as $(XNPM)
      UI: Makefile.mk: fetch Lit version directly from node_modules/lit/package.json
      X11TEST: ereplay.cjs: set timeout to 2500 to allow click durations of 2200ms

Merge branch 'package-updates'    # 2023-10-24 Tim Janik 1c7da51
    * package-updates:
      MISC: package.json.in: update babel, eslint, rollup, electron, postcss, lit
    	Major version updates:
    	- electron-27.0.2
    	- icon-gen-4.0.0
    	- lit-3.0.0
    	- rollup-4.1.4
    	- postcss-lab-function-6.0.7
    	- puppeteer-core-21.4.0
      MISC: package.json.in: update to vue-3.3.6

Merge branch 'preferences' and live PCM driver updates    # 2023-10-16 Tim Janik c7ece44
    * preferences:
      UI: util.js: call prop->ident()
      ASE: shorten Parameter method ident()
      ASE: strings: add fallback to string_option_find(), remove string_option_get()
      ASE: testing.cc: use string_option_find_value()
      ASE: processor.cc: use string_option_find()
      ASE: cxxaux.cc: use ase_fatal_warnings
      ASE: main: remove feature toggles, use ase_fatal_warnings
      ASE: utils: export ase_fatal_warnings
      ASE: utils.cc: base debug key checks on string_option_find_value()
      ASE: strings: base option search on string_option_find_value() (without malloc)
      ASE: project: create_properties: use property_bag() and Prop
      ASE: clapdevice.cc: use parameter_guess_nick()
      ASE: gadget: add property_bag() and create_properties()
      UI: b/preferencesdialog.vue: edit everything with Shift+Ctrl+Alt+Click [Close]
      UI: b/preferencesdialog.vue: fetch + edit only selected PCM + MIDI preferences
      UI: b/objecteditor.js: fix blurb and descr bubbles
      UI: index.html, eslintrc.js: allow _("for translation") markup
      UI: util.js: rename extended Property descr() (abbreviate)
      UI: b/choiceinput.js: treat choice property as string
      UI: b/preferencesdialog.vue: special case driver.pcm.devid
      UI: b/objecteditor.js: rename internal function on xprop
      UI: b/contextmenu.js: support focus_uri
      ASE: engine.cc: add preferences for up to 4 MIDI controllers
      ASE: engine.cc: cache PCM driver live listing for ca half a second
      ASE: engine: change PCM driver when preferences change
      ASE: engine.cc: add audio.synth_latency Preference
      ASE: driver*: allow to query all PcmConfig values from drivers
      ASE: api.hh, server: remove all old preference handling
      ASE: api.hh, server: add Server.list_preferences()
      ASE: properties: add Preference classes and majorly simplify Property impls
    	* Remove obsolete structures and aux constructors
    	* Add getter/setter lister for enumeration types
    	* Add PropertyBag - a helper to simplify property registrations
    	* Add small PropertyImpl based on ParameterProperty
    	* Add generic Preference class, useful for static initialization
    	* Remove property nick guessing
    	* Add global Preference setting list based on Parameter
    	* Implement saving/loading preferences from anklangrc
    	* Auto save preference changes after maybe half a second
    	* Ensure that Preference names follow NCName syntax
      ASE: defs.hh: add PropertyImpl
      ASE: api.hh: rename Property.descr() (abbreviate)
      ASE: api.hh, server: provide access_preference() instead of access_prefs()
      ASE: api.hh: add constexpr GUIONLY, STORAGE, STANDARD to avoid C++ SIOF
      ASE: main.cc: save/load preferences unless --norc is given
      ASE: processor: use Parameter instead of the old ParamInfo
      ASE: parameter: add Parameter, ParameterProperty and parameter_guess_nick()
    	* Implement Parameter{} with Param{} as initializer
    	* Add constrain, normalize and text conversions
    	* Implement simple ParameterProperty abstract base class
    	* Support callback function to query parameter choices
    	* In set_value: constrain Value according to parameter range
    	* Use variants for flexible initilizers
    	* Treat choice parameters as text
    	* Match choices via normalized Damerau-Levenshtein distance
    	* Add parameter_guess_nick() (former on property_guess_nick).
      ASE: value.hh: add Value::is_string()
      ASE: object.cc: allow NCName as event detail, to support preference identifiers
      ASE: defs.hh: declare Preference
      ASE: strings: add kvpairs_search()
      ASE: strings: define and use ASE_STRING_SET_ASCII_ALNUM and _LOWER_ALNUM
      ASE: unicode.cc: add missing docs
      ASE: unicode: add string_to_ncname() and string_is_ncname()
      ASE: levenshtein: compute (un)restricted Damerau-Levenshtein string distances
      ASE: defs.hh: add F32EPS and F32MAX
      ASE: memory.hh: declare CStringS
      ASE: loop: add exec_once()
      ASE: cxxaux.hh: add ASE_ASSERT_ALWAYS()
      MISC: package.json.in: reduce wait delay for rebuilds

Merge branch 'c++20'    # 2023-10-10 Tim Janik 3a7c2d3
    * c++20:
      MISC: mkAppImage.sh: fix $ORIGIN in AnklangSynthEngine-fma, add jackdriver.so
      MISC: Dockerfile.focal: install latest poxy (again)
      MISC: Dockerfile.focal: provide libstdc++-10-dev and a recent castxml
      MISC: config-uname.mk: optimize with clang -march=x86-64-v3 on modern platforms
    	Clang chokes on '-march=haswell -mno-hle', so we use '-march=x86-64-v3' which
    	is close to Haswell, the clang docs say:
    	-march=x86-64: CMOV, CMPXCHG8B, FPU, FXSR, MMX, FXSR, SCE, SSE, SSE2
    	-march=x86-64-v2: (close to Nehalem) CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3
    	-march=x86-64-v3: (close to Haswell) AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE
    	-march=x86-64-v4: AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL
      MISC: mkassets.sh: adopt compiler config and fix make V=1
    	* Support make with V=1 during asset builds
    	* Copy compiler config from config-defaults.mk for mkassets
      Makefile.mk: ignore leading spaces in config-defaults.mk
      ASE: properties.hh, processor.hh: remove unused (and conflicting) GroupId
      ASE: memory.cc: test CString operators
      ASE: memory.hh: CString: provide operator== and operator<=> to disambiguate
      JSONIPC: cxxjip.py: switch from C++17 to C++20
      README.md, *.mk: switch from C++17 to C++20
      ASE: memory.hh: always provide ctor for Block initialization

Merge branch 'audio-engine-job-cleanups'    # 2023-10-01 Tim Janik 8067acc
    * audio-engine-job-cleanups:
      ASE: engine.hh: document engine lifetime
      ASE: engine: remove BorrowedPtr, simplify EngineJobImpl
      ASE: clapplugin.cc: use main_rt_jobs queue to delete events from audio_thread
      ASE: clapplugin.cc: rename ClapAudioProcessor
      ASE: project.cc: do not (auto) destroy all projects during atexit
      ASE: main.cc: shutdown: unset engine project and handle main loop callbacks
      ASE: engine: make transport a reference, move job queues into AudioEngine
      ASE: engine: rename AudioEngineThread

Merge branch 'websocket-fix'    # 2023-10-01 Tim Janik a5f9ca9
    * websocket-fix:
      ASE: jsonapi.cc: cache socket nickname for use during errors
      ASE: websocket.cc: avoid exceptions in boost::asio socket.remote_endpoint()
      ASE: callback.hh: remove (sync) return value handling in JobQueue
      ASE: jsonapi.cc: wait for main loop callback completion via semaphore

Merge branch 'main-rt-jobs'    # 2023-09-30 Tim Janik a3f8f29
    * main-rt-jobs:
      ASE: main.cc: fit one RtCallJob into a cache line
    	This becomes possible with RtCall allocating just 4 pointer sizes.
    	Since Loft allocates at cache line boundaries only, this essentially
    	halves the size of an RtCallJob allocation.
      ASE: callback: shrink struct RtCall by a pointer
      ASE: loft: fix and test LoftPtr<T> actually running ~T
      ASE: engine.hh: add comment about main_rt_jobs
      ASE: main.cc: turn debugging code into real job_queue_tests
      ASE: main: main_rt_jobs: add main_loop callback queue without invoking malloc()
      ASE: callback: RtCall: wrap simple callback pointers, without using malloc
      ASE: cxxaux.hh: add unalias_ptr<> helper
      ASE: callback.cc: add a small callback list test
      ASE: callback: add CallbackList - reentrant cb list with configurable arguments
      ASE: callback: move JobQueue implementation here

Merge branch 'fix-warnings'    # 2023-09-29 Tim Janik 9c1a062
    * fix-warnings:
      ASE: track.cc: fix signedness
      ASE: utils.cc: cosmetic change
      ASE: project.cc: cosmetic change
      ASE: nativedevice.cc: fix signedness
      ASE: midilib.cc: fix signedness
      ASE: midievent.cc: cosmetic change
      ASE: internal.hh: cosmetic change
      ASE: inifile.cc: fix signedness
      ASE: engine.cc: cosmetic change
      ASE: compress.cc: fix write check signedness
      ASE: combo: fix insert position signedness
      ASE: clapplugin.cc: cosmetic change
      ASE: device.cc: remove unused code
      ASE: blob.cc: cosmetic fix
      MISC: Makefile.mk: clang-tidy: fix missing includes
      ASE: clapplugin.cc: cosmetic fix
      ASE: loop.cc: fix typo

Merge branch 'bug-fixes'    # 2023-09-23 Tim Janik e9015b9
    * bug-fixes:
      GITHUB: workflows/testing.yml: upload dist tarball as isolated smaller artefact
      GITHUB: workflows/testing.yml: upgrade to actions/[email protected]
      MISC: *.sh: use '#!/usr/bin/env bash' for bash scripts, fixes #17

Merge branch 'use-git-submodule'    # 2023-09-21 Tim Janik 22cf347
    * use-git-submodule:
      DOC: copyright.ini: apply MPL-2.0 to .gitmodules
      MISC: Makefile.mk: directly create and reference .dlcache/ for mkassets.sh
      MISC: Makefile.mk: mkassets: download builds tools before misc/mkassets.sh
      GITHUB: workflows/testing.yml: use `make mkassets` for release builds
      .gitignore: ignore .submodule-stamp
      UI: global.scss, index.html: move AnklangIcons to assets/
      UI: Makefile.mk: copy anklangicons-*.tgz files to assets, remove download
      EXTERNAL: blobs4anklang: add tim-janik/blobs4anklang commit from 2023-09-21 21:04:16
    	git -C external/blobs4anklang/ checkout 7b0a4a68a1e9efbe68fc9761bef080995f4b4d6b
      UI: global.scss, index.html: move fork-awesome to assets/
      UI: Makefile.mk: copy node_modules/fork-awesome to assets, remove download
      MISC: package.json.in: install [email protected]
      UI: Makefile.mk: use blobs4anklang/fonts/InterVariable.woff2, remove download
      EXTERNAL: blobs4anklang: add tim-janik/blobs4anklang commit from 2023-09-21 18:23:36
    	git submodule add --name blobs4anklang https://github.com/tim-janik/blobs4anklang.git external/blobs4anklang
    	git -C external/blobs4anklang/ checkout 8da35f3914b9668bacc6755a8051a17051b07c3a
      Makefile.mk: skip `git submodule` in tarball builds
      Makefile.mk: dist: exclude unused external subdirs from tarball
      Makefile.mk: include submodule archives in dist tarball
      ASE: Makefile.mk: use blake3 submodule, remove download rule
      ASE: compress.cc: use external/blake3/c/blake3.h
      EXTERNAL: blake3: add BLAKE3-team/BLAKE3 version 1.3.1
    	git submodule add --name blake3 https://github.com/BLAKE3-team/BLAKE3.git external/blake3
    	git -C external/blake3/ checkout 1.3.1
      ASE: Makefile.mk: use websocketpp submodule, remove download rule
      EXTERNAL: websocketpp: add zaphoyd/websocketpp version 0.8.2
    	git submodule add --name websocketpp https://github.com/zaphoyd/websocketpp.git external/websocketpp
    	git -C external/websocketpp/ checkout 0.8.2
      ASE: Makefile.mk: use clap submodule, remove download rule
      EXTERNAL: clap: add free-audio/clap version 1.1.1
    	git submodule add --name clap https://github.com/free-audio/clap.git external/clap
    	git -C external/clap/ checkout 1.1.1
      ASE: Makefile.mk: use rapidjson submodule, remove download rule
      EXTERNAL: rapidjson: add Tencent/rapidjson commit from 2022-05-24 10:03:13
    	git submodule add --name rapidjson https://github.com/Tencent/rapidjson.git external/rapidjson
    	git checkout 232389d4f1012dddec4ef84861face2d2ba85709
      Makefile.mk: update all submodules before building sources
      Makefile.mk: remove external/ subdir from ls-tree.lst
      MISC: mkcopyright.py: ignore dirs passed from `git ls-tree` on the CLI
      ASE: storage.cc: adjust old link to zlib-ng/minizip-ng/issues/433
      ASE: minizip: build against external/minizip-ng/
      ASE: Makefile.mk: use minizip-ng submodule, remove download rule
      EXTERNAL: minizip-ng: add zlib-ng/minizip-ng version 2.9.0
    	git submodule add --name minizip-ng https://github.com/zlib-ng/minizip-ng.git external/minizip-ng
      .gitignore: remove entries of files the build is not generating

Merge branch 'thin-lto' - improve LTO builds    # 2023-09-17 Tim Janik 0e21fc8
    * thin-lto:
      ASE: main.cc: add missing formats to WAV output help
      MISC: config-uname.mk: when using LTO, enable Thin LTO with clang
    	Thin LTO can result in smaller binaries and better performance.

Merge branch 'cirun-docker-caching' - let cirun handle image build and caching    # 2023-09-17 Tim Janik 00c0537
    * cirun-docker-caching:
      GITHUB: workflows/testing.yml: use separate steps for docker image builds
      GITHUB: workflows/testing.yml: make use of cirun which handles docker builds
    	* workflows/testing.yml: use misc/cirun -u 1000 to fix ownership
    	* workflows/testing.yml: fix CIMAKE for Focal-Clang-Tidy
    	* workflows/testing.yml: move nproc out of env variables
      MISC: cirun.sh: remove, use simpler cirun
      MISC: gh_delete_assets.sh: remove old helper
      MISC: Dockerfile.lunar: remove old file
      MISC: docker_*: remove old helpers
      MISC: cirun: add docker build, run, chown and caching
      MISC: cirun: add script to run commands in dockerized environments
      GITHUB: workflows/testing.yml: use buildx with selective caching
      GITHUB: workflows/testing.yml: configure and use buildx with selective caching
      GITHUB: workflows/testing.yml: remove unused actions/upload-artifact
      GITHUB: workflows/testing.yml: split asset builds into separate job
      MISC: cirun.sh: add --build, note that --check includes --build
      MISC: mkassets.sh: fix outdated globs

Merge branch 'ci-fixes'    # 2023-09-10 Tim Janik 9a7e628
    * ci-fixes:
      MISC: mkassets.sh: remove unused file generations
      MISC: dbuild.sh: delete, now unused
      MISC: cirun.sh: add missing arg to help
      MISC: publish.sh: remove --draft
      MISC: publish.sh: determine version from tarball, show progress
      MISC: publish.sh: use assets/ directory contents if present
      GITHUB: workflows/testing.yml: use download-artifact@v3 to fetch release assets
      GITHUB: workflows/testing.yml: make sure to generate PDF docs early on
      GITHUB: workflows/testing.yml: provide GH_TOKEN for gh in publish.sh
      GITHUB: workflows/testing.yml: first build docs, then upload docs/ artifact
      GITHUB: workflows/testing.yml: fix Release-Upload deps, avoid skipped jobs
      GITHUB: workflows/testing.yml: allow skipped jobs in Ping-IRC
      GITHUB: workflows/testing.yml: use github expression for negating if
      GITHUB: workflows/testing.yml: escape exclamation mark for yaml
      GITHUB: workflows/testing.yml: skip Focal-Clang-Tidy for release tags
      GITHUB: workflows/testing.yml: uplaod releases via misc/publish.sh
      GITHUB: workflows/release.yml: remove, releases moved into testing.yml
      MISC: publish.sh: download artifacts and create a release
      MISC: cirun.sh: properly dockerize clang-tidy
      MISC: cirun.sh: support V=1
      GITHUB: workflows/testing.yml: run clang-tidy on focal
      MISC: cirun.sh: use 1000:1000 to chown files for docker containers
      MISC: mkassets.sh: add missing auto to cp --reflink=auto
      GITHUB: workflows/testing.yml: fix env syntax for gha
      GITHUB: workflows/testing.yml: use cirun.sh for all CI jobs
      GITHUB: workflows/testing.yml: use cirun.sh on Focal for docs
      MISC: cirun.sh: support $CITAG to determine docker run image
      MISC: Dockerfile.lunar: install missing clang aliases
      MISC: cirun.sh: add script that runs all CI stages via docker
      MISC: Dockerfile.focal: install poxy==0.13.0
    	Versions poxy>=0.13.1 have problems with python-3.8 on focal.
      MISC: Dockerfile.focal: install pandoc-3.1.6.2
    	Using pandoc-3.1.7 seems to have issues with PDF generation, anchors
    	in section titles cause an error and SVG images are not found.
      .gitignore: minor addition
      MISC: Dockerfile.focal: add clang-17 aliases
      MISC: Dockerfile.focal: provide xetex, poxy and clang++-17
      GITHUB: workflows/release.yml: upload draft releases for CI tests
      GITHUB: workflows/release.yml: cache focal docker builds with buildx
      GITHUB: workflows/testing.yml: fix comment
      GITHUB: workflows/testing.yml: cache arch docker builds with buildx
      GITHUB: workflows/testing.yml: cache lunar and jammy docker builds with buildx

Merge branch 'release-fixes'    # 2023-09-08 Tim Janik d8465fd
    * release-fixes:
      MISC: mknews.sh: print latest NEWS.md version with `misc/mknews.sh --version`
      GITHUB: workflows/release.yml: set prerelease:false for annotated tags
    	Fix actions/checkout@v3 and actions/checkout@v4 messing up the annotation of
    	the currently fetched tag, even with fetch-depth:0, see: actions/checkout#290
      MISC: mknews.sh: for release tags, copy news section from NEWS.md