The Casio Cosmo Synthesizer was a prototype computer-based workstation instrument conceived along the lines of the NED Synclavier and Fairlight CMI. It was most notably used by Isao Tomita on Dawn Chorus, where he used the waveform drawing feature to sonify astronomical radio signals. The complete system consisted of a computer (Casio FP-6000S with monitor, keyboard, mouse, graphics tablet and an expansion unit containing special interface cards to connect to the other hardware), controller keyboard (Casiotone 6000, which is velocity and pressure sensitive), MIDI interface, 2 SPU units (sample playback) and 6 PDU units (phase distortion; these are apparently roughly equivalent to the CZ-101 or CZ-1000, but with no control panel). Everything was controlled via MIDI, but the SPU units also connected directly to the computer for waveform editing. The PDU modules likely use the same µPD933 ICs as the CZ series, but possibly with 16 bit linear DACs rather than the CZ’s lower quality floating point DACs. The CZ-101 and CZ-1000 were introduced a few months after the Cosmo Synthesizer, but the SPU remained in development for two more years as the ZZ-1. It was apparently completed and ready for production, but was canceled because it seemed to not be commercially viable. Only very vague specifications were released, and of course no service manuals are available, but both the SPU and ZZ-1 are described in greater detail in several patents.

The MIDI interface, SPU, PDU and ZZ-1 are shown in this video:


SPU front panelCasio SPU panel

SPU tone generator block diagram

Casio SPU

The SPU is described in US patents 4681008, 4970935 and 5160798 (these are nearly identical), with a more detailed description of the hardware given in patent 4667556. It’s a 4 note polyphonic sampler with VCAs for amplitude scaling and no filters. It performs 12 bit linear sampling at 40 kHz and has 128 Ki x 12 of sample memory for about 3.28 seconds of sample time. This can be divided into up to 8 samples of arbitrary length, which are assigned to different keyboard zones and velocity levels, each with its own set of voice parameters. ADSR amplitude envelopes are generated in software. The SPU has 4 output jacks for each of the 4 voices, plus a mono mix output. At heart, the SPU appears to be a very basic sampler, although it’s velocity sensitive and introduces some advanced features, like triggered sampling with pre-recording, velocity switching of multisamples and automatic selection of loop points at zero crossings. Its biggest asset is that the waveform memory can be read and written by the host computer via a dedicated bus. This enables software-based waveform editing, synthesis and drawing using a mouse or graphics tablet. Another very unique feature is that each of the voice channels can independently be used to either read from or write to the waveform memory. This means that it’s simultaneously capable of sampling and polyphonic sample playback. In the SPU, this is only used to monitor the sound as it’s being sampled. In the ZZ-1, however, this feature is further exploited to obtain modulation delay and resampling effects. Other details are less clear, but it appears to use time mutiplexed phase accumulators with linear interpolation (17 integer bits and 13 fractional bits). This makes the SPU the first sampler to use linear interpolation (although there were synthesizers that did this going back to the Allen Digital Computer Organ in 1971). It’s also vaguely implied that the playback sample rate might be 160 kHz (since the phase increment when recording samples is 0.25).

Linear interpolation

Casio SPU interpolation

Japanese patent JPH06110466 describes the SPU’s editor software that ran on the FP-6000S computer. There was also software for editing the PDU’s sounds, a 16 track real time sequencer and a separate step sequencer that displayed notes on a staff. There are some screenshots of the sequencer software here.

Sound loading screen

Casio cosmo UI 1

Editing the waveform using the mouse

Casio cosmo UI 2

Setting sample start, end and loop points

Casio cosmo UI 3

Sound parameter edit screen

Casio cosmo UI 4

ZZ-1 front panel

Casio ZZ-1 panel

ZZ-1 tone generator block diagram

Casio ZZ-1

The ZZ-1 was intended to be the commercial version of the SPU. Yukihiro Takahashi (ex-Yellow Magic Orchestra) and Hajime Tachibana (ex-Plastics) served as design consultants. Takahashi may have recorded the drum sounds for the RZ-1 (which were later reused as lower quality samples in the MSM6294 ICs), and I think Tachibana, who also worked as a graphic designer, designed the front panels for the ZZ-1 and some of the CZ models (so you can think of him as you struggle to clean the dust out of the crevices of your CZ-5000). The ZZ-1 is mostly similar to the SPU, retaining the computer interface. This seemed to be modified for use with computers other than the FP-6000S, although I don’t know what platforms Casio intended to support. The sample memory is still 128 Ki x 12, but the samples can now be recorded at 5, 10, 20 or 40 kHz. It also adds polyphonic voltage controlled filters and the ability to use its simultaneous sampling and playback capability as either a 3 tap modulation delay (described in patents 4864625 and 5050216, which are nearly identical) or for 3 note polyphonic resampling, sample mixing and overdubbing (described in patents 4754680, 5025700 and 5136912, which are nearly identical). The channel used to write to the waveform memory can also pass the input signal directly to the DAC, so that the dry signal can be present in the output without requiring an additional analog signal path. The ZZ-1 has two types of feedback, one from a single delay tap (between the VCF and VCA) and a second that feeds the mix out (the sum of all delay taps) back to the input. It’s described as offering delay, reverb and chorus effects, but I expect the reverb would be very poor, really just a multitap delay with one tap used for feedback. The delay effects should be approximately comparable to the Korg SDD-3300. It should also hypothetically be possible to implement pitch shifting, though this isn’t mentioned in the patents. It must be noted that the ZZ-1 can function either as a sampler or a delay, but not both at the same time. The ZZ-1 also has 8 outputs on the rear panel. While this might seem to imply 8 note polyphony (i.e. adding a second tone generator that shares the same sample memory), I think it’s more likely that it’s still 4 note polyphonic, and the 8 outputs are for the 8 different samples (this would be useful as a drum sampler). This would mean that the ZZ-1 also adds some signal routing circuits.

Modulation delay example for a chorus effect

Casio ZZ-1 delay modulation

It seems that by the time the ZZ-1 was ready for production in 1986, it wasn’t really a competitive product. Compared to the competition, it was overpriced and underpowered. Even with the unique and fairly powerful delay functionality and resampling/overdubbing capabilities, a sampler with only 4 note polyphony and 128 KiWords of sample memory was unimpressive. Likely these restrictions were fixed into the designs of custom ICs and thus could not be easily improved. At the same time, the exchange rate was rapidly becoming less favorable for Japanese companies. The estimated price of the ZZ-1 was ¥ 1,000,000. In early 1985 this would have been about 4000 USD; by mid 1986 it was about $6400. For comparison, the Sequential Circuits Prophet 2000 came out in 1985 and cost about $2500, and the Emu Emax was introduced in 1986 starting at $2995. Both of these were considerably more capable samplers than the ZZ-1. The ZZ-1 seemed to get an unenthusiastic reception from prospective distributors, so its release was canceled. The FZ-1 was quickly developed as a more professional sampler, apparently by some of the same team that designed the SPU and ZZ-1. It was released in 1987 for ¥ 298,000.

Other than the SPU, the ZZ-1 doesn’t seem to be related to any other Casio product. It’s likely that it was based on one or more custom ICs that were never produced in quantity. It did, however, influence Casio’s later designs. The FZ and SK models do have a few things in common with the ZZ-1, and the linear interpolation and high playback sample rate were used in many subsequent Casio products. It’s also possible that the VCFs used in the ZZ-1 may have been the NJM2090 ICs used in the HT and HZ models.


Get the PD patch here. It’s simplified and permits manual control. It runs in PD Vanilla. The full album is here.

Here are 8 sawtooth oscillators gliding up and down in pitch in equal intervals. They start at unison and end in octaves, a tritone from the starting pitch. In between are a surprising number of audible consonances, even though the overall sound is generally very dissonant. To avoid extremes in pitch, each oscillator is actually a Shepard-Risset glissando that returns to the same pitch every two octaves.

The most frequently used model of consonance is harmonic concordance. For a simultaneity of multiple tones, consonance is heard when partials from one tone coincide with partials from another. For tones consisting of a harmonic series, this happens at integer ratios. For inharmonic tones, consonances occur at different intervals where the inharmonic partials coincide.

In the video you can see only a very small number of harmonics, but the effect is illustrated rather clearly. Consonances are audible when lines intersect and overlap. This isn’t the only way to represent it on a spectrogram. There’s a lot to explore by viewing it at different scales. It probably looks more interesting when zoomed out, but I think the video corresponds most closely to what’s actually audible.

Here the consonances occur both at small integer ratios, and because the same inteveral is stacked 8 times, also at roots of those ratios, up to the seventh root. The greatest consonances occur when fundamental frequencies (and consequently all harmonics) coincide at equal divisions of the octave, up to 7 EDO. At 8 EDO intervals (odd multiples of 150 cents), all tones are equally spaced and none overlap. In general, partials audibly coincide about every 2 cents.

Here’s a list of audibly consonant intervals. The columns represent the time where the interval occurs, the interval size in cents and the equivalent ratio. This isn’t a complete list; it includes only the relatively simple intervals. I made it by stepping through all possible intervals 0.1 cents at a time and noting the consonances. Then I found the ratios using an octave script. The output is edited somewhat.

00:00 0000.000 unison
00:25 0025.106 sixth root of 12/11
00:32 0032.075 fourth root of 14/13
00:32 0032.093 sixth root of 19/17
00:32 0032.985 cube root of 18/17
00:33 0033.001 fifth root of 11/10
00:33 0033.025 seventh root of 8/7
00:33 0033.985 sixth root of 9/8
00:36 0036.481 fifth root of 10/9
00:38 0038.512 fifth root of 19/17
00:38 0038.529 sixth root of 8/7
00:41 0041.251 fourth root of 11/10
00:42 0042.766 cube root of 14/13
00:44 0044.400 square root of 20/19
00:44 0044.478 sixth root of 7/6
00:45 0045.092 seventh root of 6/5
00:46 0046.191 cube root of 13/12
00:46 0046.235 fifth root of 8/7
00:50 0050.212 cube root of 12/11
00:52 0052.607 sixth root of 6/5
00:53 0053.374 fifth root of 7/6
00:55 0055.001 cube root of 11/10
00:55 0055.866 square root of 16/15
00:57 0057.756 cube root of 21/19
00:57 0057.777 seventh root of 24/19
00:57 0057.794 fourth root of 8/7
00:57 0057.842 fifth root of 13/11
01:00 0060.801 cube root of 10/9
01:03 0063.128 fifth root of 6/5
01:04 0064.386 sixth root of 5/4
01:06 0066.718 fourth root of 7/6
01:07 0067.970 cube root of 9/8
01:09 0069.286 square root of 13/12
01:11 0071.090 eighth root of 25/18
01:12 0072.514 sixth root of 9/7
01:15 0075.319 square root of 12/11
01:17 0077.058 cube root of 8/7
01:17 0077.186 eighth root of 10/7
01:18 0078.910 fourth root of 6/5
01:22 0082.502 square root of 11/10
01:23 0083.007 sixth root of 4/3
01:24 0084.467 21/20
01:24 0084.602 cube root of 22/19
01:26 0086.852 fourth root of 11/9
01:28 0088.801 20/19
01:28 0088.957 cube root of 7/6
01:29 0089.868 fourth root of 16/13
01:31 0091.202 square root of 10/9
01:33 0093.603 19/18
01:36 0096.578 fourth root of 5/4
01:39 0099.609 fifth root of 4/3
01:41 0101.955 square root of 9/8
01:45 0105.214 cube root of 6/5
01:48 0108.771 fourth root of 9/7
01:50 0110.254 cube root of 23/19
01:51 0111.591 fourth root of 22/17
01:51 0111.731 16/15
01:52 0112.043 cube root of 17/14
01:55 0115.587 square root of 8/7
01:56 0116.107 fourth root of 17/13
01:56 0116.993 sixth root of 3/2
02:04 0124.511 fourth root of 4/3
02:08 0128.697 eighth root of 29/16
02:13 0133.435 square root of 7/6
02:15 0135.614 sixth root of 8/5
02:18 0138.376 sixth root of 21/13
02:18 0138.404 seventh root of 7/4
02:18 0138.573 13/12
02:20 0140.391 fifth root of 3/2
02:27 0147.393 sixth root of 5/3
02:30 0150.000 one step in 8 EDO (all tones are equally spaced)
02:30 0150.637 12/11
02:30 0150.727 fifth root of 17/11
02:34 0154.372 fourth root of 10/7
02:37 0157.821 square root of 6/5
02:46 0166.015 cube root of 4/3
02:51 0171.429 one step in 7 EDO
02:55 0175.489 fourth root of 3/2
02:56 0176.872 fifth root of 5/3
02:56 0176.905 sixth root of 24/13
02:59 0179.736 square root of 16/13
03:02 0182.404 10/9
03:03 0183.728 fifth root of 17/10
03:06 0186.626 fifth root of 12/7
03:13 0193.157 square root of 5/4
03:15 0195.623 fourth root of 11/7
03:19 0199.218 fifth root of 16/9
03:20 0200.000 one step in 6 EDO
03:23 0203.422 fourth root of 8/5
03:23 0203.910 9/8
03:25 0205.829 cube root of 10/7
03:26 0206.999 fifth root of 20/11
03:28 0208.754 square root of 14/11
03:29 0209.873 fifth root of 11/6
03:32 0212.182 square root of 23/18
03:32 0212.206 cube root of 13/9
03:36 0216.687 17/15
03:37 0217.493 sixth root of 17/8
03:37 0217.542 square root of 9/7
03:41 0221.090 fourth root of 5/3
03:43 0223.095 sixth root of 13/6
03:43 0223.181 square root of 22/17
03:47 0227.107 square root of 13/10
03:51 0231.174 8/7
03:53 0233.985 cube root of 3/2
04:00 0240.000 one step in 5 EDO
04:02 0242.206 fourth root of 7/4
04:09 0249.022 square root of 4/3
04:10 0250.188 seventh root of 11/4
04:12 0252.607 sixth root of 12/5
04:13 0253.805 22/19
04:14 0254.972 cube root of 14/9
04:18 0258.688 seventh root of 37/13
04:18 0258.721 fifth root of 19/9
04:24 0264.344 square root of 19/14
04:24 0264.386 sixth root of 5/2
04:26 0266.871 7/6
04:28 0268.475 square root of 15/11
04:31 0271.229 cube root of 8/5
04:31 0271.708 seventh root of 3/1
04:33 0273.001 fifth root of 11/5
04:35 0275.659 square root of 11/8
04:35 0275.702 sixth root of 13/5
04:40 0280.176 cube root of 13/8
04:40 0280.782 fifth root of 9/4
04:43 0283.007 sixth root of 8/3
04:43 0283.025 fourth root of 25/13
04:44 0284.197 cube root of 18/11
04:49 0289.210 13/11
04:51 0291.256 square root of 7/5
04:54 0294.786 cube root of 5/3
05:00 0300.000 one step in 4 EDO
05:00 0300.004 seventh root of 37/11
05:01 0301.500 square root of 17/12
05:08 0308.744 square root of 10/7
05:11 0311.043 cube root of 12/7
05:15 0315.641 6/5
05:18 0318.309 square root of 13/9
05:22 0322.942 cube root of 7/4
05:24 0324.341 square root of 16/11
05:27 0327.017 fifth root of 18/7
05:32 0332.030 cube root of 16/9
05:32 0332.075 fourth root of 28/13
05:36 0336.130 17/14
05:39 0339.609 fifth root of 8/3
05:42 0342.857 two steps in 7 EDOs
05:44 0344.999 cube root of 20/11
05:45 0345.601 fourth root of 20/9
05:47 0347.390 fifth root of 30/11
05:47 0347.393 sixth root of 10/3
05:47 0347.408 11/9
05:50 0350.978 square root of 3/2
05:56 0356.502 fifth root of 14/5
05:57 0357.794 fourth root of 16/7
05:59 0359.472 16/13
06:03 0363.498 fifth root of 20/7
06:06 0366.718 fourth root of 7/3
06:07 0367.300 sixth root of 25/7
06:10 0370.400 cube root of 19/10
06:12 0372.893 square root of 20/13
06:16 0376.819 square root of 17/11
06:18 0378.910 fourth root of 12/5
06:20 0380.391 fifth root of 3/1
06:20 0380.436 cube root of 29/15
06:22 0382.458 square root of 14/9
06:26 0386.314 5/4
06:31 0391.246 square root of 11/7
06:36 0396.578 fourth root of 5/2
06:40 0400.000 one step in 3 EDO
06:44 0404.377 fourth root of 28/11
06:44 0404.442 24/19
06:46 0406.843 square root of 8/5
06:54 0414.006 seventh root of 16/3
06:57 0417.493 sixth root of 17/4
06:57 0417.508 14/11
06:57 0417.695 fourth root of 21/8
07:00 0420.264 square root of 13/8
07:04 0424.364 23/18
07:04 0424.511 fourth root of 8/3
07:13 0433.803 seventh root of 52/9
07:14 0434.985 cube root of 17/8
07:15 0435.084 9/7
07:22 0442.179 square root of 5/3
07:26 0446.191 cube root of 13/6
07:26 0446.363 22/17
07:26 0446.999 fifth root of 40/11
07:30 0450.000 three steps in 8 EDO
07:30 0450.212 cube root of 24/11
07:32 0452.607 sixth root of 24/5
07:34 0454.214 13/10
07:37 0457.901 sixth root of 44/9
07:39 0459.098 seventh root of 32/5
07:40 0460.801 cube root of 20/9
07:40 0460.816 fourth root of 29/10
07:44 0464.428 17/13
07:46 0466.565 square root of 12/7
07:47 0467.970 cube root of 9/4
07:50 0470.781 21/16
07:53 0473.098 square root of 19/11
07:55 0475.489 fourth root of 3/1
08:00 0480.000 two steps in 5 EDO
08:03 0483.007 sixth root of 16/3
08:04 0484.413 square root of 7/4
08:18 0498.045 4/3
08:25 0505.214 cube root of 12/5
08:33 0513.001 fifth root of 22/5
08:34 0514.286 three steps in 7 EDO
08:35 0515.803 cube root of 22/9
08:39 0519.824 cube root of 32/13
08:41 0521.090 fourth root of 10/3
08:44 0524.681 square root of 11/6
08:48 0528.687 19/14
08:48 0528.771 cube root of 5/2
08:50 0530.714 square root of 24/13
08:53 0533.282 fourth root of 24/7
09:00 0540.279 square root of 28/15
09:02 0542.206 fourth root of 7/2
09:03 0543.015 26/19
09:04 0544.134 square root of 15/8
09:05 0545.028 cube root of 18/7
09:11 0551.318 11/8
09:11 0551.405 cube root of 13/5
09:14 0554.399 fourth root of 18/5
09:19 0559.420 cube root of 29/11
09:23 0563.382 18/13
09:26 0566.015 cube root of 8/3
09:26 0566.050 square root of 25/13
09:29 0569.599 sixth root of 36/5
09:39 0579.609 fifth root of 16/3
09:42 0582.512 7/5
09:47 0587.794 cube root of 36/13
09:47 0587.807 fourth root of 35/9
09:54 0594.171 cube root of 14/5
10:00 0600.000 one step in 2 EDO
10:05 0605.829 cube root of 20/7
10:12 0612.206 cube root of 26/9
10:17 0617.488 10/7
10:30 0630.376 square root of 29/14
10:33 0633.985 cube root of 3/1
10:36 0636.498 fifth root of 44/7
10:36 0636.618 13/9
10:38 0638.478 square root of 23/11
10:45 0645.601 fourth root of 40/9
10:48 0648.682 16/11
10:55 0655.866 square root of 32/15
10:56 0656.985 19/13
10:57 0657.794 fourth root of 32/7
10:59 0659.721 square root of 15/7
11:09 0669.286 square root of 13/6
11:15 0675.222 cube root of 29/9
11:15 0675.319 square root of 24/11
11:18 0678.910 fourth root of 24/5
11:20 0680.176 cube root of 13/4
11:24 0684.197 cube root of 36/11
11:25 0685.714 four steps in 7 EDO
11:34 0694.786 cube root of 10/3
11:41 0701.955 3/2
11:55 0715.587 square root of 16/7
12:00 0720.000 three steps in 5 EDO
12:04 0724.511 fourth root of 16/3
12:13 0733.435 square root of 7/3
12:15 0735.572 26/17
12:19 0739.199 cube root of 18/5
12:20 0740.006 23/15
12:29 0749.788 cube root of 11/3
12:30 0750.000 five steps in 8 EDO
12:33 0753.001 fifth root of 44/5
12:33 0753.637 17/11
12:37 0757.821 square root of 12/5
12:44 0764.916 14/9
12:59 0779.736 square root of 32/13
13:02 0782.492 11/7
13:13 0793.157 square root of 5/2
13:15 0795.558 19/12
13:20 0800.000 two steps in 3 EDO
13:23 0803.400 seventh root of 103/4
13:33 0813.686 8/5
13:47 0827.107 square root of 13/5
13:50 0830.253 21/13
13:56 0836.502 fifth root of 56/5
14:00 0840.528 13/8
14:02 0842.206 fourth root of 7/1
14:09 0849.022 square root of 8/3
14:12 0852.592 18/11
14:14 0854.399 fourth root of 36/5
14:15 0855.001 cube root of 22/5
14:17 0857.143 five steps in 7 EDO
14:23 0863.870 28/17
14:35 0875.659 square root of 11/4
14:41 0881.691 square root of 36/13
14:44 0884.359 5/3
14:51 0891.256 square root of 14/5
14:56 0896.859 square root of 31/11
15:00 0900.000 three steps in 4 EDO
15:05 0905.214 cube root of 24/5
15:10 0910.790 22/13
15:15 0915.803 cube root of 44/9
15:24 0924.341 square root of 32/11
15:33 0933.129 12/7
15:46 0946.195 19/11
15:50 0950.978 square root of 3/1
15:57 0957.794 fourth root of 64/7
16:00 0960.000 four steps in 5 EDO
16:06 0966.015 cube root of 16/3
16:08 0968.826 7/4
16:27 0987.747 23/13
16:33 0993.001 fifth root of 88/5
16:36 0996.090 16/9
16:40 1000.000 five steps in 6 EDO
16:57 1017.596 9/5
17:00 1020.264 square root of 13/4
17:08 1028.571 six steps in 7 EDO
17:22 1042.179 square root of 10/3
17:29 1049.363 11/6
17:30 1050.000 seven steps in 8 EDO (all tones are equally spaced)
17:30 1050.013 square root of 37/11
17:41 1061.427 24/13
17:46 1066.565 square root of 24/7
18:04 1084.413 square root of 7/2
18:08 1088.269 15/8
18:28 1108.798 square root of 18/5
18:37 1117.498 square root of 40/11
18:44 1124.681 square root of 11/3
18:52 1132.100 25/13
18:59 1139.199 cube root of 36/5
19:04 1144.134 square root of 15/4
19:05 1145.036 31/16
20:00 1199.700 octave (slightly detuned)

One thing worth noting here is that many intervals are almost exactly equal divisions of other intervals. For example, the 11/9 neutral third (347.408 cents) is close to two equal divisions of 3/2 (350.978 cents), three equal divisions of 20/11 (344.999 cents), four equal divisions of 20/9 (345.601 cents), five equal divisions of 30/11 (347.390 cents) and six equal divisions of 10/3 (347.393 cents). This implies that interesting chords can be constructed by stacking these intervals.

Made in Pure Data, 2018.

Spotify link

I sampled the drum sounds from the Technics SX-KN800. Many of the sounds are similar to the ones in the AX7, but there are some additional sounds (inexplicably including a selection of bird sounds), and they’re also somewhat brighter because the KN800 uses a different sample playback engine. These should also include all the drum sounds used in the SX-K700, K500, KN600, KN400, KN200, and probably the related EX, EN, GX and GN organ models circa 1987-1991.

The drum sounds in the KN800 are panned in stereo, with certain sounds cycling between several different pan positions. I mixed all the sounds to mono. A few are sustained looping sounds, so you can loop and gate them to taste. I carefully filtered the sounds to reduce noise, although some still remains. There are 3 different drum kits for the basic sounds (bass drum, snare and toms). A few of these are duplicates, so I put them in a separate folder.

The KN800 was the successor to the K700, which was the first fully sample based home keyboard using the same sample playback engine for the drums and keyboard tones. It’s in many ways the first really mature arranger keyboard. Compared to the K700, the KN800 adds more polyphony (24 notes vs. 16), velocity sensitivity (introduced in the AX7), a fairly good digital reverb (considerably better than the AX7), and a much more mature arranger section with a programmable drum pattern, bass line and 3 polyphonic parts. The sequencer is fairly sophisticated and the timing is much tighter than the earlier models. Much of the design carried over to the later KN1000, which introduced a completely different sample playback engine with 32 note polyphony and a much larger waveform ROM.

