Kawai K1: Why I recorded all waveforms again

While the waveform pack by Chvad was pretty good to have something to start with, I had some issues, both for the PCM based waveforms and the single cycle waveforms.

PCM waveforms

Chvad sampled the waveforms at note number D4, which sounds good when being played back in a wave player, but the problem it causes is that you lose a lot of the high frequency spectrum when being played on lower midi notes.
Secondly, there is no chance to filter any noise that is emitted by the K1.

Therefore, I decided to sample the PCM waveforms on note D1 instead.

Recording was pretty straightforward, I played the same midi note over and over again and selected the different waveforms inbetween my note pressed. The result looked like this:

PCM waves 205-256 recorded at midi note D1

To make my life a little easier, I wrote a tool to help extracting single files out of this big recording.
What the tool does is, firstly, it detects blocks of silence and audible data. What I use this for is to know when a new waveform starts. This gives a total amount of 52 blocks of audio data, with silence in between them, which matches the PCM waveforms 205-256.
Secondly, as there are waveforms that need to be looped during playback, I created code to detect them. My tool can read wave markers and work on loops according to these markers. There are two types of loops that I need to support:

  • Loops that I define manually with a specified start and end point
  • Loops where I only define a region where a loop is, together with a maximum length. The loop start and end is then detected automatically
A loop that I define manually
A loop that is auto-detected

After I had defined all required markers, the whole file looked like this:

All PCMs with loop markers

After executing my tool, the output was a nice list of loopable PCM waveforms that were ready to be used in my K1 emulation VSTi

Single Cycle Waveforms

What always made me wondering is the fact that the single Visitors appears to have some sine wave sound, whose pitch is modified by the LFO, but when inspecting how the single is made, you’ll notice that there is no sine wave selected as a source at all. The waveform that is driven by the LFO is wave 204, which sounds quite different and looks like this:

It is not a sine wave at all, it sounds more like some synthesized waveform, frankly, the K1 manual names this waveform SYNTH_01

While testing something else on the real K1, I noticed something strange. I pressed a note and modified the coarse tune while holding the note down. When I released the note and retriggered it, the sound was different! I tested this a couple of times and every time, the sound was different after retriggering when I modified the coarse tune while holding a note.

I had an idea what that means and after doing a test recording of a waveform for all notes, ranging from 0 to 127 I had the proof: Single cycle waveforms are multisamples!

Waveform 19 (SAW) from note 0 to note 127

If you take a closer look at the image, especially at the frequency spectrum in the lower part, you’ll see that some harmonics get lost as the note number is rising.

That explained a lot. No wonder that I never had that original K1 sound. As the recordings by Chvad were only one version of each waveform, I had to record every single cycle waveform again, but this time for each note number.

It took a lot of hours to get this done but it was definitely worth it. I’ve setup a simple track in Cubase to play all notes from 0 to 127 and recorded all 204 single cycle waveforms.
It turned out that not every waveform contains multisamples. And for some of them, the way they use them is really strange. Usually, if you do this, you cut harmonics before they reach the nyquist frequency to prevent aliasing. But in the case of the K1, this is not (properly) done. Some multisamples clearly change the tone when you play on the keyboard, for others, they even make it worse by adding harmonics instead of removing them, which increases the aliasing even more.
Some examples:

Waveform 8 (Sine variant), no multisamples, large aliasing issue on higher notes.
Waveform 14 (Saw variant), highest overtones are dropped too early, making it sound dull
Waveform 37 (Square variant), no multisamples and huge aliasing
Waveform 94 (piano / electric piano), a new subharmonic is added
Waveform 98 (piano, electric piano), highest harmonics are increased in volume just before nyquist, increasing aliasing even more

As you can see, there are a lot of variantions. If you want an exact recreation, you need to take all different multisamples into account.

Single Cycle Waveforms conversion tool

Once more, I extended my tool to deal with these recordings. I manually added markers to the notes that I want to extract. You can see the markers in the screenshots above. My tool uses these markers to extract loops of the waveforms at their respective positions and exports to single files.

Notice the note numbers on the left. The tool names these markers to make sure that the root note of the loop is known, so the playback is done at the correct pitch.

After all 204 files are created, they are merged into a single file, which allows me to load them more easily. The result is a 1,66 MB wave file with over 500 markers in total, named as wave120_note84, etc.

The sound has improved a lot, in many areas, its very similar to a K1 now, just as it should.
What I didn’t do yet, as it is a lot of manual work, is to clean up the recordings a bit. There is a bit of K1 noise that could be easily filtered out, but it would need to be a manual process for each waveform and for each multisample, as the used frequencies are different for each one, leading to over 500 manual tweaks.

Another minor thing is that, although the original K1 wave rom consisted only of 512kb of data, my data size is about 24mb in total as I have every waveform as 32 bits floating point data. It is not much nowadays for a plugin to be that large, but an optimization would be nice.

