Home Artists Posts Import Register

Content

I have spent the last ~3 weeks working on finally adding manipulator blocks which is an idea that I vaguely alluded to in past blog posts. This has been another massive change to the codebase with many things having to be changed internally, mainly related to plugin parameters, as well as changes to the plugin API.

I still have nothing actually working to show but I am steadily getting there and I have a pretty good idea now of how things are going to work.

A manipulator block can be added from the context menu:

This would create an empty manipulator block which doesn't do anything yet. Alternatively you can right-click on a parameter to create a manipulator block which already has a target set up for you:

A manipulator is is a special kind of block which can be used to manipulate parameters on other blocks - either one specific block, or many blocks, even if they are blocks of different type. Because manipulators act on parameters and in Blockhead's plugin system parameter concepts can be sort of shared between different plugins.

For example the "Classic" and "Fudge" sampler plugins both have a "Pitch" parameter, as does the "Resonator" effect plugin. The parameters are similar in concept but have completely different implementations, and are implemented in entirely separate DLLs. The only thing the host actually knows about "Pitch" is that it is a parameter with some unique identifier which looks something like "76bc3b2b-6746-413f-89f6-254fc468cff1", for example. Each plugin declares a parameter with this shared identifier and the host automatically associates them so that they can be manipulated together.

I just quickly threw some code together to get this screenshot, but it shows basically what the manipulator target selector will look like. I modified the Classic and Fudge plugins to expose the "Amp" and "Pitch" parameters as possible manipulator targets, as well as the "Pitch" parameter in the Resonator plugin and the "Reverse" toggle parameter in Classic.

This is the only bit of UI for the manipulator block I have implemented so far so it's harder to create screenshots of anything else.

Enabling manipulator targets via the menu will add separate editors to the manipulator block, similar to how the existing blocks work, i.e. it would add separate envelope editors for parameters that can be controlled that way, and chord/scale editor thing for chord-style parameters. For manipulating toggle parameters I am thinking about having the envelope editor open in a special toggle editing mode since the way it works normally wouldn't make sense for toggles.

The result of placing a "Reverse" toggle manipulator adjacent to Classic sampler block might look something like this MS Paint mockup:

A "Pitch" manipulator with a single envelope point which fixes the pitch at +12 semitones might look something like this:

Like everything else in Blockhead the visuals would update in real-time as you move manipulator blocks around and make edits. For envelope manipulators, there will be two modes, override and offset. In override mode it will completely override the parameter value for the entire manipulator block region, whereas in offset mode the manipulator envelope is added to any existing envelope for the same parameter (e.g. if the sampler block has an active pitch envelope and also a pitch manipulator is acting on it, both envelopes will be added together.)

Manipulators acting on the same parameter would also accumulate from top to bottom, so you could arrange multiple manipulator blocks like this for example:

If manipulator 2 is in offset mode then it would be added to manipulator 1, whereas if it is in override mode then the second half of manipulator 1 would be discarded.

The really fun thing will be that a single manipulator can be set up to either target a single block, or any block which happens to expose the active parameter. As you move the manipulator block around on the workspace it will automatically search down through the lanes for intersecting blocks which expose that parameter as a "manipulatable" target, and automatically connect itself.

Hopefully this makes sense and sorry I can't show anything more concrete yet. I am working very hard but most of what I am doing is internal work. Thank you for being patient!

Comments

Anonymous

excited to play around with this!

Anonymous

very happy to see ideas like this realised. forward-thinking shit, i can't imagine what kinds of stuff people come up with blockhead when they get deep into it.