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/
>> 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>
>>
>>
>> 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/
>> 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/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/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> ==
>>>>>
>>>>>         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_handl
>>>>>> ers_from_javascript
>>>>>>         <https://mixxx.org/wiki/doku.php/registering_midi_input_hand
>>>>>> lers_from_javascript>
>>>>>>
>>>>>>         <https://mixxx.org/wiki/doku.php/registering_midi_input_hand
>>>>>> lers_from_javascript>
>>>>>>         <https://mixxx.org/wiki/doku.php/registering_midi_input_hand
>>>>>> lers_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.net/mixxx/+spec/ctlra-controlle
>>>>>> r-support
>>>>>>         <https://blueprints.launchpad.net/mixxx/+spec/ctlra-controll
>>>>>> er-support>
>>>>>>
>>>>>>         <https://blueprints.launchpad.net/mixxx/+spec/ctlra-controll
>>>>>> er-support>
>>>>>>         <https://blueprints.launchpad.net/mixxx/+spec/ctlra-controll
>>>>>> er-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

Reply via email to