Thursday, November 02, 2006

Powerbook in limbo

Just a short note for people wondering where any new posts are - my Powerbook has suffered an unfortunate disk corruption and refuses to boot, so I've been trying to get it sorted out, without success so far.

As soon as I can recover what I need, I can trash it and reinstall everything from scratch, and I will resume posts.

Sorry for the inconvenience in the meantime...

Saturday, October 21, 2006

Transforminating... Part 3

So hopefully by now, if you've been following along with our transform tutorial you should have a fairly good idea of how to select events. Onto transforming them!

Ok, we already know that the top line selects the events we want to process, and the bottom line the tells Logic what we want to convert them into.

Let's again start off with a simple example.
"We want to convert MIDI controller 7 events into MIDI controller 11".

So, we set up the top line to select the events we want to convert - the controller 7 events. Now, by default all the bottom Operation line parameters are set to "Thru", which means that Logic will perform no change to that parameter.

What we want to do is change the "-1-" value, the controller number, from 7 to 11. In the "-2-" column, we choose "FIX", to change the second data value to a fixed number, and specify 11.

Now when we hit "Select and Operate", Logic will select all controller 7 events, and change the controller number to 11, with the end result being that all our controller 7 data has now magically transformed into controller 11 data. Neat!

We aren't just limited to changing values of similar MIDI events either, we can practically transform any MIDI events into any other MIDI events - changing program changes into notes, notes into controller data and so on. Follow the same procedure - select the events you want to process using the top line, and select the events you want them to result in on the bottom line.

Ok - up until now we've skipped over one part of the transform window, the large-ish flip menu above the selection line of parameters, and this influences the behaviour of the transform operation:

Apply Operations to selected Events

This is the default Transform behaviour, and works as we'd expect. Any selected events are transformed according to your criteria.

Apply Operations and Delete unselected Events

This works the same as above, but with one extra step - any events that *don't* match your selection criteria are deleted. So if you are selecting all G#3 notes in a region, in order to change their velocity to a fixed value, using the Transformer in this mode would modify your G#3 notes, and delete all other data, leaving just the modified G#3 notes.

Delete selected Events

This mode ignores the bottom condition line, and just deletes anything you select. So if you wanted to delete low velocity and very short MIDI notes, use the selection criteria to select short, low velocity notes, and when you click "Select and Operate", all notes that match the criteria will be removed, leaving the rest of the MIDI data intact.

Copy selected Events, Apply Operations

In this mode, any selected events are first copied, before being transformed. So if we selected all G#3 notes, and added 12 to the note value to transpose them up an octave, in this mode the G#3 notes would be copied and transposed, leaving the original G#3 notes intact, and extra G#4 notes at the same positions.


Just like the selection line has a range of conditions, the operation line has a range of options to fix, scale, add, map, reverse, randomise and otherwise mathematically modify MIDI event values, and as there are quite a few of these, I'm not going to list and explain them all here. Some are relatively simple, such as "FIX" and "ADD", while others are a little more complex. We'll see how these are used in some examples - and as back in part one we said we'd take a look at the factory transform sets, let's use those.


Selecting "Crescendo" from the transform set flip menu at the top, you'll see the following (Hide unused parameters is checked, so only the parameters that do something are shown, the rest can be assumed to be set to "All/Thru".)

The Position is set to the first four bars by default. You change these values to correspond to which bars you want to process. We are selecting all notes between the specified bar positions, and applying the Crescen. operation on the note velocity (the "-2-" data value of notes), between 1 to 127 (you can change these if you want the crescendo to be performed using a different velocity range.)

So, the result of this transform is that all notes within our specified bar range will crescendo evenly from 1 to 127.

Scale 14bit Pitchbd

This is a pitchbend scale transform, to scale down pitch bend data.

Double Speed

In this set, note positions and note lengths are divided ("Div") by 2, resulting in all notes playing twice as fast.

Half Speed

Similar to Double Speed, but this time the note positions and note lengths are multiplied ("Mul") by 2, to lengthen the notes and positions, resulting in half time playback.


Again, this is only looking at note data, and is randomising ("+- Rand") the note position, note velocity and note length. The random amount is set to 10 in each case by default, so each of these note values will be changed by a random amount between plus or minus 10 of the original value. This results in a slightly looser sequence, especially useful if you're entering notes directly into Logic, or you're very used to using very strict 1/16th hard quantising.

Reverse Position

Once again, this is looking at notes only, and is reverseing ("Reverse") the position between our selected bar range - as a result, all notes in this range will be repositioned to play backwards. This can be quite interesting with drum pattens or melodies, if you are looking for cheap inspiration.

Reverse Pitch

This one is using the "Flip" function to flip around the pitches of notes, based on the C3 note.


A really simple transform set that adds an offset to all note pitches. Change the note offset value to whatever you need before running the operation. 1 is a semitone, 12 an octave, and you can specify negative values as well to transpose downwards.

Exponential Vel.

This one lets you scale your note velocities exponentially, which can be useful to combat the velocity curves of your master keyboard, or to scale the velocities of notes from MIDI drum pads to match your drum sounds.

Velocity Limiter

Using the "Max" function on the note velocity, any note velocities lower than 100 will be left alone, and any velocities over 100 will max out at 100.

Fixed Note Length

