gstreamer/ext/lv2
Jordan Petridis 8969f02fd5 lv2: fix build without the debug system
```
FAILED: subprojects/gst-plugins-bad/ext/lv2/b8a2ebe@@gstlv2@sha/gstlv2utils.c.o
../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c: In function 'lv2_log_printf':
../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c:50:3: error: attempt to use poisoned "gst_debug_log_valist"
   50 |   gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap);
      |   ^
../subprojects/gst-plugins-bad/ext/lv2/gstlv2utils.c:50:25: error: 'lv2_debug' undeclared (first use in this function); did you mean 'g_debug'?
   50 |   gst_debug_log_valist (lv2_debug, GST_LEVEL_INFO, "", "", 0, NULL, fmt, ap);
      |                         ^~~~~~~~~
      |                         g_debug
```
2019-10-22 13:44:04 +00:00
..
calf-lv2-port-groups.patch Add swh and calf LV2 port group patches. 2009-09-17 09:46:48 +03:00
gstlv2.c docstrings: port ulinks to markdown links 2019-08-23 20:14:12 +02:00
gstlv2.h lv2: support for loading presets 2016-07-04 21:18:28 +02:00
gstlv2filter.c fix for https://bugzilla.gnome.org/show_bug.cgi?id=771871 2016-09-29 19:59:28 +02:00
gstlv2source.c lv2: add support for saving presets 2016-07-04 21:18:28 +02:00
gstlv2utils.c lv2: fix build without the debug system 2019-10-22 13:44:04 +00:00
gstlv2utils.h lv2: add support for saving presets 2016-07-04 21:18:28 +02:00
meson.build meson: add more plugins to plugins list 2019-05-30 20:41:57 +02:00
README lv2: planning update 2016-07-10 20:44:19 +02:00
swh-lv2-port-groups.patch Add swh and calf LV2 port group patches. 2009-09-17 09:46:48 +03:00

Gst-LV2 Quickstart

Dependencies:

Lilv 0.6.6 <http://drobilla.net/software/lilv/>


Features:

The plugin wrapper support the following plugin features:
http://lv2plug.in/ns/lv2core
http://lv2plug.in/ns/ext/event
http://lv2plug.in/ns/ext/port-groups

and these host features:
http://lv2plug.in/ns/ext/log
http://lv2plug.in/ns/ext/urid

Example Pipeline:

Requires swh-lv2 <http://plugin.org.uk/releases/>

gst-launch-1.0 -v filesrc location=/usr/share/sounds/login.wav ! wavparse ! audioconvert ! plugin-org-uk-swh-plugins-djFlanger ! audioconvert ! autoaudiosink
(A longer wav will be a better example)

gst-launch-1.0 plugin-org-uk-swh-plugins-analogueOsc num-buffers=100 wave=1 ! wavenc ! filesink location="/tmp/lv2.wav"

Requires calf <http://calf.sourceforge.net/>

GST_DEBUG="*:2,lv2:5"
gst-launch-1.0 calf-sourceforge-net-plugins-Monosynth event-in="C-3" ! autoaudiosink
gst-launch-1.0 calf-sourceforge-net-plugins-Monosynth event-in="C-3" name=ms ! autoaudiosink ms. ! fakesink
gst-launch-1.0 calf-sourceforge-net-plugins-Organ event-in="C-3" name=s ! interleave name=i ! autoaudiosink s. ! i.


TODO
* make filters gap-aware
* report latency
  lilv_plugin_has_latency(), lilv_plugin_get_latency_port_index()
* support more host features
  GST_DEBUG="lv2:4" GST_DEBUG_FILE=/tmp/gst.log gst-inspect lv2
  grep -o "needs host feature: .*$" /tmp/gst.log  | sort | uniq -c | sort -n
* make source elements useful
  Most source elements use Atom port where they accept midi events. Since it is
  full fledged midi, we should only ever use channel-0 and instead use multiple
  instances
  1) We could expose those as "audio/x-midi-event" sink pads, but then those are
     not sources anymore.
  2) We could expose those as properties using a new type like GST_FOURCC. If we
     ignore "System Exclusive" messages, all other midi messages are 1-3 bytes.
     We stuff the bytes right to left. E.g: the lowest byte is the status byte
  3) We could use the GstBtNote enum + the toneconversion classes
  https://www.midi.org/specifications/item/table-1-summary-of-midi-message
  Open questions:
  - with one property, we can't handle polyphony
  - we can't query lv2 plugins for their polyphony :/

  If lv2 gets a polyphony extension it would be a single non-negative integer:
    0: unbound,  1 monophonic,  > 1  N-polyphonic
  I've checked a few synths and they all have an upper limit. Still the way
  voices work in trackers is not the same as they work in synths - e.g. in a
  tracker one can play a note twice

  Or we just play them monophonic and try to implement a polychildbin. The bin
  takes a GstElement to be used as a voice. For each new voice it would create a
  new instance and it uses a built-in mixer. Downside is that all properties
  would be per voice.

* example sources:
  http://svn.drobilla.net/lad/trunk/lilv/utils/lv2info.c
  http://svn.drobilla.net/lad/trunk/jalv/src/jalv.c