Lately I’ve been interested in a number of hardware synthesizers that came out during the late 80’s/early 90’s, as I’ve found their synthesis methods rather curious and inventive. One of them, the Korg Wavestation, has a very interesting synthesis system, using a combination of Vector Synthesis and Wave Sequencing. Vector Synthesis is easy enough to implement using a cross-fading between different oscillators or sound generators, but I was curious to see about implementing the Wave Sequencing in Csound code.
To implement this, I used information obtained online, information in the manuals, time experimenting on a hardware Korg Wavestation, as well as time with the Korg Legacy Wavestation Software (I ended up purchasing the whole Legacy Collection). Here is an example of the waveseq User-Defined Opcode (UDO) using f-tables generated by GEN10:
Example 1:
As well as f-tables using sampled drum sounds:
Example 2:
The UDO is implemented such that it takes in an f-table that describes the entire wave sequence. Therefore, most of the work to using this opcode is done in creating the set of f-tables to sequence through. I did implement the following features:
- Tempo: 24 duration is a quarter note; if tempo is non-zero, it will be used to set the duration of the quarter note, if 0, tempo is about 105 bpm
- WaveSequence: start wave, looping type (0 = forwards, 1 = forwards and backwards), start wave for loop, end wave
- Wave Tables: single-cycle wave/single-shot wave/looped wave (determined on whether sample rate given in the waveseq table is 0, positive, or negative), amplitude adjustment, cross-fade time, duration of table to play
itab_bass ftgenonce 0, 0, -9512, 1, "BDRUM11.WAV", 0, 0, 0 itab_tom ftgenonce 0, 0, -17600, 1, "TOM5.WAV", 0, 0, 0 itab_snare ftgenonce 0, 0, -10947, 1, "SNARE11.WAV", 0, 0, 0 iwaveseqtab ftgenonce 0, 0, -32, -2, 3, 1, 0, 0, 2, itab_bass, ftsr(itab_bass), 1, 1, ixfade, iwavedur, itab_tom, ftsr(itab_tom), 2, 1, ixfade, iwavedur, itab_snare, ftsr(itab_snare), 2, 1, ixfade, iwavedur
- 3 tables are in this wave sequence
- 1 is used to denote backwards and forwards playing through the sequence
- 0 is the index of the start wave
- 0 is the index of the loop start
- 2 is the index of the loop end
- sample rate of the table (positive here, so play as single-shot)
- amplitude adjustment of 1 (amplitude is multiplied by this factor)
- pitch adjustment of 1 (not currently implemented)
- crossfade of 0 (ixfade = 0 earlier in the code, not listed above)
- duration of 6 (iwavedur = 6 earlier in the code, not listed above), this is equivalent to a 16th note