Expose all racks parameters with OSCquery #389
Comments
|
I've never used OSC, so I'd have to learn how to use it, get some hardware, and test it. The easy part would be writing the code, which I might as well do to avoid inconsistencies with such an easy task. We can't use libossia because I believe the license restricts it from use when a proprietary plugin is loaded. Is that correct? Is there an alternative? Is it possible for you to make an alternative library? And no, this shouldn't be a Rack plugin because plugins should only add modules which don't interact with other modules. |
|
concerning the licence, @jcelerier might have an idea, I already asked him, but it would be annoying if a commercial software can't link to libossia. |
Hi, libossia is under the LGPL which means that it can be used even by proprietary software (and AFAIK the GPL / LGPL licenses only concern redistribution, not execution... else no one would be able to build for instance LGPL-licensed externals for Max/MSP or LGPL VST / AU plug-ins). For instance Max/MSP uses FFMPEG which is under the LGPL too : https://cycling74.com/downloads |
I think that most OSC implementations are software. If you have a tablet or something like this there's TouchOSC which allows quick testing : https://hexler.net/software/touchosc ; OpenStageControl is also a nice free app for this : http://osc.ammd.net/ . Also, most "creative" environments (Max, Pd, OpenFrameworks, etc...) do support it in some way so there's a lot of choice :p |
|
The license appears to be CeCILL-C, so it is odd that you say it is LGPL since you wrote most of it. But if you say so, I won't argue with that. I estimate I will get around to this in ~6 months, if it commercially beneficial, i.e. if the number of VCV plugins sold will increase by a significant amount if this feature exists, because the complexity of the build system and licensing would be increased and incur continuous development costs. |
Yes, it's basically a french version of LGPL, but which has been made with a goal of explicit compatibility with it (https://en.wikipedia.org/wiki/CeCILL : 'CeCILL-C, for "component" software, which is fully compatible with the FSF's LGPL license.'). Though if it causes problems, relicensing explicitely to LGPL can be discussed with the contributors (and their respective employers which is, I suppose, the most problematic step !). @avilleret maybe (when there's time) we could provide a pull request ? Thanks for the interest in any case ! |
|
Perhaps maintaining your own fork is a better solution if you want OSC support. When I have time and I evaluate the value/cost of having this large dependency in Rack, I may merge it. |
I'll try to make a draft asap and then improve it if my project needs it |
|
hi ! There is still some work to do :
I'll wait for 1. to be done before submitting a PR. |
|
I would just like to add that it would be incredibly useful to implement OSCquery in Rack! |
|
"+1 posts are not allowed. You may vote on feature requests by using the Thumbs Up/Down reaction on the first post." |
|
@AndrewBelt You expressed interest higher up but were unfamiliar with OSC. Here's the rundown
I'm excited for @avilleret 's fork. I found this thread searching for prior work before I began to do exactly the same thing. Of note, I own a DIY controller with a 4x4 banana jack patch matrix which can forward data between arbitrary OSC addresses. it's quite cool and would be perfect for a modular setup like VCVRack. |
|
As expressed in #575 (comment), I'm reconsidering my earlier quote
since the grossness would be confined to a single global As for parameter names, I like the idea, but not right now. |
|
I'm considering the utility of a (Rack-internal) OSC bus to allow Soundhack-derived modules to broadcast/receive saved spectra. |
|
#664 is relevant to this. Note that the OSC module will need to access a list of ModuleWidgets, not Modules, since you actually want to control the knob position, not the Param itself. Because of this, you're actually to get started now instead of when Rack 0.6 releases, since you can get a list of modules with |
|
What an interesting discussion. I am wondering if going for a fuller implementation of algorithmic interaction won't be a better use of time. OSC then is simply just one of the protocols you can use to interact with rack. To be more clear, this api would allow in real time: I'd love to see an OSC implementation of this but having this possibility alone would be quite interesting. |
|
OSCQuery implementation could also be relevant to #78. A 'preset module' could grab current state of all parameters via OSCQuery & save those as a plain text file. A good example of this in practice is the 'Cue Manager' module for the Jamoma Library in Max/MSP. In fact, by first implementing OSCQuery, the Jamoma cue manager could be used in the interim to handle VCVRack patch 'presets' or 'states'. |
|
I would also like to request that the API offers the modules a way to register string names for their parameters. |
|
The engine and UI have been mostly separated in Rack v1 and moreso in Rack v2, so it makes sense to think about this feature request at some point. I've never used the OSC protocol and haven't read the standard yet, but I'll make the following guesses.
|
|
Hello, that is great to hear :) There are two different things :
the arguments are written in their binary form in big endian, and zero-separated / zero-padded to a boundary of 4 bytes.
The spec for that is here : https://github.com/Vidvox/OSCQueryProposal and we have a LGPL implementation in libossia.
that would already be great as it allows anyone to build remote controls :) |
|
UDP is fine. I'd need to either write my own OSC implementation or find a decent MIT-like one. Is there an interface for a client to query a list of parameters? How are parameters identified? By integers or strings? |
OSCPack is a BSD-licensed OSC implementation : http://www.rossbencina.com/code/oscpack which is used in a lot of software.
That is what OSCQuery adds on top of OSC : a notion of parameter that can be queried, etc. (in OSCQuery it is possible to query multiple parameters at once by querying a parent node in the tree, e.g. if you want /foo/lfo.1/frequency and /foo/lfo.1/amplitude you query /foo/lfo.1)
|
|
Oh, so OSC is client-to-server only? Yeah, I'd need to support bidirectional communication, which is what I assume OSCQuery does.
Awesome, that works nicely for Rack, where modules (groups of parameters) are dynamic (can be added or removed while running). |
it is indeed
A few apps support it in the media art scene (mostly on desktop software such as VDMX, Millumin, Vezér, ossia score) so I would not be able to say you how much it is used on iApps frankly. There is an Objective-C implementation I think. |
|
one big advantage of using libossia is that it allows to expose the application namespace through different protocol (OSCQuery and OSC among others) at the same time (or not) without any effort. |
|
libossia looks really nice, and I'd ask for licensing if that's even possible (if the contributors can be enumerated). Otherwise I'll have to derive OSCPack to add OSCQuery support, or ask for help from the community to do so. |
|
hm, libossia cannot be relicensed easily, as part of work on it was done under contract with a french university and multiple companies. I think that in that case it may make more sense to make a clean room reimplementation |
|
Makes sense, that's what I thought. Should be easy enough to make a lightweight implementation. |
|
I can't see a reason that this feature needs to be built into Rack itself. If it was, it would be delivered as a Core module anyway, and there's nothing Core can do that a third-party plugin can't. In order to get around licensing issues with libossia (or any other OSC implementation), someone can make a third-party plugin that is GPL or LGPL. This would be a better option than including this into Rack. |
|
Hm, I've looked around the current API headers a bit but could not find the main thing necessary for this to work : how can a plug-in enumerate (and, even better, get notified of changes) of every parameter / knob / module ... in a given rack session ? I've grepped a bit for global instances and things like that but could not find any. |
|
Thanks, that APP thing is what I was looking for. Should be all good then ! |

Hi,
thanks a lot for making this great tool open source !
One thing I might need in the near future, is to control VCVRack with a sequencer.
I could do it with MIDI. But nowadays I'm more confortable with OSCQuery protocol.
A good, crossplatform and opensource library for that is libossia.
I started thinking about making a plugin that exposes all rack parameters with OSCQuery.
But after a quick look into sources, it seems that
rack::modulesvector isn't accessible from plugins API without some rewriting, isn't it ?On the other side, if putting OSCQuery into VCVRack needs some code refactoring, what about including it directly into the core engine ?
Would it be something @AndrewBelt will support ? (I mean give some hint and accept some pull-request)
The text was updated successfully, but these errors were encountered: