;; read in a list of audio samples stored as .au files make "files [] ;;make "files fput "samples/bach65.au files ;;make "files fput "samples/celia35.au files make "files fput "samples/bach100.au files make "files fput "samples/bach70.au files make "files fput "samples/celia40.au files make "files fput "samples/bach10.au files make "files fput "samples/bach75.au files make "files fput "samples/celia45.au files make "files fput "samples/bach15.au files make "files fput "samples/bach80.au files make "files fput "samples/celia50.au files make "files fput "samples/bach20.au files make "files fput "samples/bach85.au files make "files fput "samples/celia55.au files make "files fput "samples/bach25.au files ;;make "files fput "samples/bach90.au files ;; sound be report zero make "files fput "samples/celia5.au files make "files fput "samples/bach30.au files make "files fput "samples/bach95.au files make "files fput "samples/celia60.au files make "files fput "samples/bach35.au files make "files fput "samples/celia65.au files make "files fput "samples/bach40.au files make "files fput "samples/celia100.au files make "files fput "samples/celia70.au files make "files fput "samples/bach45.au files ;; 6000+hz make "files fput "samples/celia10.au files make "files fput "samples/celia75.au files make "files fput "samples/bach50.au files make "files fput "samples/celia15.au files make "files fput "samples/celia80.au files make "files fput "samples/bach55.au files make "files fput "samples/celia20.au files ;; high freq but clip sounds low make "files fput "samples/celia85.au files make "files fput "samples/bach5.au files make "files fput "samples/celia25.au files make "files fput "samples/celia90.au files ;; sounds med but comes low make "files fput "samples/bach60.au files make "files fput "samples/celia30.au files make "files fput "samples/celia95.au files ;; make a list of audio buffers to getaudiodata :files test empty? files iftrue [ output [] ] iffalse [ output fput (readaudio first files) getaudiodata butfirst files ] end ;; find the peak by summing three consecutive samples ;; since the spectrum is symmetrical, look at only the first half to peakdetector :sp local [ current next idx i ] make "idx 0 make "i 0 make "current 0 make "next 0 repeat (count sp)/2 [ make "next getwindowvalue sp i if less? current next [ make "current next make "idx i ] make "i i+1 ] output idx * 44100/(count sp)/2 end ;; get the current window value by summing X consecutive values to getwindowvalue :sp :c local [ value ] make "value 0 repeat 3 [ make "value item c sp make "c c+1 ] output value end to measurefrequency :audio local [ peak ] if empty? audio [ output [] ] make "s fft first audio ;;print s make "peak peakdetector spectrum s ;; make "peak peakdetector spectrum fft first audio output fput (list peak first audio) measurefrequency butfirst audio end to sort :data local [lft rght pivot next] if equal? 1 count data [ output data ] if equal? 0 count data [ output data ] make "lft [] make "rght [] make "pivot first (first data) make "lft fput (first data) lft make "data butfirst data repeat count data [ make "next first first data if less? next pivot [ make "rght fput (first data) rght ] if equal? next pivot [ make "rght fput (first data) rght ] if less? pivot next [ make "lft fput (first data) lft ] make "data butfirst data ] make "lft sort lft make "rght sort rght output cons rght lft end ;; believe it or not, this doesn't seem to be part of UCBLogo to cons :list1 :list2 if empty? list2 [ output list1 ] make "list1 lput first list2 list1 make "list2 butfirst list2 make "list1 cons list1 list2 output list1 end to hashfunc :key :length local [ idx ] make "idx 1 if less? 96 key [ make "idx key - 96 ] ;; keep in bounds if less? length idx [ make "idx length - 1 ] if less? idx 1 [ make "idx 1 ] output idx end ;;;;;;;;;;;;;;; main ;;;;;;;;;;;;;;; print [making calculations] make "db sort measurefrequency getaudiodata files make "db listtoarray db print [enter a key a to z] forever [ make "key ascii readchar make "key hashfunc key count db playwave last item key db ]