The reconstruction of the Digisound Synthesizer is a WORK IN PROGRESS. Please forgive any omissions, false assumptions and anything that is simply plain boring. Users of MIDI, Analogue Synthesizers and the PIC Microcontroller are free to copy etc. anything on this site. The source & firmware developed is available for FREE. I have freely perused the Internet for ideas and solutions these last few months. Where I use some others ideas or software, I have tried to give credit for this. Where others source-code has been used either partially or in its entirety, such software source is available freely under the original authors terms.
Joe Brown 12th December 2004
In the early ’80s, I bought and constructed a set of modules from Digisound as part of The ETI Project 80 Synthesizer. Programming the 6502 Controller card to support my own Chord Generator (Accordion) was my first introduction to programming a computer. This was to change my life, as in a very short time, I was programming as a career. The synth was stored, and moved with me from house to house, but was almost forgotten as my life was a very busy one. I am now semi-retired after a career in programming for the last 24 years, and I have seized the chance to once more look again at the almost-forgotten project. These pages are an attempt to document my recent activity in this direction, hoping that my experience can be of benefit to other synth users.
The reconstruction was split into sub-projects as follows. Just click on a link to access the relevant pages.
Below, part of the synthesizer during re-construction.
The synthesizer was designed (mostly) by Charles Blakey of Digisound and is based on Moog principles. The voltage-controlled oscillator and filters modules etc., are designed around both the CEM (Curtis Electro Music Specialities) and SSM (Solid State Microtechnology) Integrated circuits. 1 Volt / Octave (0 – 10v) is used for control-voltages, whilst TTL levels are used for gating. My module inventory is given in the table below.
The more observant of you will notice that there are several modules ‘missing’, from my list. I can’t remember the reason, but these ‘missing’ modules were substituted with modules from the Elektor ‘Formant’ Synthesizer and others designed by myself. The ‘missing’ modules are as follows:
In addition to the above I had a skeleton 61-note keyboard, with contacts. I also have some MIDI-based equipment, including an old Roland MT-32 unit, a Cheetah Master keyboard, BOSS Electronic Drum machine etc. My desire was to try and make some coherent MIDI-connected system including all of the units.
I examined the old Tangerine 6502 controller-card in the Alphadac and come to the decision that I wasn’t prepared to support the old code and hardware, despite the fact that I cut by back programmers teeth on 6502 Assembly Language. It was time to bring the ‘intelligent’ front-end of the Alphadac up-to-date, but with what? I was musing with buying a new controller card when I discovered the PIC!
I had heard of these, of course, over the years. But as almost my entire career has been programming Intel-based hardware (the PC), I had never used a PIC in anger. I bought a book (see resources) and a Velleman PIC Programmer and project board, and after downloading Microchips assembler (MPLAB) for free, programmed from the examples in the book. These early experiments covered polling pins, switching on LEDs, Timer and edge interrupts, debouncing switches etc., which gave me a good introduction into programming the PIC16F84. I thought I was ready to get stuck in to the first job of designing a PIC replacement for the old 6502 controller card. I made the (rash) assumption that I knew enough about MIDI to interface my existing MIDI keyboard to the DACs and Gates on the Alphadac motherboard. I decided on using a PIC16F876 as this had a serial port built-in, and enough free port pins to drive the address and data busses of the Alphadac, together with provision for a hexpad for executing command procedures.
8 Data lines D0-D7 For CV data, Gate and Portamento
4 Address lines A0-A3, for DAC select (MAX 16 DACs)
A NOT WRITE Line to strobe data to DAC & Gate Latches
4 Lines for a HEXPAD
MIDI IN Port
MIDI OUT Port
MIDI THRU Port
LED Indicator (for reassurance it is working)
I came up with the following:
|This was built first of all on a breadboard, with an umbilical connecting the Address/Data lines etc to a Eurocard pin board plugged into the Alphadac controller position. When the hardware was working, and the software partially complete, components were transferred to the Eurocard. A 28pin ZIF socket was located on the Eurocard to facilitate quick and easy software updates. Most of the wiring on the new Eurocard is wire-wrap – I find that a lot easier than trying to solder fine wires to solder pads that are close together. (Galloping Myopia?) The photograph below shows the blue Eurocard with PIC installed, sitting in the controller position of the partially completed Alphadac. The old DIN cassette socket has been converted to MIDI THRU and two more DIN sockets join it for MIDI IN and MIDI OUT. On the front of the panel below the DIN sockets is the 18-position home-made HEXPAD. A Line-of-LEDs is mounted on the Eurocard connected to PORTB of the PIC and shows activity on the data lines D0-7. A ribbon-cable takes connections to the HEXPAD and MIDI sockets etc on the Alphadac front panel.|
Pin assignments on the 64way Eurocard DIN Connector were dictated by the previous occupant – the old Tangerine controller card. These are as follows:
64way DIN connector (male)
Row Number a b
1 +5v +5v
2,3,4 No connections
5 A1 A0
17 NC NOT WRITE
|Interface Card Changes.
A small modification was made to the Alphadac ‘Interface’ card as follows:
This home-made hexpad is based on a design note from Microchip entitled ‘A Keypad Controller for Bi-directional Key Matrix’. This design note is available on the Microchip site as DS40160A/4_12 (see resources) , but I don’t suppose they will mind me showing a small diagram from it here.
As the diagram shows, the basic idea is to scan the hexpad in 2 directions between any given 2 port lines. This allows for a lot more switches available on 4 port lines, than the standard simple matrix. My version used only 18 switches, simply by leaving some out. The firmware to drive the keypad was derived from the software given in the design sheet, together with a simple translation table and debounce software.
Implementation of firmware
As mentioned earlier, I had overestimated my knowledge of MIDI, and through this spent a while discovering just what was required. Up to this point, I had always just been a user of MIDI, and took it all for granted. Suffice it to say that in the course of development, I quickly realised that some form of monitoring was required, both to help in understanding what the MIDI devices I had were actually sending, and as a debug tool for the software development itself. A move sideways was made, as an ancilliary project, to build a MIDI Monitor. (see other projects) This tool has paid for itself many times over, and with hindsight should have been my first PIC/MIDI project. It now forms a permanent part of my MIDI hook-up, monitoring what is sent, and more importantly what has NOT been sent, AKA stuck notes.
The controller firmware is mostly complete, but will be updated as new requirements arise. Currently, the Digisound modules are being re-tested and re-calibrated. More of this later. The firmware for the latest version of the Alphadac Controller uses a PIC16F876 and is available here. MCV876.HEX. The MPLAB project source is available here: MCV876.zip. The Eagle schematic for the controller is available here. Alphadac.sch
Back to TOP
The original Digisound hardware catered for a maximum of 64 key positions, requiring only data lines D0-5. A NOT ENDSCAN/STROBE interrupt is required and the controller has to assert an INHIBIT to the hardware oscillator for the key number to be read accurately. In addition I wanted to add scope for commands like keyboard split, start base note etc. so an old 4X4 Hexpad was pressed into service.
I put together the following using a PIC16F876A:
The software has to do several things as follows:
- React to a KEYDOWN strobe, reading and storing the key value.
- React to an ENDSCAN strobe (on the same line) when the counter reaches the end of the keyboard scan.
- Convert any NEW key presses into MIDI NOTE ON events
- Detect any KEYUPs and convert these into MIDI NOTE OFF events.
The above is achieved in the software with the creation and maintenance of 4 lists using both interrupt and foreground tasks, and is almost bullet-proof. I have not detected one lost/stuck note since completion of the unit.
The Digisound design for the keyboard maxtrix scanning is given below. This is taken from ‘80-15_ETI.pdf’ on Dave @ Homes site. The following table gives connections from my PIC controller to the Digisound Keyboard hardware:
10 pin Molex connector (on PIC Controller) Connection on Keyboard Hardware
No. Function Name
1 VDD 5V+ +5V
2 RB6 D5
3 RB5 D4
4 RB4 D3
5 RB3 D2
6 RB2 D1
7 RB1 D0
8 RB0/INT NOT KEYDOWN/STROBE
9 RC5 INHIBIT
10 GND 0V
Below I’ve given Charles Blakeys amendments necessary to the the Digisound matrix-scanning hardware. The handwritten corrections are his. The document containing the full notes can be found in ‘Alphadac_E&MM.pdf’ on Dave @ Homes site.
The firmware for the Keyboard Controller can be found here. KBDContr.HEX
The Software for the keyboard Controller can be found here: KeyboardController.zip
The Eagle schematic is located here. KBDController.sch
The original Chord Button Controller was built around 1981 and had 72 keys and a shift mechanism so that a further 72 chords could be sounded. It was laid out as a matrix on a Digisound 9″X9″ steel panel. Each key was a small push-switch. The matrix was decoded using a 74154 and 74LS151, there was a hexpad, and the whole thing was driven off one of the 6522 VIAs onboard the Tangerine controller card. The software was developed by me on the Acorn Atom in 6502 machine-code and located in a 2716 Eprom on the controller card. A hook to the Chord Controller was made in the Digisound 1 software to link to the Chord software. There were plans to publish this, but pressure in other directions mitigated against this.
The layout of the keys is as follows. The rows are Chords, the columns the musical Key, and each x represents a push-switch connected between column and row.
Below bottom-view of top panel, the home-made shift-bar shows up clearly at the top of the picture. The new PIC Controller is mounted on the pinboard together with a 7805 TO220 regulator.
I’ve re-used the matrix decoder I built in 1981, as I saw no reason not to. Both ICs are still available. The circuit for this hardware is below.
The hardware replacing the 6502 and 6522 VIA is very simple, using a PIC16F876A and is shown below.
The firmware for the Chord Controller can be found here. ChordController.HEX
The software for the Chord Controller can be found here: ChordController.zip
The Eagle schematic for the Chord Controller is here. ChordController.sch
As mentioned on the Home Page, I had run in to difficulties through my lack of MIDI knowledge. To be blunt, I was unaware of what my commercially-built MIDI equipment was sending to the Alphadac Controller. I needed a MIDI Monitor as a debugging aid, and after searching the Web, found the code for a design by Bob Lang. Although only the code was available as I didn’t have access to the original Nuts and Volts articles, I reverse-engineered the hardware by studying the code. My final design looks like this:
The various switches functions are as follows:
|S2||1 Pole Single-Throw||Serial Mode||Open: MIDI; Closed: Text|
|S3||1 Pole Single-Throw||Display Mode||Open: HEX; Closed: ASCII/Interpreted|
|S4||1 Pole Single-Throw||Running Status||Open: No Filter; Closed: Filtered|
|S5||1 Pole Single-Throw||ASCII Baud Rate||Open: 19,200; Closed: 9600|
|S6||Push Switch||Display Stuck Notes|
The finished(?) MIDI Monitor with its initial labelling of the various switches etc. to remind me of what’s what.
A view of the inside of the MIDI Monitor. The rear of the Powertip 40×2 LCD can be seen at the bottom of the photograph.
View showing the PIC16F876A controller.
I amended the software to cater for my exact needs and the unit using a PIC16F876.
The modified source-code can be found here.midimon.asm
The modified firmware can be found here.midimon.HEX
The Eagle schematic shown above is available here.MIDIMON.sch
The original source and firmware can be found on Bob Langs site. http://www.cems.uwe.ac.uk/~lrlang/
As mentioned earlier, I have several MIDI-based units including an MT32. I wanted some method of connecting more than one unit to the MT32, for example a drum unit and my MIDI keyboard, together with output from a PC. I searched around on the Web, and the only design I found was one by Thorsten Klose, who seems to be a bit of a MIDI GURU, with a huge website dedicated to all things MIDI. Thorstens design is based around a PIC16F877 40pin unit and utilises both the standard UART for 1 MIDI input, and a bit-banging software UART on the T0CK1/RA4 pin, thus supporting the merging of 2 MIDI streams into 1.
This was not enough for my requirements and so I re-vamped the hardware design to use 3 PIC16F628A units. These are 18pin and cheaper than the PIC16F877. (and obviously less pins) I have also re-used Thorstens excellent software and the final design supports 4 inputs. Only one of the PIC units has an oscillator, and this is shared after buffering, with the other 2 PIC units. I have added a reassurance LED to each PIC unit, and these flash briefly after power-up or reset to let you know all is well. The final hardware design looks like this:
Below: The (too) compact internal construction of the MIDI Merger. The 3 16F628A PICs can be seen on the right, with the 74LS04 and 6N135s on the left.
Thorstens original software is supplied on his site, (References and Resources) should you prefer to use this. I have combined the several original source files into 1 only. Note that only the CONFIG line is different for the external-oscillator versions as follows:
First the oscillator version:
__CONFIG _HS_OSC & _WDT_ON & _PWRTE_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF
And this is the External oscillator version:
__CONFIG _EXTCLK_OSC & _WDT_ON & _PWRTE_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF
The single-source file can be found here. Don’t forget, you must comment out the unwanted CONFIG line before invoking the assembly. MIDIMerge628.asm
The firmware for the external oscillator version can be found here. MIDIMerge628_EXT.HEX
The firmware for the oscillator version can be found here. MIDIMerge628_OSC.HEX
I wanted a visual indication of what MIDI channels were in use on my MIDI setup. If I’d thought ahead, I would have built this facility into my MIDI Merger. As it was, I looked on it as an opportunity to try out the C18 ANSI C Compiler I’d downloaded from the Microchip site. Using C cuts down your options as to what PIC you can use. In this case I chose the PIC18F452. The program is relatively trivial. It monitors the MIDI input port for NOTE ON and NOTE OFF events. When one is detected, an LED corresponding to the transmitted channel is lit. After a fixed delay the LED is then extinguished. In my design, I also included a MIDI OUT port which simply passes through all MIDI data without change. The hardware is equally simple and looks like the following:
The software source can be found here. MIDIInd.c
The compiled firmware is located here. MIDI Indicator.hex
The Eagle schematic can be found here. MIDIndicator.sch
Dave @ Home has an excellent website for Digisound Synth Users. All of the modules used in the synthesizer are documented here. http://www.digisound80.co.uk/digisound/index.htm
Thorsten Klose has a huge website dedicated to music production and MIDI, using PIC Controllers. It can be found here. http://www.ucapps.de/