Posts

Interactive force-directed graph layout in Ingen

GraphViz has, unfortunately, broken reverse compatibility of their library API, which has been nagging as a maintenance headache for FlowCanvas and its successor Ganv for a while now. It would be nice to just get rid of that dependency altogether...

Meanwhile, I had to write some force-directed graph layout (FDGL) code for another project...

... You can probably see where this is going. In the spirit of it theoretically being a holiday (there are no holidays in practice in grad school), I spent some time implementing live FDGL in Ganv, and recorded a video of interactive layout in Ingen to show progress.

One nice thing about using live FDGL in a program like Ingen is that the user can customize the layout in an intuitive tactile way, since objects behave physical laws. This video demonstrates some manual rearranging of a patch, and a total reconfiguration by switching the signal flow direction. Manual tweaking of the layout like this was not possible with the previous GraphViz-based layout code.

It took quite a bit of tweaking to get the physics working well, so layouts looked good but the patch didn't explode if there are disconnected components. It's still not quite ideal, but usable.

This is implemented at the Ganv level and thus works in Ingen (as shown), Patchage, and Machina. I'm still not confident enough in this implementation to enable it by default and/or drop Graphviz quite yet, but the adventurous who follow svn, ./waf configure --debug --fdgl. If you're hit by the graphviz breakage (and I still haven't fixed the check...), add --no-graphviz to work around the problem.

Suil 0.6.16

Suil 0.6.16 has been released. Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see http://drobilla.net/software/suil.

Changes:

  • Fix crashes and resizing for X11 in Qt (patch from Rui Nuno Capela)
  • Fix suil_instance_extension_data() for UIs with NULL extension_data

Jalv 1.4.2

Jalv 1.4.2 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 http://drobilla.net/software/jalv.

Changes:

  • Add command-line option to control UI update frequency
  • Fix crash when running "jalv" with bad command line arguments
  • Fix default setting for non-sequential enumeration ports (patch from Robin Gareus)
  • Fix parameter changes with Qt UI
  • Fix potential crash with UIs and debug printing
  • Nicer printing of atom messages with -d
  • Support rsz:minimumSize for atom and event ports
  • Upgrade to waf 1.7.11
  • Work around Gtk bug for labels on sliders (patch from Robin Gareus)

Suil 0.6.14

Suil 0.6.14 has been released. Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see http://drobilla.net/software/suil.

Changes:

  • Add support for new LV2 idle interface
  • Lower dependency from Gtk 2.24 introduced in 0.6.12
  • Print system error message if module fails to load
  • Support resizing for X11 in Gtk (patch from Robin Gareus)
  • Upgrade to waf 1.7.11

Ingen as LV2 in Ardour

I found some time today to make Ingen's support for running as an LV2 more solid. I have posted about this before, but it now works at RT appropriate buffer sizes, and several other bugs have been fixed. Here's the obligatory contrived screenshot:

Ingen in Ardour

People are sometimes confused about how Ingen works as an LV2 (I need to write proper documentation One of These Days): you don't load an "Ingen" plugin so much (it wouldn't do anything), as you save an Ingen graph as an LV2 plugin. The idea is that Ingen is a tool for visually building plugins. Since LV2 does not support dynamically adding ports, it's easiest to do your building as a Jack app, so the basic work flow is something like:

  1. Run Ingen as a Jack app: ingen -eg
  2. Build a graph, adding ports, plugins, etc.
  3. Save the graph to somewhere in your LV2_PATH, e.g. ~/.lv2 (which happens to be the default directory of the save dialog for this reason).
  4. Voila, your graph should now show up in any LV2 host (its URI will simply be its local filesystem path, unless you explicitly set a stable one). You can check with lv2ls.

There is no export or compilation involved, Ingen's native format is LV2 compatible (graphs are always saved in the same format). If you saved a graph elsewhere you can simply copy it to ~/.lv2 to use it as a plugin, though for now you may have to create or fix the symlink to the engine binary manually to do this.

Note that you can edit the graph while it's running as an LV2 plugin, including adding new nodes and connections, you just can't add top-level ports because the host doesn't know about them. There is still some work to be done polishing this up to be ready for prime-time, but for the brave, it's more or less good to go.

Jalv 1.4.0

Jalv 1.4.0 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 http://drobilla.net/software/jalv.

Changes:

  • Add menu bar and pass parent widget in Qt version for true UI embedding
  • Add spinbuttons for precisely setting control values
  • Group controls under headings if port group information is available
  • Make URI map thread-safe, fixing occasional crashes for plugins with UIs
  • Send time information to plugin when Jack tempo changes
  • Support state:loadDefaultState
  • Update to waf 1.7.8 and autowaf r90
  • Use a more efficient dense layout for controls

Suil 0.6.12

Suil 0.6.12 has been released. Suil is a library for loading and wrapping LV2 plugin UIs. For more information, see http://drobilla.net/software/suil.

Changes:

  • Fix compilation on BSD
  • Fix crash when a broken UI returns a NULL descriptor
  • Fix key events for X11 in Gtk without using a troublesome event filter

Lilv 0.16.0

Lilv 0.16.0 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 http://drobilla.net/software/lilv.

Changes:

  • Add lilv_nodes_merge()
  • Add lilv_world_ask() for easily checking if a statement exists
  • Add lilv_world_get() and lilv_port_get() for easily getting one value
  • Add va_list variant of lilv_plugin_get_num_ports_of_class()
  • Correctly depend on serd at build time (fix compilation in odd cases)
  • Disable timestamps in HTML documentation for reproducible build
  • Fail gracefully when lilv_state_new_from_string() is called on NULL
  • Fix several plugin functions that failed to load data if called first
  • Ignore state ports with no value instead of printing an error
  • Make lilv_plugin_get_port_by_designation() return a const pointer
  • Make state loading functions fall back to lv2:default for port values, so a plugin description can be loaded as default state
  • Require a URI for lilv_state_to_string() and fail gracefully otherwise
  • Support atom:supports in lilv_port_supports_event()
  • Update to waf 1.7.8 and autowaf r90 (install docs to versioned directory)
  • lilvmm.hpp: Add several missing methods
  • lilvmm.hpp: Support varargs for Plugin::get_num_ports_of_class()

Sratom 0.4.2

Sratom 0.4.2 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 http://drobilla.net/software/sratom.

Changes:

  • Disable timestamps in HTML documentation for reproducible build
  • Fix memory leaks
  • Fix serialisation of nested tuples
  • Update to waf 1.7.9 and autowaf r90 (install docs to versioned directory)
  • Use new sord API to clean up and shrink code

Sord 0.12.0

Sord 0.12.0 has been released. Sord is a lightweight C library for storing RDF statements in memory. For more information, see http://drobilla.net/software/sord.

Changes:

  • Add sord_get() for easily getting single property values
  • Update to waf 1.7.9 and autowaf r90 (install docs to versioned directory)
  • sord_validate: Pass type check when range is xsd:anyURI and value is a URI
  • sord_validate: Support any subClassOf rdf:Property, not just baked-in ones
  • sordmm.hpp: Add Node::to_serd_node()
  • sordmm.hpp: Add convenient constructors for decimal and integer literals
  • sordmm.hpp: Don't automatically add RDF namespace prefix to world

« Page 14 / 22 »