Showing posts with label matrix1000. Show all posts
Showing posts with label matrix1000. Show all posts

Wednesday, November 26, 2014

Matrix 1000 ROM only upgrade v116

It seems like my CPU upgrade for the Matrix 1000 doesn't work quite right except on my own hardware, plus it may have a design flaw so I decided to work on a ROM only upgrade until I can get something that works fine everywhere.

So you just have to burn that file on whatever 27C256 32KB EPROM flavor you have, plug it into the Matrix 1000 U804 ROM socket in place of the old one and all should be working fine, hopefully.

Here are the changes it brings:
- Bug fixes made by Nordcore.
- MIDI NRPN parameters editing fix.
- Faster processing of parameter changes that need a modulation matrix rebuild, there's still a small lag but it's much better than before.
- Unison detune, controlled by MIDI CC #94 (Celeste Level), value from 0 (no detune) to 127 (strongly out of tune). It is always active, even in poly mode. Values around 2-6 add a slow VCO-like detune that helps liven up the sound and keeps poly mode sounding in tune.

Keep in mind it's still an alpha version, but there's a much better chance it works everywhere the same, ie. fine as far as I know.

Edit: This version has now been tested on many M1000s, so I think it can be considered stable and production quality.

Download link: http://sfx.gligli.free.fr/zik/m1k/MATRIX_116.BIN

Saturday, August 16, 2014

Matrix 1000 emulator

I just added a Matrix 1000 emulator I made on github: https://github.com/gligli/m1k-emu

It emulates enough of the hardware to be used as a development tool, of course it won't produce sound but it can read MIDI in, buttons and display CVs/7segment/LEDs/...

Here's the binary: https://github.com/gligli/m1k-emu/raw/master/usim.exe (it's a command line tool)
You'll need these DLLs besides the exe too: libgcc_s_dw2-1.dll libstdc++-6.dll

Tuesday, August 12, 2014

New synth hacking project: Faster CPU & firmware mod for the Oberheim Matrix 1000

(I already began posting about it in this gearslutz thread, this will only be a recap)

The Oberheim Matrix 1000, while being a proper 6 voices DCO analog synthesizer rack, has a pretty bad MIDI implementation (50Hz update rate, editing some parameters lock up the synth for seconds, some don't even work,...).
Considering MIDI is the only way patches can be edited, this makes it a serious drawback!

Recently, Nordcore, a guy from a german forum started disassembling the firmware ROM and publishing a few patches to make the MIDI better (see this gearslutz post).
My goal was to go further and replace the CPU by a faster and compatible one, so that it leaves room for speed improvements.
  1. Hardware

  2. So, I desoldered the old 6809, soldered a 40pin socket in its place, I also added a socket for the 8Mhz crystal.
    The CPU I now use is a HD63C09P, it is compatible with the 6809, but can run at higher clock speed.
    I clocked it with a 16Mhz crystal, so twice the original speed.
    I had to add a CD4040 on top of the CPU and solder a few wires to divide that clock by 2 for the peripherals (MIDI UART, DCO Timers).

    I also made myself a sort of devkit by replacing the firmware ROM by a RAM chip and a microcontroller to update it, the wiring is really ugly but it works fine so far.

  3. Software

  4. The whole synth engine is updated in an interrupt that is clocked by one of the external 8254  which is running at 50Hz stock.
    My first mod was to make it 4 times faster, process incoming MIDI all those 4 times but update the synth only once in the same period. That way the sound engine still runs the same (envelopes, LFOs, ... stay at stock speed) but MIDI is processed much faster!

    This allowed for much smoother MIDI, yet some parameters like VCA level or VCF envelope amount were still hogging the synth.
    It turns out each time a MIDI message is received, the synth is directly updated, and for some parameters it can take a few hundred milliseconds, so if the MIDI message queue has many pending messages, the wait can rapidly become seconds!
    Nordcore had the following idea: don't update the synth for each MIDI message, but instead raise a flag, and do the update only once per interrupt.
    I implemented it and it works quite fine, editing those parameters isn't perfectly smooth, but one can say it is realtime editing, at last :)

    Last but not least, 50Hz updates means the fastest envelope time is 20 milliseconds, which is quite bad. The CPU being at least twice faster, getting this to 10ms this was perfectly doable.
    I chose to implement it as a turbo mode (enabled by pressing '+' while powering the synth) that doubles the speed of everything (Envelopes, LFOs, ...).
    At first I wanted to have turbo mode always-on while maintaining patch compatibility, but it's not really doable, as there would always be some minor differences in sound due to the odd way the Matrix 1000 handles time based parameters.

Picture of the mod: http://sfx.gligli.free.fr/zik/m1k/m1k_new_cpu.jpg
Quick demo of realtime editing over an arp: http://sfx.gligli.free.fr/zik/m1k/m1k_midi_tweak_demo.mp3
Wiring diagram: http://sfx.gligli.free.fr/zik/m1k/m1k-wiring.pdf
My modified firmware so far: http://sfx.gligli.free.fr/zik/m1k/MATRIX_123_R2.BIN (this is a modified stock firmware, if Oberheim or anyone has a problem with it, I can publish a patch instead)

PS: The firmware was only tested on my own Matrix 1000 so it is alpha quality for now!