Guest User

Untitled

a guest
Jan 20th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. #! /bin/bash
  2.  
  3. set -e
  4.  
  5. BASE_DIR=$(dirname "$0")
  6. PROG_NAME=$(basename "$0")
  7.  
  8. difference=12
  9. freq_base=880
  10. freq_var=220
  11. min_diff=1
  12. wave_func=sine
  13.  
  14. usage() {
  15. echo 1>&2 "usage: $PROG_NAME [-d <initial difference>] [-b <frequency base>] [-v <frequency variation>] [-m <minimum difference>] [-w <wave function>]"
  16. exit $1
  17. }
  18.  
  19. while [[ $# -gt 0 ]]; do
  20. case "$1" in
  21. -h) usage 0 ;;
  22. -d)
  23. if ! [[ "$2" =~ [1-9][0-9]* ]]; then
  24. echo 1>&2 "-d option must be followed by a positive integer"
  25. usage 1
  26. fi
  27. shift
  28. difference=$1
  29. ;;
  30. -b)
  31. if ! [[ "$2" =~ [1-9][0-9]* ]]; then
  32. echo 1>&2 "-b option must be followed by a positive integer"
  33. usage 1
  34. fi
  35. shift
  36. freq_base=$1
  37. ;;
  38. -v)
  39. if ! [[ "$2" =~ [1-9][0-9]* ]]; then
  40. echo 1>&2 "-v option must be followed by a positive integer"
  41. usage 1
  42. fi
  43. shift
  44. freq_var=$1
  45. ;;
  46. -m)
  47. if ! [[ "$2" =~ [0-9]*(\.[0-9]+)? ]]; then
  48. echo 1>&2 "-m option must be followed by a non-zero number"
  49. usage 1
  50. fi
  51. shift
  52. min_diff=$1
  53. ;;
  54. -w)
  55. if ! [[ "$2" =~ sine|square|triangle|sawtooth|point|circle ]]; then
  56. echo 1>&2 "-w option must be followed by valid wave function"
  57. usage 1
  58. fi
  59. shift
  60. wave_func=$1
  61. ;;
  62. *)
  63. echo 1>&2 "unrecognized option: '$1'"
  64. usage 1
  65. ;;
  66. esac
  67. shift
  68. done
  69.  
  70. playtones() {
  71. if [[ $answer = y ]]; then
  72. "$BASE_DIR/playsound" -w $wave_func $high
  73. "$BASE_DIR/playsound" -w $wave_func $low
  74. else
  75. "$BASE_DIR/playsound" -w $wave_func $low
  76. "$BASE_DIR/playsound" -w $wave_func $high
  77. fi
  78. }
  79.  
  80. while true; do
  81. echo "The current difference is $difference cents"
  82. low=$(python3 -c "from random import randrange; print($freq_base + randrange($freq_var))")
  83. high=$(python3 -c "print($low * (2 ** ($difference / 1200)))")
  84. if [[ $((RANDOM % 2)) = 0 ]]; then
  85. answer=y
  86. else
  87. answer=n
  88. fi
  89. playtones
  90. read -p 'Was the higher note first? (y/n/r) ' response
  91. while [[ "$response" != y ]] && [[ "$response" != n ]]; do
  92. if [[ "$response" = r ]]; then
  93. playtones
  94. else
  95. echo "Response must be either 'y', 'n', or 'r' (case sensitive)"
  96. fi
  97. read -p 'Was the higher note first? (y/n/r) ' response
  98. done
  99. if [[ $response != $answer ]]; then
  100. echo 'Incorrect.'
  101. break
  102. fi
  103. echo 'Correct!'
  104. difference=$(python3 -c "print(max($min_diff, round($difference * 0.9, 2)))")
  105. sleep 1
  106. done
Add Comment
Please, Sign In to add comment