Home

Awesome

Midi Transposer

A VST3 plugin developed with JUCE framework to map chords to a MIDI bass pedal (or any MIDI controller)

General purpose

The idea is to use my MIDI bass pedal (Roland PK5-A) and expand its usage by mapping a root note and up to 12 intervals to each note of the octave. This way I can build a sequence of chords to play with my feet while improvising on any other instrument.

It was mainly a way to start learning how to use the JUCE framework and make an application I can use instead of a dull tutorial. I'll improve it as ideas come and I make progress learning the framework.

It uses version 7.0.10 of JUCE by pulling the master branch from CMake. It builds and run on Windows 10/11, MacOS and Arch Linux so far.

You're welcome to clone it and use it as you want. And if you see stupid code, don't hesitate to tell me, I'll be happy to improve and fix it :)

Build

CMake

To build the project using CMake, use the command line

# Generate
cmake . -B build
# Build
cmake --build build # --config Release

If you want the plugin to be copied in your VST3 folder, change COPY_PLUGIN_AFTER_BUILD to TRUE in Source/CMakeLists.txt

If you don't need JUCE extras (I use AudioPluginHost for debugging in Visual Studio Code), pass the JUCE_BUILD_EXTRAS option to OFF in the root CMakeLists.txt

For a great guide about configuring a CMake project with Visual Studio Code, I advise you to check this great repository.

Features

The interface is almost complete with this design. interface

When you click on a note, you have access to the intervals panel.

There you can select which intervals will be played for the selected note. You can also decide to transpose the whole chord by a number of semitones. To close the panel, click again on the note.

And that's it, it's pretty straight forward.

Hot Reload and configuration

The project uses Gin for its filewatcher class that allows to configure some GUI values with hot reload. If you want to change some colors, you can edit data/config/colors.json and define different ones.

The values in data/config/positions.json were mostly helpful during the development phase to define the different block sizes and positions and tweak all the coordinates without having to recompile everything.

Next

Some ideas I have in mind to improve it :

Third party dependencies