我希望你做得很好,我正在尝试制作一个 MIDI 钢琴键盘,非常基本,我按下一个键,发送 MIDI 信号并发出声音。
但是我想将速度添加到我的键上,每个键有一个联系人(我使用的键盘是 Fatar 键盘)。
我需要计算第一次接触和第二次接触之间的时间间隔(下面附有电路图)。
- 所有键都设置为输入 pull_up
- 当一个键被按下时,它会变低……当然
下面提到的是我正在读取键的功能。我需要做什么才能完成以下情况
[它们是 49 个按键,排列成两个二极管矩阵。矩阵中实际上有 98 个开关。这样做的原因是每个键下都有两个开关。当一个键被按下时,其中一个开关在另一个开关之前稍微闭合。通过测量开关之间的飞行时间,我们可以推导出速度]
情况一
- 键被按下
- 开始时间
- 按下多长时间的时间
- 密钥释放
Code
void read_keys() {
for (uint8_t key = 0; key < 49; key ++) {
digitalWrite(output_main[key], LOW); //turn off output main key
if (digitalRead(input_pullup[key]) == LOW) {
//check main input key is presses
//check with key_activated array
firstcontactdownmills = millis();
Serial.println(key);
Velocity = map(currentmills - firstcontactdownmills, 0, 256, 127, 0);
if (key_activated[key] == 0) {
//send midi on command
my_midi.sendNoteOn(key + note_offset, Velocity, 1);
main_midi.sendNoteOn(key + note_offset, Velocity, 1);
//update array
key_activated[key] = 1;
}
}
else { //if key released
//check with key_activated array
if (key_activated[key] == 1) {
//send midi off command
my_midi.sendNoteOff(key + note_offset, 0, 1);
main_midi.sendNoteOff(key + note_offset, 0, 1);
//update array
key_activated[key] = 0;
}
}
digitalWrite(output_main[key], HIGH); //turn on output main key
}
}