### Setup System-Wide Build Environment and Bundle Mixxx Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Installs a system-wide build environment, compiles a Mixxx Flatpak bundle, and installs it for the current user. Requires 15 GB of disk space and approximately 20 minutes. ```bash tools/flatpak_buildenv.sh setup --system ``` ```bash packaging/flatpak/flatpak_build.sh bundle ``` ```bash flatpak install --user Mixxx.flatpak ``` -------------------------------- ### Setup Flatpak Build Environment Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Configures Flathub as a Flatpak repository and installs necessary Flatpak packages (org.kde.Platform, org.kde.Sdk). Use --system for system-wide installation or --user for current user. --builder installs org.flatpak.Builder, and --debug installs debug symbols. ```bash tools/flatpak_buildenv.sh setup (--system | --user) [--builder] [--debug] ``` -------------------------------- ### Example Project Breakdown: Cover Art Implementation Source: https://github.com/mixxxdj/mixxx/wiki/Gsocadvice Demonstrates a phased approach to implementing 'cover art in Mixxx', starting with minimal requirements and adding features incrementally. ```plaintext - handle reading/storing covers in the database and application - Show the cover next to the track name in a deck - display the covers in the library view - add picture flow ``` -------------------------------- ### Qt5 Executable Setup Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Configures the mixxx executable using Qt5, including finding the Qt5 Core component and handling missing installations. ```cmake else() find_package(Qt5 COMPONENTS Core) # For Qt Core cmake functions # This is the first package form the environment, if this fails give hints how to install the environment if(NOT Qt5_FOUND) fatal_error_missing_env() endif() add_executable(mixxx WIN32 src/main.cpp) endif() ``` -------------------------------- ### Qt6 Executable Setup Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Configures the mixxx executable using Qt6, including finding the Qt6 Core component and handling missing installations. ```cmake if(QT6) find_package(Qt6 COMPONENTS Core) # For Qt Core cmake functions # This is the first package form the environment, if this fails give hints how to install the environment if(NOT Qt6_FOUND) fatal_error_missing_env() endif() # qt_add_executable() is the recommended initial call for qt_finalize_target() # below that takes care of the correct object order in the resulting binary # According to https://doc.qt.io/qt-6/qt-finalize-target.html it is importand for # builds with Qt < 3.21 if(ANDROID) target_compile_definitions( mixxx-lib PUBLIC __STDC_CONSTANT_MACROS __STDC_LIMIT_MACROS __STDC_FORMAT_MACROS ) set_property(TARGET mixxx-lib PROPERTY ANDROID_ABIS "arm64-v8a") target_compile_definitions( mixxx-lib PUBLIC ANDROID_PACKAGE_NAME="org.mixxx" ) qt_add_executable(mixxx src/main.cpp MANUAL_FINALIZATION) set_property( TARGET mixxx PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/packaging/android" ) set_target_properties(mixxx PROPERTIES QT_ANDROID_ABIS "${ANDROID_ABI}") set_target_properties(mixxx PROPERTIES QT_ANDROID_PACKAGE_NAME "org.mixxx") set_target_properties( mixxx PROPERTIES QT_ANDROID_VERSION_NAME "${MIXXX_VERSION}" ) set_target_properties( mixxx PROPERTIES QT_ANDROID_APPLICATION_ARGUMENTS "--qml --log-level debug --developer" ) qt_add_android_permission(mixxx NAME android.permission.ACCESS_NETWORK_STATE ) qt_add_android_permission(mixxx NAME android.permission.INTERNET ) qt_add_android_permission(mixxx NAME android.permission.MODIFY_AUDIO_SETTINGS ) qt_add_android_permission(mixxx NAME android.permission.RECORD_AUDIO ) qt_add_android_permission(mixxx NAME android.permission.WRITE_EXTERNAL_STORAGE ) qt_add_android_permission(mixxx NAME android.permission.MANAGE_EXTERNAL_STORAGE ) qt_add_android_permission(mixxx NAME android.permission.WAKE_LOCK ) qt_add_android_permission(mixxx NAME android.permission.USB_PERMISSION ) set( CMAKE_LINKER "${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/bin/ld" ) set( CMAKE_C_COMPILER "${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/bin/clang" ) set( CMAKE_CXX_COMPILER "${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/bin/clang++" ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC") set_target_properties( mixxx PROPERTIES QT_ANDROID_EXTRA_LIBS ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}/lib/clang/18/lib/linux/aarch64/libomp.so ) add_custom_target( copy-resource-android COMMENT "Copy resources folder to Android build asset directory" COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/packaging/android ${CMAKE_CURRENT_BINARY_DIR}/android COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/res ${CMAKE_CURRENT_BINARY_DIR}/android-build/assets WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) add_dependencies(mixxx copy-resource-android) target_link_libraries(mixxx PUBLIC omp) else() qt_add_executable(mixxx WIN32 src/main.cpp MANUAL_FINALIZATION) endif() else() find_package(Qt5 COMPONENTS Core) # For Qt Core cmake functions # This is the first package form the environment, if this fails give hints how to install the environment if(NOT Qt5_FOUND) fatal_error_missing_env() endif() add_executable(mixxx WIN32 src/main.cpp) endif() ``` -------------------------------- ### Install Transifex Client on Ubuntu Source: https://github.com/mixxxdj/mixxx/wiki/Internationalization Installs the Transifex client using apt-get. Ensure you have the necessary permissions. ```bash sudo apt-get install transifex-client ``` -------------------------------- ### Install Mixxx from Local Repository Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Install Mixxx using the previously added local repository. Specify `--system` or `--user` depending on your desired installation scope. ```bash flatpak install [--system | --user] local-mixxx-repo org.mixxx.Mixxx ``` -------------------------------- ### Install OBS Studio on Linux Source: https://github.com/mixxxdj/mixxx/wiki/Broadcasting With Obs Install FFmpeg, a prerequisite for OBS Studio on Linux. Then, add the OBS Studio PPA and install the package. ```bash sudo apt install ffmpeg ``` ```bash sudo add-apt-repository ppa:obsproject/obs-studio sudo apt install obs-studio ``` -------------------------------- ### Install Transifex Client on macOS Source: https://github.com/mixxxdj/mixxx/wiki/Internationalization Installs the Transifex client using pip after installing pip with easy_install. Ensure you have the necessary permissions. ```bash sudo easy_install pip sudo pip install transifex-client ``` -------------------------------- ### Install Build Tools with Homebrew Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-dependencies-for-macOS-arm64 Installs essential build tools required for the Mixxx compilation process using Homebrew. Ensure Homebrew is installed first. ```bash $ brew install automake autoconf-archive ccache nasm ninja pkg-config libtool ``` -------------------------------- ### Installing Compiled Mixxx Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Install Mixxx after compilation. Use `sudo` if the installation directory requires elevated privileges. Ensure the prefix matches the compilation step. ```shell sudo scons prefix=INSTALLATION_DIRECTORY install ``` -------------------------------- ### Install pre-commit Source: https://github.com/mixxxdj/mixxx/wiki/Using-Git Install the pre-commit framework. On Ubuntu 20.04, you can use pip3 if the default package manager is not suitable. ```bash sudo pip3 install pre-commit ``` -------------------------------- ### Install Debian/Ubuntu Packaging Tools Source: https://github.com/mixxxdj/mixxx/wiki/Packaging-Making-A-Mixxx-Installer Installs essential tools for Ubuntu packaging. Ensure these are installed before proceeding with package building. ```bash sudo aptitude -y install debhelper gnupg pbuilder # ubuntu packaging tools ``` -------------------------------- ### Install Mixxx Dependencies with vcpkg Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-dependencies-for-macOS-arm64 Installs all Mixxx dependencies using the bootstrapped vcpkg manager. Specify the installation root and target/host triplets for the build. ```bash ./vcpkg --x-install-root=installed --triplet=arm64-osx-min1100-release --host-triplet=arm64-osx-min1100-release install ``` -------------------------------- ### Install Linux Desktop Entry Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Installs the .desktop file for application menus on Linux systems (KDE/GNOME). ```cmake install( FILES "${CMAKE_CURRENT_SOURCE_DIR}/res/linux/org.mixxx.Mixxx.desktop" DESTINATION "${CMAKE_INSTALL_DATADIR}/applications" ) ``` -------------------------------- ### Install Arch Linux Build Tools Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Install essential development tools for compiling Mixxx on Arch Linux. ```sh sudo pacman -S --needed git gcc cmake ``` -------------------------------- ### Start a One-Shot Timer with Callback Source: https://github.com/mixxxdj/mixxx/wiki/Script-Timers Sets up a timer that executes a function once after a specified delay. This example uses an arrow function to light up an LED. Timer setup failure is indicated by a return value of 0. ```javascript if (engine.beginTimer(1000, () => { MyController.lightUp(0x3A,"red"); }, true) == 0) { print("LightUp timer setup failed"); } ``` ```javascript MyController.lightUp = function (led,color) { midi.sendShortMsg(0x90, led, MyController.colorCodes[color]); } ``` -------------------------------- ### Start Nix Development Environment Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Enter a Nix shell with keyfinder and default LV2 plugins enabled for development. ccache is used for faster recompiles. ```sh nix-shell --arg enableKeyfinder true --arg defaultLv2Plugins true ``` -------------------------------- ### Setup Fedora Build Environment Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Recommended script for setting up the build environment on Fedora, including RPM Fusion repository. ```sh tools/rpm_buildenv.sh setup ``` -------------------------------- ### Constructing and Sending System-Exclusive MIDI Messages Source: https://github.com/mixxxdj/mixxx/wiki/MIDI-Scripting System-exclusive messages require an array of bytes, starting with `0xF0` and ending with `0xF7`. The `length` parameter should include these start and end bytes. This example shows how to construct and send such a message using JavaScript. ```javascript const byteArray = [ 0xF0, byte2, byte3, ..., byteN, 0xF7 ]; midi.sendSysexMsg(byteArray, byteArray.length); ``` -------------------------------- ### Set Up Build Environment Script Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-on-macOS Sources the build environment script to download dependencies and set necessary environment variables for compiling Mixxx. Replace ~/mixxx with the actual path to your source code. ```shell source ~/mixxx/tools/macos_buildenv.sh setup ``` -------------------------------- ### Continuation Indent Example (Bad) Source: https://github.com/mixxxdj/mixxx/wiki/Coding-Guidelines Illustrates incorrect indentation for broken lines, which deviates from Mixxx's style guide and clang-format settings. ```cpp if (long_expression1 || long_expression2 || long_expression_with_along_parameter_1(parameter1) { long_expression_with_along_parameter_2(parameter1) } ``` -------------------------------- ### Install Build Dependencies (Debian/Ubuntu) Source: https://github.com/mixxxdj/mixxx/blob/main/CONTRIBUTING.md Run the Debian/Ubuntu build environment script to set up dependencies. This involves about 200 MB download and 1 GB disk space. ```shell tools/debian_buildenv.sh setup ``` -------------------------------- ### JavaScript Get Setting Example Source: https://github.com/mixxxdj/mixxx/wiki/MIDI-Scripting Demonstrates how to retrieve the value of a controller setting named 'theme' using the `engine.getSetting` function in JavaScript. The output will be the current value of the 'theme' setting. ```javascript const theme = engine.getSetting('theme'); console.log(theme); // Output: "stock" or "advanced" ``` -------------------------------- ### Master Sync Test Example Source: https://github.com/mixxxdj/mixxx/wiki/Unit-Tests Tests the interaction of control objects when Master Sync is active. Requires setup of a testing class that mocks the engine backend. Use ASSERT_FLOAT_EQ for floating-point comparisons. ```cpp #include "test/mockedenginebackendtest.h" class EngineSyncTest : public MockedEngineBackendTest { }; TEST_F(EngineSyncTest, InternalMasterSetFollowerSliderMoves) { // If internal is master, and we turn on a follower, the slider should move. QScopedPointer pButtonMasterSyncInternal(getControlObjectThread( ConfigKey("[Master]", "sync_master"))); pButtonMasterSyncInternal->slotSet(1); ControlObject::getControl(ConfigKey("[Master]", "sync_bpm"))->set(100.0); // Set the file bpm of channel 1 to 160bpm. ControlObject::getControl(ConfigKey(m_sGroup1, "file_bpm"))->set(80.0); QScopedPointer pButtonMasterSync1(getControlObjectThread( ConfigKey(m_sGroup1, "sync_mode"))); pButtonMasterSync1->slotSet(SYNC_FOLLOWER); ASSERT_FLOAT_EQ(getRateSliderValue(1.25), ControlObject::getControl(ConfigKey(m_sGroup1, "rate"))->get()); ASSERT_FLOAT_EQ(100.0, ControlObject::getControl(ConfigKey(m_sGroup1, "bpm"))->get()); } ``` -------------------------------- ### Launch Mixxx with Custom GUI Scaling on Windows Source: https://github.com/mixxxdj/mixxx/wiki/Troubleshooting A batch file example to launch Mixxx with specific GUI scaling settings applied. Create a .bat or .cmd file with these commands. ```batch set QT_AUTO_SCREEN_SCALE_FACTOR=0 set QT_SCREEN_SCALE_FACTORS=1.75 C:\Program Files\Mixxx\Mixxx.exe ``` -------------------------------- ### Set WiX Toolset Version and Properties Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Configures the WiX toolset version, upgrade GUID, license file path, product icon, help link, and UI banner/dialog images for Windows installers. ```cmake set(CPACK_WIX_VERSION 4) set(CPACK_WIX_UPGRADE_GUID "921DC99C-4DCF-478D-B950-50685CB9E6BE") set( CPACK_WIX_LICENSE_RTF "${CMAKE_CURRENT_BINARY_DIR}/packaging/wix/LICENSE.rtf" ) set(CPACK_WIX_PRODUCT_ICON "${CMAKE_SOURCE_DIR}/res/images/icons/ic_mixxx.ico") set(CPACK_WIX_PROPERTY_ARPHELPLINK "${CPACK_PACKAGE_HOMEPAGE_URL}") set( CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/packaging/wix/images/banner.bmp" ) set( CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/packaging/wix/images/dialog.bmp" ) ``` -------------------------------- ### Build and Install Mixxx Flatpak User Bundle Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Builds Mixxx as a single-file Flatpak user bundle, recommended for all users, and then installs it. Optionally uses org.flatpak.Builder and a custom manifest file. ```bash packaging/flatpak/flatpak_build.sh bundle [--builder] [--manifest ] ``` ```bash flatpak install [--system | --user] Mixxx.flatpak ``` -------------------------------- ### Incorrect Timer Usage: Re-initiating Without Stopping Source: https://github.com/mixxxdj/mixxx/wiki/Script-Timers This example shows a common mistake where a new timer is started before the previous one has a chance to complete or be explicitly stopped. This can lead to multiple timers running concurrently or unexpected behavior. ```javascript //begin a timer MyController.myTimer = engine.beginTimer(250, MyController.ACallback,true); //Later on in your code //begin timer: you start a timer, but maybe the previous is still in use MyController.MyTimer = engine.beginTimer(100, MyController.flash); ``` -------------------------------- ### Generate Backtrace with GDB on Linux/Mac OSX Source: https://github.com/mixxxdj/mixxx/wiki/Reporting-Bugs Capture a backtrace using GDB for debugging Mixxx crashes on Linux and Mac OSX. Install gdb, run Mixxx within it, reproduce the crash, and then use 'thread apply all bt' to get the backtrace. ```bash gdb --eval-command=run mixxx ``` ```bash thread apply all bt ``` -------------------------------- ### Good Timer Usage: Managing a One-Shot Timer for LED Control Source: https://github.com/mixxxdj/mixxx/wiki/Script-Timers This example demonstrates the correct way to use a one-shot timer for controlling an LED. It includes initializing the timer variable, checking for and cancelling pending timers before starting a new one, and resetting the timer variable in the callback. ```javascript //Initialize your timer variable to zero at the beginning of the script MyController.timer = 0; MyController.myButton = function(_channel, _control, value, _status, _group) { if (value===0x7F) { //Button pressed, let's light up a LED midi.sendShortMsg(0x90, 0x3A, 0x7F); } else { //Button released, let's turn off the LED within 5 seconds. //For this, we will use a "one shot" timer" //1) test any pending timer if (MyController.myTimer !==0) { //if the delayed action is still "programmed" (the timer is still running becaused //we may have pressed and release the button twice in the 5 seconds delay), //we first cancel it by stopping the pending timer engine.stopTimer(MyController.timer); //reflex : MyController.timer = 0; } //2) safely start your timer : MyController.timer = engine.beginTimer(250,MyController.flashOff,true); }; MyController.flashOff = function () { //It is a "one-shot" timer calling this, set it's variable to zero MyController.timer = 0; //Now it is safe to switch off the LED midi.sendShortMsg(0x90, 0x3A, 0x00); } ``` -------------------------------- ### Install Mixxx Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Installs Mixxx using CMake. Utilizes all available CPU cores for parallel installation. ```shell cmake --build ~/mixxx/build --target install --parallel `nproc` ``` -------------------------------- ### GDB Initialization Script for Qt Source: https://github.com/mixxxdj/mixxx/wiki/Eclipse Configuration for the .gdbinit file to set up GDB for debugging Qt applications, including pretty printers. ```python dir ~/eclipse-workspace/qt5/src/corelib dir ~/eclipse-workspace/qt5/src/corelib/io dir ~/eclipse-workspace/qt5/src/corelib/tools dir ~/eclipse-workspace/qt5/src/gui dir ~/eclipse-workspace/qt5/src/gui/image dir ~/eclipse-workspace/qt5/src/gui/kernel dir ~/eclipse-workspace/qt5/src/network dir ~/eclipse-workspace/qt5/src/sql dir ~/eclipse-workspace/qt5/src/opengl python import sys sys.path.insert(0, '/home//eclipse-workspace') from qt import register_qt_printers register_qt_printers (None) end set print pretty 1 set charset UTF-8 ``` -------------------------------- ### Example skin.xml configuration for color schemes Source: https://github.com/mixxxdj/mixxx/wiki/Skin-Color-Scheme-Architecture This example from the LateNight skin in Mixxx 2.3 demonstrates how skin.xml can be configured to adjust various aspects of skin widgets, such as waveform colors and font sizes, using color schemes and variables. ```xml ``` -------------------------------- ### Qt Source Setup for Debugging Source: https://github.com/mixxxdj/mixxx/wiki/Eclipse Commands to fetch Qt source code and create a symbolic link for debugging within Eclipse. ```bash cd eclipse-workspace apt-get source qtbase5-dev ln -s qtbase5-opensource-src-5.2.1+dfsg qt5 # adjust version sudo apt-get install qtbase5-dbg ``` -------------------------------- ### Find Existing libdjinterop Installation Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Attempts to find an existing installation of libdjinterop that matches the required version. If found, it links against the system installation. ```cmake set(LIBDJINTEROP_VERSION 0.27.1) find_package(DjInterop ${LIBDJINTEROP_VERSION} EXACT CONFIG) if(NOT DjInterop_FOUND) find_package(DjInterop ${LIBDJINTEROP_VERSION} EXACT MODULE) endif() if(DjInterop_FOUND) message(STATUS "STATIC link existing system installation of libdjinterop") target_link_libraries(mixxx-lib PUBLIC DjInterop::DjInterop) else() # ... build from sources ... endif() ``` -------------------------------- ### Unix-like System Installation Paths in CMake Source: https://github.com/mixxxdj/mixxx/blob/main/CMakeLists.txt Configures installation directories for Unix-like systems, using standard CMake variables for installation prefixes. ```cmake elseif(UNIX) set(MIXXX_INSTALL_BINDIR "${CMAKE_INSTALL_BINDIR}") set(MIXXX_INSTALL_DATADIR "${CMAKE_INSTALL_DATADIR}/${CMAKE_PROJECT_NAME}") set(MIXXX_INSTALL_DOCDIR "${CMAKE_INSTALL_DOCDIR}") set(MIXXX_INSTALL_LICENSEDIR "${CMAKE_INSTALL_DOCDIR}") endif() ``` -------------------------------- ### Install Debian/Ubuntu Build Dependencies Source: https://github.com/mixxxdj/mixxx/wiki/Compiling-On-Linux Use this script to set up the necessary build environment for Debian-based systems. ```sh tools/debian_buildenv.sh setup ``` -------------------------------- ### Transifex Configuration File Source: https://github.com/mixxxdj/mixxx/wiki/Internationalization Example configuration file for the Transifex CLI. This file should be placed at ~/.transifexrc and contains API credentials and hostnames. ```ini [https://www.transifex.com] api_hostname = https://api.transifex.com hostname = https://www.transifex.com rest_hostname = https://rest.api.transifex.com token = ``` -------------------------------- ### Build Mixxx and Create Local Flatpak Repo Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Use this command to build Mixxx and generate a local Flatpak repository in the `flatpak_repo` directory. This repository can then be used for installing and updating Mixxx. ```bash packaging/flatpak/flatpak_build.sh repo [--builder] [--manifest ] ``` -------------------------------- ### Directly Install Mixxx Flatpak Application Source: https://github.com/mixxxdj/mixxx/blob/main/packaging/flatpak/README.md Builds and installs Mixxx directly as a Flatpak application for the current user. If using org.flatpak.Builder, a debug extension will also be installed. ```bash packaging/flatpak/flatpak_build.sh install [--builder] [--manifest ] ``` -------------------------------- ### Install JACK and DJ Console Development Libraries Source: https://github.com/mixxxdj/mixxx/wiki/Compiling On Linux Jackd And Hercules Legacy Support Installs the JACK audio connection kit development libraries and the DJ console library, which are necessary for Mixxx to detect and use these features. ```bash sudo apt-get install libjack-dev sudo apt-get install libdjconsole-dev ``` -------------------------------- ### Mixxx Configuration Object Example Source: https://github.com/mixxxdj/mixxx/wiki/Behringer-Extension-Library Defines the overall controller mapping, including initialization functions, throttle delay, and deck configurations. Use this to set up global settings and define mappings for individual decks. ```javascript { throttleDelay: 40, init: function() { components.Button.prototype.shiftChannel = true; components.Button.prototype.shiftOffset = 0x20; }, decks: [{ deckNumbers: [1], components: [ {type: components.Button, options: {midi: [0x90, 0x01], inKey: "reverseroll"}}, {type: components.Button, shift: true, options: {midi: [0x90, 0x01], inKey: "reverse", type: c.Button.prototype.types.toggle}}, // ... more components ] }] } ```