MiniHub

Free and open-source music workstation · Windows

Your signal. Your sound. Your way.

MiniHub is a free, open-source music workstation for Windows, built around the Arturia MiniLab 3. Typed cables in a node-based Patch Bay — not the page you happen to be looking at — decide the signal path.

Pre-alpha 0.6.0 · installer or portable folder

The Patch Bay

Cables are typed. What you wire is what you hear.

Three kinds of port, three kinds of cable. A MIDI output reaches a MIDI input and nothing else. Everything you wire is one node network, and that network is what plays — not the window you happen to have open.

Four nodes wired in the MiniHub Patch Bay: a BeatStep and a MiniLab 3, each drawn as its own faceplate with a purple control port on every knob and every pad, send control cables to the CTRL In of VST 1; the MiniLab MIDI Out reaches the MIDI In of that same plugin, whose Audio Out feeds Audio Output.

Patch Bay · knobs and pads reach the parameters of the plugin, the keys reach its notes, and only VST 1 makes sound

  • MIDI — notes and control change
  • Audio — sound reaching the engine
  • Control — parameters, no sound

What it does

Six parts, one signal path.

Routing

Patch Bay

Typed ports that refuse the wrong connection, cycle detection across the whole node network, and wiring that outlives every panel you open and close.

Native engine

VST3 host

Serial plugin chains with native editors, plugin state saved inside the project. C++17 and JUCE on WASAPI, sample-accurate.

Arrangement

Sequencer

MIDI and audio tracks on one timeline, recording, a clip editor, and multi-format export that renders what you heard.

Processing

Mixer, Morpher, Arpeggiator

Nodes you wire like anything else. The arpeggiator carries its own instrument face — knobs and a step grid, not a form.

Generative

One Ring

Sixteen channels of steps aimed at whatever its control cable reaches — rates, levels, tempo, plugin parameters — up to thirty-two scenes, one seed, and four voices that play notes from what it hears.

Hardware

Control learning

Bind a physical knob or pad to a VST3 parameter. Native MIDI keeps working while the binding is made.

Live

Rewire while it plays

Adding, moving and unplugging nodes never stops the audio. Generative sets are meant to be changed mid-flight, not reloaded.

Control learning

Arm a knob. Move it. It is bound.

Pick a control on the MiniLab, arm learning, then touch the parameter you want it to drive. The controller is drawn as it really is — eight knobs, four faders, eight pads, two touch strips.

The MiniLab 3 control surface drawn in MiniHub: knob K3 is selected and ringed in blue, the small screen reads Pad 1, faders F1 to F4 and eight pads labelled Arp, Pad, Prog, Loop, Stop, Play, Record and Tap sit below, and the bar underneath reads K3 unmapped beside an Arm Learning button.

Control bindings · K3 selected, unmapped, waiting to be armed

Arpeggiator

A preset to start from. A grid to disagree with.

Wire it between your keyboard and a VST and it plays what you hold. Six modes — Up, Down, Up / Down, As Played, Random, Custom — over eleven scales, four rates, and patterns of 4 to 32 steps. Draw in the grid while a preset is playing and you are editing your Custom pattern: the mode selector alone decides what is heard, so the one you are building never interrupts the one you are listening to.

The MiniHub arpeggiator: a control strip reading Root C, Scale Chromatic, Mode Up, Rate 1/16, Steps 8 and Snap to Scale off, above a piano roll where eight notes climb one semitone at a time from C4 to F sharp 4 across steps 1 to 7 and fall back to C4 on step 8, with a velocity lane of eight equal bars below it on a 0 to 127 axis.

Arpeggiator · the Up preset drawn out as eight steps, and the velocity lane under it

Native engine

The window edits it, C++ plays it

The pattern is sent to the audio engine and runs on the same clock as everything else. Close the panel, open another page, unplug the editor entirely: what you wired keeps playing.

Per step

Pitch, velocity, gate, rest, tie

Click a cell to draw a note, drag it to move it, drag its right edge for length. Velocity is a lane you drag, across the full 1–127 MIDI range, and a step can rest or tie into the next.

Scale

Guidance, never a cage

Eleven scales mark the rows that belong and dim the rest, and the root is ruled across the grid. Snap to Scale rounds what you draw; with it off, every row stays as editable as before. Random takes a seed saved with the project, not one drawn at launch.

Arrangement

A timeline that wires itself.

A track names its input and its destination; MiniHub lays the Patch Bay cable that makes it true, and says so on the track. MIDI and audio share one timeline, and the export renders what you heard.

