Nord handles repeat notes differently than Kawai.
They expect a note-on / note-off message for every note, repeat note (i.e. triple sensor repeat) or not.
Without a note-
off (i.e. full key release), a repeated note for the same key will not sound.
Kawai on the other hand simply (and imo correctly) sends note-
on message repeatedly for every (triple-sensor) repeat note, i.e. it omits the note-
off messages.
Upon release of the key it sends a single note-off message.
So yes, you can control a Nord device using a Kawai keyboard but effectively you'll not be using the 3rd sensor.
In short, you'll have to completely release the key, just like with a 2-sensor keybed.
However...
There is a work-around...
I've written a short piece of Python code that simply inserts a note-off for every repeated note that is received for a given key.
I.e. only if no note-off message was received between two note-on messages for the same key.
It has to temporarily store received notes to make that happen, unless you play one finger at a time
It works like a charm, much better than i expected.
Caveat 1: i assume the inserted note-off
velocity is the same as the note-on velocity of the newly received (repeated) note.
Caveat 2: the inserted note-off message adds an extra latency of about 0.1 msec. Without the inserted note, the latency of the Python code is also about 0.1 msec (if you can even accurately measure that). So in total maximum 0.2 msec (0.0002 sec) added. Mind you, that is with MIDI over USB. With old school serial MIDI it's probably a bit slower.
I've added a -v option so you can see what messages are passing, and also how long the added latency was.
I've also added a -c option to adjust the velocity curve a bit, although the default (1.0) is to leave it untouched. The higher the value, the more it is dampened. I use -c 2.2 so i can use the default (lineair) velocity setting of the VPC1. It's personal, adjust to taste.
Like i said, it works wonderful. I'm using a Kawai VPC1 to control a Nord Stage 3 Compact (waterfall, drawbar type).
But it's not production-quality code:
- No installer
- I've hard-coded the MIDI device strings for my Stage 3C and my VPC1 keyboard.
- It requires installation of the Python Mido library
- And it requires Python (Python 3 of course).
So, until Clavia comes with a firmware patch (if ever), you can still use a Kawai triple sensor keybed to control a Nord.
You'll need a computer and two USB cables. Although i'm sure a Raspberry PI 3 would do just fine.
(scroll window for the entire contents)
Code: Select all
#!/usr/bin/python
import mido
import time
import argparse
from math import pow, floor
import signal
import sys
def signal_handler(sig, frame):
#~ print('Interrupt')
sys.exit(0)
def NordVelocity(velocity):
velocity = floor(128 * pow(velocity / 128, args.curve))
return max(3, velocity)
signal.signal(signal.SIGINT, signal_handler)
parser = argparse.ArgumentParser(description='Kawai to Nord MIDI note processing')
parser.add_argument('-c', '--curve', type=float, default=1.0, help='velocity curve (default: %(default)s)')
parser.add_argument('-v', '--verbose', action='count', help='increase verbosity')
args = parser.parse_args()
inputName = None
for inputName in mido.get_input_names():
if 'USB-MIDI' in inputName:
print("Input: {}".format(inputName))
break
outputName = None
for outputName in mido.get_output_names():
if 'Nord Stage' in outputName:
print("Output: {}".format(outputName))
break
output = mido.open_output(outputName)
NOTES = {'note_on', 'note_off'}
keys_pressed = set()
with mido.open_input(inputName) as input:
for msg in input:
t0 = time.perf_counter()
if msg.type in NOTES:
if msg.note in keys_pressed:
if msg.type == 'note_on':
insert = mido.Message('note_off', note=msg.note, velocity=msg.velocity)
output.send(insert)
msg.velocity = NordVelocity(msg.velocity)
print("repeat: ", msg)
if args.verbose:
print("%.6f" % (time.perf_counter() - t0))
output.send(msg)
else:
if args.verbose:
print("release: ", msg)
keys_pressed.discard(msg.note)
output.send(msg)
else:
if msg.type == 'note_on':
keys_pressed.add(msg.note)
msg.velocity = NordVelocity(msg.velocity)
if args.verbose:
print("key: ", msg)
print("%.6f" % (time.perf_counter() - t0))
output.send(msg)
else:
if args.verbose:
print("release: ", msg)
keys_pressed.discard(msg.note)
output.send(msg)
else:
if args.verbose:
print("other: ", msg)
output.send(msg)
I've called my script k2n.py (Kawai to Nord of course

)
Option -h is for help:
Code: Select all
# python k2n.py -h
usage: k2n.py [-h] [-c CURVE] [-v]
Kawai to Nord MIDI note processing
optional arguments:
-h, --help show this help message and exit
-c CURVE, --curve CURVE
velocity curve (default: 1.0)
-v, --verbose increase verbosity
And running it looks like this:
Code: Select all
python k2n.py -v
Input: USB-MIDI:USB-MIDI MIDI 1 24:0
Output: Nord Stage 3:Nord Stage 3 MIDI 1 28:0
key: note_on channel=0 note=59 velocity=33 time=0
0.000041
release: note_off channel=0 note=59 velocity=63 time=0
key: note_on channel=0 note=59 velocity=86 time=0
0.000131
release: note_off channel=0 note=59 velocity=99 time=0
key: note_on channel=0 note=59 velocity=75 time=0
0.000080
repeat: note_on channel=0 note=59 velocity=79 time=0
0.000282
repeat: note_on channel=0 note=59 velocity=55 time=0
0.000234
release: note_off channel=0 note=59 velocity=89 time=0
release: note_off channel=0 note=59 velocity=89 time=0
release: note_off channel=0 note=59 velocity=89 time=0
key: note_on channel=0 note=53 velocity=81 time=0
0.000096
release: note_off channel=0 note=53 velocity=83 time=0
Without the -v it only displays the 3rd sensor repeat notes.
The code comes without warranty (or support) but you may reproduce, monetize of whatever makes you happy.
