Jump to content

Chaos Matrix


jackchaos
 Share

Recommended Posts

I'm announcing my project here which is currently still under development.

The Chaos Matrix is a control surface and programmer for an Oberheim Matrix 1000 synthesizer. It uses a Core, 1 DIN, 1 DOUT and 1 AIN module. Its loaded with MIOS v1.9c on a PIC18F4620 microprocessor along with a custom application built with the C skeleton interface.

Current Status as of 04/08/2010:

- Rear panel with MIDI & power jacks

- Software is complete, sourcecode attached to this post.

- How-To currently being documented

4163202942_47d93fd6f3.jpg

Wooden cabinet construction aided by this diy howto.

You Tube demonstration (part 1 of 3)

I'm also working on its own wiki here:

http://www.midibox.org/dokuwiki/doku.php?id=chaos_matrix

Front Panel Express file attached to this post.

3986985412_ded209ba09_m.jpg

First, I want to thank Thorsten Klose and all the forum regulars who have contributed their time and talents to the community. Without them, I would have never started building something like this.

Now back to the Chaos Matrix.

Some of you know about how nice these classic synths sound, especially ones using Curtis chips. Unfortunately the Oberheim Matrix 1000 (which is very affordable) offers no way to create your own patches without the use of an editor/librarian on a PC.

So, building a programmer like this brings new life to the synth, allowing me to take full advantage of its awesome matrix modulation capabilities.

Parts Question:(answered)

I have searched unsuccessfully for a panel mount jack for my wall wart power supply. It would have to be round since I can only drill round holes in the rear of the enclosure. I'm using a standard 9volt power adapter with a round plug.

Can someone point me to a part like this at Mouser? I don't even know what to call them.

Stripboard Question:

I'm using some of these strip boards bought from SmashTV and Futurelec:

http://www.futurlec.com/ProtoBoards.shtml

I would like to protect the exposed copper on the underside. Is there something I can paint or spray to seal the copper from being exposed to the air?

Wiki Question:(answered)

I would like to post the Front Panel Express file on the wiki, but I've not seen an option of how to do so.

Can I upload small file attachments to the wiki?

Regards,

-Patrick Manderson

Attached source files in 7z and zip format.

chaosmatrixpanel.fpd

ChaosMatrix_beta_0.20091227.7z

ChaosMatrix_beta_0.20091227.zip

Edited by jackchaos
Link to comment
Share on other sites

  • Replies 69
  • Created
  • Last Reply

Top Posters In This Topic

Parts Question:

I have searched unsuccessfully for a panel mount jack for my wall wart power supply. It would have to be round since I can only drill round holes in the rear of the enclosure. I'm using a standard 9volt power adapter with a round plug.

Can someone point me to a part like this at Mouser? I don't even know what to call them.

http://www.mouser.com/catalog/635/1091.pdf

Link to comment
Share on other sites

Fantastic job!

I just read the wiki, good to see you're documenting how it was built...

Your two step process for gluing the screws is great, but did you notice a difference between applying more JB-Weld in a second step instead of doing this at the same time as the initial gluing of the screw?

BTW this method isn't mine, I was inspired by Rigo: http://www.midibox.org/forum/index.php/topic,6929.msg52071.html#msg52071

Link to comment
Share on other sites

did you notice a difference between applying more JB-Weld in a second step instead of doing this at the same time as the initial gluing of the screw?

Wilba.

I used only the 2 step procedure documented in the wiki. I didn't try it any other way.

BTW, what's the consensus of JB-Welding on anodized (black painted) surface, vs scratched anodized vs, bare aluminum? I got lost in the forums and wasn't sure what to do. I left the surface as it was and only cleaned it.

Link to comment
Share on other sites

I had poor results with some bare aluminium scraps I had, but good results with the black anodized aluminium from FPE.

I was told by someone that aluminium forms some oxidized surface as soon as you roughen it, making it hard to stick to, but I don't know the technical details of that. Some people had better results by scratching the surface... it probably depends on the type of anodized aluminium. The 1.5mm black anodized panels I got from FPE are dark grey metallic on the back, whereas the 3mm black anodized panels were the same on both sides. Both types seemed to work fine with JB-Weld without any roughening.

Link to comment
Share on other sites

BTW Those switches look really cool. Can you also share details about the switches?

I got them from Mouser:

http://www.mouser.com/ProductDetail/Mountain-Switch/107-6610/?qs=2H9uEo82DuzZKToJVZPhqw%3d%3d

The black button cap wobbles and can be pulled off and snapped back on. I wish they wern't as wobbly. I will be sure to demonstrate them when I make a video.

Link to comment
Share on other sites

I was told by someone that aluminium forms some oxidized surface as soon as you roughen it, making it hard to stick to, but I don't know the technical details of that.

