diff options
Diffstat (limited to 'tunebass')
-rwxr-xr-x | tunebass | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tunebass b/tunebass new file mode 100755 index 0000000..5394abc --- /dev/null +++ b/tunebass @@ -0,0 +1,83 @@ +#!/bin/bash + +# Ear tuner for guitar and bass. Install tunebass on your $PATH, and +# symlink it to tunegtr. + +# this used to be a one-liner: +#play -n synth 2 pluck ${1:-A2} repeat 99999 + +case "$0" in + *gtr*|*guit*) + notes="E4 B3 G3 D3 A2 E2" + note=6 + lastnote=6 + ;; + *) + notes="G2 D2 A1 E1" + note=4 + lastnote=4 + ;; +esac + +prompt="Space: next string, BkSpc: prev string, 1-$lastnote: strings, q: quit, ?: help" + +# these seem like they ought to be the arrow keys, but they're actually +# \n and \b... kcud1 and kcub1 are the 'application mode' versions, which +# doesn't do us any good here. +#down="$( tput cud1 )" +#left="$( tput cub1 )" + +# these are correct for xterm and derivatives, and for the linux console. +down="$( printf "\x1b\x5bB" )" +left="$( printf "\x1b\x5bD" )" + +up="$( tput cuu1 )" +right="$( tput cuf1 )" +pageup="$( tput kpp )" +pagedown="$( tput knp )" + +esc="$( printf "\x1b" )" +enter=' +' + +oldnote= +pid= +echo "$prompt" +while true; do + narg="$( echo $notes | cut -d' ' -f $note )" + if [ "$oldnote" != "$note" ]; then + [ "$pid" != "" ] && kill "$pid" + echo -e -n "\rString: $note Note: $narg" + tput el + play --buffer 1024 -qn synth 2 pluck $narg repeat - &>/dev/null & + pid="$!" + oldnote="$note" + fi + key= + read -rs -N5 -t 0.1 key + if [ "$key" != "" ]; then + case "$key" in + [1-9]) + [ "$key" -le "$lastnote" ] && note=$key ;; + a|A|h|H|||$left|$pageup) + note=$(( note + 1 )); [ $note -gt $lastnote ] && note=1 ;; + d|D|l|L|' '|' '|$right|$enter|$pagedown) + note=$(( note - 1 )); [ $note = 0 ] && note=$lastnote ;; + s|S|j|J|$down) + note=$lastnote ;; + w|W|k|K|$up) + note=1 ;; + \?) + echo + cat <<EOF +Use space + backspace, arrow keys, pageup/down, WASD, HJKL, or numbers +1 to $lastnote to pick a string. Tune your strings to the notes you hear. +Press Q or Escape to exit. +EOF + ;; + $esc|q|Q) break ;; + esac + fi +done +kill "$pid" +echo |