Showing posts with label M4L device. Show all posts
Showing posts with label M4L device. Show all posts

Friday, 10 July 2020

16 steps is not Old School...

The Liverpool Empire theatre - a classic rock venue in the North of England (which is kind of in the middle of the UK, curiously...). The 1970s. An impressionable teenager goes to see Tangerine Dream. Dry ice, mist curtains. LOUD! Edgar Froese does a guitar solo and maybe, almost maybe, acknowledges the headbanging crowd of long-haired, bejeaned youths. The lasers are turned on the mirrorball and the audience gets the full 'spoke effect'! Oh, and there's a lot of 8-bit sequences. Yep, that was me. It was a very different world to the one we inhabit now.

Different? Well, we have 16-step sequencers now, and so it gives me great pleasure to announce the release of MIDIdifferentTWO16, which doubles the number of steps, shuffles and skips, turning the 'Old School' 8-ness into 21st Century 16-ness. Oh, and we now have DAWs, and putting a sequencer inside a DAW is allowed. Oh yes, is it allowed! Dit dit dit dit boom tizz dit dit boom tizz dit dit... (Did you know that Zang Tumb Tumb came much earlier, as well as later, as ZTT...)

16 steps to heaven...

There's a hidden difference in this dual step sequencer from version 0.07 of the 8 bit original. It now has two rotary controls to set the lengths of the sequences. The previous version used up/down nudge buttons and looked cool. I loved it (or I lived it, as my iPhone auto-corrects it to). But then I realised (sinking stomach) that it was tricky to map what Ableton call a 'control voltage' to the Step Length, because I had used the live.tab object to implement the nudginess. Rotary controls are sometimes better!

8 steps to heaven..
And yes, I do know that Ableton's MaxForLive developer guidelines do say that devices should not be wide! But my Probably sequencer is way wider than either of these...

The Advert


Hopefully, by now, this style is starting to take on a life of its own. I've made quite a lot of versions of this infographic up to now, and there are more on the way...

Getting MIDIdifferentTWO16

You can get MIDIdifferentTWO16 here:

     https://maxforlive.com/library/device/6443/mididifferenttwo16

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 implementing MIDIdifferentTWO16 is just two step sequencers, giving an ME of 2 if you can find 16-step sequencers, or 4 if you can only find (or afford) 8-step. It all depends on how GAS affects you, I suppose. The ability to control step values and skips may vary with the specific sequencer, but if implemented, then it is just more patch cables. As I said for the 8-step version: perhaps MEs should also include some sort of measure for the number of patch cables that are required?

---

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


Synthesizerwriter's StoreSynthesizerwriter's Store
 (New 'Modular thinking' designs now available!)









 

Wednesday, 8 July 2020

Note Count Processor in Max For Live for Ableton Live

After I described the 'Triple Transposing Delay' with three different ways of connecting the delays together, as 'experimental', people seemed to like that, so my latest release is 'extremely experimental'!

Although it isn't a reliable guide, I've not seen anything like MIDIoneOF before, although, of course, you could do some of it using clip envelopes. In fact, I reckon that you can do almost anything by using clip envelopes, and I'm sure that those people who produce YouTube videos with apparently click-attracting titles like: 'Powerful Advanced Generative Techniques For Ableton Live', in huge white block capitals will be busy making yet more of those videos as I type, although they don't seem to use clip envelopes... When I did release a YouTube video on using Clip Envelopes, it got a wonderful review (Thanks, Darwin!) and over a hundred views, so maybe I should make some more...

MIDIoneOF


MIDIoneOF is the first of a series, because people seem to like it when there is more than one of something, and actually that's part of where the name comes from. I wanted to called it 'n of m' because it is based on permutations and modulo arithmetic, but mathematical notation like 'n of m' isn't very good for naming Max For Live plug-ins, and 'Nofm' sounds like onomatopoeia for eating food, rather than a cool M4L device. So 'One of' got the most votes, and may well be followed by 'Two of' when I have time to finish it. (I have no idea what the third might be called...) Me? Busy? I've been doing several major projects over the last few months (the TR-505 was just one of them) and I can't talk about some of them, but they might even see the light of day at some time. Over the years, I've become rather used to doing stuff that never has the media spotlight turned onto it, and I'd probably be surprised now if a glimmer of limelight ever appeared on any of my stuff. But hey, It means that sometimes I can hint abut something rare and unusual!