The MiniHub sequencer: one MIDI track taking Minilab3 MIDI as its input and VST 1 as its destination, both cables reported as connected underneath, beside an empty timeline ruled in bars and an export panel offering WAV at 24-bit.

Sequencer · one track, the two cables it created, and a WAV export

One Ring

A sequencer aimed at the rest of your patch.

Sixteen channels, four to sixty-four steps each, and every channel aimed at something its control cable reaches — an arpeggiator's rate, a mixer's level, a morpher's step, the Sequencer's tempo, a parameter of a plugin. Wire the node and its commands appear in the channel's list; unwire it and they go. One Ring runs in the audio engine on its own clock, started by the same Play as the rest, so what it moves keeps moving with the panel closed. And it plays notes as well as commands: what reaches its MIDI IN becomes its material, four voices play that material, and what they played goes back into the Sequencer as a track of its own.

One Ring's sequence page: a transport reading Scene A1, bar 1.1, 70 BPM and stopped, scene buttons A to D over eight numbered slots, and a seed with Mutate beside it. Below, sixteen channels whose first seven name their targets — Arpeggiator 1 Rate, Mixer 1 Input 2 level, Morpher 1 Step 1, Sequencer Tempo, a Valhalla plugin parameter, Arpeggiator 1 Mode and Mixer 1 Master — and channel 1's steps, four rows of sixteen with the first of each row lit, under knobs for length, rate, repeat, offset, swing and humanise.

One Ring · sixteen channels, each aimed at something its control cable reaches, and channel 1's steps

Per channel

Sixteen channels that drift apart

Length, rate, repeats, offset, swing and humanise belong to the channel: four to sixty-four steps at 1/4 to 1/32, running once, twice, eight times or forever. Sixteen of them pull against each other instead of marching together, and each starts, stops and restarts on its own.

Per step

A value, a chance, a condition

A step carries a fixed value, a range it draws from, or a list it picks from. Add a probability and it plays sometimes; add a condition — the first pass, the last, every other one, another channel running or not — and it waits for it. Lock a step, or only its chance or its value, and mutation leaves that alone.

Scenes

Thirty-two scenes, one seed

Thirty-two places, A1 to D8: store a scene, recall it now or at the next bar, with the channels restarted or left where they stand. Every random draw comes from one seed, so the same seed and the same material play the same piece; Mutate varies one channel or all of them, within what each step allows.

One Ring's voices page: voice 1 of four, reading as the scene sets it, with root C and a chromatic scale, transpose and octave at zero, a range from C minus 1 to G 9, velocity at 100 percent with its softest and loudest at 1 and 127, a gate of 100 percent, shortest a sixty-fourth note and longest sixteen bars, an order knob between Played, Up, Down and Shuffle, a density of 100 percent, and a MIDI channel set to Their own.

One Ring · a voice, its scale, its range, its velocity, and the order it reads the material in

Material

It listens, then it keeps

What reaches One Ring's MIDI IN — a Sequencer track aimed at it, or a controller cabled to it — is captured over one to sixteen bars and becomes its material, up to 256 notes. A MIDI clip can be loaded instead, a step of the sequence can start the capture itself, and freezing the material keeps the sequence from changing it.

Four voices

Four voices, not four notes

A channel aimed at a voice plays a slot of the material, or one note of it — and a voice sounds thirty-two notes at once, so the four hold a hundred and twenty-eight. Each has its own root and scale, transpose and octave, velocity and length with their spreads, the order it reads in — as played, up, down, shuffled — a density and a MIDI channel, and other steps move those rules while it plays.

The writer

What it played becomes a track

A step aimed at the writer takes what the voices played over the last one to sixteen bars and writes it into the Sequencer: a new track where it was heard, playing the instrument you name, or the notes of a clip replaced or added to. With feedback on, each generation becomes what the voices play next, at most a set number of times, then it stops itself. The origin is never touched.

Any controller

Not a MiniLab? Map yours in the browser.

MiniHub reads a setup file — what a controller sends, and where each control sits on it. Someone may have written yours already: plug the keyboard in and the setups page recognises it. If nobody has, the Builder writes that file, and it starts out knowing nothing: you show it one family at a time, turn a knob, hit a pad, and it learns what your hardware has. Calibration is the first owner's evening, not everyone's.

Measured

MIDI answers, you point

The message says which control moved. A click on a photo of your own keyboard says where it sits. Nothing is recognised, nothing is guessed, and no catalogue of devices is consulted.

Private

The photo never leaves

It is a backdrop to place controls on, read inside your browser and dropped when you are done. No upload, no account, no server: the page is static, like the rest of this site.

Portable

A file, then a keyboard