Similar to the K700 but unlike the AX7, the KN800 has a fairly standard rompler voice architecture with only basic editing, but it also includes an interesting retrigger mode and a large selection of complex pitch envelopes. There are no filters or other advanced features, but overall the sound quality is surprisingly good. It’s easy to layer and detune up to 6 voices, each with independent pitch modulation, although this of course reduces the polyphony. There are only 16 notes of polyphony available for the keyboard sounds (the other 8 are allocated to the drums, bass and “back ground sound”, using a separate tone generator), so the main weak point here is that the polyphony runs out very quickly.

Patch banks for Ensoniq ESQ-1, ESQ-M, SQ-80

Patch banks for Casio VZ-1, VZ-10M, VZ-8M, PG-300, PG-310, PG-380

They were programmed by me, circa 2001-2005.

Edit: I actually don’t know if the VZ patch dump works. I can try dumping the sounds again if it doesn’t.

The oscillator portion of the Kawai K3 consists of 12 digital oscillators with a fairly clean sound comparable to the Korg DWGS models, however its design is remarkably simple and uses no custom ICs.

In general, it’s difficult to design a practical polyphonic digital synthesizer using only off-the-shelf parts, since even a straightforward oscillator design ends up being complicated and expensive. A divide-by-n based design generally needs separate hardware for each oscillator. While this is simple for a monophonic instrument, it doesn’t scale well for polyphonic synthesizers. Phase accumulators are better suited to polyphonic instruments because time multiplexing can be implemented easily, but to obtain good enough pitch resolution the phase accumulator needs to be about 24 bits wide. Many general purpose logic ICs like the 74283 adder only handle 4 bits, so between the phase memory, frequency memory, phase adder and phase latch, a standard implementation needs about 24 ICs just for the phase accumulator. An example of this is the PPG Wave 2.2’s PROZ board, which contains 72 ICs. Further, unless the sample rate is very high, it’s desirable to have good quality interpolation in order to avoid objectionable aliasing. But this generally requires a multiplier, and multipliers were expensive at the time. Alternatively, truncation can be used with highly oversampled waveform data, as in the Korg DWGS models. This doesn’t use a multiplier, but instead requires a large amount of waveform memory. To reduce the size and complexity of the hardware, most practical digital oscillator designs used custom ICs that integrate the phase accumulator and multiplier (if applicable) into a smaller package. But while custom ICs can offer good performance with simple hardware, they can be expensive to design, and are thus not well suited to relatively inexpensive instruments with small production runs.