This is quite useful for drum programming - it will "FIX" the note length to whatever value you specify, so you can quickly set all notes to be very short, for example.

Maximum Note Length

Similar to the previous set, this one uses the "Max" function we've already seen, but this time on the length value, so any notes greater than the note length specified will be reduced to that length.

Minimum Note Length

The same thing, but this time using "Min" to specify the shortest note length - any notes shorter than the specified value will be lengthened to this value.

Quantize Note Length

This setting quantises the note length, rather than the note position that the regular quantize function does.

Now, all these settings are fairly simple, but I recommend you set up your own transform sets to suit your workflow, and store them in your autoload song so that they are always available.

One feature we haven't covered yet - have you noticed the three little black vertical lines between the Channel, -1- and -2- columns? This is showing us that each column will be mapped to the column immediately underneath it, but clicking on each line lets you change which column that value is mapped to.

Consider the following example:
"We want to convert notes into controller 7 volume data, where the note pitch becomes the volume value."

Because we need to map the note pitch (the top -1- column), to the control 7 value (the bottom -2-) colum, we need to click the third vertical line so it looks like this:

In this way, we can perform quite complicated transformations of our MIDI data, in ways which would otherwise be impossible or extremely time consuming to do manually.

Note that you can access all your transform sets directly from within any of Logic's editor windows, such as the Event List, or the Matrix Editor.

So, here's some ideas of practical uses of the transform window. Have a think about how you would implement these as transform settings, and better still, try them out.

1) Delete all controller data

2) Set notes to incrementing MIDI channel numbers between 1 and 8, to route each subsequent note to a different part on your multitimbral softsynth (and thus rotate through different sounds)

3) "Burn in" recorded volume data into the notes velocities instead

4) Add an octaved echo of all notes between C3 and C4 a beat later

5) Delete any short or low velocity notes

6) Reduce the lengths of notes longer than 2 bars to 2 bars

7) Transpose any notes below the range C3-C6 up an octave

8) Scale modulation controller data from 1-127 down to a 1-70 range

9) Randomise the positions of notes by a couple of bars

10) Scale the range of a melody by 0.5

11) Fix all notes to C3 (eg. to trigger a replacement drum sample)

12) Randomise note pitches by up to an octave

13) For notes with velocities between 1-30, add 30 to their velocity

14) Reverse note velocities so loud notes are quiet, and quiet notes are loud

15) Flip the modulation controller so that the mod wheel fully up produces 0 and fully down produces 127

16) Quantise notes that are within 20 ticks of the downbeat only

Hopefully you can see now that the Transform window is a great tool that has lots of practical applications.

- Selecting events
- Deleting events
- Converting events into other events

Next time we'll take a look at the Transformer Object in the environment, how it differs from the Transform window, and where you should think about using it.

Further reading: Logic Pro 7 Reference Manual - Chapter 17, page 587.

Wednesday, October 18, 2006

Transforminating... Part 2A

Quiz Answers

So how did you do? Feeling confident? Let's have a look at the answers - score a point for each one you got:-

(2) Select all notes on MIDI channel 5-8, except C#3 in a region

Fairly straightforward, you should not have had any problems with this one.

(3) Select all program changes of less than 32, but only when they are at the start of a bar (the downbeat) in all regions in your song

The key to this one is the Subposition field - events will only be matched if their position is on the down beat on every bar. Notice that, although we've set "1 1 1 1", the Subposition value refers to one bar only, so it would match events on "1 1 1 1", "14 1 1 1", "137 1 1 1" and so on. If we'd set the *Position* to "1 1 1 1" instead of using the Subposition, it would only have matched if the position of any event was "1 1 1 1", and *not* "14 1 1 1" etc.

Note that Program Changes have no "-1-" value, and the "-2-" is the actual program change number.

(4) Select all D#4 notes that have a velocity lower than 10, between bars 32 and 48 in three regions

In this case, we want to limit our selection to a range of bars, so we use the INSIDE condition for the Position value, and set the bar range we want.

(5) Select all notes that have a length less than 20 ticks, and velocities of less than 20, that are outside the note range C1 to C6, in all regions

Again, should be fairly straightforward.

(6) Select all F#2 and G#4 notes with a velocity that doesn't equal 64

Ok, this last one was a bit of a trick question! ;)

As we've got *two* condition requirements (select F#2 notes, and select G#4 notes), you can't do it in one transform operation. So you'd need to select the F#4 notes the first time, then run it again for the G#4 notes while SHIFT-clicking on the "Select only" button to add the G#4 notes to the selection.

So the complete answer is:

Ok, I kind of lied. Actually you *can* do this in one transform selection, using our obscure method we mentioned in the previous tip. If you got this, then you get an extra 5 bonus points - well done, you clever sod, you're thinking like a true Logician! ;)

Using our "Map" selection condition, set to the range of notes between our F#2 to G#4. In the actual map, all values inside this note range are mapped to 0 (which is a note outside our range), except our F#2 and G#4 notes, which are mapped to themselves (note numbers 54 and 80 respectively). And as only these two notes are in the mapped range we specified, only those F#2 and G#4 notes will match, and all other notes won't match.

If you got them all, or slight variations that still work, well done, you're well on the way to complete transform mastery!

Come back for part 3 where we'll move on from using the Transformer to select events, to actually transforming them...

Further reading: Logic Pro 7 Reference Manual - Chapter 17, page 587.