Hi Harry,

Ok, you are probably right.

I did not follow the early discussion, but I would agree to the Linux Audio developers, that relying on those profiles will just not work. A powerful mapping system is mandatory to fully support a specific device from a specific application.

If we look at OSC, we also do not find initially application profiles.
But due to it's namespace address, it is possible to define them.
http://www.nime.org/proceedings/2014/nime2014_300.pdf

So I still think we will have a benefit, if we add a machine readable string to each event just to be OSC compatible and transparent.

Kind regards,

Daniel



Am 09.07.2017 um 20:35 schrieb Harry van Haaren:
On Sun, Jul 9, 2017 at 7:04 PM, Daniel Schürmann <dasch...@mixxx.org <mailto: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>
        <mailto: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/master/ctlra/event.h#L63
        
<https://github.com/openAVproductions/openAV-Ctlra/blob/master/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>
             <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
<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/master/examples/simple/simple.c#L51
        
<https://github.com/openAVproductions/openAV-Ctlra/blob/master/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/effects/lv2/lv2manifest.cpp
        
<https://github.com/mixxxdj/mixxx/blob/lv2_support2/src/effects/lv2/lv2manifest.cpp>
<https://github.com/mixxxdj/mixxx/blob/lv2_support2/src/effects/lv2/lv2manifest.cpp
        
<https://github.com/mixxxdj/mixxx/blob/lv2_support2/src/effects/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>
            <mailto: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>
<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/openAVproductions/openAV-Ctlra/blob/master/examples/vegas_mode/z1.c#L45
                        
<https://github.com/openAVproductions/openAV-Ctlra/blob/master/examples/vegas_mode/z1.c#L45>
<https://github.com/openAVproductions/openAV-Ctlra/blob/master/examples/vegas_mode/z1.c#L45
                        
<https://github.com/openAVproductions/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>
                    <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.php/registering_midi_input_handlers_from_javascript
                        
<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript>
<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript
                        
<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript>>

<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript
                        
<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript>>
<https://mixxx.org/wiki/doku.php/registering_midi_input_handlers_from_javascript
                        
<https://mixxx.org/wiki/doku.php/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/>
<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>
<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>
<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>
<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.net/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>>

<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
                        
<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>>
<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>>
<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>>
<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>>
                                 <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>>
<mailto: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>>
<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>>
<mailto: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>>
<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>
                                 <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>>




------------------------------------------------------------------------------
                     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>
            <http://www.openavproductions.com
            <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

Reply via email to