(*) MIDIoneOF counts notes as they arrive at the input, and then processes those notes in various ways. The main process is muting: you can set notes to be muted depending on two criteria: the note count length (from 2 to 16 notes), and the 'Mute Pattern' which you can set in the 16 light purple boxes (although you can only set ones which are within the note count length!).

The Mute buttons mute the note if they are grey, but let the note through if they are light purple, by the way.... 

So if the note count is set to 7 notes, then you can set mutes for note counts between 1 and 7 notes. There are 'Speedup' buttons to set all the mutes on ('AllOn') or off ('AllOff'), as well as a random selection.

The muting affects the notes as they pass through the device, and all of the timing is derived from those notes... Despite appearances, the mute buttons are only indirectly connected to the timing transport of Ableton Live - and if you don't quantise your notes, then there's no real connection at all. So what may look like a simplistic rhythmic accenting utility isn't quite that at all... It may look like a step sequencer, but the steps are the notes, not the transport timing. It's kind of a step sequencer turned inside out...

This is probably a good time to revisit the start of a previous paragraph (*). When I say: 'as they arrive', I mean that if you have a clip with 8 notes in it, then MIDIoneOF will get those 8 notes, and will process them in the order in which they arrive. So if the note count length is set to 7, then the first 7 notes will be processed (and muted or not, depending on the settings of the numbered buttons in the Mute Pattern. The eighth note will then be processed as the first note of the second set of 7 notes, and MIDIoneOF will continue processing in groups of 7 notes, until you stop Ableton Live.

The clip (or live playing) can include single staccato notes, legato notes, or chords, although there are limits to the speed and quantity of notes which it can deal with! Remember that I did say: 'Extremely experimental!'. Note also that this behaviour isn't what you probably associate with a step sequencer, but as I said, this isn't...

The second bit of processing is the 'AutoRandom' button, which saves you from the effort of clickng on the Mute buttons. You set a number (between 2 and 16 - a motif in this series) and after that number of multiples of note counts (so every n x 7 notes in the example I have used so far), the Mute buttons will be randomised. Properly random, and not one of those 'tailored randoms to make random more suited to human beings', so you can have everything muted, nothing muted, and these can repeat several times. Real random is like that, although in a lot of modern software it has been 'tailored' to suit people's expectation - the classic example is iTunes, where the Shuffle function does not play the same track twice, even though a random selection might play it twice, or even thrice, or even... It seems that people report it as a problem if a random shuffle plays the same thing twice... So you set the number of multiples of the note count length, and click on the 'AutoRandom' button, and off it goes. Setting the multiple to 4, 8 or 16 sounds kind of musical, because too much exposure to popular music seems to have convinced many people that everything happens every 4, 8 or 16 bars at 120 bpm in 4/4 time. Since the example so far has been every 7 notes, then try 7 as the multiple and you will find that it might feel slightly early.

The second processing is MIDI velocity. Since the note count and Mute Pattern know which number each note is, then we can do interesting things to the velocity value of the notes. The clue is the 'Rise/Fall' button, and this has an Offset rotary control on the left side, and a Scaling rotary control on the right hand side. Rise increases the velocity value as the note count increases, whilst Fall decreases the velocity value as the note count increases. This means that, as with lots of stuff that I do, velocity matters! You should try MIDIoneOF with an Instrument that is velocity sensitive... The important thing to remember is that the velocity processing happens depending on the note count length, so with the 7 note example and a Fall button setting, then the first note will have the largest velocity value, then the velocity will drop over the next 6 notes to the 7th note, which will be the quietest (lowest MIDI velocity value), and finally, the 8th note will then be loud again, after which it will drop for th next 6 notes, and so on. The 7 note cycle will repeat until you change it.

Note that all of the processing happens based on just the notes themselves. MIDIoneOF takes all of its timing from thosee notes, not from the bars and beats within Live. So if your clip has notes in a complex rhythm, then MIDIoneOF will process the notes in that same complex rhythm. As I said, you can feed your own playing through MIDIoneOF if you wish... And I'm not going to mention Olafur Arnalds here...

The final processing is Probability, which is independent of the note count length! One thing that I have realised is that 100% is not enough, and I'm looking at this to see if there is anything I can do, but adding in extra notes is quite tricky in real time...

There's also the slightly red '!' "All Notes/Sounds Off" button in case you need to stop errant hanging notes. This may well signpost this as an 'experimental' device regardless of how I tag it in MaxForLive.com...

And that's the MIDIoneOF device. Hopefully you haven't seen anything quite like it before... because I much prefer not to repeat things that other people have already done. There have been a lot of Max For Live devices recently which are just people re-making a device which is already on Max For Live. I think that time is too short to waste it re-coding something which is already available!

Inside

I won't bore you with a counter, and I won't bother explaining why the count is from 2 to 16 and not 1 to 16 (1 is the obvious minimum, but it is really boring using a count of one!). Instead, this is probably a good place to do another in the occasional series of 'Things that Max doesn't have a pre-made object for...'

In this case, it's those 'Mute Buttons' that are the source of the problem. To mute the MIDI note when any of the mute buttons are highlighted requires what I call a 'wide' OR function - a 16-input OR gate. This isn't standard in Max...which is not hugely surprising... Now I know that you can use Boolean logic to transform the gate, but as far as I can see,  this doesn't really do anything other than mean that a different 'wide' gate and extra inversions are needed. So what did I do? I made a 16-input OR gate using a tree hierarchy of 2-input OR gates. Yep, I resorted to 'brute force and ignorance' to save time and effort. Sorry.


Two things are probably notable in this sub-patcher. First, there's the left-most input, which sets all of the outputs to zero. I've had all sorts of 'difficult to track down' problems caused by the gswitch object when there's no input on one of the two inputs (This would be a 'floating input' if this was hardware, which it isn't...), and so this ensures that that won't happen. Second, there's my standard 'use a blink to make both inputs trigger the output' approach, which enables the ORs to ripple downwards from either side. I'm sure there's a better way to do this whole 'Wide OR' functionality, but I have't had a flash of inspiration yet... It works well enough for my purposes.