While there were a few commercially available polyphonic digital synthesizers and samplers built from only off-the-shelf parts (including the PPG Wave 2, 2.2 and 2.3, DK Synergy, NED Synclavier, Fairlight CMI, Dynacord ADD One, Gleeman Pentaphonic, digital organs made by Wersi and Hohner, and most divide-by-n samplers), they were generally expensive and complicated. As far as I’m aware, the only really economically designed digital synthesizer of any significance to use only off-the-shelf parts was the Kawai K3, and additionally some computer peripherals like the Mountain Computer Music System (best known as the digital oscillator boards for the Syntauri alphaSyntauri), Acorn Music 500/Hybrid Music 5000/Peartree Computers Music 87, and the extremely obscure Clef PDSG. The K3 has a remarkably small parts count, with the digital oscillator board containing only 35 ICs. This is achieved by implementing the phase accumulator, linear interpolation and waveform address generation in very clever and efficient ways. A few of the other models I mentioned were similarly clever (mainly the Dynacord ADD One, Wersi and Hohner organs, and the Acorn Music 500). I’ll try to describe some of those later.

Follow along with the annotated schematic:


The K3’s master clock is 12 MHz, fixed frequency. The output sample rate is 41.667 kHz (144 clocks per sample, 12 clocks per oscillator). The phase accumulator seems to be 23 or 24 bits. The phase for each oscillator is calculated in 3 passes, 8 bits at a time. Compared to a more straightforward implementation that uses a 24 bit wide data path to compute the phase all at once, this is significantly slower. This means that the maximum polyphony and sample rate are limited, but it requires far less hardware. In total, the phase accumulator uses only 6 ICs, plus 4 more to permit writing to the frequency memory. Since the phase and frequency data are time multiplexed, 3 more latch ICs are also needed to select the correct data for the waveform generation section.

