我该如何解析这个变量?

我该如何解析这个变量?

我有一个 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

(来源:我的原始答案

相关内容