[LV2] LV2 + midnam

Bent Bisballe Nyeng deva at aasimon.org
Sat Nov 12 08:27:57 PST 2016


On 11/12/16 17:17, Robin Gareus wrote:
> On 11/12/2016 04:54 PM, Bent Bisballe Nyeng wrote:
>> On 11/01/16 19:48, Robin Gareus wrote:
>>> On 10/29/2016 02:56 AM, Robin Gareus wrote:
>>> [..]
>>>> The simplest is probably to pass around .midnam files.
>>>> Since mappings in plugins can change dynamically a LV2 extension:
>>>>  - host asks plugin for the midnam
>>>>  - plugin can ask host to re-read it.
>>>>
>>>> The nice part is that most DAWs and sequencers already support midnam.
>>>>
>>>
>>> Here's a first draft (working prototype in ardour-git 5.4-249-ge08c803)
>>>
>>> #define LV2_MIDNAM_URI "http://ardour.org/lv2/midnam"
>>> #define LV2_MIDNAM_PREFIX LV2_MIDNAM_URI "#"
>>> #define LV2_MIDNAM__interface LV2_MIDNAM_PREFIX "interface"
>>> #define LV2_MIDNAM__update LV2_MIDNAM_PREFIX "update"
>>>
>>> typedef void* LV2_Midnam_Handle;
>>>
>>> /** a LV2 Feature provided by the Host to the plugin */
>>> typedef struct {
>>>   /** Opaque host data */
>>>   LV2_Midnam_Handle handle;
>>>   /** Request from run() that the host should re-read the midnam */
>>>   void (*update)(LV2_Midnam_Handle handle);
>>> } LV2_Midnam;
>>>
>>> typedef struct {
>>>   /** Query midnam document. The plugin
>>>    * is expected to return a null-terminated XML
>>>    * text which is a valid midnam description
>>>    * (or NULL in case of error).
>>>    *
>>>    * The midnam <Model> must be unique and
>>>    * specific for the given plugin-instance.
>>>    */
>>>   char* (*midnam)(LV2_Handle instance);
>>>
>>>   /** The unique model id used in the midnam,
>>>    * (or NULL).
>>>    */
>>>   char* (*model)(LV2_Handle instance);
>>>
>>>   /** free allocated strings. The host
>>>    * calls this for every value returned by
>>>    * \ref midnam and \ref model.
>>>    */
>>>   void (*free)(char*);
>>> } LV2_Midnam_Interface;
>>
>> First a comment to the proposed extension:
>> How would a plugin announce to the host that a midnam re-read is needed
>> (if a new drumkit is loaded for example)?
>
> see "update()" above
>
>   "Request from run() that the host should re-read the midnam"
>
> setBfree is an example that calls this when the CC mapping changes or a
> user creates or renames a patch.
>

Aah, missed that ;)

>> I think the midnam approach is a bad idea because it is encapsulating an
>> existing spec into a new one (LV2) but otoh it will ease the adaptation
>> in existing hosts... on the other hand I would really like to see a
>> dynamic way of handing over such info to the host without having to
>> dynamically write files to disk.
>>
>> I therefore propose two new extensions:
>> 1) A static midnam file to be used with the plugin, described in the ttl.
>
> Why static? That'd limit synths which can load soundfonts dynamically.
>

Static for convenience of plugins that simply want to expose and 
existing static midnam file.

>> 2) An atom based approach to hand over the attribute list is a 'pure'
>> LV2 way, without having to transfer xml strings, supporting the plugins
>> with the need for dynamic note descriptions.
>
> I tried to come up with such a spec and after 2h gave up.
>
> In particular sparse lists are hard. Host asks: give me all CC-Names
> Patch-Names and Note-Names (which can be sparsely populated) for all
> banks times all channels and/or programs.
>
> As for Atoms: Factor in variable length names and a limited Atom Buffer
> size. The list may have to be split across process cycles. Hence an
> extension seemed a lot more appropriate.
>
> Also querying them via an extension
>   e.g.  char* get_plugin_patch_name (bank, program, /* channel */);
> will be a lot of of calls forth and back.
>
>
> I felt like I was reinventing the wheel. MIDNAM already covers it all
> and furthermore there are already existing .midnam files for many sf2
> and sfz. Synths that load .sf2 or .sfz would have to parse those and
> present them via a new custom API to the host.
>
> I'm neither a midnam fan nor like XML very much, but still other
> alternatives seem worse.  In any case  dynamically generating some
> midnam for a special-cased plugin does not need fancy XML generators: In
> 99.9% just sprintf() does the trick.

If the resulting atom based solution would end up being very complex 
then I agree that midnam XML would be the way to go. Doing it "the LV2 
way" just for the sake of it doen't make much sense.

Conclusively I have now added your proposal to the DrumGizmo roadmap :-)

Kind regards
Bent Bisballe Nyeng



More information about the Devel mailing list