Links

YouTube video on using Clip Envelopes - Features Clip Envelopes - in a video!
All Things Modular - Inspired by Modular - Darwin's blog has some interesting posts in it! Including this one where it refers to the above video on clip envelopes.

Getting MIDIoneOF

You can get MIDIoneOF here:

     https://maxforlive.com/library/device/6436/midioneof

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... and pictures may not always be the current version... but Schrodinger's cat's status is permanently uncertain...

Modular Equivalents

In terms of basic modular equivalents, then implementing MIDIoneOF in a modular synth is just a step sequencer (or a ring counter in old parlance) driven by gates or triggers instead of a clock, some toggle switches for selecting the steps, and some velocity processing in a CV utility. About 5 modules by my count, giving an ME of 5. I hope that this blog post makes more people think about pulling out that patch cable from the clock input of the step sequencer and connecting it to a gate instead of an LFO or a Clock Generator. Modulars synths have cliches too! 

---

If you find my writing helpful, informative or entertaining, then please consider visiting these links:


Synthesizerwriter's StoreSynthesizerwriter's Store (New 'Modular thinking' designs now available!)




















   


Thursday, 9 April 2020

Completing the 'Smooth' Suite - Max For Live plug-ins for Ableton Live

It started with MIDIrandomA, which provided several different type of 'constrained randomness' triggered by either MIDI events or a built-in LFO, and then allowed it to control parameters in other Ableton Live devices using what they call 'remote control' but most people associate with the 'Map' button. Blog reader hems suggested that it would be good if this could produce more than one mappable output, which is how MIDIrandomABC was conceived. But then, after further reflection,  the smoothing function that happens in MIDIrandomA seemed to be useful in a broader context, and so I produced MIDIsmoothR, where you can input any 'control voltage' rather than solely random noise, and so smooth/process any LFO or MIDI Controller...