Kawai K1 VST: Audio Demo

Update: New Audio Demo is here

Recently, I worked in lots of different areas. I re-recorded all wavetables (separate article will follow), reworked the envelope timings, implemented velocity curves, measured LFO speeds and more.

I thought its about time for some audio demos. I recorded this using the current state of the VST plugin. Of course, there are still a lot of issues, but a lot of presets are running fine already.

Kawai K1 VST – some of the factory singles

In the audio demo above, you hear the following factory presets (in order of appearance):

  • iA-5 Return Home
  • IB-3 Jazz Harp
  • IA-5 Visitors
  • IA-3 String Pad
  • IC-7 Terminator

The only thing I added is a bit of reverb and EQ. Let me know what you think!

Kawai K1: Analyzing Envelope Decay, Release, Level & Velocity using tools

Next step for me was to analyze the envelope values and velocity mappings. Because the LFO speed analysis was quite cumbersome, I decided to create a tool to analyse further parameters to make it a little easier for me.

For the envelope decay & release, I noticed that several singles share the same setting for both values. This is mostly used for drum presets but for some others, too. I verified it on the K1m and confirmed that this was the case.

Then, I used my simple init preset again and recorded note presses while adjusting the envelope decay value from 0 to 100. The result was this very long recording:

Largest envelope decay time is nearly three minutes!

The largest envelope decay/release time is 2:44 minutes! But that was not the only thing I observed, I also noticed that the envelope decay is not purely logarithmic, but is a mixture of some logarithmic key points with linear interpolation between them. For longer release times, this is pretty obvious when looking at the waveform, but luckily not very noticeable when listening to it.

Having the recording ready, I created a little wave analyzer whose purpose is to dump envelope durations. It analyzes the waveform to find where a note begins and tracks the duration until the wave falls below an adjustable threshold and logs the time.
While this doesn’t work properly for the very short attack times (I measured them manually instead), it saved a lot of time.

Unfotunately, I had no chance to analyze the envelope attack times, as my K1m is broken here, but I assumed that they are identical and first tests confirm that, so I have all of three (Attack, Decay, Release) finished by now.

I extended this little tool to output gain values. I used it for the various velocity curves, envelope levels, sustain levels and so on.

Velocity Curve 1

As you can see in the picture above, the velocity curve is a little bit steppy. Apparently the resolution is not very good. Anyway, I used the same low resolution in my emulator to closely match the original device.

Kawai K1: Analysing the LFO Speed

Meanwhile, I’ve got a real Kawai K1m to analyze the machine. Unfortunately, it has got a little defect: The envelope attack is broken. With values above 50, the sound gets quiter and quieterand if you raise the attack above values of 68, there is no sound anymore.
I ordered an Eprom to upgrade the firmware from version 1.1 to version 1.5, but unfortunately this didn’t have any effect, the problem persists. I checked the soldering points, but I have not been able to find anything obvious. I contacted Kawai, maybe they can help to identify the problem.

Nevertheless, there is plenty of stuff I can do to analyze the device, even though the attack is not working properly (yet!).

I started to analyze the LFO speeds. I wanted to know which LFO speed value, ranging from 0 to 100, results in what length of one LFO loop in seconds. To do that, I created a very simple patch where the LFO is of type square and modulates the frequency of a sine. Then, I started recording and stepped through all values from 0 to 100 and pressed a note on my keyboard for each value.

The result looks like this:

Result of an LFO modulating a sine wave in a wave editor with both amplitude and frequency view

After having done that, a lot of cumbersome work had to be done. I had to select an LFO loop in the wave editor and write down its length. For the higher LFO frequencies, I selected multiple loops (up to 16) and divided by 16 afterwards to get the correct average value as it turned out that the LFO precision is very low on the K1.
A picture of the highest LFO speed can be seen below. You can notice how the frequency is not constant, but jumps a lot.

After having entered everything in a Google Spreadsheet, I created a diagram to check for errors and tweaked the values manually here or there to get rid of precision issues.

Slowest LFO value is 12,32 seconds, fastest one 0,078 seconds

Afterwards, I added the final result to my emulator which now has proper LFO speed values by using a table lookup for all possible values from 0-100.

It was a lot of work, but was completely worth it. I did several A-B checks against the real K1m that I now have and the LFO speeds are completely identical, just as it should be!

Emulation of a Kawai K1 as VSTi plugin

Introduction

The Kawai K1 is a digital synthesizer made in 1988. It has been used in numerous music productions in the 90s and is even used nowadays by some groups because of its unique sound.

I recently needed some sounds from the K1 family (K1, K1r, K1m, PHm), but for these devices, samples are quite limiting as some of the presets are heavily modulated and depend on things like velocity, aftertouch and so on.

