我有一个 midi 键盘,我想读取它的输出并解析以执行各种命令。我运行了该命令,amidi -p "hw:1,0,0" -d
它返回按下的按键的十六进制值列表,因为按下了各种按键。例如:
E00010
904E63
E00018
804E00
E0001C
904E63
E00014
E00010
804E00
E0000C
904E63
804E00
输入变量:
input=$(amidi -p "hw:1,0,0" -d)
从未获得任何值,因为它是流数据。所以我做了它 input=$(amidi -p "$MIDI_DEVICE" -d | head -n "$NUM")
。如果我将 NUM 设置为 1,我永远不会得到返回值,只有大量的换行符。按键以 3 个为一组,基本上是按下的键集的十六进制值:(E000XX)、按下的音符:(例如 904E63)和释放返回值(804E00)。
如果我设置 NUM=2,我似乎得到的只是部分值,没有注释。设置 NUM >=3,我会得到注释,但顺序会变得倾斜,这意味着我不能cut
根据行数或列数来获得注释。
我正在寻找有关如何解析$input
变量中的(注释)值的建议。
#!/bin/bash
set -x
#MIDI_DEVICE="hw:1,0,0" # Adjust with your MIDI device ID
NUM=4
while true; do
#input=$(amidi -p $MIDI_DEVICE -d)
input=$(amidi -p "hw:1,0,0" -d | head -n $NUM)
note=$(echo $input | cut -d' ' -f2 | cut -c 2-3)
echo $input
case "$note" in
"904E63") #trigger note
xdotool key ctrl+alt+t # Open a terminal
;;
# Add more cases for different MIDI notes and corresponding actions
esac
done
答案1
解析输出的最简单方法amidi
是用输出正确分隔值的工具替换:
#!/bin/bash
aseqdump -p "My Device" | \
while IFS=" ," read src ev1 ev2 ch label1 data1 label2 data2 rest; do
case "$ev1 $ev2 $data1" in
"Note on 64" ) xdotool type hello ;;
"Note on 48" ) xdotool key ctrl+j ;;
esac
done
(来源:我的原始答案)