"Sound FX Phasor" toy synthesizer [rom dumped,HW info]
I bought on eBay a really crazy complex toy synthesizer from 1980 based on a PIC1655A, which likely constitutes the world first single-chip softsynth. It is the "Sound FX Phasor" by Electroplay.
Beside 8 preset effect noises, it has a keyboard mode with synthesizer, featuring suboscillators with multipulse squarewave and freakish siren-like howling modulations. Particularly it can do sonorous organ-like bass notes and crunchy motor noises with simple decay envelope. The foil touchpad of the monophonic instrument has only 15 "white" keys (no sharps).
There is not much info about the instrument, and only one youtube example barely shows what it can do.
Remarkable is that it even precedes the famous Casio VL-1 by 1 year, and like the latter it can produce a variety of strange complex sound variants. The grainy lo-fi sound engine employs program loop synthesis, in the style of Williams pinball machines. But unlike VL-1 it is more centered on less melodic howling effects, and often resembles random glitch stuff with strange techno sound loops those can include crackle, buzz and rough pulsing or bleeping noises. It was way ahead of its time. But the user interface is awful. There is no sequencer, synth patches can not be saved and most obnoxious is that auto-power-off deletes the created patch (up to 31 key presses) after 46 seconds of idle. As a last warning it sounds a very low bass note during that you can quickly play a note to get another 46 seconds.
I have started to detailedly document its operation and analyzed the hardware. It sounds much better than the typical beeps of early LCD games. The sound style resembles POKEY/TIA but with higher pitch resolution, and can be compared best with Williams "Gwave" sound engine found in early electronic pinballs and arcade videogames like "Defender".
As the likely world first single-chip softsynth it is historically very important and should be emulated for preservation and research of the algorithm. Thanks Sean I managed to dump the internal rom with a logic analyzer (Zaleae Logic 16 with PulseView on Linux Mint). The PIC1655A is the mask rom version of the eprom based PIC16C55. Both are very close relatives of each other and hence even have a similar rom dump mode, despite it is activated differently. With the documented PIC16C55 pin 1 needs to be set hi and pin 28 connected to programming voltage to make it output rom data bits at pins RB7 (msb) to RA0 (lsb) in a loop (controlled by clock rate, no address signals). The undocumented PIC1655A instead needs the TEST pin 5 pulled to 3V to start dumping, which after reset starts at address $1FF (reset vector) wrapping around from $000.
I had to solder plenty of wires to the synth PCB, added a resistor to disable APO (else it turns off when pin changes level) and disconnect 3 resistors to the audio mixer amp those pulled the level too low. Then I added a 100nF cap parallel to the clock capacitor, which reduced the CLKOUT frequency to about 370Hz (which data sounded like a POKEY noise effect). Finally I could connect the Zaleae Logic 16 with PulseView, setup 12 of its channels and indeed it recorded something that looks like a data pattern repeating about every 512 steps of CLKOUT (which I had set to rising edge trigger). I had let it run about 10s and did another capture with the other voltage level mode. According to Sean the output looks valid. I also checked the audio pins (they are digital) with the logic analyzer. Apparently I had to remove my 100nF clock capacitor to restore it to normal frequency to run the program correctly (may be a reset hardware issue). I had to set the sampling frequency now to 4MHz to see the CLKOUT squarewave without gaps, which either means that the PIC runs at internal almost 2MHz (i.e. externally 8MHz?) or the logic analyzer divides it through the number of channels. I saved in PulseView (.sr = sigrok) 8.5MB (7 zipped) of digital waveform signals.
Interesting is that in synth mode apparently only pin 16 gets modulated with complex PWM patterns (also when parameters E and F swapped), while 13 and 17 (pin 13 is suboscillator and also controls analogue decay rate) are plain squarewave. Apparently some kind of (FM-like) analogue multiplication is going on inside the "DAC" of 4 resistors connected to a transistor base. In the presets of the effect noises (train, helicopter etc.) also other pins show multipulses, those use normal squarewaves in synth mode. The pitch of the "guitar" (synth mode default preset) starts > octaves lower during attack.
I wrote a long text analysis (HTML) of the synth with its undocumented user interface. I made a TXT version of the (almost useless) single page manual, hardware photos and preliminary handdrawn schematics. I e-mailed all that stuff to the MAME team. For emulation will be important that grounding CPU pin 7 disables APO, which else deletes synth memory contents after 46 seconds of idle and so severely limits usability. In MAME a DIP switch should be added here, and also the clock trimmer for tuning. Generally the thing is full of bugs those make the synth behave somewhat unpredictable. Likely residues of the previous sound stay in RAM even after manually entering synth parameters. So savestates of the 32 byte RAM should be supported (if possible with filenames) to store and reload synth patches.
The hardware is built around the GI PIC 1655A-522, which is a documented 8-bit microcontroller with only 512 word of 12-bit mask ROM and 32 byte RAM. It is running a monophonic software synthesizer resembling the famous "Gwave" sound engine of Williams pinball and video arcade games. Although it lacks their iconic bright phasing drone timbres ("Defender" start sound), it does plenty of different crunchy noise waveforms. Many are POKEY-like, but the timbre palette goes beyond that, including e.g. semi-metallic clangs like gongs and ringing bells. For a 1980 toy the thing is crazy. (To get an idea, a Speak & Spell had 16 kByte ROM, which is >21 times more.) With minor redesign, its software could have blown most early budget mini keyboards off the market. This is the same type of British low-cost miracle like the first Sinclair homecomputers. It could have been a game changer; under different circumstances UK instead of Japan would have created the VL-Tone.
The 8 effect noises ("Living Sounds") are strongly synthesized and buttons respond duration sensitive. (Most sound names were choosen by me, because there are only icons on panel buttons and the manual only mentions 2.) The "helicopter" contains noise with high pitched whine that grows louder and quieter. The "telephone" is electronic high pitched, somewhat like tyre screech. The "ufo" is a sequence of 3 fast siren-like noises; the last one fades silent. The "police car" sounds like 2 alternating organ notes. The "train" is a steam locomotive with rough hiss that turns faster and higher (quieter), followed by a realistic whistle (louder again). Also "bee" varies volume. The "racing car" is modulateable; it starts with loud reving up engine (low buzz), but holding the button makes it change gears and drive away (engine grows quieter). The "boat" (ship horn) toots buzzy, followed by a 2nd duller toot of its echo (told by manual - very artificial). Hitting the button quickly sounds for a default length (few seconds). Holding it longer plays them in a loop (some with algorithmic variations) until release of that button. The same 8 noises are as doublets (wired parallel) on the key buttons and thus can not be played melodically.
But the original user manual is a complete disaster. It reads like botched together by a random clueless circuitbender - throwing in buzzwords like "programming" and "computer", it treats the user like an idiot because it explains absolutely nothing about meanings of individual parameters or inner working of the synth. This excerpt is really everything it tells about:
TO CREATE YOUR OWN SOUNDS: An infinite number of sounds, and hours of fun can be had with your Sound FX Phasor by programming the computer yourself. It is possible to programme six different commands into the computer. Each of the six commands is represented by one of the letters A-F on the keyboard and will have a different effect on the sound created. It is not necessary to use all six commands. If desired only one of the commands - letters - may be programmed. To programme the computer first press the 'musical note' key. Next press the 'F' key, this is a double function key i.e. both a command key and the programme enter key. Pressing the 'F' key tells the computer you are going to programme a command. Next select a number from 0-250, press out this number on the keys AND then press one of the six command A-F. You will have now entered your first command. Observe the effect this command will have on the sound of the keyboard when you press any of the keys. If you wish to enter a second command, follow the same procedure. First press 'F' then a number between 0-250 AND then one of the remaining letter keys. Repeat this procedure until as many letters, A-F, as you like have been programmed. Remember it is not necessary to programme all six commands - letters - to create a sound. To gain experience, experiment with the effect of changing just one number/command within a programme. It is good procedure to write the number as you enter them so you will be able to programme an interesting new sound created.
SIREN Press ENTER + 1 + A Press ENTER + 44 + B Press ENTER + 1 + C Press ENTER + 1 + D Press ENTER + 1 + E Press ENTER + 1 + F Press 8 or D
MUSIC CHANGE Press ENTER + 11 + A Press ENTER + 3 + B Press ENTER + 4 + C Press ENTER + 3 + D Press ENTER + 3 + E Press ENTER + 6 + F Press any key
MUSIC CHANGE Press ENTER + 1 + A Press ENTER + 2 + B Press ENTER + 1 + C Press ENTER + 1 + D Press ENTER + 1 + E Press ENTER + 1 + F Press any key
(In the 1st example here of course also other notes can be played; the siren howl tempo follows note pitch. Example 2 is a simple organ with strong fast vibrato (tempo follows note pitch). Example 2 is a simple bright high organ with slightly purring overtone (like the German telephone free-line signal).)
It may be that the original user manual remained so vague because the user interface is so full of bugs that it behaves semi-random and somewhat unpredictable (likely by previous data residues left in RAM). Because that "manual" explains nothing, I wrote my own:
Press the 'musical note' button and play a note on any key beside 'F'. The synth mode starts now with a primitive "guitar" preset sound (2-bit wannabe sawtooth). Its (anyway too short) decay gets truncated by key release, which seems to be the default behaviour in synth mode. Any synth parameter is edited by pressing "enter" (F button), typing any number (this sounds a blip) and pressing one of the 6 letter buttons. Each letter button (also F) sets a corresponding parameter. It is hard to figure out what they exactly do; depending on the parameter. While their range seems to be 0..255 (8 bit, typing bigger numbers wrap around, ignoring upper bits), typing more digits sometimes seems to do more complex things (which may be buffer overflow bugs). Parameters also interact with each others.
After switching on (note icon button), you need to first play a note before setting a parameter, else glitches occur, those however can be used to get different sounds. Apparently default values of the preset sound are only initialized when playing a note before setting any parameter. Particularly the octave of the main voice can strongly change, e.g. depending on which effect noise was previously played. Possibly such semi-random glitches made the designer give up any plans of describing synth parameters in the manual.
* pitch envelope (A, B)
This produces siren-like effects by a triangular pitch envelope. Parameter A sets the vibrato speed by changing the pitch envelope steepnes (0=fastest, 255=slowest). B apparently sets the upper and lower ramp limit, i.e. changes the bounds between that the triangular pitch envelope ramps up and down with the rate selected by A, which makes the vibrato simultaneously deeper and slower (0=shallowest, 255=biggest amplitude). At high depths the pitch will wrap around and thus low note start at a high pitch ascending further until wrap point and continue ascending from the lowest pitch to the max and return to lowest vice versa. Regard that A defaults to off (no vibrato) and thus must be set to make B take effect. But both must be set 0 to disable pitch envelope again.
Pressing the note icon button always resets A and B (removes pitch envelope). Then press 2x F (do not play a note) to keep parameters C..F of the previous sound.
* decay envelope + suboscillator (C)
This modifies the volume decay envelope. I haven't fully figured out the details. Apparently the decay switching frequency for the analogue decay circuit also acts as a suboscillator (e.g. bass) that may decay at different rates (pulse density modulation). Parameter C seems to particularly change the lowest level (like "sustain" in ADSR) to those the oscillator decay during held notes. Values >15 make it decay fully, and higher values decay faster. 0=no decay (plain continuous tone). 255=both decay fastest. Values in between seem to make the suboscillator decay slower and/or less low than the main oscillator and affect its pitch, which adds a buzzy zippernoise-like additional tone. It may be that the step width and -position of the decay get controlled this way.
Regard that while the default preset sound contains decay (C=255?), the first manual change of any parameters disables decay (sets C=0?), thus it needs to be set by hand if you don't want a continuous tone.
Normally the tone immediately stops by key release, although sometimes (using parameters A, B?) a short delay occurs. I don't know if there is a hidden parameter for this or just a glitch. (In opposite to this, the 8 preset sounds of effect mode can run a few seconds without holding a key.)
* square LFO suboscillator (D)
Parameter D sets a frequency ratio to modulate the main voice with a 1:1 square LFO at 100% depth, i.e. it chops the tone on and off with a selected fraction of the note pitch. (0=off, 1=fastest, 255=slowest). Low ratios (high frequencies) fall into the hearing range and so act as a suboscillator to produce a bass voice. E.g. 2 sounds an octave lower. Higher ratios make a purring buzz (like missing the ball in "Pong", or clangs from the Namco game "Bomb Bee") while even higher ratios make the tone toot on and off with a tempo proportional to the note pitch. Apparently this edits the waveform on a deeper level than a simple LFO, because combined with E and F it can turn the tone much lower and buzzier. So it may be that it inserts a blank piece into the waveform by halting the oscillator instead of muting it during zero.
* waveform suboscillator + volume envelope (E, F)
Parameter E and F do the same, thus the same sound is produced with both values exchanged. So I conclude that internally they may be arguments of an addition, multiplication or XOR to produce the resulting waveform and envelope. Setting at least one of these 0 or 1 disables the suboscillator. Regard that E defaults to off and thus must be set to something else to enable this suboscillator.
Parameter E/F add an at least 1 octave lower suboscillator with selectable waveforms that modulates the resulting tone with buzzy multipulse textures approximating linear volume envelopes. The modulation depth is 50% (unlike the the square LFO) and it has different timbres (0=off, 1=off, 2=on, 3..255=waveforms or noise). With E and F set to the same value and other than 0 or 1, the volume pulses high and low (square LFO similar like parameter D). Like D, small numbers produce bass voice; a bigger number pulses slower. When both values differ by 1, a kind of beat frequency modulates it with falling pulse duration envelope. Bigger differences make it beat faster, which may hint that the output is derived from a phasing process, which would explain the name "Phasor". Depending on the values, the pulse duration envelope can be falling sawtooth shape (difference 1), but gradually becomes faster and then triangular to irregular if the difference between E and F is set higher. Unlike parameter C, this envelope speed is proportional to the note pitch. Tones with low E/F difference can sound like hemisync bleeps of old mindmachines (of course here mono). Some high values can produce LFO-like tekkno sound loops those add rhythmic crackling or switch the suboscillator rhythmically on and off.
On oscilloscope the phasing/beating waveform has only 2 volume levels (about 50% and 100%) made from 2 mixed long multipulses. In total the audio is mixed through resistors from 4 digital pins, but the 3rd pin seems to not affect beating and the 4th is pulse density modulated decay envelope control, that also acts as a suboscillator. The logic analyzer reveals that only pin 16 outputs a complex repeating multipulse of falling PWM pulsewidth, that apparently intermodulates with plain squarewaves from pin 17 and 13.
The values seem to have no logical order, thus likely rather technical than ergonomical reasons. E.g. 2, 3, 4, 6, 8, 9, 12, 15, 18, 21, 24, 27, 30, 32 add harmonic overtones, while 5, 7, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31 produce disharmonic noises. I suspect that the bits control an RNG algorithm like shiftregister feedback noise. Sometimes the same value even seems to randomly produce different timbres, so the internal state may produce varying bit loops when ratios are not prime and the random seed differs. Generally many sounds resemble POKEY (the famous Atari chip), but tend to be less disharmonic and have no detuned bass problems, so the frequency resolution is likely higher. Apparently it also fails to produce fully atonal hiss (except as part of effect noises). So its relation to POKEY is more like that of Phase Distortion to FM; despite similar principles, the character of the timbres and its parameters can substancially differ and make of it a unique sound source.
Also Parameter D affects the timbre and makes it even buzzier. So strongly detuned low notes can produce e.g. motor noises or tekkno drones. It may be that this function similar like noise modulation in phase distortion synths. Parameter B seems to also affect pitch of both suboscillators, hence high values can turn the tone even lower and produce more extreme noise when combined with waveforms of E/F.
Parameters D, E and F interact with each other in complex ways those can produce long tone and noise loops. I suspect that bit patterns of different lengths get XORed with each other or something similar, so they need to be treated as a whole. The tempo of everything they do is always proportional to the note pitch frequency. So the ascending pitch of the siren effect by parameter A and B can result in an accelerating throbbing statccato when pulsed by the LFO parameter D.
* octave prescaler
This seems to be an internal parameter that can not be set directly. But you can change the base octave of the synth by playing an effect noise, switching to synth mode and pressing 2x 'F', which leaves residues of the previous sound in RAM including the octave setting. Hence entering parameters C, D, E, F manually (A and B reset anyway) will now make them sound in the octave of the previously played effect noise.
* internal sounds
The "guitar" default preset is set automatically by playing a note after power on. It resembles the parameters (A=0, B=0, C=255?? , D=2, E=0? F=0?), but the tone is 1.5 octaves lower during attack, thus C and possibly A and B seem wrong. After power-on, pressing 2x "F" (enter) instead of a note prevents this and so keeps parts of the previous parameters in memory. When the last sound was the APO bass, it adjusts the synth to a very low short crackling buzz sound (A=0??, B=0??, C=255, D=255?, E=120?, F=255?). I find no obvious identical settings, because changing one parameter apparently resets others to "sane" values. This confusing behaviour was likely done to need less typing for popular synth patches.
The effect noises seem more complex than what can be manually done with synth parameters. Although I haven't fully researched details, I suspect that those "Living Sounds" contain additional preprogrammed fast envelope sequences. They are not supposed to be editable nor played on note keys, but when previously an effect noise was played, switching to synth mode and pressing 2x "F" keeps residues of it in memory. But only the "police car" timbre stays fully intact as an organ tone. The "boat" turns into a low organ tone, which lowest playable note is somewhat higher than that ship horn. Of the "ufo" part 1 and 2 (release button to stop) produce a fast purring noisy tone, but part 3 a surprising disharmonic semimetallic buzzing clang. From the "train" remains only a high organ beep (so its rough hiss noise is likely out of reach); "telephone" becomes the same. The "bee" turns into a buzzy kind of e-bass; stopping later makes it duller. Also "racing car" turns into a buzzy decaying bass. The "helicopter" becomes a (heavy metal chord?) noisy and buzzy low synth bass; if stopped later, the result is less buzzy with decay. The results can be a little random, likely depending on the exact time when the Living Sound gets stopped. But they can not be stopped at their begin at arbitrary spots (not even with "on" buttons) which hints that they occupy full CPU capacity with nothing left for sensing other buttons. The stop behaviour varies with the noise; e.g. "train" and "boat" need 1 second to recognize stop, while others stop faster.
note: Some of my conclusions may be completely wrong, and there may be hidden features in a way that certain entered numbers or individual bits in them may e.g. select FM operators or other modulation targets or set things from an internal list in unobvious ways. It feels like pushing random buttons on a DX-7 without display to figure out by ear how it works. This thing does program loop synthesis, i.e. it is a "dirty" softsynth that messes with internal parameters in all kinds of strange ways to generate a variety of different sounds from very little memory.
Thanks. Technically this synth is quite simple, but that makes it exciting because it was more a hack (program loop synthesis) than optimized to precisely fulfil a predefined music theory.
You likely need to integrate over the pulse duration at pin 13 (hi=louder, lo=quieter) to mimic the capacitor for the volume envelope. The pulse width(?) from pin 13 controls the analogue decay rate (synth parameter C); the frequency is a fraction of the note pitch and additionally acts as a (often bass) suboscillator. The unused pin 7 disables the annoying APO so long it is pulled lo. It is important to add a DIP switch for this because APO makes the synth almost unusable.
Pin 17 goes hi only during the "train" effect noise and nowhere else (may be dead code from older software, or planned to switch a filter or light effect for a different toy). Pin 6 (wired to GND) disables the keymatrix out pins when pulled hi (i.e. no keys except the 2 power-on buttons work). Powering on with both pin 8 and 9 pulled lo starts in noise effect mode. Also pulling APO resistor from pin 12 hi (turns supply voltage on) during standby starts noise effect mode (hence can not be used to continue from standby with intact synth patch in RAM). Pin 11 stays always pulled low. Strange is that pin 1is wired hi trough a separate wire bridge (not PCB trace) despite pulling it lo has no effect; likely a prototype version used the eprom version PIC16C55 which uses this pin for eprom write mode.
Pin 10 rising edge (pull low and release) retriggers the analogue decay envelope. Holding pin 10 lo (through a resistor to avoid CPU damage) causes slow attack in all sounds.
Tones from pin 13, 15, 16, 17 are mixed through resistors to form the tone waveform. (pin13=R10 5.6k, pin 15=R13 68k, pin 16=R14 12k, pin 17=R15 1k). But pin 15 is only used during few sounds (button blips, power-on beeps, APO warning bass, effect noise "telephone"), so only 3 bits remain for the synth waveform, mixed from in synth mode 2 squarewaves and a complex multipulse. The result is routed through the analogue decay circuit.