From baa909c79d277f793ef8f51b0a87c8874446382a Mon Sep 17 00:00:00 2001 From: David Westgate Date: Fri, 15 Nov 2024 17:20:15 -0800 Subject: [PATCH] tuner entry --- code/tuner/README.md | 44 ++++++++++++++++++++++++++++++++++++ code/tuner/bass-demo.mkv | Bin 0 -> 8167771 bytes code/tuner/key-demo.mkv | Bin 0 -> 8324021 bytes code/tuner/requirements.txt | 3 +++ code/tuner/trumpet-demo.mkv | Bin 0 -> 4784526 bytes notebook.md | 6 +++++ 6 files changed, 53 insertions(+) create mode 100644 code/tuner/README.md create mode 100644 code/tuner/bass-demo.mkv create mode 100644 code/tuner/key-demo.mkv create mode 100644 code/tuner/requirements.txt create mode 100644 code/tuner/trumpet-demo.mkv diff --git a/code/tuner/README.md b/code/tuner/README.md new file mode 100644 index 0000000..cacf564 --- /dev/null +++ b/code/tuner/README.md @@ -0,0 +1,44 @@ +## Background +Here is a simple python instrument tuner. The idea is that you connect your instrument to your computers audio input, and the python script will tell you what note is being played (the note associated with the dominant frequency). + +I decided to build this application because my bass tuner has gone missing. I believe someone has taken it from me and a mild sense of pride has kept me from acknowledging it is gone, so I am therefor reluctant to buy a new one. However, this program I have written is free and I hope it will do the job. + +## Setup +Potential libraries needed for debian-based gnu+linux +``` +sudo apt-get install libportaudio2 +``` +Install python libraries +``` +pip install -r requirnments.txt +``` + +You will need to tweak the code to choose the correct device number. Of course, this could be abstracted to a python argument with a default value. + +## Run +``` +python3 main.py +``` + +## View Source +[main.py](./main.py) + +## Demo + +[Keyboard](./key-demo.mkv) + +[Bass](./bass-demo.mkv) + +[Trumpet](./trumpet-demo.mkv) + +## Reflection +This app works ok in some circumstances. Specifically, it seems to do well with mid range and high range frequencies, but was not very helpful for bass tuning. This could be for a variety of reasons including improper use of my bass amplifier, or sub-standard instrument, but I also suspect I could re-work my calculation of dominant frequenceies to better accomodate low ranges. + +Getting the results I have took some work. I did understand I would need to use an FFT to recover the frequencies from the signal, but understanding how to properly apply a window (hanning) and the chunk size took more work. In addition to reviewing the course notes, ChatGPT was consulted to help debug and refine the function `dominant_frequency`. Deriving the note and octave values from the frequencies was rather straightforward algebra from the [notes](https://github.com/pdx-cs-sound/course-notes/blob/main/03-freq/04-notes.md) lecture. + +## Consultation + + [Python Sounddevice documentation](https://python-sounddevice.readthedocs.io/en/0.5.1/examples.html#plot-microphone-signal-s-in-real-time). This was my first time capturing audio from a PC audio input, rather than a wav file + + +[Tuner example](https://github.com/mzucker/python-tuner/blob/master/tuner.py). This is a similar application, but using pyaudio rather than sounddevice. Some inspiration was taken from this. \ No newline at end of file diff --git a/code/tuner/bass-demo.mkv b/code/tuner/bass-demo.mkv new file mode 100644 index 0000000000000000000000000000000000000000..c123c51a5332ed6c16445564fa80c497af0fc244 GIT binary patch literal 8167771 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