While searching for samples, I stumbled upon a blog post by Chvad, who released the entire set of the K1’s internal 256 waveforms. Part of this set are all the famous PCM samples that I still remember, like the choir, the pan flute and others.
But most of them are not really usable without further editing. Although the K1 is a PCM based sample playback machine (and yes, it is the only form of synthesis its actually doing), Kawais approach for most sounds was the following: Most PCM samples are only very small snippets, they represent only a single cycle of a waveform. They contain the root frequency plus up to 128 harmonics. If this snipped is looped, it creates the sound of a bell, a basic sine wave or others while saving a lot of ROM size, as memory was

I played around with these single cycle waves and was able to create some of the K1 sounds in a sampler. Some of the samples provided by Chvad needed further editing and, due to the frequency they have been sampled at, lacked the high frequencies when playing low Midi note numbers.

This was the first time I thought about if it was possible to emulate a K1 by recreating its internal synthesis. I had this idea in mind for some time, but never had the time to start. During Corona, this idea came back to live again and I started with further research and eventually started this project.

Of course, I know that there are tons of devices & VST plugins out there that have much higher capabilities, may sound better and so on. But as a teenager, the K1 was always one of the devices that I wanted to have, but never bought before I sold all my hardware many years later and moved over to use VST plugins instead.

Reading K1 Sysex data

Luckily, Kawai scanned all their old manuals and put them up on the Internet. This includes the manual itself, the list of wave forms including pictures and the midi implementation. Furthermore, the factory presets and all presets that came on cards are available as sysex files, so that seemed to be a good start.

Reading the sysex files was pretty straightforward. Although the documentation contains some bugs, I quickly figured out the parameters and a comparison between my data structures with a demo version of MidiQuest proved that reading the data is working correctly.

The K1 synthesis engine

The K1 works in the following way:

The K1 features 256 8-bit PCM waveforms. 204 of them are the previously mentioned single cycle waves, the remaining ones are regular PCM samples and feature sounds like choir, flutes, drums, FX and others.

A sound, in K1 terminology they’re called Singles, can be created from up to four so-called Sources. For each source, a arbitrary waveform can be selected. Furthermore, each source has an DADSR envelope (an ADSR with delay), own settings for coarse & fine tune, keytracking can be toggled and there are plenty of other modulation capabilities, both for frequency and amplitude.

It features a single LFO that can either be triangle, square, saw or random that can modulate the frequency of the sources. It is mostly used in combination with the modulation wheel to drive the vibrato function, but also to create surprising modulation effects.

In contrast to the more pricier models a this time, there is neither any filter nor an effects section.

Emulating the first factory patch ‚Aah‘

After I have been able to read presets from sysex files, I’ve set up a VST project and started to emulate it by simply playing back Chvad’s wave files when a midi note is pressed. This turned out to be fairly easy and worked well.

I then added more features to make the first factory preset, called Ahh, playable.

It’s made up of four sources where two of them each have the same waveform with a small detune. After adding support for coarse & fine tune, it sounded better.

I then added support for envelopes by copying some source code from my Heat Synthesizer project and dealt with voice management to make it become a real synth.

I roughly estimated the envelope parameters conversion to make it sound like in this video, which helped me a lot during the first days:

Great success! That sounded like a real K1!

I was surprised how easy it was and continued to implement more features.

Vibrato & Pitch Bend

One of the first things I wanted to add is support for pitch bend and vibrato.

Pitch bend was fairly easy as it was well documented. There is a bend range parameter and the Midi implementation states that 8 bits of the incoming midi data are used. For now, I used the full range of 14 bits for more precision, but I haven’t decided yet if I keep it like this or go down to 8 bits again to match the original machine.

In contrast, implementing the vibrato was much more complex than I initially thought. There is no documentation in the manual that explains the vibrato speed, other than stating that 0 is slowest while 50 is fastest. I roughly estimated the vibrato speed again by listening to the Youtube video that I linked above to make it sound right.

Issues

While I was happy that the first factory preset sounded good, others were completely off. The second factory preset 6 String revealed that my rough envelope estimation was okay for just one preset. The decay & release times were way too long for this one so I reworked my formula and tried to match the original K1 even closer.
But another thing turned out to be problematic: The quality of the sampled waveforms. Especially for 6 String, playing lower notes showed that a lot of upper frequencies are missing. I found a second set of waveforms and played around with them, some of them are much better as they have been sampled at a lower midi note.
Factory preset 5, called Visitors, is the first one that makes heavy use of the LFO to create effects. The LFO timing was a problematic issue for a longer time.

I’m going to post more updates, including audio examples, about the progress and K1 internals in the future. Meanwhile, I luckily got a real K1 and I started to measure a lot of things to make my VST match the real device. Stay tuned & thanks for reading!