Pure aluminium is highly reactive.  In the real world, aluminium is so durable precisely because of this reactivity - it instantly forms a layer of aluminium oxide as soon as it is exposed to the air.  This layer protects the pure aluminium underneath from the elements - and apparently from adhesives as well.

Link to comment
Share on other sites

  • 3 weeks later...

Do you think it will work for the Matrix 6?

I don't have a Matrix 6 to test on. However, the sysex specification is identical except for a few things.

  1. The M6 supports dual voice splits and layering, the M1000 is monotimbral.
  2. I'm writing specific workarounds in the software to accomodate firmware bugs in the M1000. I don't believe they exist in the M6.

If you're looking for a handy way to adjust parameters on the M6 for under $150, you could get by with a Behringer BCR2000 MIDI controller if you're willing to invest some time creating it sysex encoder maps yourself.

Link to comment
Share on other sites

  • 4 weeks later...

Dear Jackaos

this is a very interesting project as i own 2 matrix6 + 1 M1000

As i wanted to develop a control surface for them, i am very interesting how you manage SysEx as i don't understand well what to put in MIOS_MIDI_TxBufferPut()

Would you publish same extracts of your code ?

Best regards

Link to comment
Share on other sites

Dear Jackaos

this is a very interesting project as i own 2 matrix6 + 1 M1000

As i wanted to develop a control surface for them, i am very interesting how you manage SysEx as i don't understand well what to put in MIOS_MIDI_TxBufferPut()

Would you publish same extracts of your code ?

Best regards

I would recommend getting a hold of this:

http://wolzow.mindworks.ee/analog/m1k-midi-spec.htm

it covers everything, including the firmware bugs and undocumented sysex opcodes.

It also includes documentation on sending patch parameter changes.

I've read that the Matrix 6 has a poor sysex implementation and is a bit broken, you might try looking it up before starting.

I'm very close to completing the software for my project and will upload it svnmios.midibox.org.

Below are the two main MIDI routines.


void MIDI_SendVoiceParam(unsigned char param, unsigned char value)

{


	MIOS_MIDI_BeginStream();

	MIOS_MIDI_TxBufferPut(0xf0); // begin sysex header

	MIOS_MIDI_TxBufferPut(0x10); // mfg

	MIOS_MIDI_TxBufferPut(0x06); // device

	MIOS_MIDI_TxBufferPut(0x06); // voice parameter byte


	// transmit the parameter number

	MIOS_MIDI_TxBufferPut(param);


	//transmit the new value

	MIOS_MIDI_TxBufferPut(value);


	MIOS_MIDI_TxBufferPut(0xf7);

	MIOS_MIDI_EndStream();


}



void MIDI_SendMatrixModParam(unsigned char mmbus, unsigned char mmsrc, unsigned char mmdest, unsigned char value)

{

	MIOS_MIDI_BeginStream();

	MIOS_MIDI_TxBufferPut(0xf0); // begin sysex header

	MIOS_MIDI_TxBufferPut(0x10); // mfg

	MIOS_MIDI_TxBufferPut(0x06); // device

	MIOS_MIDI_TxBufferPut(0x0b); // matrix mod parameter byte


	MIOS_MIDI_TxBufferPut(mmbus);

	MIOS_MIDI_TxBufferPut(mmsrc);

	MIOS_MIDI_TxBufferPut(value);  // all matrix mod values are 7 bit signed

	MIOS_MIDI_TxBufferPut(mmdest);


	MIOS_MIDI_TxBufferPut(0xf7);

	MIOS_MIDI_EndStream();

}


When you send a value, make sure its in proper range, because the M-1000 will go silent if its way off. I use potentiometers for most parameters except the matrix modulation bus, where I use an encoder. The potentiometers require a conversion from 10 to 7bit. Then you have to scale the value down and convert it if it needs to be an signed value.

unsigned char getvalue(unsigned char pin)

{

    unsigned char value;


    // scale 10bit to 7bit value between min and max boundary

    value = Scale_7bit(MIOS_AIN_Pin7bitGet(pin), PotConfigMap[pin].min, PotConfigMap[pin].max);


    // convert values for signed parameters

    switch (PotConfigMap[pin].valtype)

    {

        case SIGNED7:

            value = Convert_7bit_Signed(value);

        break;


        case SIGNED6:

            value = Convert_6bit_Signed(value);

        break;


        default : break;

    }


    return value;

}


////////////////////////////////////////////////////////////////////////////

// This is an assembly optimized function which scales a 7bit value between

// a minimum and maximum value

/////////////////////////////////////////////////////////////////////////////

unsigned char Scale_7bit(unsigned char value, unsigned char min, unsigned char max)

{

  // scaled value is (<8-bit random> * ) >> 8

  PRODL = value << 1; // 8bit value

  PRODH = max-min+1;  // range

__asm

    movf _PRODL, W

    mulwf _PRODH, 0

__endasm;


  return min + PRODH;

}



// converts a pots 7 bit pot value  to a signed 7 bit with zero at center position

