HOME MIDI boards Modular synth Polysynth DSP Links history
Polysynth wavetable voice

This is big name for a small thing. Up to 4K samples may be stored in each of 8 voices. Voices use 8-bit DACs. DACs are also VCAs - envelope voltage drives DAC's reference input. Kind of strange approach, but it seamed great when I designed it. Usually waves are 32 samples long, but 128 of such waves may be looped, or sequenced by LFO. Hard to explain it in words. Hear some examples:

  • bell-like sound wav 211K or mp3 38K - long FM sample with some filtering
  • wavelet sequence wav 252K or mp3 47K
  • another one wav 430K or mp3 20K
This unit generates arbitrary waveforms. It also serves as VCA - envelope voltage controls DAC's reference input. As a result VCF is the last module in signal path, when filters are set to self-oscillate, there's no chance for silence at the output.

Wavetable size:
128 waves 32 bytes long; may be played as one 4K sample
8 bits
Power supply:
+/- 5V (-5 only for buffer opamp supply).
Working modes:
single 32B cycle, 4KB cycle, 4KB sample with last 32B looped, 128x32B cycles sequenced by LFO (1-30Hz); long (4KB) wavecycles may be played from start position, or run continuously

Signal names abbreviations:
5-bit wavetable address from DCO
input for external wavecycle sequencing LFO; common for all voices
enable control for this LFO; when high, wavecycles are played as one (4KB or 32B)
singlerun/steady - when low, wavecycles will stop sequencing after reaching last (128th) one. This is equivalent of playing 4KB sample with loop point set 32B back from end.
start/steady - enables the gate (key on) to reset wavetable position to start point. When low, the waveform will run continuously (useful with 4KB samples)
envelope output voltage 0..5V
GAx, #GAx:
"global address" used when programming sampler's RAM. GAx = #GAx during programming, GAx = 0V and #GAx = 5V during play.
&qoutglobal data" used to program sampler's RAM.

How does it work

Play the samples

Let's assume 4KB long free running sample. DCO addresses provide lover 5 bits of sample position while upper 7 are generated in binary counter clocked with A4 address. Don't be confused by RAM's address pin names - I have no respect for it. I/E is high and so is EXT. A4 clocks counter U2B through gates U3C & D. U2A is clocked from U2B making 8-bit counter (actually it is 7-bit, but we'll get there). When highest bit of this 8-bit counter goes high it resets itself to 0 through R1-D1 network (assuming that 1/S is high), and whole cycle repeats. Now suppose S/S is high - GATE pulses are able now to get to the counter. R4 is an example of simplest approach to level converters. GATE signal is 0/+12V while sampler is supplied from +5V. Together with U3's input protection diodes R4 is sufficient for that purpose. Anyway, GATE goes through NANDs U3B & U3A and resets the counter by short pulse formed in C1-R3 network. As a result the wave starts from the beginning with every key on for that voice. Let's play more. Put 1/S low. When highest counter bit goes high it gets stacked on R1 and does not reset the counter. The same signal put on CLK input of U2B stops the counter (well, it works that way - see 4518 data sheet). The only address generated now is the one from DCO (5 bits) and the counter is stopped at 127 value (7Fh) so all you hear is 32 bytes long wavecycle. This is also the way to play only those 32B waves. RAM data goes to DAC and from that point my Polysynth begins to be analog. This, I hope, gives some idea of how it works and how to control it.

Program the RAM

As previously mentioned during play GAx = 0V and #GAx = 5V allowing DCO addresses to go unaffected to RAM chip. R5-R9 also serve as level converters from DCO's 0/12V to standard 0/5V. 12V is clipped on diodes which are connected to #GAx lines. During programming GAx and #GAx lines are at the same levels and provide lowest 5 bits of wave address overriding anything coming from DCO. Data written to the RAM is put on GDx lines, which thanks to R10-R17 have no affect during play. When write strobe (#WR) signal is low, R10-R17 are sufficient to drive Z-stated data lines of RAM. This is how to program 32B packs. To write entire (or rather 4KB) space, EXT pulses are required. So, program 32B, enter EXT pulse, program 32B and so on...

U1: 6264 - common RAM (use any kind)
U2: 4518 - dual 4-bit binary counter
U3: 4011 quad NAND gate
U4: AD7548 - this is 12-bit device; only 8 upper bits used. Any multiplying DAC will do
U5: 741 - common opamp; old and awful
diodes: any kind
MIDI boards Modular synth Polysynth DSP Links history
© 2004 Roman Sowa
Last revised September 22, 2004