<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>drobilla.net - Software</title><link href="https://drobilla.net/" rel="alternate"/><link href="https://drobilla.net/category/software/feed/atom" rel="self"/><id>https://drobilla.net/</id><updated>2026-06-08T23:50:00-04:00</updated><entry><title>Jalv 1.8.2</title><link href="https://drobilla.net/2026/06/08/jalv-1-8-2.html" rel="alternate"/><published>2026-06-08T23:50:00-04:00</published><updated>2026-06-08T23:50:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-06-08:/2026/06/08/jalv-1-8-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/jalv-1.8.2.tar.xz"&gt;Jalv 1.8.2&lt;/a&gt; has been released.  Jalv (JAck LV2) is a simple host for LV2 plugins.  It runs a plugin, and exposes the plugin ports to the system, essentially making the plugin an application.  For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add log window to Gtk interface&lt;/li&gt;
&lt;li&gt;Add separate menu item for saving current preset&lt;/li&gt;
&lt;li&gt;Clean up on exit from console interface&lt;/li&gt;
&lt;li&gt;Disable delete preset action for non-writable presets&lt;/li&gt;
&lt;li&gt;Fix control output refresh rate&lt;/li&gt;
&lt;li&gt;Fix port controls&lt;/li&gt;
&lt;li&gt;Fix state scratch directory location&lt;/li&gt;
&lt;li&gt;Fix updating message-based parameters when loading presets&lt;/li&gt;
&lt;li&gt;Improve command parsing&lt;/li&gt;
&lt;li&gt;Improve save preset dialog&lt;/li&gt;
&lt;li&gt;Only create a state scratch directory when necessary&lt;/li&gt;
&lt;li&gt;Remove obscure save-as action&lt;/li&gt;
&lt;li&gt;Update string controls when focus leaves entry in Gtk interface&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Lilv 0.28.0</title><link href="https://drobilla.net/2026/06/08/lilv-0-28-0.html" rel="alternate"/><published>2026-06-08T22:25:00-04:00</published><updated>2026-06-08T22:25:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-06-08:/2026/06/08/lilv-0-28-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.28.0.tar.xz"&gt;Lilv 0.28.0&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add early assertions for non-null parameters in public API&lt;/li&gt;
&lt;li&gt;Add lilv_state_get_bundle_path()&lt;/li&gt;
&lt;li&gt;Always create state files with O_CLOEXEC on glibc &amp;gt;= 2.7&lt;/li&gt;
&lt;li&gt;Clarify relative symbolic link creation when saving state&lt;/li&gt;
&lt;li&gt;Fix build with dynmanifest support&lt;/li&gt;
&lt;li&gt;Fix crash when loading plugin classes on Windows&lt;/li&gt;
&lt;li&gt;Fix potential file loss when saving state with no link directory&lt;/li&gt;
&lt;li&gt;Fix potential iterator leaks and resulting log message flood&lt;/li&gt;
&lt;li&gt;Fix replacing links when saving over state&lt;/li&gt;
&lt;li&gt;Fix test build when no C++ compiler is available&lt;/li&gt;
&lt;li&gt;Improve error handling when writing and deleting state&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Serd 0.32.10</title><link href="https://drobilla.net/2026/06/08/serd-0-32-10.html" rel="alternate"/><published>2026-06-08T21:08:00-04:00</published><updated>2026-06-08T21:08:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-06-08:/2026/06/08/serd-0-32-10.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.10.tar.xz"&gt;Serd 0.32.10&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Address new warnings in clang-tidy 22&lt;/li&gt;
&lt;li&gt;Fix writing quotes at the end of long literals&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Suil 0.10.26</title><link href="https://drobilla.net/2026/02/10/suil-0-10-26.html" rel="alternate"/><published>2026-02-10T19:50:00-05:00</published><updated>2026-02-10T19:50:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-02-10:/2026/02/10/suil-0-10-26.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.26.tar.xz"&gt;Suil 0.10.26&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs.  It provides wrappers that allow Gtk and Qt hosts to load, and potentially embed, plugin GUIs that use the "native" windowing API (Coca, WIN32, or X11).&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add clang nullability annotations&lt;/li&gt;
&lt;li&gt;Address new warnings in clang and clang-tidy 21&lt;/li&gt;
&lt;li&gt;Fix documentation build without sphinx_lv2_theme&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.26.4</title><link href="https://drobilla.net/2026/02/10/lilv-0-26-4.html" rel="alternate"/><published>2026-02-10T18:47:00-05:00</published><updated>2026-02-10T18:47:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-02-10:/2026/02/10/lilv-0-26-4.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.26.4.tar.xz"&gt;Lilv 0.26.4&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add clang nullability annotations&lt;/li&gt;
&lt;li&gt;Address new warnings in clang and clang-tidy 21&lt;/li&gt;
&lt;li&gt;Fix default LV2 path on cross-compiled Windows builds&lt;/li&gt;
&lt;li&gt;Fix loading of duplicate bundles with equivalent versions&lt;/li&gt;
&lt;li&gt;Fix potential crash when UIs have multiple types or binaries&lt;/li&gt;
&lt;li&gt;Use consistent quoting and punctuation in log messages&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sratom 0.6.22</title><link href="https://drobilla.net/2026/02/10/sratom-0-6-22.html" rel="alternate"/><published>2026-02-10T18:45:00-05:00</published><updated>2026-02-10T18:45:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-02-10:/2026/02/10/sratom-0-6-22.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sratom-0.6.22.tar.xz"&gt;Sratom 0.6.22&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add clang nullability annotations&lt;/li&gt;
&lt;li&gt;Address new warnings in clang and clang-tidy 21&lt;/li&gt;
&lt;li&gt;Fix documentation build without sphinx_lv2_theme&lt;/li&gt;
&lt;li&gt;Gracefully handle reading vectors with missing childType properties&lt;/li&gt;
&lt;li&gt;Gracefully handle writing vectors with zero childSize properties&lt;/li&gt;
&lt;li&gt;Improve error handling&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.22</title><link href="https://drobilla.net/2026/02/10/sord-0-16-22.html" rel="alternate"/><published>2026-02-10T18:43:00-05:00</published><updated>2026-02-10T18:43:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-02-10:/2026/02/10/sord-0-16-22.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sord-0.16.22.tar.xz"&gt;Sord 0.16.22&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add clang nullability annotations&lt;/li&gt;
&lt;li&gt;Address new warnings in clang and clang-tidy 21&lt;/li&gt;
&lt;li&gt;Make more API functions tolerate NULL&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.32.8</title><link href="https://drobilla.net/2026/02/10/serd-0-32-8.html" rel="alternate"/><published>2026-02-10T18:02:00-05:00</published><updated>2026-02-10T18:02:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2026-02-10:/2026/02/10/serd-0-32-8.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.8.tar.xz"&gt;Serd 0.32.8&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid use of snprintf() when writing&lt;/li&gt;
&lt;li&gt;Fix unbounded reader stack growth when reading NQuads&lt;/li&gt;
&lt;li&gt;Improve reader error handling&lt;/li&gt;
&lt;li&gt;Relax nullability of SerdNode buffer field&lt;/li&gt;
&lt;li&gt;Release reader stack memory on read error&lt;/li&gt;
&lt;li&gt;Strengthen handling of corrupt UTF-8 input&lt;/li&gt;
&lt;li&gt;Support writing all escapes in Turtle and TriG prefixed names&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Jalv 1.8.0</title><link href="https://drobilla.net/2025/11/26/jalv-1-8-0.html" rel="alternate"/><published>2025-11-26T20:13:00-05:00</published><updated>2025-11-26T20:13:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-26:/2025/11/26/jalv-1-8-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/jalv-1.8.0.tar.xz"&gt;Jalv 1.8.0&lt;/a&gt; has been released.  Jalv (JAck LV2) is a simple host for LV2 plugins.  It runs a plugin, and exposes the plugin ports to the system, essentially making the plugin an application.  For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add "quit" console command&lt;/li&gt;
&lt;li&gt;Add AppStream metainfo file&lt;/li&gt;
&lt;li&gt;Add Qt6 version&lt;/li&gt;
&lt;li&gt;Add missing short versions of command line options&lt;/li&gt;
&lt;li&gt;Add option to install tool man pages&lt;/li&gt;
&lt;li&gt;Add support for advanced parameters in console frontend&lt;/li&gt;
&lt;li&gt;Add support for control inputs with time:beatsPerMinute designation&lt;/li&gt;
&lt;li&gt;Add support for control outputs with lv2:latency designation&lt;/li&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Build Qt UI with -fPIC&lt;/li&gt;
&lt;li&gt;Clean up and strengthen code&lt;/li&gt;
&lt;li&gt;Clean up command line help output&lt;/li&gt;
&lt;li&gt;Cleanly separate audio thread from the rest of the application&lt;/li&gt;
&lt;li&gt;Fix Jack latency recomputation when plugin latency changes&lt;/li&gt;
&lt;li&gt;Fix clashing command line options&lt;/li&gt;
&lt;li&gt;Fix minor memory leaks&lt;/li&gt;
&lt;li&gt;Make help and version commands exit successfully&lt;/li&gt;
&lt;li&gt;Only send control messages to designated lv2:control ports&lt;/li&gt;
&lt;li&gt;Only send position to ports that explicitly support it&lt;/li&gt;
&lt;li&gt;Reduce Jack process callback overhead&lt;/li&gt;
&lt;li&gt;Remove Gtk2 interface&lt;/li&gt;
&lt;li&gt;Remove limits on the size of messages sent from plugin to UI&lt;/li&gt;
&lt;li&gt;Remove transport position dumping from Jack process callback&lt;/li&gt;
&lt;li&gt;Replace use of deprecated Gtk interfaces&lt;/li&gt;
&lt;li&gt;Rework Gtk3 interface into a relatively modern Gtk application&lt;/li&gt;
&lt;li&gt;Rewrite man pages in mdoc&lt;/li&gt;
&lt;li&gt;Simplify and unify plugin and preset command-line arguments&lt;/li&gt;
&lt;li&gt;Switch to external zix dependency&lt;/li&gt;
&lt;li&gt;Use Gtk switches instead of checkboxes for toggle controls&lt;/li&gt;
&lt;li&gt;Use fewer platform-specific APIs&lt;/li&gt;
&lt;li&gt;Use portable zix filesystem API&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Lilv 0.26.2</title><link href="https://drobilla.net/2025/11/25/lilv-0-26-2.html" rel="alternate"/><published>2025-11-25T19:49:00-05:00</published><updated>2025-11-25T19:49:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-25:/2025/11/25/lilv-0-26-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.26.2.tar.xz"&gt;Lilv 0.26.2&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Actually reload files if bundles are unloaded then reloaded&lt;/li&gt;
&lt;li&gt;Add support for loading xsd:float literals, "INF", and "NaN"&lt;/li&gt;
&lt;li&gt;Avoid warning about non-existent entries in LV2_PATH&lt;/li&gt;
&lt;li&gt;Fix crash when duplicate plugins are discovered&lt;/li&gt;
&lt;li&gt;Fix lilv_node_is_literal() with booleans&lt;/li&gt;
&lt;li&gt;Refine command line tool interfaces and documentation&lt;/li&gt;
&lt;li&gt;lv2bench: Add support for common features and options&lt;/li&gt;
&lt;li&gt;lv2bench: Use more realistic real-time scheduling&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sratom 0.6.20</title><link href="https://drobilla.net/2025/11/12/sratom-0-6-20.html" rel="alternate"/><published>2025-11-12T19:26:00-05:00</published><updated>2025-11-12T19:26:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/sratom-0-6-20.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sratom-0.6.20.tar.xz"&gt;Sratom 0.6.20&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Avoid use of scanf when reading MIDI events&lt;/li&gt;
&lt;li&gt;Fix lint checks&lt;/li&gt;
&lt;li&gt;Fix potential memory error when writing ambiguous relative paths&lt;/li&gt;
&lt;li&gt;Improve code quality&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Suil 0.10.24</title><link href="https://drobilla.net/2025/11/12/suil-0-10-24.html" rel="alternate"/><published>2025-11-12T19:20:00-05:00</published><updated>2025-11-12T19:20:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/suil-0-10-24.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.24.tar.xz"&gt;Suil 0.10.24&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs.  It provides wrappers that allow Gtk and Qt hosts to load, and potentially embed, plugin GUIs that use the "native" windowing API (Coca, WIN32, or X11).&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add header warnings test&lt;/li&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.26.0</title><link href="https://drobilla.net/2025/11/12/lilv-0-26-0.html" rel="alternate"/><published>2025-11-12T19:15:00-05:00</published><updated>2025-11-12T19:15:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/lilv-0-26-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.26.0.tar.xz"&gt;Lilv 0.26.0&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add header warnings test&lt;/li&gt;
&lt;li&gt;Add option to control indexing overhead for subject queries&lt;/li&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Cache LANG value and add option to override it&lt;/li&gt;
&lt;li&gt;Fix Python tests&lt;/li&gt;
&lt;li&gt;Fix build with dynmanifest support&lt;/li&gt;
&lt;li&gt;Fix loading plugins that haven't been loaded yet as state&lt;/li&gt;
&lt;li&gt;Fix loading plugins with invalid lv2:appliesTo properties as state&lt;/li&gt;
&lt;li&gt;Fix potential memory leak in lilv_world_load_plugin_classes()&lt;/li&gt;
&lt;li&gt;Fix potential memory leak in lilv_world_set_option()&lt;/li&gt;
&lt;li&gt;Gracefully ignore and warn about non-directories in LV2_PATH&lt;/li&gt;
&lt;li&gt;Improve loading performance when many plugin versions are found&lt;/li&gt;
&lt;li&gt;Improve performance when loading and deleting state&lt;/li&gt;
&lt;li&gt;Only consider manifest data when discovering related presets/etc&lt;/li&gt;
&lt;li&gt;Print a warning when a property unexpectedly has several values&lt;/li&gt;
&lt;li&gt;Reduce temporary node allocations during query operations&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sord 0.16.20</title><link href="https://drobilla.net/2025/11/12/sord-0-16-20.html" rel="alternate"/><published>2025-11-12T19:12:00-05:00</published><updated>2025-11-12T19:12:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/sord-0-16-20.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sord-0.16.20.tar.xz"&gt;Sord 0.16.20&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add header warnings test&lt;/li&gt;
&lt;li&gt;Add missing const qualifiers to API&lt;/li&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Update man pages&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.32.6</title><link href="https://drobilla.net/2025/11/12/serd-0-32-6.html" rel="alternate"/><published>2025-11-12T18:54:00-05:00</published><updated>2025-11-12T18:54:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/serd-0-32-6.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.6.tar.xz"&gt;Serd 0.32.6&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Drop graphs when writing Turtle output&lt;/li&gt;
&lt;li&gt;Eliminate recursion in the writer&lt;/li&gt;
&lt;li&gt;Fix handling of bad predicates in anonymous blank nodes&lt;/li&gt;
&lt;li&gt;Fix handling of some invalid EOF cases in lax mode&lt;/li&gt;
&lt;li&gt;Fix indentation of named objects after anonymous objects&lt;/li&gt;
&lt;li&gt;Fix indentation when ending anonymous nodes with many objects&lt;/li&gt;
&lt;li&gt;Fix invalid characters in error messages&lt;/li&gt;
&lt;li&gt;Fix reading numbers with no space before the final dot&lt;/li&gt;
&lt;li&gt;Fix reading prefix names that start with "true." or "false."&lt;/li&gt;
&lt;li&gt;Refuse to write incoherent statements&lt;/li&gt;
&lt;li&gt;Remove project and version number from man page OS field&lt;/li&gt;
&lt;li&gt;Write a blank line between statements and Turtle/TriG directives&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Zix 0.8.0</title><link href="https://drobilla.net/2025/11/12/zix-0-8-0.html" rel="alternate"/><published>2025-11-12T18:40:00-05:00</published><updated>2025-11-12T18:40:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/zix-0-8-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/zix-0.8.0.tar.xz"&gt;Zix 0.8.0&lt;/a&gt; has been released.  Zix is a lightweight C library of portability wrappers and data structures.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add ZIX_REALTIME and ZIX_NONBLOCKING attributes&lt;/li&gt;
&lt;li&gt;Add warning suppression macros&lt;/li&gt;
&lt;li&gt;Annotate count and size parameters of allocator API&lt;/li&gt;
&lt;li&gt;Avoid "deprecated" POSIX functions on Windows&lt;/li&gt;
&lt;li&gt;Avoid over-use of yielding meson options&lt;/li&gt;
&lt;li&gt;Clean up attribute documentation&lt;/li&gt;
&lt;li&gt;Gracefully handle failed allocation in path and filesystem functions&lt;/li&gt;
&lt;li&gt;Reduce empty BTree memory requirements&lt;/li&gt;
&lt;li&gt;Strengthen zix_file_equals()&lt;/li&gt;
&lt;li&gt;Use getenv() instead of environ to avoid issues on FreeBSD&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/><category term="Zix"/></entry><entry><title>Sphinxygen 1.0.12</title><link href="https://drobilla.net/2025/11/12/sphinxygen-1-0-12.html" rel="alternate"/><published>2025-11-12T15:59:00-05:00</published><updated>2025-11-12T15:59:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-11-12:/2025/11/12/sphinxygen-1-0-12.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.12.tar.gz"&gt;Sphinxygen 1.0.12&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix documentation for C++ namespaces&lt;/li&gt;
&lt;li&gt;Fix documentation for C++ template functions&lt;/li&gt;
&lt;li&gt;Improve formatting of macro initializers&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Suil 0.10.22</title><link href="https://drobilla.net/2025/01/19/suil-0-10-22.html" rel="alternate"/><published>2025-01-19T13:58:00-05:00</published><updated>2025-01-19T13:58:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-19:/2025/01/19/suil-0-10-22.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.22.tar.xz"&gt;Suil 0.10.22&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs.  It provides wrappers that allow Gtk and Qt hosts to load, and potentially embed, plugin GUIs that use the "native" windowing API (Coca, WIN32, or X11).&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for X11 in Qt6&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;li&gt;Monitor size hints and window resizes for X11 in Gtk3&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.24.26</title><link href="https://drobilla.net/2025/01/19/lilv-0-24-26.html" rel="alternate"/><published>2025-01-19T13:53:00-05:00</published><updated>2025-01-19T13:53:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-19:/2025/01/19/lilv-0-24-26.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.24.26.tar.xz"&gt;Lilv 0.24.26&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add lint option with project metadata and code quality tests&lt;/li&gt;
&lt;li&gt;Avoid use of VLAs in lv2apply&lt;/li&gt;
&lt;li&gt;Clean up and isolate platform-specific code&lt;/li&gt;
&lt;li&gt;Fix C++ test build on MacOS&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;li&gt;Fix test suite when TMPDIR has no trailing slash&lt;/li&gt;
&lt;li&gt;Fully separate library code from programs&lt;/li&gt;
&lt;li&gt;Improve const correctness&lt;/li&gt;
&lt;li&gt;Replace more platform-specific code with use of zix&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sratom 0.6.18</title><link href="https://drobilla.net/2025/01/19/sratom-0-6-18.html" rel="alternate"/><published>2025-01-19T13:49:00-05:00</published><updated>2025-01-19T13:49:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-19:/2025/01/19/sratom-0-6-18.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sratom-0.6.18.tar.xz"&gt;Sratom 0.6.18&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add lint option with project metadata and code formatting tests&lt;/li&gt;
&lt;li&gt;Avoid snprintf when writing MIDI events&lt;/li&gt;
&lt;li&gt;Enable clang nullability checks&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.18</title><link href="https://drobilla.net/2025/01/19/sord-0-16-18.html" rel="alternate"/><published>2025-01-19T13:46:00-05:00</published><updated>2025-01-19T13:46:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-19:/2025/01/19/sord-0-16-18.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sord-0.16.18.tar.xz"&gt;Sord 0.16.18&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add option to install tool man pages&lt;/li&gt;
&lt;li&gt;Enable clang nullability checks&lt;/li&gt;
&lt;li&gt;Fix build as C with MSVC&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;li&gt;Replace more platform-specific code with use of zix&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.32.4</title><link href="https://drobilla.net/2025/01/19/serd-0-32-4.html" rel="alternate"/><published>2025-01-19T00:17:00-05:00</published><updated>2025-01-19T00:17:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-19:/2025/01/19/serd-0-32-4.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.4.tar.xz"&gt;Serd 0.32.4&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean up enum declarations&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;li&gt;Fix overly permissive parsing of syntax names on the command line&lt;/li&gt;
&lt;li&gt;Fix parsing NQuads lines with no space before the final dot&lt;/li&gt;
&lt;li&gt;Fix reading chunks from files without trailing newlines&lt;/li&gt;
&lt;li&gt;Fix rewriting special literals when datatype URIs are prefixed names&lt;/li&gt;
&lt;li&gt;Gracefully handle errors while writing the end of anonymous nodes&lt;/li&gt;
&lt;li&gt;Improve test suite coverage&lt;/li&gt;
&lt;li&gt;Simplify some character classification and comparison code&lt;/li&gt;
&lt;li&gt;Support reading lone lists in lax mode&lt;/li&gt;
&lt;li&gt;Treat out of range unicode characters as errors&lt;/li&gt;
&lt;li&gt;Write blank lines between graphs and statements in TriG&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Zix 0.6.2</title><link href="https://drobilla.net/2025/01/18/zix-0-6-2.html" rel="alternate"/><published>2025-01-18T23:53:00-05:00</published><updated>2025-01-18T23:53:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-18:/2025/01/18/zix-0-6-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/zix-0.6.2.tar.xz"&gt;Zix 0.6.2&lt;/a&gt; has been released.  Zix is a lightweight C library of portability wrappers and data structures.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix documentation build with sphinxygen fallback wrap&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/><category term="Zix"/></entry><entry><title>Sphinxygen 1.0.10</title><link href="https://drobilla.net/2025/01/18/sphinxygen-1-0-10.html" rel="alternate"/><published>2025-01-18T22:27:00-05:00</published><updated>2025-01-18T22:27:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-18:/2025/01/18/sphinxygen-1-0-10.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.10.tar.gz"&gt;Sphinxygen 1.0.10&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add missing meson_options.txt to distribution archive&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Sphinxygen 1.0.8</title><link href="https://drobilla.net/2025/01/18/sphinxygen-1-0-8.html" rel="alternate"/><published>2025-01-18T22:13:00-05:00</published><updated>2025-01-18T22:13:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-18:/2025/01/18/sphinxygen-1-0-8.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.8.tar.gz"&gt;Sphinxygen 1.0.8&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add option for installing executable script&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Zix 0.6.0</title><link href="https://drobilla.net/2025/01/18/zix-0-6-0.html" rel="alternate"/><published>2025-01-18T21:49:00-05:00</published><updated>2025-01-18T21:49:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-18:/2025/01/18/zix-0-6-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/zix-0.6.0.tar.xz"&gt;Zix 0.6.0&lt;/a&gt; has been released.  Zix is a lightweight C library of portability wrappers and data structures.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add ZIX_NODISCARD attribute&lt;/li&gt;
&lt;li&gt;Add option to build for older Windows versions&lt;/li&gt;
&lt;li&gt;Add zix_expand_environment_strings()&lt;/li&gt;
&lt;li&gt;Add zix_string_view_equals()&lt;/li&gt;
&lt;li&gt;Avoid fdatasync() on Darwin&lt;/li&gt;
&lt;li&gt;Fix build on POSIX systems without PATH_MAX defined&lt;/li&gt;
&lt;li&gt;Fix library current_version on MacOS&lt;/li&gt;
&lt;li&gt;Fix nullability annotations for zix_canonical_path() and friends&lt;/li&gt;
&lt;li&gt;Fix ring unit test when mlock() is unavailable&lt;/li&gt;
&lt;li&gt;Improve documentation&lt;/li&gt;
&lt;li&gt;Support building for UWP&lt;/li&gt;
&lt;li&gt;Support building for Windows with or without UNICODE&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/><category term="Zix"/></entry><entry><title>Sphinxygen 1.0.6</title><link href="https://drobilla.net/2025/01/12/sphinxygen-1-0-6.html" rel="alternate"/><published>2025-01-12T23:43:00-05:00</published><updated>2025-01-12T23:43:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2025-01-12:/2025/01/12/sphinxygen-1-0-6.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.6.tar.gz"&gt;Sphinxygen 1.0.6&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Include macro replacement text in documentation&lt;/li&gt;
&lt;li&gt;Place defines and types before functions&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Main Branches Renamed</title><link href="https://drobilla.net/2024/10/31/main-branches-renamed.html" rel="alternate"/><published>2024-10-31T23:23:00-04:00</published><updated>2024-10-31T23:23:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2024-10-31:/2024/10/31/main-branches-renamed.html</id><content type="html">&lt;p&gt;As most git users are aware, the default branch name in git changed from
&lt;code&gt;master&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt; a while ago.  Since I maintain projects created both before
and after this change, some maintenance tasks have become more difficult to
automate as a result (and I'm a sucker for consistency).&lt;/p&gt;
&lt;p&gt;I put off dealing with this because I was planning to make &lt;code&gt;master&lt;/code&gt; branches
disappear at the same time APIs are broken, but that wasn't a good idea for
several reasons beyond the scope of this post.  So, I've changed all of my
personal projects, and all projects maintained under the LV2 umbrella, to use
&lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you're tracking any of those repositories, maintain packaging
infrastructure, or similar, please update your local trees and/or configuration
accordingly.  It's best to rename the local branch with git, since this
preserves your local reftree and avoids accidental use of the old name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git branch -m master main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/></entry><entry><title>Lilv 0.24.24</title><link href="https://drobilla.net/2024/01/23/lilv-0-24-24.html" rel="alternate"/><published>2024-01-23T19:39:00-05:00</published><updated>2024-01-23T19:39:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2024-01-23:/2024/01/23/lilv-0-24-24.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.24.24.tar.xz"&gt;Lilv 0.24.24&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid overriding state features passed by the host&lt;/li&gt;
&lt;li&gt;Fix null dereference when trying to load state from a missing file&lt;/li&gt;
&lt;li&gt;Fix potential null dereferences and conversion warnings&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Serd 0.32.2</title><link href="https://drobilla.net/2024/01/23/serd-0-32-2.html" rel="alternate"/><published>2024-01-23T19:32:00-05:00</published><updated>2024-01-23T19:32:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2024-01-23:/2024/01/23/serd-0-32-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.2.tar.xz"&gt;Serd 0.32.2&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable clang nullability checks&lt;/li&gt;
&lt;li&gt;Fix writing empty list objects within blank nodes&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Lilv 0.24.22</title><link href="https://drobilla.net/2023/10/22/lilv-0-24-22.html" rel="alternate"/><published>2023-10-22T20:14:00-04:00</published><updated>2023-10-22T20:14:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/lilv-0-24-22.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.24.22.tar.xz"&gt;Lilv 0.24.22&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow LILV_API to be defined by the user&lt;/li&gt;
&lt;li&gt;Clean up code&lt;/li&gt;
&lt;li&gt;Clean up inconsistent tool command line interfaces&lt;/li&gt;
&lt;li&gt;Convert man pages to mdoc&lt;/li&gt;
&lt;li&gt;Fix crash when plugins pass NULL to the LV2_State_Retrieve_Function&lt;/li&gt;
&lt;li&gt;Fix dependencies in pkg-config file&lt;/li&gt;
&lt;li&gt;Fix potential crash when writing state files fails&lt;/li&gt;
&lt;li&gt;Order plugin classes by URI&lt;/li&gt;
&lt;li&gt;Override pkg-config dependency within meson&lt;/li&gt;
&lt;li&gt;Remove junk files from documentation install&lt;/li&gt;
&lt;li&gt;Replace duplicated dox_to_sphinx script with sphinxygen dependency&lt;/li&gt;
&lt;li&gt;Switch to external zix dependency&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Suil 0.10.20</title><link href="https://drobilla.net/2023/10/22/suil-0-10-20.html" rel="alternate"/><published>2023-10-22T20:11:00-04:00</published><updated>2023-10-22T20:11:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/suil-0-10-20.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.20.tar.xz"&gt;Suil 0.10.20&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow SUIL_API to be defined by the user&lt;/li&gt;
&lt;li&gt;Fix dependencies in pkg-config file&lt;/li&gt;
&lt;li&gt;Only check for Gtk Quartz support on MacOS&lt;/li&gt;
&lt;li&gt;Override pkg-config dependency within meson&lt;/li&gt;
&lt;li&gt;Remove Gtk in Qt and Qt in Gtk wrappers&lt;/li&gt;
&lt;li&gt;Remove junk files from documentation install&lt;/li&gt;
&lt;li&gt;Replace duplicated dox_to_sphinx script with sphinxygen dependency&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Sratom 0.6.16</title><link href="https://drobilla.net/2023/10/22/sratom-0-6-16.html" rel="alternate"/><published>2023-10-22T20:06:00-04:00</published><updated>2023-10-22T20:06:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/sratom-0-6-16.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sratom-0.6.16.tar.xz"&gt;Sratom 0.6.16&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean up code&lt;/li&gt;
&lt;li&gt;Constrain relative URI references to the base URI&lt;/li&gt;
&lt;li&gt;Fix dependencies in pkg-config file&lt;/li&gt;
&lt;li&gt;Override pkg-config dependency within meson&lt;/li&gt;
&lt;li&gt;Remove junk files from documentation install&lt;/li&gt;
&lt;li&gt;Replace duplicated dox_to_sphinx script with sphinxygen dependency&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.16</title><link href="https://drobilla.net/2023/10/22/sord-0-16-16.html" rel="alternate"/><published>2023-10-22T19:59:00-04:00</published><updated>2023-10-22T19:59:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/sord-0-16-16.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sord-0.16.16.tar.xz"&gt;Sord 0.16.16&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow SORD_API to be defined by the user&lt;/li&gt;
&lt;li&gt;Fix command line help interface of sord_validate&lt;/li&gt;
&lt;li&gt;Fix dependencies in pkg-config file&lt;/li&gt;
&lt;li&gt;Override pkg-config dependency within meson&lt;/li&gt;
&lt;li&gt;Port sord_validate to pcre2&lt;/li&gt;
&lt;li&gt;Switch to external zix dependency&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.32.0</title><link href="https://drobilla.net/2023/10/22/serd-0-32-0.html" rel="alternate"/><published>2023-10-22T19:36:00-04:00</published><updated>2023-10-22T19:36:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/serd-0-32-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.32.0.tar.xz"&gt;Serd 0.32.0&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add Windows path separator support to serd_node_new_file_uri()&lt;/li&gt;
&lt;li&gt;Add long "help" and "version" options to serdi&lt;/li&gt;
&lt;li&gt;Add options to disable html or singlehtml documentation&lt;/li&gt;
&lt;li&gt;Add serd_reader_skip_until_byte() to public API&lt;/li&gt;
&lt;li&gt;Allow SERD_API to be defined by the user&lt;/li&gt;
&lt;li&gt;Avoid creating test files in the current directory&lt;/li&gt;
&lt;li&gt;Avoid using ASCII grave as a quote&lt;/li&gt;
&lt;li&gt;Check for POSIX features with the build system&lt;/li&gt;
&lt;li&gt;Clean up and improve test suite&lt;/li&gt;
&lt;li&gt;Clean up code&lt;/li&gt;
&lt;li&gt;Fix crash when trying to read chunks without starting&lt;/li&gt;
&lt;li&gt;Fix hang when skipping an error at EOF when lax parsing&lt;/li&gt;
&lt;li&gt;Fix incorrect parsing of strange quote escape patterns&lt;/li&gt;
&lt;li&gt;Fix possible hang when writing nested Turtle lists&lt;/li&gt;
&lt;li&gt;Fix potential memory leaks when a write is aborted&lt;/li&gt;
&lt;li&gt;Fix relative URI creation&lt;/li&gt;
&lt;li&gt;Gracefully handle bad characters in Turtle blank node syntax&lt;/li&gt;
&lt;li&gt;Gracefully handle bad characters in Turtle datatype syntax&lt;/li&gt;
&lt;li&gt;Improve TriG pretty-printing and remove trailing newlines&lt;/li&gt;
&lt;li&gt;Improve pretty-printing of lists and inline subjects&lt;/li&gt;
&lt;li&gt;Improve serdi man page&lt;/li&gt;
&lt;li&gt;Improve writer error handling&lt;/li&gt;
&lt;li&gt;Make URI writing stricter by default&lt;/li&gt;
&lt;li&gt;Make serd_reader_read_chunk() work with NQuads&lt;/li&gt;
&lt;li&gt;Override pkg-config dependency within meson&lt;/li&gt;
&lt;li&gt;Remove junk files from documentation install&lt;/li&gt;
&lt;li&gt;Remove support for writing Turtle named inline nodes extension&lt;/li&gt;
&lt;li&gt;Replace duplicated dox_to_sphinx script with sphinxygen dependency&lt;/li&gt;
&lt;li&gt;Test header for warnings more strictly&lt;/li&gt;
&lt;li&gt;Update standard test suites&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Zix 0.4.2</title><link href="https://drobilla.net/2023/10/22/zix-0-4-2.html" rel="alternate"/><published>2023-10-22T18:56:00-04:00</published><updated>2023-10-22T18:56:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-10-22:/2023/10/22/zix-0-4-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/zix-0.4.2.tar.xz"&gt;Zix 0.4.2&lt;/a&gt; has been released.  Zix is a lightweight C library of portability wrappers and data structures.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean up documentation build&lt;/li&gt;
&lt;li&gt;Fix documentation build in a virtualenv&lt;/li&gt;
&lt;li&gt;Improve test suite code coverage&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/><category term="Zix"/></entry><entry><title>Zix 0.4.0</title><link href="https://drobilla.net/2023/08/23/zix-0-4-0.html" rel="alternate"/><published>2023-08-23T23:25:00-04:00</published><updated>2023-08-23T23:25:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-08-23:/2023/08/23/zix-0-4-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/zix-0.4.0.tar.xz"&gt;Zix 0.4.0&lt;/a&gt; has been released.  Zix is a lightweight C library of portability wrappers and data structures.&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/><category term="Zix"/></entry><entry><title>Sphinxygen 1.0.4</title><link href="https://drobilla.net/2023/08/23/sphinxygen-1-0-4.html" rel="alternate"/><published>2023-08-23T20:49:00-04:00</published><updated>2023-08-23T20:49:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-08-23:/2023/08/23/sphinxygen-1-0-4.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.4.tar.gz"&gt;Sphinxygen 1.0.4&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handle anonymous structs without the "@" placeholder&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Sphinxygen 1.0.2</title><link href="https://drobilla.net/2023/02/27/sphinxygen-1-0-2.html" rel="alternate"/><published>2023-02-27T16:09:00-05:00</published><updated>2023-02-27T16:09:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-02-27:/2023/02/27/sphinxygen-1-0-2.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.2.tar.gz"&gt;Sphinxygen 1.0.2&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add command line flags to print version&lt;/li&gt;
&lt;li&gt;Fix links to documentation groups&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>In Search of the Ultimate Compile-Time Configuration System</title><link href="https://drobilla.net/2023/02/13/in-search-of-the-ultimate-compile-time-configuration-system.html" rel="alternate"/><published>2023-02-13T23:38:00-05:00</published><updated>2023-02-13T23:38:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-02-13:/2023/02/13/in-search-of-the-ultimate-compile-time-configuration-system.html</id><content type="html">&lt;p&gt;One of the many programming side quests I embark on from time to time is finding the best way to do compile-time configuration in C and C++ code.
This is one of those characteristically C things that most projects need to do, but that has no well-established best practice.
What you can find is all over the place, and often pretty half-baked just to suit the particularities of the “official” build.
Let's try to come up with something better.&lt;/p&gt;
&lt;p&gt;Ideal requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ability to enable or disable any features from the command line by defining symbols, including the ability to override or completely disable any automatic checks implemented in the code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Good integration with, but no hard dependency on, any build system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The code should build with reasonable defaults when simply thrown at a compiler “as-is”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mistakes, such as forgetting to include the configuration header or using misspelled symbols, are caught by tooling (preferably compiler warnings).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It's never necessary to modify the code to achieve a particular build.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here's a skeleton of the best I've managed to come up with so far, for a made-up “mylib” project and a few POSIX functions.
It has a bit of boilerplate, but there's good reasons for everything that I'll get to.
This configuration header is written manually (not generated) and included (privately) in the source code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifndef MYLIB_CONFIG_H&lt;/span&gt;
&lt;span class="cp"&gt;#define MYLIB_CONFIG_H&lt;/span&gt;

&lt;span class="cp"&gt;#if !defined(MYLIB_NO_DEFAULT_CONFIG)&lt;/span&gt;

&lt;span class="c1"&gt;// Derive default configuration from the build environment&lt;/span&gt;

&lt;span class="c1"&gt;// We need unistd.h to check _POSIX_VERSION&lt;/span&gt;
&lt;span class="cp"&gt;#  ifdef __has_include&lt;/span&gt;
&lt;span class="cp"&gt;#    if __has_include(&amp;lt;unistd.h&amp;gt;)&lt;/span&gt;
&lt;span class="cp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="cp"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#    endif&lt;/span&gt;
&lt;span class="cp"&gt;#  elif defined(__unix__)&lt;/span&gt;
&lt;span class="cp"&gt;#&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="cp"&gt;include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;#  endif&lt;/span&gt;

&lt;span class="c1"&gt;// Define MYLIB_POSIX_VERSION unconditionally for convenience below&lt;/span&gt;
&lt;span class="cp"&gt;#  if defined(_POSIX_VERSION)&lt;/span&gt;
&lt;span class="cp"&gt;#    define MYLIB_POSIX_VERSION _POSIX_VERSION&lt;/span&gt;
&lt;span class="cp"&gt;#  else&lt;/span&gt;
&lt;span class="cp"&gt;#    define MYLIB_POSIX_VERSION 0&lt;/span&gt;
&lt;span class="cp"&gt;#  endif&lt;/span&gt;

&lt;span class="c1"&gt;// POSIX.1-2001: fileno()&lt;/span&gt;
&lt;span class="cp"&gt;#  if !defined(HAVE_FILENO)&lt;/span&gt;
&lt;span class="cp"&gt;#    if MYLIB_POSIX_VERSION &amp;gt;= 200112L || defined(_WIN32)&lt;/span&gt;
&lt;span class="cp"&gt;#      define HAVE_FILENO 1&lt;/span&gt;
&lt;span class="cp"&gt;#    endif&lt;/span&gt;
&lt;span class="cp"&gt;#  endif&lt;/span&gt;

&lt;span class="c1"&gt;// POSIX.1-2001: posix_fadvise()&lt;/span&gt;
&lt;span class="cp"&gt;#  if !defined(HAVE_POSIX_FADVISE)&lt;/span&gt;
&lt;span class="cp"&gt;#    if MYLIB__POSIX_VERSION &amp;gt;= 200112L &amp;amp;&amp;amp; !defined(__APPLE__)&lt;/span&gt;
&lt;span class="cp"&gt;#      define HAVE_POSIX_FADVISE 1&lt;/span&gt;
&lt;span class="cp"&gt;#    endif&lt;/span&gt;
&lt;span class="cp"&gt;#  endif&lt;/span&gt;

&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="c1"&gt;// !defined(MYLIB_NO_DEFAULT_CONFIG)&lt;/span&gt;

&lt;span class="c1"&gt;// Define USE variables for use in the code&lt;/span&gt;

&lt;span class="cp"&gt;#if defined(HAVE_FILENO) &amp;amp;&amp;amp; HAVE_FILENO&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_FILENO 1&lt;/span&gt;
&lt;span class="cp"&gt;#else&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_FILENO 0&lt;/span&gt;
&lt;span class="cp"&gt;#endif&lt;/span&gt;

&lt;span class="cp"&gt;#if defined(HAVE_POSIX_FADVISE) &amp;amp;&amp;amp; HAVE_POSIX_FADVISE&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_POSIX_FADVISE 1&lt;/span&gt;
&lt;span class="cp"&gt;#else&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_POSIX_FADVISE 0&lt;/span&gt;
&lt;span class="cp"&gt;#endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;User interface:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;By default, features are enabled if they can be detected or assumed to be available from the build environment,
    unless &lt;code&gt;MYLIB_NO_DEFAULT_CONFIG&lt;/code&gt; is defined,
    which disables everything by default to allow complete control.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If a symbol like &lt;code&gt;HAVE_SOMETHING&lt;/code&gt; is defined to non-zero,
    then the “something” feature is assumed to be available.
    If it is zero, then the feature is disabled.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Usage in code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;To check for a feature,
    the configuration header must be included,
    and the symbol like &lt;code&gt;USE_SOMETHING&lt;/code&gt; (&lt;em&gt;not&lt;/em&gt; &lt;code&gt;HAVE_SOMETHING&lt;/code&gt;) used as a boolean in an &lt;code&gt;#if&lt;/code&gt; expression, like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;quot;mylib_config.h&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;// [snip]&lt;/span&gt;

&lt;span class="cp"&gt;#if USE_FILENO&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fileno&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;#endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;None of the other configuration symbols described here may be used directly.
    In particular, the configuration header should be the only place in the code that touches &lt;code&gt;HAVE&lt;/code&gt; symbols.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main “trick” here which allows for all of the different configuration “modes” is the use of two “kinds” of symbol:
&lt;code&gt;HAVE&lt;/code&gt; symbols and &lt;code&gt;USE&lt;/code&gt; symbols.
&lt;code&gt;HAVE&lt;/code&gt; symbols are exclusively the interface for the user or build system,
and &lt;code&gt;USE&lt;/code&gt; symbols are the opposite: exclusively for use in the code and never by the user or build system.
This way, use of the configuration header is mandatory for any code that needs configuration.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;USE&lt;/code&gt; symbols are defined to 0 or 1 unconditionally, and code must check them with &lt;code&gt;#if&lt;/code&gt;, not with &lt;code&gt;#ifdef&lt;/code&gt;.
This prevents mistakes, since both forgetting to include the configuration header, and misspelling a symbol, will be caught by compiler warnings.
Tools like &lt;code&gt;include-what-you-use&lt;/code&gt; can also enforce direct inclusion more strictly.&lt;/p&gt;
&lt;p&gt;From the command line, basic usage is typical: define symbols like &lt;code&gt;HAVE_SOMETHING&lt;/code&gt; to enable features.
For complete control over the configuration,
define &lt;code&gt;MYLIB_NO_DEFAULT_CONFIG&lt;/code&gt;,
in which case all features must be explicitly enabled.
This is mainly useful for build systems,
so that all features can be checked for and only those that are found used in the code.
It's also useful for avoiding issues with strange compilers or platforms that aren't supported by the checks.&lt;/p&gt;
&lt;p&gt;I think this design covers all of the above requirements,
and while the header itself can get a bit verbose,
it's relatively straightforward and,
more importantly, &lt;em&gt;usage&lt;/em&gt; of it is simple and resilient to mistakes.&lt;/p&gt;
&lt;p&gt;There is one thing here that isn't caught by tooling though:
misspelling a &lt;code&gt;HAVE&lt;/code&gt; variable will silently not work.
This is a concession to the simple case of just defining a few relevant &lt;code&gt;HAVE&lt;/code&gt; symbols on the command line,
and to keep command lines from the build system as terse as possible.
It is however possible to modify this pattern a bit to catch this potential mistake as well:
require all known &lt;code&gt;HAVE&lt;/code&gt; variables to be defined to 1 or 0,
and check &lt;em&gt;those&lt;/em&gt; with &lt;code&gt;#if&lt;/code&gt; as well in the configuration header itself.
This adds a couple of lines per check to the boilerplate, for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// POSIX.1-2001, Windows: fileno()&lt;/span&gt;
&lt;span class="cp"&gt;#  ifndef HAVE_FILENO&lt;/span&gt;
&lt;span class="cp"&gt;#    if defined(_WIN32) || defined(_POSIX_VERSION) &amp;amp;&amp;amp; _POSIX_VERSION &amp;gt;= 200112L&lt;/span&gt;
&lt;span class="cp"&gt;#      define HAVE_FILENO 1&lt;/span&gt;
&lt;span class="cp"&gt;#    else&lt;/span&gt;
&lt;span class="cp"&gt;#      define HAVE_FILENO 0&lt;/span&gt;
&lt;span class="cp"&gt;#    endif&lt;/span&gt;
&lt;span class="cp"&gt;#  endif&lt;/span&gt;

&lt;span class="c1"&gt;// [snip]&lt;/span&gt;

&lt;span class="cp"&gt;#if HAVE_FILENO&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_FILENO 1&lt;/span&gt;
&lt;span class="cp"&gt;#else&lt;/span&gt;
&lt;span class="cp"&gt;#  define USE_FILENO 0&lt;/span&gt;
&lt;span class="cp"&gt;#endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This way, compiler warnings will catch any mistakes in the build system (because, for example, &lt;code&gt;HAVE_FILENO&lt;/code&gt; isn't defined),
ensuring that everything is explicitly either enabled or disabled.
I'm not sure which style to use.
Potential silent errors in the build system are pretty bad,
but at the same time,
I don't want to sacrifice the ability of the code to be easily compiled “manually”.
It's probably possible to have both,
but I'm not sure how painful the boilerplate cost would be.
I did have the stricter version for a while,
but the extremely verbose compiler command lines were pretty annoying,
so I removed it.
Now, as I write this, I'm second guessing myself, but so it goes.&lt;/p&gt;
&lt;p&gt;Questions for another day, I suppose.
One of the things about programming side quests is that they usually never end.&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="LAD"/></entry><entry><title>C++ Bindings</title><link href="https://drobilla.net/2023/01/22/cpp-bindings.html" rel="alternate"/><published>2023-01-22T23:46:00-05:00</published><updated>2023-01-22T23:46:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2023-01-22:/2023/01/22/cpp-bindings.html</id><content type="html">&lt;p&gt;For some C libraries, I'd like to include “official” C++ bindings to make life
easier for people using them from C++ (which in the audio world, is most).
However, that's not something I know a good pattern for, in terms of project
organization, installation, versioning, and so on.  Figuring one out is a
trickier problem than it may seem at first.&lt;/p&gt;
&lt;p&gt;In the - in this case literally - “C and C++” world, there is a notorious lack
of consistent conventions and best practices in some areas, and this seems to
be one of them.  So, I suppose I will have to suss out the “best” (and least
weird) way myself.  The “best” way should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Provide “official” C++ bindings which are developed, maintained, and
    shipped with the underlying C library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid having the C++ wrapper be locked to the same version as the C library
    (which is a strict semver reflection of the ABI).&lt;/p&gt;
&lt;p&gt;Rationale: It must be possible to develop the C++ bindings, including make
breaking changes, while the C library version (and therefore the ABI) stays
the same.  Otherwise, it would be nearly impossible to change them, because
that'd require changing the version... but the underlying C API version
needs to break as infrequently as possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Isolate the bindings (and “C++ stuff”) from the underlying C library as
    much as possible.  Ensure that builds on systems without a C++ toolchain
    work (this isn't uncommon on minimal or embedded systems which much of this
    software is appropriate for use on).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Avoid making a completely separate new project (repository, test and
    releasing infrastructure, and so on) if at all possible.  The maintenance
    burden would be far too high, and the bindings would be prone to rot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use a simple and predictable naming scheme that works with any “main”
    project name.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poking around repositories and tinkering a little bit, the best practices I can
come up with (for the sort of libraries I'm thinking about anyway), is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Develop and release bindings as a sub-project within the “main” project.&lt;/p&gt;
&lt;p&gt;This is only a “project” in the build system sense.  The bindings are
maintained in the same git repository, and released in the same archive,
as the C library.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Name the bindings sub-project by appending a &lt;code&gt;cpp&lt;/code&gt; suffix, for example,
    &lt;code&gt;mylib-cpp&lt;/code&gt;.  This scheme is... well, not &lt;em&gt;uncommon&lt;/em&gt; (for example, in the
    Debian repositories), and can easily be applied to any name, including
    libraries that already have multi-word names.&lt;/p&gt;
&lt;p&gt;Following &lt;code&gt;meson&lt;/code&gt; requirements, this means the sub-project lives at a path
like &lt;code&gt;subprojects/mylib-cpp&lt;/code&gt; in the repository.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install a separate “package” (for example via &lt;code&gt;pkg-config&lt;/code&gt;) for the
    bindings, which depends on the one for the underlying C library.  The major
    version is appended to both, for example, &lt;code&gt;mylib-cpp-1&lt;/code&gt; might depend on
    &lt;code&gt;mylib-1&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep the C++ bindings themselves as light as possible, and header-only.
    This avoids link-time issues, making C++ API compatibility a compile-time
    issue only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Give the bindings package a separate version number and let it increase as
    necessary.  This version is not aligned with that of the underlying C
    library in any meaningful way.  Technically, a given version of the
    bindings depends on &lt;em&gt;some&lt;/em&gt; version of the C library, but in practice, this
    is always simply the version it's shipped with.&lt;/p&gt;
&lt;p&gt;A strange consequence of this scheme is that the version of the C++
bindings can only drift ever further away, so in the future even major
versions may not correspond at all.  This is a bit weird, but is the only
way to make everything work and be properly versioned.  Effectively, the
version of the bindings is just an implementation detail, something
developers deal with in configuration scripts.  From the perspective of
packagers or users, there is just one version of the library, the version
of the underlying C library - the C++ bindings just may break sometimes,
even within a major version of the project as a whole.&lt;/p&gt;
&lt;p&gt;I can't think of any concrete reason why this could be a problem: the urge
to have shiny “4.0.0” type version bumps across everything at the same time
smells like... marketing, frankly, not engineering.  It does make parallel
installation of different major versions more difficult, though.  Packagers
can split up the installation and make separate packages if they really
want to.  “Upstream” (me) officially doesn't care about parallel
installation of different major versions of the C++ bindings.&lt;/p&gt;
&lt;p&gt;All that said, ideally they happen to stay relatively aligned anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure there is a simple and obvious option to disable C++ entirely,
    leaving a C library package with the broadest compatibility possible.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The short, vibes-based description of all that is something like: there is a
stable and strictly versioned C library with every effort put into long-term
source and binary compatibility, as always... and then there's a C++ bindings
sub-project that tags along with it but is otherwise independent.  The bindings
are more volatile, but it's C++, so they're going to be volatile no matter what
you do anyway.  The bindings project is universally named by tacking a &lt;code&gt;-cpp&lt;/code&gt;
or &lt;code&gt;_cpp&lt;/code&gt; on the end as appropriate in every context: include directories,
package names, and so on.&lt;/p&gt;
&lt;p&gt;So, an installation might look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;include/dostuff-1/dostuff.h
include/dostuff-cpp-4/dostuff.hpp
lib/libdostuff-1.so
lib/libdostuff-1.so.1
lib/libdostuff-1.so.1.2.4
lib/pkgconfig/dostuff-1.pc
lib/pkgconfig/dostuff-cpp-4.pc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In the source code, the bindings and any supporting C++ code is entirely
contained within the subproject, except for a minimal skeleton to handle
compile time options and so on.  This can be more work than a single
heterogeneous project in some ways, less work in others, but overall I think it
has more maintenance benefits.  Importantly, it keeps any new issues or
volatility as far away from the C library as possible, making it easy to see if
a change could possibly break the ABI or the C library at all, for example.&lt;/p&gt;
&lt;p&gt;This scheme may be extended to other languages if that's appropriate.  The
naming scheme for Python is like &lt;code&gt;python-dostuff&lt;/code&gt;.  It probably makes more
sense to maintain Cython wrappers as separate projects maintained in the Python
way (&lt;em&gt;sigh...&lt;/em&gt;), but the whole point of a naming scheme is to have space for
things in case you need them.  In reality, language bindings are usually done
independently by other people in separate projects (Rust folks will use Cargo
in a separate repository, and so on).&lt;/p&gt;
&lt;p&gt;All of this is, obviously, a massively over-thought bikeshed, but adding
multiple programming languages and multiple versioning and compatibility
schemes/philosophies to a project is a bit tricky.  I can't just copy from an
existing best-practice pattern I've been honing for years like I can with
straight C libraries.  This approach seems like it shouldn't cause too much
trouble, though.&lt;/p&gt;
&lt;p&gt;That said, I'm just making this up as I go along and have no experience
maintaining anything quite like this (only more or less homogeneous C or C++
libraries), so feedback is, as always, welcome.  I may revise this post if
anything turns out to be a mistake, so it can ultimately serve as a reference
for the next person trying to figure out how to do “C family” source code
releases right.&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="C"/><category term="Cpp"/><category term="LAD"/></entry><entry><title>Sphinxygen 1.0.0</title><link href="https://drobilla.net/2022/12/08/sphinxygen-1-0-0.html" rel="alternate"/><published>2022-12-08T15:36:00-05:00</published><updated>2022-12-08T15:36:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-12-08:/2022/12/08/sphinxygen-1-0-0.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sphinxygen-1.0.0.tar.gz"&gt;Sphinxygen 1.0.0&lt;/a&gt; has been released.  Sphinxygen is a Python module/script that generates &lt;a href="https://www.sphinx-doc.org/"&gt;Sphinx&lt;/a&gt; markup to describe a C API, from an XML description extracted by &lt;a href="https://doxygen.nl/"&gt;Doxygen&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="Sphinxygen"/></entry><entry><title>Down to the Last Man, Doc!</title><link href="https://drobilla.net/2022/11/30/down-to-the-last-man-doc.html" rel="alternate"/><published>2022-11-30T13:53:00-05:00</published><updated>2022-11-30T13:53:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-11-30:/2022/11/30/down-to-the-last-man-doc.html</id><content type="html">&lt;p&gt;While working through some remaining things in the build/documentation/packaging/infrastructure cleanup phase I've been going through lately,
I noticed that some of the man pages hosted at this domain have become stale
(there was a helpful ticket about one of them, but more or less all of them were out of date).&lt;/p&gt;
&lt;p&gt;I'm still not entirely sure what to do about the general duplication between README files and the neglected home pages I still (barely) maintain here,
but this part struck me as obviously needing to be automated.&lt;/p&gt;
&lt;p&gt;Of course, now that my attention was drawn to them,
I noticed that many of the man pages themselves were in a terrible state.
In recent years I've become more enthusiastic about man pages,
particularly after moving to &lt;a href="https://mandoc.bsd.lv/"&gt;mandoc&lt;/a&gt;.
As a language, &lt;code&gt;mdoc&lt;/code&gt; is dramatically better than the “traditional” man macros (the ones most often used on Linux),
and includes meaningful semantic markup for more or less everything you'll need.
It's still &lt;a href="https://gitlab.com/lv2/lilv/-/blob/main/doc/lv2info.1"&gt;line noise&lt;/a&gt; to write,
but you actually get something for it.
Since it's semantic markup,
it feels like a better investment to me:
superficially ugly, perhaps, but with high fidelity as a portable source material.
Converting &lt;em&gt;from&lt;/em&gt; mandoc to just about anything, I imagine,
could be done automatically easily enough,
if it wasn't already supported by the tool&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;In practice,
I find that the language encourages/enables writing more consistent pages with better formatting,
and &lt;code&gt;mandoc&lt;/code&gt;, unlike &lt;code&gt;groff&lt;/code&gt;,
emits clean and simple HTML pages that can be easily styled with CSS.
It's relatively pleasant to use in general,
and emits sensible error messages that point directly to the problem when you screw something up.
I've also come to appreciate the BSD style of man page more:
the summary is actually a summary,
it's less YELLEY,
and there is a standard for sections and their order.
I may spend most of my time in a GNU/Linux universe,
but BSD got man pages right.
That's not terribly surprising:
BSD culture in general actually likes and cares about man pages.
GNU treated them as an unfortunate legacy to prop up a failed successor (info).
Of course the BSD tooling around man pages is much better.
I tend towards BSD style for command line interfaces anyway,
but you can document GNU-style long options in &lt;code&gt;mdoc&lt;/code&gt; as well.&lt;/p&gt;
&lt;p&gt;So!  If I'm going to be putting energy into man pages,
I might as well convert them to &lt;code&gt;mdoc&lt;/code&gt;.
I think good tooling is very important,
and nice command-line tools with clear and articulate man pages are a part of that.
Unfortunately, neither the LV2 tools themselves nor their documentation have frankly ever been of very high quality.
Addressing this is one of the next themes of upcoming work,
but for now,
simply converting the existing content (with a few touch-ups along the way) is an easy step forward.
It meshes nicely with the “bring all projects in line with a consistent set of ‘modern’ quality standards and automate everything” arc I've been on lately anyway.&lt;/p&gt;
&lt;p&gt;The process of going through all of these has made me realize that I should prioritize the tool work,
because the state of some of these tools is frankly embarrassing,
but, uh,
pay no attention to the &lt;code&gt;man&lt;/code&gt; behind the curtain!
It's a formats and infrastructure kind of day!&lt;/p&gt;
&lt;p&gt;Having manually converted all the pages and checked them in the terminal,
I needed a place to have them automatically updated, converted to HTML, and uploaded.
The (not-really-existing) &lt;a href="https://gitlab.com/lv2/lv2kit"&gt;lv2kit&lt;/a&gt; project is the (not-really) parent of LV2 itself and all the “official” libraries,
so I put it in CI there for the time being.
I don't know what the best organization is for man pages under the LV2 umbrella in the grand scheme of things,
but for now,
this gets things automatically updated and online:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/lv2apply.html"&gt;&lt;code&gt;lv2apply&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/lv2bench.html"&gt;&lt;code&gt;lv2bench&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/lv2info.html"&gt;&lt;code&gt;lv2info&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/lv2ls.html"&gt;&lt;code&gt;lv2ls&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/serdi.html"&gt;&lt;code&gt;serdi&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/sord_validate.html"&gt;&lt;code&gt;sord_validate&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lv2.gitlab.io/lv2kit/man/sordi.html"&gt;&lt;code&gt;sordi&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's possible to build the documentation into a broader HTML page to integrate with toolbars and the like,
but for now these are just complete pages straight out of &lt;code&gt;mandoc&lt;/code&gt;.
I did however write a simple stylesheet to adopt the same colours, fonts, spacing, typography-inspired minimalism, and infamous green links that I use everywhere,
so things at least look reasonably coherent.
I think it looks Good Enough&amp;#8482;,
anyway,
but more relevantly,
if you poke around in the document structure you'll see that the output is, for the most part, sensible semantic markup as well:
lists are lists, sections are sections, different “sorts” of things are given classes, tables aren't abused, and so on.
Everything here, from input to output, is reasonably clear and feels like it has obviously had some care put into it.
The output looks like something a reasonable human might write themselves (if you run it through a formatter, anyway).
I certainly can't say any of that about the equivalent &lt;code&gt;groff&lt;/code&gt;-based monstrosity.
In short, &lt;em&gt;mandoc&lt;/em&gt; is good and you should use it.&lt;/p&gt;
&lt;p&gt;As for these pages,
the future of lv2kit as an “actual” released project is still unclear,
but it is regularly updated (since the libraries rely on it for CI),
so the man pages should never be stale again.
I certainly wouldn't call these &lt;em&gt;good&lt;/em&gt; yet,
but &lt;em&gt;not rotten&lt;/em&gt; is a start!&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;code&gt;mandoc&lt;/code&gt; currently supports emitting &lt;code&gt;ascii&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;man&lt;/code&gt;, &lt;code&gt;markdown&lt;/code&gt;, &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;ps&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt;, and &lt;code&gt;utf8&lt;/code&gt;.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/></entry><entry><title>On the LV2 Stack, Dependencies, and Incrementalism</title><link href="https://drobilla.net/2022/10/15/on-the-lv2-stack-dependencies-and-incrementalism.html" rel="alternate"/><published>2022-10-15T19:07:00-04:00</published><updated>2022-10-15T19:07:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-10-15:/2022/10/15/on-the-lv2-stack-dependencies-and-incrementalism.html</id><content type="html">&lt;p&gt;For quite a while now, 
I've been working on new major versions of the LV2 host stack (&lt;a href="http://gitlab.com/drobilla/serd"&gt;serd&lt;/a&gt;, &lt;a href="http://gitlab.com/drobilla/sord"&gt;sord&lt;/a&gt;, &lt;a href="http://gitlab.com/lv2/sratom"&gt;sratom&lt;/a&gt;, &lt;a href="http://gitlab.com/lv2/suil"&gt;suil&lt;/a&gt;, and &lt;a href="http://gitlab.com/lv2/lilv"&gt;lilv&lt;/a&gt;) while maintaining the current stable versions.
Mainly this is a task of trying to push as many changes back as I can,
without actually breaking any APIs.
Aside from the usual bug fixes and code improvements,
this includes a lot of build system, tooling, and general quality control improvements.
This keeps the divergence low,
so it will be easier to go back and do maintenance on the old versions where necessary.&lt;/p&gt;
&lt;p&gt;At this point, this process is almost done: everything uses meson now,
has a consistent QC regime (high-coverage testing, multi-platform CI, strict compiler warnings, machine formatting, clean clang-tidy configurations, and so on),
most long-standing issues are fixed,
and I'm finally starting to run out of changes that I can do without finally breaking the APIs and releasing new major versions.&lt;/p&gt;
&lt;p&gt;It recently occurred to me, though, that there's one more incremental thing I can do here before “ripping the band-aid off”, so to speak.
In typical low-level C hacker fashion,
I have some things that I just copy around piecemeal from project to project as necessary.
One of those is &lt;a href="http://gitlab.com/drobilla/zix"&gt;zix&lt;/a&gt;,
a simple library of basic data structures and portability wrappers.
This has existed for over a decade,
but I have never released it as a “proper” library.
More dependencies, more problems, but copy-paste code reuse certainly isn't without its own problems.
In this case, I have three projects that use it: sord, lilv, and &lt;a href="http://gitlab.com/drobilla/jalv"&gt;jalv&lt;/a&gt;
(and some other developers have discovered this and taken bits for their own purposes as well).
This has been troublesome from time to time when bugs need fixing,
and depending on how pedantic you are,
might technically be considered a violation of some distributions' policies (notably Debian's).&lt;/p&gt;
&lt;p&gt;Meanwhile, the lack of a common lowest-level dependency for this kind of very boring and generic stuff
(something like the role that glib plays in that ecosystem) has proven increasingly problematic.
There is some sketchy code around that exists solely to work around this “missing” dependency,
and still some questionable use of things to skirt around missing facilities
(for example, jalv has no mutexes).
With the new versions I have in the pipeline,
this problem becomes more acute for several reasons,
so I've decided to release zix and depend on it as a proper released and versioned library,
like all the others.&lt;/p&gt;
&lt;p&gt;This is something that can be done before the new versions though,
and,
like all of the above tooling/etc improvements,
I think it's best to do as much as possible on the current versions before replacing them,
because that process will be painful enough as it is.
My thinking originally was to not add any more libraries until I can take advantage of the solid “subproject” abilities of meson and wrap everything up into a single “lv2kit” to decrease the maintenance and packaging burden,
but now I'm realizing that this isn't very realistic.
For one, it's weird, and weird is bad.
For another, it wouldn't really reduce packaging overhead,
since distributions would surely want to package the individual libraries separately anyway.
The lv2kit idea is still a goal, but pragmatically,
I think it's best to just continue on in the good old “shotgun blast of little libraries” way and deal with that later.&lt;/p&gt;
&lt;p&gt;Concretely, that will look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;serd &amp;lt;--\--- sratom
         --- sord --- lilv --- jalv
zix  &amp;lt;--/------------/--------/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That is, zix will become a thing, and sord, lilv, and jalv will gain it as a dependency.
This will let any issues with packaging or subprojects or whatever get ironed out,
without changing any of the APIs that LV2 hosts use directly whatsoever.&lt;/p&gt;
&lt;p&gt;... and that, I think, is the last non-trivial thing I can do without rocking the boat,
before the fun part where I finally get to change whatever I want in these APIs I hastily banged out over a decade ago now,
and never intended to live this long in the first place.
The dependency tree may get a bit more complicated,
but a whole bunch of other things are going to get wildly simplified in exchange,
which seems like a pretty good deal to me.&lt;/p&gt;
&lt;p&gt;[Edited on 2025-02-16 to update broken links]&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/></entry><entry><title>I Was Told The Crowd Would Have Funding</title><link href="https://drobilla.net/2022/10/15/i-was-told-the-crowd-would-have-funding.html" rel="alternate"/><published>2022-10-15T17:52:00-04:00</published><updated>2022-10-15T17:52:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-10-15:/2022/10/15/i-was-told-the-crowd-would-have-funding.html</id><content type="html">&lt;p&gt;I am, like many an obsessive nerd before me,
terrible at self-promotion and living a healthy and sustainable life in general.
However, as I sit here sick, burnt-out, and slowly going broke while I desperately dump what little energy I have into boring software that mostly benefits other people,
it occurs to me that it might be smart to set up the usual channels for people to support this work,
and mention them here (despite how embarrassing it is to do so).&lt;/p&gt;
&lt;p&gt;It's pretty well-known these days how brutal and thankless it can be to maintain Open Source infrastructure.
While I enjoy what I do around here in a way,
truth be told, I'm not sure I can do it much longer.
In an ideal sense,
my grand plan (as described in some earlier posts) is to get the foundation solid and increase the LV2 “bus factor” so I can return to building user-facing things and tackle some new problems which tends to be more rewarding.
Realistically, though, I may just be cleaning things up and minimizing the maintenance overhead so that I can hand them off or simply abandon them without feeling &lt;em&gt;too&lt;/em&gt; bad about it.
Time will tell, but if any of this helped at all with surviving the ever-skyrocketing cost of living... well, it certainly wouldn't hurt my motivation.&lt;/p&gt;
&lt;p&gt;So!  In addition to the old direct donation and subscription links on my &lt;a href="/pages/support.html"&gt;support&lt;/a&gt; page,
I've set up &lt;a href="https://github.com/sponsors/drobilla"&gt;Github Sponsor&lt;/a&gt; and &lt;a href="https://patreon.com/drobilla"&gt;Patreon&lt;/a&gt; accounts.
If you're reading this, presumably you know about the various projects I author, maintain, or contribute to.
If you use or benefit from any of that and can spare a few bucks,
I'd appreciate any support.
Every little bit really does help.&lt;/p&gt;
&lt;p&gt;[Edited on 2025-02-16 to update broken links]&lt;/p&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/></entry><entry><title>Patchage 1.0.10</title><link href="https://drobilla.net/2022/09/10/patchage-1-0-10.html" rel="alternate"/><published>2022-09-10T00:59:00-04:00</published><updated>2022-09-10T00:59:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-10:/2022/09/10/patchage-1-0-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/patchage-1.0.10.tar.xz"&gt;Patchage 1.0.10&lt;/a&gt; has been released.  Patchage is a modular patch bay for Jack and ALSA based audio/MIDI systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add German translation&lt;/li&gt;
&lt;li&gt;Add Korean translation from Junghee Lee&lt;/li&gt;
&lt;li&gt;Add i18n support&lt;/li&gt;
&lt;li&gt;Replace boost with standard C++17 facilities&lt;/li&gt;
&lt;li&gt;Upgrade to fmt 9.0.0&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Patchage"/></entry><entry><title>Jalv 1.6.8</title><link href="https://drobilla.net/2022/09/10/jalv-1-6-8.html" rel="alternate"/><published>2022-09-10T00:43:00-04:00</published><updated>2022-09-10T00:43:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-10:/2022/09/10/jalv-1-6-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/jalv-1.6.8.tar.xz"&gt;Jalv 1.6.8&lt;/a&gt; has been released.  Jalv (JAck LV2) is a simple host for LV2 plugins.  It runs a plugin, and exposes the plugin ports to the system, essentially making the plugin an application.  For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add Gtk plugin selector UI and desktop file&lt;/li&gt;
&lt;li&gt;Add missing option in console help output&lt;/li&gt;
&lt;li&gt;Add version option to console executable&lt;/li&gt;
&lt;li&gt;Build Qt interface as C++14&lt;/li&gt;
&lt;li&gt;Change no-menu short option to m to avoid clash with jack-name&lt;/li&gt;
&lt;li&gt;Clean up and modernize code&lt;/li&gt;
&lt;li&gt;Fix "preset" console command when "presets" hasn't been called&lt;/li&gt;
&lt;li&gt;Fix MSVC build&lt;/li&gt;
&lt;li&gt;Fix atom buffer alignment&lt;/li&gt;
&lt;li&gt;Fix crash when running jalv without arguments&lt;/li&gt;
&lt;li&gt;Fix man page headers&lt;/li&gt;
&lt;li&gt;Fix memory leaks&lt;/li&gt;
&lt;li&gt;Fix outdated man pages&lt;/li&gt;
&lt;li&gt;Fix spurious transport messages&lt;/li&gt;
&lt;li&gt;Fix thread-safety of plugin/UI communication rings&lt;/li&gt;
&lt;li&gt;Flush stdout after printing control values in console interface&lt;/li&gt;
&lt;li&gt;Print status information consistently to stdout&lt;/li&gt;
&lt;li&gt;Propagate worker errors to the scheduler when possible&lt;/li&gt;
&lt;li&gt;Remove Gtkmm interface&lt;/li&gt;
&lt;li&gt;Remove Qt4 support&lt;/li&gt;
&lt;li&gt;Support both rdfs:label and lv2:name for port group labels&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Sratom 0.6.14</title><link href="https://drobilla.net/2022/09/09/sratom-0-6-14.html" rel="alternate"/><published>2022-09-09T17:29:00-04:00</published><updated>2022-09-09T17:29:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-09:/2022/09/09/sratom-0-6-14.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sratom-0.6.14.tar.xz"&gt;Sratom 0.6.14&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add project metadata&lt;/li&gt;
&lt;li&gt;Adopt REUSE machine-readable licensing standard&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Suil 0.10.18</title><link href="https://drobilla.net/2022/09/09/suil-0-10-18.html" rel="alternate"/><published>2022-09-09T17:29:00-04:00</published><updated>2022-09-09T17:29:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-09:/2022/09/09/suil-0-10-18.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.18.tar.xz"&gt;Suil 0.10.18&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add project metadata&lt;/li&gt;
&lt;li&gt;Adopt REUSE machine-readable licensing standard&lt;/li&gt;
&lt;li&gt;Fix MacOS build when Gtk3 and Qt5 are present without X11&lt;/li&gt;
&lt;li&gt;Fix opening wrapped UIs multiple times in Gtk&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.24.20</title><link href="https://drobilla.net/2022/09/09/lilv-0-24-20.html" rel="alternate"/><published>2022-09-09T17:28:00-04:00</published><updated>2022-09-09T17:28:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-09:/2022/09/09/lilv-0-24-20.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.20.tar.xz"&gt;Lilv 0.24.20&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adopt REUSE machine-readable licensing standard&lt;/li&gt;
&lt;li&gt;Update project metadata&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sord 0.16.14</title><link href="https://drobilla.net/2022/09/09/sord-0-16-14.html" rel="alternate"/><published>2022-09-09T03:07:00-04:00</published><updated>2022-09-09T03:07:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-09:/2022/09/09/sord-0-16-14.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sord-0.16.14.tar.xz"&gt;Sord 0.16.14&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adopt REUSE machine-readable licensing standard&lt;/li&gt;
&lt;li&gt;Allow programs to be used from subproject&lt;/li&gt;
&lt;li&gt;Fix accidentally exposed internal zix symbols&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.30.16</title><link href="https://drobilla.net/2022/09/09/serd-0-30-16.html" rel="alternate"/><published>2022-09-09T03:06:00-04:00</published><updated>2022-09-09T03:06:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-09-09:/2022/09/09/serd-0-30-16.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.16.tar.xz"&gt;Serd 0.30.16&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add SERD_STATIC to pkg-config Cflags for static-only builds&lt;/li&gt;
&lt;li&gt;Adopt REUSE machine-readable licensing standard&lt;/li&gt;
&lt;li&gt;Allow programs to be used from subproject&lt;/li&gt;
&lt;li&gt;Fix spelling mistake in serdi man page&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Meson Features and Packaging</title><link href="https://drobilla.net/2022/08/16/on-meson-features.html" rel="alternate"/><published>2022-08-16T15:42:00-04:00</published><updated>2022-08-16T15:42:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-16:/2022/08/16/on-meson-features.html</id><content type="html">&lt;p&gt;Recently, I have been porting all of the software I maintain to &lt;a href="//mesonbuild.com"&gt;meson&lt;/a&gt;.
For the most part, this has been a nice improvement.
Meson strives to be a generally sensible and coherent build system that addresses the needs of both upstream developers and packagers,
and it shows.  It isn't perfect (like all software), but it's a pretty big improvement over what came before in many ways.&lt;/p&gt;
&lt;p&gt;One disagreement has come up, however, and I think it - at best - betrays a misunderstanding of meson feature options, and - at worst - threatens to effectively destroy their utility entirely for no good reason.
This disagreement originates from &lt;code&gt;arch-meson&lt;/code&gt;, which adds &lt;code&gt;--auto-features=enabled&lt;/code&gt; by default.
This isn't technically &lt;em&gt;wrong&lt;/em&gt;, but it's problematic at scale.
To explain why, I first need to explain how meson feature options work.&lt;/p&gt;
&lt;p&gt;Meson feature options are a better solution to the &lt;code&gt;--enable-this&lt;/code&gt; and &lt;code&gt;--disable-that&lt;/code&gt; style options of autoconf and similar.  They make all the possible states of a feature clear and explicit.  Those states are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;disabled&lt;/code&gt;, which unconditionally disables the feature.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auto&lt;/code&gt;, which enables the feature if possible (typically if dependencies are found).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enabled&lt;/code&gt;, which unconditionally enables the feature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The default value for an option can be any of the three, and is given by the developer in the option definition.
This is a better system because there are three states with clear meanings.
They allow the builder to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ensure that a feature is definitely not included.&lt;/li&gt;
&lt;li&gt;Ask that a feature be included if possible.&lt;/li&gt;
&lt;li&gt;Ensure that a feature is definitely included (failing to configure otherwise).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these states (and desires) are distinct and, importantly, their definitions are not conditional.
There is no “unless” in the definition of &lt;code&gt;disabled&lt;/code&gt; or &lt;code&gt;enabled&lt;/code&gt;,
and adding one would destroy their utility.
It's not “enabled unless someone &lt;em&gt;feels&lt;/em&gt; like it's fine to disable”, it's just “enabled”.&lt;/p&gt;
&lt;p&gt;Concretely, for &lt;code&gt;enabled&lt;/code&gt; in particular, this means that, as a builder of whatever meson project, you can:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;meson setup build -Dsomething=enabled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, you know that if configuration succeeded, the &lt;code&gt;something&lt;/code&gt; feature is enabled.
This is important.
It is also &lt;em&gt;the only way&lt;/em&gt; to reliably/mechanically ensure that a build contains a feature.
“Destroying” it (as something meson users can generally expect) would therefore mean that there &lt;em&gt;there is no way&lt;/em&gt; to ensure that a build contains a feature in general.
Surely everyone - especially packagers - can agree that's bad.&lt;/p&gt;
&lt;p&gt;Hopefully that's a decent enough explanation of why meson feature options are a good, coherent, and reliable system.&lt;/p&gt;
&lt;p&gt;What's the problem then?
Well, there is that convenience option, &lt;code&gt;--auto-features=enabled&lt;/code&gt;,
which enables all features for convenience.
This allows the builder to override the developer-chosen defaults,
and force the build script to be explicit about all non-enabled features.
This is, again, not technically wrong, and is indeed convenient at times.&lt;/p&gt;
&lt;p&gt;The problem is more of a social one.
Because Arch chose to make this the default (unlike most other distributions, as far as I can tell),
people have apparently adopted the mentality that &lt;code&gt;--auto-features=enabled&lt;/code&gt; not building is an upstream bug.
It isn't.
The shorthand &lt;code&gt;--auto-features&lt;/code&gt; is just that - a shorthand for enabling all features.
It is equivalent to explicitly enabling every feature independently,
so doing so is quite literally &lt;em&gt;asking&lt;/em&gt; for the build to fail if &lt;code&gt;any&lt;/code&gt; feature is not present.&lt;/p&gt;
&lt;p&gt;Where this gets weird is when features seem unlikely,
or even impossible,
to build on a given system.
The bug filed against my project was about Cocoa on Linux.
I get it, Cocoa is &lt;em&gt;mostly&lt;/em&gt; a MacOS thing, and is &lt;em&gt;almost certainly&lt;/em&gt; unavailable elsewhere,
but my argument is that this doesn't matter at all.
Even if it were literally impossible for Cocoa to exist on top of, say, FreeBSD somewhere (which it isn't, and cross-compiling is a thing anyway),
it still wouldn't matter.
A similar case can be made for optional dependencies that are not publicly available at all (something I have done in the past).
Feature options working as expected in general is much more important than any of this subjective case-specific thinking.&lt;/p&gt;
&lt;p&gt;“This doesn't work for me, so the package should not build when this feature is enabled” is not a good argument,
regardless of &lt;em&gt;why&lt;/em&gt; it doesn't work.
It doesn't matter if you imagine a feature “can't” be built on some system
(anyone who has been in this game long enough should be able to see where that slippery slope leads...).
The power of feature options depend on the states meaning just what they say,
and making &lt;code&gt;enabled&lt;/code&gt; &lt;em&gt;sometimes&lt;/em&gt; effectively equivalent to &lt;code&gt;auto&lt;/code&gt; destroys that power.
There's not really any point in using features at that point,
you might as well just use a boolean flag.&lt;/p&gt;
&lt;p&gt;Put another way, the proposed “fix” here would make it so that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;meson setup build -Dsomething=enabled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Can successfully configure, but &lt;em&gt;without&lt;/em&gt; the &lt;code&gt;something&lt;/code&gt; feature being included.
Et voila, we've made the feature states effectively meaningless.
&lt;em&gt;That&lt;/em&gt; would be a bug, and letting this mentality take over would resign us back to manually wading through logs to see if what we asked for &lt;em&gt;actually&lt;/em&gt; happened.&lt;/p&gt;
&lt;p&gt;It's also worth noting that feature options are deeply integrated all over the place in meson,
for example, you can pass them to as “required” parameters and the right thing will happen.
Diluting the meaning of &lt;code&gt;enabled&lt;/code&gt; would cause deeper problems than the builder-visible ones explained here.
What does it even mean for a feature to be enabled, except not &lt;em&gt;actually&lt;/em&gt; enabled,
when that feature status is being used to dictate that another dependency is required?
Everything falls apart.
The feature option system, when used as intended, is designed well,
but messing around with the meaning of &lt;code&gt;enabled&lt;/code&gt; like this ruins it.
I don't think it's hyperbole to say it “destroys” the whole thing:
it turns a sensible and coherent system into some confused boolean,
which is both objectively less powerful, and, well... confusing.&lt;/p&gt;
&lt;p&gt;This may seem trivial when you're zoomed in to a single project or handful of options,
but globally it is a much bigger deal than it might seem at first.
Even in my relatively tidy third-party source directory,
there's nearly a &lt;em&gt;thousand&lt;/em&gt; meson options.
I can't imagine how many there are globally.
The basic way that features work can't depend on the builder understanding details about every single option,
that would be a complete disaster.
It is crucial that &lt;code&gt;disabled&lt;/code&gt; and &lt;code&gt;enabled&lt;/code&gt; mean exactly what they say, always.&lt;/p&gt;
&lt;p&gt;I have never seen this problem come up from a user configuring the project themselves.
Presumably, people realize that explicitly requesting a potentially failed build,
then complaining that it did what they ask,
is... rather silly.
This gets obscured when a tool (&lt;code&gt;arch-meson&lt;/code&gt;) does it automatically,
but remains just as silly.
It makes no difference from the perspective of a meson package or its maintainer:
by enabling all features, the builder has &lt;em&gt;explicitly requested&lt;/em&gt; ignoring the defaults and failing to build if &lt;em&gt;any feature&lt;/em&gt; was not present.&lt;/p&gt;
&lt;p&gt;Yet, here we are, with upstream developers getting “bug” reports &lt;em&gt;for feature options working exactly how they are supposed to work&lt;/em&gt;.
This, unfortunately, means that Arch is putting toxic pressure on the meson ecosystem,
pushing upstream developers to make things objectively worse.&lt;/p&gt;
&lt;p&gt;I don't know what the solution to that is, and I'm not an Arch developer (though I'm typing this on an Arch-derived distribution and have nothing in particular against it).
Breaking all the existing packages that use &lt;code&gt;arch-meson&lt;/code&gt; is probably not going to happen,
but perhaps improving the documentation would be good enough.&lt;/p&gt;
&lt;p&gt;All I know is that &lt;code&gt;--auto-features=enabled&lt;/code&gt; not building is &lt;em&gt;very definitely&lt;/em&gt; not a bug.
Quite the opposite, that is &lt;em&gt;literally the whole point&lt;/em&gt; of feature options.
If there's something out there that's leading people to thinking that enabled features not building is a bug,
then it is misleading people in a bad way,
and needs to be fixed.&lt;/p&gt;</content><category term="misc"/><category term="Hacking"/><category term="Software"/><category term="LAD"/></entry><entry><title>MDA.lv2 1.2.10</title><link href="https://drobilla.net/2022/08/13/mda-lv2-1-2-10.html" rel="alternate"/><published>2022-08-13T23:50:00-04:00</published><updated>2022-08-13T23:50:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/mda-lv2-1-2-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/mda-lv2-1.2.10.tar.xz"&gt;MDA.lv2 1.2.10&lt;/a&gt; has been released.  This is a port of the MDA VST plugins to LV2.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix preset installation&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="MDA.lv2"/></entry><entry><title>Raul 2.0.0</title><link href="https://drobilla.net/2022/08/13/raul-2-0-0.html" rel="alternate"/><published>2022-08-13T22:40:00-04:00</published><updated>2022-08-13T22:40:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/raul-2-0-0.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/raul-2.0.0.tar.xz"&gt;Raul 2.0.0&lt;/a&gt; has been released.  Raul (Realtime Audio Utility Library) is a header-only C++ utility library for real-time audio applications.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add INSTALL.md file&lt;/li&gt;
&lt;li&gt;Add managed_ptr for automatic real-time safe garbage collection&lt;/li&gt;
&lt;li&gt;Fix semaphore with initial count on Darwin&lt;/li&gt;
&lt;li&gt;Implement Semaphore for Windows&lt;/li&gt;
&lt;li&gt;Improve RingBuffer&lt;/li&gt;
&lt;li&gt;Improve test suite&lt;/li&gt;
&lt;li&gt;Make namespace name lowercase&lt;/li&gt;
&lt;li&gt;Remove OSC and RDF library dependent code&lt;/li&gt;
&lt;li&gt;Remove TimeSlice and TimeStamp&lt;/li&gt;
&lt;li&gt;Remove URI class&lt;/li&gt;
&lt;li&gt;Remove boost dependency&lt;/li&gt;
&lt;li&gt;Remove features now provided by C++11&lt;/li&gt;
&lt;li&gt;Remove glib dependency&lt;/li&gt;
&lt;li&gt;Remove remaining library code, now header only&lt;/li&gt;
&lt;li&gt;Remove several questionable classes&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;li&gt;Update license to GPL3+&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Raul"/></entry><entry><title>Patchage 1.0.8</title><link href="https://drobilla.net/2022/08/13/patchage-1-0-8.html" rel="alternate"/><published>2022-08-13T22:15:00-04:00</published><updated>2022-08-13T22:15:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/patchage-1-0-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/patchage-1.0.8.tar.xz"&gt;Patchage 1.0.8&lt;/a&gt; has been released.  Patchage is a modular patch bay for Jack and ALSA based audio/MIDI systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch to C++17 and modernize code&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Patchage"/></entry><entry><title>Ganv 1.8.2</title><link href="https://drobilla.net/2022/08/13/ganv-1-8-2.html" rel="alternate"/><published>2022-08-13T22:12:00-04:00</published><updated>2022-08-13T22:12:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/ganv-1-8-2.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/ganv-1.8.2.tar.xz"&gt;Ganv 1.8.2&lt;/a&gt; has been released.  Ganv is an interactive Gtk canvas widget for graph-based interfaces (patchers, modular synthesizers, finite state automata, interactive graphs, etc). For more information, see &lt;a href="http://drobilla.net/software/ganv"&gt;http://drobilla.net/software/ganv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Ganv"/></entry><entry><title>BLOP.lv2 1.0.4</title><link href="https://drobilla.net/2022/08/13/blop-lv2-1-0-4.html" rel="alternate"/><published>2022-08-13T20:56:00-04:00</published><updated>2022-08-13T20:56:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/blop-lv2-1-0-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/blop-lv2-1.0.4.tar.xz"&gt;BLOP.lv2 1.0.4&lt;/a&gt; has been released.  BLOP.lv2 is a port of the BLOP LADSPA plugins by Mike Rawes to LV2.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add default values for controls&lt;/li&gt;
&lt;li&gt;Add missing port metadata&lt;/li&gt;
&lt;li&gt;Add option accessors&lt;/li&gt;
&lt;li&gt;Fix pulse and sync_pulse option interfaces&lt;/li&gt;
&lt;li&gt;Fix quantiser mode scale points&lt;/li&gt;
&lt;li&gt;Remove invalid port type&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Blop.lv2"/></entry><entry><title>MDA.lv2 1.2.8</title><link href="https://drobilla.net/2022/08/13/mda-lv2-1-2-8.html" rel="alternate"/><published>2022-08-13T20:51:00-04:00</published><updated>2022-08-13T20:51:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/mda-lv2-1-2-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/mda-lv2-1.2.8.tar.xz"&gt;MDA.lv2 1.2.8&lt;/a&gt; has been released.  This is a port of the MDA VST plugins to LV2.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add REUSE licensing metadata&lt;/li&gt;
&lt;li&gt;Add lv2lint test&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="MDA.lv2"/></entry><entry><title>Fomp.lv2 1.2.4</title><link href="https://drobilla.net/2022/08/13/fomp-1-2-4.html" rel="alternate"/><published>2022-08-13T20:43:00-04:00</published><updated>2022-08-13T20:43:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-13:/2022/08/13/fomp-1-2-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/fomp-1.2.4.tar.xz"&gt;Fomp.lv2 1.2.4&lt;/a&gt; has been released.  Fomp is an LV2 port of the MCP, VCO, FIL, and WAH plugins by Fons Adriaensen.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add lv2lint test&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Fomp.lv2"/></entry><entry><title>Suil 0.10.16</title><link href="https://drobilla.net/2022/08/12/suil-0-10-16.html" rel="alternate"/><published>2022-08-12T22:17:00-04:00</published><updated>2022-08-12T22:17:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-12:/2022/08/12/suil-0-10-16.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.16.tar.xz"&gt;Suil 0.10.16&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix wrapper module installation path&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.24.18</title><link href="https://drobilla.net/2022/08/12/lilv-0-24-18.html" rel="alternate"/><published>2022-08-12T22:15:00-04:00</published><updated>2022-08-12T22:15:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-08-12:/2022/08/12/lilv-0-24-18.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.24.18.tar.xz"&gt;Lilv 0.24.18&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow programs to be used from subproject&lt;/li&gt;
&lt;li&gt;Fix default LV2_PATH&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Lilv 0.24.16</title><link href="https://drobilla.net/2022/07/19/lilv-0-24-16.html" rel="alternate"/><published>2022-07-19T01:16:00-04:00</published><updated>2022-07-19T01:16:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-07-19:/2022/07/19/lilv-0-24-16.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/lilv-0.24.16.tar.xz"&gt;Lilv 0.24.16&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix fallback flock() detection on MacOS&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Suil 0.10.14</title><link href="https://drobilla.net/2022/07/19/suil-0-10-14.html" rel="alternate"/><published>2022-07-19T01:14:00-04:00</published><updated>2022-07-19T01:14:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-07-19:/2022/07/19/suil-0-10-14.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/suil-0.10.14.tar.xz"&gt;Suil 0.10.14&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix MacOS build&lt;/li&gt;
&lt;li&gt;Fix documentation install path&lt;/li&gt;
&lt;li&gt;Remove dead Qt4 support code&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Sratom 0.6.12</title><link href="https://drobilla.net/2022/07/19/sratom-0-6-12.html" rel="alternate"/><published>2022-07-19T01:13:00-04:00</published><updated>2022-07-19T01:13:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-07-19:/2022/07/19/sratom-0-6-12.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sratom-0.6.12.tar.xz"&gt;Sratom 0.6.12&lt;/a&gt; has been released.  Sratom is a small library for serializing LV2 atoms.  Sratom reads/writes atoms from/to RDF, allowing them to be converted between binary and text or stored in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.12</title><link href="https://drobilla.net/2022/07/17/sord-0-16-12.html" rel="alternate"/><published>2022-07-17T21:22:00-04:00</published><updated>2022-07-17T21:22:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-07-17:/2022/07/17/sord-0-16-12.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/sord-0.16.12.tar.xz"&gt;Sord 0.16.12&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix various warnings&lt;/li&gt;
&lt;li&gt;Switch to meson build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.30.14</title><link href="https://drobilla.net/2022/07/10/serd-0-30-14.html" rel="alternate"/><published>2022-07-10T16:58:00-04:00</published><updated>2022-07-10T16:58:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-07-10:/2022/07/10/serd-0-30-14.html</id><content type="html">&lt;p&gt;&lt;a href="https://download.drobilla.net/serd-0.30.14.tar.xz"&gt;Serd 0.30.14&lt;/a&gt; has been released.  Serd is a lightweight C library for working with RDF data.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix memory consumption when reading documents&lt;/li&gt;
&lt;li&gt;Switch to Meson build system&lt;/li&gt;
&lt;li&gt;Update README and project metadata&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Patchage 1.0.6</title><link href="https://drobilla.net/2022/05/27/patchage-1-0-6.html" rel="alternate"/><published>2022-05-27T03:08:00-04:00</published><updated>2022-05-27T03:08:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-27:/2022/05/27/patchage-1-0-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/patchage-1.0.6.tar.bz2"&gt;Patchage 1.0.6&lt;/a&gt; has been released.  Patchage is a modular patch bay for Jack and ALSA based audio/MIDI systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix ALSA sequencer port subscriptions&lt;/li&gt;
&lt;li&gt;Fix crash on client disconnection&lt;/li&gt;
&lt;li&gt;Fix initial display with no configuration file&lt;/li&gt;
&lt;li&gt;Fix various minor bugs&lt;/li&gt;
&lt;li&gt;Rework code architecture to be more decoupled and data-driven&lt;/li&gt;
&lt;li&gt;Save "human names" setting in configuration&lt;/li&gt;
&lt;li&gt;Show latency in toolbar with 2 decimal places&lt;/li&gt;
&lt;li&gt;Switch to C++14&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Patchage"/></entry><entry><title>Suil 0.10.12</title><link href="https://drobilla.net/2022/05/27/suil-0-10-12.html" rel="alternate"/><published>2022-05-27T01:43:00-04:00</published><updated>2022-05-27T01:43:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-27:/2022/05/27/suil-0-10-12.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.12.tar.bz2"&gt;Suil 0.10.12&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix build issues with newer toolchains&lt;/li&gt;
&lt;li&gt;Fix some compiler warnings&lt;/li&gt;
&lt;li&gt;Remove Qt4 support&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.24.14</title><link href="https://drobilla.net/2022/05/27/lilv-0-24-14.html" rel="alternate"/><published>2022-05-27T01:38:00-04:00</published><updated>2022-05-27T01:38:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-27:/2022/05/27/lilv-0-24-14.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.14.tar.bz2"&gt;Lilv 0.24.14&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix build issues with newer toolchains&lt;/li&gt;
&lt;li&gt;Fix unused parameter warnings&lt;/li&gt;
&lt;li&gt;Update zix tree&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sratom 0.6.10</title><link href="https://drobilla.net/2022/05/26/sratom-0-6-10.html" rel="alternate"/><published>2022-05-26T23:27:00-04:00</published><updated>2022-05-26T23:27:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-26:/2022/05/26/sratom-0-6-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sratom-0.6.10.tar.bz2"&gt;Sratom 0.6.10&lt;/a&gt; has been released.  Sratom is a small library for serialising LV2 atoms to and from RDF, for converting between binary and text or storing in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix documentation installation directory&lt;/li&gt;
&lt;li&gt;Fix potential blank node ID truncation&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.10</title><link href="https://drobilla.net/2022/05/26/sord-0-16-10.html" rel="alternate"/><published>2022-05-26T23:22:00-04:00</published><updated>2022-05-26T23:22:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-26:/2022/05/26/sord-0-16-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sord-0.16.10.tar.bz2"&gt;Sord 0.16.10&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix Windows build&lt;/li&gt;
&lt;li&gt;Fix potential crash or incorrectness issue with GCC 10 again&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.30.12</title><link href="https://drobilla.net/2022/05/26/serd-0-30-12.html" rel="alternate"/><published>2022-05-26T22:47:00-04:00</published><updated>2022-05-26T22:47:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2022-05-26:/2022/05/26/serd-0-30-12.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.12.tar.bz2"&gt;Serd 0.30.12&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix warnings and build issues with clang 13 and VS 2019&lt;/li&gt;
&lt;li&gt;Fix writing long literals with triple quotes&lt;/li&gt;
&lt;li&gt;Improve documentation style&lt;/li&gt;
&lt;li&gt;Support combining several BSD-style command line flags in serdi&lt;/li&gt;
&lt;li&gt;Write statements with invalid URI characters in lax mode&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Serd 0.30.10</title><link href="https://drobilla.net/2021/01/20/serd-0-30-10.html" rel="alternate"/><published>2021-01-20T15:55:00-05:00</published><updated>2021-01-20T15:55:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-20:/2021/01/20/serd-0-30-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.10.tar.bz2"&gt;Serd 0.30.10&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add fallback configuration if documentation theme is unavailable&lt;/li&gt;
&lt;li&gt;Fix SERD_DISABLE_DEPRECATED&lt;/li&gt;
&lt;li&gt;Fix building for older MacOS versions on newer MacOS&lt;/li&gt;
&lt;li&gt;Fix documentation installation directory&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Ganv 1.8.0</title><link href="https://drobilla.net/2021/01/07/ganv-1-8-0.html" rel="alternate"/><published>2021-01-07T22:38:00-05:00</published><updated>2021-01-07T22:38:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/ganv-1-8-0.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/ganv-1.8.0.tar.bz2"&gt;Ganv 1.8.0&lt;/a&gt; has been released.  Ganv is an interactive Gtk canvas widget for graph-based interfaces (patchers, modular synthesizers, finite state automata, interactive graphs, etc). For more information, see &lt;a href="http://drobilla.net/software/ganv"&gt;http://drobilla.net/software/ganv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expand canvas automatically to fit nodes&lt;/li&gt;
&lt;li&gt;Fix various compiler warnings&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Ganv"/></entry><entry><title>Jalv 1.6.6</title><link href="https://drobilla.net/2021/01/07/jalv-1-6-6.html" rel="alternate"/><published>2021-01-07T22:05:00-05:00</published><updated>2021-01-07T22:05:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/jalv-1-6-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/jalv-1.6.6.tar.bz2"&gt;Jalv 1.6.6&lt;/a&gt; has been released.  Jalv is a simple but fully featured LV2 host for Jack which exposes plugin ports to Jack, essentially making any LV2 plugin function as a Jack application. For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a command line argument to select a specific UI&lt;/li&gt;
&lt;li&gt;Explicitly support lv2:inPlaceBroken&lt;/li&gt;
&lt;li&gt;Ignore ports with nonsense lv2:control designations&lt;/li&gt;
&lt;li&gt;Remove Jack session support&lt;/li&gt;
&lt;li&gt;Support port events for ui:showInterface UIs&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Patchage 1.0.4</title><link href="https://drobilla.net/2021/01/07/patchage-1-0-4.html" rel="alternate"/><published>2021-01-07T21:59:00-05:00</published><updated>2021-01-07T21:59:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/patchage-1-0-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/patchage-1.0.4.tar.bz2"&gt;Patchage 1.0.4&lt;/a&gt; has been released.  Patchage is a modular patch bay for Jack and ALSA based audio/MIDI systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add NSMicrophoneUsageDescription for MacOS 10.15 Catalina&lt;/li&gt;
&lt;li&gt;Add command line option to print version&lt;/li&gt;
&lt;li&gt;Fix making and breaking connections with Jack DBus&lt;/li&gt;
&lt;li&gt;Fix sample rate with Jack DBus&lt;/li&gt;
&lt;li&gt;Fix unstable module positions&lt;/li&gt;
&lt;li&gt;Improve man page&lt;/li&gt;
&lt;li&gt;Remove Jack session support&lt;/li&gt;
&lt;li&gt;Remove flaky DSP load meter&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Patchage"/></entry><entry><title>Lilv 0.24.12</title><link href="https://drobilla.net/2021/01/07/lilv-0-24-12.html" rel="alternate"/><published>2021-01-07T21:46:00-05:00</published><updated>2021-01-07T21:46:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/lilv-0-24-12.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.12.tar.bz2"&gt;Lilv 0.24.12&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow connecting ports to structures in Python&lt;/li&gt;
&lt;li&gt;Fix potential memory error when joining filesystem paths&lt;/li&gt;
&lt;li&gt;Fix saving state with files on Windows&lt;/li&gt;
&lt;li&gt;Fix unlikely undefined behavior when saving state&lt;/li&gt;
&lt;li&gt;Fix writing state manifests on Windows&lt;/li&gt;
&lt;li&gt;Remove the need for a generated configuration header&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Suil 0.10.10</title><link href="https://drobilla.net/2021/01/07/suil-0-10-10.html" rel="alternate"/><published>2021-01-07T21:40:00-05:00</published><updated>2021-01-07T21:40:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/suil-0-10-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.10.tar.bz2"&gt;Suil 0.10.10&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean up minor code issues&lt;/li&gt;
&lt;li&gt;Remove the need for a generated configuration header&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Sratom 0.6.8</title><link href="https://drobilla.net/2021/01/07/sratom-0-6-8.html" rel="alternate"/><published>2021-01-07T21:36:00-05:00</published><updated>2021-01-07T21:36:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/sratom-0-6-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sratom-0.6.8.tar.bz2"&gt;Sratom 0.6.8&lt;/a&gt; has been released.  Sratom is a small library for serialising LV2 atoms to and from RDF, for converting between binary and text or storing in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix potential null pointer dereference&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Sord 0.16.8</title><link href="https://drobilla.net/2021/01/07/sord-0-16-8.html" rel="alternate"/><published>2021-01-07T21:33:00-05:00</published><updated>2021-01-07T21:33:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/sord-0-16-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sord-0.16.8.tar.bz2"&gt;Sord 0.16.8&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean up code&lt;/li&gt;
&lt;li&gt;Fix potential undefined behavior&lt;/li&gt;
&lt;li&gt;Fix potentially incorrect search results&lt;/li&gt;
&lt;li&gt;Remove the need for a generated configuration header&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.30.8</title><link href="https://drobilla.net/2021/01/07/serd-0-30-8.html" rel="alternate"/><published>2021-01-07T21:19:00-05:00</published><updated>2021-01-07T21:19:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2021-01-07:/2021/01/07/serd-0-30-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.8.tar.bz2"&gt;Serd 0.30.8&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deprecate serd_uri_to_path()&lt;/li&gt;
&lt;li&gt;Don't install API man pages&lt;/li&gt;
&lt;li&gt;Fix potential memory error when serialising URIs&lt;/li&gt;
&lt;li&gt;Move headers to an include directory&lt;/li&gt;
&lt;li&gt;Refuse to write relative URI references to NTriples&lt;/li&gt;
&lt;li&gt;Remove the need for a generated configuration header&lt;/li&gt;
&lt;li&gt;Remove use of C character class functions that may use locale&lt;/li&gt;
&lt;li&gt;Split up and reorganize unit tests&lt;/li&gt;
&lt;li&gt;Use aligned allocation via C11 or Windows API where possible&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Sratom 0.6.6</title><link href="https://drobilla.net/2020/09/27/sratom-0-6-6.html" rel="alternate"/><published>2020-09-27T15:18:00-04:00</published><updated>2020-09-27T15:18:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-09-27:/2020/09/27/sratom-0-6-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sratom-0.6.6.tar.bz2"&gt;Sratom 0.6.6&lt;/a&gt; has been released.  Sratom is a small library for serialising LV2 atoms to and from RDF, for converting between binary and text or storing in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix various minor warnings and other code quality issues&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Suil 0.10.8</title><link href="https://drobilla.net/2020/09/27/suil-0-10-8.html" rel="alternate"/><published>2020-09-27T12:22:00-04:00</published><updated>2020-09-27T12:22:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-09-27:/2020/09/27/suil-0-10-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.8.tar.bz2"&gt;Suil 0.10.8&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix X11 in Gtk size regressions (thanks Robin Gareus)&lt;/li&gt;
&lt;li&gt;Fix compilation on MacOS older than 10.12&lt;/li&gt;
&lt;li&gt;Fix drag and drop for X11 in Gtk&lt;/li&gt;
&lt;li&gt;Fix various minor warnings and other code quality issues&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Lilv 0.24.10</title><link href="https://drobilla.net/2020/09/27/lilv-0-24-10.html" rel="alternate"/><published>2020-09-27T12:17:00-04:00</published><updated>2020-09-27T12:17:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-09-27:/2020/09/27/lilv-0-24-10.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.10.tar.bz2"&gt;Lilv 0.24.10&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix memory leaks in lv2bench&lt;/li&gt;
&lt;li&gt;Fix various minor warnings and other code quality issues&lt;/li&gt;
&lt;li&gt;Make lilv_world_get() use translations&lt;/li&gt;
&lt;li&gt;Split and clean up test suite&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Sord 0.16.6</title><link href="https://drobilla.net/2020/09/27/sord-0-16-6.html" rel="alternate"/><published>2020-09-27T11:08:00-04:00</published><updated>2020-09-27T11:08:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-09-27:/2020/09/27/sord-0-16-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sord-0.16.6.tar.bz2"&gt;Sord 0.16.6&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix potential crash or incorrectness issues with GCC 10&lt;/li&gt;
&lt;li&gt;Fix various minor warnings and other code quality issues&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Serd 0.30.6</title><link href="https://drobilla.net/2020/09/27/serd-0-30-6.html" rel="alternate"/><published>2020-09-27T10:51:00-04:00</published><updated>2020-09-27T10:51:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-09-27:/2020/09/27/serd-0-30-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.6.tar.bz2"&gt;Serd 0.30.6&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix various minor warnings and other code quality issues&lt;/li&gt;
&lt;li&gt;Improve reader error handling&lt;/li&gt;
&lt;li&gt;Make all free functions tolerant of NULL&lt;/li&gt;
&lt;li&gt;Parse prefixed names more strictly&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Serd 0.30.4</title><link href="https://drobilla.net/2020/04/26/serd-0-30-4.html" rel="alternate"/><published>2020-04-26T16:04:00-04:00</published><updated>2020-04-26T16:04:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-04-26:/2020/04/26/serd-0-30-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.4.tar.bz2"&gt;Serd 0.30.4&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix EOF handling while reading in bulk or from strings&lt;/li&gt;
&lt;li&gt;Fix lax handling of string errors&lt;/li&gt;
&lt;li&gt;Fix reading from a null-delimited socket&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Lilv 0.24.8</title><link href="https://drobilla.net/2020/04/26/lilv-0-24-8.html" rel="alternate"/><published>2020-04-26T15:55:00-04:00</published><updated>2020-04-26T15:55:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-04-26:/2020/04/26/lilv-0-24-8.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.8.tar.bz2"&gt;Lilv 0.24.8&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allow passing strings for URIs in Python API when unambiguous&lt;/li&gt;
&lt;li&gt;Fix cases where incorrect translation is used&lt;/li&gt;
&lt;li&gt;Fix deleting state bundles loaded from the model&lt;/li&gt;
&lt;li&gt;Fix memory leak when dyn-manifest has no plugins (thanks Michael Fisher)&lt;/li&gt;
&lt;li&gt;Implement state:freePath feature&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Patchage 1.0.2</title><link href="https://drobilla.net/2020/04/09/patchage-1-0-2.html" rel="alternate"/><published>2020-04-09T12:29:00-04:00</published><updated>2020-04-09T12:29:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-04-09:/2020/04/09/patchage-1-0-2.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/patchage-1.0.2.tar.bz2"&gt;Patchage 1.0.2&lt;/a&gt; has been released.  Patchage is a modular patch bay for Jack and ALSA based audio/MIDI systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for exporting canvas as PDF&lt;/li&gt;
&lt;li&gt;Bring back Jack buffer size selector&lt;/li&gt;
&lt;li&gt;Configure based on compiler target OS for cross-compilation&lt;/li&gt;
&lt;li&gt;Don't install 512x512 icons&lt;/li&gt;
&lt;li&gt;Fix compilation with Jack DBus&lt;/li&gt;
&lt;li&gt;Order ports deterministically&lt;/li&gt;
&lt;li&gt;Restore messages pane visibility and height&lt;/li&gt;
&lt;li&gt;Save window size and position when closed via window manager&lt;/li&gt;
&lt;li&gt;Style messages pane to match canvas&lt;/li&gt;
&lt;li&gt;Support Jack CV and OSC via metadata&lt;/li&gt;
&lt;li&gt;Upgrade to waf 2.0.19&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Patchage"/></entry><entry><title>Ganv 1.6.0</title><link href="https://drobilla.net/2020/04/09/ganv-1-6-0.html" rel="alternate"/><published>2020-04-09T11:45:00-04:00</published><updated>2020-04-09T11:45:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2020-04-09:/2020/04/09/ganv-1-6-0.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/ganv-1.6.0.tar.bz2"&gt;Ganv 1.6.0&lt;/a&gt; has been released.  Ganv is an interactive Gtk canvas widget for graph-based interfaces (patchers, modular synthesizers, finite state automata, interactive graphs, etc). For more information, see &lt;a href="http://drobilla.net/software/ganv"&gt;http://drobilla.net/software/ganv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add API to specify module port order.&lt;/li&gt;
&lt;li&gt;Add support for PDF and PS export.&lt;/li&gt;
&lt;li&gt;Add support for beveled box corners.&lt;/li&gt;
&lt;li&gt;Add support for edges that do not constrain the layout.&lt;/li&gt;
&lt;li&gt;Dampen sprung layout energy over time to prevent oscillation.&lt;/li&gt;
&lt;li&gt;Distinguish edge color from port color slighly.&lt;/li&gt;
&lt;li&gt;Fix compilation with --no-fdgl (patch from Vlad Glagolev).&lt;/li&gt;
&lt;li&gt;Fix crash when destroying canvas.&lt;/li&gt;
&lt;li&gt;Fix port position on modules with embedded widgets.&lt;/li&gt;
&lt;li&gt;Fix positioning of embedded widgets when changing layout.&lt;/li&gt;
&lt;li&gt;Fix size of vertical flow modules.&lt;/li&gt;
&lt;li&gt;Fix unexpected node jumping when dragging new connections.&lt;/li&gt;
&lt;li&gt;Fix various minor visual alignment/sizing issues.&lt;/li&gt;
&lt;li&gt;Highlight connected edges on port hover.&lt;/li&gt;
&lt;li&gt;Improve appearance of graphs with circle nodes.&lt;/li&gt;
&lt;li&gt;Improve text rendering at high zoom.&lt;/li&gt;
&lt;li&gt;Improve update performance.&lt;/li&gt;
&lt;li&gt;Preserve selection for quickly making several connections.&lt;/li&gt;
&lt;li&gt;Upgrade to waf 2.0.19&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="Ganv"/></entry><entry><title>Jalv 1.6.4</title><link href="https://drobilla.net/2019/11/10/jalv-1-6-4.html" rel="alternate"/><published>2019-11-10T21:56:00-05:00</published><updated>2019-11-10T21:56:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-11-10:/2019/11/10/jalv-1-6-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/jalv-1.6.4.tar.bz2"&gt;Jalv 1.6.4&lt;/a&gt; has been released.  Jalv is a simple but fully featured LV2 host for Jack which exposes plugin ports to Jack, essentially making any LV2 plugin function as a Jack application. For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support rdfs:label for port groups&lt;/li&gt;
&lt;li&gt;Use screen refresh rate with Gtk3 and Qt5&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Lilv 0.24.6</title><link href="https://drobilla.net/2019/11/10/lilv-0-24-6.html" rel="alternate"/><published>2019-11-10T21:39:00-05:00</published><updated>2019-11-10T21:39:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-11-10:/2019/11/10/lilv-0-24-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/lilv-0.24.6.tar.bz2"&gt;Lilv 0.24.6&lt;/a&gt; has been released.  Lilv is a C library to make the use of LV2 plugins as simple as possible for applications. For more information, see &lt;a href="http://drobilla.net/software/lilv"&gt;http://drobilla.net/software/lilv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add more strict error detection when storing plugin state properties&lt;/li&gt;
&lt;li&gt;Add option to override LV2_PATH in applications&lt;/li&gt;
&lt;li&gt;Don't print errors when saving state if correct links already exist&lt;/li&gt;
&lt;li&gt;Fix GCC8 warnings&lt;/li&gt;
&lt;li&gt;Fix creating directories across drives on Windows&lt;/li&gt;
&lt;li&gt;Fix issues with loading state with saved files from the model&lt;/li&gt;
&lt;li&gt;Fix memory errors and Python 3.4+ compatibility in Python bindings&lt;/li&gt;
&lt;li&gt;Fix unit tests on Windows&lt;/li&gt;
&lt;li&gt;Make Python bindings more Pythonic&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Lilv"/></entry><entry><title>Suil 0.10.6</title><link href="https://drobilla.net/2019/11/10/suil-0-10-6.html" rel="alternate"/><published>2019-11-10T21:35:00-05:00</published><updated>2019-11-10T21:35:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-11-10:/2019/11/10/suil-0-10-6.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.6.tar.bz2"&gt;Suil 0.10.6&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add no-cocoa configure flag&lt;/li&gt;
&lt;li&gt;Update build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Sord 0.16.4</title><link href="https://drobilla.net/2019/11/10/sord-0-16-4.html" rel="alternate"/><published>2019-11-10T21:26:00-05:00</published><updated>2019-11-10T21:26:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-11-10:/2019/11/10/sord-0-16-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sord-0.16.4.tar.bz2"&gt;Sord 0.16.4&lt;/a&gt; has been released.  Sord is a lightweight C library for storing RDF statements in memory. For more information, see &lt;a href="http://drobilla.net/software/sord"&gt;http://drobilla.net/software/sord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update build system&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Sord"/></entry><entry><title>Sratom 0.6.4</title><link href="https://drobilla.net/2019/11/10/sratom-0-6-4.html" rel="alternate"/><published>2019-11-10T21:20:00-05:00</published><updated>2019-11-10T21:20:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-11-10:/2019/11/10/sratom-0-6-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/sratom-0.6.4.tar.bz2"&gt;Sratom 0.6.4&lt;/a&gt; has been released.  Sratom is a small library for serialising LV2 atoms to and from RDF, for converting between binary and text or storing in a model.  For more information, see &lt;a href="http://drobilla.net/software/sratom"&gt;http://drobilla.net/software/sratom&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sratom_free() safe to call on NULL&lt;/li&gt;
&lt;li&gt;Various minor code cleanups&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="RDF"/><category term="Sratom"/></entry><entry><title>Serd 0.30.2</title><link href="https://drobilla.net/2019/10/20/serd-0-30-2.html" rel="alternate"/><published>2019-10-20T22:28:00-04:00</published><updated>2019-10-20T22:28:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-10-20:/2019/10/20/serd-0-30-2.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/serd-0.30.2.tar.bz2"&gt;Serd 0.30.2&lt;/a&gt; has been released.  Serd is a lightweight C library for RDF syntax which supports reading and writing &lt;a href="https://www.w3.org/TR/turtle/"&gt;Turtle&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/trig/"&gt;TriG&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/n-triples/"&gt;NTriples&lt;/a&gt;, and &lt;a href="https://www.w3.org/TR/n-quads/"&gt;NQuads&lt;/a&gt;.  Serd is suitable for performance-critical or resource-limited applications, such as serialising very large data sets or embedded systems.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix GCC 4 build&lt;/li&gt;
&lt;li&gt;Fix colliding blank nodes when parsing TriG&lt;/li&gt;
&lt;li&gt;Fix missing parse error messages&lt;/li&gt;
&lt;li&gt;Fix parsing "a" abbreviation without padding whitespace&lt;/li&gt;
&lt;li&gt;Fix parsing TriG graphs with several squashed trailing dots&lt;/li&gt;
&lt;li&gt;Fix resolving some URIs against base URIs with no trailing slash&lt;/li&gt;
&lt;li&gt;Improve build system and CI integration&lt;/li&gt;
&lt;li&gt;Improve documentation&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="RDF"/><category term="Serd"/></entry><entry><title>Jalv 1.6.2</title><link href="https://drobilla.net/2019/06/06/jalv-1-6-2.html" rel="alternate"/><published>2019-06-06T20:38:00-04:00</published><updated>2019-06-06T20:38:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-06-06:/2019/06/06/jalv-1-6-2.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/jalv-1.6.2.tar.bz2"&gt;Jalv 1.6.2&lt;/a&gt; has been released.  Jalv is a simple but fully featured LV2 host for Jack which exposes plugin ports to Jack, essentially making any LV2 plugin function as a Jack application. For more information, see &lt;a href="http://drobilla.net/software/jalv"&gt;http://drobilla.net/software/jalv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add jalv -i option to ignore stdin for background use&lt;/li&gt;
&lt;li&gt;Add several commands to console interface&lt;/li&gt;
&lt;li&gt;Add support for running as an internal Jack client (thanks Timo Wischer)&lt;/li&gt;
&lt;li&gt;Add support for underscore in port names on command line (thanks Jośe Fernando Moyano)&lt;/li&gt;
&lt;li&gt;Fix Jack deactivation&lt;/li&gt;
&lt;li&gt;Fix compilation with recent Gtkmm versions that require C++11&lt;/li&gt;
&lt;li&gt;Fix potential crash when closed with worker (thanks JP Cimalando)&lt;/li&gt;
&lt;li&gt;Fix potential hang after Ctrl-c in console interface (thanks Laxmi Devi)&lt;/li&gt;
&lt;li&gt;Make Suil dependency optional&lt;/li&gt;
&lt;li&gt;Remove support for deprecated event and uri-map extensions&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Jalv"/></entry><entry><title>Suil 0.10.4</title><link href="https://drobilla.net/2019/06/06/suil-0-10-4.html" rel="alternate"/><published>2019-06-06T19:02:00-04:00</published><updated>2019-06-06T19:02:00-04:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2019-06-06:/2019/06/06/suil-0-10-4.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.4.tar.bz2"&gt;Suil 0.10.4&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for Qt5 in Gtk3&lt;/li&gt;
&lt;li&gt;Add support for min/base size hints for X11 in Gtk (thanks Hermann Meyer)&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry><entry><title>Suil 0.10.2</title><link href="https://drobilla.net/2018/12/20/suil-0-10-2.html" rel="alternate"/><published>2018-12-20T17:22:00-05:00</published><updated>2018-12-20T17:22:00-05:00</updated><author><name>drobilla</name></author><id>tag:drobilla.net,2018-12-20:/2018/12/20/suil-0-10-2.html</id><content type="html">&lt;p&gt;&lt;a href="//download.drobilla.net/suil-0.10.2.tar.bz2"&gt;Suil 0.10.2&lt;/a&gt; has been released.  Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see &lt;a href="http://drobilla.net/software/suil"&gt;http://drobilla.net/software/suil&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add support for Cocoa in Qt5&lt;/li&gt;
&lt;li&gt;Fix resizing and add idle and update rate support for Qt5 in Gtk2&lt;/li&gt;
&lt;li&gt;Fix various issues with Qt5 in Gtk2&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"/><category term="Software"/><category term="LAD"/><category term="LV2"/><category term="Suil"/></entry></feed>