4 ms·
Certainly. - Embed-ability: Qt can be used to build a plugin interface, but when a plugin host (which may be implemented in some version of Qt) loads multiple
by fundamental 8y ago
Certainly.
- Embed-ability: Qt can be used to build a plugin interface, but when a plugin host (which may be implemented in some version of Qt) loads multiple different plugins (which can be different versions), then it's possible to see conflicts with the global data that Qt creates. These problems are fairly hard for typical users to report and debug. IIRC this can be worked around with static linkage, though that opens up a separate can of worms with respect to Qt.
- Licensing: For the initial fundraiser the plan was to release binaries of the GUI for a fee with the full source being released at a later date. Doing this was simplified by using custom tools which were almost all under the MIT license.
- Layout: QML tries to specify widget properties in terms of fixed sizes of the leaf nodes and then using bottom-up algorithms to place the parent widgets. The initial system in zest was to use a constraint layout framework to specify all system constraints without hard coding pixel sizes for any widget (other than the top level window as specified by the window manager). Incorporating this different approach did not mesh cleanly with QML's existing abstraction
- Remote Data: QML works great if you're going to hook onto an app driven by Qt classes and the associated signal-slot system. Unfortunately Qt's approach does not work in a 'realtime-safe' manner. That is to say that if it was deeply integrated it could cause faults where the audio processing would be delayed generating audio glitches due to the timing being incorrect. When working with the OSC interface that existed on the target app (ZynAddSubFX), specifying parameter bindings felt rather unnatural and once again, didn't mesh with QML's expectation of how events should flow.
- Javascript: Personally I'm not a fan of javascript, so developing in a different scripting language made the process faster in Ruby.
- QML's C++ API: At the time I started work prototyping the GUI I needed to occasionally work with QML classes from a C++ perspective and sometimes extend/create new classes there. The C++ API was under-documented and the API felt clumsy. This is something that the Qt documentors have likely resolved at this point, but at the time it was a limitation.
- QML's mental model: I have worked with Qt in the past, though not all that extensively. Qt and QML work very well if you stay within their own realm, but once you start going against the grain, you need to understand the internals fairly well. I found it difficult to learn about the internals and as such for a long development process which needed to have fast iterations, it seemed like a better fit to work with code that I was more familiar with even at the cost of needing to write it myself. In the end I think this was mostly justified by the relative small size of the 'framework' vs the size of the widget code within the overall Zyn-Fusion GUI written using mruby-zest.
I know there were a few other issues at the time that I decided it would be more productive to build a framework along the way, though those are the items that come to mind first.
- jcelerier 8y agothat was a fairly interesting and extensive answer, thanks ! I'm asking because I'm working on an OSC based DAW built with Qt (https://ossia.io https://ossia.io) and the route I went is to entirely isolate the UI event loop, the OSC / network event loop and the audio loop each in their own threads / groups of threads. Still have a priority inversion problem to fight here and there but overall I'm fairly satisfied with the result.
- fundamental 8y ago> I'm working on an OSC based DAW built with Qt (https://ossia.io https://ossia.io) Ah, cool. I remember siting in on part of the 2017 LAC workshop for i-score (i-score was renamed to ossia score, right?). Once you remove the embedding criteria Qt itself becomes a much more feasible option. I haven't used score, much, though I should likely play around with it given the amount of OSC work that I've done around zyn.
- jcelerier 8y agooh.. then we've met ! I was the one giving the workshop, and had a good time with you people :) (and yes, there was a rename). By any chance, have you looked into OSCquery (https://github.com/mrRay/OSCQueryProposal https://github.com/mrRay/OSCQueryProposal) ? It's a protocol we're currently a bunch working on and which is starting to make some inroads even in paid media software ; it greatly facilitates interoperation between multiple OSC-compliant software since it allows multiple software to easily query all the OSC nodes of each other through simple JSON over websocket communication.
- fundamental 8y agoThis is the first time that I think I've seen the proposal. When I was building https://github.com/fundamental/rtosc https://github.com/fundamental/rtosc I was pretty heavily influenced by the work done within liblo and libmapper. I personally really like their implementation, but like all of the options adoption drives success. With rtosc there is https://github.com/7890/oscdoc https://github.com/7890/oscdoc support (XML/XLST based) as well as a more standard json schema https://github.com/mruby-zest/osc-bridge/blob/master/schema/test.json https://github.com/mruby-zest/osc-bridge/blob/master/schema/... . For the running application the discovery mechanism is in the vein of oscit where there are special discovery paths and everything is over UDP OSC. One of the limitations for ZynAddSubFX is making discovery a multi-step process, since there is a very large number of OSC paths (if you count out all enumerations it's ~4,000,000). So flat listings don't really work and even if that's resolved the rest of the information needs to be presented in a compact/efficient format for the system to be performant. I'd say the OSCQueryProposal looks like it falls back on HTTP concepts and javascript conventions too heavily and adds more verbosity than I'd personally prefer. Looking over the options that I had considered in the past I'm looking at libmapper again for some possible future ideas and work.