unsigned char Convert_7bit_Signed(unsigned char value) {


	return  (value + 0x40) & 0x7f;

}



// converts a pots 7 bit pot value to a signed 6 bit with zero at center position

unsigned char Convert_6bit_Signed(unsigned char value) {


	return (value + 0x60) & 0x7f;

}



Link to comment
Share on other sites

Would you be interested by a dedicated control surface PCB fitting in a 3U rack ?

Not sure what you mean.

My design is 24 inchest wide and wouldn't fit. The control surface electronics are made with a few small prototype boards to hold the buttons. The pots are mounted directly to the aluminum panel.

Are you saying you have a PCB for a control surface? Post a picture, we love pics around here. :)

Link to comment
Share on other sites

Are you saying you have a PCB for a control surface ?
not yet

Were you inspired by the Access Programmer or personal experience with control softwares for the choice of the parameters ? I ask that to start the design of the CS (what are the essential controls to put in ?)

post-4619-125971075498_thumb.jpg

Edited by julienvoirin
Link to comment
Share on other sites

what are the essential controls to put in ?

I was more inspired by this monster when it came to the panel design.

http://www.vintagesynth.com/oberheim/new_oberheim_obx.jpg

Download the FrontPanel Express file attached to the original post, you can see which controls I decided to dedicate to a pot or button. All the other controls are accessed through the soft panel (lower half).

On my wiki, you can see a photo of the prototype... which had a LOT more dedicated controls. I later decided to simplify it.

Link to comment
Share on other sites

Updated the photo on the OP with its new wooden enclosure.

I'm getting very close to completing this project. I still have a few things to do.

The cabinet was built with oak boards from Lowes. I used the howto here as a reference: http://www.synthesizers.com/diycabinet.html

What's left?

  • The electronics need to be mounted inside the wooden enclosure.
  • Rear panel with MIDI & power jacks
  • A MIDI merge has to be built, its necessary for the edit buffer sync feature.
  • The encoder setup isn't perfect, I still get occasional skipping.
  • A few minor software adjustments

Edited by jackchaos
Link to comment
Share on other sites

Updated the photo on the OP with its new wooden enclosure.
really nice

I'm getting very close to completing this project.
could you publish your beta code ? :P

[*] The electronics need to be mounted inside the wooden enclosure.
you can use this as threads, it works !

http://www.web-libre.org/medias/img/articles/7d3010c11d08cf990b7614d2c2ca9098-2.jpg

[*] Rear panel with MIDI & power jacks

[*] A MIDI merge has to be built, its necessary for the edit buffer sync feature.

do it on veroboard, the pic 18f452 new code (TK app) is cool and now works with bootloader. it will feet on a very small vero

[*] The encoder setup isn't perfect, I still get occasional skipping.
DETENTED_TYPE2 ? check your type in main.h, i had similar problems with a custom app
Link to comment
Share on other sites

stupid me, why not using the MIOS integrated merge function ?

you put it in the Init routine of main.c :

C_DECLARATION void MIOS_MIDI_MergerSet(unsigned char mode)

DESCRIPTION configures the integrated MIDI merger following Merger IDs are provided:

0x00: MIOS_MIDI_MERGER_DISABLED (merger disabled)

0x01: MIOS_MIDI_MERGER_ENABLED (merger enabled)

0x02: MIOS_MIDI_MERGER_MBLINK_EP (MIDIbox Link End Point)

0x03: MIOS_MIDI_MERGER_MBLINK_FP (MIDIbox Link Forwarding Point)

Link to comment
Share on other sites

stupid me, why not using the MIOS integrated merge function ?

you put it in the Init routine of main.c :

C_DECLARATION void MIOS_MIDI_MergerSet(unsigned char mode)

DESCRIPTION configures the integrated MIDI merger following Merger IDs are provided:

0x00: MIOS_MIDI_MERGER_DISABLED (merger disabled)

0x01: MIOS_MIDI_MERGER_ENABLED (merger enabled)

0x02: MIOS_MIDI_MERGER_MBLINK_EP (MIDIbox Link End Point)

0x03: MIOS_MIDI_MERGER_MBLINK_FP (MIDIbox Link Forwarding Point)

How so? I need two MIDI inputs. One for a keyboard controller or sequencer, the other is for the Matrix 1000 (this is how I get edit buffer sync to work).

The midi out goes back to the Matrix 1000.

Edited by jackchaos
Link to comment
Share on other sites

ok , it is to get the edit buffer ... i though it was for plugging a keyboard and routing the notes to M1000

why not using MIOS32 which have 2 MIDI i/o ?

MIDI i/o A goes to your computer (or your midi machines)

MIDI i/o B goes to M1000

most of C code can be easily adapted to (and it seems your are very confident with coding)

M1000 has Echo function i believe , doesn't it ?

i will think to a solution but I am at work now, it is hard to concentrate ... stay tuned

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share


×
×
  • Create New...