Appearance
Changelog
Release history for MNodes installers, auto-generated from the releases admin panel.
v1.1.2 (2026-09-12) · macOS + Windows
MNodes 1.1.2
NEW
Joints on the cables -> Alt-click a cable to drop a joint, and drag it to route the cable where you want it; Alt-click or double-click it and it is gone. As many as you like, saved with the project, one undo step each.
The little i beside a parameter says what it does -> two out of three used to open on nothing but the name and the range. Nearly three thousand of them now say what they do, what each end gives you and what Off means, across every node.
The State Morpher and the Spectral Morph can be exposed to the DAW -> tick Expose to DAW and the two axes of the pad become two host parameters to automate or map, X and Y on one, Shape and Detail on the other. No more extra knob wired into the pad to get there.
Unused Outputs, on the Plugin Host -> Omnisphere runs nine stereo outs by default and pays for every one. Set Unused Outputs to Off and the buses beyond Output Pairs stop running, the way a DAW switches them off. Active is still the default.
Play Again, on the Audio Player and the Recorder -> what a second press of Play does while the file runs: Restart, Pause, Stop or Nothing. Each node keeps its old habit as the default, and the Recorder gains a Loop switch with its pin.
A Data output on the MIDI CC Extract -> Data Out sends the value the moment a matching CC arrives, and nothing in between, so a step or a counter is no longer fed the resting value by a CV To Data. The Value pin is unchanged.
Every project in the library shows its file date -> the date the file was last written, at the end of each card's line. The Newest and Oldest sort orders work now.
A knob's ticks can be dots -> Tick Shape: Lines, as always, or Dots. A dot is as wide as its line is long, so Tick Length sizes both.
IMPROVED
A project opens where it is -> drag a .mnprt in and it opens from its own folder, with Save writing back to the same file, instead of a silent copy into Projects/User under a numbered name. Copy to Library is there when you want one, and a project that is moved or left on a drive you unplug shows as MISSING, to locate or remove. Bundles, module packs and Hub downloads still land in the library.
One library folder for the standalone and the plugins -> the folder is remembered the first time it is resolved, so a machine whose Music folder resolves differently for two programs no longer keeps two libraries, one on E: and one on C:, with the same project in both.
FIXED
Five things the Inspector was promising and not doing -> the File Drop ignored its six gradient settings, the Beat Repeat its Body Background and Frame Colour, the Soft Clipper in stereo had no descriptions at all, and the Delay named two of its three ways of setting the time. Found while writing the new ones.
The State Morpher's puck stuttered under automation when a Map fed it -> a Map reached the pad twice, as a value and as a stream, one block apart. The wired stream now owns its axis. A puck driven by an LFO also moves while the pad is off screen.
The right-click palette opens under the cursor again -> since 1.1.1 it could land above the click, below it or off the edge of the screen. It places itself now, top-left corner under the cursor, like a menu.
Save As says when the name is already taken elsewhere in your library -> saving under another category quietly made a second file with the same name, and the browser listed it twice. It now asks: keep both, or replace the one you have.
An imported preset that lands under a numbered name says so inside -> the copy was "Name 2.mnprt" with "Name" still written inside it, so the browser showed two rows called the same. The numbered name goes into the copy now.
A Plugin Host's exposed parameters name their output pins again -> since 1.0.6 the output pin was a bare dot, the only unnamed outputs on the canvas.
v1.1.1 (2026-09-10) · macOS + Windows
MNodes 1.1.1
NEW
Module packs -> a pack is a folder under Modules/User with a name, an author, a description and a cover. The Modules explorer shows every pack as a section with a banner, a Category | Pack switch decides how the list is cut, and Save As Module files a module in the pack you pick. File > Create Module Pack... builds one as a single .mnmodpack file, with the modules, their pictures and their samples inside; File > Install Module Pack..., or dropping the file on the graph, installs it, and installing again replaces it.
Module packs, modules and subgraphs on the Hub -> the Hub takes a .mnmodpack, a .mnmod or a .mnsubgraph beside projects and bundles, each wearing its kind on the card. In the app a download of any of them goes straight into your library, where the explorer shows it.
The right-click palette lists nodes, your modules and your VST3 plugins -> a Nodes | Modules | VST3 switch ahead of the categories, each on or off. A plugin is a row like any other, and picking it makes a Plugin Host with it already loaded. The choice is kept between sessions.
Keyboard Key and Keyboard -> two new nodes under System: the computer keyboard in the patch, the way a key is a node in Unreal's blueprints. Keyboard Key is one key, with Pressed, Released and Held; Keyboard is the whole keyboard on one node, with the name, the code and the character of the key. Sixteen keys are sixteen drum pads without a MIDI controller.
Arrange a container's ports -> select a Subgraph, a Module or a Poly Module and the Inspector shows its inputs and its outputs as two lists you drag into order, the container's own pins included. Every cable stays where it was, the order travels with the module and with every voice of a poly module, and a double-click renames a port.
The Knob can be a rotary switch -> a Positions setting, 2 to 16, and the knob rests on that many detents, the ticks mark them, and a Position pin says which one, ready for a Data Select or a Film Strip.
Loop Ring -> a new widget: a ring that goes round with a loop, an arc from twelve o'clock in the colour of what the loop is doing, recording, playing, overdubbing or stopped, with the word in the middle. Wire the Looper's Phase and its new State output and it follows; any 0..1 ramp makes it a progress ring.
Purpose -> one question when you save: what the patch is for, Instrument, Effect, MIDI, Learn or Utility. It is suggested from the patch, travels inside the preset, files the project under its section on the Hub and groups your own library by the same five words. The Type dropdown is gone; the technical type follows the purpose.
The Film Strip can go round -> a Wrap switch: past the last frame the strip continues from the first, so a sheet drawn as a full turn turns for ever, by drag, by wheel or from a phase that keeps growing.
The explorers show the node itself when the rows are big -> raise the Size slider past halfway and each row gets a picture of the node as it looks on the canvas, or a module's own picture.
Spread X and Spread Y on the Polygon Shape -> how much of the widget the polygon takes on each axis, so a hexagon stretches as wide as a fader or as low as a button. Auto is the regular polygon, as before.
Chord Palette rows trade places -> hold Ctrl and Shift (Cmd and Shift on a Mac) while you drag a pad and the whole row swaps with the one you drop it on. Move Row Up and Move Row Down in the pad's menu do the same.
Audio In and Audio Out channels can be named -> a Channel Names section in the Inspector, and the pin reads Sub or Rear L instead of Out 3.
A pin says whether a cable is on it -> a wired pin wears a thin collar in its own colour; a free one is drawn as before.
A jack's ring wears the colour of its cable -> a Jack In or Jack Out gets its ring in the theme's colour for what it carries, audio, CV, MIDI or data. Set Ring Colour yourself and that wins.
IMPROVED
The Hub is arranged by what you came for -> the rail lists sections, an icon and a count each: Everything, Instruments, Effects, MIDI, Learn, Utilities, Modules and Bundles. A project lands in its section by the Purpose its author chose; older uploads by their type and categories. The featured card is redrawn, and every card sits on a smear of its own colours instead of black bars.
The preset browser is one box -> the rail runs the full height on the left, with bigger words and the Hub's icons; the search, the sort, the Cards / List switch, the size control and the rescan button share one band over the content; the close button sits inside the frame. Your library is grouped by Purpose where Type used to be, and the preset name in the menu bar shows it is a door: the library's glyph on the left, a chevron on the right.
Patch cables on the canvas, between the jacks of your modules -> the sockets drawn inside a module's node take cables exactly as they do on the front panel: press one, drag to a socket on another module, let go. It is the same connection, with the same rules, always drawn on top, and it follows the nodes as you move them.
The Nodes explorer is back to categories -> a node is worth finding by what it does, not by the cable it carries, so the chips are the categories again, alphabetical as in 1.0.9, in the explorer and in the right-click palette alike. The cable colour survives as the small badge on each row.
The explorers open folded -> every section starts closed and what you open stays open, per explorer, across launches.
One colour around the graph -> the sidebar's tone is now the ground of everything around the graph and the front panel: the menu bar, the panels, the Inspector and Settings. It follows the theme.
FIXED
Several MNodes on several tracks, each with its Plugin Host, all sound -> loading a project shut down every instance's hosted plugins, not only its own, so the last track to load was the one left playing. Each instance now shuts down its own workers only.
A crash in one MNodes instance is reported even after another has closed -> the first instance closed used to switch the crash reporter off for the rest, so a crash while switching projects left no report. Only the last instance takes it down now.
Hosted plugins on a Mac get a real-time audio thread -> one Omnisphere inside a Plugin Host cost as much as sixteen on Live tracks. The thread that runs a hosted plugin now asks macOS for the same real-time scheduling CoreAudio gives its own; Windows already had the equivalent.
MNodes no longer takes Logic Pro's plug-in process down when the pointer lands on a tooltip -> on macOS 26 with Logic Pro 12 the tooltip asked itself for its own scale, without end.
A CV Sub Send inside a Poly Module reached every voice at once -> each voice now has Sub Wire buses of its own, so a wire inside a voice stays inside that voice.
Every node makes room for its Bypass row -> nodes with a hand-written height, CV Trigger Pulse among over a hundred, drew the row half under the bottom edge. A node now declares its own size and the base adds the rows it injects, and a project saved with the short nodes opens with them grown.
Every pin fits inside its node -> a pin no row places, the Bypass under a MIDI Voice Allocator's voices or a voice node's output, hung off the bottom edge; the height counts it now.
The voice nodes and Sub Out (MIDI) have no Bypass any more -> none of them had anything to bypass. A project saved before opens with the pin gone and any cable into it left out.
The Audio I/O nodes are back under Audio, not Data -> a category name with a slash of its own was split in half and matched nothing.
Five nodes were filed where they do not belong -> Pendulum joins the sequencers, CV Scope and Smooth go to Modulation, Print to Flow, Mandelbulb to Widgets.
Changing a jack's Type drops the cables that no longer fit -> a Jack In switched from Audio to MIDI kept the audio cable plugged into it.
The jacks' patch cables on the canvas keep up -> panning, zooming or dragging a module left them a beat behind.
Input Select passes text along, not just numbers -> a word wired into an input never reached it, and Out answered with zero.
The Chord Palette names an inverted chord correctly -> E G C was labelled Em; it says C/E now, the chord and the note underneath it.
A Chord Palette on the front panel keeps every pad, however small -> the rack folds into fewer rows first, then draws slivers, rather than nothing.
Button and Toggle text fits a short face -> a Text Padding setting in Appearance, 4 by default, in place of a fixed margin that blanked a low button.
The skin you choose stays chosen -> every change to the look you make yourself becomes the default on its own. Set As Default Skin is still there.
The image box in the Inspector always leads to a file -> Browse stays at every width, as "..." when the word does not fit, and the box's right-click menu has Browse... and Clear.
The Modules explorer's chips stayed after an install -> the row at the top read empty until the panel was resized.
Voice Pitch's help sends you to the right converter -> Note To Freq, not CV To Freq, which expects volts per octave.
A one-module .mnmodpack carried its samples but not the way to them -> the paths inside the module are rewritten on export, so they are found on another machine.
The Lab's panels hold together -> the look's decisions are the whole panel's, made once, so knobs and sliders match. Past the wild end of the creativity slider every knob still goes its own way.
A hosted plugin's worker is let go cleanly -> the connection is closed while the worker is still alive, and nothing of it is left behind at exit.
v1.1.0 (2026-09-07) · macOS + Windows
MNodes 1.1.0
NEW
Preset Manager -> a new widget: the preset system of a device you build, on its front panel. A strip with previous and next, a favourite star, the name and category, Save and a menu, and clicking the name opens a browser over the window with the categories down the left and the presets on the right. A preset is the front panel and nothing else: the values of the controls a person can touch, never the wiring or the internal nodes, so one saved today still fits after you have rewired half the instrument. Yours ship with the project as the factory set; the ones a user saves become files in a folder named after the device, so a Hub update leaves them exactly where they were. Presets are .mndevpreset unless you set your own extension, and the device's name travels inside the file, so one dropped on another device is refused by name whatever it is called. A preset that uses samples exports as a zip with the samples inside it. Everything is a pin, Recall, Save, Update, Rename, Prev, Next, Delete, Browse, Import and Export, so your own buttons, a MIDI controller or an On Load can drive it.
Jack Out, Jack In and patch cables on the front panel -> two new widgets and the layer that joins them: sockets you drag a cable between while the instrument is playing, so a panel can be rewired by whoever is using it and not only by whoever built it. The cable is a real connection and not a picture of one: it is the same graph edge those two nodes would have if you had wired them on the canvas, so it saves with the project and the existing rules about matching types and feedback loops are what decide whether it can be plugged in at all. A socket faces the opposite way to the pin behind it, because a jack is a hole through the panel. The canvas can make the same cable, from a pin named Cable, and what it does not do is draw twenty more curves across your patch: a patch cable is seen and unplugged on the panel, where it belongs.
MNodes FX takes a sidechain from the DAW -> the plugin declares a second input bus next to its main one, off until the host routes a track into it, so a session that never used one sees the same plugin as before. Pick the track to key from in the plugin's sidechain menu the way you would for a compressor, and the new Sidechain In node carries it into the patch: SC 1, SC 2 and up to eight. Feed it to the sidechain input of a compressor to duck, or to a gate as its key. The two never mix: Audio In never sees the sidechain and Sidechain In never sees the main input, however wide the host makes either. In the Standalone, where there is no DAW to route from, SC 1 and SC 2 listen to inputs 3 and 4 of your audio device.
A sample map is one file, with the samples inside it -> save a Sampler's zones and choose Save Map, and you get a .mnsmap with every sample it uses packed in. Open it on another machine and it unpacks itself into your library, so a collection can be handed to somebody without gathering files by hand and without a single path to fix.
One Shot and Normalize, per zone, in the Sampler -> a zone with One Shot on plays through to its end whatever the key does, which is what a drum hit or a sound effect wants from a quick tap. Normalize sets that zone's new Gain (dB) so the loudest point of its played region reaches full scale: it is a trim on the zone with its own pin, undoable and editable like any other, and the file on disk is never touched. Right-click one zone or a whole selection, and Reset Gain puts it back.
MIDI Program Change -> a new node: sends a Program Change, with an optional Bank Select in front of it, to switch the preset of whatever sits downstream, a plugin in a Plugin Host or a hardware synth. The message goes out the moment the program changes or when Send fires, and incoming MIDI passes through.
The Chord Palette is played from a keyboard, and holds 64 pads -> it has a MIDI In now, and holding a key holds its chord for as long as you hold it. Several keys hold several chords, which is the one thing about this node you could not build out of other nodes. Up to 64 pads, each with its own trigger key in any order, and you can say which number plays the first one.
Fewer steps between an idea and a wired patch -> hold Shift and drag a node onto a cable and it goes into the chain, with the two cables that would replace it drawn dashed before you let go. The same key with the node away from any cable takes it back OUT and closes the chain over it, keeping its settings and any cable that was not part of the chain. Let a cable go over empty canvas and the node list opens where you dropped, showing only what can take it, and whatever you pick arrives already connected. Let one go on a pin of the wrong kind and the converter goes in for you, wired at both ends: a MIDI output onto a Data input lands a MIDI To Data, and which converter it is depends on the pin you aimed at, not just the cable in your hand. And Escape lets go of a cable halfway through a drag, putting a relinked one back where it was.
Ctrl or Cmd while you drag a cable takes the neighbouring pins along -> grab the left output of a stereo node with the key held and a second ghost cable comes with it; grab the first of eight channels and eight come. Drop on the first input of the destination and each cable lands on the input that follows it, as far as both sides reach. The key is read live, so pressing it halfway through a drag brings the ghosts out and letting go puts them away.
View > Show Node Latency -> which node is adding delay, and how much, as a badge on the header of every node that carries audio. The zeroes are shown as well, dimmed: a blank header would mean either "this adds nothing" or "the display is not telling me anything", and those are the two things somebody hunting a delay most needs to tell apart.
Every node that can be bypassed can now be bypassed from the patch -> bypass already saved real CPU, because a bypassed node's DSP is not run at all, and the measurement that came with the request was 42% of a machine with the FX sections idle against 28% with them bypassed. What it could not do was happen while you play, because it was mouse only. Now a button on the panel or a preset selector can do it, and each effect on an instrument's front panel can have its own on and off.
Modules and Poly Modules have a Show Panel pin -> an event opens that module's front panel in a window of its own, and only that module's panel goes in it. Perform is one window, and until now a big patch had nowhere to put the second half of itself: a mixer on one screen, an oscillator editor on another.
The first screen says what MNodes is -> the Home that opens with the app was a tall column of small boxes and identical icons. It is now one wide card: the name, the version and one line that says what the thing is, then Perform and Create as two proper doors with a drawing of what is behind each, and recent projects as a row of covers rather than a list of names.
MIDI Filter -> a new node: which KINDS of MIDI get through. The Note Filter answers "which notes"; nothing answered "which messages", so a patch could not drop a controller stream, keep a clock out of a chain or stop program changes reaching a hosted plugin. One switch per family: notes, aftertouch of both kinds, control change, program change, pitch bend, SysEx, clock, transport and the rest of what the system sends.
A knob with no ends -> turn Endless on and the Widget Knob runs past its range instead of pressing against it: keep going up from the top and it carries on from the bottom, which is what a hardware encoder does. It is the natural thing for a knob that picks one of a list. Pair it with a Sweep Angle of 360 and there is no seam to see either. Off by default, because a level should stop where it stops.
The Widget Toggle can be a checkbox -> a new Look in its Appearance: Button, the face it has always had with the label inside, or Checkbox, which shrinks that same face to a square with a tick and moves the label out beside it. Every colour, border, image and pin means the same thing in both, so a toggle already wired into a patch becomes a checkbox without the patch noticing. Corner Radius still works, so at 50% you have a radio button.
File Info and Is Extension -> two new nodes for what a drop zone needs. File Info gives you the pieces of a path: what KIND of file it is, its extension, its name, the folder holding it and whether it is really there, so audio can go one way and images another. Is Extension answers "is this file one of these kinds?" in one node: put wav aiff flac in the box and it says yes or no.
The Meter has Peak and RMS outputs, both live at once -> they say what they are named after whatever Meter Mode is set to, so a patch can compare the two without a second meter.
The Clip Track holds 64 clips, and edits several slots at once -> the number at the left of a row points the settings above at that slot, and it took one row at a time; now it takes a selection. A clip can be dragged from one Clip Track onto another instead of stopping at the edge of its node, Delete empties the selected rows on a front panel, and the ceiling is 64 rather than 32, which is the number a grid controller has.
A Piano Roll curve lane has handles to bend it with -> every stretch of line between two points now carries a diamond halfway along it, so a curve is shaped by dragging rather than by adding points.
Shapes, the meter and eight more widgets can carry a tooltip -> every shape, the Meter, the Image and the rest, so the explanation of a control can live on the control instead of in a label beside it.
IMPROVED
The Nodes explorer reads at a glance -> nineteen category chips in eight alphabetical rows took a third of the panel and said nothing about where anything was. The bar now holds All, Audio, CV, MIDI, Data and Panel, in the order a signal flows, each underlined in the colour of its cable, and it never changes. Inside, the categories are the sections in a fixed order, a header is a readable 32 pixels whatever the row size, and a mono and stereo pair is one row wearing a MONO / STEREO pill instead of two rows saying almost the same thing. Recent and Favourites open the list.
Categories are filed by what a node does -> Utilities held thirty six nodes: Audio In next to Sig Add next to Plugin Host next to Comment. It is empty now. The ins, outs, sends and matrices are Audio I/O; the maths is Signal Math; Comment, Frame and Colour are Canvas; Plugin Host, Recorder and Transport are System; the If and its family are Flow, the text tools are Text, and Routing splits by domain. Nothing about any node changed but the drawer it is in.
Settings is seven short pages instead of five long ones -> General was a corridor: a tooltip checkbox, five things about cables, five library folders at two lines each, three loose buttons and the plugin folders under them. Three screens of scrolling, and none of it general. It opens on General now, with Graph, Library, Appearance, Shortcuts, Audio & MIDI and License beside it. Every row has the same shape, a name at the left and its control at the right, and what a setting means is in its tooltip rather than in a sentence under it. The eleven theme colours are a grid of swatch, name and hex, so all of them fit without scrolling, and Shortcuts gives each command a field with a Learn button that waits for the new keys.
The strip of sections at the left edge says what each icon is -> four small drawings at half strength, and with the panel closed nothing said which one would come back. Each entry carries its name under its icon now, the open one on a filled pill, the one under the pointer on a faint one, and the one that would come back on a hollow one.
The Inspector is quieter, and its long categories have doors -> every row carried four icons always, more than three hundred of them on a knob, competing with the values they sat next to. They come up when the pointer is on the row now. Two stay because they say something: a closed padlock, and a dot where the info icon would be when the value is no longer the one the node came with. The rows that belong together sit under a small header of their own, folded to start with, so a knob opens as fourteen lines instead of eighty four, and what you open stays open on every node of that type across projects. Labels stop repeating the header: under Tooltip the row is Text Colour, not Tooltip Text Colour.
A crash report says where in MNodes it happened -> every line of the stack now carries the module it is in and how far into it, with the symbol name only as an extra. Without symbols installed, and nobody has them, the system answers that question with the nearest thing it has exported, which on a release build is a name from somewhere else entirely: one report read "memset" for an address inside Windows itself. A name like that is worse than none, because it sends you hunting.
Every Module you have shows up in the node search -> right-click on empty canvas and the list holds the nodes, the Subgraphs and now the Modules as well, the factory ones included. They were listed in the Nodes browser and missing here, so a right-click could not reach half of what you had made or been given.
Data Select is now called Input Select -> it never selected Data: its inputs are hybrid, so they carry Data or CV alike, and naming it after either half was the problem.
Every delay line reaches 10 seconds -> Delay Line Mono and CV Delay Line went to 5, MIDI Delay and MIDI Echo stopped at 4.
Cmd or Ctrl + I shows and hides the Inspector -> and it knows which window you are in, so the detached front panel has an Inspector of its own that opens and closes with the same keys. Its X closes that one and not the main window's.
Help is on the right-click menu in the front panel too -> and an example can be lifted out of its window: Select All, Copy, and paste it into your project. Taking an example apart is the one thing an example is for.
The MIDI Monitor can put new messages at the bottom -> a new Newest setting, Top or Bottom, for reading it the way a log reads.
Combo Box gets Remove Item and Clear, both by pin -> Add Item was there and its opposite was not, which left a list a patch could grow and never shrink.
Widget File Drop can be after a folder instead of a file -> set Pick to Folder and Browse opens a folder chooser, and a folder dropped on it is taken as one.
MIDI CC Inject can take its value in MIDI's own units -> a Value Range of 0 to 127 next to the 0 to 1 it has always taken, which stays the default so no patch changes.
Shift draws the selection box, whichever tool you are holding -> Alt has always drawn a note while the crosshair is up, so selecting and drawing each had a key and neither had the other.
Converters, routers and pass-throughs no longer offer a bypass -> bypassing a node hands its input straight to its output, and none of these has such a pair to hand over: a bypassed MIDI To CV has no audio input to pass, and a bypassed Sig Pass would do exactly what it already does. The switch was there and did nothing, which is worse than not having it.
A copy drag says it is a copy -> dragging a clip onto another row moves it and holding Alt copies it, and until you let go there was nothing to tell you which of the two was about to happen.
Every Clip Track slot starts on Stretch -> Warp used to start on Repitch, which brings a clip to the project tempo by resampling it, so it moved the pitch as well.
The Inspector's search survives the next click -> whatever you typed stays put when you select another node, so setting the same field on twenty nodes is twenty clicks and not twenty clicks and twenty searches.
FIXED
A State captures every widget's value again -> toggles, dropdowns, radio groups, XY pads, range sliders and text boxes had stopped travelling with a state. It applies to the states already in your projects: nothing needs re-saving.
A States node inside a Module or a Subgraph could take MNodes down -> when you opened another project, or closed the app. Every time, on the machine that reported it.
MNodes could crash while a hosted plugin was being closed -> five of the crash reports sent in from one machine turned out to be the same crash.
Parallel paths that meet at the audio output are lined up at last -> so a dry path and a processed path stop doubling. Every node reports its own delay, and the paths that ran through fewer of them were arriving early.
Bypassing a node with latency no longer moves the audio in time -> a bypassed node passes the dry through and adds no delay of its own, so it used to shift everything downstream of it.
Every spectral node was under-reporting its latency by 512 samples -> Spectral Compressor, Spectral Morph, Spectral Paint, Spectral Resonator and the rest, which is enough to hear against a dry path.
A control exposed to the DAW went one-way after loading a preset from the browser -> the DAW could still move it, and nothing you did to it on the panel reached the DAW.
Three defects on the path a DAW automation value takes into a widget -> found while looking into a report of automation being unreliable in FL Studio.
A button or a toggle wired to a Clip Track's Launch input fires the row you picked -> instead of always row one.
Clip Track slots nine and up started at nothing -> the rack holds up to thirty two rows and the per-slot settings are one value per row; the ones past eight were never written with their defaults.
A State now restores a container's dropdown settings -> Subgraphs, Modules and Poly Modules have settings that are a choice from a list, and those were not coming back.
Recalling a State no longer rewrites the If node's comparison -> switching states could turn an == into a !=, putting the logic back to whatever it was when the state was saved.
A widget's tooltip colours follow it onto the module's display and onto the front panel -> the colours worked inside the module and were dropped everywhere else, so the same widget looked like two different things depending on where you hovered it. (Reported by Danny on the forum.)
The Meter's Scale Marks could not be changed -> both sliders moved and sprang straight back to where they were.
A MIDI panic left MIDI To Data and MIDI To CV insisting notes were still held -> All Notes Off and All Sound Off put every key up without sending a note off for each one, and the count was never told.
MIDI To Data was drawn a row short, so CC Value fell off the bottom.
The Piano Roll ignored a cable on its own controls -> Loop Length, Loop Start, Steps, Slot, Rate, Swing, BPM, Channel, Play Mode and Transport Source had pins that did nothing.
Reaching for Alt mid-drag sometimes dropped the clip there and then -> pressing a modifier while a mouse button is down takes the mouse capture away on Windows, and the app was told the button had been released when it had not.
Adding a Mandelbulb or a Reactor Core froze everything for a few seconds, every time.
Projects open faster -> the same answer about which of a module's ports carry CV was worked out once per port and then twice more for every empty module, the data thread was stopped and restarted a few hundred times during a single load, an SVG was parsed once per widget that used it instead of once, and a module's front panel redrew whole every time one of its widgets moved.
A preset or bundle called "Bass #1" exported itself as "Bass 1", without saying so -> there were two rules for turning a name into a filename and they disagreed.
The Create Bundle window scrolls now -> instead of hiding its own buttons on a short screen.
The plugin builds now ask macOS for microphone permission properly -> they were asking with names the Projucer throws away, so they shipped without asking for either that or Bluetooth.
The Hub tells an update from the copy you already have -> a creator republishes a project and the card said OPEN; an older copy imported by hand said OPEN too; re-downloading could hand the old copy straight back; and replacing one by hand imported it into the wrong folder. The file on disk has the last word about which release you have now, and the Hub asks before installing over a project it did not put there.
The Hub was serving the previous release of a replaced project -> server side, nothing to install with MNodes.
Subgraphs, modules and nodes are drawn as tall as their contents -> ports were pushed a row down and off the bottom edge, a Subgraph was drawn one pin row short, a node saved shorter than its contents stayed that way, and nodes could not be made as short as they actually allow.
The Lookup's Text input was off the bottom of the node -> and its list is legible again on the node's face.
Adding a point to a curve lane no longer drags the last selection along with it.
A pin whose name was already written by its row had it written twice.
The Polygon Shadow no longer offers a picture it cannot draw.
Framing a selection puts the frame's title bar above the nodes, not on top of them.
Dropping a project archive on the window now goes in through the same door as every other way of opening one.
v1.0.9 (2026-08-30) · macOS + Windows
MNodes 1.0.9
NEW
Clip Track -> a new node: a session view, one column at a time. Eight slots and up to thirty two, audio or MIDI, that you load, record into and launch. Click a slot and it does not start there and then: it starts on the next Quantise boundary and blinks as queued until it does, which is the whole difference between a launcher and a file player. Click the one playing to stop it, on the same boundary. An audio clip carries the tempo it was recorded at and stretches to the project tempo, looping over its own length, so clips cut at different tempos play together with nothing to set up. One node is a column, so a rack of them side by side on the front panel is a session and scenes come free: the Launch input takes a slot number, and the same number wired into every track moves the whole row at once. Rows record, arm the track and every empty row offers a record button. Right-click a row to transpose it by a named interval, reverse it, play it at double or half speed, or ask the file for its tempo again.
Spectral Paint -> a new node: a filter you draw on the sound itself. The body is a spectrogram, frequency up the side and time across, and dragging on it paints a mask: whatever you paint is taken out. Alt or the right button rubs out, double-click clears. Columns is the control worth understanding: at 1 there is no time axis and the mask is frequency alone, which is a filter you draw; turn it up and the mask sweeps over a musical division, so what you painted repeats every bar and the same gesture becomes a rhythmic gate. Depth is how far a painted band is pushed down rather than an on and off switch, Invert swaps what survives, and Smoothing spreads the gain over a fraction of an octave so the edges stop sounding like a comb filter.
Spectral Compressor -> a new node: an OTT with a thousand bands. A compressor on every FFT bin, in both directions at once, so every partial is levelled against its own neighbours rather than against whichever band it fell in. Two thresholds with their own ratios, and the gap between them is the real control. Smoothing spreads the gain across frequency and is the reason it does not sound metallic. It has a sidechain doing either of the two things a spectral one can: Duck feeds the detector from it, so a kick pushes a pad out of the way at exactly its own frequencies, and Match makes the sidechain's shape the threshold. Curve puts a shape on the thresholds instead of one number: pink, or one you draw straight onto the display. Delta plays only the difference, which is the fastest way to hear whether it is working on the right thing.
Spectral Morph -> a new node: two sources into one sound that is neither. Shape follows the envelope of one and Detail the fine structure of the other, along two axes you drag on an XY pad. Transients step aside on attacks so the result keeps its edge.
MIDI Matrix, CV Matrix and Data Matrix -> three new nodes: the Audio Matrix for the other three kinds of cable. Up to sixteen in by sixteen out, drag across the grid to route, eight setups saved in the node.
Radio Link -> a new node: buttons that belong to each other. Wire a group of toggles to it and only one can be on at a time, with an Index in and out so the group can be set from a number or read as one.
Vector Mix -> a new node: one position, four voices. Drag a puck and the four sources blend by where it sits, with the position taking CV so a pair of LFOs can walk it.
MIDI Density -> a new node: how busy the MIDI is, as a control signal. It counts what is passing through and hands you a number, so a part that gets busier can open a filter or push a reverb on its own.
Lookup -> a new node: a numbered list of words. Type one item per line, feed a number, and the matching line comes out as text, which is how a knob picks the filename a Convolver loads. It works both ways: text in comes back out as its number, so a box you type into and a knob you turn stay in step. What comes out of Index is the number actually used, not the one that arrived.
Format Number, Sub Text and Text Case -> three new nodes for building strings. Format Number puts a number in a fixed shape: 1 becomes 01 and 10 stays 10, which is what a minimum width does and what sticking a zero on the front cannot. Sub Text takes a piece out of a string, and a negative Start counts from the end, so one node is left, right and mid. Text Case is UPPER, lower or Title.
A node can show just its editor -> the nodes that carry one, the Piano Roll, the envelopes, the sequencers, the matrices, put it under twenty parameter rows. Ctrl/Cmd + U hides the rows and gives the editor the whole node. The pins do not go with them: they come off the rows and stack down the sides, wrapping into a second column, so nothing disconnects and no cable has to be found again. With the rows gone the names go too, so hovering a pin says what it is.
The Audio Player can pull pitch and speed apart -> it has always read a file the way tape does, and Stretch separates them, so Pitch becomes a real transpose with the timing left alone and Speed changes the timing without moving the pitch. Same stretcher the Clip Track warps its clips with.
Curve lanes on the Piano Roll -> draw a curve under the notes and it comes out as CV, one lane at a time. Every lane has its own output, Emit On Change keeps it quiet until something moves, and Export MIDI drags the pattern out as a file.
Widgets can wear your own images -> a knob takes a base and a cap, so the body stays still while the pointer turns. A fader takes its body as a picture. A Shape holds an image clipped to its own outline, over the fill and under the border, so a transparent PNG is tinted by whatever colour is set. And a front panel takes a background image, set where its background colour already is, with Fill, Fit, Stretch or Tile.
Controls that come back when you let go -> Spring Back returns a knob or a fader to its default when you release it, over a time you set. What a pitch bend does, and what a momentary control needs.
One button that is momentary, latching, or both -> a button can hold while pressed, latch on a click, or do the second only when you hold it long enough.
A crash report says what was running -> it carried the version, the OS and the machine, which left the two questions anybody opens one to answer. It names the build now, Instrument or Effect and whether it is a beta, the format it was loaded as, and the host when there is one. And Settings has a door to the reports folder, so you can find one an hour later instead of only in the window that appeared after the crash.
Help pages for the newest nodes -> Lookup, the three text tools and Spectral Paint open as a working patch. Format Number's asks you to turn its knob past 9 and watch what does not happen, which says what a minimum width is better than the sentence explaining it.
IMPROVED
The Sampler gets ping-pong looping and a Width control -> the loop can run back and forth instead of only forward, and the stereo image widens without a separate node.
The Audio Player has a volume -> in decibels. It never had one, which meant a Gain node beside every player that needed turning down. Minus sixty is silence rather than a very quiet sound. It applies to the audio and only to the audio: the Phase output is a clock, and turning a clock down is not turning anything down.
The Clip Track's launcher goes on the front panel -> it is a performance instrument, and pressing its rows meant finding the node in the graph first. Drop it on a panel with its own position and size, and the clock and the clip colours come with it. The i opens on empty rows too, because half of what that panel holds belongs to the slot rather than the clip in it, and each clip decides what pressing it again means.
The Piano Roll: Alt draws whichever tool you are holding -> so you can select, then add a note, then select again, without going back to the toolbar. Its rows are grouped by subject, which turns a long list into something you can find things in.
The Parametric EQ draws itself in the band colours -> and each band gets its own font and colour, so a five band EQ reads at a glance instead of being five identical curves.
Recall is a button on the States node -> reloading the state you are already in is how you get back to it after moving a few knobs, and there was no way to ask for it: picking the state already showing did nothing. It sits with Save, Update, Rename, Prev, Next and Delete now. The pin is the same pin and anything wired to it behaves exactly as before.
MIDI Sel is now MIDI Select, and takes up to sixteen inputs -> with an Index that picks between them, so the whole Select family works the same way. The Route Sequencer is now the Data Select for the same reason: it was the only one whose name did not say what it did.
The MIDI Note Splitter goes to sixteen slots -> and its Channel outputs have pins you can reach, which they did not.
The MIDI Note Filter takes its settings from the patch -> Low Note, High Note and Mode had no pins, so the range was something you set and left. All three have one now, and held notes stay safe because a release always follows whatever happened to its press.
The audio Looper knows where to go when the first take ends -> After Rec chooses what happens when the first pass closes, and there is a Speed control and a Length output.
A resizable node can be made as big as you want -> the ceiling is gone. A Piano Roll or a matrix can fill the screen if that is what the work needs.
The XY Pad handle can be a size of its own or a size of the pad -> and an image dropped on the handle arrives at a size you can see, as a percentage of the pad, rather than as a stamp nobody can find.
The front panel grid is drawn over the widgets -> it was behind everything, which made it useless for lining anything up. There is a setting for either.
Clip BPM runs from 0 to 999.9 -> and the Clip Track is lighter out of the box, with a select column that looks like one.
Every parameter on the new nodes has an input pin -> a setting only reachable from the Inspector is a setting a patch cannot reach.
There is a link to the forum inside MNodes -> and the Sampler is filed with the samplers, which is where people went looking for it.
A project full of film strips opens in a fraction of the time -> a heavy project went from a minute to sixteen seconds. Every film strip was decoding its sheet four times while it loaded, and the loading window now says what it is doing instead of showing a bar that could not move.
FIXED
A States node could crash MNodes on the way out, and in a plugin that is the host going down with it -> when a bank has been edited the node saves its user states as it is destroyed, and it did that by reaching for the manager while the manager was already being taken apart. Reported with States nodes inside modules, taking Live down with them.
Closing MNodes could take it down on the way out, if an On Load sat inside a module -> the audio engine holds on to every node it compiled, so a node inside a module can outlive its graph and be destroyed partway through the shutdown, at a point where the thing it was talking to is already gone.
Closing a project while MNodes is talking to the server no longer risks taking the host with it -> a network job still running held on to a manager that was going away.
Opening a project could crash, if something in the old one was still talking -> messages queued by a node could arrive after the node had gone.
Every project load was reading a list that had already been thrown away -> loading a node applies its settings one at a time by walking the list of what it has, and applying a setting can rebuild that same list. It survived because a rebuilt list usually lands on the same memory, which is the worst way for something like this to behave.
Dragging anything at all over a node could stop the app dead -> and the File node, the Recorder and the Pattern File node had the same hole, so those are closed too.
The Reverb was making everything six dB louder, and turning Mix down did not stop it -> with Mix at zero the wet half is silent, exactly as asked, and the dry came out at twice the level it went in at. It also explains the strangest part of the report: the level only came right with Mix at 0.5. Reverb II never had this.
The padlock kept States off a control, but only in the snapshots you took afterwards -> putting a state back never asked about the padlock at all, so every slot saved before you locked it went on writing the value at every recall. It applies to the states already in your projects: nothing needs re-saving.
A recalled combo box changed its value and left the old one on screen -> the selection was always saved and always reached whatever the combo fed, but the control itself was never told, which reads exactly like a selection that never saved.
You could not set the velocity of one note in a chord -> overlapping notes shared a velocity lane, so changing one changed them all. The selection decides now: with nothing selected the whole chord moves, and with one note selected only that one does.
The Clip Track would not launch anything -> and changing a clip's speed while it played put it out of time for good, and its clock strip drew over itself on a narrow node.
Turning an envelope's text size up replaced its letters with dots -> the A, D, S and R are drawn into a box the width of the stage they name, and a font bigger than the box gets an ellipsis: one character out, three characters in. Fixed on all four displays that draw stage letters.
Four tooltip faults, all at once -> a tooltip over the graph appeared nowhere near the pointer and barely moved when the pointer did. One could appear over empty canvas belonging to a widget somewhere else. A widget inside a module showed some other widget's tooltip wherever you pointed, and another showed the module's tooltip instead of its own.
A pin on a UI Only node would not say its name while you were dragging a cable at it -> which is the one moment you need to know where you are about to connect.
A hosted plugin that renames its parameters is believed -> MNodes carried on showing the name the plugin had when it loaded. REBUILD THE WORKER for this one, not just MNodes.
The spectrum analysers drew a picket fence over the spectrum -> bands with no bins in them kept whatever they were born with, which showed as a row of spikes in the bass that no sound put there.
A Shape's border gradient had no Start, and a Line has nothing else -> and a Shape's gradient ignored the shape's own rotation.
A closed Sig Gate was never quite closed -> it let a little through at zero.
Fill By Band did nothing.
Collect All & Export left out the assets of every module nobody had opened -> a bundle looked complete and arrived missing its samples.
A Hub project's picture never changed once you had seen it -> the app cached it by URL, so a new cover art never appeared.
An older MNodes wiped the record of everything you had downloaded from the Hub -> opening a project in an older version overwrote the list, and the UPDATE badge stopped appearing for everything.
Replacing a project's file from Edit told nobody it had happened -> uploading a project mails a confirmation, and editing one to publish a new version sent nothing at all.
A morph still dragged the Recorder back to the start -> the recall path had been fixed and the morph pad had not, and that is the one that writes several times a second.
Dragging the State Morpher pad keeps its X and Y rows honest -> they showed where the puck was before you touched it.
The MIDI output checkboxes in Settings could not be clicked -> and the MIDI Drag Exporter had no body left to drop onto.
A Groove reopened from a saved project keeps the size it was left at.
A selected note in the Piano Roll was hard to see.
Paste lands where you are looking -> not where the thing was copied from.
An alpha of 00 stays at 00 when you open the colour picker again.
Help pages measure their own text -> so a long description is no longer cut off at the bottom of the card.
A phase-synced Looper closes its own recording, which is what it always said it did.
v1.0.8 (2026-08-26) · macOS + Windows
MNodes 1.0.8
NEW
Piano Roll -> a new node: a polyphonic sequencer where a note is a note, with its own position, length, pitch and velocity. Chords, pads and legato lines that no step sequencer can hold. Eight patterns in one node, each with its own length and loop, so a verse and a chorus swap with a knob. Draw with a pencil, select with a crosshair, erase with an eraser, and paint a whole phrase of dynamics in one sweep across the velocity lane. It records what you play, quantised and in key. Put it in a scale and the wrong rows disappear rather than being greyed out. Drop a MIDI file on it, or drag your pattern out into your DAW.
Wavetable Filter -> a new node: an EQ curve that is a wavetable frame, and it moves. Up to 128 frames, a playhead walking between them while the sound plays. That gets you a filter that is alive rather than one that travels between the points you drew. Eight tables built in, and Custom imports any .wav wavetable. Comes in stereo and mono.
Audio Matrix and Audio Matrix Stereo -> new nodes: a patchbay you draw. Up to sixteen inputs by sixteen outputs, drag across the grid to route. Eight setups saved in the node, so a verse routing and a chorus routing swap on a bar line, and every path that changes ramps instead of clicking.
Audio Select and Audio Select Stereo -> new nodes: many inputs down to one, picked by a number. The Morph blends and the Route distributes; this was the missing corner. Index takes CV, so a ramp or a sequencer walks through the sources in time.
MIDI Delay and MIDI Echo -> two new nodes. Delay holds notes back and lets them out later, free, in Hz or synced, and does nothing else to them, which is what you want to line up a part with a slow sampler or a plugin with lookahead. Echo is the same engine with the dials open: repeats and Transpose, which turns an echo into a climbing line rather than the same note four times. Note-offs travel with their note-ons on both, so nothing ever hangs.
MIDI Humanize -> a new node: each note lands a random amount late, so a programmed part stops sitting exactly on the grid. Amount is how loose, Max is how loose it can get, and Amount is the one to automate. It adds no latency it was not asked for.
MIDI Random Velocity -> a new node: a fresh velocity for every note between a Min and a Max. What stops a sequenced part landing at the same weight every time.
MIDI Chance -> a new node: every note gets a roll of the dice, and Chance is the percentage that get through. A sixteenth pattern at 70% plays most of what it was handed and leaves holes where it did not. Seed and Reset make those holes repeatable when you want a hook rather than a texture.
The Plugin Host reaches a plugin's sidechain -> and every other input it has. Raise Input Pairs and the extra pins appear, named after the plugin's own buses, so the pin says Sidechain rather than In 2. Compressors, vocoders and morphing effects can finally be patched properly.
Node Help is a living patch -> Help opens as a working patch with the node in it, wired to sound, for every node in MNodes. Turn its knobs and hear what you are reading about. Where a node has an authored example, you get that instead. It never touches your project: no unsaved star, no undo, gone when you close it.
Your own subgraphs are in the right-click palette -> under User Modules, searchable by name like any node, filed under your own category. Saving one puts it in the list immediately. Finding your own work no longer means opening a different panel.
A send can add its own receive -> right-click an Audio Send and pick Add Audio Receive: it lands beside the node with the name already filled in. Every wire has it, both directions, both scopes. No more typing a name exactly right, hundreds of times in a big patch.
Give a node a colour -> right-click, pick from eight, and its header wears it. Colour a whole selection at once. It saves with the project and survives copy and paste, so a big patch can be read at a glance.
The Hub tells you when something you already have was updated -> a card that used to say OPEN forever now says UPDATE, floats to the top and reads "v1.1 to 1.2" under the name. Clicking it replaces the copy in your library where it already lives, so a project never ends up there twice.
MIDI Note Splitter: a Channel output per slot -> under MPE every note of a chord arrives on its own channel, and that channel carries its pitch bend, pressure and slide. Now you can route the expression back to the voice it belongs to. Off by default.
The Meter has scale marks, and goes to 96 segments -> marks spaced in decibels, so they sit on -6, -12 and -18 and stay there when you change the Floor. And a segment count that can match the Floor, so one segment is one dB and you can read a level by counting.
Widget Text can trim the decimals -> a meter reading -2.6834717 no longer fills the label with all of it. Three maths nodes used to be the way to get -2.68.
IMPROVED
MIDI Velocity takes a velocity -> one row, 1 to 127, and every note that passes leaves with it. It was Scale % and Offset, so the obvious job, make these all play at 90, was a trick you had to be told. WARNING: this is a breaking change. A patch saved with the old node will sound different unless Scale was 0, which is the one case that carries across exactly.
MIDI Delay, Echo and Humanize take CV on their control pins -> they were Data only, so a CV source could not reach them at all. An LFO or a sequencer now drives Cycle, Time, BPM, Repeats, Transpose or Amount directly.
MIDI Echo: Strum and Decay out, a tempo you can see in -> Strum only ever worked for notes landing on the very same sample, so from a keyboard it did nothing. Decay only touched velocity, so on an instrument that ignores velocity there was nothing to hear. Both nodes now have Free, Hz and Sync with their own BPM, laid out like the CV Delay Line, and rows that do not apply are greyed rather than hidden so the panel stops moving under you.
The XY Pad takes your own artwork -> Pad Image for the surface and Handle Image for the puck, PNG, JPG or SVG, both collected into the bundle when you export the preset. Every XY Pad no longer has to look like every other XY Pad.
A Film Strip button or toggle can play its frames -> Animate makes the picture travel the frames between its two ends, so a switch throws and a lamp warms up. The value still changes the instant you click, so nothing is held back.
The Plugin Host asks about inputs before outputs -> Input Pairs sits above Output Pairs now. Signal arrives before it leaves, and every other node is drawn that way round.
The Wavetable Filter is findable -> it answers to eq, animated, morphing, curve, scan, comb, formant, sweep, frames, auto filter, cutoff and resonance.
"Made with MNodes v..." tells the truth or says nothing -> it used to fall back to the version you are RUNNING, which turned "made with" into "opened with". Every project in the Hub claimed to be built with your build.
The Hub asks the server again instead of once per session -> a project published or edited while MNodes is open now turns up without closing and reopening the app.
Rate, Show Info and Get Again are reachable in the Hub's List view -> right-click a row. They used to appear only on very tall rows, so at a normal height the only way in was to switch to Cards.
A crash log now says where in MNodes it crashed -> every frame carries the module and the offset inside it instead of a bare address. A crash somebody posts on the forum can now be read.
Closing the app waits for a hosted plugin to finish letting go -> up to 300 ms, then it goes anyway. A thread still running while the app tears itself down is a crash on quit rather than a tidy exit.
MIDI FX is re-saved with the rest before a release build -> nothing shipped wrong, but a project left out of that step keeps whatever version it was last saved with, and the failure is silent.
FIXED
Closing a set in a DAW could take the DAW down with it -> reported with a Live 12 crash report and three MNodes instances in the set. Work queued for later could run after the instance it belonged to was already gone.
Closing or swapping a big project no longer takes the app with it -> 1.0.7 held the data thread while a project was pulled apart, which stopped the next piece of work starting but not the one already running.
Two copies of the same plugin stop treading on each other -> a plugin runs every instance in one process, and two things were being shared between them that should not have been. Symptoms ranged from a CV wire dipping to zero at random to the plugin scanner's progress window opening over the wrong instance.
Piano Roll: notes that did not sound -> half a pattern could go missing, the same pattern behaved differently from one run to the next, and Reverse or Ping-Pong made it worse.
Piano Roll: a selected note looks selected, and Delete works on the front panel -> holding notes showed almost nothing before, and Delete only worked in the editor.
MNodes tells you when there is a new version -> the check always worked and then did nothing useful with the answer.
Opening a project asks before throwing away unsaved work -> File > New always stopped to ask; File > Open, the browser, a recent on the Home screen and a double-click in Explorer all went straight through.
Saving clears the unsaved-changes star, and it stays cleared -> the last of the routes 1.0.7 was chasing. Taking the thumbnail for the browser was itself marking the project as edited.
A patch that dresses itself no longer counts as you editing it -> a look arriving at an Appearance pin from inside the patch was being marked down as an edit, so a project could ask to be saved before you had touched it.
An install that fails now says why, and where -> "Install failed" was the whole message for five different problems. The usual one is a library folder Windows will not let MNodes write to, and it now says so and names the folder.
Files could not be dropped on most of the Inspector's file rows -> the MIDI File Player, the Audio Player, the Convolver, the Granular and the Pattern File all took a drop on the node and refused it on the row.
The Plugin Host always has a MIDI input -> which plugins got a MIDI pin was decided by what the plugin says about itself, and plenty of them get that wrong.
A hosted plugin with no audio output runs again -> MIDI monitors, analysers and MIDI effects have no output bus by design, and MNodes was refusing to run them at all.
The Granular stops when you let go of the keys -> with Play on, its free-running voice could carry on sounding after the last key was released.
A morph no longer drags the Recorder or the Looper back to the start -> recording a move of the State Morpher puck and playing it back could send the transport home.
The Groove keeps its lane colours and its size -> both came back on the defaults after a save and reopen.
The Groove's Lanes slider can be dragged -> it moved one step per grab and then went dead, so getting from one lane to eight meant typing the number.
A State remembers which modules are shown -> it already remembered widgets, which is how one panel builds alternate pages, and a module was the one thing that would not come along.
A State no longer renames your virtual wires -> recalling a state could rewire a patch into buses that may not even exist, with nothing on the canvas to show for it.
A shape's border keeps its colour on a big panel, and stops shimmering -> a black border on a large Square came out a shifting grey along its straight sides.
Clicking the Wavetable Filter no longer draws on it -> pressing anywhere on the curve wrote a point immediately, so selecting the node changed the sound. Drawing starts when the hand moves.
The Wavetable Filter Mono no longer trips an assertion when it is created.
A Frame drawn around another Frame no longer swallows it -> frames stacked in the order they were created, so a big one drawn around a small one covered it.
A Module's front panel stopped hoarding widgets that no longer exist -> deleting a node inside a Module never removed it from that Module's panel list, so the file grew forever.
A tooltip on the front panel belongs to the thing you are pointing at -> pointing at a button on a Module display could give you the tooltip of something else entirely.
MNodes repaints itself after a display change -> changing resolution, DPI scaling or the graphics mode while MNodes is open could leave the window blank.
Importing a preset bundle can keep both copies -> the import decided by the name inside the bundle rather than the file you picked, so a second version of a patch could only replace the first.
Replacing the file of a Hub project works for everybody -> editing a project on the web and picking a new file always failed with a generic message.
Editing a project on the web says what actually went wrong -> every failure came back as "Could not save changes.", including an upload that was simply too large.
v1.0.7 (2026-08-22) · macOS + Windows
MNodes 1.0.7
NEW
Chord Palette -> a new node: a rack of chords with a number on each one. Send a number to Index and that pad plays, send 0 and nothing does, which turns any old step sequencer into a chord sequencer. Nothing in this node decides WHEN, and that is the point: one chord is one step, and twice as long is the same number twice. A pad is only its notes, typed as names or MIDI numbers, built from a root and a chord type, inverted, or played in on a keyboard that opens right on the rack, so nothing you do by hand fights what generated it. Fill it from one of fourteen progressions and edit any pad, and the picker flips to Custom, because the rack is yours now. Root sends the lowest note of whatever is sounding, for a bass line to follow, and Playing says which pad it is, including one you pressed yourself. Drag a pad out with Shift held and the chord leaves as a MIDI file.
Motif -> a new node: a short phrase that repeats and varies. Random melody sounds like a mistake and a repeated phrase with controlled variation sounds like somebody playing. The phrase is written in scale degrees relative to a root, not in notes, which is the detail everything follows from: wire the Chord Palette's Root into the Motif's Root and the same phrase walks the chord changes by itself, re-pitching as the harmony moves, which is what a bass player does and no absolute-pitch sequence can. Mutate nudges one step by a scale step or two, a slip of the finger rather than a new phrase, while Reverse, Invert and Rotate do what they say, all on a live copy with the written phrase waiting underneath, and Revert brings it home. Mutate every four bars and Revert every sixteen is a melody that drifts and returns. Wire a keyboard into MIDI In and a played note re-pitches it; with Keyboard on, the held keys gate it too.
Groove -> a new node: lanes of rhythm, each with its own length. Set lane 1 to 16, lane 2 to 12 and lane 3 to 7 and they line up again only every so often, so the pattern you hear is longer than any pattern you wrote. Give every lane the same length and it is an ordinary step sequencer again. Euclid spreads N hits as evenly as a lane allows, which is not a novelty: 3 in 8 is the tresillo, 5 in 16 a bossa clave. It writes a pattern rather than being one, so what it gives you is yours to draw over. It draws two ways, and the second is the reason the node has a body: Bars is the sequencer everyone knows, Circle is concentric rings turning at their own divisions, because a polyrhythm is far easier to see turning than written out. Every lane sends a note on MIDI Out and a gate on its own Trig pin, so one groove drives a drum plugin and a rack of envelopes at once. Chance makes a lane breathe, Humanize spreads how hard the hits land, and Delay in percent of a step is what turns a quantised pattern into a feel. Fifteen presets come with it, and the last three are the ones it exists for: Polymeter 16-12-9, Drift 7-5-3 and Tresillo Stack, which no sequencer with one loop length can play.
Sig To RMS Stereo -> a new node. The RMS node reads one channel, so a stereo pair meant two of them kept in step by hand. This takes In L and In R off one shared Window and hands back a level for each, measured separately: averaging the two sides together throws away the only thing the second channel had to say.
The Meter can be stereo, and it has a Level output -> Channels: Merged or Stereo, and Stereo splits the body in two, each half with its own input, bar, peak hold and readout. Level sends the value out in dB, one per lane, so the number on the meter is a number the patch can use, and Meter Mode decides whether that is Peak or RMS. The value under the bar can be sized in pixels too, instead of being locked to whatever it was born at.
The MIDI Looper plays backwards -> Reverse, a switch and a pin, the way the audio Looper has had one. It mirrors the position rather than counting down, so a DAW loop, a jump or a stopped transport land where they belong. It takes CV, so a patch can flip direction mid-bar.
The File node shows what it is holding, and takes a drop -> audio draws its waveform, an image draws itself, and a MIDI file, a preset or a bundle gets the icon for its kind, with the name underneath. A path that no longer resolves says "missing" instead of pretending, which matters most here, because this is the node that hands paths to everything else. The preview is also a drop target, which is the shortest route from a folder to a patch, and the dialog stopped offering audio only.
The Film Strip takes its sheet from a cable, and can be a readout -> it was the only image widget you could not feed from anywhere else. Wire a File node into it and one pick re-skins every strip wired to it, and a Data Wire set to Global carries the path into modules, which is where repointing the same file by hand actually hurts. Mode also gains Display, where the strip stops answering the mouse and only moves when something arrives at In: a meter, a lamp, a needle, an animated logo. Intercepts Clicks decides whether it swallows the click or lets it through.
The MIDI Monitor grew up -> it was a list of the last thirty-two messages and nothing else. It holds five hundred and twelve now, in columns you can run your eye down, coloured by family. Freeze holds it still while the stream carries on, Clear empties it, Channel narrows it to one, and the Show switches decide what gets recorded at all. A strip of sixteen cells along the top, lit by traffic and ignoring every filter, tells you at a glance where the notes are coming from. View adds Latest, which shows only the message arriving right now as big as the node, readable from across a room while you turn a knob. And a note prints its number next to its name, C3 (60), because a controller's manual talks in numbers.
The MIDI File Player says which channels the file uses -> it reads it off the file on load and shows it in a row: "1", or "1, 4, 5", or "1-16". Finding that out used to mean wiring a Channel Filter and a monitor per channel and watching which ones lit up.
Wire tension -> a slider in Settings, under Wires. At 0 the cables hang in the curve MNodes has always drawn, at 100 they run straight from pin to pin. Hovering, hit-testing and the highlight all follow the line you can see, and it is a preference, so it sticks across projects.
Keyboard for the module panel, and for getting in and out -> Ctrl+Alt+M opens and closes the panel of the Module you are inside, in View > Panels next to Alt+E, Alt+I and Alt+P. Enter (enter the selected subgraph or module) and Esc (go back one level) have worked for a long time and appeared in no menu whatsoever, which is a strange way to tell anybody about a shortcut; they are in the Edit menu now. Enter, Ctrl+Alt+M, Esc gets you in, opens the panel and back out without the mouse.
Your own presets say USER -> the library marked what shipped with MNodes as FACTORY and marked nothing else, so your work, your downloads and your bundles arrived as one pile. Both views say USER on the ones that are yours, a little brighter than FACTORY, because in a library of hundreds yours is the one you are hunting for.
A knob or slider showing notes takes a note when you type one -> it said C3, and typing C3 back gave you zero. C3, F#2, Bb4 and 60 all land on the same place now. The one thing a display mode owes you is that you can type back what it shows.
A widget's tooltip can be dressed, and switched off -> colours of its own, per widget, and a switch to say nothing at all. On a finished front panel, a tooltip explaining a control to its own builder is just something in the way.
The Radio Group has a name label -> like the knob, the slider and the combo box already had. Its outline also has a thickness now instead of a hardcoded line.
The Pitch Detector can be dressed -> frame, corner radius and text size join the colours it already had, so it stops being the one display that only takes half a look.
IMPROVED
Several hosted plugins in one patch no longer queue up on the audio thread -> each Plugin Host waited for its worker before the next node could run, so four hosted synths paid four round trips one after the other, every block, and the sum blew the budget at small buffers. They all work at the same time now, and MNodes carries on with the rest of the graph in between.
Automation and modulation from the DAW reach a hosted plugin within one audio block -> a Data value took the long way round, through two message threads and the pipe, and the worker's message thread is the plugin's own editor, so with a heavy editor open it arrived tens to hundreds of milliseconds late. It rides the per-block audio bridge now, the way CV always has.
Saving a patch with several hosted plugins no longer freezes -> the save asked each worker for its plugin's state and waited up to 1.5 seconds, so a busy machine froze MNodes for the sum of them. The worker says when the plugin has actually changed now, so the round trip only happens when something did.
Opening a project with sample-loading nodes no longer eats memory by the gigabyte -> a few Audio Players and Film Strips could climb into gigabytes as a project opened. Loading takes the graph apart and rebuilds it once now, instead of once per node that arrives.
Film Strip: Frame Resolution -> a tall sheet is a lot of pixels, and it is being drawn at 80 of them on a panel. Frame Resolution divides by two, four or eight, and a warning appears when a sheet is big enough to be worth a look. Old projects open at a resolution that fits rather than at full, and say so.
Loading an image from a cable no longer stalls the data thread -> the decode happened wherever the message arrived, so a large sheet froze everything data-driven in the patch while it was read off disk. It is handed to the interface thread now.
A Subgraph can no longer be squeezed shorter than its own ports -> the minimum height was a fixed number, so a container with a dozen ports could be dragged smaller than the pins it had to draw. It counts the ports now, and the default size and the auto-fit use the same measure.
The Meter's Inspector has a Main section, and a new one starts in Zones -> Channels, Meter Mode and Floor dB were under Appearance, which is where you go for colours and sizes, not for what the meter measures. A new meter also starts green, amber, red with a red warning colour, which is what a meter looks like everywhere else.
The library rail behaves -> My Library stays in the rail even when it is empty, so the place you file things into does not disappear on you, and the rail no longer opens with every folder expanded.
FIXED
An oscillator inside a subgraph inside a Poly Module is one oscillator per voice again -> fold a SAW into a subgraph and the sound changed into something people described as "sort of FM weird". All the voices were sharing one oscillator: eight notes, one phase, pushed through eight different frequencies. Every container keeps a store per voice now. Grouping is supposed to be a way of tidying a patch.
A held chord no longer falls apart while you tap a note over it -> a voice stays busy through its release tail, so "busy" and "still wanted" are not the same thing, and when every voice was busy the next note took the oldest. The oldest are the chord notes you have been holding, so each tap killed one of them while a queue of tails sat there untouched.
A node showing a value while values pour in no longer takes the app down with it -> hold a trigger down in a patch turning CV into data and MNodes could die inside the memory allocator, in a node doing nothing more interesting than printing a number. Two threads were sharing one piece of text, and the crash never pointed at the node that caused it.
Closing a big project no longer runs the graph while it is being pulled apart -> load a large project, choose File > New and MNodes could disappear on the spot, while a small one never did. Loading a different project already stopped the data thread; starting a new one did not, so it kept working on a graph being dismantled underneath it.
A hosted plugin no longer gets killed for being alive while another one talks -> with several Plugin Hosts, workers kept being declared dead with the plugin still running, until MNodes gave up with "Plugin keeps crashing". One plugin never did it, two or more did it reliably, and only on the Mac. A big message and the once-a-second heartbeat were corrupting each other in the pipe.
Recalling a State drives the patch, not just the panel -> a recall put the values back into the controls and none of them said so, because a widget only sends its value out when something moves it. The state changed how the panel looked and not what it did. A recall announces itself now, exactly as your hand would.
The unsaved-changes star tells the truth -> save a patch with anything playing and the star came straight back, and open a patch and it was already there. Seven causes. Six were things that are not edits saying they were: walking into a Module, readouts updating, playheads moving, your States being read back on load. The seventh went the other way: redrawing a Multi Envelope by hand had never marked the project at all.
The State Morpher's puck stops going dead -> after a while the pad moved its puck and changed nothing, while Next and Prev still worked. The pad found its States node once and remembered it, and if that one attempt landed while the graph was mid-rebuild it gave up for good. It works the link out on demand now.
Renaming a Sub In or Sub Out from the Inspector actually renames the port -> a port's title is the name its container wears on the outside, and only the rename on the node's own header was telling the host. From the Inspector the module's pin kept its old name.
On Load straight into a States node's Recall now works -> Recall took a number and threw away events, while every other button pin on that node takes one. So the obvious way to have a patch come up in a chosen state did nothing at all and gave no hint why.
The filter curves stop flinching -> move a control that is not the one being driven by CV and the drawn curve jumped to the slider's value for an instant before the modulation pulled it back. Same thing in the Parametric EQ, per band.
The Motif's Revert had nothing left to go back to -> editing a single step committed the whole live phrase as the written one, so one click made the two identical and Revert had nowhere to return to.
The Looper's Reverse pin does what the Reverse checkbox does -> wire a toggle into Reverse and nothing happened, while clicking the checkbox turned the loop around. The pin was simply not on the list of which pins feed which settings.
A take recorded while the Looper is reversed lands where you played it -> recording carried on writing the ordinary way, so a phrase overdubbed on a backwards loop was stored mirrored: you heard it in one place and it came back in another. Recording follows the playhead now.
Turning the Looper's Reverse on mid-loop no longer fires the whole bar at once -> flipping direction moves the playhead to the far side in one block, and everything in between got played at the same instant, with the sounding note left hanging. A change of direction is treated as a jump now.
The Looper's step highlight follows what you are hearing when it plays backwards -> it ran a full step ahead of the sound, because the highlight rounded the same way in both directions and a step fires on entry going forwards and on exit going back.
A button that gets switched off no longer flashes as if you pressed it -> bang the Clock's Stop pin and its Play button lit up, which reads as "the clock just started" at the exact moment it stopped. The panel tells a firing from a state being cleared now.
The Clock's Play stops lighting up when Stop or Pause is what moved -> a Clock sitting stopped has a Play that is already off, so banging Stop said "Play is false" with nothing to compare it against. The panel knows which buttons carry state at all now.
Pressing Play to stop gives you the same flash as pressing it to start -> the Recorder's Play stops playback when pressed while playing, so the press turned the button off and the acknowledgement went with it. A press you made is always a firing.
The Audio Player's Play light goes out when the file ends -> it stayed lit until you pressed Stop. The code meant to put it out asked in a way that setter ignores, so it had never once worked.
Resetting a colour no longer paints it transparent -> an unset colour derives one from the theme, and the reset button wrote the stored default back in, which for those colours is literally "00000000". One press turned a derived colour into real transparency and the node stopped painting it.
An unset colour no longer shows as white -> empty means follow the theme, and the Inspector showed white with a made-up ffffffff in the box, which is neither what the colour is nor what the node draws. The swatch shows what is really being painted now, while saving still carries the empty value.
The colour picker opens on a colour you can see -> it was being seeded from a swatch that is not set, so it opened on full transparency and everything you chose came out invisible. Clearing a colour clears the swatch on the node too now.
A gradient's From and To show the colours they are actually drawn with -> the two rows sat there transparent, which reads as a gradient between two colours that are not there. An unset end is derived from the solid colour above it, To taking it 35% brighter, and now the rows say so.
The gradient editor stops cutting off its last row -> the popup reserved space for all ten rows whether the mode used them or not, so Radial lost the Radius slider off the bottom: the one mode that needs it. It also wears the Inspector's own look now.
The paint rows lost their pencil -> it opened the same editor the swatch beside it already opens, and two controls doing the identical thing only make you wonder what the difference is.
The Multi Envelope shows the fill colours the fill mode actually uses -> Solid offered two gradient pickers that changed nothing, and Linear still offered the solid one. The other three envelopes were taught this in 1.0.6 and this one was missed.
The Inspector keeps up when a setting decides which other settings apply -> it noticed by counting the rows, which catches a switch that hides one and shows two, and misses exactly the case where one goes and another arrives.
A widget's click setting takes hold when you set it -> whether a widget swallows clicks is applied by the front panel, and the panel only worked it out when it changed mode. Toggling it in perform mode appeared to do nothing at all.
A pin whose row is hidden now hides with it -> a pin with no row to sit beside was parked below every visible row, which on the Motif meant four unnamed pins floating over the strip.
The body no longer sits on pins that have no row of their own -> a node's picture started where its controls ended, which is right unless the node has pins belonging to no control. Those are parked below the last row, under the picture.
A node's controls no longer give way to its own display -> when the rows and the picture would not both fit, the picture took its minimum and the rows lost the difference, so the controls ended up crushed against the header.
Append Text and Prepend Text are not cut off any more -> both arrived looking sliced along the bottom with a pin hanging off the edge, because their output had no row and their height cannot grow to make space for one.
The Radio Group's Text output has a row of its own -> the pin worked, but its setting lives in the Inspector, so it sat below the last row, half under the widget, with its name nowhere.
The Widget Toggle's State output has its name back -> a rule that stops a name being painted twice, once from each side, assumed the two sides say the same thing. True where it was written, false here.
A node whose rows get rebuilt no longer swallows the next button press -> the flag saying "this repaint is a resync, do not flash" was not always cleared, so the next real press went unacknowledged.
A menu's section header no longer impersonates an option -> headers were centred and nearly the same size as the options, so they read as one more thing to click. They break every rule the options follow now: tinted band, small type, left aligned, ruled underneath.
A value changing at data rate no longer floods the message queue -> every change posted its own message to the interface, and a patch turning CV into data changes values thousands of times a second, all asking the same row to redraw itself.
A look arriving on the Appearance input is applied where looks belong -> it was being done on the thread that carries values between nodes, writing the very settings the Inspector was reading and the node was painting from.
The envelope's Text Size does something -> the letters under the curve had a size you could drag that would not move: declared, shown, read back, and never written. All three envelopes had the same hole.
The MIDI File Player's File input does something -> the pin has been on the node and in its documentation since it was written, described as setting the path, and nothing ever read it.
The Film Strip has its Tooltip back -> it builds its own list of settings and never got the tooltip row the shared blocks give everything else, so the setting existed with nowhere to write it and no way to see it.
A Radio Group given a new set of items no longer offers the old ones -> the item list travels with a look, and Selected Text, a dropdown of those very items, kept offering the words from before.
The Radio Group's outline is the same weight all the way along -> the segments divide the width between them so their edges land between pixels, and the outline was drawn centred on the edge, half in and half out.
The padlock reaches every setting a Copy Appearance carries -> the item lists of the Radio Group and the combo box travel with a look and could not be protected, because which rows offered a padlock was decided by category rather than by what a paste actually writes.
"Expose to DAW" names survive reloading a Live set -> a second go at this, and this time the reload keeps the names instead of rebuilding them from a graph that has not finished arriving.
v1.0.6 (2026-08-18) · macOS + Windows
MNodes 1.0.6
NEW
Audio Route and Audio Route Stereo -> two new nodes that send one signal down one of several paths, picked by a number. MNodes had the half that gathers, the Morph, and not the half that distributes. Index picks the output and everything else is silent, and Fade ramps the handover so switching a live signal does not click. A Route in front of two effect chains and a Morph behind them, one Index driving both, is a bypass; three chains is an A/B/C. Anyone coming from Reaktor knows these as the Distributor and the Scanner.
The Looper plays backwards -> Reverse is on the node with an input pin beside it, because the interesting thing about playing a loop backwards is doing it while the loop runs. Flipping it does not restart anything: the playhead turns around and walks back the way it came. Overdub follows the playhead, so a take recorded while reversed plays forwards once Reverse goes off, which is what a tape machine does with the reels swapped.
The delays can run far longer than five seconds -> Delay, Stereo Delay and Delay Line all stopped at five, and that was never about the sound: a delay reserves its memory up front, sized for the longest time it will ever be asked for. Max Time, in the Inspector, is that reservation and now you set it, up to sixty seconds. It starts at the five it has always been, so nothing you have made gets heavier, and only the delays you actually set long cost you anything.
Hovering a cable tells you what it connects -> zoomed into a big patch a cable runs off both edges of the screen, and finding out where it goes meant following it by eye or zooming out and losing the detail you were working on. Rest the pointer on one and it says Equal.Result -> Gate.Enabled, drawn in the colour of the signal it carries, so you know whether it is audio, MIDI, data or CV before you have read a word. Turn it off under Settings, Wires.
The envelope nodes can switch their labels off, resize them and change their face -> Envelope, AHD Envelope and Trig Envelope draw the stage letters on the body, and the only thing you could do about them was change the colour. Show Text turns them off, Text Size goes from 6 to 32 pixels, and Font Family is the same dropdown every other widget uses. The default size is exactly what they have always been drawn at, so nothing you have saved changes its look.
The MIDI Note Splitter can hand out each note's velocity too -> it gave you the pitch of every note you were holding and a gate for each, but not how hard it was played, so anything that should open further when you dig in had to get that from somewhere else and hope the two agreed. Turn Velocity on and every slot gains a third output. It is off by default because eight slots with three outputs each is a big node and most patches only want the pitch.
The preset browser has a My Library section, and it knows the folders you made -> the library always walked subfolders, so a preset filed away in one turned up, but the folder itself did not: everything arrived in one flat pile and the structure you built on disk was thrown away as it was read. There is now a row for each folder, indented to show what sits inside what. My Library is a place, not a claim of authorship: it is everything that did not ship with MNodes and did not come from the Hub.
The Plugin Host can take more than a stereo pair -> a hosted instrument that keeps its drums, or its layers, on separate outputs had nowhere to put them. Output Pairs goes up to sixteen and each pair appears on the node as Out 2L and Out 2R, and so on. The plugin still has the last word: ask a stereo plugin for four pairs and you get the one it has. A patch saved before this opens with every cable where it was.
Host Info -> a new node: a patch can ask where it is running. Standalone comes out as a 1 or a 0, which drives a Branch or a Gate directly, and the case it comes from is the clock: run on the internal transport when there is no DAW, follow the host when there is one, in one patch. Build, Host and Version come with it as text, so a patch can say which MNodes it is inside and what your music software is called.
Text Equal -> a new node: are these two the same? Comparing two pieces of text could not be done, and worse, it looked like it could, because the Equal node takes an A and a B. It compares numbers, and text arriving at a numeric input reads as zero, so two different words were two zeros and Equal cheerfully said yes. Match Case relaxes the capitals only; spaces always count, because a text that looks the same and is not is precisely what you are trying to catch.
Show Node CPU has a shortcut -> Ctrl+Alt+C, next door to Show Performance Stats. It is a while-you-work switch, not a setting: you turn the meters on to find the node that is costing you, look, and turn them off again. That was two trips through the View menu for one look. It turns up in Settings, Shortcuts with the rest, so it can be remapped like any other.
IMPROVED
The master limiter shows when it is working -> MNodes has a limiter on its output, on by default, and the only thing on screen about it was an LED saying it was switched on. It could be taking six or eight decibels off and nothing moved, and the meter is after it so it never reads a clip either. Someone measuring MNodes with an analyser found a whole EQ curve sitting several dB low and reasonably concluded the EQ was broken; it was the limiter, doing its job invisibly. A ring now closes around the LED as it takes level off.
Saving a state over one that already exists asks -> typing a name a state already had simply took it, and you ended up with two entries called the same thing and no way to tell them apart. Now the widget asks Replace "X"? right in its own field. This is also how you overwrite a state you are not sitting on, which took four steps before: save under a temporary name, go to the original, delete it, come back, rename.
A bundle downloaded from the Hub is filed with the rest of your downloads -> single presets from the Hub have always landed in Expansions, where downloaded content belongs, but a bundle went to the folder MNodes saves your own work into. New downloads go to Expansions now. Nothing already installed moves: it stays where it is and is still listed as a download rather than as yours.
The Pitch Detector's tuning control is just called Tuning -> point it at a 440 Hz tone and it reads A3, and until now it did so sitting next to a control called Tuning A4, which looks exactly like an off-by-one somebody forgot to fix. Both were right and they are the same note: MNodes counts middle C as C3, as Cubase, Ableton Live and Logic Pro do, while Reaper numbers an octave higher and FL Studio two. The octave number is the part nobody agrees on, so the control no longer claims one.
An exposed plugin parameter sits on one row, its input facing its output -> exposing a parameter puts an input pin on the node to drive it and an output pin to read it back, and the two used to end up nowhere near each other, so a node with seven exposed parameters made you count rows to work out which output belonged to which input. Each one is now a row with the name in the middle and the two pins directly across. The row also shows the parameter's current value, which the node never displayed before.
FIXED
Touching a cable no longer sends a running loop back to its start -> connect or disconnect anything, anywhere in the patch, and a Looper mid-phrase jumped to the top, which made it the one node you could not wire around while it was playing. The Position control was the culprit: while a loop exists it reports the live playhead so the slider follows playback, and a wiring gesture resends every parameter to the audio engine, so the position it was displaying came straight back at it as an order to seek.
The MNodes logo lights up under the mouse -> top left, it opens Settings, Home, About and the switch between Edit and Perform, and it gave no sign of any of that, so it read as a printed badge. Every icon in that bar sits dimmed and brightens when you point at it, and the logo is deliberately kept at full brightness, which leaves it nothing to brighten into. It gets a soft circular halo instead.
A widget with no background of its own still gets a tooltip in its colours -> a tooltip on a front-panel widget is drawn in that widget's colours, which worked by borrowing its face and its text together. A Widget Text has no face, so there was nothing to borrow and it fell all the way back to the MNodes palette on a panel styled nothing like it. It still has ink, and the tooltip now keeps its own box and uses the widget's text colour on it.
A widget's tooltip stays readable whatever you colour the widget -> put a light image on a button and set its text to black, which is exactly what you would do, and the tooltip became black text on the button's own dark face. There but invisible. The widget's text colour is now used only while it can actually be read there, and a contrasting one steps in when it cannot.
A cable that the mouse passes through can still tell you what it is -> a widget set to let clicks through is invisible to the mouse, which also meant it could never show its tooltip. Hovering one names it now, the same as any other.
The Return key still works after clicking a small icon button -> clicking one of the little icon buttons handed it the keyboard, and a button holding the keyboard takes Return for itself. So pinning the Inspector quietly stopped Return from entering a subgraph. These are icons you click, never something you tab to, so they no longer take focus.
A long project description can be read to the end -> the last lines ran underneath the "Made with MNodes" line at the bottom of Project Info, and scrolling stopped before reaching them.
A setting that cannot do anything is no longer offered -> a parameter can say it only applies in certain states, and the Inspector was not listening, so controls that did nothing at all sat there looking live.
A Smooth set to 0 ms no longer freezes MNodes -> feed a Smooth node from an LFO with its Time at exactly 0 and MNodes would lock up, hard enough that people were running it inside a DAW to avoid losing work.
v1.0.5 (2026-08-15) · macOS + Windows
MNodes 1.0.5
NEW
MIDI Note Splitter -> a new node that tracks which notes you are holding and hands them out on numbered slots, sorted by pitch. At one slot it is simply the lowest note being played, which is what a filter, an EQ or a tuner should follow when a chord would otherwise throw it off. Up to eight slots, each with its own Gate, as a note number, V/oct or Hz, and everything it sends is CV.
Stretch -> a new node: time stretching of whatever you feed it, up to a standstill. At 1 you hear the input, at 8 the material takes eight times as long to go past at the same pitch, and Freeze stops writing altogether so you can park on one moment and hold it. Pitch comes free with the method, so a frozen chord can be transposed while it hangs there. Grain and Jitter shape the character, and every control takes CV.
Tape Saturation -> a new node, and not the Tube Saturation with a different label. Drive rounds peaks before it squares them off, Bias brings in the even harmonics that stop it sounding like a clipper, and Head Bump is the low resonance people mean when a mix sounds taped. HF Roll does the real work: the top gets duller the harder you hit it, which is why a hot tape mix sounds warm instead of harsh. Stereo, every control takes CV, and it stacks with Tape Damage.
The Slider and Toggle Sequencers can play a set number of passes and stop -> a recurring ask that could not be built from outside, because the sequencer never published which pass it was on. Infinite is on by default and behaves as before; turn it off and Loops plays that many passes and comes to rest, rewound to the first step. Cycle End fires on every wrap and Done fires once when the count runs out, both CV.
Copy in one MNodes, paste in another -> select some nodes, Ctrl+C, open a different project or instance, click the canvas and Ctrl+V. The selection now also goes onto the system clipboard as text, so it survives whatever is in between: it crosses from the plugin to the standalone, and a chunk of patch can be pasted into a forum post and straight back out of one. Anything living in a file does not travel, so a sampler still goes looking for its sample.
Every keyboard shortcut can be changed, in Settings > Shortcuts -> click Learn, press what you want, done. Taking a key something else was using moves it rather than refusing, and names the command that just went quiet. The mouse is on the same page: you can choose which button pans, and swap the wheel between scroll and zoom.
The inspector can be pinned to a node -> it follows the selection, which is wrong in one case: you are setting a node up against something else, and every click on that something else takes its settings off the screen. Turn the pin on and the panel stays on that node however the selection moves. It lets go by itself if the node is deleted or you step into another graph.
The three delay nodes can carry several signals at once -> Pairs adds up to eight In/Out pairs to Delay Line Mono, the CV Delay Line and the Data Delay, all on one delay setting. On the Data Delay it fixes something: two separate ones are two independent timers, so a note's pitch and its gate could come out a millisecond apart and in either order. On the audio one it means a stereo pair no longer needs two nodes with two Time controls kept equal.
Rename a node with Ctrl+R -> renaming was only on the right-click menu, which is a lot of mouse for something you do while laying a patch out. It is in the Edit menu too, and greys out unless exactly one node is selected.
Wires on Top of Nodes has a shortcut -> Ctrl+Shift+W, in the View menu. It was a checkbox in Settings, which is a round trip through a dialog for something you flip to see a cable and flip straight back. The checkbox stays where it was.
IMPROVED
The font weight control is called the same thing on every widget -> it was Font Weight on some, Text Font on others, Font Style on the Text Input. Four names for one control means filtering the inspector only finds it if you guess right. It is Font Weight everywhere now, and only the labels changed.
The ComboBox's text size is measured in pixels like everything else -> it was the only widget without a Text Size Mode, using a percentage of the box height instead, so 12 pixels meant typing something near 37 and the answer changed every time you resized it. Panels saved before this come back exactly as they were.
FIXED
Reset All in the inspector threw away the node's file, whatever the file was -> the sample on an Audio Player, the impulse response on a Convolver, the picture on an Image widget. A file picker has no default value to write, so Reset wrote the row's file filter as the path and the node dutifully tried to load it. It leaves those rows alone now: a loaded file is content, not a setting.
A node's own trigger button worked once and then stopped -> click Flip on a Toggle and it flips, click it again and nothing happens until you reload. Same on Random, Ramp and CV Trigger Pulse. The 1.0.4 fix that stopped these firing on their own treated a button press as a level, and a button only ever says yes, so it stayed up. Cables still behave the way 1.0.4 made them behave.
A Curve in the middle of a chain came back from a reload driving whatever it feeds to one extreme -> the Curve remembers the last value that arrived at its In, and that memory was never saved, so a reopened patch started from zero. Because its output is CV it takes over the pin, so the destination's own saved setting could not rescue it either. The remembered value is now saved with the node.
Several nodes ignored the CV wired into them -> the MIDI Arpeggiator, the MIDI Looper and both Sequencers, on almost every input they have. Wire the Transport's BPM into the arp and it ran at 120 whatever arrived, and worse, the control went dead too, because a cable takes the pin over. All of them read their CV now.
The LFO's Phase Offset, Min and Max read the wrong cable -> its CV inputs were off by one, so Phase Offset was looking at the Play input's cable, Min at Stop's and Max at Pause's. Play, Stop and Pause were never read as CV at all, so LFO transport driven from a patch did nothing. All of it works now, and the buttons keep working alongside.
A node's Result sat at 0.000 while it was plainly producing a value -> every maths and conversion node did this once it started running as CV, because those rows were only ever written by the data path. The signal was always correct; only the number on the node was wrong, which is the worst way for it to be wrong. It now follows what the node is really sending.
v1.0.4 (2026-08-13) · macOS + Windows
MNodes 1.0.4
NEW
Expand Selected -> compacting a selection had a shortcut and a menu item, expanding one only existed as the other half of a toggle, which cannot help you when some nodes are compact and some are not. Shift+Cmd+K, next to Compact's Cmd+K.
Every build shows every preset, with a Type filter -> MNodes FX used to hide instrument presets and MNodes Instrument hid the effects. Now you see everything, with a Type box at the top to narrow it, opening on the type that suits the build you are in.
Volume and Volume Stereo can be set in decibels -> a gain of 0.35 tells you nothing about how much quieter that is. A new Unit control switches the Gain row between the plain multiplier and dB, from -60 to +12, and the bottom of the scale reads -inf and means it: that position is silence, not -60 dB still going out. Switching converts what is already there, the Gain pin speaks the unit too, and nothing about your existing patches moves.
The Probability node can gate several signals on one roll -> splitting a note across three Probability nodes does not work, because each rolls its own dice and the pitch gets through while the velocity is dropped. A new Pairs setting adds up to eight In/Out pairs that share ONE roll, so values belonging to the same event pass together or are dropped together. Every pair is hybrid and each output follows its own input.
New node: CV To Event -> the missing bridge between the CV side and the data side. Everything that crossed over until now carried a VALUE, sampled on a timer, so a trigger pulse a few samples wide simply fell between two readings and was never seen. This one reads every sample and fires a real Event each time the signal crosses its Threshold, with separate On Rise and On Fall. It is what lets a beat, a gate or the end of an envelope drive a Toggle, a Counter or an Output Select.
MIDI CC Inject can replace instead of add -> the new Replace switch takes the incoming CC of that number out of the stream before writing yours, so your version stands in for it. Without it both travel and the receiver acts on whichever landed last, which is why reshaping a controller never quite worked. Off by default, since the node's usual job is to add a controller that was not there.
The Pitch Detector can be told what A is -> note names and cents were measured against a fixed 440 Hz, so anything recorded at 442, 443 or 415 read as uniformly out of tune however well it was played. Tuning A4 now sets the reference, with its own input. Hz never depended on it and still does not.
Widget Text can be made click-through -> a caption laid over a knob no longer swallows the clicks meant for it. Same Intercepts Clicks switch the Image and the Shape already had. User Editable and Scrollable need the mouse, so either of them keeps the clicks whatever the switch says.
IMPROVED
Heavy patches cost about half the CPU they did -> a pass over the whole engine turned up work being repeated over and over for answers that had not changed, and memory being cleared that nothing was ever going to read. Large instruments now run at roughly half the load, and lighter patches gain along with them. None of it changes the sound: it is the same arithmetic, worked out once instead of on every sample.
Filters holding a steady note stop re-deriving themselves -> the Filter follows its cutoff and resonance at audio rate, which is what makes real FM sweeps possible, and it was redoing that work even when nothing had moved. Held notes are now far cheaper in what is usually the most expensive node of a voice. A sweeping filter is exactly as fast as before, and the sound cannot change.
Bypassing a node now costs less, not more -> a bypassed node used to be the most expensive thing on the canvas, because its DSP kept running and its output was thrown away. Now it really stops.
Editing inside a Poly Module stops jolting the CPU meter -> move one cable inside a sixteen-voice module and the meter jumped, then settled. It no longer does.
The browser cards get bigger, resize smoothly, and show the whole picture -> the size slider goes further, the grid fills the width instead of leaving gutters, and a thumbnail is fitted rather than cropped, so the longest side wins and you see all of it.
FIXED
Release tails no longer get cut short in a Poly Module -> a voice that is done sounding is put to sleep to stop costing anything, and it was being judged done a little too eagerly.
A voice whose only job is feeding data no longer falls asleep on duty -> silence is measured at a voice's audio output, so a voice built to push values rather than make sound read as silent from birth and got switched off, freezing whatever it was driving.
Nodes that wait for a trigger no longer fire once a second on their own -> CV To Data refreshes what it is holding about once a second so anything wired up late still receives a value, and nodes that act the moment something arrives could not tell that refresh from a real message. A Toggle flipped, a Ramp restarted, a Random rolled again, a CV Trigger pulsed, all driven by nothing in the patch. A number reaching a trigger input is now read as a level: it fires as it rises past 0.5 and not again until it has come back down. Events still fire every time, and receiving a zero is not a trigger.
The Toggle Sequencer starts when you tell it to -> in Internal mode a trigger arriving at Play did nothing, so it could only be started by clicking Play on the node. Stop worked over a cable, which is what made it look like the node was ignoring its input.
Output Select counts its outputs from zero -> the Index counts from zero, as an index does, but the outputs were labelled from one, so Index 1 arrived at the pin marked Out 2 and the pin marked Out 1 looked dead. Both were the node working correctly wearing labels that said otherwise. Changing the Index also no longer sends anything: moving a selector is not an event, and sweeping it used to fire every branch it passed over with a stale value.
Compacting a node no longer shuffles its pins -> the compact stack was ordered the way a node declares its pins internally rather than the way you were just looking at them, so a Sig Gate's audio pin jumped from the bottom to the top and dragged its cable across the node.
Copy Appearance carries the shape of a knob, not just its colours -> the track and fill thickness, the centre size, the margin, the angles, the scale and the tick length all stayed behind, so the copy came out visibly different from the original. Those rows were padlocked by default to keep Randomise Appearance from producing unusable knobs, which was the wrong tool for the job. Randomising has its own rule now, so they start unlocked and a paste carries them, and closing a padlock by hand protects a row from everything. Same for the Image's Scale and Alpha and the Pendulum's Corner Radius.
A knob's track and fill thickness say Auto where they mean it -> zero on those two does not mean no thickness, it means work it out from the size of the knob, and what it works out is wider than the thinnest the slider can ask for. Reading 0.0 beside a track fatter than the one at 1.0 looked like the control ran backwards.
Pitch Shift and Pitch Shift Stereo can be found by browsing -> they sat loose in Effects, so they turned up in a search and nowhere in the tree. They now live in Effects/Pitch.
Parameter names survive a DAW preset -> widgets exposed to the DAW came back from a .vstpreset or an Ableton rack as Param 1, Param 2, Param 3 with no value attached, because the mapping was restored before Modules and Subgraphs had rebuilt their inner graphs and anything living inside a container was dropped on the spot. They are now held and retried the moment the nested graphs are ready.
An effect is no longer filed as an instrument -> a project that never stated its type had one guessed from its categories, which only worked when the categories happened to say so, so an effect tagged Ambient came out as an instrument. The type is now worked out from the project itself: one wired to the host's audio input processes what the track feeds it. Applies when saving, when the Hub receives an upload, and to the badge on a card.
The counts beside each library section match what clicking it shows -> a section could advertise a number the click never produced.
The card size slider stopped losing its top end when saved.
A node no longer leaves a gap where a hidden row would be -> some nodes show or hide a parameter row depending on the others, and the space stayed behind.
The LAB shows the tags of the recipe it says it is on.
Menus keep the MNodes look inside a plugin -> the menu under the logo could come up in JUCE's stock grey instead of the theme.
The loading screen says what it is doing instead of sitting at 0%.
A patch full of Film Strip knobs loads, and clones, fast again.
v1.0.3 (2026-08-07) · macOS + Windows
MNodes 1.0.3
NEW
New nodes: Spectral Resonator and Spectral Scale -> the first MNodes effects that work directly on the spectrum, over a thousand bands analysed and rebuilt live. The Resonator makes anything ring through a tuned harmonic series, with one drawable bar per harmonic. The Scale snaps a whole sound to a key, or to the chord you hold on its MIDI input.
New node: Poly Voices -> inside a Poly Module, tells you what the whole module is doing: how many voices are sounding, how many keys are held, and a Bang when the first note arrives and when the last one is released. Ideal for driving one shared envelope from a whole chord.
New node: Output Select -> one value in, up to sixteen outputs, and it travels through whichever one the Index picks. Change the Index and the last value follows it there.
The If gets Pass Through -> instead of emitting your Then/Else values, both outputs pass the compared value itself, so the If becomes a switch that routes the signal down whichever branch the condition selects. It has its own input pin, so a gate or an LFO can flip it.
Every oscillator and synth has an Enable pin -> a disabled generator goes silent AND skips its synthesis, so the CPU cost really goes away instead of being muted. Twelve generators and nine synths, all of them fading in and out without clicks. A bank of selectable oscillators now costs you only the one you are hearing.
The MIDI Scale reports its key -> new Root Out and Scale Out pins send the value whenever it changes, whoever changed it: the inspector, a pin, a preset, or clicking the piano keys on its body.
The MIDI Riff Generator can publish on every change -> the new Auto Emit toggle re-sends the pattern whenever you generate, clear, shift, transpose or edit a step, so a MIDI file export is always one click away.
The State Morpher sends its puck position out -> new X Out and Y Out pins carry the live position, so sliders, displays or maths can ride along with the morph.
IMPROVED
The MIDI Drag Exporter is yours to design -> background and border colours, corner radius, an editable title, toggles to hide the texts, and a background image (PNG, JPG or SVG) with its own fit and opacity. The body now fills its whole slot, so it can be a fully custom drag button on a finished panel.
The XY Pad and the Radio Group choose the weight of their text -> a Text Font row next to Text Size, like every other widget.
The MIDI Chord Detector is filed under MIDI -> browsing the MIDI category finds it now, instead of only the search box.
The MIDI Riff Generator and the Radio Group fill their space to the edge -> no more dead border where clicks did nothing.
FIXED
Fixed a crash when clicking through the waveforms of a synth built inside a Module -> values arriving at a control inside a Module took a route that was not safe to share between threads, and a patch firing several per click walked into it quickly.
Fixed the crashes when deleting a Module, or undoing that delete -> four separate lifetime holes, including the teardown of a deleted module running on the audio thread.
Fixed a large Film Strip lagging the whole interface -> a hundred-frame sheet is now sliced into individual frames once, so painting a knob costs nothing per frame.
Fixed new partials in an Additive ignoring their CV -> adding partials inside a Module and wiring them up now works immediately, without reloading the project.
Fixed the Multi Envelope losing its playback marker in Host transport mode.
Fixed the LFO ignoring CV on BPM, Cycle, Mode, Transport and Waveform -> all five listen now, so an envelope can bend the LFO's tempo and a sequencer can switch its waveform.
Fixed a text message wiping a numeric setting -> across some fifty nodes, a stray text value used to read as 0 and slam a setting to its minimum, the widgets on your panel included.
Fixed a duplicated Module flooding a Widget Text inside it with CV numbers.
Fixed six node bodies drawing their minimum instead of the stored value while a wired pin was still quiet.
Fixed Appearance-pin properties that were offered and never applied, in the Multi Envelope, the Oscilloscope, the Module and the Text widget.
Fixed the left sidebar disagreeing with itself after closing and reopening the plugin window.
Fixed Open Recent doing nothing beyond the tenth entry.
v1.0.2 (2026-08-05) · macOS + Windows
MNodes 1.0.2
NEW
New node: MIDI Chord Detector -> play a chord and it tells you what it is: C, Am7, F#m7b5, C13#11. It goes on the Front Panel like any other display.
New nodes: Integer to Bits and Bits to Integer -> split a whole number into an on/off output per bit, and put them back together. Exact inverses, 8, 16 or 24 bits wide.
Knobs and sliders have a Curve -> bend a control so it spends its travel where the useful part is. The Inspector shows the curve itself, and clicking it opens a bigger one you drag.
The Meter draws as a LED ladder or a single moving dot -> Fill Style offers Solid, Segments and Dot, with the segment count and gap adjustable.
The Meter turns red at the top instead of all at once -> Colour Mode adds Zones, with the warn and clip thresholds set in dB.
The Widget Text scrolls -> keeps the size you set and hands the rest to a scrollbar, so a device can carry its own help page.
MNodes knows which of its three plugins you are running -> the library stops offering projects this build cannot play. Search and Favorites still show everything.
IMPROVED
The Crossover picks its own typeface -> Font Family, Import Font and Font Weight in its Appearance, and Show Slope Text turns the dB/oct readout off.
The Meter puts its value where you want it -> nine positions measured against the whole node, an optional dB suffix, and its own font family and weight.
Clear on the delays takes CV as well as a message -> a gate or trigger empties the line with no converter in between.
Hub cards show the whole artwork -> images scale to fit the card instead of being cropped to it.
FIXED
A knob with a negative Min lands on the value you set -> it used to hold -0.0279999 for -0.028, because the snapping counted steps up from Min in single precision.
A control stepping by less than a thousandth shows its own steps -> the readout stopped at three decimals, so the number sat still while the control moved.
A hosted plugin that cannot run no longer takes the rest of MNodes down with it -> the crash budget never triggered on a big plugin, so it restarted one that could not survive, for ever.
Removing a plugin node no longer freezes the audio -> the worker's farewell was sent from the audio thread, down a pipe with a timeout on it.
Three more ways a hosted plugin could misbehave -> a wedged plugin leaving a worker process behind, a preset browser catching MNodes mid-state-read, and a heavyweight plugin choking the worker once a second.
Changing State on a hosted plugin no longer cuts the note you are holding -> a recall now moves the parameter values underneath the note instead of loading a whole patch.
Moving the morph puck sends what changed, not everything -> the first nudge used to send every parameter at once, switches included.
An edit inside a Poly Module no longer gets thrown away while the voices are idle -> a quiet voice was skipped before it was handed your changes, which left a named Send or Receive mute for good.
Two more things inside a Poly Module -> a sample no longer stops itself when you edit the voice, and editing a nested Subgraph now takes effect.
Dragging a layer in the Layers list drops it where you are pointing -> dragging down landed a slot low. Two more slot bugs went with it.
Bring to Front and Send to Back work on everything you have selected -> they used to move only the widget you right-clicked.
Renaming a wire takes effect straight away -> the sound used to keep going to the old wire until you re-plugged a cable.
Three Crossover faults -> a text message on a frequency input wiped it to 20 Hz, a divider jumped left while its CV pin was quiet, and Label Size ignored the Appearance pin.
States and node displays -> Global States keep working inside a subgraph, and a display no longer goes blind on rebuild or silent inside a Subgraph or Module.
The MIDI Arpeggiator -> Current Step actually sends something, and it no longer stalls at the top of a DAW loop.
Four smaller ones -> a Plugin Host inside a Module or Subgraph would not load a plugin, widgets on a Module's body can be dragged again, deleting a Hub download offers it again, and the MIDI FX plugin no longer calls itself Audio FX.
Confirmation dialogs that never appeared, and still acted on Enter -> nothing on screen, but Enter still confirmed it.
v1.0.1 (2026-08-03) · macOS + Windows
MNodes 1.0.1
NEW
New node: Flanger -> the jet-plane whoosh, the one classic modulation effect MNodes did not have: a very short delay swept by an LFO and fed back into itself, stereo, with every control on a CV input. Manual sets where the sweep starts and decides the character, Depth how far it travels, Rate how fast. Feedback goes both ways, positive sharpens the peaks and negative gives the hollow drainpipe version, soft-clipped so the extremes never run away. Stereo Spread offsets the LFO between the two sides. It is not built on the Chorus engine: a flanger lives below a millisecond of delay, so it has its own delay line read with a 4-point interpolator, which is what keeps a fast sweep from dulling the top end. Forum request!
New node: Pitch Detector -> follows the pitch of a monophonic input and reports it four ways at once, all of them CV: Hz, Note as a MIDI note number with decimals so a slide stays smooth, Gate while a note is tracked, and Confidence. Min Freq and Max Freq bound the search, Threshold sets how loud the input has to be, Glide smooths the movement between notes, and Hold Last Note keeps the last reading through silences instead of dropping to zero. Mode trades latency for range. The body is a tuner and drops onto the Front Panel like any other display. Forum request!
IMPROVED
Clear on the delays -> Delay Line Mono, CV Delay Line, Delay Mono and Delay Stereo all get a Clear control, a button in the Inspector and a pin next to it. It empties whatever the node is still holding, so a runaway feedback stops dead and a minute-long tail is gone now, without touching a single setting. On the audio nodes a short fade runs first so clearing something that is sounding does not click. Forum request!
Size on the Front Panel -> every node that can be dropped on the panel now carries Size Width and Size Height in the Inspector next to Pos X and Pos Y, including the bodies that are not widgets at all and the panel nodes that had no geometry fields whatsoever. The Appearance input takes them too, so a size can be modulated like any other value. Size is locked by default, so randomising a look never resizes anything.
Copy Size / Paste Size -> right-click a widget, Copy Size, then right-click another and Paste Size to give it the same dimensions. With several widgets selected the paste applies to all of them at once, in one undo step, and a size fits any widget, so unlike Paste Appearance it is not restricted to the type it came from. Forum request!
Node search understands what things are called elsewhere -> until now a search only matched a node's own name, so "VCA" found nothing, "echo" found nothing, "ADSR" found nothing. Every node now carries a set of synonyms (the classic hardware name, what other software calls it, the plain English word), so vca reaches Volume and Sig Multiply, echo the Delays, adsr the envelopes, metro the Clock. An exact name match always stays on top.
The Additive goes from eight partials to a hundred -> a new Partials control sets how many the node stacks, and each one you add brings its own level row, its own CV input, its own level output and its own bar in the display. It opens at 8 exactly as before and the first eight keep their pin ids, so saved patches keep their partials and their cables. A partial at zero is skipped by the DSP, so the count costs screen space rather than CPU.
The Karplus-Strong can hold a note, and its Decay reaches a minute -> Decay went from a 12 second ceiling to 60, and a new Sustain control holds the string closer and closer to ringing forever, so the node plays as a drone or works as a resonator. It takes CV like everything else, so a string can ring while a pad is held. Damping now starts at 0 instead of 0.55, so a fresh string rings out with its own tone rather than arriving pre-muted.
Ctrl / Cmd + Up and Down move layers -> with the Layers palette focused, the selected layers step one slot up or down the list, the keyboard version of dragging them. It works on a multi-selection, a locked layer stays put, and a layer inside a group moves within that group rather than jumping out of it. Forum request!
Settings is one click away in the graph -> a Settings button now sits at the bottom of the left icon rail, separated by a hairline from the section icons because it opens a window rather than changing what the panel shows.
Dropping a picture on the graph can make a Film Strip -> the image-drop menu now offers Load As Widget Filmstrip, and it does not stop at creating the node: it reads the strip's layout off the image. Frames are square in almost every film strip, so the long side divided by the short one is the frame count and the long side says whether the strip runs down or across. When that does not come out to a whole number it leaves Frame Count for you to type, with the node already selected. Forum request!
Font Weight on the Button and the Toggle -> their label was drawn in SemiBold and only SemiBold, so a panel built around a lighter or heavier face had one control that refused to match. Light, Regular, Medium, SemiBold and Bold, with SemiBold as the default so nothing you already made moves. Forum request!
Handle Corner Radius on the thumb faders and the Range Slider -> the Corner Radius those widgets already had belongs to the rail and is clamped to half its thickness, so the handle itself was stuck at a fixed roundness. The new control is the handle's own, as a percentage of its short side: 0 is a square, 30 is what it always was, 50 and up is a pill. Forum request!
Label Size on the Crossover -> every readout on its body was locked to 10 pixels of the app font, which is unreadable once the node is scaled up on a front panel. Size is a control now, and the readouts follow the node's own font like every other body. Forum request!
The Transport node puts out the time signature -> two new CV outputs, Time Sig Num and Time Sig Den, alongside BPM, Position, Bar and Beat. They follow the same transport everything else does, host or internal, so a patch can react to a 3/4 or a 7/8 instead of having the numbers typed into every node by hand.
EQ Band Types joins the ComboBox Items Presets -> picking it fills the list with the Parametric EQ's band types, taken from the EQ itself rather than copied, so the labels and their order always match what the EQ expects and the ComboBox can be wired straight into a band's Type.
The File Drop's caption can be changed from an Appearance Changer -> its Label joins the list of appearance properties, so the wording on the drop target can be rewritten live from a patch, the same way the Text widget's text already could. Like the other captions it is locked by default. Forum request!
The Button and the Toggle keep their wording in Appearance -> Label Off, Label On, Tooltip and Font Weight sat in a Text section of their own, out of reach of the Appearance input, so an Appearance Changer could recolour the button but not relabel it. They are Appearance rows now, like every other look on those widgets. Forum request!
The Map node opens at 0..1 in -> In Min was -1, so the most common thing you reach for a Map to do, take a normalised 0..1 and put it somewhere else, needed a value typed in first. Saved patches carry their own values and are untouched. Forum request!
The LFO's Min and Max reach real units -> they were clamped to -10..10, so an LFO could not be pointed straight at anything measured in its own numbers: a filter sweep in Hz, a delay in milliseconds, a detune in cents all needed a Map node to get there. The limits are -20000 to 20000 now, and while dragging, Ctrl (Cmd on Mac) gives you hundredths and Shift tenths so the small end is still reachable by hand. Forum request!
Gain and Gain Stereo are now called Volume and Volume Stereo -> only the name changes: same node, same parameters, same sound. Patches already saved keep working and are renamed on load, searching for "gain" still finds them, and the Gain parameter inside keeps its name since that is what the number is.
The Wavetable's Morph is now called Position Glide -> it never morphed anything by itself, which is exactly what the old name promised: it is the time Position takes to slide to a new value, so turning it with Position sitting still does nothing at all. Only the name changes, and saved patches keep their value and their cables. The reference now documents it, along with Frame Size and Reset, which were missing. Forum request!
FIXED
Beat and Bar triggers land on the sample, not on the buffer -> the Transport node decided whether a beat had gone by once per audio block and fired the pulse at the first sample of that block, so its timing was pegged to the buffer: a few milliseconds of wobble at a small buffer, several times that at the sizes a DAW hands a plugin, which is enough to hear a steady pulse limp. That is also why one person heard it and another could not reproduce it: it is the buffer size, not the platform. Beat and Bar are now found sample by sample, and Bar, Beat and Bar Phase step with them. Forum request!
Internal transport is actually internal inside a DAW -> reading the host's playhead happens on every block whatever the transport is set to, and the last thing that read did was overwrite the internal timeline's own cursor with the host's position. So on Internal, in a plugin, the clock was pinned to the DAW's: frozen whenever the DAW transport was parked. The host position is now only borrowed while the host is the one driving. Forum request!
The Text node shows the number you send it -> wiring a knob into a Text node to read its value worked below 0.5 and then printed an unrelated string instead. MNodes keeps a table of strings that have been given a number, and the Text node was reading any incoming number as an entry in that table before treating it as a number. Numbers are now spelled out as numbers, always. The File and Pattern File nodes had the same lookup and lost it too. Forum request!
A parameter driven by CV now shows its signal instead of controls that do nothing -> while a stream feeds a hybrid input the parameter's own value is not read at all, so its slider, reset, dice and padlock were along for the ride, greyed out but still on screen next to a second line with the little scope. The row is now the name and the scope, on one line, the same height as every other row. Unplug the CV and the controls come straight back. Forum request!
A widget on the Front Panel no longer freezes when the change comes from the graph -> turning a knob in the graph moved the sound but not its copy on the panel, and the copy only caught up if you zoomed the panel in and out. For a widget inside a Subgraph or a Module the panel slot went on mirroring an object that a rebuild had already replaced. The panel now checks a few times a second and re-binds the moment it finds a mismatch. Forum request!
Pos X / Pos Y and Size Width / Size Height now work on every node -> the fields were in the Inspector but on a lot of nodes they read zero and typing into them did nothing: the Compressor, the Oscilloscope, the Meter, the Vocoder, the XY Pad, the sequencers and a couple of dozen more. Position and size live in the front panel layout, and each node had to remember to pass them down. They no longer have to: MNodes resolves those four fields before the node ever sees them, so a node added later cannot get it wrong.
Typing in MNodes no longer loses keys to the host's own shortcuts (Windows) -> naming a preset from Cubase, only a handful of keys made it into the name field and the rest triggered the host's Key Commands. A field focused from code could end up with a blinking caret while the host window still owned the keys. Every field MNodes focuses for you now claims the real keyboard focus first, and clicking a field that already has the caret claims it again.
Dragging a layer in the Layers palette now always drops where you aim -> sometimes a layer would not go beneath another one, or went missing from the list: the middle half of a row meant "put this inside that row", so the layer was filed as a child of the widget under the pointer and folded out of sight with it. Only groups take a drop inside them now; on a widget row the whole height reorders. Forum request!
A very fine Increment no longer turns into a broken zero -> typing something like 0.00001 into a widget's Increment came back as "0", because the field only showed four decimals and then wrote its own text back, so the number you typed silently became a real zero. The field now shows the value with the precision it holds. The mouse wheel also moves at least 1% of the range per notch, so a fine increment no longer makes the widget look unresponsive, and the value still lands on the increment's grid. Forum request!
A Sub In (Data/CV) now follows the cable you plug into it from outside -> sending CV into a Subgraph's Data/CV input did nothing inside, and after pulling the cable out the chain stayed dead. A Subgraph keeps its compiled interior across rebuilds so an oscillator does not restart, and the port change never reached the one place that decides how the interior runs. The interior is now checked against its own ports on every rebuild and recompiled the moment they disagree, in both directions.
Duplicating a Subgraph whose interior runs on CV no longer leaves it asleep -> the copy sat there doing nothing until you dropped a node inside it. Half of this was fixed in 0.9.992 for the audio side; the data and CV side was never rebuilt by the duplicate path. Both halves are rebuilt now, so a duplicate works the moment it appears.
The little CV displays on a node's pins no longer freeze -> each node kept sixteen capture slots handed out first come first served, so on a wide node (the Additive with its partials, or anything past sixteen pins) the rest of the mini displays never moved even though the value was arriving. The capture is now sized to the node, so a small node reserves less memory than before and a wide one gets a slot for every pin.
"Show in Graph" from a Module's front panel now travels to the node -> on a Module Front Panel the widgets live inside the module's own graph, and MNodes had no reliable route to it, so it selected the node without moving the view. It now enters the module, centres on the node and zooms in on it, and the node pulses for a moment when it arrives.
Perform mode gives the divider back where it was -> the height of the bottom area was not remembered, so a divider dragged down to give the graph room came back somewhere else on every round trip. And on a maximised or full-screen window the mode change forced a size, re-centred and nudged the window by a pixel, all of which fight the window manager. When the OS owns the window size, only the layout runs. Forum request!
Tooltips off means off, front panel widgets included -> widget tooltips were exempt from the global setting, so whoever was building the panel had tips popping up over every widget with no way to stop them, with the setting saying off. One switch, everything obeys it. Forum request!
Copy Appearance carries the label's position, and leaves its text alone -> copying a look and not getting the label in the same place gave you a copy that was visibly not the original, so the label's size and offsets travel with the look now. The label's text no longer travels: that is what the control is called, not how it looks, and pasting a look across a panel used to rename everything it touched. Forum request!
The Range Slider draws its name label, its handle image, and lines that land on the value -> the label was neither given room nor painted, the Handle Image parameters existed but the renderer never read them, and with the Line handle shape both markers were pushed out sideways by half a handle width. The hit zones moved with it, so grabbing a line handle now grabs where it looks. Forum request!
The thumb faders reach both ends of their travel -> the rail was drawn edge to edge but the handle can never get closer to either end than its own radius, so the fill stopped short at the top and bottom and the fader looked like it never quite arrived. The rail now spans exactly the distance the handle travels. Forum request!
The Crossover's curve follows CV -> its display read the stored crossover points, so with a CV stream sweeping them the sound moved and the picture sat still. It now reads what the DSP is actually using, curve, dividers and readouts alike. Forum request!
The Crossover's top readouts stop landing on each other -> the slope and the two crossover frequencies each printed where they wanted, so two crossovers close together overlapped, either of them near the slope overlapped that, and at the edges the rounded corner ate half the text. The three are placed together now, anything that will not fit drops to a second line, and the strip is inset from the corner. Forum request!
The Crossover keeps its font and its host exposure through a save -> its save and load only covered its own parameters and never chained to the widget base, so the chosen typeface and the exposed-parameter state were dropped on the way out. Forum request!
Closing MNodes no longer depends on a background scan finishing in time -> one user reported a close that left the process alive and refusing to be killed. It was never reproduced, so this is not a fix presented as one: it is the removal of the mechanism that could produce it. The library scan now walks entry by entry and can be interrupted, the audio device is shut before the rest of the teardown, and the data thread is waited for rather than killed.
MNodes now leaves a trail when a shutdown does not finish -> each phase of the close is written to a file as it happens, and the file is deleted the moment the shutdown completes, so finding one on disk means a shutdown that never ended, with its last line naming the phase it stopped at. The next launch picks it up and files it next to the crash reports. Nothing is written in normal use and there is nothing to enable.
The Save Preset panel no longer builds its form twice -> opening Save As populated the whole dialog two times over, rebuilding the category pills and re-reading the thumbnail from disk. It now populates once, after the panel is on top, and focuses the name field last.
v1.0.0 (2026-07-29) · macOS + Windows
MNodes 1.0.0
IMPROVED
- Adjustable text size on the Stereo Image -> the goniometer gains two new controls: Value Size for the correlation number and Label Size for the L / R / M axis letters. Both were fixed at a small size, which read as an afterthought once the widget was made big on a front panel. The phase bar and the space reserved for the readout now grow with the value, so a large number is never clipped or squeezed against the meter.
FIXED
The Stereo Image, Oscilloscope and Envelope Follower now redraw the moment you restyle them -> changing a colour, a size or a toggle (from the inspector, from the Appearance input, or with the randomize dice) appeared to do nothing until the display moved again. These three only repaint when fresh audio comes in, and they deliberately idle when there is none, so with the input silent (or the scope frozen) they could sit on the old look indefinitely. They now redraw as soon as a setting changes, whether or not signal is going through them.
The Stereo Image's M label no longer goes missing -> the M (mono) letter is drawn just above the scope circle, and on a body wider than it is tall the circle took the full height and pushed the label right out of the widget. The scope now keeps a band free for it at any size, so the letter is always there. The node also opens wider by default: the vectorscope is square, so the old narrow default left it small with empty space above and below it.
Front-panel tooltips now follow the widget's own colours -> a tooltip over a Button (or any other widget) was always drawn in the MNodes accent, which looked like a stray piece of the app on a panel styled any other way. It now takes the widget's own background, text and border colours, its corner radius and its font family, so it reads as part of the panel. Widgets with no solid face colour of their own keep the app default, and tooltips everywhere else in MNodes are unchanged.
The States dropdown now fills its slot exactly -> the box was drawn half a pixel inside its own bounds, leaving a thin gap all around it that read as a second border and made the widget impossible to line up with a Button widget sitting next to it. It now fills the slot edge to edge, like the buttons do. Same fix for the ComboBox widget, which is drawn the same way.
The Text Input's Send button now follows the widget's look -> the button ignored the widget's own appearance and fell back to the app's default button style, so it stayed MNodes blue no matter what Button Colour was set, kept a fixed corner and a fixed font. It is now drawn from the widget's settings: Button Colour, Corner Radius, border and Font Family / Style / Size all apply, and the text size is capped to the button height so a large Text Size still fits. Hover and pressed feedback is derived from the chosen colour, so it works on any face.
v0.9.997 (2026-07-24) · macOS + Windows
MNodes 0.9.997 (Early Access)
IMPROVED
Cleaner high notes from the basic oscillators -> the Saw, Square and Pulse oscillators are now band-limited, so they stay smooth and clean in the top octaves instead of picking up that gritty, metallic edge on high notes. The Supersaw / Unison already worked this way; Sine and Triangle are naturally clean and are unchanged. Forum request!
Node type shown under a renamed title -> in a node's inspector, renaming it now shows the original type name just below the title, smaller and dimmer, so you can always tell what kind of node it is even after you rename it.
Lock the State Morpher's state points -> the State Morpher gets a Lock Positions toggle. Turn it on and the state points on the pad can no longer be dragged, so you can't nudge them out of place by accident while performing; the puck still moves freely. It's a pure-data control with its own pin, so you can wire or automate it too.
Smoother State Morpher puck dragging -> dragging the morph puck with the mouse could feel heavy in larger patches, because it re-applied the blend on every mouse event (well over a hundred times a second). It now applies at frame rate, the same way CV-driven morphing already did, so dragging stays fluid while still morphing continuously in real time.
More styling on the Stereo Image -> the goniometer body gains a separate Line Colour for the phase-meter centre line (independent of the text), an adjustable Corner Radius, and the correlation value now sits in its own space on the right, so it is never hidden under the fill or crossed by the centre line.
Scan just your new plugins, or rescan everything -> the Plugin Folders settings now has two buttons. Scan New Plugins only checks plugins that aren't in your list yet, so adding a single new plugin no longer re-scans your whole library. Rescan All clears the list and checks everything again, which is what you want after replacing or updating a plugin in place. Forum request!
Preset Browser visual refresh -> the browser now reads as one clean, unified surface: the rail, grid and padding all share a single lifted tone, so there are no seams at the edges. The featured banner is redesigned too, with its artwork shown at full height and fitted to its frame (instead of a square crop), a soft branded glow behind it, and a thin edge in place of the old heavy triple frame; the scrollbars and card outlines are tuned to match. Purely cosmetic.
Instant state recall with hosted plugins -> recalling a States snapshot used to fully reload any plugin sitting in a Plugin Host: a brief audio gap, a "Loading..." flash, and the plugin's editor window closing. When the snapshot belongs to the plugin that is already loaded, MNodes now hands the saved settings straight to the running plugin, so switching states is instant, seamless, and the editor stays open.
The State Morpher now morphs hosted plugins -> every parameter of a plugin sitting in a Plugin Host now blends between states in real time, right alongside your native MNodes controls; you can watch them glide in the plugin's own editor. Switch-style parameters (filter types, waveform selectors) are never blended halfway: they snap cleanly to the nearest state. A plugin's full internal state can't be blended (it's an opaque block only the plugin understands), so the morph covers the parameters; a plain state recall still restores everything.
Lock plugin parameters against States -> every row in the Plugin Host's parameter list gets a padlock, just like native node parameters. Lock one and the States system leaves it alone: it isn't captured into new states, the State Morpher never moves it, and recalling a state keeps it right where you left it. The control itself stays fully usable.
FIXED
State Morpher stops fighting its own control -> when a Slider (or any widget) is wired to the State Morpher's X / Y to drive the puck, morphing no longer writes that control back to its saved value, which used to make the slider and puck jump and fight each other. The controller is now left alone. Forum request!
States prompt buttons follow the widget colour -> the OK / Yes / No buttons in the States save / rename / delete prompts were stuck on the MNodes accent instead of the widget's own colour; they now match the rest of the box.
Pitch bend in the Poly Module -> two pitch-bend glitches in polyphonic patches are fixed. Notes could stay stuck transposed up after a voice was reused, and a freshly loaded patch could play an octave flat until you touched the pitch wheel. The Poly Module now starts every voice from a correct, centred pitch bend and resets it properly when voices are reused. Forum request!
Toggle button top-edge line -> an active (ON) toggle could show a faint light line along its top edge, very visible on all-black faces, caused by a subtle gradient. The ON face is now flat like the OFF face; the gradient is kept for the hover state only.
Plugin Host no longer crashes with some GPU-based plugin editors on macOS -> a few plugins whose editors are drawn on the GPU (Metal), such as some Arturia titles, could raise a system error as their editor window opened or closed and take the external plugin-host process down with it. That error is now contained, so the plugin and its editor keep working. Forum request!
Scan and download popups now show over the Settings window -> the plugin-scan and factory-content progress popups (and any warning raised from Settings) were drawing behind the always-on-top Settings window, so they were easy to miss. They now appear on top of Settings while it is open.
Frozen values inside a Subgraph or Module -> connecting an audio cable inside a container could freeze the data and CV readouts on the nodes in there (the numbers stopped changing) even though the audio itself kept working. They keep updating live now, with no need to unplug and replug a cable to wake them back up. Forum request!
A node's CV mini-scope could lock up the app -> the small live CV scope shown on a node could freeze the whole interface if a non-finite value (a NaN or an infinity) reached it. It now guards its input, so a bad reading shows as "--" instead of wedging the display.
The app could refuse to close with unsaved changes -> closing the standalone with unsaved edits could leave the "save changes?" prompt hidden (it had been parked on the Settings window), so clicking the close button did nothing and the app never quit. The prompt is now always brought onto the main window, so closing works every time.
v0.9.996 (2026-07-21) · macOS + Windows
MNodes 0.9.996 (Early Access)
NEW
- New node: Soft Clipper -> a new distortion that rounds off peaks instead of flat-topping them like the hard Clip, for warm, musical saturation. Threshold sets the ceiling the signal eases up to, Knee morphs the shape from a hard corner (same as Clip) all the way to a smooth curve, and Mix blends dry and clipped. It draws its own transfer curve live and drops onto the Front Panel like the Waveshaper, fully themeable; Threshold, Knee and Mix all take CV. Ships in mono and stereo. Forum request!
IMPROVED
Wires renamed to Send / Receive -> the virtual-wire nodes were called "Wire In" and "Wire Out", which read backwards (the "In" was actually the sender you feed a cable into). They now use the familiar send / receive naming across Audio, CV and Data, with matching Sub versions for subgraphs. Only the names changed, so every existing patch keeps working and wires connect exactly as before.
Text widget corner radius -> the Text widget now exposes Corner Radius (plus a Corner Mode: pixels, % width or % height) in the inspector and to the Appearance Changer, like the other widgets; it defaults to the same look as before. Forum request!
States hover state -> the States widget now tints its face when you hover it, like the buttons and toggles, with a new Hover Colour appearance option to set that tint.
Lighter plugin hosting on older macOS -> on macOS 13 and earlier the out-of-process plugin worker used to busy-wait and inflate the reported CPU (around 10% on a 512-sample block); it now sleeps at zero CPU between blocks and wakes the instant one is ready. macOS 14.4 and newer already ran this way.
FIXED
States no longer wipe loaded samples -> recalling a State, or loading a preset, captured while an Audio Player was empty could clear a sample you had since loaded into it. States now leave a loaded sample alone (they can still switch it to a different one), never emptying it. Also fixes the Convolver's IR and the MIDI File Player, and repairs affected patches on load, no re-saving needed.
Panel node "Visible" toggle -> the Waveshaper and Soft Clipper are shown on the Front Panel by default, but their inspector Visible checkbox read as off. It now matches what you see, and still shows or hides the widget when you toggle it.
Big presets load without freezing -> opening a large preset used to show an empty dark box and lock the interface, as if the app had hung. The loading popup now shows a title and a live progress bar, and the heavy reading and parsing runs in the background so the interface stays responsive.
CV connections survive copy and grouping -> copying, duplicating or grouping a selection (or undoing a delete) could drop CV wires, such as those into a CV Pass. They are now rebuilt exactly as they were.
Wiring works deep inside huge patches -> in very large patches, especially several levels down inside Subgraphs and Modules, a new cable could silently refuse to connect, even between two fresh nodes. The internal pin identifier ran out of room once a patch held enough nodes; it is now wide enough for any size, so wiring and re-pointing cables work no matter how large or nested the patch is.
Grab a selected wire bundle at its pin -> re-pointing a whole fan-out at another node could not even start, because the pin's reserved "pull a new cable" zone swallowed the grab. Selected wires now win that zone, so you can grab them anywhere including right at the pin; pulling fresh cables out of an unselected pin is unchanged.
Curve and Waveshaper tooltips -> clearing the Tooltip field on these two widgets now really means no tooltip, instead of falling back to a built-in help string like they used to.
States widget double border -> its dropdown sat a few pixels inside the panel frame, showing two outlines; it now fills its slot cleanly with a single border.
States save / rename box -> the little name box that appears when you save or rename a state now takes the dropdown's own background, text and border colours, so it looks like you are editing the dropdown itself.
Deleting a State asks first -> Delete used to remove the current state the instant it fired; it now shows an inline "Delete?" warning with a Yes / No choice, so a mis-click or a stray trigger can't wipe a state by accident. Both the inspector button and a wired Delete pin go through it.
State Morpher puck -> when the puck sat exactly on a state point you could not drag it back out, because the point stole the click. The puck now draws on top and is always the first thing you grab.
Knob label fade -> the Knob's label and outside value text were drawn twice and stayed more opaque than their set alpha, so fading the widget from a Colour node darkened them out of step with the knob. They now fade in step.
Meter Visible in the inspector -> the Meter offered a Visible option to the Appearance Changer but not in its own inspector list; the toggle now appears in both.
No clicks or startup buzz -> loading a project, switching the audio device or reactivating the plugin could let a click, a DC pop or a burst of noise through before the graph had settled. The output now eases up from silence every time audio (re)starts, and a rebuild path that used to swap the running graph without a fade now fades too.
macOS crash reports include a stack trace -> the crash handler only captured a stack on Windows; macOS (and Linux) crashes now capture a backtrace too, so a report points at where it happened.
GPU plugin editors no longer crash the host (macOS) -> grabbing the thumbnail of a hosted plugin with a Metal/GPU-backed editor (some Arturia plugins) could throw deep inside macOS and take the plugin worker down; that capture is now contained, so a thumbnail it can't grab simply comes back blank.
v0.9.995 (2026-07-20) · macOS + Windows
MNodes 0.9.995 (Early Access)
NEW
- New node: Level Splitter -> splits a signal into three streams by how LOUD it is at each moment, not by frequency: Low gets the quiet parts, Mid the body, High the peaks. The three always add back up to the exact input, so you can treat each level range on its own (saturate only the peaks, gate the quiet floor, reverb just the body) and mix them back with no phase artefacts. Low and High set the thresholds in dB, Width softens the hand-offs, Response sets how fast it reacts, and the body draws the input level with both threshold lines. Forum request!
IMPROVED
The preset browser opens inside the window now -> instead of a floating popup that closed itself on every little change and hid under alert dialogs, the browser opens as a panel in the main window, filling the work area while the header and the left explorers stay visible and usable. Pick a preset, click the X, or press Escape to close. On a small window it goes compact (drops the side rail and the size slider, shrinks the Hub banner) so the list itself keeps the room.
The preset name is now a wider toggle -> the Previous/Next arrows are gone and the name fills the whole chip, so long preset names finally have room. Click it to open the browser, click again to close, and it lights up while the browser is open so you can see it is active.
FIXED
Crash when generating instruments from the LAB -> generating an instrument could crash right at the very end. Containers now clean up after themselves the instant they are destroyed, which closes the window for the LAB and for any delete or undo involving subgraphs, modules and poly modules.
States can no longer wipe your samples through the selector -> a state saved before your samples went in could empty an Audio Player, every pad of a Sample Map, a Convolver or a MIDI File Player the moment you picked it in the States dropdown. An empty state now leaves whatever is loaded alone; states that deliberately switch samples still work. "This Level" states also stop rebuilding a module's insides on recall. Thanks for the follow-up report!
Grouping named wires no longer renames them -> selecting Audio/CV/Data Wire nodes and grouping them into a subgraph or module turned every wire name into a number ("test 2" became "3"). They keep the names you typed now.
Big whole numbers no longer turn into "1e+08" -> typing 99999999 into an Int node showed scientific notation instead of the number. Every whole-number display prints the exact value now, and typing past the integer limit lands on the nearest valid value instead of flipping negative.
Renaming a Subgraph or Module to a name already in use -> the block used to pop "replace it?" with Yes/No and then ignore both answers. It now simply tells you the name is taken (subgraph and module names must be unique, because module presets find their module by name). Forum question!
v0.9.994 (2026-07-19) · macOS + Windows
MNodes 0.9.994 (Early Access)
NEW
MIDI Arpeggiator Enable-> switch the arp off and it stops sending notes (ending the sounding one cleanly) while still tracking the keys you hold; switch it back on and the pattern resumes right where your hands are. It has its own input pin, so a Toggle or any gate can punch the arp in and out. Forum request!
Your States survive patch updates-> states you save on a Hub patch used to vanish when the patch was updated or reinstalled. They are now kept separately per patch and come back on their own after an update, keeping their names and morph pad spots. Shared patches still carry everything in one file.
IMPROVED
Middle C is written C3 everywhere-> one convention across the whole app: MIDI note 60 is C3. A few displays (keyboard, MIDI monitor, sample map, Note-mode labels) were off by an octave against the rest; they all agree now.
Crash reports that survive anything-> memory-corruption crashes could take the crash reporter down with them and leave a useless log. There is now a fallback path that always gets the real stack written, and reports name unrecognised hosts ("Unknown (BespokeSynth)").
Welcome Darc Sector and OctaFuzz-> both join the beta testers credits, well earned this very version: the freeze fix below comes straight from Darc Sector's repro patch. Thank you!
FIXED
Moving many wires at once no longer freezes the app-> reconnecting a whole selection of wires inside a big module could lock the interface for minutes, because every wire paid the full rebuild cost on its own. The gesture is now one grouped edit and the view only rebuilds what changed. (Thanks Darc Sector!)
Crash when editing while data was flowing-> rewiring or regrouping at the exact moment the data engine was mid-cycle could crash the plugin. The rebuild now waits its turn; editing during playback is safe.
Plugin Host passes the DAW's transport-> plugins loaded inside Plugin Host now see the DAW's own playhead (tempo, position, play/stop), so host-synced guests finally follow your session. In standalone they follow MNodes' internal clock.
Automating an exposed Toggle or XY Pad drives the patch-> host automation used to move the control on screen without reaching its pins. It now acts exactly like clicking or dragging the widget.
States can no longer unload your samples-> a state saved while an Audio Player was empty could silently empty every player it covered on recall or morph. A state with no file in it now leaves whatever is loaded alone, for every file-based node.
v0.9.993 (2026-07-17) · macOS + Windows
MNodes 0.9.993 (Early Access)
NEW
Signal level toolkit-> four new Sig nodes for working with levels: Sig To RMS reads a signal's loudness over an adjustable window, Sig To dB and Sig From dB convert between linear level and decibels, and Sig Subtract gives the difference of two signals in one node. Chain them to compare the level before and after any processing and drive a Gain from the result - an automatic gain compensator, a ducker or the detection side of a dynamic EQ, all patchable in a few nodes.
Typed-input checks-> Is Number, Is Hex and Is Note validate what a user types before it reaches your controls: each outputs a Valid flag plus the parsed value - the number (negatives and decimals welcome), the cleaned hex colour ready for the Colour node, or the MIDI note from a name like C3 or A#4. The value only fires when the input really is valid, so a control keeps its last good value on a typo. Perfect after a Text Input widget.
To Number-> numeric text becomes an actual number: "3.14" comes out as 3.14, "-5" as -5, and "1,5" with a decimal comma works too. Numbers pass straight through and non-numeric text simply emits nothing, so the control it feeds keeps its last good value. Drop it after a Text Input widget and typed values drive knobs and sliders directly - without it, a numeric string landing on a numeric input reads as 0.
IMPROVED
MIDI Looper-> Stop now rewinds to the top like a classic looper and a new Pause holds the position instead; arming Record starts the clock, so a take no longer piles into the first step when the looper was stopped; and a new Auto Length switch lets your first recording define the loop's length - keep playing and it keeps growing, then Stop, Pause or disarming Record locks it in. The captured length is saved with the take.
Data Wires without limits-> Data Wire In / Out (and the Sub Data Wires) match purely by the name you type, and there is no longer any cap on how many different wire names a project can have - use as many wireless connections as your patch wants.
FIXED
Data/CV subgraph ports-> a Sub Out (Data/CV) could get stamped as CV when grouping plain data cables into a subgraph, and once stuck it stayed CV forever - it accepted data in but would not send it on, and only deleting the port and making a new one helped. Ports now follow what their source actually sends, in both directions and immediately: connect a CV source and the port turns CV on the spot, disconnect it and it falls back to data - and the pins repaint right away (before, a pin could keep its CV colour until you left and re-entered the subgraph). Patches saved with a stuck port repair themselves on load.
DAW automation override-> playing an automation clip on an exposed MNodes parameter could make the plugin echo the host's own values back at it, which some DAWs (Bitwig's green arrow) read as you grabbing the control and suspended the lane at random moments. Parameter reporting is now settled and checked against the host's stream, so automation lanes play clean - and recording automation by moving MNodes' own controls still works as before.
Expose to DAW on presets-> a widget with Expose to DAW ticked lost its DAW parameter when the patch was reloaded as a preset: the checkbox stayed ticked but the host kept showing a dead "Param N" - which is how a LAB synth's Cutoff went missing. Loading a preset now re-derives the DAW parameters from the widgets, and re-ticking the checkbox is reliable on every session.
State Morpher-> driving the pad's X or Y from a dense stream of values (a touchscreen XY pad over MIDI, for example) made the on-screen faders flicker and could crash the app; incoming values are now applied safely, so a busy stream morphs smoothly. And morphing now drives everything the moved widgets feed - a knob wired through to a MIDI CC keeps emitting while you morph, exactly as it does when you turn it by hand.
Data Wires across subgraphs-> a message travelling a long chain of Data Wires through several subgraphs (or around a feedback loop) could silently stop partway - with ten identical wires, eight passed and two never did. An internal safety limit was set far too low; the whole chain now gets through.
Preset browser-> you can drag a preset card onto a collection in the left rail; before, that only worked in the List view.
v0.9.992 (2026-07-14) · macOS + Windows
MNodes 0.9.992 (Early Access)
NEW
New State Morpher node-> an XY pad that blends a States node's saved states instead of only jumping between them; wire it to the States node's Morph output and each state becomes a point on the pad, drag the puck and the nearest states win. Move each state's point, right-click to leave one out of the blend, automate the puck's X/Y from your DAW or drive it with CV, theme it fully, and drop it on the Front Panel.
Compact mode-> collapse any node (or a whole selection) to a small cube with just its name and the pins packed down the sides, to tidy a busy patch; right-click Compact Node, press Ctrl/Cmd+K, or use View > Compact All / Expand All. Cables follow the pins, it saves with the project and is undoable.
Sticky fan-out wiring-> hold Alt while you drop a wire and the cable stays hooked to the source pin, so you can click input after input to send one output to many destinations without grabbing the source again. Release Alt to finish.
IMPROVED
Oscilloscope and CV Scope-> overlay up to four signals at once, each trace in its own colour, with a new Wave Alpha for transparency and per-trace, background, grid and frame colours; the Oscilloscope's Time/div now reaches 1000 ms and its traces fill the full width.
Plugin Host on the Front Panel-> add it to the panel and pick or replace its plugin, or open the plugin's own window, straight from Perform mode; fully themeable, with a Visible toggle like the other widgets.
Preset browser and Hub as cards-> browse everything as a grid of cover-art cards with a Cards / List toggle and a size slider; Hub cards show price or FREE, star rating and downloads next to a Get or Open button, plus info, rate and re-download icons. Your view and card size are remembered.
Perform is now truly full screen-> the front panel fills the whole window edge to edge; the menu bar hides and slides in over the panel when you hover the top-left MNodes logo, taking on your panel's own background colour, and now carries Home and Open too.
Auto Layout rebuilt-> packs nodes into tight columns along the signal flow, threads long cables through routing lanes, reduces crossings and straightens them toward horizontal; Frames are packed and wrapped as a block. Far cleaner on big patches, and undoable.
AllPass Filter-> Delay now modulates smoothly and click-free (fractional interpolation, great for phasers and lush chorused all-pass tails), and its range reaches 999.99 ms.
Much faster editing on huge patches-> connecting or disconnecting a cable and duplicating a big selection no longer freeze for seconds, or crash, in large projects with many nested subgraphs; small and medium patches behave exactly as before.
Preset loading feedback-> loading a preset now shows a "Loading..." overlay right inside the browser instead of the panel appearing to freeze.
FIXED
States remember which controls are shown-> a snapshot now captures each widget's visibility by default, so a Radio Group tabs layout comes back exactly as you saved it; close a widget's Visible padlock to leave it out.
Duplicated Subgraphs come up live-> duplicating or pasting a Subgraph with CV and audio wired inside no longer leaves its interior asleep until you drop a node in to wake it.
CV Scale: Root and Scale inputs are hybrid again-> drive them from a Data value, a CV stream or the inline picker, just like the pitch nodes.
Multi Envelope-> with grid snap on, clicking to add a point no longer stacks a duplicate or shifts its neighbours.
Route Sequencer-> an input's on-screen slider now updates as a value arrives on its pin, instead of showing the old number until you dragged it.
States save widget values again-> Knob, Slider, Film Strip and other widget positions travel inside a snapshot again (re-save any States you made in 0.9.991 to capture them).
MIDI Looper-> the active Slot stays correct when you rewire the patch, so recording, playback and the piano-roll all follow the slot you selected.
v0.9.991 (2026-07-08) · macOS + Windows
MNodes 0.9.991 (Early Access)
NEW
New Convolver node-> convolution / IR loader for guitar cabs, amp sims and reverb impulses; Dry/Wet, Output Gain and Normalize, plus Reverse, IR Size, Predelay and Tone, with a Zero-Latency or Low-CPU engine and a customizable waveform body for the Front Panel.
New Transient Splitter node-> splits a signal into Transient and Body streams that sum back to the exact input; process punch and sustain separately with Sensitivity, Recovery and Contrast, then recombine with no phase loss.
New MIDI Looper node-> polyphonic step recorder that loops your playing in sync with the DAW; 8 slots, chords, off-grid notes and Overdub, shown as a live piano-roll, resizable and Front Panel ready.
New MIDI Convert node-> turns one MIDI message type into another (note, CC, pitch bend, pressure, program) carrying the value across, with Keep Original and Pass Through.
New BPM To Hz and Hz To BPM nodes-> convert a tempo into a frequency at any rate and back, to tempo-sync anything that only takes Hz; hybrid pins, CV output.
IMPROVED
Multi Envelope-> sync to tempo and lock to the DAW: a new Transport with Free (Hz), Internal (BPM x Cycle) and Host time sources, each with an input pin.
Multi Envelope-> paint patterns onto the grid: a brush palette (Ramp, Exp, Log, Step, Saw, inverted Saw, Tri) draws one cell at a time, mouse height sets each cell.
Multi Envelope-> Random fills the grid per cell: the Random button paints each cell with a random-height version of the selected brush.
Multi Envelope-> gradient fill under the curve: a Fill Mode (Solid, Linear, Radial) with Fill From and Fill To colours.
Multi Envelope-> hide the preset bar so the curve fills the whole body.
LFO-> full transport: Play, Pause, Stop and Retrigger, as buttons and pins, in the internally-clocked modes.
Envelope-> a Retrigger input: re-fires the attack on every new note while the Gate keeps holding, for clean legato.
Widget Button and Toggle-> fuller styling: Active Hover Colour, Font Family and Import Font, and larger scalable Text Size.
FIXED
Big patches use far less memory-> inspector scopes allocate only for inspected pin, and widget images are shared by file.
The Lab flags the project as modified after generating, so Save is enabled straight away.
Locking a parameter reliably keeps it out of a State, including inspector-only settings and Visible.
Beat Repeat keeps capturing when the DAW loops back, mono and stereo.
CV modulation shows its live scope on controls inside Subgraphs and Modules.
Exposed Module controls keep their real name in the DAW.
Crossfade and Morph-> the position marker follows CV.
Multi Envelope-> dragging a point behaves when its neighbours are very close.
Envelope bodies stay truly transparent on a panel, alpha included.
v0.9.99 (2026-07-06) · macOS + Windows
MNodes 0.9.99 (Early Access)
NEW
New Dynamic Shaper node (mono and stereo)-> a compressor, expander and gate in one, driven by a transfer curve you draw; bend it to compress, limit, expand, gate or lift quiet parts, with Peak/RMS detection and a sidechain.
New Beat Repeat node (mono and stereo)-> a slice repeater (Interval, Chance, Grid, Gate) with per-repeat Pitch, Reverse, Ratchet and a repeats-only filter; Mix/Insert/Gate modes and Active/Step outputs.
New Frequency Shifter node (mono and stereo)-> shift every partial by a fixed number of Hz for phasing, rotary detune or clangorous, robotic tones; adds Spread on the stereo version.
New Crossfade node (mono and stereo)-> a DJ-style fader between two inputs with Equal Power / Constant Power / Linear laws and a Contour shape.
New Morph node (mono and stereo)-> scan smoothly across 2 to 16 inputs, equal-power blending the neighbours so loudness stays constant.
New Crossover Stereo node-> a stereo 3-band split (six outputs).
New Stepper node-> a manual up/down counter; wire a button to Up and another to Down for a +/- control, with Min, Max and optional Wrap.
New Instrument generator in The Lab-> Generate now builds a complete playable synth (voice, filter, envelopes, effects and keyboard) with six voice types and Voicing/Voices/Glide options; optional full front panel.
New per-widget fonts-> every text widget plus Comment and Frame get a Font Family picker with five built-in typefaces, and you can add your own .ttf/.otf (drop it in the Fonts folder or use Import Font, browse or drag and drop). Custom fonts travel inside preset bundles.
New Global scope for States-> a state can snapshot every node's values across all subgraphs, not just the current level.
New parameter lock-> the inspector padlock freezes a value so it is skipped by both randomize and State recall.
New Lock Loop Start on the step sequencers-> keep the loop start fixed and cap the length instead of sliding the start back.
New off-grid drag-> hold Ctrl+Shift (Cmd+Shift on Mac) while dragging to place a node freely with snap on, in the graph and the front panel.
New Handle Image on the Slider Handle-> replace the drawn handle with a PNG, JPG or SVG, with a size control.
New Stereo Image options-> Connect Dots draws one continuous XY trace, and Show Phase Bar hides the correlation meter for a bigger scope.
New Highlight wires of the selected node-> a Settings option that fades unrelated cables so a node's wiring stands out, with an opacity slider.
New Window Scale menu (View)-> size the window to 50/70/80/90/100 percent of the screen in one click.
New Latency readout in Graph Stats-> shows the patch's input-to-output latency in samples and ms, exactly what MNodes reports to the DAW.
CHANGED
Branch now works with CV-> feed its In a CV stream and it fires a trigger on True at the rising edge and False at the falling edge.
Counter now has a Wrap toggle and a simpler Up / Down / UpDown mode-> its config inputs take data messages instead of CV.
States now also capture front-panel widget visibility-> a single state can reconfigure which controls are on the panel.
Cleaner preset library-> flat rows, quiet separators and the preset name first, so a large library reads better.
Loading and importing now show progress-> a Loading popup for heavy presets, and bundles import on a background thread with a real progress bar instead of freezing.
Inspector Appearance section regrouped-> the font and text controls now sit together at the top.
FIXED
Knob "Double Click = Edit Value" now works-> it pops an inline editor to type an exact value.
Plugin delay compensation is now reported to the host-> latency-inducing plugins, oversampled subgraphs and parallel paths stay in time with your other tracks.
States edits made in Perform mode now persist-> save/update/delete/rename no longer get lost on reload.
CV into the Clock and All-Pass Filter now lands on the right input-> Play/Stop/Reset and the filter's CV inputs were off by a channel.
Fixed a Data Delay crash under load, and a rare crash when clearing a patch that contains a Module or Poly Module.
Toggle and Button hover and fill polish-> an ON toggle now responds to hover.
Long preset descriptions no longer overflow the card-> trimmed to a snippet, with the full text in the tooltip.
Right-clicking a value slider no longer nudges its value.
