Chris@6: #!/bin/bash Chris@6: Chris@6: set -e Chris@6: Chris@6: mypath=`dirname $0` Chris@6: Chris@6: sonic-annotator --minversion 1.1 || exit 1 Chris@6: Chris@6: reference="$1" Chris@6: other="$2" Chris@6: Chris@6: usage() { Chris@6: echo "Usage: $0 reference.wav other.wav" 1>&2 Chris@6: exit 2 Chris@6: } Chris@6: Chris@6: test -n "$reference" || usage Chris@6: test -n "$other" || usage Chris@6: Chris@6: if ! test -f "$reference" ; then Chris@6: echo "Reference file $reference not found" 1>&2 Chris@6: exit 1 Chris@6: fi Chris@6: Chris@6: if ! test -f "$other" ; then Chris@6: echo "Other file $other not found" 1>&2 Chris@6: exit 1 Chris@6: fi Chris@6: Chris@6: refchroma="/tmp/$$.ref" Chris@6: otherchroma="/tmp/$$.other" Chris@6: tmpscript="/tmp/$$.dc" Chris@6: transform="/tmp/$$.ttl" Chris@6: scores="/tmp/$$.scores.txt" Chris@6: trap "rm $refchroma $otherchroma $tmpscript $transform $scores" 0 Chris@6: Chris@6: extract() { Chris@6: hz="$1" Chris@6: file="$2" Chris@6: cat chroma-excerpt.ttl | sed 's,"440","'"$hz"'",' > "$transform" Chris@7: sonic-annotator -t "$transform" --summary mean --summary-only -w csv --csv-stdout --csv-omit-filename "$file" 2>/dev/null | cut -d, -f4-63 | sed 's/,/\n/g' Chris@6: } Chris@6: Chris@6: extract 440 "$reference" | cat -n > "$refchroma" Chris@6: Chris@6: sox "$other" -r 44100 -c 1 b.wav Chris@6: Chris@6: for cents in $(seq -400 10 400) ; do Chris@6: Chris@6: hz=$(perl -e "print 440.0 * (2.0 ** ($cents / 1200.0))") Chris@6: Chris@6: extract "$hz" b.wav | cat -n > "$otherchroma" Chris@6: ( Chris@6: echo "6 k 0" Chris@6: join "$refchroma" "$otherchroma" | \ Chris@6: awk '{ print $2, $3, "- d * +" }' # square difference Chris@6: echo "p" Chris@6: ) > "$tmpscript" Chris@6: Chris@6: dist=$( cat "$tmpscript" | dc ) Chris@6: echo "$dist $hz" Chris@7: Chris@6: done | tee "$scores" Chris@6: Chris@6: echo Chris@6: echo Scores: Chris@6: sort -n "$scores" Chris@6: Chris@6: echo Chris@6: bestfreq=$(sort -n "$scores" | head -1 | awk '{ print $2; }') Chris@6: echo "I reckon the tuning frequency is $bestfreq" Chris@6: Chris@6: