hedgehog/ideas/ TheCaseForMx32


The Case for Hedgehog (aka Mx32 and friends)

"Who wants a mouse that only works with Photoshop? Or a keyboard that only works with Microsoft Word?" — John Allsup

Food for Thought

To begin, I want to ask you to imagine a few things.

  1. Imagine you had a nice, shiny, £100 mouse. Produced in association with Adobe, and which only works with Photoshop, and except for being used with Photoshop, is only a small paperweight.
  2. For a slightly different image along the same lines. Imagine that, while with Adobe Photoshop you got the full functionality of the mouse, with all other apps, the best you got was that the buttons worked, but not the X-Y movement.
  3. And for another, not quite as bad, but almost example. Imagine you had a SuperPainterMouse(™), which had, say, pressure sensitive buttons. Imagine that this mouse could work with applications aside from Photoshop, even worked on Linux, but only worked with with painting programs which had to integrate special support for this SuperPainterMouse(™).
  4. Now imagine someone using Libreoffice Writer. They want to change the font size. At present, they have to grab the mouse, find a small area towards the top of the screen, and then either click a drop-down menu to select a value, or perhaps click on a tiny text box and type a number in. Imagine if, as an alternative, they could just grab and turn a knob?
  5. Now imagine you had a set of e.g. 4 or 8 knobs on a small device attached to your USB port. You could select e.g. text colour, and then those 4 knobs could either step through a palette (a simple 24ppr rotary encoder with detents), or perhaps use three knobs to adjust R,B,G or H,S,L or something. All at the choice of the user, and selected somehow.
  6. Then hop over into Gimp, and imagine you have those same 4-8 knobs. Now you could paint with your right hand, e.g. using a pen, and use the knobs to control e.g. brush size, or colour, or something. The serious power user could have a few banks of these knobs so that everything from colour, brush size, and so on, could be controlled with those same general purpose knobs.
  7. Now imagine that the hardware could be made by makers with an almost trivial bit of wiring, and an arduino, and simple code that only chas to send bytes over a USB-serial connection to report when knobs are turned or buttons are pressed. Everything else happens downstream in software. (Possibly including things like all but the simplest debouncing.)
  8. Then imagine you are a bedroom hobbyist music producer who also uses their PC for other things like word processing, web browsing, and digital art. They have a small keyboard, like e.g. the Komplete Kontrol M32 (an example, but I have one). In your word processor, you could use e.g. middle C to toggle bold, D next to it to toggle italic, other keys to select the mode for the 8 knobs, and then use those knobs to control e.g font size or text colour. And use those buttons for things like shortcuts to select styles. But as things are now, you only get full functionality of an M32 with Native Instrument's own proprietary software. There is no 'dumb' mode where it only reports raw hardware events. Even the midi mode has issues since, unlike the Behringer BCR32, you can't configure the rotaries to work in relative mode so that they simply report +/- 1 events when knobs are turned..
  9. So imagine the world where what those knobs mean is software defined. Actually, think that things are also reasonably network transparent, so events on one machine are directed to a general purpose event hub, and then forwarded over the network, possibly with our without processing, to other machines. **You could use a spare laptop with e.g. a touchscreen (like TouchOSC) to control things, but not just music applications.

So that's the vision for part of it. Here are some more analogies to consider:

  1. Consider the telephone system. Imagine you had a phone system that could only connect to a quarter of the people in your village, and nothing else. If you wanted to talk to a friend in another city, you had to find out which telephone exchange they used, and find a local phone compatible with it. You couldn't just use your phone, key in the appropriate phone number, and talk. Stupid isn't it. But that's what it's like at present, in the domain that Mx32 seeks to improve:

    a. To copy to the clipboard, you usually press Ctrl-C, but that

    doesn't always work. With a terminal emulator on Linux or Windows, often you have to use Ctrl-Shift-C instead. With some emulators, since Ctrl-C is needed to send a cancel message to a command line program, they use the very old, pre-Windows 95 keyboard shortcut of Shift-Insert to paste, and I think you have to select and right-click the mouse to copy. In this day and age, it is silly. You want the equivalent of a 'copy emoji', that you send the program, and it then know, unambiguously, that you want to copy. You could even use an extra character or Word to indicate which clipboard you want to copy to (so you can have multiple clipboards). How you send that 'copy emoji' is up to you, but if you had a bank of configurable function buttons, or a small touchscreen, or even an app on your smartphone or tablet, any of those are capable of sending a signal, possibly over a network, so that your desktop OS knows to send the 'copy emoji' to your focussed application. It also opens the door to scripting having an easy way to send a copy signal to a program. *And this concept extends naturally to any*** signal we want — everything a menu item does, could be triggered by an appropriate signal, and standard things like Cut, Copy, Paste, Open, Preferences, etc., could be represented by the same 'action emoji'. Per-application keyboard shortcuts are so twenty-five years ago.

  2. Or instead of the phone system, consider the modern email and the Web. This works so well because there is only one email system, with standards, and comprised by multiple networks that talk to each other via standard protocols. And the Web is viewed by a small number of browser engines (Blink, Webkit and Gecko), which all follow a public set of standards. What can be standardised between browsers often has been, and this makes life so much easier for Web developers compared to how things were when there was IE and Netscape with their own independent, incompatible extensions to HTML and Javascript, so that you had to add lost of random browser detection code.

  3. Now consider one particular framework: Qt. It has a nice concept of 'Signals and Slots', inspired by Objective-C's paradigm of objects sending each other messages, in turn inspired by Smalltalk. But Qt Signals and Slots only work in Qt programs, and only within the same program. Objective-C messages, which in Swift are now reduced to acting like simple function calls with a small extra overhead, are confined largely to within an application process. Conceptually they all do the same thing: send a recognised signal from A to B that something has happened, or that an application wants something to happen. If it is conceptually the same, it should be implemented in a cross-framework network-translucent way. (By network translucent, it is meant that it may be possible to tell whether things are going over a network, but in principle any signal/event should be possible to send over a network, in a way conceptually similar to doing it in-process, and in a way which is freely available, cross-platform and cross-language. There have been a few examples to think of: Objective-C's distributed objects (and PDO), but that was confined to Objective-C and proprietary NeXT systems, and largely deprecated by the time MacOS X came out, so was useless to anybody by the end of the 20th century. Then there is QNX's window system, which was closed source, and proprietary to QNX's real time OS, so useless to anybody else.)

  4. Now consider something good for a change. Unicode. Before Unicode, we had 8-bit character sets. The first 128 of these characters were standardised as ASCII, and the other 128 could be used for other things like accented letters. But 256 possible characters was way too small. Unicode change this by having essentially a 32-bit space of possible characters (so basically on the order of billions), from which they could allocate code points for every character in every alphabetic language, most of the symbols from Chinese, and plenty of emoji too. Going from an 8-bit standard to a 32-bit standard opened myriad possibilities which nowadays we take for granted. Mx32 aims to do something similar for signals and events, both within and between processes, and both within and between machines on a network, possibly across the internet.