K E Y B 0 A R D LUDWIG ALGORITHMIC COMPOSITION FOR THE ATARI ST By Jim Aikin MUSICAL IDEAS I'VE GOT PLENTY OF. What's in short supply is the time needed to shape those ideas into finished pieces. So when somebody comes along with yet another program that will generate raw ideas, I'm skeptical. I want to know how hard the program will be to learn and to use, and how well it will function in a sequencing environment with the gear I've already got. Ludwig, the new algorithmic composition package from Hybrid Arts, looks and sounds quite exciting in its own terms. It will perform a host of unusual operations on raw musical data and play back the results as a MIDI performance. In terms of ease of use and integration within an environment, it's merely adequate, not spectacular. If Ludwig were a prototype for a program that was going to have some new features added before its release, we'd be ecstatic. It stimulated us to think of lots of musical textures that we might never have considered if we hadn't taken it out for a spin. But it isn't a prototype, it's a finished product, and we're told that Hybrid Arts probably won't put version 2.0 onto the agenda unless sales of the first version warrant it. Given the amount of competition these days in algorithmic music generators, they may be looking at an uphill fight. Overview. More than anything else, Ludwig resembles a drum machine that went to Mars. Not that it's limited to drum sounds, you understand. It will play up to eight channels of MIDI notes at once. But like a drum machine, it makes music by stringing together short patterns. The Mars part comes in because Ludwig doesn't simply play back the patterns; it allows the user to transform them in very complex ways, using commands called "operators." An entire piece could conceivably be built up by putting a single simple pattern through dozens or hundreds of different transformations. The program can contain up 1096 pitch patterns and 96 rhythm patterns. Each of these can be a maximum of 32 events long. (A pitch "event" can consist of a single MIDI note or a chord. The chords can contain up to 16 notes each, but these must be contained within a span of a minor tenth-an odd but workable limitation.) Thirty-two events may not seem like much, but if you need longer patterns you can always string two shorter ones together. We found that even patterns of five or six pitches and seven or eight rhythms produced more possibilities than we had time to explore. The patterns can be strung together in eight simultaneous parallel tracks, each with its own MIDI channel. Each track can be a maximum of 1,024 "cells" long, where a cell contains either a pattern or an operator that transforms the pattern in some way. Actually, it's a little more tangled than that: Each track has both a series of pitch cells and a series of rhythm cells. The two series within an individual track play back concurrently, and both are required in order to produce music. That should be obvious-the pitches must be played back with some rhythm. The neat, and powerful, thing about Ludwig compared to a drum machine is that the two series of cells within a track don't have to line up. You could have a single short series of pitch cells being played back in many different rhythms, or a long series of pitch cells (including complex operations) being played back in a simple repetitive rhythm. If you'd prefer, you can force a linkage between the two cell series within each track. Or, if you want to get fancier, you can force either the pitches or the rhythms of any track to sync their starting points to those of any other track. These are handy shortcuts if what you want to do with Ludwig is make "normal" music. But Ludwig is frankly a poor environment in which to create normal music, so it's hard to see why anybody would bother. Recording Patterns. Before you start assembling a Ludwig track, you'll need a few raw patterns to work with. (Actually, the program is shipped with a disk full of raw material to get you started. The disk is called "Bones," which is part of an obscure joke about a dog named Ludwig. We promised the guys at Hybrid Arts we would try to mention the dog somewhere in the review. Arf.) There are two record/edit screens, one for pitch patterns and one for rhythms. If you'd like, you can link pitches with rhythms prior to recording, and record both at once. Quantizing occurs on input, and quantization values of quarter, eighth, sixteenth, and 32nd-note are supported. (The only way Ludwig can play triplets is through a rather roundabout rhythm transformation.) On your first attempts to record a pattern, you're liable to think that Ludwig is mangling your input. This is because it doesn't record like a sequencer. Whenever two notes, or a longer group, overlap by even a millisecond, it assumes that you are playing them as a chord. They will all be quantized to the start time of the first note in the group. This vertical-chunk orientation is one of Ludwig's more subtle but problematical limitations. lf you should happen to envision a part that contains both sustained notes and moving notes, you'll have to use two or more tracks to play it, and will quite likely have to use a pencil and paper to figure out how many iterations of rhythm pattern 04 correspond to how many of rhythm pattern 05. The pitch-editing screen sports a large grid containing rows and columns of note names. Clicking on a note selects it and highlights it in inverse video; clicking again deselects it. If no notes are selected, a column will be played as a rest. Each column contains 16 notes within a chromatic scale. You can move this scale around wherever you like in the full MIDI note range, but all of the notes ma given step of the pattern must fall within that 16-note span. We're not sure why the program was designed to allow chords only within such a narrow range, but it's a limitation that we found easy enough to work with, especially since many of the pitch operations that can be inserted into a track will expand the range of a pattern. A random pitch generator is included. It can be used several times to layer random pitches on top of one another. Curiously, this is the only place in the program where patterns can be layered. There is no "merge patterns" utility, and no operation that will allow a single track to play two patterns at once. Both pitch and rhythm patterns can be given 15-character names. These won't appear on the main track screen, but you can call up a pattern list that displays them, which is handy. Rhythm patterns can be recorded by tapping from a MIDI controller, or manually edited. The pattern is displayed as a row of notes, and the lengths of individual notes can be adjusted by left- or right-clicking on them. A row of letters beneath the notes indicates whether each step is to be played (N) or a rest (R). Clicking on these letters toggles them back and forth. A "condense" command can be used to convert all note/rest combinations into notes of longer duration. As with many aspects of Ludwig, the rhythm-editing system is perfectly functional but not exactly elegant. The flags on the notes are so tiny that we had to squint to tell a sixteenth-note from a 32nd, and when you click and hold so as to move from, let's say, a sixteenth to a whole-note, the scrolling is much slower than on some programs. Scrolling is consistently slow throughout Ludwig. Pitch & Rhythm Operations. This is the heart of Ludwig-the trip to Mars. Both pitches and rhythms can be manipulated so thoroughly as to become virtually unrecognizable. In fact, we could envision doing an entire piece of music in Ludwig (if that were practical at all, which we have some doubts about) using only a single pitch pattern and a single rhythm pattern, and subjecting these to endless permutations. Some of the pitch operations are simple: You can transpose a pattern up or down either chromatically or diatonically (with reference to one of eight user-defined scales). You can play it backwards, or truncate the start or end. You can tell the machine to play only the highest or lowest note in each step, eliminating the other tones in chords. You can break chords into arpeggios or combine adjoining notes into chords. As already mentioned, you can perform a different operation every time the pattern is played. What's a whole lot more fun is that you can combine a number of operations, so that the machine will calculate the results of all of them together and then play whatever notes it arrives at. This "combine" operation is a gas, especially when the more esoteric operations are put together with the basic ones. The esoteric pitch operations require a bit more explanation. "Expand/compress" will find the midpoint of a chord and then stretch or squash the intervals with reference to this point. This can lead to some pretty strange chords, so you might want to use it in combination with "force diatonic," which adjusts every note up or down a half-step to bring it into line with one of the user-defined scales. "Accompany" takes the top note in each pattern step (eliminating any chords) and then inserts a first-inversion triad from one of the scales below each note. "Warp melody" doesn't actually warp anything; what it does is insert a pitch from one of the scales between some or all of the existing notes. By doing several warps ma combination, you can create an ostinato figure in which the notes of your original pattern only show up at a few points. "Substitute rest" causes a rest to appear at a specified step, while "no rests" shortens the pattern by eliminating any rest steps. Obviously, several "substitute rests" could be used in a combination with a "no rests" to change the content of a pattern. Other operations, which we don't have room to explain, include "echo," "exchange adjacent," "play even," "play odd," and "harmonize above." And then there are the randomizing operations (see below). Another important operation is looping. Loop start and end points can be inserted anywhere within a pitch or rhythm series. The number of repeats for the loop can be specified (00 means "loop forever"), and loops can be nested within other loops. This type of structured series is great to work with. We could imagine other possibilities (conditional branching, for example) that would let you do some really twisted structures, but the results would be hard to control, so we're not going to complain. Nested loops are enough to keep us happy for quite a while. Most operations allow the user to specify an argument-in layman's terms, a two-digit number. The meaning of this number depends on the type of operation being performed. In the case of a chromatic transposition, it is a simple quantity-a number of half-steps. But in many cases the number is not a quantity; it has a special meaning. For example, in a "harmonize above" operation, the left digit tells the machine which user-defined scale to get a note from, while the right digit tells it what interval within that scale to play. (We found a bug in this feature: When we specified an interval of 1-a unison-the machine gave us two-note unisons but only shut off one of the two notes when we hit the stop button.) We had questions at a couple of points about why the arguments were defined in the way that they were. For example, the "accompany" operation lets you choose a scale (the left digit) and then specify whether to put a triad under every note (right digit 11, every other note (right digit 2), every third note (right digit 3), and soon. There is no way to accompany two notes out of every three, or three out of every five, or to control where the accompany operation starts counting notes. Some of the rhythm operations, such as looping, combining, exchanging, and truncating, are identical to the pitch operations. As you'd expect, there are a number of new possibilities as well. "Divide/multiply" divides or multiplies a rhythm by some whole number. If the number is 3, you get triplets, which is nice, but dividing or multiplying by numbers larger than 4 tends to result in either lugubrious adagios or chattering prestissimos. We think it would have been far better to use the available integers to offer the option of multiplying or dividing by some simple fractions, such as 1.5 or .66. "Legato/staccato" is used to change the gate time of notes, from 1% to 99% of their rhythmic value. This setting is used to control a playback of a given rhythm pattern, soit will always be the same throughout the pattern. We think it's a shame that you can't set up independent legato/staccato loops, or set duration to more than 100%. "Rotate" moves all of the rhythm values backward or forward in the pattern by upto nine places, wrapping the end around to the beginning. We found a cool application for this: We set up three tracks to use the same rhythm pattern, but gave each of them a different rotate value. The result contained some unexpected syncopations, while the total phrase lengths of all tracks remained identical. Other operations include "invert note/rest," "randomly drop some," "force the number of beats," "substitute rest," and so on. Random Functions. You say you can't bear to assemble a completely deterministic piece, that you insist on machine improvisation? We've already mentioned the function that fills a pattern with random pitches, and the operations that drop random chords or rhythm steps from a pattern. Many of the operations that use one of the user-defined scales let you select scale 0, which causes the machine to select a scale at random. These options are fairly simple-and indeed, Ludwig is not the most sophisticated randomizer we've ever seen. But it does have a couple of other slick ideas. You can let the machine randomly determine the length of a pattern (that is, the number of chords or rhythms within it that will be used during playback). The length can be constrained within a user-specified range. Ludwig can do this while playing the elements of the pattern forward, backward, or in a random order, which leads to some very pretty accompaniment patterns with unpredictable notes in the arpeggios. On a higher level, you can mix two patterns together according to any of a number of different schemes. The way this works is perhaps a little more rigid than it might be, but we wouldn't want to be too critical until we had spent more time with the program. Basically, you choose one pattern as the mix material for each pitch or rhythm series (that is, one pitch pattern and one rhythm pattern per track). This will be used in conjunction with any and all patterns in that track that you select to be randomized. A little window at the side of the track has an empty slot for each of the 32 possible steps in the pattern. In each slot, you specify what mixing operation will be carried out at that step. For the pitch patterns, the operations include simple combining, selecting notes randomly from either or both chords, and generating entirely new diatonic or chromatic notes or chords at random. The correspondence between the two patterns will always be item-for-item, however. There is no way to tell the machine, for example, to replace the sixth chord in a pattern with some unspecified chord from the other pattern. In this case, it will always go to the sixth chord in the other pattern. The mixing of rhythm patterns is necessarily somewhat more limited and includes only a few simple randomizing options, none of them especially geared toward good-feeling grooves, as far as we could determine. Track Operations. Any four of Ludwig's eight tracks can be displayed at a time. For each track, either the pitch, rhythm, or velocity series (see below) can be displayed. In the case of pitch and rhythm, 32 of the possible 1,024 cells can be displayed at a time. By incrementing a little counter with the mouse, you can put the 32-cell window anywhere in the series that you like. Each cell appears as a mnemonic (usually two letters, but sometimes only one letter or a symbol) above a two-digit number. A typical Ludwig passage might look something like this: + U WM AC EX FD < 05 12 32 21 15 02 04 If you're beginning to get the idea that this type of input structure is something only a computer programmer could love, we won't argue with you. Of course, there may not be any better way of designing an interface for the types of operations that Ludwig performs. If you want to dance, you've got to pay the piper. Choosing operations for the cells is a two-step process. When you click on the upper symbol, a window pops up. This window, which fills half the screen, lists the available operations. When you click on one, it is automatically loaded into the cell that you had previously clicked on. You then increment or decrement the two-digit number using the mouse buttons, and finish by clicking anywhere outside the cell with the left button to confirm the new element, or with the right button to cancel. This process is fairly tiresome, for a couple of reasons. As we said, the two-digit numbers mean different things with different operations, and there is no on-screen help to let you know what the values will do. So you'll have to leaf through the manual almost constantly, at least while learning the program. Fortunately, the manual is printed on nice thick stock, and should stand up to a good deal of leafing. Unfortunately, the list of operations in the manual is not alphabetized, so you'll have to leaf back and forth through ten or twenty pages every blessed time in order to find what you're looking for. A more serious problem is the absence of block copy utilities for the tracks. Let's say you've set up a nice loop containing a couple of dozen cells-the type of data shown above. You'd like to copy this loop into another track. But that track already contains some cells, and you don't want to replace these. You want to tack the copied material on at the end of the series. No can do. Ludwig will let you copy an entire pitch or rhythm series from one track to another, but not a portion of one. The only way to make such a copy is by manually reentering the whole damn thing. Block copying is not an esoteric process; it's found on just about every sequencer still being manufactured. So its absence from Ludwig is mystifying, to say the least. Ludwig does not record or play back pitch-bends, after-touch, or MIDI controller data. Each track can be given a patch number, which will be sent out each time playback is started, but there is no way to insert patch changes anywhere else in a track. Each track can be given a default legato percentage (which will be overridden wherever a legato/staccato operation appears in the rhythm series). We were pleased to discover that Ludwig's tracks (though not the contents of the patterns themselves) can be edited without interrupting playback. It's neat to be able to insert new patterns and hear the results a few seconds later. We wish the edits could be heard instantly, but the program has to calculate a few seconds ahead of the current playback position, in order to insure timing accuracy. Thus it's generally possible to enter new values that won't be heard, even though they're in front of the current playback point. This is confusing at first, but quite easy to get used to. It would be a mistake, however, to think of the real-time editing ability as suiting Ludwig for live performance. Clicking on little alphanumeric items in a list and select new ones from a pop-up window just isn't an organic, gestural process, no matter how you slice or dice it. We wish Ludwig had a cuing function. Due to the way the tracks are structured, there is no way to start a cue in the middle of a piece. Every time you hit the play button, playback will start from the top. There ought to be some way to instruct the machine which cells you want playback to start at, but since most users will probably be generating only short phrases with Ludwig, this may not be much of a problem. Velocity Processes. We have deliberately avoided talking about note velocity until now, because generating velocities is one of the least interesting aspects of the program. To begin with, each track has a set of exactly 32 velocity cells, each of which contains one of eight user-specified velocity levels. These levels can be specified differently for each track, which is certainly a nice extra. The track can cycle endlessly through all 32 of its velocities, or it can be forced to restart each time a pitch and/or rhythm cell starts. It will not, however, cycle through a smaller number of cells continuously (unless that number happens to be one of the factors of 32). Two more types of velocity processes can be used-random accents and determined accents. The random accent feature allows you to instruct the track to choose random notes for shifts in velocity. The shift will be of whatever size you specify. The determined accents can be placed on all instances of a specified pitch, all instances of a specified note length, or both. Thus you could have all quarter-notes and C's accented and all sixteenth-notes and A b's de-accented, but the accent/de-accent amount would be the same for all four types of notes, and the same from one end of the track to the other. It may be true that velocity is less noticeable than pitch and rhythm, and therefore doesn't require the same degree of sophisticated programming. But we can't help feeling that this area of the program short-changes the musician. For starters, there is no way to do sweeping crescendi or decrescendi, no way to include accents in one section of a long track but not in another section, and no way to provide various pitches with various accent levels. The Big Roadblock. Coming up with some provocative musical phrases with Ludwig is easy, but constructing an entire piece with it would be nearly impossible, unless (a) you're an unemployed masochist, or (b) you're fascinated by thick, repetitive, and relatively colorlessjumbles of notes. So the question arises, how can you transfer phrases from Ludwig into your sequencer to use them as starting-points for compositions? If you already own Hybrid Arts' SMPTE Track sequencer, you 're in luck, because Ludwig stores its performances in a playback buffer, from where they can be saved as a SMPTE Track .SNG file. The HybriSwitch multiple program handler can hold both SMPTE Track and Ludwig in memory at the same time, allowing the contents of the performance buffer to be transferred directly, without saving to disk. If you own a sequencer that doesn't run on the Atari, you can record Ludwig's output into that, from where it can later be played back across into an Atari sequencer if desired. Ludwig can transmit MIDI clocks, and we had no trouble dumping its material into the sequencer in our Ensoniq SQ-80. But unless you own a second sequencer, you're out of luck, because Ludwig doesn't store MIDI files. Incredible? We thought so. When we asked Hybrid Arts about the oversight, they indicated that they're planning to release the MID file conversion module from SMPTE Track as a free public domain utility. Some snags came up in the development of this utility, and they chose not to hold up the release of Ludwig until the utility was available. Unfortunately, the utility was not yet available when we wrote our review. Unless you're a SMPTE Track user, we would recommend that you wait to purchase Ludwig until the conversion program is actually in your hot little hands, because "a few days" can easily stretch into a few months in the music software business. Conclusions: Evaluating a program like Ludwig is a lot tougher than evaluating a sequencer or editor/librarian. Those types of programs are designed to do familiar things. Ludwig is designed to do unfamiliar things, so it has to do them in unfamiliar ways. In other words, it takes time to learn. So are the musical results worth the effort? We'll answer that with a guarded "yes." There's no question Ludwig will do lots and lots of stimulating musical tricks. As we leafed through the manual, we kept thinking, "Wow! This looks like fun." And as we delved deeper, we did come up with some astonishing syncopated chord patterns, quite unlike anything we had ever heard before. But using the program was less fun than we had expected. The control structures take some time to memorize, important dimensions of control (such as the ability to start playback or send patch changes in the middle of a piece) are missing entirely, and some method of block copying ought to have been provided. There's a lot of power slouching around inside Ludwig. But we wonder how many people are going to have the patience to pry the power loose. Compared to other programs that serve the same purpose, Ludwig is rather counter-intuitive. And unless you have some method of getting its output into a form that your sequencer can use, we can't recommend that you buy it, because it simply isn't a full-function music production environment. When Hybrid Arts releases their MIDI file conversion utility, the program would definitely be worth considering for anybody who wants a way of generating some new kinds of ideas. Pros: Powerful system for generating complex sequences of notes from simple pitch and rhythm patterns. Eight tracks can all access the same pattern data and produce independent transformations. Cons: Cramped, counter-intuitive user interface. Limited velocity and duration processes. MIDI file storage not yet implemented. Ludwig Description: Algorithmic composition software. Hardware Requirements: Atari ST or Mega computer (black-and-white or color monitor), any MIDI sound module. Features: Eight independent tracks with pitch and rhythm processing operations. 100 pitch and rhythm patterns. Interval and rhythm expansion, automatic accompaniment chords, transposition, nested loops, rhythm cell rotation and truncation, and many other automated operations. Random mixing of patterns, accenting of specific pitches, forced linkage between tracks. Performances can be saved in SMPTE Track sequencer format. Suggested Retail Price: $149.00. Contact: Hybrid Arts, 11920W. Olympic Blvd., Los Angeles, CA 90064. (213) 826-3777. Keyboard Magazine March 1989