On Sun, Jul 9, 2017 at 9:22 PM, Radu Suciu <radusu...@gmail.com> wrote:

> Just want chime in that mapping controllers in Mixxx by binding to Ctrla
> callbacks and outputs directly in JS, without having to map midi signals in
> XML beforehand would make for a great experience.
>

Thanks for the input Radu! Indeed I see the Ctlra events being forwarded
directly to the JS engine, perhaps with a callback-per-event, to enable
easily handling the event. Would that sound like a good implementation from
the JS point-of-view? (Unfortunatly I do not have much experience mapping
controllers using the JS / XML approach).



> On Sun, Jul 9, 2017 at 11:35 AM, Harry van Haaren <harryhaa...@gmail.com>
> wrote:
>
>> On Sun, Jul 9, 2017 at 7:04 PM, Daniel Schürmann <dasch...@mixxx.org>
>> wrote:
>>
>>> Hi Harry,
>>>
>>> thank you for pointing me to ctlra_info_get_name.
>>> That is a good help to locate the event on the controller.
>>>
>>
>> Yep, and together with the layout info, it is enough to provide good UX
>> on what it is, and where it is on the device.
>>
>>
>>
>>> However, I think we have the chance here to also represent the intended
>>> use of a control in machine readable way
>>
>>
>> Interestingly, my "v1" iteration of the Ctlra library worked like that.
>> Human/machine readable strings, that would be interpreted between device
>> and application, to attempt to provide "semantic" meaning to a control, so
>> the application would "automagically" connect with it. I discussed the idea
>> with a few Linux Audio developers who's opinions I regard highly (aka; they
>> have years of experience), and they discouraged the idea. In *theory* it
>> works really well, but then practice comes along and it just doesn't work
>> as intended.
>>
>> For DJ controllers to DJ software, it will probably work OK. Gain, Pitch,
>> Play - those have pretty obvious mapping targets. But then there's a range
>> of other capabilities, that just *dont* fit, and unless the user maps them
>> explicitly, its just not gonna work. For example, how to map a WiiMote to
>> Mixxx; there is no "correct" or even "logical" way of mapping it. Its
>> user-specific, depending on what they want to do.
>>
>>
>> It would be just natural to define some kind of application profiles for
>>> a controller, that a controller manufacturer may implement.
>>> This can be linked into the OSC namespace. Just to be compatible with
>>> OSC. OSC can benefit in the same way from our application profiles. And
>>> when we one day have a device connected over network using OSC it can be
>>> quite well wrapped and presented in Ctlra. There is no other relationship
>>> between OSC and Ctlra and OSC just the shared OSC address.
>>>
>>> For example we can define
>>>
>>> "Deck X Gain profile":
>>>
>>> A control that is intended to control the gain of a deck.
>>> Value x means lowest gain value y means highest gain and value z
>>> (centre) means 0 dB.
>>> OSC Address: /CTLRA/DEVICE/DECK1/GAIN
>>>
>>> Thats all. This is IMHO quite natural and does not effect directly the
>>> API.
>>>
>>> For now it requires "only" an other string for each event.
>>> ctlra_info_get_osc_address(). Which can default to
>>> /CTLRA/DEVICE/TYPE/ID if there is no profile defined.
>>>
>>>
>>> This solves also the LED connections:
>>>
>>> "Deck X Play/Pause profile":
>>>
>>> A control that is intended to toggle between play and pause of a deck.
>>> Value x means pressed value y means released. It may feature also an
>>> indicator light that can be controlled independently.
>>>
>>> OSC Address: /CTLRA/DEVICE/DECK1/PLAY_PAUSE
>>> OSC Address: /CTLRA/DEVICE/DECK1/PLAY_PAUSE_LED
>>>
>>> All this is optional, but if a controller implements Application
>>> Profiles, it is instantly usable with a basic function in all Ctlra enabled
>>> devices. We are back in the good old midi days, where you can plug in a
>>> keyboard and it just works.
>>>
>>> The OSC Addresses are only needed once to setup the initial mapping for
>>> a direct Ctlra application and are used as OSC as communication address in
>>> case of a OSC gateway.
>>>
>>> I see that OSC is increasingly supported by various DAW application.
>>> So Ctlra will immediately benefit from it. There is no need to explain
>>> the DAW and Controller manufactures: "You do not need OSC, use Ctlra".
>>>
>>
>>> We can ask them, to consider the "Ctlra Application Profiles" on top of
>>> the OSC support, to benefit from great source of instantly usable
>>> controllers. This will IMHO help a lot to make Ctlra popular, and wash away
>>> the impression that Ctlra is just a new concurrent standard.
>>>
>>
>> I don't object to an application taking this route - if it wishes to map
>> events to OSC, that's fine. I don't think adding some form of OSC metadata
>> overlay into the plain C Ctlra API makes any sense. Unix philosophy, one
>> thing, and do it right. That one thing is making hardware devices available
>> under a single API, and abstracting events and feedback to be generic.
>>
>>
>> Taking a step back, the problem we are trying to solve is to easily allow
>> users to use their hardware with an application (eg: Mixxx).
>>
>> Say a developer (me) adds a default Ctlra map for a device (eg, the NI S2
>> Mk2), and provides sane default mappings. 80% of DJs will probably be
>> happy. The remaining 20%, probably want to remap a few FX controls, or have
>> some buttons perform differently (sampler control instead of loops, or
>> smth). For these 20%, we provide a way to re-purpose controls - the
>> existing JS Mixxx infrastructure for example. Is that not a good-enough end
>> goal?
>>
>> I see the above suggestion as the "pragmatic" path to success. Lets not
>> try fix all the mapping problems, semantic usages, and OSC-DAW integration
>> at once. Lets fix hardware integration, in a forward compatible way so that
>> more devices can be implemented under it, and that the
>> device-implementation effort is shared across manufacturers and all
>> developers in the community.
>>
>> My 0.02$, Cheers -Harry
>>
>> PS: I'll kick off a new thread to discuss the Ctlra/Mixxx PR itself.
>>
>>
>>> Am 09.07.2017 um 14:57 schrieb Harry van Haaren:
>>>
>>>> On Sun, Jul 9, 2017 at 1:23 PM, Daniel Schürmann <dasch...@mixxx.org
>>>> <mailto:dasch...@mixxx.org>> wrote:
>>>>
>>>>     Hi Harry,
>>>>
>>>>      > At no point to I think Ctlra will *require* also using TCC. It
>>>>     just so happens that they complement each other well for my
>>>> use-cases.
>>>>
>>>>     That seams to be a good approach. If the architecture allows to put
>>>>     Ctlra drivers into runtime loaded object files, it does not matter
>>>>     which compiler is used and if it turns out that TCC is the best for
>>>>     our needs on a platform, fine.
>>>>
>>>>     > That proposal looks really good. It basically means,  from a
>>>> Ctlra POV, that Ctlra is plain old C code, and exposes
>>>>     generic events.
>>>>
>>>>     No, not generic events. The Ctlra using apllications should receive
>>>>     a specific event.
>>>>
>>>>
>>>> By "generic event", what I mean is a specific event type, with a
>>>> specific event ID. These two combined identify one specific control item on
>>>> a physical controller device. For example, a specific button (eg Play)
>>>> sends a button event when pressed / released, using this struct for
>>>> metadata: https://github.com/openAVproductions/openAV-Ctlra/blob/maste
>>>> r/ctlra/event.h#L63
>>>>
>>>> Note that the name of the control is *not* included here for
>>>> performance reasons. Passing strings around just isn't a good idea for
>>>> performance. Ctlra provides functions to lookup the name of each event
>>>> based on type/ID. I have "generic" applications (don't care about which HW
>>>> controller is used) that provide fully labelled UIs showing all control
>>>> names - so your use-case is covered here. (If there is an issue, we can
>>>> resolve it at the Ctlra API layer, but AFAIK the API caters for the
>>>> application's requirements).
>>>>
>>>>     If you turn the gain Knob on a controller, the application should be
>>>>     able to now that this is the Knob labeled with "Gain" grouped for
>>>>     Deck A.
>>>>
>>>>
>>>> See above paragraph - names of events are provided, based on the labels
>>>> physically printed on the hardware.
>>>>
>>>>     This might be done by a generic event + a link into a manifest file,
>>>>     which may also include a photo of the controller. This metada of
>>>>     each event should be optimized to be translated into a OSC address,
>>>>     this should be a mandatory part of Crtra. So we need a document like
>>>>     this:
>>>>     https://github.com/fabb/SynOSCopy/wiki
>>>>     <https://github.com/fabb/SynOSCopy/wiki>
>>>>
>>>>
>>>> I see no value in *demanding* that Ctlra supports OSC, in the same way
>>>> that Ctlra will not demand the use of TCC. Ctlra must be a standalone
>>>> library (with only *essential* dependencies like libUSB). Any metadata
>>>> should be directly related to the physical device capabilities. Mapping and
>>>> adding semantic meaning to the controls is up to the application.
>>>>
>>>> I do not wish to include images in Ctlra - it complicates things, and
>>>> is generally just un-conventional. That said, I so see value in "visually
>>>> showing" users what controls are available, and what thier labels are. This
>>>> has already been discussed, and a POC implemented:
>>>> https://github.com/openAVproductions/openAV-Ctlra/issues/7  (note to
>>>> self, I still need to cleanup and publish the branch with the POC).
>>>>
>>>> I feel the scope of Ctlra should not include the "semantic meaning" of
>>>> controllers. This was discussed previously (there's one question at the end
>>>> of the LAC talk asking exactly this), and it doesn't scale well, and only
>>>> complicates things. So Ctlra will provide an Event per button
>>>> press/release, with type/ID to identify the exact physical change.
>>>> Interpreting the meaning of that event, and mapping it to application
>>>> functionality is *not* in the scope of Ctlra.
>>>>
>>>>      > The application can interpret those in whatever way it wants -
>>>>     OSC, JS/Mixxx, or however OpenAV stuff will end up doing this. It
>>>>     keeps Ctlra just generic events, and allows the application to solve
>>>>     the mapping problem in its own way. That sounds logical and a good
>>>>     abstraction, which is exactly what Ctlra aims for.
>>>>
>>>>     Yes, that is right. Today in case of midi, the user has to figure
>>>>     out which midi key is doing what.  With a Ctlra enabled controller
>>>>     this issue should be gone. The mapping solution can for example show
>>>>     the photo of the controller, and highlight the place of action.
>>>>     But even without the photo, the user knows exactly how to enable a
>>>>     knob LED, using the OSC name-space as address.
>>>>
>>>>
>>>> The human-readable string that is provided by Ctlra library API enables
>>>> the user to understand the event. For an example of the name lookup, please
>>>> see here: https://github.com/openAVproductions/openAV-Ctlra/blob/maste
>>>> r/examples/simple/simple.c#L51
>>>>
>>>>
>>>>     > In order to progress this idea, I'll post code up ASAP,  which
>>>> makes the generic Ctlra events available in a callback as
>>>>     part of the CtlraController class. After that, the Mixxx/JS
>>>>     components must be designed / worked on to fully enable Ctlra in
>>>> Mixxx.
>>>>
>>>>     Thank you :-)
>>>>
>>>>     I think for the OCS Plug and Play stuff we just need to rethink the
>>>>     API a bit.
>>>>     I would like to do something like this
>>>>     https://github.com/mixxxdj/mixxx/blob/lv2_support2/src/effec
>>>> ts/lv2/lv2manifest.cpp
>>>>     <https://github.com/mixxxdj/mixxx/blob/lv2_support2/src/effe
>>>> cts/lv2/lv2manifest.cpp>
>>>>     in Ctlra as well.
>>>>     (Sorry, I am not completely though the API so this might be wrong)
>>>>
>>>>
>>>> As above, I'm not liking the OSC semantic meaning side of things -
>>>> Ctlra is a C library and provides events. Mapping (to OSC, or whatever) is
>>>> up to the application. Or if there is value, somebody could create a
>>>> OscApiForCtlra library - but personally I don't see that as having value at
>>>> the moment.
>>>>
>>>>     We need a kind of generic data point enumerator expression for every
>>>>     event, which is able to discover all controller features.
>>>>
>>>>
>>>> Ctlra API enables this already. The ctlra_dev_info_t struct has all
>>>> names of all events, and the counts of each. In the POC implementation, the
>>>> size of the controller, and control position / size are available as
>>>> integer values in millimeters. This enables a GUI application to "mock up"
>>>> the controller, no photos / pictures involved.
>>>>
>>>>     Every data point should have a function for examine like
>>>>     ctlra_dev_get_osc_namespace() and ctlra_dev_get_picture_location()
>>>>     Will this work? Does this fit to the ctlra goals?
>>>>
>>>>
>>>> I feel the Ctlra API enables the events + physical device info already.
>>>> Adding OSC namespaces etc above it is not it the scope of Ctlra, nor should
>>>> it be in my opinion. (Due to not *demanding* applications use any
>>>> particular form of mapping / interpreting events). Visually enabling
>>>> controllers is achieved by providing physical layout info of the device,
>>>> instead of using a photo - a much better solution IMO.
>>>>
>>>> Thoughts / opinions? -Harry
>>>>
>>>>     Am 09.07.2017 um 13:18 schrieb Harry van Haaren:
>>>>
>>>>     On Sun, Jul 9, 2017 at 11:21 AM, Daniel Schürmann
>>>>>     <dasch...@mixxx.org <mailto:dasch...@mixxx.org>> wrote:
>>>>>
>>>>>         Hi Harry, Hi Be,
>>>>>
>>>>>         here some comments:
>>>>>
>>>>>         IMHO arguing about If C or JS is easier will not lead us ahead
>>>>>         in this discussion.
>>>>>
>>>>>
>>>>>     Good point - apologies for the rat-hole.
>>>>>
>>>>>         > As noted above, we can take TCC off the table for Mixxx's
>>>>>         use case. Personally I still love it - and it has radically
>>>>>         changed how I think about programming in C - but perhaps its
>>>>>         just not a good fit for Mixxx. I can work with that.
>>>>>
>>>>>         I am afraid a mandatory TCC based Ctlra solution will prevent
>>>>>         it from being successful.
>>>>>
>>>>>
>>>>>     At no point to I think Ctlra will *require* also using TCC. It
>>>>>     just so happens that they complement each other well for my
>>>>> use-cases.
>>>>>
>>>>>         Only a solution that works nice Windows as well as on non X86
>>>>>         based architectures will be accepted as a new standard.
>>>>>
>>>>>
>>>>>     TCC supports a variety of targets; and despite no official
>>>>>     releases, the git repo is pretty active:
>>>>>     http://repo.or.cz/w/tinycc.git
>>>>>
>>>>>         For me, the key is here to be modular. Similar to LV2 each
>>>>>         driver Ctlra driver can be shipped with a source file and a
>>>>>         meta-data file which should contain a recipe to turn the
>>>>>         source file into a *.so or a dll. In a future advanced step,
>>>>>         the hosts Ctlra library code should be responsible to read the
>>>>>         recipe and do what it should be done to turn it into a binary.
>>>>>
>>>>>
>>>>>     I'm not sure what the benefit is here - i see a pretty complex
>>>>>     workflow, but no ultimate gain that TCC doesn't already provide.
>>>>>     But I said I'd drop the TCC idea and discuss other options.
>>>>>
>>>>>         > Lets find a better solution for novice / casual users who
>>>>>         don't want to compile anything.
>>>>>
>>>>>         The compile step itself is not the issue. If we look for
>>>>>         example to OpenGL Shading Language, where we also have a
>>>>>         compiler step no one noticed.
>>>>>
>>>>>
>>>>>     Good point.
>>>>>
>>>>>         >> Even if we have a ctlra controller in Mixxx, we need to
>>>>>         adapt the signals to Mixxx Control Objects using xml or js
>>>>> files.
>>>>>
>>>>>         > Why XML or JS? I see many more options, and just because we
>>>>>         have existing infrastructure for a similar case doesn't mean
>>>>>         its always the correct solution.
>>>>>
>>>>>         Just because Mixxx is using it right now. It is IMHO not in
>>>>>         the responds of Ctlra to convert controller events into
>>>>>         application commands.
>>>>>
>>>>>
>>>>>     OK - then lets investigate this option more. Keep in mind that my
>>>>>     JS experience is limited, and that I'm not particularly familiar
>>>>>     with QT/Mixxx's JS engine capabilities.
>>>>>     I'll post a PR asap that exposes Ctlra events to Mixxx, and then
>>>>>     see what kind of JS magic is required on top to expose that to the
>>>>>     JS mapping scripts.
>>>>>
>>>>>         > I'm still not convinced it is possible for any
>>>>>         point-and-click system to fully map most controllers **in a
>>>>>         maintainable way**. ...
>>>>>
>>>>>
>>>>>         This is should be out of scope of Ctlra.
>>>>>
>>>>>
>>>>>     Absolutely yes - this is outside the scope of Ctlra - at this
>>>>>     point we are talking about the integration of Ctlra + Mixxx in
>>>>>     particular. This was noted by a few developers at the LAC too,
>>>>>     that device access is only a part of the problem. Providing a good
>>>>>     mapping mechanism is the harder part. But we need step 1 (Ctlra
>>>>>     device access) before step 2 (easy/powerful mappings).
>>>>>
>>>>>         IDEA:
>>>>>
>>>>>         Thinking of all of this again, I think this Ctlra project is a
>>>>>         great chance to fix some issues, existing standards have.
>>>>>
>>>>>         * Midi: Midi is that successfully, because it is defined up to
>>>>>         the Application layer for a Midi-Keyboard. Reusing this for
>>>>>         other types of controllers works, but pushes it down to the
>>>>>         Presentation Layer.
>>>>>         * OSC: OSC fails to define the Application layer. It is
>>>>>         promoted to be a Midi successor, but it even has no standard
>>>>>         way to even transport good old midi messages. There are
>>>>>         approaches to fix this in some OSC namespaces, but this is
>>>>>         somehow stucked.
>>>>>
>>>>>         It would be grate If we could get back to the state of
>>>>>         original Midi Plug-And-Play behaviour for Midi-Keyboard for
>>>>>         all type of controllers using Ctlra. If we do this along with
>>>>>         a OSC namespace for Ctlra, this will be a great benefit and
>>>>>         probably a very successfully.
>>>>>
>>>>>
>>>>>     Lets see!
>>>>>
>>>>>         On a Midi-Keyborad you know exactly which phsical key is
>>>>>         pressed an how just looking to the midi Message.
>>>>>         This can be done for Ctlra as well, I we define a message like
>>>>>         "Gain Knob Deck A 56 %" So a new controller will be instantly
>>>>>         usable for Mixxx with a basic default mapping. This is
>>>>>         probably not sufficient, but putting a new function on "Gain
>>>>>         Knob Deck A" can be done by existing mapping solutions.
>>>>>
>>>>>
>>>>>     Yes, simple "static" mapping schemes can be easily handled by
>>>>>     mapping event IDs to ControlProxy objects. As Be pointed out, the
>>>>>     difficult point is layering multiple functionalities over each
>>>>>     other in a user-workable way.
>>>>>
>>>>>         I have these Architectures in mind:
>>>>>
>>>>>         OpenAV setup:
>>>>>
>>>>>         HID-Controller
>>>>>                  V
>>>>>         Ctlra Driver
>>>>>                  V
>>>>>         Cltra Lib
>>>>>                  V
>>>>>         C Mapping
>>>>>                  V
>>>>>         OpenAV App
>>>>>
>>>>>
>>>>>         Mixxx setup:
>>>>>
>>>>>         HID-Controller
>>>>>                  V
>>>>>         Ctlra Driver
>>>>>                  V
>>>>>         Cltra Lib
>>>>>                  V
>>>>>         Controller Proxy
>>>>>                  V
>>>>>         XML / *js mapping
>>>>>                  V
>>>>>         Mixxx engine
>>>>>
>>>>>
>>>>>
>>>>>         Gnereic OSC setup:
>>>>>
>>>>>         HID-Controller
>>>>>                  V
>>>>>         Ctlra Driver
>>>>>                  V
>>>>>         Cltra Lib
>>>>>                  V
>>>>>         OSC Wrapper (process)
>>>>>                  V
>>>>>            UDP/TCP
>>>>>                  V
>>>>>         OSC to OSC mapper
>>>>>                  V
>>>>>         UDP/TCP
>>>>>                  V
>>>>>         OSC enabled DAW
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>         What do you think?
>>>>>
>>>>>
>>>>>     That proposal looks really good. It basically means, from a Ctlra
>>>>>     POV, that Ctlra is plain old C code, and exposes generic events.
>>>>>     The application can interpret those in whatever way it wants -
>>>>>     OSC, JS/Mixxx, or however OpenAV stuff will end up doing this. It
>>>>>     keeps Ctlra just generic events, and allows the application to
>>>>>     solve the mapping problem in its own way. That sounds logical and
>>>>>     a good abstraction, which is exactly what Ctlra aims for.
>>>>>
>>>>>     In order to progress this idea, I'll post code up ASAP, which
>>>>>     makes the generic Ctlra events available in a callback as part of
>>>>>     the CtlraController class. After that, the Mixxx/JS components
>>>>>     must be designed / worked on to fully enable Ctlra in Mixxx.
>>>>>
>>>>>     Thanks for all the input - we seem to be converging on a solution,
>>>>>     great! -Harry
>>>>>
>>>>>         Am 09.07.2017 um 06:52 schrieb Be:
>>>>>
>>>>>>         Hi Harry,
>>>>>>         I read the paper for the presentation at LAC 2017 that you
>>>>>>         linked on IRC:
>>>>>>         http://musinf.univ-st-etienne.fr/lac2017/pdfs/01_C_E_137795.
>>>>>> pdf
>>>>>>         <http://musinf.univ-st-etienne.fr/lac2017/pdfs/01_C_E_137795
>>>>>> .pdf>
>>>>>>
>>>>>>
>>>>>>         Going along with what I mentioned in my previous post, I do
>>>>>>         not think Ctlra should be aware of the "userdata". IMO that
>>>>>>         should be left to the application and its scripting
>>>>>> environment.
>>>>>>
>>>>>>         On 07/08/2017 08:36 PM, Be wrote:
>>>>>>
>>>>>>>         On 07/08/2017 06:51 PM, Harry van Haaren wrote:
>>>>>>>
>>>>>>>>             3. The programming language. It is a lot easier to find
>>>>>>>>         someone who
>>>>>>>>             knows JavaScript, or at least kinda knows JavaScript
>>>>>>>>         enough to get
>>>>>>>>             by for a small project, than it is to find someone who
>>>>>>>>         knows C. For
>>>>>>>>             people with minimal or no prior programming experience,
>>>>>>>>         higher level
>>>>>>>>             languages are much easier to learn.
>>>>>>>>
>>>>>>>>
>>>>>>>>         Surely anybody somewhat proficient in JS can figure out
>>>>>>>>         what this (link below) does?? Programming is programming -
>>>>>>>>         logical thinking. I don't think that the C code there is
>>>>>>>>         "harder" than achieving the same in JS. Keep in mind we're
>>>>>>>>         not asking people to do pointer-magic here - its basic
>>>>>>>>         arithmetic, and calling a functions.
>>>>>>>>         https://github.com/openAVprodu
>>>>>>>> ctions/openAV-Ctlra/blob/master/examples/vegas_mode/z1.c#L45
>>>>>>>>         <https://github.com/openAVprod
>>>>>>>> uctions/openAV-Ctlra/blob/master/examples/vegas_mode/z1.c#L45>
>>>>>>>>
>>>>>>>>
>>>>>>>         C is more difficult to learn than JavaScript. There are a
>>>>>>>         lot of details in that code that you simply don't have to
>>>>>>>         think or know about with JavaScript. To a novice developer
>>>>>>>         who knows nothing about C, they'd have to answer these
>>>>>>>         questions:
>>>>>>>
>>>>>>>          > if(e->slider.id <http://slider.id> ==
>>>>>>>
>>>>>>>         NI_KONTROL_Z1_SLIDER_LEFT_FADER) {
>>>>>>>
>>>>>>>         What is the difference between "->" and "."?
>>>>>>>
>>>>>>>          > uint32_t iter = (int)((d->volume+0.05) * 7.f);
>>>>>>>
>>>>>>>         1. What is a uint32_t? Why should I use that instead of a
>>>>>>>         different number type?
>>>>>>>         2. What is that "(int)" doing?
>>>>>>>         3. Why is there a ".f" after the "7"?
>>>>>>>
>>>>>>>         That's just the tip of the iceberg of understanding a few
>>>>>>>         lines of code. Fully mapping controllers requires
>>>>>>>         considerably more complex logic than that.
>>>>>>>
>>>>>>>             So, I think it would make more sense to expose Ctlra to
>>>>>>>>         Mixxx's
>>>>>>>>             existing JavaScript environment for controller mapping.
>>>>>>>>         There would
>>>>>>>>             only need to be two capabilities added for this to work:
>>>>>>>>             1. Scripts would be able to register JavaScript
>>>>>>>>         callback functions
>>>>>>>>             that would be called when particular Ctlra events are
>>>>>>>>         passed to Mixxx.
>>>>>>>>             2. Scripts would need to have a way to send output
>>>>>>>>         messages to
>>>>>>>>             Ctlra. There should be a way to freeze/unfreeze the
>>>>>>>>         sending of
>>>>>>>>             output messages so many outputs could be updated
>>>>>>>>         simultaneously in a
>>>>>>>>             single HID packet.
>>>>>>>>             I have written a proposal for how to do this with MIDI:
>>>>>>>>         https://mixxx.org/wiki/doku.ph
>>>>>>>> p/registering_midi_input_handlers_from_javascript
>>>>>>>>         <https://mixxx.org/wiki/doku.p
>>>>>>>> hp/registering_midi_input_handlers_from_javascript>
>>>>>>>>
>>>>>>>>         <https://mixxx.org/wiki/doku.p
>>>>>>>> hp/registering_midi_input_handlers_from_javascript>
>>>>>>>>         <https://mixxx.org/wiki/doku.p
>>>>>>>> hp/registering_midi_input_handlers_from_javascript>
>>>>>>>>
>>>>>>>>             It would be great if we could create JS APIs that are
>>>>>>>>         almost
>>>>>>>>             identical for MIDI and Ctlra.
>>>>>>>>
>>>>>>>>
>>>>>>>>         I'm still not sold on the idea of wrapping all of Ctlra up
>>>>>>>>         in JS callbacks and then exposing it to Mixxx. Its
>>>>>>>>         possible, but I fail to see why this should be the
>>>>>>>>         holy-grail of how mappings should work. I should probably
>>>>>>>>         do up a design-doc or video on how I think *eventually* the
>>>>>>>>         Ctlra / Mixxx UX for mapping a controller would look: and
>>>>>>>>         if I can figure out the technical parts, it will be pretty
>>>>>>>>         revolutionary in how it enables novice users to create
>>>>>>>>         unique mappings. Punch line is to present the functionality
>>>>>>>>         (multi-layered bindings) in a way that is easily consumed
>>>>>>>>         by "ordinary" humans, and provide a doc + video explaining
>>>>>>>>         it. Give me a few weeks - some POC Ctlra + Mixxx code
>>>>>>>>         first, then onwards to the exact mapping UX.
>>>>>>>>
>>>>>>>
>>>>>>>         I'm still not convinced it is possible for any
>>>>>>>         point-and-click system to fully map most controllers *in a
>>>>>>>         maintainable way*. Years ago, device specific hacks were
>>>>>>>         added to Mixxx in C++ to make the XML system work with MIDI
>>>>>>>         signals for jog wheels. Someone please correct me if I am
>>>>>>>         wrong, but my understanding is that the JS engine was added
>>>>>>>         to avoid the need for such compiled-in device specific
>>>>>>>         hacks. Almost all mappings submitted for inclusion in Mixxx
>>>>>>>         recently have been done mostly or entirely in JS. Traktor
>>>>>>>         has an elaborate point-and-click mapping system and users
>>>>>>>         complain how awful it is to work with (refer to
>>>>>>>         https://djworx.com/what-do-you-want-from-traktor-pro/
>>>>>>>         <https://djworx.com/what-do-you-want-from-traktor-pro/> for
>>>>>>>         example).
>>>>>>>
>>>>>>>         I have previously thought about designing a GUI that used
>>>>>>>         tabs to organize different layers of functionality. But this
>>>>>>>         would break down quickly for handling the interaction of
>>>>>>>         multiple layers and create a mess even worse than Traktor's
>>>>>>>         mapping GUI. For example, consider a cue button that uses
>>>>>>>         the cue_default ControlObject normally but start_stop while
>>>>>>>         a shift button is held. You could define a layer that the
>>>>>>>         unshifted button belongs to and another layer that the
>>>>>>>         shifted button belongs to. Okay, easy enough. Now you want
>>>>>>>         to make that side of the controller able to be toggled
>>>>>>>         between deck 1 & deck 3. How would you accomplish this? With
>>>>>>>         a simple layering system, you could create 4 different
>>>>>>> layers:
>>>>>>>
>>>>>>>         Deck 1 unshifted
>>>>>>>         Deck 1 shifted
>>>>>>>         Deck 3 unshifted
>>>>>>>         Deck 3 shifted
>>>>>>>
>>>>>>>         Then you'd need to copy & paste all those 4 layers for the
>>>>>>>         other side of the controller with decks 2 & 4! It would be
>>>>>>>         possible to hack support for toggling decks into Mixxx so
>>>>>>>         the mapping could deal with a virtual deck and Mixxx would
>>>>>>>         maintain the state of which deck is active, but that would
>>>>>>>         only handle this specific use case. And you'd still need to
>>>>>>>         copy & paste for the left & right sides of the controller.
>>>>>>>
>>>>>>>         What if I want pushing a button to use the beatloop_activate
>>>>>>>         ControlObject when no loop is active but use reloop_toggle
>>>>>>>         when a loop is active? I'd need to create a layer for a loop
>>>>>>>         being enabled and a layer for no loop enabled, then somehow
>>>>>>>         tell Mixxx to switch between them when that state changes.
>>>>>>>         Then I'd have to duplicate both those layers for deck 1 &
>>>>>>>         deck 3. Now I want pressing that button to act differently
>>>>>>>         when shift is pressed -- and act differently depending on
>>>>>>>         whether a loop is active. When shift is pressed, I want to
>>>>>>>         use reloop_toggle with no loop active and reloop_andstop
>>>>>>>         with a loop active. With a GUI layering system, I'd need
>>>>>>>         layers for:
>>>>>>>
>>>>>>>         Deck 1, loop disabled, no shift
>>>>>>>         Deck 1, loop disabled, shift
>>>>>>>         Deck 1, loop enabled, no shift
>>>>>>>         Deck 1, loop enabled, shift
>>>>>>>         Deck 3, loop disabled, no shift
>>>>>>>         Deck 3, loop disabled, shift
>>>>>>>         Deck 3, loop enabled, no shift
>>>>>>>         Deck 3, loop enabled, shift
>>>>>>>
>>>>>>>         And again copy and paste for decks 2 & 4. Now there are 16
>>>>>>>         layers for pushing this button! What if you wanted to remap
>>>>>>>         it? Maintaining even this example would be a pain, and
>>>>>>>         that's just one component of the controller. Programming an
>>>>>>>         entire mapping this would would be awful.
>>>>>>>
>>>>>>>         Also consider how you could implement
>>>>>>>         https://mixxx.org/wiki/doku.php/standard_effects_mapping
>>>>>>>         <https://mixxx.org/wiki/doku.php/standard_effects_mapping>
>>>>>>>         for the Kontrol X1, S2, S4, and S5 with such a system.
>>>>>>>         Again, you could hack all that logic into the C++ side of
>>>>>>>         Mixxx like the deck toggling case, but then what would you
>>>>>>>         do to implement something like the effects mapping for the
>>>>>>>         Pioneer DDJ-SB2:
>>>>>>>         https://mixxx.org/wiki/doku.php/pioneer_ddj-sb2#effects
>>>>>>>         <https://mixxx.org/wiki/doku.php/pioneer_ddj-sb2#effects>
>>>>>>>         (particularly the Mixxx 2.1 mapping).
>>>>>>>
>>>>>>>         This video talks about the uselessness of visual diagramming
>>>>>>>         languages like UML, and I think much of what is said about
>>>>>>>         visual diagramming languages in this applies to programming
>>>>>>>         with a GUI as well:
>>>>>>>         https://www.youtube.com/watch?v=4_SvuUYQ5Fo
>>>>>>>         <https://www.youtube.com/watch?v=4_SvuUYQ5Fo>
>>>>>>>
>>>>>>>         That said, if you have revolutionary ideas for how to design
>>>>>>>         a GUI for mapping controllers that could actually handle all
>>>>>>>         the complexity above and not be a huge pain to work with,
>>>>>>>         please share. I'd love to be proven wrong... but I think
>>>>>>>         it's more likely that you'd waste time that could be better
>>>>>>>         spent making Mixxx do other cool things or writing a new
>>>>>>>         OpenAV application.
>>>>>>>
>>>>>>>
>>>>>>>>         Thanks for your input again - good points raised. -Harry
>>>>>>>>
>>>>>>>>
>>>>>>>>             On 07/06/2017 04:57 PM, Harry van Haaren wrote:
>>>>>>>>
>>>>>>>>                 Hi All,
>>>>>>>>
>>>>>>>>                 First of all - this is my first post to the
>>>>>>>>         Mixxx-devel list, so
>>>>>>>>                 a brief intro is in order;
>>>>>>>>                 I'm Harry van Haaren, developer of the OpenAV audio
>>>>>>>>         software,
>>>>>>>>                 bit of a music/tech/linux head :)
>>>>>>>>
>>>>>>>>                 I've recently been working on improving controller
>>>>>>>>         support in
>>>>>>>>                 Linux audio land, in particular
>>>>>>>>                 what I call "modern USB HID" controller devices
>>>>>>>>         (think DJ
>>>>>>>>                 controllers like Akai/NI/Abletons range).
>>>>>>>>                 I've developed the Ctlra library as OpenAV, which
>>>>>>>>         provides
>>>>>>>>                 access to these hardware devices
>>>>>>>>                 on Linux. The library allows hotplug and various
>>>>>>>> other
>>>>>>>>                 "advanced" features like accessing
>>>>>>>>                 screens on devices.
>>>>>>>>
>>>>>>>>                 I'd like to integrate Ctlra into Mixxx - to provide
>>>>>>>>         access to
>>>>>>>>                 hardware currently not available
>>>>>>>>                 to Linux users, and also to provide hotplug support
>>>>>>>>         to those
>>>>>>>>                 controllers. I've created a blueprint
>>>>>>>>                 on Launchpad[1], and written an introduction on
>>>>>>>>         Ctlra and how I
>>>>>>>>                 propose to integrate it in Mixxx[2].
>>>>>>>>                 Finally, there is a documentation page on what
>>>>>>>>         Ctlra itself
>>>>>>>>                 achieves here[3], and the source is here[4].
>>>>>>>>
>>>>>>>>                 If you have an interest in hotplug of controllers,
>>>>>>>>         controller
>>>>>>>>                 support or hardware on Linux,
>>>>>>>>                 do have a read of the wiki page and others, and I'd
>>>>>>>>         appreciate
>>>>>>>>                 your input on the ideas!
>>>>>>>>
>>>>>>>>                 Thanks for all your efforts on Mixxx so far,
>>>>>>>>         onwards and upwards!
>>>>>>>>                 -Harry of OpenAV
>>>>>>>>
>>>>>>>>                 [1]
>>>>>>>>         https://blueprints.launchpad.n
>>>>>>>> et/mixxx/+spec/ctlra-controller-support
>>>>>>>>         <https://blueprints.launchpad.
>>>>>>>> net/mixxx/+spec/ctlra-controller-support>
>>>>>>>>
>>>>>>>>         <https://blueprints.launchpad.
>>>>>>>> net/mixxx/+spec/ctlra-controller-support>
>>>>>>>>         <https://blueprints.launchpad.
>>>>>>>> net/mixxx/+spec/ctlra-controller-support>
>>>>>>>>                 [2]
>>>>>>>>         https://www.mixxx.org/wiki/doku.php/ctlra_support
>>>>>>>>         <https://www.mixxx.org/wiki/doku.php/ctlra_support>
>>>>>>>>         <https://www.mixxx.org/wiki/doku.php/ctlra_support>
>>>>>>>>         <https://www.mixxx.org/wiki/doku.php/ctlra_support>
>>>>>>>>                 [3] http://openavproductions.com/doc/ctlra.html
>>>>>>>>         <http://openavproductions.com/doc/ctlra.html>
>>>>>>>>         <http://openavproductions.com/doc/ctlra.html>
>>>>>>>>         <http://openavproductions.com/doc/ctlra.html>
>>>>>>>>                 [4]
>>>>>>>>         https://github.com/openAVproductions/openAV-ctlra
>>>>>>>>         <https://github.com/openAVproductions/openAV-ctlra>
>>>>>>>>         <https://github.com/openAVproductions/openAV-ctlra>
>>>>>>>>         <https://github.com/openAVproductions/openAV-ctlra>
>>>>>>>>
>>>>>>>>                 --
>>>>>>>>         http://www.openavproductions.com
>>>>>>>>         <http://www.openavproductions.com>
>>>>>>>>         <http://www.openavproductions.com>
>>>>>>>>         <http://www.openavproductions.com>
>>>>>>>>
>>>>>>>>
>>>>>>>>         ------------------------------
>>>>>>>> ------------------------------------------------
>>>>>>>>
>>>>>>>>                 Check out the vibrant tech community on one of the
>>>>>>>>         world's most
>>>>>>>>                 engaging tech sites, Slashdot.org!
>>>>>>>>         http://sdm.link/slashdot
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>                 _______________________________________________
>>>>>>>>                 Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>>>>>>>>         http://mixxx.org
>>>>>>>>
>>>>>>>>
>>>>>>>>                 Mixxx-devel mailing list
>>>>>>>>         Mixxx-devel@lists.sourceforge.net
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>
>>>>>>>>
>>>>>>>>         ------------------------------
>>>>>>>> ------------------------------------------------
>>>>>>>>
>>>>>>>>             Check out the vibrant tech community on one of the
>>>>>>>>         world's most
>>>>>>>>             engaging tech sites, Slashdot.org!
>>>>>>>>         http://sdm.link/slashdot
>>>>>>>>             _______________________________________________
>>>>>>>>             Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>>>>>>>>         http://mixxx.org
>>>>>>>>
>>>>>>>>
>>>>>>>>             Mixxx-devel mailing list
>>>>>>>>         Mixxx-devel@lists.sourceforge.net
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>>         https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>         --
>>>>>>>>         http://www.openavproductions.com
>>>>>>>>         <http://www.openavproductions.com>
>>>>>>>>
>>>>>>>
>>>>>>>         ------------------------------------------------------------
>>>>>>> ------------------
>>>>>>>
>>>>>>>         Check out the vibrant tech community on one of the world's
>>>>>>> most
>>>>>>>         engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>>         _______________________________________________
>>>>>>>         Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>>>>>>>         http://mixxx.org
>>>>>>>
>>>>>>>
>>>>>>>         Mixxx-devel mailing list
>>>>>>>         Mixxx-devel@lists.sourceforge.net
>>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>>         https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>>
>>>>>>
>>>>>>         ------------------------------------------------------------
>>>>>> ------------------
>>>>>>
>>>>>>         Check out the vibrant tech community on one of the world's
>>>>>> most
>>>>>>         engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>>         _______________________________________________
>>>>>>         Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>>>>>>         http://mixxx.org
>>>>>>
>>>>>>
>>>>>>         Mixxx-devel mailing list
>>>>>>         Mixxx-devel@lists.sourceforge.net
>>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>>         https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>         ------------------------------------------------------------
>>>>> ------------------
>>>>>         Check out the vibrant tech community on one of the world's most
>>>>>         engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>>>>>         _______________________________________________
>>>>>         Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>>>>>         http://mixxx.org
>>>>>
>>>>>
>>>>>         Mixxx-devel mailing list
>>>>>         Mixxx-devel@lists.sourceforge.net
>>>>>         <mailto:Mixxx-devel@lists.sourceforge.net>
>>>>>         https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>>>>         <https://lists.sourceforge.net/lists/listinfo/mixxx-devel>
>>>>>
>>>>>
>>>>>
>>>>>     --
>>>>>     http://www.openavproductions.com <http://www.openavproductions.com
>>>>> >
>>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> http://www.openavproductions.com
>>>>
>>>
>>
>>
>> --
>>
>> http://www.openavproductions.com
>>
>> ------------------------------------------------------------
>> ------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>> _______________________________________________
>> Get Mixxx, the #1 Free MP3 DJ Mixing software Today
>> http://mixxx.org
>>
>>
>> Mixxx-devel mailing list
>> Mixxx-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/mixxx-devel
>>
>
>


-- 

http://www.openavproductions.com
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Get Mixxx, the #1 Free MP3 DJ Mixing software Today
http://mixxx.org


Mixxx-devel mailing list
Mixxx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mixxx-devel

Reply via email to