The other clever thing is the way the waveforms are stored and reproduced. The K3 uses a series of ROMs to select the multisampled waveforms and implement linear interpolation in a very simple way. This interpolation technique is carried over from Kawai’s ADEPT digital additive organ models from 1981, used here in simplified form. I think this makes the K3 the only commercial digital synthesizer that implements linear interpolation in the digital domain without using a custom IC or high resolution multiplier.

For tabularized waveform wave(n) and fractional component frac, linear interpolation can be implemented in two ways:

out = wave(n) * (1-frac) + wave(n+1) * frac

out = wave(n) + (wave(n+1) – wave(n)) * frac

While these are mathematically equivalent, the second formula requires fewer multiply operations. In the K3, the differential waveform wave(n+1) – wave(n) is tabularized in a second waveform ROM. For linear interpolation, the output of this differential waveform ROM must then be scaled by the fractional waveform address, then added to the output of the main waveform ROM.

The scaling is typically performed by a multiplier, but historically this was a major problem for affordable digital synthesizers, since multipliers were complicated and expensive. They were eventually incorporated into ASICs, but before the late 80s it was generally desirable to find clever ways to eliminate multiply operations entirely. But linear interpolation of 8 bit waveforms reproduced by an 8 bit DAC doesn’t really require a high resolution multiplier. It’s good enough to use a small number of fractional bits, since much of the benefit from more fractional bits would be lost in the quantization distortion anyway. So it’s sufficient here to perform linear interpolation with 3 fractional bits using an 8 x 3 bit multiplier with 8 bit output.

While not necessarily elegant or efficient, any combinational logic, including a multiplier, can be implemented in a ROM. The size of the ROM required depends on the number of inputs and outputs needed by the multiplier. A 16 x 16 bit multiplier with 32 bit output could be implemented as a 4Gi x 32 ROM. Obviously that’s not practical, but a cheap EPROM can be used to easily implement a lower resolution multiplier. In this case it only needs a 2Ki x 8 ROM. The interpolation ROM contains 8 different sets of line segments with slopes 0, 1/8, 2/8, 3/8, 4/8, 5/8, 6/8 and 7/8. The output of the differential waveform ROM drives the lower bits of the interpolation ROM (A0 to A7) and the fractional waveform address drives the upper bits (A8 to A10). The ROM’s output is thus the differential waveform scaled by the fractional address. This is then added to the output of the main waveform ROM with an 8 bit adder, implementing the above formula for linear interpolation with one multiplication.

There are two 32Ki x 8 waveform ROMs, one for the main waveform and one for the differential waveform. These contain 31 stored waveforms (the remaining space is empty), plus there are two 2Ki x 8 SRAMs for two programmable waveforms (in practice only one is available at a time). The user waveforms are synthesized by the CPU and written to the waveform RAM. Only 32 out of 128 harmonics may be programmed (this is purely a software limitation), but in all other respects the user waveforms are exactly the same as the other waveforms. Between the two waveform memories, each waveform is 2 x 1Ki x 8. The complete waveform is stored; the waveforms are all summations of sines, but no tricks are used to exploit the odd symmetry that results.

The 1024 points per waveform are divided into 6 multisamples:

  • octave 1: 512 points, 128 harmonics
  • octave 2: 256 points, 64 harmonics
  • octave 3: 128 points, 32 harmonics
  • octave 4: 64 points, 16 harmonics
  • octave 5: 32 points, 8 harmonics
  • octave 6: 32 points, 4 harmonics

