Friday, July 11, 2014

Reviving M1000X

I've finally found the time to get Xcode going on my Mac Mini and rebuild M1000X, the program I published some years ago for doing patch editing on the Oberheim Matrix-6/6R and Matrix-1000.  It now runs on Intel Macs under OSX 10.8 (it should also work under 10.9, but I have not tried it).  There were some challenges involved in getting it going again.  (OSX coding geekdom ahead...)  I originally wrote M1000X in 2005 in pure C, using the Carbon libraries.  Apple in its infinite wisdom has since deprecated Carbon, and is pressing hard to get all remaining Carbon apps converted to use the Cocoa libraries.  Unfortunately, making a Carbon app written in C work with Cocoa involves a significant re-write, object-izing the code and reworking it into Objective-C.  Additionally, the current version of the interface builder built into Xcode refuses to open the Carbon nib files, although the runtime still works with them.  Fortunately, I still have my old PowerPC Mac up and running, so I was able to do the interface resource editing that I needed to do there and copy the nib file over to the Intel-based machine.  Additionally, due to a problem with the way that bit fields in structures are specified in C (a problem that the language has had since the original K&R specification in the early '80s), I had to re-write some large structures that handle patches in memory.  While I was at it, I took the opportunity to fix a couple of bugs, and to put code in to work around two bugs in the Matrix-1000 OS that I didn't become aware of until after I had released version 1.0.

Anyway, version 1.1 of M1000X is available here.  Just open the disk image file and drag the application to your Applications folder.  There is a help file in there and a set of release notes also.

So while we're here, this is a good place to talk about the Oberheim Matrix series of synths.  These consist of two groups -- the Matrix-12 series, and the Matrix-6 series.  The Matrix-12 series consists of two synths, the Matrix-12 and the Xpander, which basically is a "tabletop" Matrix-12 with no keyboard and half as many voices.  Both of these synths are now very expensive collectors' items, and they also don't have a lot in common with the Matrix-6 series, so I won't dwell on them further here.

The Matrix-6 series consists of the Matrix-6 itself, a 6-voice keyboard; the Matrix-6R, a rack-mount (2U) packaging of the Matrix-6, and the Matrix-1000, with the same voice architecture but more patch memory and some improvements, and packaged in a smaller (1U) rack-mount box.  All of these synths are based on the CEM 3396 "synth on a chip", which provides an all-analog signal path consisting of two DCOs, one low-pass VCF, one noise generator, and two VCAs.  The VCF can be FM'ed by one of the DCOs.  The synth adds to this a bevy of modulation and signal sources: two LFOs, three DADSR (delay-attack-decay-sustain-release) envelope generators, two ramp generators, and a tracking generator. The patch memory consists of 100 patches on the 6/6R.  The 1000 has 800 patches in ROM and 200 in RAM (hence the name).

The "matrix modulation" capability is what gives the synths their name.  A radically different idea at the time it was introduced, the modulation matrix is basically a virtual version of the old EMS pin matrix (which is displayed graphically by M1000X).  There are ten "pegs" that you can insert at any intersection in the matrix, and you can set the level (inverted or non-inverted) of signal to be routed from the selected input to the selected output.  All of the internal modulation generators are available as sources, as are external expression input jacks and MIDI continuous controllers.  Almost any parameter of the DCOs and VCF can be a matrix destination, as well as most of the envelope segments, the LFO rates and amplitudes, and the portamento rate.  It really did at the time help break out of some of the limitations of its contemporaries, which at the time usually had very limited signal routing -- for instance, on many synths there was one LFO that could only be routed to oscillator frequency, and maybe one other one that could only be routed to VCF cutoff or VCA level.

While the voice architecture is quite capable, the user interfaces for patch editing are limited.  The Matrix-6 and 6R both use the same mechanism, a membrane panel with three mode select buttons, a numeric keypad, and some forward and back buttons.  Visual output is by way of a one-line vacuum fluorescent display with 16-segment characters; it's bright and easy to read (except for some punctuation characters that come out looking funky in the 16-segment format), but it can only display 20 characters.  The display basically switches from display of patch numbers and names to displaying names and values of patch parameters, and patch editing is quite tedious.  As for the Matrix-1000... well, it has no patch editing controls at all.  Clearly there was a cost and packaging decision at some point (apparently Oberheim really wanted to get the Matrix-1000 crammed down to a 1U package).  The only thing you can do from the panel is select patches, set up MIDI, and change a few system parameters.  Output is limited to a 3-digit numeric LED display and a few status lights.  This is why you need an external editor. 

Yes, these are analog synths.  They do use DCOs, and some (most?) of the modulation signal generating is digital, but the audio signal path is all analog.  Oberheim produced many of these synths, and because of the limited user interface they are regarded as less desirable than many other analog synths, so they can be had at reasonable prices.  If you're looking to get into vintage analog inexpensively, this is a good way to do it -- get one of these synths, and then use M1000X to overcome the UI limitations.

1 comment:

DJRexParis said...

Hi Dave,
thank you for your big effort in updating the software.
Have an Matrix 6R myself, M1000X sees the 6R the patch information is transported to m1000x, I can change parameters from m1000x in the M6R, but the trigger buttons are not working and patch changing does not work gem m1000x. any hint?
thank you