Showing posts with label free. Show all posts
Showing posts with label free. Show all posts

Monday, 2 December 2019

Free random velocity repeated notes without using MaxForLive!

In the run up to Christmas, I have been known to release something seasonal, and this has usually been in MaxForLive... This year, in a break from that tradition, I'm releasing something that any Ableton Live user can use! Now I have done non-MaxForLive things before (the Quick Arranger 01 Rack was popular and is still downloadable), so until I gather them together and do a 'recap summary' like I did ages ago for my audio effects, then they will remain in that special 'He doesn't do these very often...' bubble universe reserved for such rarities.

I've allowed myself to break my naming rules, since this is NOT a MaxForLive device, and so I proudly present:

Random Velocity Repeater (RVR) - a MIDI Effect rack for Ableton Live

The left-hand 'control panel' part of the RVR rack...

The Random Velocity Repeater Rack for Ableton Live is built from a MIDI Rack and two standard 'factory' MIDI effects, and so should work in any of the intro/standard/suite variants of Ableton Live 10 (I haven't tested it in Live 9...). It has four channels (red, yellow, green, and blue), each of which processes a single specific MIDI note number. It uses the 'Velocity' MIDI Effect to produce random MIDI Velocities for notes, and the 'Apreggiator' MIDI Effect to repeat notes. Any note events that are processed will have their MIDI velocity values changed, maybe even to zero (and thus turning the MIDI message into a Note Off equivalent) - this is because of two vitally important considerations:

1. My rule of thumb has long been: never repeat a note with the same length, velocity...
2. Random velocities sound cool on repeated notes!
3. Sometimes missing notes are good too! (As well as the third point in a list of two!)

To save you the effort of producing your own RVR Rack, it will be available to download from the Interweb. It will not be available from MaxForLive.com, much as I wish it was possible - and I'm not going to make a MaxForLive version - one of my other rules is that I don't normally make MaxForLive devices that are relatively straight-forward to produce using keyboard shortcuts or standard devices in Racks, unless there's a reasonably good excuse for doing it: simpler UI, less mouse clicks and various other justifications are all acceptable.

As always, in this blog post I'm going to try to provide some basic background information of how my software works. You can now skip to the 'Using it' and then the 'Download' sections if you don't want to grow your own version!

There is also now a YouTube video, which contains several audio examples.

Making it

If you haven't ventured into making Audio (Effects), Instrument, or MIDI Racks, then you may need to read the Ableton Manual first before proceeding, because not everything is obvious. The first thing to do is to create the 'splitter' that extracts out the four notes that will be processed using four separate channels, and a fifth 'Thru' channel that does nothing. To create the first processing channel you drag the 'Arpeggiator' MIDI Effect from the 'MIDI Effects' category in the Browser on the left hand side of Ableton's screen into the gap on the right after the bit that says 'Drag MIDI Effects Here'. (I said it was best to read the manual!) Then drag the 'Velocity' MIDI Effect to the right of it. Then go to the 'Key' view and set the upper and lower limits to a single note by dragging the left and right sides of the green bar left or right as appropriate. Then name the channel - I called it 'Note 1' because it is the first note processing channel. Then 'Duplicate' it three times, using the pop-up menu, and rename them to Note 2, Note 3, and Note 4. Finally, drag and drop the 'Pitch' MIDI Effect, and name it 'Thru' - making sure that for this fifth 'Thru' channel you set the key range to everything - drag the ends of the bar all the way to the left and right so the bar is right across the whole MIDI note number range.

The left hand 'Macro' control panel, plus the 'Drop MIDI Effects Here' middle bit, and the start of the right-hand 'Key' mapping panel...
The four duplicated copies of the Arpeggiator and Velocity channels, which are called Note 1-4, will all be mapped to the same note number, so you need to change them to four different notes (and this is a good time to think about a good colour scheme - mine is a bit rainbow-like...

What the key mapping panel should look approximately like for typical drum note numbers...
The graphics in the key mapping panel are quite small, so here's a close-up of the important bit where the four channels are mapped to four drum notes (shown as red on the keyboard):

When MIDI notes are received by the MIDI Effect rack, the keyboard highlights the appropriate keys on the keyboard graphic in red. Here, three notes (36, 37 and 42) are highlighted, and 38 is not. The 'bar for the Note 1-4 channels should only be 1 note wide, as shown here.
All you need to do is set the narrow bars so that they are underneath the note numbers which correspond to the drum sounds that you want to process. I set the four channels to MIDI note numbers in this way:

42 Closed Hi-Hat
38 Snare
37 Rim shot
36 Kick drum


The velocities of the drums in this pattern clip are not very imaginative! (But remember that they will be randomised...)

The settings of the Arpeggiator and Velocity MIDI Effects are shown here:


The Arpeggiator MIDI Effect is set so that itjust repeats the incoming note several times at a particular rate. The number of repeats and how quickly they repeat can both be set. You can see two small green dots on each of the rotary controls that indicates that I have already mapped these rotary controls to the Macro Controls in the left-hand control panel. To do this, you need to go into 'Map' mode by pressing the 'Map' button (various bits of the UI will go green-tinged at this point) and selecting the appropriate Macro rotary control and the control that you want to map to it. Full details are in the manual! You need to do this mapping process twice for each of the channels: once for the 'Repeats' control, and once for the 'Rate' control, making 8 mappings in total.

The Velocity MIDI Effect does quite a lot of processing of the incoming MIDI. The 'Random' rotary control is set to maximum (64) and the 'Out Hi' rotary control is set to its middle position (63) so that the output velocities will hit the maximum of 127 and all the input velocities will be scaled so that they contribute half their value to the output. So half of the output velocity will be the input, whilst the other half will be random. The 'Out Low' rotary control is set to 0 so that it can produce Note Off messages - you will need to click on the number below the rotary control to change it from the default value of 1. Finally, the 'Lowest' number box can be changed to 0 if you wish. This changes the probabiliity of the output notes slightly - as you can see in the screenshots, I didn't do this, but if you wish to make your own custom version... You could also customise the 'Comp' compression setting as well if you want to compress or expand the dynamic range of the MIDI velocities.

For the 'Thru' channel, you don't need to do anything, and the Thru channel will do that as well!

Using it


Here's the MIDI Effect Rack expanded out to show everything, then the Drum Instrument that makes the drum sounds. In normal use, you would probably only have the left hand 'Control Panel' section of the MIDI Effect rack visible - so just the Macro Controls would be visible:


After the Drum Instrument, you can add any Audio Effects that you want. I used a Reverb Effect. But before the Reverb I added a Limiter, because lots of repeated notes played quickly can be louder than a single instance of the note!

Here's a Limiter Effect before the Reverb
For each note number channel, you need to set a Clip Envelope and map that to the appropriate Macro Control in the left-hand control panel. If you haven't done this before, then you should read the Ableton Live manual because I'm not going to give full and complete details of every mouse-click... 

For Note 1, the Kick drum, the repeats are mapped to a clip envelope that rises from 1 to 8...

This is what the clip envelope looks like... The clip envelope starts at 1 on the left, and rises to 8 on the right hand side.
This means that at the start of the bar, the first Kick drum will be repeated once, the second kick will be repeated twice, the third 4 times and the fourth 6 times. The rate at which the repeats happen is set by the 'Synced Rate' rotary Macro control, which is set to 1/128th note. This is very fast repetition, and turns the Kick drum sounds to  sound more like a pitched note. ( - this is a form of sound synthesis called FOF, and you might be interested in looking up what it means and how it works...)

A slightly more conventional use would be to have a slower repeat rate, and this gives drum sounds where you can actually hear the individual repeats! Here's an example using a Rim Shot drum sound:

The Rim Shot drum sound used with Repeats plus variable Rate - it sounds quite a lot like a Guiro at times...
The clip envelope selection doesn't number the 'Repeat' or 'Rate' parameters, so you have to go by the position: top is Red (1), then Yellow (2), then Green (3), then Blue (4).  This clip envelope is for the Rate at which the notes are repeated.
The Rate starts out slow, speeds up in the middle of the bar, and then slows down again. Unfortunately, I didn't invert the Rate mapping, so faster speeds of repeat are at the bottom, and slower are as you move upwards. You could make your home-grown version do it correctly, of course!

Tints and Hips

Also known as Hints and Tips, but it probably got your attention!

SPARING Ok, so there are four channels to play with, and they are colour-coded in bright colours - this does not mean that you need to use all four channels every time! Sometimes just a single note in a single bar is all you need, or a single note repeated for every chorus. And yes, there are some genres of music where repeating it several times every bar is currently fashionable. But all four channels, all the time, is probably over-kill and may make your music sound ever-so-slightly cliched. 

SUBTLE Clip envelopes can wazz parameters from min to max very quickly, and then wang them back again just as fast. This does not mean that huge variations in the number of repeats, or the rate of those repeats, will sound better - sometimes less is more. Having said that, completely 'way-over-the-top' rate and repeat settings with a Rim Shot sound can occasionally sound just like a Guiro! 

CONFIDENCE Once you have tweaked the Repeats and adjusted the descent of the Rate control so that the Kick drum sounds like an 'FOF' cross between a drum and a monosynth, then you might be tempted to try and hide it deep in the mix. Based on what I hear these days from 'popular beat combos', then you may as well just have the confidence to put your carefully honed special sound effect loud, front and centre. 

CONFLICT When two or more tips contradict each other, as in SPARING, SUBTLE and CONFIDENCE, then just do whatever you want. If you have the Spinal Tap extension fitted to your DAW, then simply turn up all the controls to 11.  

REPETITION I mentioned it earlier, and it bears repeating: Fast repetitions of the same drum sound (particularly if your drum sounds are polyphonic) can be louder than a single instance of the same sound. A Limiter might be useful to keep things under control...

YouTube video!

I have struggled putting videos into blog pages successfully, so I'm going to turn all of this blog post into a YouTube video, so that you will be able to see these happening in a full audio-visual experience!

Getting the Random Velocity Repeater Rack

You can get the Random Velocity Repeater Rack here:

       https://drive.google.com/file/d/1H6U6k2FVQy_n5gekCm5prVwsp488done/view?usp=sharing

You just need to drop the .adg file onto Live's screen and it should appear in the MIDI Effects folder.

Modular Equivalents

In terms of basic modular equivalents, then the Random Velocity Repeater Rack would probably require four Random Noise Generators plus a quad MIDI Utility module to do the velocity multiplying, plus 4 LFOs to do the repeats, and a final quad MIDI Utility to create the repeated notes, giving a total of about 10 ME (without all the stored memories, of course).

If you find my writing helpful, informative or entertaining, then please consider visiting this link:









Saturday, 30 November 2019

Free Quad Modulated Probability MaxForLive plug-in for Ableton Live

Okay, three closely related releases in a few days is unusual, even for me, but there's a strong family bond between these three siblings:

1. MIDIprobD4 is the basic 4-channel 'set the probability of 4 drum sounds.
2. MIDIoffGRID4 adds flexible control over time delays.
And now:
3. MIDIprob+D4 allows the probability to be modulated with LFOs.



MIDIprob+D4 adds four Sync/Free LFOs (Nothing clever, just the same 'borrowed from Ableton' design that I've included in most of my old 'classic' plug-ins like Comber) - Hey, this might be a good time to revisit them...) so that the probability can be modulated instead of being fixed. This adds variability to the unpredictability, and so you may need to get familiar with using the basic 'skinny' MIDIprobD4 first, and then go for the 'full-fat' version.

The LFO in Comber...
Extrapolators have probably realised at this point that there's room in this unified scheme for:

4. MIDIoffGRID+4 and I can neither confirm nor deny that this is in development.

MIDIprob+D4's four channels make using my sophisticated 'modulation widget' difficult because of limited space. I have used it in some of my 'Hex' series of effects, and it allows easy control of modulation depth and offset in a single 2D X-Y control instead of two rotary controls.

The 'Modulation Widget' in AUDhexPPD...
MIDIprob+D4 is literally 4 LFOs added to MIDIprobD4, so the things you need to know are:

1.If you set the Probability rotary control (with the triangle) to 100%, then the LFO isn't going to be able to modulate it fully - you can pull it down to 50%, but that's all. Similarly, if the Probability rotary control is set to zero% then you won't be able to LFO modulate it above 50%. For full modulation of Probability, you need to set the rotary control to 50% - where there's a triangle to remind you. And yes, the 'modulation widget' would have made this obvious, but changing the size is tricky...

2. The 'Sync' speeds are locked to Live's transport, and most of them are very fast in comparison to the 'change the probability slowly over several bars' that you are likely to expect. But try the slower speeds (1/1, etc.) and see what happens when you are locked to a single bar, and then see what happens at shorter time intervals. They may be more useful than you think!

3. Yes, the first time you use the 'Free/Sync' toggle switch, strange things happen with the enabling of the graphics. I'm working on this...

4. Left for future additions...

As always, MIDIprob+D4 is free!

Getting MIDIprob+D4

You can get MIDIprob+D4 here:

     https://maxforlive.com/library/device/5851/midiprobplusd4

Here are the instructions for what to do with the .amxd file that you download from MaxforLive.com:

     https://synthesizerwriter.blogspot.co.uk/2017/12/where-do-i-put-downloaded-amxd.html

(In Live 10, you can also just double-click on the .amxd file, but this puts the device in the same folder as all of the factory devices...)

Oh, yes, and sometimes last-minute fixes do get added, which is why sometimes a blog post is behind the version number of MaxForLive.com...

Modular Equivalents

In terms of basic modular equivalents, then MIDIprob+D4 would probably require four LFOs, and four Random Noise Generators plus a quad MIDI Utility module to do the velocity multiplying, giving a total of about 9 ME (without all the stored memories, of course).

If you find my writing helpful, informative or entertaining, then please consider visiting this link:




Tuesday, 26 November 2019

Redundant MIDI Note On Messages Used to Set the Probability of a Drum Event

The Ableton Live piano roll display for MIDI Events is interesting, in many ways. As someone who has been using hardware sequencers since the 1970s (ARP's model 1601 Sequencer, for example, or the Roland...,), and software sequencers since the 1980s (The UMI-2B/4M on the BBC B, for example... http://www.muzines.co.uk/articles/umi-4m-midi-composition-system/3975 from September 1988, or Dr.T's on the Atari...), then I have seen and used a lot of ways of representing and controlling musical data. Ableton's piano roll is quick and easy for some tasks, but I have always liked a list-based view for adding things like program changes, or tweaking the order of 'simultaneous' events that are serialised by MIDI transmission.
(Picture from Reverb.com, where you may be lucky enough to find and purchase classic devices like this one!)

However, most seriously of all, it has always been my exposure to Intelligent Music's RealTime sequencer that has had the most profound effect on me (with John Hollis's Trackman just behind it...). RealTime was arguably one of the first sequencers that showed the road away from tape recorder emulations and towards modern DAWs (When I reviewed it, I didn't return it: I bought it! http://www.muzines.co.uk/articles/realtime-intelligent-sequencer/5624 ). And one of the killer features for me was the randomisation control - a little toggle box with a random pattern inside it that turned boring hi-hat lines into much more interesting decoration, and which sounded much less like a robot playing. Some things get under your skin and into your head, and you may have noticed that many of my MaxForLive devices (and more) have a significant bias towards using probability as a control source.


Which is where Ableton's piano roll comes in. Power users probably already know about the 'select a note, press the '0' (zero) button' shortcut that disables or enables notes (it is in the pop-up menu for the piano roll), but I've always wanted a Modifier key version (Shift-Zero, or Control-Zero, or something else, that doesn't disable a note, but sets the probability of it happening. Having 'greyed out' disabled notes is okay, but I would like more!


Now, it is possible to make a MIDI Effect Rack that extracts a single MIDI note and uses MIDI velocity processing or the Arpeggiator to provide control over the probability of a note, but it is pretty awkward, and not very elegant. All of which sounds like a cue for a simple, neat MaxForLive MIDI Effect that lets you control the probability of notes happening.


MIDIprobD4 does exactly that - for four notes simultaneously (It is a 'quad' or four-channel device...). The D indicates that its primary intended use is for drum sounds - you put it just in front of the Drum Rack. I use it to make hi-hats less robotic, to make snares unpredictable... You get the idea. If I'm bored, then I assign all four channels to kick, snare, closed and open hi-hat, and fill the Clip piano Roll with drum notes, and it produces oodles of random drum patterns. In a world currently overflowing with Black Friday deals (and what are the from/to dates for that?) then the deal is my standard one - it is FREE and will remain so (unless something extraordinary happens!).

Redundant MIDI Note Offs

MIDI has some interesting back alleys. In the classic reference specification, Complete_MIDI_96-1-3.pdf', on Page 10. In the 'Note-Off' section, it says that a Note On message with a zero velocity is roughly equivalent to a Note Off message.

( For more MIDI documentation, please visit: https://www.midi.org/specifications ) 

Now for any MIDI device that is velocity sensitive, a velocity value of 1 (one up from zero) is going to tend to be quite low in volume - maybe only fractionally just above no sound at all. The opposite value, 127, is maximum volume, of course, and so in many cases, zero and 1 sound pretty similar - one is totally quiet, the other is as quiet as it can be without not playing at all. There's one other interesting feature of drums - they are almost always velocity-sensitive. Further, on page A-4 in the 'Assignment of Note On/Off Commands' section, it says that 'Since there is no harm or negative side effect in sending redundant Note Off messages then this is the recommended practice' when talking about ensuring that Note Ons and Note Offs are always paired together, eventually.

The 'Velocity of zero is a Note Off' feature and the 'Redundant Note Offs are ok' feature are the mechanisms that I exploited to control the probability of MIDI note events in MIDIprobD4. Yes, I could have produced a complex device that keeps track of Note On messages and waits for the corresponding Note Off messages, and controls the probability of a note happening by removing the complete pair of messages, but it is far easier to just change the velocity of a Note On message to zero - which changes it to a Note Off, and redundant Note Offs are ok. So the MIDI processing is vry simple - just a multiplier for the velocity value of zero or 1. With a multiplier of 1, then the velocity of the note is unchanged: 1 x any value from 1 to 127 is the value. But with a multiplier of zero, then any value from 1 to 127 is changed to zero, which is the equivalent of a Note Off message, and it is okay to send redundant Note Off messages!



The Max code is shown above. This is inside a patcher that handles the velocity, and so outside this is more code that separates the MIDI messages into Note Number and Velocity streams, and so this is just the velocity stream processing. The yellow number box is a buffer so that the time it takes for the 'Random' object to generate a random number doesn't affect the processing time of this patcher - the previous value is available immediately from the number box. The output of the '<=' object is either zero or 1, and this drives the multiplier. The Probability control is a 0-100 rotary percentage control. I have to confess that whilst this approach follows the MIDI Specification, the actual device isn't perfect (but then, many of my devices have quirks...) and so sometimes it shows a note with a high probability that doesn't actually make any sound. I have spent quite a while trying to find out what the problem is, but haven't been able to discover the cause. Perhaps a reader of this blog may be able to enlighten me?


Anyway, MIDIprobD4 has simple controls. From left to right the first rotary control in each of the four channels is the MIDI note selector (0-127, although most drum notes are typically going to be 36-60ish), then some memory slots/squares (shift-click to save, click to recall), then an indicator blinker to show that a note event has been received, then the rotary Probability Percentage control, and finally a second indicator blinker to show that an note event has been transmitted to the output. Minimalistic, although I'm sure it could be made even smaller...

And that's it. Put MIDIprobD4 just before your Drum Rack and you have control over the probability of four of the drum sounds. Enjoy!

Links from this blog post:

UMI-2B/4M on the BBC B (from muzines.co.uk)
ARP model 1601 Sequencer from Reverb.com
RealTime sequencer review (from muzines.co.uk)
MIDI Documentation

And a special mention for a wonderful repository of music magazines from what now seems to have been a 'golden age':

Mu:zines - an amazing resource!

Getting MIDIprobD4

You can get MIDIprobD4 here:

     https://maxforlive.com/library/device/5844/midiprobd4

Here are the instructions for what to do with the .amxd file that you download from MaxforLive.com:

     https://synthesizerwriter.blogspot.co.uk/2017/12/where-do-i-put-downloaded-amxd.html

(In Live 10, you can also just double-click on the .amxd file, but this puts the device in the same folder as all of the factory devices...)

Oh, yes, and sometimes last-minute fixes do get added, which is why sometimes a blog post is behind the version number of MaxForLive.com...

Modular Equivalents

In terms of basic modular equivalents, then MIDIprobD4 would probably require four Random Noise Generators plus a quad MIDI Utility module to do the velocity multiplying, giving a total of about 5 ME (without all the stored memories, of course).

If you find my writing helpful, informative or entertaining, then please consider visiting this link:




Sunday, 27 October 2019

Different every time - changing parameters with M4L in Ableton Live

I've always worked according to the principle of 'Never the same thing twice'. Whilst most important for things like drums, I try to apply it to most sounds - although I also like flams, which kind of goes completely against the principle! Maybe 'Be inconsistent' is a better way of putting it? (Just to be consistent, I have added in the updates made to MIDIdifferentONE version 0.02 into this blog...)

In Ableton Live, there's an obvious way to control the parameters that are one major way of changing sounds on the fly: the 'Clip Envelopes'. The name is slightly misleading, because clip envelopes are just a way to draw parameter values onto the piano roll. Anyway, the clip envelopes are normally hidden by default, and you need to click on the 'E' inside a round button to open up the overlay in the piano roll pane. Selecting a device and a parameter from the two pop-up menus then lets you draw lines and curves either with a rather blocky pencil tool ('Steps') or with a 'lines and breakpoints' ('Ramps') tool. I prefer the 'lines and breakpoints' approach...



One of the 'classic' parameters that is controlled this way is filter cutoff (with an appropriate level of resonance) and I have spent quite a lot of time zooming out from a clip, setting the cutoff frequency for a bar, then clicking to get a new point and dragging it up and leftwards to get a new parameter level for the next bar, and so on. It requires quite a lot of clicking, but once it is complete, then editing each of the levels is quite quick to adjust. However, if you want to change the timing, for instance, to a change every other bar (or an arbitrary length), then it can require more clicks. There's also another non-obvious thing to consider that requires more clicks - you need to have the parameter set before the fist note on in the bar. This is why the orange clip envelope line is shown in the diagram as changing just before the first note in the next bar - if you don't do this then you hear the note start and then the filter cutoff change, which sounds like a mistake.

What this means is that you start off zoomed out, setting the parameter levels for each bar (or other interval), and then you need to zoom in to each of the ends of the bars where the parameter changes, the nudge the parameter change a little bit earlier in time. Then you zoom back out again. For me, there's a point where repeated mouse clicking gets a bit tedious, and I've never found any keyboard shortcuts for some parts of the clip envelope editing. So setting up several clip envelopes for a few parameters, and then changing the timing, starts to exceed my trigger level, and I stop and go looking for alternatives.

LFOs are the obvious alternative, and I've explored all sorts of variations of Slow Oscillators, including quite a lot of my own MaxForLive devices. The trouble with LFOs is intrinsic: they want to change, slowly; whilst for parameter changes I'm really looking for sudden changes followed by long steady fixed values. Lots of LFOs come with various 'Random' or 'S&H' (Sample and Hold') outputs that do give the stepped change, but then the values aren't under my direct control. Okay, so S&H on a filter cutoff can sound cool, especially a quarter note intervals (of which more later), but when you are controlling a build then you want to be able to set the parameter value for each bar. So LFOs are 'almost' the solution, but what would the ideal look like?

My ideal would have a LFO like 'Rate' control, followed by some way of controlling the parameter setting for each time period - from quarter bars up to every 8 bars or so. Which kind of sounds a bit like a weird step sequencer... but one that that enables each bar (or other interval) to have different parameters!

MIDIdifferentONE


MIDIdifferentONE is a deliberately 'different' step sequencer for parameter values that works a bit like an LFO, except that it is always synced to the sequence timing, and it is optimised for setting parameter values and then replaying them at various rates. Best of all, it always changes the parameter value just before the end of the bar, so you don't get the note followed by the parameter change!

It turns out that the requirement for something to happen 'just before' something else is one of those programming tasks that keeps cropping up again and again in electronic music, and I've struggled many times with getting it to work correctly. So this time, I was determined to spend some time solving the problem, and then some time showing how I came up with my solution. As always with these things, there's probably a much better, cleverer, shorter and neater way to do it, but I will leave that to other programmers!

LFO timing and step sequencer design is all standard 'home territory' for MaxForLive, but the requirements for the timing of the parameter change are more interesting - we need the parameter to change 'just before' the end of the bar (or some other interval). 'Just before' might be loosely defined as something like 'after the last beat, and as late before the end of the bar as we can manage without the parameter change happening in the next bar'. I decided to simplify 'as late as' to mean ' the last 16th note tick before the end of the bar, which is probably going to work with most situations - although if you put very short notes right at the very end of a bar then MIDIdifferentONE might start to change the parameter to the value for the next bar as your last note of the bar plays...


For 16th note quantisation, Live's transport outputs bars as numbers, beats as the numbers 1 to 4, and 'ticks' as the numbers 0, 120, 240 an 360. If you don't quantise the timing, then you get tick numbers like 205.74 and the processing is more complex. For MIDIdiffrentONE, making sure that the parameter changed before the end of the bar was the most important thing, so I kept things simple and applied quantisation, but only to the timing for these parameter changes! So MIDIdifferentONE will not affect the quantisation of any other timing in your music.

The definition of 'after the last beat and when the last tick happens' translates to beat=4 and tick=360, so all that is needed is a bit of Boolean logic in MaxForLive... Now the easiest way to do this kind of goes against the 'visual programming' metaphor that MaxForLive uses, and uses the 'if' object and requires some typing! Suddenly MaxForLive is going a little bit 'programmer'y! What you type in the Max object is something like 'If ($i1=4 and $i2=360) then 1 else 0', which means that when input 1 is equal to 4 (beats) and input 2 is equal to 360 (ticks) then output a '1', otherwise output a '0' (zero). Yep, that's a traditional text programming 'if statement' inside a MaxForLive object. Some of you may need to sit down at this point...

That covers how to make something happen at the end of every bar - whenever the beat=4 and tick=360. Other times like every other bar or every quarter bar just require slightly different 'if' statements and additional processing. I hid the end result inside a patcher box to keep things neat and tidy:


So you can see the 'metro' object that provides timing from the master clock source, a 'transport' object that outputs bars, beats and 'ticks' into those three number boxes, and then the 'before_mr' object that contains all of those hidden-away 'if' statements. The 'switch' object selects the desired timing, and after a special 'counter' object, you can see the top of the 'step sequencer' object.

Inside the 'before_mr' patcher? I'm not one to hide stuff away, so here goes:


If you look across the lower part of the patch, then you should find the 'every bar' output, (fourth from the left) and above that a blink object, some tidying up, and then an object with 'if $i1==4 && $12==360 then 1 else 0' inside it. This is the 'just before the end of the bar' requirement turned into an 'if statement' using MaxForLive terminology - so '&&' means 'AND', and '==' means 'is equal to'. You might like to try and work out how the other outputs are generated as well.

There's a trap with this 'just before' approach, and it happens in the very first step. As always, you should consider the 'edge effects', and this is one case where I didn't think enough about the initial step. The 'before_mr' patcher outputs a 'bang' event just before the end of the set time period: from every 8th bar to every quarter beat. So what happens in the first step? If we take the middle case of 'every bar' then the 'bang' event will not happen until just before the end of that first bar. This means that until that happens the counter is in the 'reset' case, which is a count of zero, so the step sequencer stays on whatever step it was before we started Live's transport running. Only when it gets to just before the end of the bar will a bang event occur, and the counter will increment, and step 1 will begin - almost a whole bar late! What actually need to happen is that the counter needs to be set to step 1 at the beginning of the bar, not just before the end. This can be achieved by using a 'timepoint 1 1 0' object, which produces a bang event when Live's transport starts running, and if this resets the counter, then step 1 starts correctly. This means that the first step is slightly less than a bar long in this case...

That's what is happening inside, now let's look at outside.

Using MIDIdifferentONE



The plug-in has has three sections, and from left to right, these control the setup, the step sequencer, and the value output and mapping. On the left hand side, the top shows the beat indicator and count, where the blinker can also be clicked on to reset the sequencer. Underneath that, the pop-up menu allows selection of the step sequencer rate: from every 8th bar, down to every quarter note (slow to fast, with the fast setting being the 'classic' S&H filter modulation effect). The cluster of thirteen buttons are used to fill the step sequencer, and the 'Random' button generates a different pattern each time. The 'Scramble' button jumbles the sequence of the values, and below it is an 'Undo' button that will restore the last edit you made - it isn't very sophisticated and there's only one level at the moment.

The middle section is the step sequencer. Every fourth step is highlighted in white instead of light purple, and the bar at the top can be used to set the length and looping points. The default is 16 steps from 1 to 16, but you can vary it to anything to 2 steps from 1 to 2, to 16 steps from 1 to 6, and back to 2 steps from 15 to 16. When you stop Live, then the step sequencer area can be edited 'live' using the mouse - just hover the mouse near the top of one of the step 'circles' in the middle 'step' section,  and that value will be displayed. Click and you can change the value of the step. If you move the mouse across the step sequencer area then you can 'draw' in the values very quickly. - the background of each step will go grab as the mouse selects that step...

So the workflow for setting the controlled parameter is now very simple: Stop Live playing, and then you can set the step values as you want with the mouse and they will be saved. Note: If you select one of the preset patterns, then you will lose your edits!

The right hand side shows the output value for each step, as well as a vertical bar indicator. The 'Normal'/'Invert' switch inverts the value, so high values become low and vice-verse. The 'Offset' and 'Depth' controls allow the value to be adjusted to suit the target parameter. Finally, the 'Unmap' button undoes any pre-existing mapping of the value to a parameter inside Live, and the 'Map' button allows you to mp the value to any available parameter inside Live.


Here is the 'classic' LFO S&H filter mod setting, except that it repeats, the steps can be edited, and it can be slowed down to as slow as once every 8 bars. This example is set for every other bar, and so the end effect sounds like a different setting (or different preset) every 2 bars. And switching to quarter beat cliche is just a single pop-up menu selection, whereas you would need to edit the timing of every value in a clip envelope.


Here's the output remapped to an instance of Analog inside Live, where the controlled parameter is the octave for Oscillator 1. The Offset control is set so that the centre position is no stave transposition, whilst the depth is set so that the oscillator goes up and down by one octave. LFO modulation of the octave control with an 'S&H' type of waveform would not give you any way to edit the waveform, but MIDIdifferentONE lets you set when the octave transposition happens.


Something that you may not have tried before is to change the filter type. Doing this every half beat is quite extreme, and the sound of a filter jumping from his-pass to band-pass to low-pass quickly is unusual. Remember that unlike an LFO doing Random or S&H waveforms, you can edit every step of the sequencer, so you can get exactly the results you want for each step.

ONE?

After a long run of 'hex' MaxForLive plug-ins, you might not be surprised by the 'ONE' suffix to the name of this device. I can neither confirm nor deny the future existence of any multi-channel versions of this utility...

Getting MIDIdifferentONE

You can get MIDIdifferentONE on  https://www.maxforlive.com/library/device/5805/mididifferentone-mr

Here are the instructions for what to do with the .amxd file that you download from MaxforLive.com:

     https://synthesizerwriter.blogspot.co.uk/2017/12/where-do-i-put-downloaded-amxd.html

(In Live 10, you can also just double-click on the .amxd file, but this puts the device in the same folder as all of the factory devices...)

Oh, yes, and sometimes last-minute fixes do get added, which is why sometimes the blog post is behind the version number of MaxForLive.com...

Modular Equivalents

In terms of basic modular equivalents, then MIDIdifferentONE 0v01 would probably require an LFO plus a step sequencer, and a Utility module to do the scaling, giving a total of about 3 ME (without all the stored patterns, of course).

And here's a link to click on if you find my writing informative:

Sunday, 7 July 2019

Programming some new presets for Sprike...

Every so often, I program some sounds for a synthesiser that I am totally unfamiliar with. It provides a break from revoicing new synths when I first get them (yes, I really do that!), and it is a good way to learn about user interfaces, how to present things so that they are easy-to-use, what needs to be in a user manual, and to learn about new and unusual synthesisers.

You can see a previous example of this activity here, from when I did some sounds for the Amazing Noises Pulsor synthesiser (a MaxForLive plug-in for Ableton Live), and I also wrote my own 'alternative' manual for it.

Sprike



In contrast, and as a break from all of the MaxForLive and Ableton Live stuff, this time I chose Cognitone's Sprike, a free additive virtual analogue synth plug-in that is derived and extended from Tunefish4 (and 3...) and which is available in VST format for 64-bit Windows, and VST and AU formats for 64-bit macOS. Linux isn't directly supported, but there is some compilation information for the earlier Tunefish4 project on github. Cognitone's flagship product is arguably the 'intelligent assistant' called Synfire, which is kind of 'one layer up' above a DAW - it allows sophisticated control over the composition or 'prototyping' of music via smart editing of harmony. Powerful and deep, it is a million mile away from the auto-accompaniment fake sheet and chord utilities that I remember from the recently MIDIfied 1980s and 90s.

Sprike looks like many other VSTs. The User Interface (UI) is divided up into the sort of panels that a real piece of hardware would have, has a global section at top-left, and a virtual keyboard along the lower edge. Quite a lot of the panels can be disabled, and they go dark blue when this happens. The right hand side has the modulation 'matrix' (8 sources, 29 destinations, and 8 modulation depth controls), plus an interesting effects 'stack', which allows up to 10 of the available effects to be placed in series (a great idea that I wish was more widely adopted in plug-ins).


Sprite uses an additive generator as its main sound source (it also does various flavours of noise!). There are quite a lot of controls, and these use additive synthesis to fill a wavetable, and then that wavetable is what produces the sound output from the generator. Trying to provide an intuitive and minimal-number-of-controls interface for additive synthesis is not easy, and Sprike's solution is pretty good - there are not that many controls, and the graphic underneath shows the spectrum on top, and the waveform underneath. A little bit of experimentation should rapidly get you up and running and making sounds, although getting fully to grips with the generator may take some time.  The two rows of buttons are for the amount of detune for what sounds like two wavetable players, and the octave switching. When I was programming Sprike, I left the octave buttons in the default '0' position, rather than produce 'bass' sounds by just transposing down by a couple of octaves...

There are four filters, and they seem to be connected in series, although you can switch them in and out (but not via the modulation matrix!). There are 2 LFOs, and 2 ADSR envelope generators, and finally seven effects: Flanger, Reverb, Delay, EQ, Chorus, Vowel Formant Filters, and Distortion. Basically, you get more panels than you would expect in a basic additive synth, and so the description of 'additive virtual analog' is a much better description - you get 'subtractive-synth'-style filtering and envelopes instead of the 'envelope per harmonic' controls that traditional additive synths give you.

For something which is free, and which Cognition describe as an experiment in writing small and efficient machine code, then I hesitate to criticise Sprike in any way, because my assembler skills stopped with the 56000 DSP from Motorola many years ago (and the 6502/8080 before that). However, whilst programming a few presets, I did find a few things that are useful pointers to things that anyone who makes a synthesiser plug-in should consider...

First, there isn't much in the way of user documentation (that I could find - I would love to be wrong!). There is a brief Tunefish user manual on github, and some additional material on the tunafish-synth.com web-site, but you do need to do a lot of iterative exploring of some of the controls to get a feel for what they do.

Secondly, the additive generator doesn't make it very obvious what the programming model is. There are controls that mention parameters like 'Harmonics', 'Drive' and Spread', but you may need to spend some time to learn how to exploit them to get the sort of raw generator sound you want. having said this, I am still impressed with the small number of controls. I have a Kawai K5 additive synth, and this has the aforementioned 'traditional' 'envelope per harmonic' approach, which is a huge number of controls!

Thirdly, the volume control defeated me. There is a global volume control at the top left, but towards the lower right corner there is another 'Volume' control which is associated with the 'Pan' control, and so my assumption was that this was the main output volume control for a preset. But it doesn't seem to work like this, and I'm not sure if it is connected to the global volume control. Anyway, it doesn't really stop you from programming sounds, it just means that sometimes you need to be aware that you may need to tweak the volume control - and tweaking synth controls is not exactly an unknown of unusual activity!



Finally, the modulation values aren't exactly intuitive. If you choose an LFO as the modulation source  (look at LFO 1 in the screenshot above) and then set it to modulate the 'Scale' control in the generator, then full modulation seems to happen when the mod matrix control is set to 70. Whilst useful for ova-modulating controls, it took me a while to figure it out, and I dislike 'magic' numbers in user interfaces - of course, having programmed MIDI editors for the Kawai K5, then I'm very familiar with 'special' 'secret' numbers, because the Kawai MIDI implementation uses them!

Presets


In the end, I produced 128 new presets for Sprike, and a quick search of the Interweb gave me the impression that there are not very many easily available, so I'm making mine available for free (as usual). There's a reasonably wide range of sounds, albeit without any octave switching (so you can decide which sounds you want to be 'bass' sounds!) and a strong bias towards synthetic and away from imitative. Use at you own risk (some of the effects stacks seem to overload sometimes...), but hopefully 'enjoy!'



Sprite has a simple drop-down menu for selecting presets, plus 'Prev' and 'Next' buttons, plus copying and pasting facilities, so it is obviously intended to be programmed! The presets themselves are just plain text files (which may not be as straight-forward as you imagine for some Operating Systems) with parameter names followed semi-colons then the value per line.


Getting the presets


You can get the Sprike presets from here, for free (it is a 143 Kbytes zip file). Unzip the file and put the files into a folder called 'bank1' (or higher, as you wish) in the appropriate 'Presets/Sprike' folder inside your OS's filing system - as shown above for a Mac...


Buy me a coffeeBuy me a coffee






Tuesday, 19 March 2019

A little bit of echo here and there - with MaxForLive in Ableton Live...

The last thing that the world needs is 'Yet Another Echo Effect'. This may sound like a good plan, but if you pronounce YAEE then you get something very like 'Yay!' and the fate of the world is sealed! And so, now, I'm going to announce another echo effect...

It was after I finished the hex frequency shifter that I looked at the central hex auto-pan section and thought: 'That would be interesting in an echo effect...' A month later, and here is the result, but, as usual, I'm not one for just doing a 'me too', and so this isn't your ordinary echo effect.

Hex Echo


The core of the Hex Echo effect is two sets of three delays, arranged in series, but with access to the delay inputs and outputs in parallel. The output section is exactly the same as the hex frequency shifter, and allows each delay to be selected and panned separately, either fixed (with a rate of zero Hertz for the LFO) or automatically. For the inputs, then you can send the stereo inputs directly to the two delay lines, so this kind of treats them as if they were in parallel as well. The inbuilt links between the three delays are still present though, because that made the routing just a tad too complex.

All of the feedback loops are also switched, which means that you can quickly turn feedback on and off without having to change a rotary control. It means that you get fast control over the feedback, which can be very useful when there's too much overall gain and it starts to run away with itself. There are memories to store your favourite settings as well, and a good idea might be to set one of these to a 'all-feedback-off' setting so that if things do start to get loud, you can stop it quickly. A post-limiter might also be a good thing to add too...


Constant Volume

Apart from having to keep track of lots of signal routing, one of the trickiest aspects of the Max programming for the Hex Echo was the output pan selection. For each channel, you can select any of the delay outputs, which means that you can have 8 combinations of the three selector switches. One of the combinations isn't very useful for most of the time - the 'all off' one where no delay line gets to the output. But actually, it can be useful, because you might want to have just one channel's delays in your output, and for that then you would want to turn all of the selectors in one channel off, and leave the other channel's selectors on. The output panning means that the outputs are positioned in stereo, so this doesn't mean that the output will be mono.

But having three selectors means that the other seven combinations will change the output volume, because when there are two outputs present then they will be louder than a single output, and three outputs will be louder still. What is needed is a 'constant volume' selector, and that is what I programmed inside. Here's the level of abstraction just above the bit where you find out how it works:



So there are three [X] selectors, which route the delay outputs to the banners (pan_mr), and the volume compensation happens in the 'selpan_mr' object, which does all the hard work.


Let's work towards a general case for volume compensation by starting with the simplest case. With two [X]  selectors, then there are only three possible combinations: both on, both off, and one off whilst the other is on. In the 'both off' case, then we don't care about the volume! But the 'both on' and 'only one on' cases will give different volumes: the 'both on' will be the result of two signals being mixed together, whereas the 'only one on' is just one signal. So if we use the 'only one on' case as the reference, then the 'both on' case needs to be reduced by half, so that the result of mixing the two signals together is the same as the single input. In other words: 1/2 plus 1/2 = 1.


For three [X] selectors, then there are more combinations, but really there are only four distinct ones:
- all off
- one on
- two on
- three on

And when there are three signals being mixed together, each one needs to be reduced to one third - which is the clue to the general case. For two signals then the volumes need to be reduced by one half (1/2), for three signals the volumes need to be reduced by one third (1/3)... So, for 'n' signals, the volumes will need to be reduced by 1/n.

For completeness, here are the intermediate stages that I went through developing the final 'selpan_mr' object. First, I tried using the 'select' object to trigger messages to provide the multiplication values (0.33, 0.5, 0.99...)


But whilst this works nicely for two values, there isn't an easy way to scale 'select' for more outputs...

Then I tried using a simple linear equation to generate the 0.3 and 0.9 values, but this had a problem with one of the multiplication values...


There are three repeated sections, where an audio input (port in 1 for instance) is routed through a 'gate~' and then a '*~' multiplier (acting as a VCA) to the audio output (port out 1 for instance). Port in 2 controls that gate, turning it on and off, and so routing it to the panner object. But that control is also used to do the volume compensation. All of the Port Ins that controls the gates (port ins 2 4 and 6) are summed together at the '+ 0' object on the right hand side, just above the '!- 4' object. That '+ 0' object adds the three gates together, so if one gate is on, then the result of the addition is 1, whilst if all three are on, then the result is 3. (You can guess what the output is when two gates are on!) Unfortunately, the gate signals are the wrong way round in terms of adjusting the volume, and the '1- 4' object reverses the result by subtracting the sum from 4, so when all three gates are on, the output is 3, and when two gates are on, the output is 2, and all three gates on gives 1. The '* 0.3' does the volume magic - for three gates, then the 1 is multiplied by 0.3 and this is sent to the multipliers, so each port output will get about a third of the volume, and since all three ports are active, the resulting volume in the channel will be 0.9. If only one gate is on, then the subtraction gives 3, and 0.9 is sent to the multiplier for that gate, which gives 0.9 again. For two gates, then the output is 0.6 twice, which gives 1.2 volume, so this isn't right.

Testing Max patches with complicated sets of inputs and outputs requires a bit of planning. In order to use the three [X] selectors and see what is happening inside the 'selpan_mr' object that they feed into, you need to open two windows: one so that the [X] selectors can be set, and another so that the effects on the internal values inside the 'selpan_mr' object can be observed.


Here are some screenshots of the 'almost right' 'selpan_mr' object in action. (The case shown above was what happens with no gates active, so there's no output at all!)

First one gate on:



Which gives the 0.9 multiplier for that single output.

Then two gates on:



Which gives two lots of 0.6, which is 1.2, and so a little bit too big...

And finally, three gates on:



Which gives three lots of 0.3, for a final output of 0.9. Good for showing troubleshooting and testing, but that incorrect value isn't right. Compensating for volume only works if it is right!

Now there IS a 'brute force' way of doing this type of calculation - a 'look-up' table. In Max this can be done using a 'coll' object and filling it with a table that contains the values on 'n', and the corresponding multiplier values. Here's the Max patch and the table inside the 'coll' object:


And here are the two windows in use to test it:


The left hand window is used to control the [X] selectors, whilst the right hand window shows what is happening inside the 'selpan_mr' object, using the number boxes.

We now have an object that is doing maths on the 'n' value for the number of [X] selectors, but all that it says is 'coll'. The actual operation that it carries out on 'n' is hidden inside the table inside the 'coll' object. This may work, but it hides what is happening rather too deep for my taste...

So back to the general formula: 1/n. How do you code that in Max? The way to do it directly is related to the way that Max maths objects have two inputs: one on the left-hand side that is an input for a value and also a trigger for the calculation, whilst the other (on the right hand side) is just an input for a value (or is the value inside the maths object). Let's consider the case when you want a fixed value inside the object. So if you want to add 2 to 3, then you send a value of 3 into the trigger input, and an object that contains '+ 2' will produce an output of 5. But for subtraction, then this way of working has a problem. If you want to divide one number by another, then an object containing '/ 2' will produce the result '3' if you send '6' into the input, so a calculation like 6/2 is easy. But how about if we want to calculate 1/n? The value inside the object is fixed, and so we would need to use a message box to send a '1'into the left hand input, whilst sending 'n' into the right hand input, and then we would need to trigger the calculation by sending a bang into the left hand input. It is a lot of work for a simple result!

Which is why Max provides a shortcut. You put '!/ 1.' inside the maths object, and any value of 'n' that you feed into the left hand input will give the result for '1/n'. Easy, yes, but confusing to beginners in Max, and this notation still makes me stop and think even after years of using it. Anyway, if we process the number of [X] selectors that have been set with a '!/ 1.' maths object then we get the '1/n' value that we want. Here's the Max patch:


So we finally have a relatively neat way of carrying out a '1/n' maths operation, although the '!/ 1.' inside that Max object still forces me to stop and think. Anyway, we now have a 'volume compensation' object that works for three inputs, and it can be extended for additional inputs relatively easily, with the main processing done by the '!/ 1.' object to carry out the '1/n' operation, and the hardest bit of extending it is finding a way to determine the number of [X] selectors that have been set - as you can see above, for just three selectors there are a lot of objects used to produce the value of 'n' that is fed into the '1/n' maths object!

Clutter Minimisation

You may be wondering why I have the 'selpan_mr' object there at all, since it just serves as a way of lumping all of the volume compensation into one place. Well, it is my ongoing attempt to try and tidy up my Max/M4L patching!

In the past, some of my Max/M4L patches have been a little untidy, and I have tended to put all of the objects at the same level. I'm now trying to do things in a more structured way, and one of the techniques is 'encapsulation', where you hide away stuff that isn't required. The 'selpan_mr' object is a perfect example - at the highest level, you need to know that there are three [X] selector switches that route the delay outputs to the auto-pan sections, and that is all. The details of the volume compensation are fine hidden away inside the 'selpan_mr' object. So here's another example:


At this level, we have the three delays on the left-hand side, and the delay time, feedback and cross-feedback rotary controls for one of the delays on the right hand side. Notice that the rotary controls are connected directly to the delay object ('p delayer'). But what is inside the 'p delayer' delay object?


Inside the 'p delayer' object is the standard M4L 'delay~' object from Cycling'74, but also a lot of maths objects that do all of the scaling and smoothing (using the 'line~' object) for the rotary controls. If all of these maths objects were on the higher level, then the three delays would not have been as obvious, because there would have been lots and lots of other objects everywhere. But moving the processing for the rotary controls into the 'p delayer' object, then the higher level shows the high level signal flow through the 3 delays, and this is not obscured by lots of objects just to get the rotary controls to have the right values.

Topology

Hex Echo enables quite a few different configurations of the six delays, so here is a quick guide to them:

1. Three delays in series




2. Three stereo auto-panning delays




3. Three delays in parallel, and in series




4. Three delays in parallel, and in series, and with stereo auto-panning per delay




Because the two channels are separate, then you can have different arrangements of the delays and the panner in each channel. The 'cross' feedback from one channel to the other can be quite confusing if you have different arrangements, and it can be quite hard to figure out what is where. My recommendation is to use the [X] selectors to turn off signal routings and to gradually turn them back on, one by one, so that you can hear what is happening. The two pairs of vertical signal meters on either side of the panner section can also help you to figure out what is happening to the audio signals.

Six delays?

In the MaxForLive.com page description text, I mentioned '6 delays in series'. Here's how to do this:


The setup is very straight-forward - you just toggle the 'Cross Recycle' controls and set the associated rotary controls to less than 50%. (Otherwise you will get runaway feedback) The output selection for just the final delay means that you get only to hear two 'composite' delays, the first three in series for the first echo, then the second three in series for the second echo. The 'Cross Recycle' feedback will keep going round, so it can sound like more than 6 delays! Here's a diagram of the routing...


If you want to hear all of the echoes from the six delays, then you just toggle the delay selectors:


Which gives this audio routing:


So if you set each of the delay times to a different value, then you can get some interesting time patterns. Suppose you set the Left channel delays to 100, 200 and 300 ms, and the Right channel to 400, 500, and 600 - For an auto input in the left channel, then the echoes will be at 100, 200, 300, then 400, 500, and 600 ms intervals, whilst for an auto input in the Right channel, then the echoes will be at 400, 500, 600, then 100, 200, and 300 ms intervals. If you have the pan controls set to hard left and hard right, then this is quite a lot of ping-ponging across the channels!

Setting pan position

Setting the pan position might seem difficult, because there is only an LFO 'Rate' control. But this control goes all the way down to almost zero, which effectively 'stops' the LFO. So to set the pan position to anywhere you want (like hard left or hard right, or anywhere else you want), then you just do this:

1. Move the LFO 'Rate' rotary control about half way (the pointer will be vertical).
2. The Pan indicator 'block' will start to move back and forth horizontally.
3. Move the LFO 'rate' rotary control back to fully counter-clockwise when the indicator block is where you want it.

In pictures:




Once you have the pan positions set as you want them, do a save to one of the memory squares on the right hand side of the device. (Click on a square whilst holding the 'Shift' key down...) That way you always have the positions ready and waiting!

Applications

Hex Echo can be used for ordinary echoes, but the parallel/series modes and the 'per delay' feedback controls make it very good at the sort of 'cluster' echoes that you get as 'early reflections' in reverbs, especially if you have different delay settings for the two channels. Another thing to try is to set two of the delay times short, and one long (up to 2 seconds), which can be quite unusual because most ordinary echoes don't have three delays in series... The 'Recycle' feedback goes from the output of the three delays all the way back to the input, which is a total of six seconds of delay to work with (or 12 if you 'cross' it over to the other channel.

If I can find the time, then I will try to put a video together, but this takes a lot of time to do properly...

Getting Hex Echo

You can download Hex Echo for free from MaxForLive.com.

Here are the instructions for what to do with the .amxd file that you download from MaxforLive.com:

     https://synthesizerwriter.blogspot.co.uk/2017/12/where-do-i-put-downloaded-amxd.html

(In Live 10, you can also just double-click on the .amxd file, but this puts the device in the same folder as all of the factory devices...)

Oh, yes, and sometimes last-minute fixes do get added, which is why sometimes the blog post is behind the version number of MaxForLive.com...

Modular Equivalents

In terms of modular equivalents, then the Hex Echo obviously requires three delay stages, plus some switching, and a utility/attenuator for the recycle feedback, giving a total of about 5 ME. One of the things that I have noticed with the current generation of Eurorack modulars is that many people do quite a lot of post-processing on the audio, and I have seen quite a lot of multi-delay echoes being used. So an interesting side-effect of Hex Echo is that it can make Ableton Live sound more like a modular, which might be useful to some people. I count myself as one of those, because I have always tended to fall into the 'Trent Reznor' grouping where if people can tell how your sound was made, then you aren't trying hard enough.