I just released Nils‘ K1v at version 1.12. It contains two bug fixes and one important improvement, as I mentioned earlier in my development blog: Velocity Curves now very closely match those of the Kawai K1 hardware.
The release is available for all platforms and can be obtained from the Download Page
Changes
[Fix] One-shot waveforms (drums & others) were played looped
[Fix] Mac AU version crash when saving the plugin state (100% crash in Digital Performer 10)
[Imp] Velocity Curves are now properly implemented and very closely match those of the K1 hardware. If you are interested in details, feel free to visit the K1 development blog
Some users reported that the velocity response of my K1v plugin is quite different compared to the K1 hardware. And yes, that is probably the area with the biggest difference between the K1v and the K1.
As I have pointed out in an earlier article, tracking down the velocity curves is very difficult, as there is no way to get the raw velocity data. What you will capture on the audio out is always the envelope volume – modulated by the velocity curve. Getting the raw velocity data is impossible.
A different approach – using the K1m Firmware ROM
While sitting here and thinking about how to solve the unsolvable problem, I had an idea. The K1 needs to have the curves stored somewhere. I used my PHm ROM that I have dumped earlier and loaded it as raw data into my wave editor.
It didn’t took very long until I found interesting data tables that looked similar to the velocity curve graphs in the manual. Actually, there a plenty of data tables in there. Not only velocity, I also found the key scaling curves and lots of other tables. I still need to figure out what they are for, but the result will be a much better precision in the K1 emulation.
Velocity Curves (length 64) & KS Curves (length 128) in Kawai K1 firmware ROM
The velocity curves have a length of 64 bytes each and have a range of 0 to 127, as you’d expect for velocity values. I extracted them from the ROM and used them in the K1v, but unfortunately they did not really match the K1 output.
Some things that I observed:
Velocity Curve 1, that is supposed to be linear, is not linear. Velocity Curve 3 is linear although it should not.
In my recordings, for most curves, velocity values above 100 do not make any difference anymore. But the curves have proper values, why aren’t they used?
Data Analysis
Lets first have a look at what the manual says VS what is in the data:
Velocity Curves – as stated in the K1 manualVelocity Curves – as part of the K1 firmware ROM
What can be seen immediately is that all curves in the ROM are less exponential than required.
Furthermore, not the whole velocity range is used, at least not when modulating envelope volume. Take a look at the picture below, this is a K1 recording of Velocity Curve 1 with all velocity values from 1 to 127.
Velocity Curve 1 – Velocity Levels 1-127
As you can see, envelope volume is peaking way before velocity maximum. To be precise, the maximum envelope level is reached already at velocity 102. I made the gap in the recording on purpose by inserting a quarter after velocity 100 so I had to count less bars to find the values 😊. The same applies to all other curves. Either the incoming velocity values are fed through some other table before the curve is applied, or afterwards. By testing different values and their result, I was able to verify that there must be another remapping before the velocity curves are applied.
Implementation details
It took me many hours, a lot of guessing, thinking & testing before I found the correct table in the firmware ROM. It turned out that it is a table with a length of 64, it looks like this:
Velocity remapping before being fed into the different velocity curve tables
This curve explains why very high velocity values do not make any difference anymore, they are cut off. Furthermore, the whole curve makes everything a little bit more exponential.
I was pleased with the result: I had steps in envelope volume values at the same velocity values than my K1m. The but came quickly as the values didn’t match the K1m.
K1m Velocity Curve 7Intermediate result of K1v Velocity Curve 7
To make the result more exponential, I had to search for a table with a specific size: The envelope level has a range of 0 to 100, so a table with 101 values had to be the correct one.
As I had worked on this topic for such a long time, my source code with all kinds of tables grew more and more 😁 And now definitely needs some cleanup.
Firmware ROM tables converted to source code
Luckily, I found the correct table within one hour or so. It is a 16 bit table, it has a length of 101 as expected and makes the curves identical to the K1m.
Once more, Velocity Curve 7 as being output by the K1v, now 100% accurate:
Final result, K1v Velocity Curve 7 – identical to hardware K1m
You might see that there are very small differences due to rounding errors, but these shouldn’t really matter.
Two more pictures, a comparison of all velocity curves in all its glory 👍
As I have confidence about what tables make up correct velocity curves, I need to implement proper modulation levels. So far, everything you see is at Vel => Env Mod +50, i.e. 100%. Special care needs to be taken when implementing the modulation strength as I currently have the impression that a value of +25 does not mean a modulation strength of 50%, there might be another remapping table being inserted to do this. Negative strengths are another topic that might be interesting.
Of course, once I’m done there will be another post to announce the release of the update.
Other useful data tables in the firmware ROM?
There are some other tables in the ROM, both 8 bit and 16 bit with data that looks interesting. If I can figure out what they are used for, I can improve the emulation a lot.
A 16 bit curve, length 101. Values from 1536 to 0 (at center) to 1536. Most probably modulation depth remappingAnother 16 bit curve with length 101, value range 0 – 4000. Most probably vibrato depth + others
For the latter curve, it looks very similar to one of my own curves that I had figured out by analyzing wave data.
Conclusion
If I ever go to emulate another synthesizer, putting more effort into ROM analysis instead of recording hours of data is the better way to go 😊 Stay tuned & thanks for reading!
The AudioUnit version of the Kawai K1 emulation plugin is now available, too. This enables users of Logic on the Mac to finally use my Kawai K1 emulation.
As all major platforms are now supported, I can continue to improve the plugin itself.
Biggest open topic for me are velocity curves, because they do not match the hardware. I already started with further analysis of my K1m.
As a next step, I’m going to integrate all 200 singles of the Kawai PHm Pop Synth Module and redesign the UI how to selected presets. Just in case you want to have them beforehand, visit this page to download them, ready-to-use as I have converted them to the K1 format.
Finally, after waiting several weeks, Kawai reported back to me that they have no issues with me developing a Kawai K1 emulation. This is great news for me personally as I was still concerned that Kawai could respond in a way that would bring me in trouble. But they did not! 👍 They even sent high quality Kawai logos that I’m allowed to integrate into the plugin, I’m impressed, big thanks to Kawai!
Furthermore, there are now Linux & Mac versions of the VST. For Linux, there are .deb and .rpm packages in both 32 bits and 64 bits. The Mac version requires a 64 bit OS, minimum version is OS X 10.9 Mavericks.
For Mac, an AU version will definitely come. LV2 for Linux, too! Stay tuned.
Special thanks to all donators and to all testers at the KvR forum, a lot of people helped making the plugin available for Linux & Mac by testing on their machines.
As you might know, I was always interested to have the presets of the Kawai Phm Pop Synth Module. The PHm uses the same synthesis engine as the K1, the only exception is that the 200 presets cannot be edited. Not even via SysEX, as the PHm neither sends nor recognizes SysEX at all.
The PHm has some presets that never appeared on ROM cards for the K1. Due to a thread on KVR, I asked myself if there is a chance to extract the PHm presets from the device.
I have the device so I opened it and looked for chips that are ROMs. I have not been able to find any chip, so I wondered where the presets are stored. I guessed that they might be part of the Firmware EPROM.
I searched in the net and found the data sheet. This not only gave me the pin layout, but it also revealed something interesting: The EPROM of the PHm is 64kb, while the K1 EPROM is only 32k. This raised chances that it contains the presets.
PIN out of the PHm Firmware EPROM
Dumping the ROM was pretty straightforward, as I did this already for the Wave ROM. The only thing I needed to change is to change the wiring and the code a bit, as the firmware only has 16 address lines.
PHm Firmware EPROM sitting on an Arduino Mega
I dumped the rom and converted it to binary and started to look for the presets. Searching for presets by name didn’t lead to any result so instead, I searched for usual patterns that I already know because of the K1 Single format.
Given that 200 presets need about 20k of space, I quickly found them and began to compare the content against some presets that I know exist on the K1, too (on ROM cards).
Below is a picture. the upper part is the PHm firmware, the lower part is the SysEX of the K1 preset „ID-4 Hold a key“ from ROM card J1-02.
K1 ROM Card J1-02 preset „ID-4 Hold a key“ compared to content of the PHm firmware
After some analysis, the differences are very minor. Compared to a K1 Single preset, the differences are:
No sysex header (F0h, …, 8 bytes)
No name (10 bytes)
Compared to the K1, they slightly adjusted the presets volumes (byte 11)
Byte at position 22 is missing in a PHm preset => A bit surprising to me, but apparently Source Mute is not supported by the PHm module
No sysex terminator (F7h, one byte)
After I figured out the format, I wrote a small conversion tool that converts all 200 PHm presets to K1 presets. Feel free to download them here! The Zip contains each preset individually and one .syx that contains all 200. The K1v can load it directly.
A small request: If anyone has got a Kawai PH50 firmware, can someone send me a dump? I’d love to extract the Ph50 presets, too!
Note: The PH50 presets are not identical to the PHm, although frequently stated on some websites. Just look at pictures of the device, the preset list is printed on it and it is different from the PHm list.
This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish.AcceptRead More
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.