However, MIDIrandomA and MIDIsmoothR are big, complex, flexible, versatile Max For Live devices. They can be daunting for a new user because there's a lot to tweak! So although MIDIsmoothRRR with three mappable outputs was an obvious follow-up, it seemed like this was a good time to also release the opposite: simple, minimalistic utility devices that just do the 'smoothing' function, plus offsetting and scaling. And so, the 'Smooth' Suite was born:

- MIDIsmoothR - single mappable output, sophisticated 'control voltage' smoothing and processing.

- MIDIsmoothRRR - three mappable outputs of sophisticated 'control voltage' smoothing and processing.

- MIDIsmoothY - single mappable output, smoothing only.

- MIDIsmoothD - just a scrolling display of the 'control voltage'.

- MIDIsmoothYD - single mappable output, with the scrolling display in the background.

These last four devices complete the Suite. MIDIsmoothD allows any 'remote control' 'control voltage' to be viewed graphically, and MIDIsmoothY is small and easy to use. For those people who like stuff to look cool, then there is MIDIsmoothYD's scrolling background.


In the (imperfect!) screen capture above, the LFO waveform is sent to the three 'Smooth' Suite devices: first MIDIsmoothY, then MIDIsmoothYD, and finally MIDIsmoothD.

MIDIsmoothRRR

MIDIsmoothRRR doesn't just add two extra mappable outputs. The B and C processing channels are augmented as well, so there's quite a bit of divergence from the MIDIrandomA original.



The B channel now has separate 'Thin' power-law controls for the Up and Down segments of the waveform, unlike the 'affects both segments' 'Thin' rotary control in channel A. You should explore the way that the Up and Down smoothing controls and the associated Thin rotary controls affect the output waveshape - note that the two pairs of controls work (mostly) independently.

The C channel now has a 'Thin' power-law rotary control added after the 'Delta' rotary control. The Delta control removes any samples in the waveform that are less than the set value, which isn't immediately obvious if you use a triangle or sawtooth input waveform, so it is very different to the A and B channels - the scrolling doesn't happen at the same rate because of the missing samples, for instance.

The design of the processing in the three channels is deliberately very different. As with the original MIDIrandomA, I wanted to provide three very different outputs with as little overlap as possible. As a bonus, you also get two new variations on random-ness in channels B and C when you replace the 'Input' with 'Random'.

Map

Here's a simple infographic showing all of the members of the 'Smooth Suite':


In use


The screen capture and diagram above shows a LFO controlling the 'CV in' rotary control of MIDIsmoothRRR via 'remote control' mapping. The triangle wave is turned into a rather nice 'shimmery flame' waveshape by the B channel, and this is then sent to the MIDIsmoothD device to display it.

There's an additional 'hidden in plain sight' function in R, RRR, Y and YD: if you don't map the 'CV in' rotary control, then you can use it as a controller to produce processed outputs to control othr devices. Just click on it and move it!

Documentation

There was one previous blog post covering the first device in the 'Smooth Suite' - MIDIsmoothR. But this was a variant of an earlier series of devices: the 'Random' series.

MIDIsmoothR

MIDIrandomABC

MIDIrandomA

Downloads

In the past, I produced a 'dark' and 'light'-themed UI version of a delay effect, just to see which was more popular. The downloads so far (to 10th April 2020) are:

                   Dark       Light
KeyMon              400         348
Field Echo         1293         870
Sine3Generator      941         629
SpecD/PanEcho      1371        1225