Commit the setup and a JSON file lands in your downloads. MiniHub loads it, draws your device from it, and plays through it — and published setups are the same kind of file, readable before you trust them.

Needs Web MIDI · Chrome, Edge and other Chromium browsers hear a MIDI port; Firefox and Safari do not

The approach

Most of the design is what it refuses.

These are not gaps waiting to be filled. Each one is a decision, written down with its reason, and each one is what keeps the rest small enough to reason about.

No build step
No bundler, no transpiler, no framework. What sits in src/ is exactly what runs.
No runtime dependencies
Two development dependencies, and neither one ships. Tests run on node:test, not a runner.
No network
Nothing phones home. No account, no telemetry, no usage statistics, no update check. It works with the cable unplugged.
No plugin system
No scripting language, no public API, no extension format. The plugins are VST3 — that problem is already solved.
Windows only
WASAPI, the Windows VST3 format and %APPDATA% are commitments, not debt. A portability layer added just in case is refused on sight.
Not a DAW clone
A feature is never justified by other software having it. It is justified by finishing a track, or by playing live.

Download · Windows 10 and 11, 64-bit

Install it, or just unzip it.

Two routes, one build, and neither is the lesser one. What you make — settings, projects, recordings, the controller setups you import — lives outside the application folder, so both routes read the same data and moving between them loses nothing.

Installer

Setup.exe · 102 MB

Installs for you alone, with no administrator prompt: a Start-menu entry, a desktop shortcut if you want one, a line in Add or remove programs. Uninstalling removes the application and nothing you made.

Portable

ZIP folder · 144 MB

Unzip anywhere and run MiniHub.exe. Nothing is registered, nothing is written beside it. To update, drop the next folder over this one.

Pre-alpha

It runs. It is not finished.

It plays, hosts VST3 plugins, sequences and records, and it is under active development. The rough edges are listed in the release notes rather than left to be discovered.

Not code-signed, so SmartScreen will ask — More info, then Run anyway. Release notes and SHA-256 sums · Build it from source instead

It is pre-alpha, so it will break somewhere. Tell me what broke — or use Report a bug on MiniHub's own Home page, which fills your version and Windows release in for you. Anything that is not a bug goes in Discussions.

Getting started

From download to your own keyboard, in five steps.

A MiniLab 3 needs none of this past step two — its setup ships inside MiniHub. The rest is for every other controller, and it is a one-time evening: once the file exists, plugging in is all there is.

  1. Download MiniHub

    Installer or portable ZIP, from the section above — same build, your call. Windows will say it protected your PC, because the executable is not code-signed: choose More info, then Run anyway.

  2. Install it, or unzip it

    The installer needs no administrator prompt and puts MiniHub in your Start menu. The ZIP wants unzipping anywhere, then MiniHub.exe. Neither writes your settings, projects or recordings inside the application folder, so you can change your mind later and lose nothing.

  3. Plug your controller in

    If it is an Arturia MiniLab 3, you are done — its setup ships with MiniHub, and the Patch Bay already draws the faceplate. Any other controller needs a setup file: what it sends, and where its controls sit. That is the next step.

  4. Look for your setup

    Open Setups, keyboard plugged in, and press Look for my keyboard: the page reads the MIDI port and tells you whether someone has already mapped your device. If so, download the file — you are done mapping.

    Needs Web MIDI — Chrome, Edge or another Chromium browser.

  5. Nobody mapped it? Build it, then load it

    The Builder writes that file from your own keyboard: a photo of it, then one family of controls at a time — turn a knob, hit a pad — and Commit setup drops a JSON file in your downloads. The photo never leaves your browser.

    In MiniHub, open the page named after your device, find the Profile panel and press Import a profile… there. The window reloads, and from then on MiniHub draws and decodes your controller from your file.

    The Profile panel in MiniHub: it is running BeatStep and MiniLab 3, listing MiniLab 3 as shipped with MiniHub with 29 controls and Arturia BeatStep with 41 controls from arturia-beatstep.json, each marked Loaded with an Unload button, above an Import a profile button and a note that loading or unloading a controller reloads the window.

    Two controllers loaded at once · each one gets its own page

Status

A personal project, in active development.

One person's project, and the download above is its third public build. It also builds from source on Windows 10 and 11, with Visual Studio 2022, CMake 3.22 and Node 20 or newer. The native SDKs are fetched separately and never committed.

Latest release
0.6.0pre-alpha, unsigned
JavaScript tests
1 283node:test, no runner
Native checks
3 954four test binaries
Release build
0errors and warnings
Licence
MITsource on GitHub