# Introduction

An introduction to MIDI Mixer, this site, and the development lifecycle.

{% hint style="info" %}
**Join the discussion in the** [**forums**](https://forums.midi-mixer.com) **or come and chat in the** [**Discord** ](https://discord.midi-mixer.com/)**community!**
{% endhint %}

MIDI Mixer is a piece of Windows software that enables you to connect to and control your Windows audio using MIDI devices. You can control the audio of individual applications and devices, as well as integrating with any number of other applications like OBS, Philips Hue, or Discord, using [open-source plugins](/plugins/overview).

Use the below links to navigate to the main sections of these docs, the search function in the top right to find something specific, or the navigation on the left to see all the sections available.

{% content-ref url="/pages/-MbgvXZ1neI53hHsAepY" %}
[FAQ](/faq)
{% endcontent-ref %}

{% content-ref url="/pages/-Mbgzbd\_iO79jh19x5Cg" %}
[Profiles](/profiles/using-a-preset)
{% endcontent-ref %}

{% content-ref url="/pages/-MbgyZbNpyWEEqUcANhT" %}
[Plugins](/plugins/overview)
{% endcontent-ref %}

## Development

Hi! :wave: I'm Jack, a full-time software developer and the creator of MIDI Mixer.

MIDI Mixer is an ongoing passion project to help make everyday use of some of the awesome MIDI devices out there for more than just your DAW. If you're enjoying the software, please consider supporting the development of the project at [Patreon](https://www.patreon.com/midimixer), [buying me a coffee](https://ko-fi.com/midimixer), or [subscribing](/accounts/contribution).

{% hint style="success" %}
If you do decide to be wonderful and contribute, you'll receive some cool extra benefits. You can see those over on the [**Contribution** ](/accounts/contribution)page.
{% endhint %}

I use MIDI Mixer myself every day and spend a lot of my spare time developing it; your contribution would be invaluable in providing me with the time and resources to keep adding cool new features, keep squashing bugs, and keep expanding the ecosystem of plugins and presets that make MIDI Mixer such a powerful tool.

Either way, I hope you're enjoying using MIDI Mixer as much as I'm enjoying making it. Come and chat with the rest of the community in our [forums](https://forums.midi-mixer.com) or over on [Discord](https://discord.midi-mixer.com/).


# 🏃‍♂️ Getting started

How to start using MIDI Mixer!

Here's a collection of a few helpful videos for how to use and set up MIDI Mixer.

{% embed url="<https://www.youtube.com/watch?v=yiw2-aynMXM>" %}
This short video covers using MIDI Mixer with one of our preset devices
{% endembed %}

{% embed url="<https://www.youtube.com/watch?v=JKPrJXAMAz8>" %}
This video covers using MIDI Mixer with a non-preset deice, making sure you get the most out of your board!
{% endembed %}


# FAQ

Frequently Asked Questions and common issues.

## My device isn't working

### Common steps

Make sure that **only** MIDI Mixer is using your device. If you have another program open that can use or make changes to your device, try closing it.

Another easy solution could be unplugging and replugging your device from your computer. Or maybe it's possible to reset your specific device to factory settings.

[Try and uninstall your device drivers and then re-install them.](/faq#how-do-i-uninstall-and-re-install-drivers)

If that doesn't work, then check if your device needs specific drivers to function. You can usually find those on the official website for your device. If you already have those specific drivers, then also try and uninstall and then re-install them.

Even a computer restart could be the simple fix that's needed. And in rare cases, trying another computer port or another cable might fix the issue.

If all fails, let us know in on the [Discord server](https://discord.midi-mixer.com/) in `#support`, and we'll try to help you get it working.

It's most helpful if you start by telling us the steps you've already tried to resolve the issue, and which device you have.

**If you don't tell us what you've tried or which device you have, we might assume that you haven't checked the FAQ yet and ask you to look at that first.**

### **Uninstalling and reinstalling drivers**

1. Right-click the Windows icon in the bottom left of your screen.
2. Select Device Manager.
3. Select Sounds, video & game controllers.
4. Right-click on your device's name.
5. Select Properties.
6. Go to the Driver tab.
7. Select Uninstall Device.
8. Re-install the drivers.

### My device sometimes disconnects

MIDI devices are usually used with [DAWs](https://en.wikipedia.org/wiki/Digital_audio_workstation) for relatively short periods of time, but there are frequent reports of these devices silently disconnecting, requiring a user to un-plug and re-plug the device in order to get it to work again.

If you're suffering from this problem, there are a few common steps that may help resolve your issue.

#### 1. Turn off USB selective suspend

The "USB selective suspend" option allows a USB hub driver to suspend an individual port without affecting the operation of other ports on the hub. It's usually used to save on power usage, but MIDI devices can often be mistaken for being inactive and therefore be turned off without warning.

To disable this:

![Go to "Edit power plan" settings](/files/nxFOEN8Pe9Anp9Hp5BcE) ![Select "Change advanced power settings"](/files/i8gaTcwumtEFaRHEz2yz) ![Set "USB selective suspend setting" to "Disabled", Apply, and exit](/files/uzlvhTRKWVRmMCWGtv00)

#### 2. Connect directly to your PC

Hubs can interrupt certain USB power-saving settings and do their own thing, often causing unexpected behaviour in devices that maintain an open connection such as MIDI devices.

Connecting the device directly to your machine removes this potential problem, making sure we only have to worry about one cable and one port.

{% hint style="info" %}
A hub's overall speed is often automatically downgraded to the speed of the lowest performing device connected to it. For instance, if you plug a USB 1 device into it, all other devices on the hub are downgraded to USB 1 speed, which can cause issues.
{% endhint %}

#### 3. Replace the USB cable

Some users have found that using a different USB cable has solved their problem. To quote Ableton:

> \[...] use a short, high quality USB cable with a ferrite bead. Just one faulty or underperforming cable can sometimes knock out USB connection for all other USB devices currently connected to the computer.

#### 4. Try different ports

Depending on how your ports are connected to your motherboard, some ports might work differently than others, or might use differing USB versions. It's common for MIDI devices to not support USB, so try a few different ports on your machine to see if this helps.

#### 5. Turn off power saving for USB ports

Similar to the "USB selective suspend" option, Windows can forcibly shut down power to USB ports if it deems it necessary. In the case of MIDI devices that need to powered at all times, this can cause problems.

To disable this:

![Go to "Device Manager"](/files/LvaYnPrMEJ89h0RXbjMt) ![Expand "Universal Serial Bus controllers" and double-click all "USB Root Hub" devices](/files/5Nokw7A6jowOJzINeo5i) ![For each one, UNTICK "Allow the computer to turn off this device to save power", and click "OK"](/files/EQdW34AkQnt7JdlbYZvT)

#### 6. Make sure drivers and firmware are up to date

Whatever device you have, make sure you have the latest drivers from the manufacturer's website. You may have documentation from the manufacturer when you bought the device that tells you where to get drivers from, but make sure you have the latest versions available to ensure stable use of the device.

### **Behringer X-Touch Mini**

#### Make sure it is in MC Mode!

1. Unplug the cable from the XTM and locate the **MC button** in the lower left of the panel.
2. Keep that button pressed while you plug the cable back in and the XTM turns on.

All the buttons will flash twice and you'll know that it's in MC mode from the small light that will appear in the top right of the panel, right above the text, **MC MODE**.

### **Korg nanoKONTROL2**

If it's the lights that aren't working, then look [here instead](/faq#how-do-i-get-the-lights-working-on-the-korg-nanokontrol-2).

First things first - Make sure you don't have other programs using your device, while you're trying to use MIDI Mixer with it.&#x20;

If you have the Korg Editor open, MIDI Mixer will not work.

#### Try resetting it!

1\. Unplug the device.

2\. Hold down the PREV. and NEXT buttons **and** the CYCLE button, and plug the cable back into the device, while holding the 3 buttons down.

3\. Once you see the bottom lights flashing, you can let go of the buttons. Your device has now been reset!

A visual guide can also be found in [this YouTube video](https://youtu.be/zCvaq0J-xuU?t=23).

#### Resetting didn't work?&#x20;

[Try uninstalling and re-installing the drivers](/faq#how-do-i-uninstall-and-re-install-drivers).

#### Still no luck? Try using the Korg Driver Uninstaller

It's part of the KORG USB-MIDI Driver Tools download at the bottom of [this page](https://www.korg.com/us/support/download/driver/1/285/3541/).

#### Lights not working?

1. You can find the KORG KONTROL Editor, at the bottom of [this page](https://www.korg.com/us/support/download/product/0/159/), just above the drivers section where it says **Software**.
2. Make sure nothing else is using your device, **including MIDI Mixer!** Don't have it running while you're using the Editor.
3. In KORG KONTROL Editor, click **Common** found right under **CONTROL** and then under **LED Mode** set it to **External** instead of Internal.&#x20;
4. At the top of the screen, click **Communication** and then select **Write Scene Data**.
5. Make sure you **close** the Editor once you're done, so that the program is no longer running, otherwise MIDI Mixer will not work!

<img src="/files/-Mbh7XEBJV50nJO6nwm7" alt="" data-size="original">

## **Application lifecycle**

A list of common questions about MIDI Mixer's versioning, release channels, and available distribution methods.

### Uninstalling

MIDI Mixer can be uninstalled in the "Apps & Features" menu in Windows for both the standalone and Microsoft Store version.

![Uninstalling MIDI Mixer in the "Apps & Features" menu in Windows 11](/files/5UTiJ1SIrhQbueGwlJzF)

When MIDI Mixer is uninstalled, however, it will leave behind some small configuration files to keep your set-up intact should you want to return to using the app at a later date.

If you want to completely remove all traces of MIDI Mixer - which is usually helpful when debugging compatibility issues - also remove all of the following folders if they exist. You can check they exist by typing the below paths in to a "Run..." dialog (Win+R):

{% hint style="warning" %}
Be aware that these files contain all of your MIDI Mixer configuration **including any custom profiles created**. Backing up these files to the cloud will be available at a later date, so make sure to [create an account](/accounts/overview) ready.
{% endhint %}

* `%appdata%\midi-mixer-app`
* `%localappdata%\Packages\60992MIDIMixer.MIDIMixer_crf4gtfkaz836`

### Backing up your data

All of MIDI Mixer's configuration exists in a single location; you can easily back up your data by copying the below files and folders to wherever you need them.

{% hint style="info" %}
Backing up these files to the cloud will be available at a later date, so make sure to [create an account](/accounts/overview) ready.
{% endhint %}

First, locate your MIDI Mixer installation.

* Standalone: `%appdata%\midi-mixer-app`
* Microsoft Store: `%localappdata%\Packages\60992MIDIMixer.MIDIMixer_crf4gtfkaz836`

Next, copy the following files and folders to a safe place:

* `usersettings.json` - Settings, preferences, and profile assignments
* `profiles/` - Custom profiles

To "restore" your backup, just copy over those two items in to a new MIDI Mixer install and you're all set!


# Terminology

Explanations of the terms used throughout this site and within MIDI Mixer.

## Profiles

A named collection of [**Groups** ](/terminology#groups)and [**Controls** ](/terminology#controls)that can be "loaded" against a given MIDI device, a [**Profile** ](/terminology#profiles)is a map of the target device that MIDI Mixer can understand.

MIDI Mixer maintains some profiles as **Presets**, which are simply profiles that are shipped with the software and are intended to work out-of-the-box with the default configuration of the target device.

## Groups

A collection of [**Controls**](/terminology#controls), a [**Group** ](/terminology#groups)is assigned to a particular application, device, or plugin within MIDI Mixer and provides multiple [**Controls** ](/terminology#controls)to perform different actions.

[**Groups** ](/terminology#groups)are synonymous with "channels" on mixers; in the image below, "Channel 1", would be a [**Group** ](/terminology#groups)within MIDI Mixer.

![A "channel" on a mixer is synonymous with a "group" in MIDI Mixer](/files/-Mc-SlSFqzH1HaYCzurS)

If we were using the above mixer and assigned our highlighted [**Group** ](/terminology#groups)to the Discord application, we could now use any of the [**Controls** ](/terminology#controls)within that group to perform different actions to that application, like changing volume, muting, or starting the application.

A [**Group** ](/terminology#groups)can currently map the following [**Controls**](/terminology#controls), with each one able to specify an [**Indicator** ](/terminology#controls)too. You can add as many controls/indicators to each section as you like.

* **Volume** - *Faders only*\
  Controls and shows the volume of the group's assignment. This is usually faders or knobs as the controls, along with LED indicators or motorised faders for representing the current volume.
* **Peak meter** - *Indicators only*\
  Shows the current audio level being output by the assigned application or device.
* **Mute** - *Buttons only*\
  Controls and shows whether or not the group's assignment is muted. The provided indicator will be on if the assignment is muted, and off if it is not.
* **Assign** - *Buttons only*\
  If the group is currently unassigned, the indicator will be off and pressing the button will assign the group to whichever app is currently in focus. If the group is currently assigned, the indicator will be on and pressing the button will un-assign the group.
* **Run** - *Buttons only*\
  If the group is assigned to a device, the indicator represents whether or not the device is the default, and using the control will set the default device to the assignment. If the group is assigned to a session, the indicator represents whether or not the application is active, and using the control will either start or switch to the application.

Here's an example of the Behringer X-Touch Extender preset, defining controls for the first group.

![The "Fader 1" group of the Behringer X-Touch Extender preset](/files/-Mc-WPYhEegHgBlIRiuS)

## Controls

A [**Control** ](/terminology#controls)represents a single function of a mixer, separated in to **Faders**, **Buttons**, and **Indicators**.

A **Fader** defines an analog control and should be used for to define faders and rotaries.

![The "Fader 1" control of the Behringer X-Touch Extender preset](/files/-Mc-Whf1PcbanKm7vr1W)

A **Button** defines any single-press control like, well, buttons or velocity-sensitive pads.

![The "Rec 1" button of the Behringer X-Touch Extender preset](/files/-Mc-Wp5PQhl5_Ya3_tMq)

An **Indicator** defines an LED, motorised fader, or some other feedback-related MIDI messages that will be sent *back* to your MIDI device to display the current state of your system's audio.

![The "Fader motor 1" indicator of the Behringer X-Touch Extender preset](/files/-Mc-X5V_ueUFwr9kH-6c)

## Buttons

Currently, the **Buttons** tab in the UI allows you to use any **Button** controls not in use by [**Groups** ](/terminology#groups)and assign them generic actions unrelated to any particular application.

![Assigning the spare "Media Record" button to set the default output device of the system](/files/-Mc-XbEebkwGApGnUkqE)

## Plugins

Plugins provide you with the ability to extend MIDI Mixer and leverage its core concepts to provide control for any application with generic rules that can apply to any MIDI device. Control apps, games, or even hardware like [Philips Hue lighting](https://github.com/midi-mixer/plugin-hue), helping other users get the most out of their device.

To get a more in-depth overview of plugins, head over to the [**Plugins Overview**](/plugins/overview).

The **Plugins** tab shows you the plugins you have installed as well as those that are currently active.&#x20;

![The "Plugins" tab in the MIDI Mixer UI](/files/-Mc-YEHPuW__3j7FceKm)


# Settings

App-wide settings to customise your MIDI Mixer.

The **Settings** page within MIDI Mixer provides some options to affect the behaviour of the entire app, as well as some useful buttons to help both me and you move towards an even better app!

## General

![The "General" settings on the Settings page](/files/-Mc08uSUxdpsNbummwCw)

### Logarithmic volume curve

A logarithmic volume curve gives you more control over the lower end of volume setting by making smaller increments the smaller the volume. If you find your volumes are frequently set to low values, this will greatly benefit.

![A logarithmic volume curve compared to a non-logarithmic (linear) volume curve](/files/-Mc08jG1Eea413ytimYu)

As well as toggling the logarithmic curve on and off, you can also adjust the "steepness" of the curve using the slider provided. A higher number means a steeper curve.

### Start on boot

When enabled, MIDI Mixer will automatically start when your machine is booted up.

### Start minimised

When enabled, MIDI Mixer will not open the main UI when it's started, and will instead load directly in to the task tray.

![MIDI Mixer in the task tray](/files/-Mc09O_XilTnK4eE0ww1)

### Analytics & Crash Reports

When enabled, this option helps improve MIDI Mixer by automatically sending diagnostics, crash reports, and usage data whenever an error occurs. All data is collected entirely anonymously and contains no personal information whatsoever, but you can disable it if you wish.

## OSD

The MIDI Mixer On-Screen Display (OSD) is an extra windows that will appear above most windows to show you what you're controlling at that current moment in time.

![An example OSD showing the current volume of the Spotify application](/files/-Mc09tqLoeGHmkm6u6nF)

### Enabled

Toggle whether or not the OSD will ever be shown using this.

### Position

The position for the OSD to be displayed on the screen selected. Can either be "Top left", "Top right", "Bottom left", or "Bottom right".

### Screen

The screen to show the OSD on. The OSD currently has no DirectX hook so can't be shown above full-screen applications like games. If you have multiple screens, placing it not on the primary screen is often a good idea.

## Compatibility

### MIDI Passthru

MIDI devices can only be used by one application at a time. This means that if you're using your MIDI device with MIDI Mixer then other applications can't use it. There are legitimate reasons for wanting to use your device with multiple applications at the same time, and MIDI Passthru helps you to do that.

![Selecting the "X-TOUCH MINI" device](/files/-Mc0AsaWs9EbHGQatxR-)

When a [**Profile** ](/terminology#profiles)is loaded against a particular device and a "MIDI Passthru" is selected, a copy of the input will also be sent to whatever is selected in this option. This is a very powerful tool to use with an application like [loopMIDI](https://www.tobias-erichsen.de/software/loopmidi.html), giving you access to multiple virtual MIDI devices from one actual device.

For example, I have an **X-TOUCH MINI** device that I'm using with MIDI Mixer. I start **loopMIDI** and select **loopMIDI Port 1** as the "MIDI Passthru".

Now, whenever I hit a button on my **X-TOUCH MINI**, that button press is also sent to the virtual **loopMIDI Port 1** device. To use the passthru with another application, I just have to use the **loopMIDI Port 1** device in the other application and you're set!

## Updates

The updates section within the settings page gives you control over when and how MIDI Mixer updates itself.

{% hint style="success" %}
[**Contributors** ](/accounts/contribution)have access to the [**Alpha** ](/accounts/contribution#what-do-i-get)release channel, providing access to features and builds before other users.
{% endhint %}

![The MIDI Mixer updates section of the Settings page](/files/-Mc0BszP2uERqZYYJWng)

### Check for updates

Clicking this button will check the selected release channel (Stable or [Alpha](/accounts/contribution)) for the latest build available.

If an update is found and you have automatic updates enabled, MIDI Mixer will immediately start downloading and installing the update. If you don't, you'll be given an option to download the update and another to install it once the download is complete.

### Keep up to date automatically

If enabled, MIDI Mixer will automatically download and install updates when your system is idle.

{% hint style="info" %}
Internally, MIDI Mixer will only ever automatically check for updates when the app starts so as to be as unintrusive as possible.
{% endhint %}

**Leaving this option enabled is highly recommended as it not only ensures you're getting access to the latest features, but also the latest bug fixes and security updates.**

### **Release channel**

You can change your release channel between two values: **Stable** and [**Alpha**](/accounts/contribution).

Only [**Contributors**](/accounts/contribution) have access to the **Alpha** channel, providing access to features and builds before other users.

Once selected, if you have automatic updates enabled, MIDI Mixer will automatically up- or down-grade to the latest update for that given release channel. If you don't you'll be given an option to download the update and another to install it once the download is complete.


# Use a preset

Plug'n'play using popular devices with a curated list of profiles directly from MIDI Mixer.

**Presets** within MIDI Mixer are curated custom **Profiles** that are included within the app itself. They are most commonly compatible with the out-of-the-box configuration for the target device, helping users to plug in a new device and have it immediately recognised and set up by MIDI Mixer.

{% hint style="info" %}
If your device doesn't have a preset yet or you need to support a custom configuration, it's easy to [create your own profile](/profiles/create-a-profile).
{% endhint %}

## Loading a preset

To load a preset, you must have a compatible device. For example, the **Behringer X-TOUCH MINI** preset is only loadable if you have a MIDI device with the name **X-TOUCH MINI**.

If you're loading MIDI Mixer for the very first time, the app will try to match any MIDI devices it can find to custom presets within the app. If it finds one, it will also try to automatically load that preset.

If this hasn't worked, you may have to manually find the preset on the **Profiles** page and click the **Load** button to activate the profile.

![An unloaded preset](/files/-MblfA9d7z9CEy7Nqyis)

If you're still having troubles, try some of the troubleshooting steps in the [FAQ](/faq).

## Presets compared to profiles

The difference between a preset and a profile within the app is that presets have a locked **Input** and **Output** so that they can only be used with compatible devices.

![A preset's greyed out (locked) input and output](/files/-MbleQG5zQPppfccKRWD)

###


# Create a profile

Create your own custom profile to use your MIDI device with MIDI Mixer.

Check out the following video for a guide on how to set up a new profile.

{% embed url="<https://www.youtube.com/watch?v=JKPrJXAMAz8>" %}


# Share a profile

Sharing custom profiles with other MIDI Mixer users that use the same device.

## Creating a share link

To share (similar to exporting) a profile with another person, you can click the **Share** button when viewing your profile.

![The "Share" button on a "Custom EC9" profile](/files/-MblX0Cx53mNkyYnRsa7)

This will pop up a dialog box with a URL that you copy and give to another person.

![An example share link](/files/-MblXLN6ccoVN2Z2Cr1M)

Share links will last forever, but do not update; if you change your profile, you'll have to generate a new link in order to share the latest version.

## Using a share link

To import a profile that's been shared by another user, enter the share link you've been given in to any web browser.

{% hint style="warning" %}
A share link should always begin with `midi-mixer://share/`.
{% endhint %}

Once you enter the link, your browser will prompt you with a warning letting you know that it's going to open within the MIDI Mixer application.

![The browser letting you know it's using MIDI Mixer to open the link](/files/-MblXnAv4fu5exLB6hCr)

After clicking **Open**, the MIDI Mixer UI should show and open your newly-imported profile! 🎉


# Overview

Open source extensions to MIDI Mixer to allow users to control more than just audio.

Plugins provide you with the ability to extend MIDI Mixer and leverage its core concepts to provide control for any application with generic rules that can apply to any MIDI device. Control apps, games, or even hardware like [Philips Hue lighting](https://github.com/midi-mixer/plugin-hue), helping other users get the most out of their device.

**Plugins are strongly encouraged to be open source**, and MIDI Mixer itself has a number of "official" open source plugins to use as examples over on [GitHub](http://github.com/midi-mixer).

{% content-ref url="/pages/-MbgyEdau9YEDQpkVdYC" %}
[Use a plugin](/plugins/use-a-plugin)
{% endcontent-ref %}

{% content-ref url="/pages/-MbgyZbOC3Byxd8g4cul" %}
[Create a plugin](/plugins/create-a-plugin)
{% endcontent-ref %}

## Known plugins

<table><thead><tr><th width="211.92447939195773">Name</th><th width="164.68922895821072">Author</th><th>Description</th><th data-hidden>Link</th></tr></thead><tbody><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-brightness">Brightness</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Control the brightness of your monitors.</td><td><a href="https://github.com/Jaggernaut555/midi-mixer-brightness">https://github.com/Jaggernaut555/midi-mixer-brightness</a></td></tr><tr><td><a href="https://github.com/midi-mixer/plugin-discord">Discord</a></td><td>MIDI Mixer</td><td>Toggle mute/deafen, adjust input/output volume, and more.</td><td><a href="https://github.com/midi-mixer/plugin-discord">https://github.com/midi-mixer/plugin-discord</a></td></tr><tr><td><a href="https://github.com/Theo428/midi-mixer-mqtt">Home Assistant / MQTT</a></td><td><a href="https://github.com/Theo428">Theo428</a></td><td>MQTT communication for controlling Home Assistant and other smart-home devices.</td><td></td></tr><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-LiveSplit">LiveSplit</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Control LiveSplit using buttons.</td><td></td></tr><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-nanoleaf">Nanoleaf</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Change the brightness, hue, and saturation of Nanoleaf panel groups.</td><td><a href="https://github.com/Jaggernaut555/midi-mixer-nanoleaf">https://github.com/Jaggernaut555/midi-mixer-nanoleaf</a></td></tr><tr><td><a href="https://github.com/midi-mixer/plugin-obs">OBS</a></td><td>MIDI Mixer</td><td>Control source volumes, scenes, and streaming status.</td><td><a href="https://github.com/midi-mixer/plugin-obs">https://github.com/midi-mixer/plugin-obs</a></td></tr><tr><td><a href="https://github.com/midi-mixer/plugin-hue">Philips Hue</a></td><td>MIDI Mixer</td><td>Control brightness and hue of Philips Hue lights and groups.</td><td><a href="https://github.com/midi-mixer/plugin-hue">https://github.com/midi-mixer/plugin-hue</a></td></tr><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-spotify">Spotify</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Control Spotify volume, skip tracks, play/pause, and add the current playing track to favourites.</td><td>Control spotify volume, skip tracks, play/pause, and add the current playing track to favourites.</td></tr><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-twitch">Twitch</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Run ads and clip your Twitch.tv channel.</td><td></td></tr><tr><td><a href="https://github.com/Jaggernaut555/midi-mixer-voicemeeter">VoiceMeeter</a></td><td><a href="https://github.com/Jaggernaut555">Jaggernaut555</a></td><td>Control strips and busses. Works with VoiceMeeter, VoiceMeeter Banana, and VoiceMeeter Potato.</td><td><a href="https://github.com/Jaggernaut555/midi-mixer-voicemeeter">https://github.com/Jaggernaut555/midi-mixer-voicemeeter</a></td></tr><tr><td><a href="https://github.com/anaisbetts/midi-mixer-wavexlr">Wave XLR</a></td><td><a href="https://github.com/anaisbetts">anaisbetts</a></td><td>Control your Wave XLR device. Currently supports faders only.</td><td><a href="https://github.com/anaisbetts/midi-mixer-wavexlr">https://github.com/anaisbetts/midi-mixer-wavexlr</a></td></tr></tbody></table>


# Use a plugin

How to install and use plugins within MIDI Mixer.

## Installation

A list of plugins is currently available on the [Plugins Overview](/plugins/overview#known-plugins) page.

1. Select the plugin you'd like
2. Go to the "Releases" page\ <img src="/files/HERh4PaBkEomMvP3Yi0A" alt="" data-size="original">
3. Download the latest `.midiMixerPlugin` file\ <img src="/files/lZAHqOgaMtvfw22T6sXT" alt="" data-size="original">
4. Run the `.midiMixerPlugin` file
5. Refresh your plugins list

![Installing the VoiceMeeter plugin](/files/XpoUAQ28VhObV4BeOHy7)

## Manual installation

Plugins are registered by extracting their built files in to `%appdata%/midi-mixer-app/plugins`. While a `.midiMixerPlugin` file will manage this process automatically, you can also manually install a plugin to this location.

{% hint style="info" %}
If you're using the Windows Store version of MIDI Mixer instead of the standalone version and this path doesn't exist, try the following instead:

`%localappdata%\Packages\60992MIDIMixer.MIDIMixer_crf4gtfkaz836\LocalCache\Roaming\midi-mixer-app\plugins`
{% endhint %}

The most important detail is that a `plugin.json` file is in the root of the extracted plugin.

For example, an extracted plugin named `com.midi-mixer.discord` would have the following file tree:

```
midi-mixer-app/
├─ plugins/
│  ├─ com.midi-mixer.discord/
│  │  ├─ plugin.json
│  │  ├─ ...other files...
```

Once you've extracted the files, head in to the plugins UI and hit the refresh button to see your new plugin!

![The "Refresh" button is highlighted at the top centre of the image](/files/-Mc-lVycSCRlLik37qbD)

If you don't see your plugin after hitting the refresh button or you're having other issues, check the [troubleshooting ](/plugins/troubleshooting)guide.


# Create a plugin

How to develop, build, and package a plugin for use by yourself and other MIDI Mixer users.

Detailed instructions on the options available to you when creating plugins will be here soon.

For now, check out the [midi-mixer/plugin-template](https://github.com/midi-mixer/plugin-template) repository on GitHub for a quick-start guide or skip to one of the sections below to find out more information.

{% content-ref url="/pages/XN4GXCcfnd4hb1imKDX7" %}
[Development environment](/plugins/create-a-plugin/development-environment)
{% endcontent-ref %}

{% content-ref url="/pages/i2pjyCvqjVivO8RKuCPv" %}
[Creating a plugin](/plugins/create-a-plugin/creating-a-plugin)
{% endcontent-ref %}

{% content-ref url="/pages/24xQ2yEKTmoJyWbcIkGE" %}
[plugin.json](/plugins/create-a-plugin/plugin-json)
{% endcontent-ref %}

{% content-ref url="/pages/MeDCyrCsd5cWV63FJPQT" %}
[Assignments](/plugins/create-a-plugin/assignments)
{% endcontent-ref %}

{% content-ref url="/pages/Ps2QofdAKBhljfTLoPO0" %}
[Buttons](/plugins/create-a-plugin/buttons)
{% endcontent-ref %}

{% content-ref url="/pages/adbmP6pOkJmtLLpGJpaH" %}
[Settings](/plugins/create-a-plugin/settings)
{% endcontent-ref %}

{% content-ref url="/pages/Zr32rJ8MjzKl0ka0IwAY" %}
[Releasing](/plugins/create-a-plugin/releasing)
{% endcontent-ref %}

{% content-ref url="/pages/sjQDEQ4DecfrAAYCxMOI" %}
[Debugging and common issues](/plugins/create-a-plugin/debugging-and-common-issues)
{% endcontent-ref %}


# Development environment

Set up your development environment ready to create MIDI Mixer plugins.

&#x20;MIDI Mixer supports loading JavaScript [Node.js](https://nodejs.org/) plugins as a separate process that can communicate with [MIDI Mixer's plugin API](https://github.com/midi-mixer/midi-mixer-plugin).

To get started, you'll need to set up a development environment. It's recommended that you build your plugin using [TypeScript](https://www.typescriptlang.org/) (JavaScript with types), giving you much better developer tooling and quality-of-life helpers such as autocomplete and static error checking.

{% hint style="info" %}
If you've already got a development environment set up with Node.js installed, skip to the next step.
{% endhint %}

### Installing Node

If you don't have Node.js installed on your system, I'd recommend installing [Volta](https://volta.sh/), a toolchain manager for JavaScript that allows you to easily download and use any version of Node, NPM, or Yarn across multiple platforms.

* Follow the [Volta Getting Started Guide](https://docs.volta.sh/guide/getting-started)

### Installing an editor

[Visual Studio Code](https://code.visualstudio.com/) is a very popular code editor that has fantastic support for TypeScript. If you don't get yet a code editor, I'd recommend downloading and using VSCode for getting started.

I'll be using VSCode in any demonstrations throughout this guide.

* Install [Visual Studio Code](https://code.visualstudio.com/)

### That's it!

If you've done the above or already have your development environment set up, let's get started!


# Creating a plugin

Get started with a MIDI Mixer Template plugin.

MIDI Mixer provides a template plugin repository on GitHub which can be used to quickly bootstrap a new plugin and get started on the functionality.

{% embed url="<https://github.com/midi-mixer/plugin-template>" %}
The MIDI Mixer Template Plugin
{% endembed %}

The template above guides you through the steps. Once you've cloned and built your plugin with `npm install` and `npm run build:watch`, you should be able to refresh your MIDI Mixer plugins list and see your new plugin!

![The MIDI Mixer Template Plugin, viewed in the UI](/files/Xy6WDXE52rV9svLimtX2)

Continue with the following pages to see some information about some of the key files within the template plugin.


# plugin.json

The manifest file for our MIDI Mixer plugin.

The `plugin.json` file (also known as the "manifest") in the root of your plugin is used to tell MIDI Mixer some basic information about the plugin, as well as what can be configured. It provides:

* `id` A unique ID for the plugin in [reverse domain name notation](https://en.wikipedia.org/wiki/Reverse_domain_name_notation)
* `name` The name of the plugin as it appears in the UI
* `version` The version of the plugin, shown to the user but used for releases in the future
* `author` The author of the plugin (that's you!)
* `main` The file to load to start the plugin
* `icon` A path to the icon to display next to the plugin for buttons, assignments, and other lists
* `settings` Settings for your plugin that are set by the user and accessible in code (see the Settings page for the schema)

{% hint style="info" %}
This file must be placed in the root of your plugin so that MIDI Mixer can access it.
{% endhint %}

### Example

Here's an example of a basic `plugin.json` pulled from the [MIDI Mixer Template Plugin](https://github.com/midi-mixer/plugin-template).

{% hint style="info" %}
The `$schema` key below provides autocompletion and validation when editing this file. You can reference your local `midi-mixer-plugin` package as below or use a service such as [Skypack](https://cdn.skypack.dev/midi-mixer-plugin@latest/plugin.schema.json) to always reference the latest version.
{% endhint %}

```json
{
  "$schema": "./node_modules/midi-mixer-plugin/plugin.schema.json",
  "id": "com.midi-mixer.template",
  "name": "Template Plugin",
  "type": "node",
  "version": "1.0.1",
  "author": "MIDI Mixer",
  "main": "lib/main.js",
  "settings": {
    "text": {
      "label": "A text field",
      "type": "text",
      "required": false
    }
  }
}
```

Next, let's have a look at how to add assignments so our users can control our plugin with faders and buttons.


# Assignments

Add assignments to your plugin that your users can select and control with faders and buttons.

The most common action for a plugin to perform is adding assignments. These are entries that appear in the list when assigning a [Group](/terminology#groups).

![The "Example Plugin Entry" assignment created by the MIDI Mixer Template Plugin](/files/tK7tsXWVzQ15kbu8kvGi)

Once an assignment is created, we can use code to affect the controlling [Group](/terminology#groups)'s state and react to changes from the user.

## Create an assignment

Using [midi-mixer-plugin](https://github.com/midi-mixer/midi-mixer-plugin), it's easy to use the underlying MIDI Mixer API to register assignments.

```typescript
/**
 * Example of setting up an assignment to be controlled by the plugin.
 */
const myAssignment = new Assignment("foo", {
  name: "Example Plugin Entry",
});
```

The above code creates a new `Assignment` with a user-facing name of `"Example Plugin Entry"`.

The first argument to the constructor (`"foo"`) is the assignment's ID. This is important to keep standardised, as this is used internally to manage what the user has assigned their [Group](/terminology#groups) to, ensuring that the assignment is correctly remembered as your plugin activates, loads, or deactivates.

The second argument is an object containing any values that the assignment should start with, such as mute status or volume level. The available parameters mirror some of the parameters we can set at any time once the assignment is created:

* `name`\
  The name of the assignment within MIDI Mixer.<br>
* `assigned`\
  The initial assigned status of the entry.

  Defaults to `false`.<br>
* `muted`\
  The initial assigned status of the entry.

  Defaults to `false`.<br>
* `running`\
  The initial running status of the entry.

  Defaults to `false`.<br>
* `throttle`\
  The minimum amount of time in milliseconds between volume change updates from MIDI Mixer. Some faders are very granular, so throttling these updates is sensible to ensure the good performance of plugins.

  Accepted values are anything between `50` to `1000`.

  Defaults to `50`.<br>
* `volume`\
  The initial volume level that the entry has, between `0` and `1`.

  Defaults to `1`.

## Update an assignment

Once an assignment has been created, you can update it at any time using the same parameters as above. For example:

```typescript
myAssignment.name = "A Different Plugin Entry";
myAssignment.muted = true;
myAssignment.volume = 0.2;
```

In addition to the properties above, you can also set the `meter` property.

This property is similar to the `volume` property: a value between `0` and `1` that represents the Group's current peak meter level. It is described as:

> The current indicator level for meters. Setting this updates the entry's meter level for the next 150ms before falling off or being updated again.

Setting it is as easy as the others:

```typescript
myAssignment.meter = 0.5;
```

## React to changes

In order to react to user input, we can use event listeners to run functions on certain events occurring.

```typescript
myAssignment.on("volumeChanged", (level: number) => {
  console.log("User changed the volume to:", level);
});
```

This simple example listens for the user changing their volume level and logs what the new level is.

In reality, here you would update whatever source you are affecting, then set `myAssignment.volume` to the proper level after you've made your change.

At present there are four events to listen to on an assignment:

* `volumeChanged` - `(level: number) => void`
* `mutePressed` - `() => void`
* `assignPressed` - `() => void`
* `runPressed` - `() => void`

## Remove an assignment

Removing an assignment is as easy as creating one.

```typescript
myAssignment.remove();
```

{% hint style="warning" %}
After calling `.remove()`, setting properties will no longer cause any action, and listeners will no longer trigger. It's recommended that you dereference the assignment so that it can be garbage collected.
{% endhint %}


# Buttons

Add buttons to your plugin so users can select and trigger one-time actions.

Buttons are entries that appear in the list when assigning a particular [Button](/terminology#buttons) to an action. Built-in buttons are small tasks such as "Play media" or "Set default output device".

![The "Example Button Type" button created by the MIDI Mixer Template Plugin](/files/ufiAMQNvvIQSgpBQLWfp)

Adding your own buttons allows the user to manually trigger one-time actions within your plugin.

## Create a button

Using [midi-mixer-plugin](https://github.com/midi-mixer/midi-mixer-plugin), it's easy to use the underlying MIDI Mixer API to register new buttons.

```typescript
/**
 * Example of setting up a button type to be controlled by the plugin.
 */
const myButton = new ButtonType("bar", {
  name: "Example Button Type",
});
```

The above code creates a new `ButtonType` with a user-facing name of `"Example Button Type"`.

The first argument to the constructor (`"bar"`) is the button's ID. This is important to keep standardised, as this is used internally to manage what the user has assigned their [Button](/terminology#buttons) to, ensuring that the button is correctly remembered as your plugin activates, loads, or deactivates.

The second argument is an object containing any values that the assignment should start with: `name` and `active`. The available parameters mirror the parameters we can set at any time once the button is created:

* `name`\
  The name of the entry that will appear in MIDI Mixer. It will also be marked with the name of the plugin.

  Blank names are not allowed.<br>
* `active`\
  The initial indicator status of the entry.

  Defaults to `false`.

## Update a button

Once a button has been created, you can update it at any time using the same parameters as above. For example:

```typescript
myButton.name = "A Different Button Type";
myButton.active = true;
```

## React to presses

In order to react to user input, we can use event listeners to run a function when the button is pressed.

```typescript
myButton.on("pressed", () => {
  console.log("User pressed the button!");
});
```

This simple example listens for the user pressing the button, then logs that the button has been pressed.

## Remove a button

Removing a button is as easy as creating one.

```typescript
myButton.remove();
```

{% hint style="warning" %}
After calling `.remove()`, setting properties will no longer cause any action, and listeners will no longer trigger. It's recommended that you dereference the button so that it can be garbage collected.
{% endhint %}


# Settings

Provide your user with settings to customise your plugin.

MIDI Mixer provides you with the ability to specify a list of settings in a standardised format to allow the user to customise your plugin's functionality.

There are currently five types of settings that can be defined, with more planned in later releases.

* Text field
* Password field (a text field with obscured input)
* Status field (a customisable message to show to the user)
* Button (react to presses to trigger actions within your plugin)
* Toggle (an on/off switch)
* Integer (a whole number with a fixed minimum and maximum value)
* Slider (same as an integer, but with a slider)

![The Brightness plugin using a status field to show the user how many monitors have been detected](/files/3u0iwgJ1k2qJYFfVuGcG) ![The Philips Hue plugin using a text field and password field to allow user input](/files/QH5UpkHKYUGy2K1tLqCA)

## Manifest schema

To provide these settings to a user, you can add them to your `plugin.json` file. This will automatically add the settings to the MIDI Mixer UI and allow you to access the user's input within your plugin's code.

The example `plugin.json` snippet below adds one of every type of input.

```json
{
  "settings": {
    "foo": {
      "label": "A text field",
      "type": "text",
      "fallback": "FOO"
    },
    "bar": {
      "label": "A password field",
      "type": "password"
    },
    "baz": {
      "label": "Press this button",
      "type": "button"
    },
    "qux": {
      "label": "We are currently connected",
      "type": "status"
    },
    "quux": {
      "label": "Activate secret sauce",
      "type": "toggle"
    },
    "quuz": {
      "label": "Enter your favourite number",
      "type": "integer",
      "min": 1,
      "max": 100
    },
    "corge": {
      "label": "Set the curve",
      "type": "slider",
      "min": 1,
      "max": 10
    }
  }
}
```

This produces the following settings page for the user:

![The settings page produced for the user with the above plugin.json snippet](/files/XUg0nA9x0juNkmLe5gC6)

Let's note a few things about each input field:

* **"A text field"**\
  The field has used the `"fallback"` value of `"FOO"` because the user hasn't entered anything. This is displayed using the input's placeholder.<br>
* **"A password field"**\
  This field has no fallback, so remains empty.<br>
* **"Press this button"**\
  The button has used the `"label"` text as it's call-to-action. We'll use this button later to trigger an event in our code.<br>
* **"Player level"**\
  This small piece of status text has used the `"label"` value and the `"fallback"` value to default to `Player level: 1`. We'll adjust this dynamically in code later.

Let's move to our `main.ts` file next and have a look at how to retrieve and affect these settings in code.

## Retrieving settings in code

After the user has entered their settings, we can retrieve them for our plugin to use.

We'll use the [midi-mixer-plugin](https://github.com/midi-mixer/midi-mixer-plugin) library to provide us with a `$MM` object we can use to interact with MIDI Mixer's API.

{% hint style="info" %}
The `midi-mixer-plugin` library is pre-installed if you're using the plugin template. If you're starting from scratch, you can install it using `npm install midi-mixer-plugin`.
{% endhint %}

Let's add a `console.log` to our plugin that retrieves and logs the settings our user has input.

```typescript
import * as midiMixer from "midi-mixer-plugin";

$MM.getSettings().then((settings) => {
  console.log("Current settings:", settings);
});
```

Build the app (using `npm run build` or `npm run build:watch`) and load the plugin in dev mode using by clicking the "Disabled" text next to the "Dev mode" header. <img src="/files/fQtCgTyhPAq9HT7KodMW" alt="" data-size="line">

This should produce some output like this:

![The debugging tools for a MIDI Mixer plugin, showing welcome text and some settings](/files/wKd2wEK7WQuaTHs8IGap)

Here, we can see some welcome text to help get you oriented with Node.js debugging tools, along with our log of the current settings.

As the user hasn't filled anything out yet, we can see that `foo` (our text field) has fallen back to the `"FOO"` value, `bar` (our password field) has an empty value, and `qux` has fallen back to a value of `"1"`.

If the user fills these settings in and reloads the plugin, the logged values here will change accordingly.

Next, let's look at reacting to users pressing buttons, and displaying helpful messages in return.

## Reacting to buttons and using statuses

Buttons can be used to listen for user input and statuses can be used to show the user what is happening internally.

First, let's write some code to listen for a user hitting our `baz` button in the example above.

```typescript
$MM.onSettingsButtonPress("baz", () => {
  console.log("The baz button was pressed!");
});
```

With the above code, we run a function every time the `baz` button is pressed, which sends a log to our debug console.

If we rebuild and reload the plugin, we should now receive that message in our console!

![The "The baz button was pressed!" message appearing in the console after clicking the button on the settings page](/files/4CXb1QelQJYfxZBaSYb8)

Fantastic!

Now that we can react to button presses, let's add some more code there to update the "Player level" status to `"9001"` when the button is pressed.

```typescript
$MM.onSettingsButtonPress("baz", () => {
  $MM.setSettingsStatus("qux", "9001");
});
```

Hey presto, now clicking our button changes the status message in the settings page!

![The "Player level" status message showing "9001" after pressing the button on the settings page](/files/FSTDEgbNpm3ndKGXRUqW)

{% hint style="info" %}
Future releases of MIDI Mixer's Plugin API are expected to contain bidirectional settings (where you can retrieve and set all settings) and more input types.
{% endhint %}


# Releasing

Create a midiMixerPlugin file to distribute your plugin to other users.

MIDI Mixer plugins can be distributed using `.midiMixerPlugin` files, which users can then use to install plugins quickly and easily.

{% hint style="info" %}
See the [Installing a Plugin](/plugins/use-a-plugin#installation) section to see the user experience for this.
{% endhint %}

This is done using [midi-mixer-cli](https://github.com/midi-mixer/midi-mixer-cli), which gives us the `midi-mixer pack` command. This verifies the shape of your plugin and packages it up so it can be quickly and easily installed by other users.

A common workflow in order to version your plugin and generate a `.midiMixerPlugin` looks like:

1. Change the version your `package.json` file using `npm version`
2. Build your code
3. Run `midi-mixer pack`

NPM scripts are set up in the [template plugin](https://github.com/midi-mixer/plugin-template) that mean this process looks like:

1. `npm version [<newversion> | major | minor | patch]`
2. `npm run build`
3. `npm run dist`

Once that's complete, you should have generated a file that looks like `com.myplugin.id.1.0.0.midiMixerPlugin`.

Double click this to install, or pass to other users for them to install!

{% hint style="warning" %}
Note that a common mistake is to miss bundling dependencies in to this file. See "[My dependencies aren't being included](/plugins/create-a-plugin/debugging-and-common-issues#common-issues-in-development)" for how to bundle them using `midi-mixer pack`.
{% endhint %}


# Debugging and common issues

Learn how to debug your plugin, view logs, and resolve common issues during development.

Most of the steps around troubleshooting are the same when creating a plugin as they are when using one.

Refer to the troubleshooting page below to see some common steps below, or continue for some development-specific errors to look out for.

{% content-ref url="/pages/-Mc-cMNe7Z1WrGhtvYf7" %}
[Troubleshooting](/plugins/troubleshooting)
{% endcontent-ref %}

## Common issues in development

<details>

<summary>My plugin immediately deactivates when activated</summary>

Just like Node.js, a plugin will exit if there's no reason for it to stay open. For example, a plugin that contains only one line of code (`console.log("Hello world");`) will run that line and then exit straight away.

In order to keep the process running, your code will have to be doing something long-lived to keep the [event loop](https://nodejs.dev/learn/the-nodejs-event-loop) busy.

It is also possible that your plugin is throwing an unhandled exception, causing the process to crash. In this case the error should be viewable in your plugin's log file as `%appdata%/midi-mixer-app/logs/com.myplugin.id.log`.

</details>

<details>

<summary>My dependencies aren't being included</summary>

When packing your plugin using [midi-mixer-cli](https://github.com/midi-mixer/midi-mixer-cli), you'll need to explicitly mark any dependencies you want to bundle under a `bundledDependencies` key in `package.json`.

See the [template plugin `package.json`](https://github.com/midi-mixer/plugin-template/blob/main/package.json#L27-L29) for an example.

</details>


# Troubleshooting

How to troubleshoot a plugin that isn't working as expected.

If a plugin isn't working as you expect, there are a few steps you can take as a user to figure out what's happening and hopefully fix the problem.

## Can't install plugin

If you've tried to install a plugin by running a `.midiMixerPlugin` file and it's not appearing in your UI, it's likely that there's been an issue installing it.

The first thing to do is to try and refresh the plugins list by hitting the *Refresh* button in the UI. This will forcibly re-fetch any plugins it can find on the filesystem and should hopefully make your plugin appear.

![The highlighted "Refresh" icon can be seen as the looping arrows icon at the top centre of the image](/files/-Mc-dUp1G_oLoP03vaA9)

If this still doesn't show your plugin, you can check your app's logs to see is there have been any issues loading the files. To do this, hit `Win+R` (or find the "Run" app in your Windows start menu), and enter:

```
%appdata%/midi-mixer-app/logs
```

![](/files/-Mc-e9uCvH208xIw-usi)

This will open a folder containing various log files for the application. Open up `main.log` and see if there are any recent messages that might be related to your plugin.

If you find anything of use or if you're still stuck, try chatting to the plugin developer or come and ask for help in our [Discord ](https://discord.midi-mixer.com)server.

## Plugin isn't working

If a plugin won't start then there are a few common steps that can be taken to figure out why.

### Double-check the instructions

A good plugin will have some documentation in the plugin's `PAGE.md` file, visible when looking at the plugin's **Info** tab:

![An example of the Discord plugin's "Info" tab, showing some set-up information](/files/-Mc-ewuVzpI6hFyfSUbo)

### Check the settings page

A good plugin will use **Statuses** to help a user understand the current status of a plugin, as well as any issues it might be having. Check the **Settings** tab of your plugin to see if there are any error messages being displayed, or any statuses that might give a clue as to what's going wrong.

![An example of the Discord plugin showing a healthy status of "Connected" within the "Settings" tab](/files/-Mc-fkYLKcLOKgrwWWIq)

### Check the logs

If there any no statuses to check or if you're stilling having issues, you can check the internal log files of a particular plugin. To do this, hit `Win+R` (or find the "Run" app in your Windows start menu), and enter:

```
%appdata%/midi-mixer-app/logs
```

![](/files/-Mc-e9uCvH208xIw-usi)

This will open a folder containing various log files for the application. The log file you're looking for will be named in the following format: `plugin.[plugin-id].log`. For example: `plugin.com.midi-mixer.discord.log`.

If you find anything of use or if you're still stuck, try chatting to the plugin developer or come and ask for help in our [Discord ](https://discord.midi-mixer.com)server.

## Developer mode

Used mainly for plugin development, **Dev Mode** opens up a live console giving you access to [Chrome DevTools](https://developer.chrome.com/docs/devtools/) to debug the plugin in real-time, as well as providing access to profiling and tracing tools.

For some plugins, you can easily click the "Dev mode" button on the plugin page itself and a console will open giving you live access to the plugin. Here you may be able to see better logs/errors.

Plugins can be built in different ways, though, meaning that dev mode requires some additional tools to be running. If dev mode doesn't appear to be working, consult the plugin's open source repository for any additional instructions regarding building the plugin or running dev mode.


# Overview

Accounts in MIDI Mixer, how to register, and how they connect with contributions.

Signing up for an account in the MIDI Mixer app is currently used to attribute contributions with users to ensure that folks are rewarded automatically for their generosity.

{% hint style="info" %}
In the future, accounts will be used for a variety of community-based features too, like sharing profiles and plugins in-app. Make sure to create an account ready, as it's likely that early users will be rewarded!
{% endhint %}

## Registering

MIDI Mixer itself only requires a valid, verified email to register, and collects no personalised information whatsoever other than the bare minimum needed to connect your account to a contribution.

{% hint style="warning" %}
If you're making an account or contributing, make sure to use the same email for your contribution and for MIDI Mixer. This will ensure that you're automatically rewarded for any contribution made.
{% endhint %}

To register an account, head over to the **Account** tab (the MIDI Mixer icon in the bottom left), and enter an email to get started.

![The "Account" page in MIDI Mixer's UI](/files/-Mc-vI64NXSrwRxWHkDm)

Once you've created an account, you'll need to verify your email before you can sync any changes. You'll receive an email from `noreply@midi-mixer.com` with a link that, once clicked, will verify your account.

To see more information about how a contribution affects your account, check out the [**Contributions** ](/accounts/contribution)page.


# Contribution

How you're rewarded for contributions within MIDI Mixer, and what contributions are used for.

MIDI Mixer's on ongoing passion project that I develop in my spare time. By contributing, you afford you me the time and resources to keep adding cool new features, keep squashing bugs, and keep expanding the ecosystem of plugins and presets that make MIDI Mixer such a powerful tool.

Anyone can contribute using [Patreon ](https://www.patreon.com/midimixer)or [Ko-fi](https://ko-fi.com/midimixer) without having an account, but it's recommended to make an account to ensure you're automatically rewarded for your generous contribution. Check out how to make an account back on the [Accounts Overview](/accounts/overview) page.

## What do I get?

There are currently two rewards for contributing that can be seen on the **Accounts** page in the app itself:

* **Lifetime beta access**\
  Early access to develop and preview upcoming features before other users.<br>
* **Unlimited plugins**\
  Leverage MIDI Mixer's plugin architecture to integrate with a huge variety of applications.

**Lifetime beta access** is given for any contribution across any platform, and can be activated by setting the "Release channel" to "Alpha" in the app's settings page. Once set, your app will automatically keep up-to-date with the latest alpha version.

{% hint style="info" %}
Alphas often contain fast-paced, experimental changes. For this reason, those release channels are only available if MIDI Mixer has been installed using the *standalone* installer; not the *Microsoft Store* version.
{% endhint %}

![Setting the app's "Release channel" to "Alpha" to receive automatic alpha updates](/files/-Mc-y5GCtpRTfnsYq799)

**Unlimited plugins** are given to all users with an active monthly subscription, using either [Patreon ](https://www.patreon.com/midimixer)or an in-app subscription (using [Stripe](https://stripe.com/docs/security/stripe)). Without access to unlimited plugins, only one plugin can be activated at a time.

![Running multiple plugins concurrently using a subscription](/files/-Mc04zbRA2SXiRcdULyr)

## What's it used for?

MIDI Mixer is a passion project, but there are still costs involved in maintaining and developing a desktop application safely and securely. Much of the contributions go towards maintaining the current ecosystem. A few examples of this includes:

* **Time**\
  I'm a professional software developer during the day, so all MIDI Mixer development is done in my spare time outside of regular office hours. There's so many cool features to add, but time is a hugely limiting factor.<br>
* **Secure code hosting / building**\
  MIDI Mixer uses GitHub to host and build code securely. The app itself undergoes a suite of tests both periodically and before every release (even alphas) that check not only functionality but security, performance, and compatibility. Maintaining and running these checks costs money to do; we're already well beyond the free tier.<br>
* **Anonymous analytics tools**\
  MIDI Mixer collects anonymised analytics and crash reports so that I can fix bugs before you even experience them! The ingress, processing, and temporary storage of these reports costs money, though.<br>
* **Code signing**\
  Distributing a desktop application requires an [Authenticode Digital Signature](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/authenticode) that can run up to $700 per year. These are certificates that must be bought by a developer to prove to Microsoft that their software is safe. This does also provide some cool features to reassure the user that the app they're installing is directly from me and hasn't been tampered with.<br>
* **Community feature hosting**\
  Features like the ability to share profiles, this documentation site, the forums, or the ability to have an account requires servers and services to be developed and maintained. There are more community-based features being planned but these all require consistent attention and the proper funding for hosting and security.

## In-app subscriptions

As well as contributing via [Patreon ](https://www.patreon.com/midimixer)or [Ko-fi](https://ko-fi.com/midimixer), those with an account can also subscribe in-app. This is a monthly subscription and is treated exactly the same as a [Patreon ](https://www.patreon.com/midimixer)subscription in terms of rewards.

{% hint style="success" %}
In-app subscriptions are definitely the easiest way to subscribe, but if you'd like to use PayPal you can use [Patreon ](https://www.patreon.com/midimixer)instead.
{% endhint %}

In-app subscriptions use Stripe because of their strong track record with security. You can read more about [Security at Stripe](https://stripe.com/docs/security/stripe).

In addition, your credit card information is never stored or transmitted through any MIDI Mixer servers or even the MIDI Mixer app itself - the secure Stripe checkout that is created routes all data directly to Stripe's servers. I do have access to the last 4 digits of your card to be used for support requests, but I cannot access your full card information - only Stripe handles that data.

![An example of the secure Stripe checkout that's created when subscribing in-app ](/files/-Mc04C1E2F3UZQ05dZbV)

## Affiliate links

Some areas in the app and the MIDI Mixer website display affiliate links to known compatible MIDI devices. If a person clicks on an affiliate link and then purchases that device within a particular timeframe, MIDI Mixer earns a small commission.

{% hint style="success" %}
The commission is paid by the retailer, at no cost to you.
{% endhint %}

Due to the way MIDI Mixer supports any MIDI device, finding a device honed to your particular needs can be daunting if you're buying for the first time. Affiliate links help bridge this gap by providing you with plug'n'play profiles and direct links to investigate and purchase those devices.

![An example of affiliate links within the app, on a plug'n'play preset for the Behringer X-TOUCH MINI](/files/JSrOQOg1YhTwhxJKKDL4)

Let's be clear and look at the benefits to users, MIDI Mixer, and retailers:

* **Users** are given clear, reputable paths to investigate and purchase new devices that are known to work well with MIDI Mixer
* **MIDI Mixer** earns a commission for directing users to known compatible MIDI devices that will provide a good experience when used with MIDI Mixer
* **Retailers** benefit from increased sales

The largest barrier for entry to using MIDI Mixer is owning a MIDI device. Aside from the other benefits, affiliate links help brand new users to easily understand what to buy to get started, which is a huge boon for MIDI Mixer and its users alike.

## Support

If you're having any issues with your account or contributions, email <support@midi-mixer.com>.

This includes issues with contribution syncing not seeming to work, or manual syncing required if you've used different emails for Patreon/Ko-fi and your MIDI Mixer account.