For the 'shim' 'Smooth Suite' utility devices, the initial downloads indicate that the 'bare-bones' MIDIsmoothY is the most popular, then the 'background display' MIDIsmoothYD, and the 'display only' MIDIsmoothD has had the fewest downloads. Of course, none of these come close to one of my devices, which has had no downloads at all, ever!

Getting the devices in the 'Smooth' Suite.

You can get MIDIsmoothR_mr02 here:

     https://maxforlive.com/library/device/6116/midismoothr

You can get MIDIsmoothRRR_mr02 here:

    https://maxforlive.com/library/device/6127/midismoothrrr

You can get MIDIsmoothY_mr01 here:

    https://maxforlive.com/library/device/6129/midismoothy

You can get MIDIsmoothYD_mr01 here:

    https://maxforlive.com/library/device/6132/midismoothyd

You can get MIDIsmoothD_mr01 (the display only) here:

    https://maxforlive.com/library/device/6130/midismoothd

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 implementing MIDIsmoothR_mr02 requires some quite sophisticated processing of a random noise source, so it probably isn't straightforward to do from off-the-shelf analogue modules, and is probably easier to do digitally. Assuming that a maths/data processing module can do the required computation, then there's one noise generator, one processing module, some triggering logic, an LFO for the free-running version, and a sequencer for parameter storage, giving an ME of 4 or 5!

MIDIsmoothRRR is just additional CV scaling and offsetting, plus two more patch cables! So an ME of 7.

MIDIsmoothY, MIDIsmoothD, and MIDIsmoothYD require only three modules: a slew rate limiter, a CV scaler and offset processor module, and an oscilloscope module. So the ME is 3.

---

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




Sunday, 5 April 2020

Three Mappable outputs of controllable Random-ness in Max For Live for Ableton Live

Comments are always interesting - once you've filtered the spam and adverts out, of course! So when blog reader hems reminded me in a comment that having just one mappable output in RandomA was quite limiting, it nudged me into a new variant of MIDIrandomA...


MIDIrandomABC has three separate mappable outputs that can each be assigned to any of the three built-in types of randomness: called A, B, and C for brevity. So you can now control three parameters in Ableton Live with the same value, or an inverted version, or a scaled and offset version, etc. This enables lots more control over what you randomise and how!


One application that I've been playing with (I've watched too much Ricky Tinez videos on YouTube) is to control the delay time for left and right channels separately in the stock Ableton Live 'Delay' plug-in (other delays are available) as well as the feedback amount. Using the 'Any Note' mode, then the random vlues change for each note event in a clip, and so you get 'per note' changes to delay times and feedback. This sounds really rather nice - the sort of variability that tends to be more associated with modulars than DAWs... I can see that I will have to do a SoundCloud track and YouTube video when I have a moment...

Getting MIDIrandomABCmr02

You can get MIDIrandomABCmr02 here:

     https://maxforlive.com/library/device/6110/midirandomabcmr02

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 implementing MIDIrandomABCmr02 requires some quite sophisticated processing of a random noise source, so it probably isn't straightforward to do from off-the-shelf analogue modules, and is probably easier to do digitally. Assuming that a couple of maths/data processing modules can do the required computation, then there's one noise generator, two processing modules, some triggering logic, an LFO for the free-running version, and a sequencer for parameter storage, giving an ME of 6 or 7!

---

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:

Saturday, 8 June 2019

Spectral Hex Ping Pong Delay in MaxForLive for Ableton Live

After playing around with various Ping Pong Delay-like devices for a while, I realised that my 'Hex' template was a good place for experimenting with multiple delays, so I took the internals of the AUDpiPOde device and put it inside the 'hex' device template (six times). The result is AUDhexPPD, where I'm abbreviating ping pong delay to PPD to save characters.

AUDhexPPD


Because AUDhexPPD is another 'wide' device, then here's just the left hand side:


Going across the left to right, the input indicator shows the incoming audio signal (and yes, this does duplicate the tiny meters in-between devices), then the Ping Pong Delay block, with the 'Note value time delay' button grid, followed by the 'Unsync' time tweaker, the 'LR swap' output channel allocator, the 'f' delay freeze button, and the Feedback rotary control (which is individual to each PPD block).

The next block across to the right is the middle block: the three-band 'spectral' filtering, which just gives three outputs via low-pass, high-pass and band-pass filters. Unlike the usual 'crossover' filters that you get in some 'spectral' devices (or loudspeakers, now that I think about it), these filters have a Resonance rotary control, which gives the device the ability to colour the sound, so maybe it is more than just six delays.

Finally, on the right hand side, there is the 'Auto-pan' block, which has an individual meter per audio processing block, the 'X' Active/Muted switch (as per all of the 'hex' devices, and a few others of mine), the new 'Pan Position and LFO Modulation' UI widget that I introduced recently (move the white 'thumb' down and horizontal for pan position, and up for LFO modulation), and finally the LFO Rate rotary control, which goes from very slow to not very quick, but then it is a modulation control and audio rate modulation of pan position is not something I'm a great fan of...

On the far right-hand side, there are the usual memory buttons (Click to recall, Shift-click to save (red when empty, grey when filled)) and the Dry/Wet rotary control, followed by three 'common' controls which affect all of the six audio processing blocks: Feedback, Resonance, and Freeze. These just make it easier to alter all of the six audio processing blocks at once!


As usual in the 'hex' devices, the right hand half of the front panel is mirrored, which looks interesting, and makes it very clear that this is a stereo device. Just repeating things twice can make it look like they are arranged in series... There isn't a perfect solution for this, but this way works for me, and it isn't too hard to flip one half if you need an unmirrored custom device...

MaxForLive

So, what's interesting in the M4L code for this device? As I have mentioned previously, I prefer stereo in and out for my devices, and this is normally done with pairs of mono in and mono out devices where the output can be panned across the stereo image... However, each of the 6 audio processing blocks in AUDhexPPD is a tapped delay with a mono input and stereo outputs, and so instead of having one output that needed to be panned, then I had two - and for a ping pong delay then these two outputs should be in the Left and Right channels (or vice-versa - which is what the 'LR Swap' button does). But with two outputs then I needed two auto-pans, and so the obvious answer was to have two auto-pans in anti-phase, so that when one output was on the Left, then the other would be on the Right. 'Dual anti-phase auto-panning' isn't a very catchy description, so I'm going to call it 'Helicopter' mode, because the two pans circle around each other rather like the blades on a helicopter...


Yes, I could have changed the balance between control values and audio signals in this - so the 'snapshot~' and 'sig~'could have been removed from the panning part, but then I would have had to add them back in to the LFO Depth and LFO Out to get control values. This way works for me...

Alternatively, I could have had two SEPARATE auto-pans for each of the two outputs: one LFO for Left, and another LFO for Right. This would have required a doubling of all of the controls in the centre 'panning' block, and would have made the device even wider! (and more complex to use) I decided to go for the simpler solution and leave the 12 pan LFO version for another time (Maybe in an 'mc' version as a way to explore this new feature of Max 8!)

The Max code just inverts the (0 to 1) control value for the multipliers so that the two inputs are affected in opposite ways. Remember that the audio inputs are called 'L' and 'R' because this is the convention for ping pong delays - the first echo comes from the Left channel, then the next from the Right channel. These are not the main incoming audio channels to the whole device - each audio processing block has a mono input and two 'stereo' outputs. So, for each audio processing block, the two inputs are coming from a tapped delay, and so these input signal will be 'bouncing' back and forth between those inputs, and this auto-panning then adds additional pan control on top of that. If you stop the LFO and fix the pan position to Left or Right, then the result is ordinary ping pong echo - where the repeats 'bounce' between Left and Right.

