<p align="center">
    <b>Guitar and Bass Tuner Library</b><br>
    <b>Teensy 3.1 v2.0</b><br>
</p>

>Software algorithm ([YIN]) for guitar and bass tuning using a Teensy Audio Library. This audio object's algorithm can be some what memory and processor hungry but will allow you to detect with fairly good accuracy the fundamental frequencies f<sub>o</sub> from electric guitars and basses. 
>>You can install this as a normal Arduino Library and will work with the Audio Library, no need to edit the Audio libraries source now.

<!-- language: lang-none -->
      Hookup Guide - 1.2v DC Bias and High Pass Filter - No Amplification

                       *--------------------------------------------------*   
                       |                                                  |
                       |      Pull Down Resistor            | ' |         |
                       *------------/\/\/\-------------*    |' '|         | 
                       |             47K               |   _|_'_|_        |
                       |                               |  |` ` ` `|       |
                       *---)|+--*                      |  | ` ` ` |       |
                       |  10uF  |                      |  |` ` ` `|       |
       TEENSY 3.1      |        |                      |  | ` ` ` |       |
     _______________   *-/\/\/\-*                      |  |` ` ` `|       |
    |GND |_____| Vin|  |  2.2K  |                      |  | ` ` ` |       |
    |0  -----   AGND|<-*        |                      |  |` ` ` `|       |
    |1 |`````|  3.3V|>--/\/\/\--*--/\/\/\---*          |  | ` ` ` |       |
    |2 |     |    23|    10K        47K     |          |  |` ` ` `|       |
    |3  -----     22|                       |          |  | ` ` ` |       |
    |4 |'|        21|                       |          |   \=====/        |
    |5   ------   20|                       |          |    | :`|         |
    |6 |::::::::| 19|                       |  REMOVE  |    | S`|         |
    |7 |::::::::| 18|                       |    DC    |    | H`|         |
    |8 |::::::::| 17|                       |   BIAS   |    | I`|         |
    |9   ------A2/16|<---SIGNAL-1.2v-BIAS---*---+|(----*    | E`|>--ANGD--*
    |10    ---    15|                    1.2VDC  10uF  |    | L`|
    |11   |(`)|   14|                                  |    | D`|
    |12    ---    13|                                  |    | :`|
     ---------------                                   |    |===|
                                                       |     \_/
                                                       |     /T\
                                                       |    - I -
                                                       *---<\ P /
                                                             \_/

>Many optimizations have been done to the [YIN] algorithm for frequencies between 29-360Hz. 
>>While its still using a brute force method ( n<sup>2</sup> ) for finding the fundamental frequency f<sub>o</sub>, it is tuned to skip certain <b>tau</b> (<img src="http://rogercortesi.com/eqn/tempimagedir/eqn2874.jpg"/>) values and focus mostly on frequencies found in the bass and guitar. 
>>>The input is double buffered so while you are processing one buffer it is filling the other to double throughput. 
>>>>There are a few parameters that can be adjusted to "dial in" the algorithm for better estimations. The defaults are what I found that have the best trade off for speed and accuracy.

<h4>AudioTuner.h</h4>

```
/****************************************************************/
#define SAMPLE_RATE_DIVIDE_BY_1 1      // 44100    sample rate
#define SAMPLE_RATE_DIVIDE_BY_2 2      // 22050    sample rate
#define SAMPLE_RATE_DIVIDE_BY_4 4      // 11025    sample rate
#define SAMPLE_RATE_DIVIDE_BY_8 8      // 5512.5   sample rate
#define SAMPLE_RATE_DIVIDE_BY_16 16    // 2756.25  sample rate
#define SAMPLE_RATE_DIVIDE_BY_32 32    // 1378.125 sample rate
/****************************************************************
*              Safe to adjust these values below               *
****************************************************************/
// Adjust number of samples to collect in buffer here, also effects
// convergence speed and resolution.
#define NUM_SAMPLES 2048 // make a power of two

// larger the divide-by, less resolution and lower the frequency for
// a given number of samples that can be detected. Also effects
// convergence speed.
#define SAMPLE_SKIP SAMPLE_RATE_DIVIDE_BY_2
/****************************************************************/
```

```
SAMPLE_RATE_DIVIDE_BY_x --> This sets 'SAMPLE_SKIP' to pass on every (x) data point from the 
Audio Block being saved to the buffer, it determines the sample rate.
```

```
NUM_SAMPLES --> This the size of each buffer, there two for double buffering.
```
```
SAMPLE_SKIP --> This sets your sample window length and sampling rate. Sample Window Size is
(NUM_SAMPLES * SAMPLE_SKIP) of the ~44100 samples every second. Sample Rate is 
(AUDIO_SAMPLE_RATE_EXACT / SAMPLE_SKIP). 
```

<div>
    <b>YIN Algorithm</b>
    <ol>
        <li><b>Difference Function -</b> Squared difference of the (signal - signal lag(<img src="http://rogercortesi.com/eqn/tempimagedir/eqn2874.jpg"/>))</li>
            <img src="http://rogercortesi.com/eqn/tempimagedir/eqn1752.png" />
        <li><b>Cumulative Mean Normalized Difference Function -</b> Calculate the cumulative mean on the normalized difference signal</li>
            <img src="http://rogercortesi.com/eqn/tempimagedir/eqn3269.png" />
        <li><b>Absolute Threshold -</b> Fix for subharmonic error with Autocorrelation, choose (<img src="http://rogercortesi.com/eqn/tempimagedir/eqn2874.jpg"/>) that gives a minimum <img src="http://rogercortesi.com/eqn/tempimagedir/eqn3518.png"/></li>
    </ol>
</div>

[YIN]:http://recherche.ircam.fr/equipes/pcm/cheveign/pss/2002_JASA_YIN.pdf