@@ -62,7 +62,7 @@ | |||
#include "analyze_fft1024.h" | |||
#include "analyze_print.h" | |||
#include "analyze_tonedetect.h" | |||
#include "analyze_guitartuner.h" | |||
#include "analyze_notefreq.h" | |||
#include "analyze_peak.h" | |||
#include "control_sgtl5000.h" | |||
#include "control_wm8731.h" |
@@ -1,4 +1,4 @@ | |||
/* Audio Library Guitar and Bass Tuner | |||
/* Audio Library Note Frequency Detection & Guitar/Bass Tuner | |||
* Copyright (c) 2015, Colin Duffy | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a copy | |||
@@ -20,7 +20,7 @@ | |||
* THE SOFTWARE. | |||
*/ | |||
#include "analyze_guitartuner.h" | |||
#include "analyze_notefreq.h" | |||
#include "utility/dspinst.h" | |||
#include "arm_math.h" | |||
@@ -42,7 +42,7 @@ static void copy_buffer(void *destination, const void *source) { | |||
for (int i=0; i < AUDIO_BLOCK_SAMPLES; i++) *dst++ = *src++; | |||
} | |||
void AudioAnalyzeGuitarTuner::update( void ) { | |||
void AudioAnalyzeNoteFrequency::update( void ) { | |||
audio_block_t *block; | |||
@@ -80,7 +80,7 @@ void AudioAnalyzeGuitarTuner::update( void ) { | |||
} | |||
} | |||
FASTRUN void AudioAnalyzeGuitarTuner::process( void ) { | |||
FASTRUN void AudioAnalyzeNoteFrequency::process( void ) { | |||
//digitalWriteFast(0, HIGH); | |||
const int16_t *p; | |||
@@ -164,7 +164,7 @@ FASTRUN void AudioAnalyzeGuitarTuner::process( void ) { | |||
* | |||
* @return tau | |||
*/ | |||
uint16_t AudioAnalyzeGuitarTuner::estimate( int64_t *yin, int64_t *rs, uint16_t head, uint16_t tau ) { | |||
uint16_t AudioAnalyzeNoteFrequency::estimate( int64_t *yin, int64_t *rs, uint16_t head, uint16_t tau ) { | |||
const int64_t *y = ( int64_t * )yin; | |||
const int64_t *r = ( int64_t * )rs; | |||
uint16_t _tau, _head; | |||
@@ -202,7 +202,7 @@ uint16_t AudioAnalyzeGuitarTuner::estimate( int64_t *yin, int64_t *rs, uint16_t | |||
* @param threshold Allowed uncertainty | |||
* @param cpu_max How much cpu usage before throttling | |||
*/ | |||
void AudioAnalyzeGuitarTuner::begin( float threshold ) { | |||
void AudioAnalyzeNoteFrequency::begin( float threshold ) { | |||
__disable_irq( ); | |||
process_buffer = false; | |||
yin_threshold = threshold; | |||
@@ -223,7 +223,7 @@ void AudioAnalyzeGuitarTuner::begin( float threshold ) { | |||
* | |||
* @return true if data is ready else false | |||
*/ | |||
bool AudioAnalyzeGuitarTuner::available( void ) { | |||
bool AudioAnalyzeNoteFrequency::available( void ) { | |||
__disable_irq( ); | |||
bool flag = new_output; | |||
if ( flag ) new_output = false; | |||
@@ -236,7 +236,7 @@ bool AudioAnalyzeGuitarTuner::available( void ) { | |||
* | |||
* @return frequency in hertz | |||
*/ | |||
float AudioAnalyzeGuitarTuner::read( void ) { | |||
float AudioAnalyzeNoteFrequency::read( void ) { | |||
__disable_irq( ); | |||
float d = data; | |||
__enable_irq( ); | |||
@@ -248,7 +248,7 @@ float AudioAnalyzeGuitarTuner::read( void ) { | |||
* | |||
* @return periodicity | |||
*/ | |||
float AudioAnalyzeGuitarTuner::probability( void ) { | |||
float AudioAnalyzeNoteFrequency::probability( void ) { | |||
__disable_irq( ); | |||
float p = periodicity; | |||
__enable_irq( ); | |||
@@ -260,7 +260,7 @@ float AudioAnalyzeGuitarTuner::probability( void ) { | |||
* | |||
* @param thresh Allowed uncertainty | |||
*/ | |||
void AudioAnalyzeGuitarTuner::threshold( float p ) { | |||
void AudioAnalyzeNoteFrequency::threshold( float p ) { | |||
__disable_irq( ); | |||
yin_threshold = p; | |||
__enable_irq( ); |
@@ -1,4 +1,4 @@ | |||
/* Audio Library Guitar and Bass Tuner | |||
/* Audio Library Note Frequency Detection & Guitar/Bass Tuner | |||
* Copyright (c) 2015, Colin Duffy | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a copy | |||
@@ -20,8 +20,8 @@ | |||
* THE SOFTWARE. | |||
*/ | |||
#ifndef AudioAnalyzeGuitarTuner_h_ | |||
#define AudioAnalyzeGuitarTuner_h_ | |||
#ifndef AudioAnalyzeNoteFrequency_h_ | |||
#define AudioAnalyzeNoteFrequency_h_ | |||
#include "AudioStream.h" | |||
/*********************************************************************** | |||
@@ -38,14 +38,14 @@ | |||
***********************************************************************/ | |||
#define AUDIO_GUITARTUNER_BLOCKS 24 | |||
/***********************************************************************/ | |||
class AudioAnalyzeGuitarTuner : public AudioStream { | |||
class AudioAnalyzeNoteFrequency : public AudioStream { | |||
public: | |||
/** | |||
* constructor to setup Audio Library and initialize | |||
* | |||
* @return none | |||
*/ | |||
AudioAnalyzeGuitarTuner( void ) : AudioStream( 1, inputQueueArray ), enabled( false ), new_output(false) { | |||
AudioAnalyzeNoteFrequency( void ) : AudioStream( 1, inputQueueArray ), enabled( false ), new_output(false) { | |||
} | |||
@@ -1,3 +1,11 @@ | |||
/* Detect the frequency of music notes, by Colin Duffy | |||
This example repeatedly plays a guitar note (output to the DAC pin) | |||
and prints an analysis of the frequency to the Arduino Serial Monitor | |||
https://forum.pjrc.com/threads/32252-Different-Range-FFT-Algorithm/page2 | |||
https://github.com/duff2013/AudioTuner | |||
*/ | |||
/* | |||
C C# D Eb E F F# G G# A Bb B | |||
0 16.35 17.32 18.35 19.45 20.60 21.83 23.12 24.50 25.96 27.50 29.14 30.87 | |||
@@ -32,13 +40,13 @@ | |||
#include "b3_note.h" | |||
#include "e4_note.h" | |||
//--------------------------------------------------------------------------------------- | |||
AudioAnalyzeGuitarTuner tuner; | |||
AudioAnalyzeNoteFrequency notefreq; | |||
AudioOutputAnalog dac; | |||
AudioPlayMemory wav_note; | |||
AudioMixer4 mixer; | |||
//--------------------------------------------------------------------------------------- | |||
AudioConnection patchCord0(wav_note, 0, mixer, 0); | |||
AudioConnection patchCord1(mixer, 0, tuner, 0); | |||
AudioConnection patchCord1(mixer, 0, notefreq, 0); | |||
AudioConnection patchCord2(mixer, 0, dac, 0); | |||
//--------------------------------------------------------------------------------------- | |||
IntervalTimer playNoteTimer; | |||
@@ -61,16 +69,16 @@ void setup() { | |||
* Initialize the yin algorithm's absolute | |||
* threshold, this is good number. | |||
*/ | |||
tuner.begin(.15); | |||
notefreq.begin(.15); | |||
pinMode(LED_BUILTIN, OUTPUT); | |||
playNoteTimer.begin(playNote, 1000); | |||
} | |||
void loop() { | |||
// read back fundamental frequency | |||
if (tuner.available()) { | |||
float note = tuner.read(); | |||
float prob = tuner.probability(); | |||
if (notefreq.available()) { | |||
float note = notefreq.read(); | |||
float prob = notefreq.probability(); | |||
Serial.printf("Note: %3.2f | Probability: %.2f\n", note, prob); | |||
} | |||
} |
@@ -381,7 +381,7 @@ span.mainfunction {color: #993300; font-weight: bolder} | |||
{"type":"AudioAnalyzeFFT256","data":{"defaults":{"name":{"value":"new"}},"shortName":"fft256","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioAnalyzeFFT1024","data":{"defaults":{"name":{"value":"new"}},"shortName":"fft1024","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioAnalyzeToneDetect","data":{"defaults":{"name":{"value":"new"}},"shortName":"tone","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioAnalyzeGuitarTuner","data":{"defaults":{"name":{"value":"new"}},"shortName":"guitartuner","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioAnalyzeNoteFrequency","data":{"defaults":{"name":{"value":"new"}},"shortName":"notefreq","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioAnalyzePrint","data":{"defaults":{"name":{"value":"new"}},"shortName":"print","inputs":1,"outputs":0,"category":"analyze-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioControlSGTL5000","data":{"defaults":{"name":{"value":"new"}},"shortName":"sgtl5000","inputs":0,"outputs":0,"category":"control-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
{"type":"AudioControlWM8731","data":{"defaults":{"name":{"value":"new"}},"shortName":"wm8731","inputs":0,"outputs":0,"category":"control-function","color":"#E6E0F8","icon":"arrow-in.png"}}, | |||
@@ -2286,10 +2286,10 @@ double s_freq = .0625;</p> | |||
</div> | |||
</script> | |||
<script type="text/x-red" data-help-name="AudioAnalyzeGuitarTuner"> | |||
<script type="text/x-red" data-help-name="AudioAnalyzeNoteFrequency"> | |||
<h3>Summary</h3> | |||
<p>Detect with fairly good accuracy the fundamental frequencies f<sub>o</sub> from | |||
electric guitars and basses.</p> | |||
<p>Detect with fairly good accuracy the fundamental frequency f<sub>o</sub> | |||
of musical notes, such as electric guitar and bass.</p> | |||
<p>Written By Collin Duffy</p> | |||
<h3>Audio Connections</h3> | |||
<table class=doc align=center cellpadding=3> | |||
@@ -2315,7 +2315,7 @@ double s_freq = .0625;</p> | |||
<p class=desc>Set the detection threshold, the amount of allowed uncertainty. | |||
</p> | |||
<h3>Examples</h3> | |||
<p class=exam>File > Examples > Audio > Analysis > GuitarTuneNotes | |||
<p class=exam>File > Examples > Audio > Analysis > NoteFrequency | |||
</p> | |||
<h3>Notes</h3> | |||
<p>The <a href="http://recherche.ircam.fr/equipes/pcm/cheveign/pss/2002_JASA_YIN.pdf">YIN algorithm</a> (PDF) | |||
@@ -2327,11 +2327,14 @@ double s_freq = .0625;</p> | |||
<p>Within the code, AUDIO_GUITARTUNER_BLOCKS | |||
may be edited to control low frequency range. The default | |||
(24) allows measurement down to 29.14 Hz, or B(flat)0.</p> | |||
<p>TODO: The usable upper range of this object is not well known. | |||
Duff says "it should be good up to 1000Hz", but may have trouble | |||
at 4 kHz. Please <a href="https://forum.pjrc.com/threads/32252-Different-Range-FFT-Algorithm/page2">post feedback here</a>, ideally with audio clips for the NoteFrequency example.</p> | |||
<p>This object was contributed by Collin Duffy from his | |||
<a href="https://github.com/duff2013/AudioTuner">AudioTuner project</a>. | |||
Additional details and documentation may be found there.</p> | |||
</script> | |||
<script type="text/x-red" data-template-name="AudioAnalyzeGuitarTuner"> | |||
<script type="text/x-red" data-template-name="AudioAnalyzeNoteFrequency"> | |||
<div class="form-row"> | |||
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label> | |||
<input type="text" id="node-input-name" placeholder="Name"> |