Note that this is the auto-pan arrangement for just one of the six parts in the Pan block. So if you have just one 'X' highlighted and the rest muted, then that ping pong delay will bounce between the Left and Right output channels, panned according to the pan position and LFO modulation as set in that block. If you have two 'X's highlighted (one in the Left half, and one in the Right half), then you have two ping pong delay in parallel - and so the outputs can bounce between the Left and Right outputs independently. If you have all six blocks active, and use the 'triangle' tweak controls to 'unsync' the time delays, then you start to move away from 'echo' and towards 'reverb'-type sounds. The more asynchronous echoes you have, then the more 'reverb'-like the result will be - which, of course, is exactly how real reverb is produced: lots of echoes with different delay times. You 'could' put several 'AUDhexPPD' devices in series, but it is probably going to take a lot of adjusting to get something even approximately like a conventional reverb sound...

Getting AUDhexPPD

You can get AUDhexPPD on http://www.maxforlive.com/library/device/5522/audhexppd

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...

RAM and CPU in Live

This MaxForLive device has six tapped delays, so it will use lots of RAM storage and CPU power - but it is worth it, IMHO!

Effects Rack Equivalent in Live

I haven't tried it, but it ought to be possible to get quite a lot of the functionality of AUDhexPPD with an Effects Rack in Ableton Live, although the UI is not going to be as compact, and it might even be possible to implement the spectral crossovers using the band-pass filters inside Delay (or Ping Pong Delay if you aren't using Live 10.1).


What is interesting is that the limitations of building AUDhexPPD inside Live result in something which is a nice, usable effect, but it isn't the same as the MaxForLive version. Anyway, it was a good exercise in translation, and I'm making it available for free. You can download it from here...

Modular Equivalents

In terms of basic modular equivalents, then AUDhexPPD would require two high-pass filters, two low-pass filters, two band-pass filters, six tapped time delays, six LFOs, six panner, some utility switches, and two mixers, giving a total of about 24 ME. It is interesting that this is also a 'wide' device in MaxForLive!







Monday, 15 April 2019

Spectral auto-panning in MaxForLive for Ableton Live

My two recent MaxForLive audio devices have both been based around having 6 processing sections - hence the 'hex' in their names. But I realised that there was a much simpler device that uses the hex pan section, which could be used in many ways, and this blog post is devoted to it: a hex spatializer!

AUDhexSPATIAL 


AUDhexSPATIAL moves parts of sounds around in the stereo field. That's all. It is quite straightforward, but don't let that fool you into thinking that you can't do much with it.

The input audio is passed through three parallel filters, and then the outputs are auto-panned across the stereo image. The three filters can be used in several ways, but the most obvious way is to use them to split the audio into three separate bands: The high-pass filter outputs the high frequencies, the low-pass filter outputs the low frequencies, and the band-pass filter outputs the middle frequencies.

Each filter output can be panned to hard left or hard right, or can be Auto-panned - controlled by a three position switch: L/Auto/R. But the frequencies of each filter are independent, so there's nothing to stop you putting the high-pass filter below the low-pass, or the band-pass anywhere from low to high.

The filters are there just to provide different blocks of frequencies to the output section where the panning happens. And the three [X] toggle switches allow you to turn the outputs on and off, so if you want to have just the high-pass filter output, then just enable that toggle switch and turn off the others. The two stereo channels are separate, so if you want different filters and pans for left and right, then that is completely possible.

Naming

After a lot of agonising, I have finally decided to use a new and consistent naming scheme for my M4L plug-ins. From now onwards, and if I update anything, then I will strive to use three prefixes:

- AUD for Audio processing devices (aka effects)
- MIDI for MIDI devices (this took ages to figure out!)
- GEN for devices that generate audio

Of course, in an imperfect world, I may not always succeed in trying to be consistent, but I will try. Please let me know if I falter!

Applications

OK, so your imagination is probably your main limitation here. If you want to have the left channel quickly auto-panning the top end of a piano sound, whilst the right channel slowly pans the bass around and both channels have two different resonant filters panning at different speeds, then that's fine.