Compared to the Korg DWGS models, the waveforms are oversampled much more modestly. This doesn’t degrade the sound quality, because linear interpolation attenuates the high frequency images more than truncation. In total, the K3’s waveform memory is 64Ki x 8 for 32-ish waveforms, vs. 64Ki x 8 for 8 waveforms in the DW-6000. So the K3 stores 4 times as many waveforms in the same amount of memory.

The waveform ROM is addressed in an unusual way. The address bits can be broken down as follows:

  • WA10 to WA15: These come from the CPU and select the waveform. WA15 selects between the ROM and RAM waveforms.
  • WA5 to WA9: These are the upper phase bits (32 steps), used the same way by all multisamples.
  • WA0 to WA4: These are used as the lower phase bits (1-16 steps), and to select the multisamples. The number of bits used for the waveform phase depends on the length of the multisample selected.

WF0 to WF2: Fractional address bits for interpolation.

In a straightforward implementation where the multisamples are arranged sequentially, the bits of the phase accumulator would be masked and added to an offset to play the correct portion of the waveform memory. 12 bits of phase data are needed for this: the upper 9 bits are masked and offset to form the waveform address, then the 3 bits immediately below the masked portion are selected and used as the fractional address. The K3 instead interleaves the multisamples in an unusual format. This is done so that only 6 bits of phase data need to be manipulated to select the correct multisample and generate the fractional bits. This multisample decoding is performed by a 4Ki x 8 ROM, significantly simplifying the hardware. The upper 5 phase bits go straight to the waveform ROM without any modification. The multisamples are automatically selected by the decoder ROM based on the oscillator frequency, so any pitch modulation that crosses the multisample split point will switch immediately. This is in contrast to other synthesizers that select the multisample in software based on the played note, regardless of pitch modulation.

The lowest octave uses only 2 fractional bits for interpolation, resulting in somewhat degraded sound quality. This is because the decoder ROM uses only 6 phase bits total. In the lowest octave, 4 bits are used for the waveform address, leaving only 2 for fractional bits. This seems like a strange design oversight, since the decoder ROM uses only 4Ki x 8 of an 8Ki x 8 EPROM, and there doesn’t seem to be anything preventing the use of an additional phase bit. I think changing IC31 from a 74LS174 (6 bit latch) to a 74LS374 (8 bit latch) and rewriting the decoder ROM to use all 8Ki bytes would have been sufficient to have 3 fractional bits in the lowest octave.

The 2Ki x 8 interpolation ROM also uses an 8Ki x 8 EPROM, and similarly the pitch and phase data RAMs are 2Ki x 8 despite using only 36 x 8 bits. Probably Kawai used these so that they would have to stock fewer parts, and because the cost savings from using more appropriately specified components would be negligible. But these don’t suggest any easy improvements. An 8Ki x 8 interpolation ROM could support 5 fractional bits, but additional hardware would be needed to provide these bits. The pitch and phase data RAMs could support a very large number of oscillators with only minimal modifications to the digital oscillator board, but the sample rate would be proportionally reduced. The master clock frequency could be increased to improve this tradeoff, but there’s an upper limit to how fast the ICs can run. For the most part, the K3’s performance can’t be improved without significantly increasing the cost and complexity of the design.

There are two 8 bit waveform DACs, one for each oscillator. The data is latched separately for each DAC, then the conversions are performed simultaneously. These are multiplying DACs, so the amplitude of each oscillator can be controlled by varying the reference voltage. By inverting the reference voltage to one of the DACs, a single control voltage can adjust the balance between the two oscillators. The DAC outputs are mixed and then demultiplexed into 6 voices. It’s more common to use a single DAC with 12 sample and holds, but this arrangement makes the oscillator balance and mixing circuits simpler. Amplitude scaling, like most similar synthesizers, is performed by an analog VCA.

Overall, the design performs remarkably well. The sound quality is similar to Korg’s DWGS models, despite using 75% less data for each waveform, and it sounds considerably cleaner than the Ensoniq ESQ-1, which has a similar sample rate and waveform resolution but uses truncation. However, the transitions between multisample zones are highly audible, and the overall sound is rather dull, with the bandwidth only extending to about 8.5-10.5 kHz at the low end of the multisample range. In this respect it’s again similar to the DWGS models. Because the sample rate isn’t very high and the multisamples span an octave, the high harmonics are pushed very close to aliasing. But different waveform ROMs could potentially be written that would produce a brighter sound at the expense of a moderate amount of aliasing. It’s possible to have up to 256 harmonics, but this would result in a great deal of aliasing. 192 harmonics might be a better compromise.

Made in Pure Data and Octave, 2012-2016

Spotify link

I also made a video of the spectrogram for the last track: