|
BuGUI
BUtton Grid User Interface
|
A library intended to facilitate user interface design on creative hardware, especially button grid controllers. Our approach is to consider these devices as very low resolution touch screens, with some additional controls potentially (buttons, encoders, actual screens). To that effect, the library is structured as a simplistic yet general-purpose UI system. This effort to keep our implementation generic makes it easily extensible and eventually capable of covering a wider range of both hardware interfaces and software use cases.
The interaction button grids afford is closely tied to the usage of hardware step sequencers and drum machines. However, various innovative implementation enable a greater variety of interfaces in different products. These interfaces are in most cases specific to a particular hardware, or software.
BuGUI acts as an abstraction layer between software and hardware. We propose a generic approach to hardware interfaces, where devices are essentially considered in the same way that screen, mouse, and keyboard are in regular GUI development. Ultimatley, BuGUI enables custom hardware integration for any software, available on every supported devices.
To create a BuGUI widget, simply inherit from either bugui::widget or bugui::container_widget. A container widget can contain other widgets, which can be added with the function add_widget<my_child_widget>(...).
A custom BuGUI widget can be painted on button grid when it defines a paint(painter&) function:
Widgets can respond to user input on their position. The functions on_press, on_double_press , on_drag and on_drop can be defined to handle each type of interaction. These functions allow for retrieving data from the presser object, such as the desired value type:
or the input's coordinates:
Additional functions can be defined in controller class can be defined to handle input from specific controls outside the button grid. For example, handling input from a device's labelled buttons, such as Play, Stop, Shift ...etc.
Device specifications are written in plain c++ classes. No includes or inheritance is required here. Here is a snipet from the Launchpad_Pro_Standalone class, enabling support for the Novation Launchpad Pro in standalone mode:
The research conducted in this publication was funded by the Irish Research Council under grant number EPSPG/2024/1176. It is supervised by Victor Lazzarini, Gordon Delap and Jean-Michaƫl Celerier. Many thanks to them, as well as Raphael Marczak and Simon Archipoff for their continued support!