But there's more. Try putting AUDhexSPATIAL in front of a Ping-Pong Echo, or put it in between two Ping-Pong Echoes... It is very interesting to experience just how complex a simple sequence can sound when it goes through this sort of processing.

Limitations

You can't adjust the panning width directly - adding two extra rotary controls would make the centre section way too big, I reckon. (But let me know if you really want this, and I might schedule a '+' version...) You get full left-to-right panning, or else hard left or hard right. Of course, you could make a rack and use the Utility object to restrict the pan width of multiple AUDhexSPATIALs...

There are only 3 filters and three panners per channel. Making a version with more channels is not in my current plans, and my main concern would be trying to find a way to fit everything into the user interface...

Oh, and the filters are not animated - they are fixed graphics! Sorry...

MaxForLive

Recent blog posts have included details of what is happening inside my M4L devices, and this is no exception. This time, I'm going to look at the three-position switch that has been added to the output section.

Max and MaxForLive have a lot of ways of routing numbers, messages and signals around. There are lots of objects, with names like Gate, Switch, Route, Selector, Matrix, and more. Sometimes the objects that route signals around have different names, and work slightly differently to the objects that route numbers or messages, and they can work slightly differently. It's quite a lot to get your head around, and one of these days, I'm going to try to do a guide (a bit like the one I did on squeezing controls into limited spaces!). But in the meantime, here's the first of a little mini-series where I look at a few interesting ways to route stuff.

The three-position switch does two things simultaneously: it allows you to select between hard left and hard right pan positions, or it selects the auto-pan. These are very different things, although if you look at AUDhexECHO or AUDhexFrequencyShifter then you will see that by slowing the LFO to 'stopped' then the result is fixed pan positions. But that isn't a very practical approach for a three position switch. There is also the complication that the output of the LFO that does the auto-panning is a signal (so it has the yellow-striped connections in Max), whilst the more usual way to control a panner is with numbers, so there's going to be a conversion somewhere.

First off, let's look at the context. Here's the relevant part of the Max code for the audio output of  AUDhexSPATIAL:


And here's the 'pan_mr' object expanded out (this is a cheat to make things clear - in reality, you don't see the controls that are connected to the input ports, but I have removed the ports and added the rotary control and the 3-position switch control to make it obvious how things are connected):


The main audio processing is on the left hand side. Input port 1 (the square box with '1' in it) is the audio signal that is going to be 'panned'. It goes to two signal multipliers (notice the '~' after the '*') that are driven in anti-phase using the '!- 1.' inverter shorthand that I've mentioned before. (The formula inside the object just subtracts whatever you feed into the object from 1, so it really means '1-the_number', and so it inverts the value, so if you put 0 in then you get 1 out, and if you put 1 in, then you get 0 out, and linearly for all other values...). The pan value goes from 0 to 1 to pan from left to right, and so centre is a value of 0.5.

On the far right hand side, you can see how the left and right values re stored in message boxes that are triggered every time that the switch is changed. The 'LED" object with the round circle is a useful way to convert changes into 'bangs' that also shows you what is happening when you are debugging. The '0' and '1' messages that the message boxes output when they receive a bang are converted into signals using the 'sig~' objects.    

In the middle, starting from the rotary control, there is a 'cycle~' object that does the sine-wave LFO function, followed by a bit of maths to get the output into the 0<->1 range that is required by the multipliers that do the panning. The 'scaled and offset' sine-wave is then connected to the middle input of a 'selector~' object, which is a special switch for routing signals. The other two inputs are from the signals from the message boxes. So the selector switch can output:
- a signal representing 'left'
- a signal that is an LFO sine-wave
- a signal representing 'right'


And that's how you can make a three-position switch that has fixed values on two of the settings, and an LFO signal on the other.

Getting AUDhexSPATIAL

You can download AUDhexSPATIAL 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 basic modular equivalents, then AUDhexSPATIAL requires six filters, six LFOs, six VCAs, and a mixer, plus some switching for the fixed pan positions, giving a total of about 20 ME.