Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /bin/bash
- set -e
- BASE_DIR=$(dirname "$0")
- PROG_NAME=$(basename "$0")
- difference=12
- freq_base=880
- freq_var=220
- min_diff=1
- wave_func=sine
- usage() {
- echo 1>&2 "usage: $PROG_NAME [-d <initial difference>] [-b <frequency base>] [-v <frequency variation>] [-m <minimum difference>] [-w <wave function>]"
- exit $1
- }
- while [[ $# -gt 0 ]]; do
- case "$1" in
- -h) usage 0 ;;
- -d)
- if ! [[ "$2" =~ [1-9][0-9]* ]]; then
- echo 1>&2 "-d option must be followed by a positive integer"
- usage 1
- fi
- shift
- difference=$1
- ;;
- -b)
- if ! [[ "$2" =~ [1-9][0-9]* ]]; then
- echo 1>&2 "-b option must be followed by a positive integer"
- usage 1
- fi
- shift
- freq_base=$1
- ;;
- -v)
- if ! [[ "$2" =~ [1-9][0-9]* ]]; then
- echo 1>&2 "-v option must be followed by a positive integer"
- usage 1
- fi
- shift
- freq_var=$1
- ;;
- -m)
- if ! [[ "$2" =~ [0-9]*(\.[0-9]+)? ]]; then
- echo 1>&2 "-m option must be followed by a non-zero number"
- usage 1
- fi
- shift
- min_diff=$1
- ;;
- -w)
- if ! [[ "$2" =~ sine|square|triangle|sawtooth|point|circle ]]; then
- echo 1>&2 "-w option must be followed by valid wave function"
- usage 1
- fi
- shift
- wave_func=$1
- ;;
- *)
- echo 1>&2 "unrecognized option: '$1'"
- usage 1
- ;;
- esac
- shift
- done
- playtones() {
- if [[ $answer = y ]]; then
- "$BASE_DIR/playsound" -w $wave_func $high
- "$BASE_DIR/playsound" -w $wave_func $low
- else
- "$BASE_DIR/playsound" -w $wave_func $low
- "$BASE_DIR/playsound" -w $wave_func $high
- fi
- }
- while true; do
- echo "The current difference is $difference cents"
- low=$(python3 -c "from random import randrange; print($freq_base + randrange($freq_var))")
- high=$(python3 -c "print($low * (2 ** ($difference / 1200)))")
- if [[ $((RANDOM % 2)) = 0 ]]; then
- answer=y
- else
- answer=n
- fi
- playtones
- read -p 'Was the higher note first? (y/n/r) ' response
- while [[ "$response" != y ]] && [[ "$response" != n ]]; do
- if [[ "$response" = r ]]; then
- playtones
- else
- echo "Response must be either 'y', 'n', or 'r' (case sensitive)"
- fi
- read -p 'Was the higher note first? (y/n/r) ' response
- done
- if [[ $response != $answer ]]; then
- echo 'Incorrect.'
- break
- fi
- echo 'Correct!'
- difference=$(python3 -c "print(max($min_diff, round($difference * 0.9, 2)))")
- sleep 1
- done
Add Comment
Please, Sign In to add comment