Obsah:

Detektor noty: 3 kroky
Detektor noty: 3 kroky

Video: Detektor noty: 3 kroky

Video: Detektor noty: 3 kroky
Video: ЮЛЯ ФИНЕСС: Как я вышла с 8 этажа! Групповое изнасилование под мефедроном, психиатрическая больница 2024, November
Anonim
Image
Image

Ohromte svojich priateľov a rodinu týmto projektom, ktorý detekuje notu, ktorú hrá nástroj. Tento projekt zobrazí približnú frekvenciu a hudobnú notu hranú na elektronickej klávesnici, klavírnej aplikácii alebo inom nástroji.

Podrobnosti

Pre tento projekt je analógový výstup z detektora zvukového modulu odoslaný na analógový vstup A0 zariadenia Arduino Uno. Analógový signál sa vzorkuje a kvantifikuje (digitalizuje). Autokorelačný, vážiaci a ladiaci kód sa používa na nájdenie základnej frekvencie pomocou prvých 3 periód. Približná základná frekvencia sa potom porovná s frekvenciami v rozsahu oktáv 3, 4 a 5, aby sa určila najbližšia frekvencia noty. Nakoniec sa na obrazovku vytlačí uhádnutá poznámka pre najbližšiu frekvenciu.

Poznámka: Tento návod sa zameriava iba na to, ako zostaviť projekt. Ak chcete získať ďalšie informácie o podrobnostiach a odôvodneniach návrhu, navštívte tento odkaz: Ďalšie informácie

Zásoby

  • (1) Arduino Uno (alebo Genuino Uno)
  • (1) Vysoko citlivý modul detekcie zvuku mikrofónu DEVMO kompatibilný
  • (1) Bezpájková doska
  • (1) Kábel USB-A na B
  • Prepojovacie vodiče
  • Hudobný zdroj (aplikácia pre klavír, klávesnicu alebo Paino s reproduktormi)
  • (1) Počítač alebo prenosný počítač

Krok 1: Vytvorte hardvér pre detektor hudobných nôt

Nastavte detektor hudobných poznámok
Nastavte detektor hudobných poznámok

Použitím Arduino Uno, spojovacích vodičov, nepájkovanej dosky a modulu mikrofónneho senzora DEVMO s vysokou citlivosťou (alebo podobného) zostrojte obvod zobrazený na tomto obrázku

Krok 2: Naprogramujte detektor hudobných poznámok

Do Arduino IDE pridajte nasledujúci kód.

gistfile1.txt

/*
Názov súboru/náčrtu: MusicalNoteDetector
Verzia č.: v1.0 vytvorená 7. júna 2020
Pôvodný autor: Clyde A. Lettsome, PhD, PE, MEM
Popis: Tento kód/náčrt zobrazuje približnú frekvenciu a hudobnú notu prehrávanú v aplikácii elektronickej klávesnice alebo klavíra. Pre tento projekt je analógový výstup z
detektor zvukového modulu je odoslaný na analógový vstup A0 zariadenia Arduino Uno. Analógový signál sa vzorkuje a kvantifikuje (digitalizuje). Na to sa používa autokorelačný, vážiaci a ladiaci kód
nájdite základnú frekvenciu pomocou prvých 3 periód. Približná základná frekvencia sa potom porovná s frekvenciami v rozsahu 3, 4 a 5 oktáv, aby sa určil najbližší muzikál
frekvencia poznámok. Nakoniec sa na obrazovku vytlačí uhádnutá poznámka pre najbližšiu frekvenciu.
Licencia: Tento program je bezplatný softvér; môžete ho ďalej distribuovať a/alebo upravovať podľa ustanovení GNU General Public License (GPL), verzia 3, alebo neskôr
verzia podľa vášho výberu, vydaná Free Software Foundation.
Poznámky: Autorské právo (c) 2020 od C. A. Lettsome Services, LLC
Viac informácií nájdete na
*/
#define VZORKY 128 // Max. 128 pre Arduino Uno.
#define SAMPLING_FREQUENCY 2048 // Fs = Na základe Nyquistu musí byť dvojnásobkom najvyššej očakávanej frekvencie.
#define OFFSETSAMPLES 40 // používané na kalibráciu
#define TUNER -3 // Upravte, kým C3 nebude 130,50
vzorkovanie plaváka Obdobie;
bez znamienka dlhé mikrosekundy;
int X [VZORKY]; // vytvorte vektor veľkosti SAMPLES na uloženie skutočných hodnôt
float autoCorr [VZORKY]; // vytvorte vektor veľkosti SAMPLES na uloženie imaginárnych hodnôt
plavák uloženýPoznámkaFreq [12] = {130,81, 138,59, 146,83, 155,56, 164,81, 174,61, 185, 196, 207,65, 220, 233,08, 246,94};
int sumOffSet = 0;
int offSet [OFFSETSAMPLES]; // vytvorenie ofsetového vektora
int avgOffSet; // vytvorenie ofsetového vektora
int i, k, periodEnd, periodBegin, period, adjuster, noteLocation, octaveRange;
float maxValue, minValue;
dlhá suma;
int mlátiť = 0;
int numOfCycles = 0;
float signalFrequency, signalFrequency2, signalFrequency3, signalFrequencyGuess, total;
byte state_machine = 0;
int vzorkyPerPeriod = 0;
neplatné nastavenie ()
{
Serial.begin (115200); // 115200 Baud rate for the Serial Monitor
}
prázdna slučka ()
{
//*****************************************************************
// Sekcia kalibrácie
//*****************************************************************
Serial.println („Calabrating. Počas kalibrácie prosím neprehrávajte žiadne poznámky.“);
pre (i = 0; i <OFFSETSAMPLES; i ++)
{
offSet = analogRead (0); // Načíta hodnotu z analógového pinu 0 (A0), kvantifikuje ju a uloží ako skutočný výraz.
//Serial.println(offSet); // pomocou tohto nastavte modul detekcie zvuku na približne polovicu alebo 512, keď sa neprehráva žiadny zvuk.
sumOffSet = sumOffSet + offSet ;
}
samplePerPeriod = 0;
maxValue = 0;
//*****************************************************************
// Pripravte sa na prijatie vstupu z A0
//*****************************************************************
avgOffSet = okrúhle (sumOffSet / OFFSETSAMPLES);
Serial.println ("Odpočítavanie.");
oneskorenie (1000); // pauza na 1 sekundu
Serial.println ("3");
oneskorenie (1000); // pauza na 1 sekundu
Serial.println ("2");
oneskorenie (1000); // pauza na 1
Serial.println ("1");
oneskorenie (1000); // pauza na 1 sekundu
Serial.println („Zahrajte si poznámku!“);
oneskorenie (250); // reakčný čas na 1/4 sekundy
//*****************************************************************
// Zhromažďovanie vzoriek VZORIEK z A0 s obdobím vzorkovania Obdobie
//*****************************************************************
samplingPeriod = 1.0 / SAMPLING_FREQUENCY; // Obdobie v mikrosekundách
pre (i = 0; i <VZORKY; i ++)
{
mikrosekundy = mikro (); // Vráti počet mikrosekúnd od spustenia aktuálneho skriptu na doske Arduino.
X = analogické čítanie (0); // Načíta hodnotu z analógového pinu 0 (A0), kvantifikuje ju a uloží ako skutočný výraz.
/ *zostávajúci čas čakania medzi vzorkami, ak je to potrebné, v sekundách */
while (micros () <(microSeconds + (samplingPeriod * 1000000))))
{
// nič nerob, len čakaj
}
}
//*****************************************************************
// Funkcia autokorelácie
//*****************************************************************
pre (i = 0; i <VZORKY; i ++) // i = oneskorenie
{
súčet = 0;
for (k = 0; k <SAMPLES - i; k ++) // Priradenie signálu k oneskorenému signálu
{
súčet = súčet + ((((X [k]) - avgOffSet) * ((X [k + i]) - avgOffSet)); // X [k] je signál a X [k+i] je oneskorená verzia
}
autoCorr = súčet / VZORKY;
// Prvý stroj na zistenie vrcholu
if (state_machine == 0 && i == 0)
{
mlátiť = autoCorr * 0,5;
state_machine = 1;
}
else if (state_machine == 1 && i> 0 && thresh 0) // state_machine = 1, find 1 period for using first cycle
{
maxValue = autoCorr ;
}
else if (state_machine == 1 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0)
{
periodBegin = i-1;
state_machine = 2;
numOfCycles = 1;
samplePerPeriod = (periodBegin - 0);
obdobie = vzorkyPerPeriod;
nastavovač = TUNER+(50,04 * exp (-0,102 * samplePerPeriod));
signalFrequency = ((SAMPLING_FREQUENCY) / (samplePerPeriod))-nastavovač; // f = fs/N
}
else if (state_machine == 2 && i> 0 && thresh 0) // state_machine = 2, find 2 period for 1st and 2nd cycle
{
maxValue = autoCorr ;
}
else if (state_machine == 2 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0)
{
periodEnd = i-1;
state_machine = 3;
numOfCycles = 2;
samplePerPeriod = (periodEnd - 0);
signalFrequency2 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-nastavovač; // f = (2*fs)/(2*N)
maxValue = 0;
}
else if (state_machine == 3 && i> 0 && thresh 0) // state_machine = 3, find 3 period for 1st, 2nd and 3rd cycle
{
maxValue = autoCorr ;
}
else if (state_machine == 3 && i> 0 && thresh <autoCorr [i-1] && maxValue == autoCorr [i-1] && (autoCorr -autoCorr [i-1]) <= 0)
{
periodEnd = i-1;
state_machine = 4;
numOfCycles = 3;
samplePerPeriod = (periodEnd - 0);
signalFrequency3 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-nastavovač; // f = (3*fs)/(3*N)
}
}
//*****************************************************************
// Analýza výsledkov
//*****************************************************************
ak (samplePerPeriod == 0)
{
Serial.println („Hmm ….. nie som si istý. Chcete ma oklamať?“);
}
inak
{
// pripravte funkciu váženia
celkom = 0;
if (signalFrequency! = 0)
{
celkom = 1;
}
if (signalFrequency2! = 0)
{
celkom = celkom + 2;
}
if (signalFrequency3! = 0)
{
celkom = celkom + 3;
}
// vypočítajte frekvenciu pomocou funkcie váženia
signalFrequencyGuess = ((1/celkom) * signalFrequency) + ((2/celkom) * signalFrequency2) + ((3/celkom) * signalFrequency3); // nájsť váženú frekvenciu
Serial.print („Poznámka, ktorú ste zahrali, je približne“);
Serial.print (signalFrequencyGuess); // Vytlačte odhad frekvencie.
Serial.println ("Hz.");
// zistenie rozsahu oktáv na základe odhadu
rozsah oktávy = 3;
while (! (signalFrequencyGuess> = uloženéNoteFreq [0] -7 && signalFrequencyGuess <= uloženéNoteFreq [11] +7))
{
pre (i = 0; i <12; i ++)
{
uloženéNoteFreq = 2 * uloženéNoteFreq ;
}
octaveRange ++;
}
// Nájdite najbližšiu poznámku
minHodnota = 10 000 000;
noteLocation = 0;
pre (i = 0; i <12; i ++)
{
if (minValue> abs (signalFrequencyGuess-storedNoteFreq ))
{
minValue = abs (signalFrequencyGuess-storedNoteFreq );
noteLocation = i;
}
}
// Vytlačte si poznámku
Serial.print („Myslím, že si hral“);
if (noteLocation == 0)
{
Serial.print ("C");
}
else if (noteLocation == 1)
{
Serial.print ("C#");
}
else if (noteLocation == 2)
{
Serial.print ("D");
}
else if (noteLocation == 3)
{
Serial.print ("D#");
}
else if (noteLocation == 4)
{
Serial.print ("E");
}
else if (noteLocation == 5)
{
Serial.print ("F");
}
else if (noteLocation == 6)
{
Serial.print ("F#");
}
else if (noteLocation == 7)
{
Serial.print ("G");
}
else if (noteLocation == 8)
{
Serial.print ("G#");
}
else if (noteLocation == 9)
{
Serial.print ("A");
}
else if (noteLocation == 10)
{
Serial.print ("A#");
}
else if (noteLocation == 11)
{
Serial.print ("B");
}
Serial.println (octaveRange);
}
//*****************************************************************
//Zastav tu. Reštartujte kliknutím na tlačidlo reset na Arduine
//*****************************************************************
pričom (1);
}

zobraziť rawgistfile1.txt hostený s ❤ od GitHub

Krok 3: Nastavte hudobný notový detektor

Pripojte Arduino Uno k počítaču pomocou kódu zapísaného alebo načítaného v Arduino IDE. Zostavte a nahrajte kód do Arduina. Obvod umiestnite blízko zdroja hudby. Poznámka: V úvodnom videu používam ako zdroj hudby aplikáciu nainštalovanú v tablete v spojení s reproduktormi PC. Kliknite na tlačidlo reset na doske Arduino a potom si pustite notu zo zdroja hudby. Po niekoľkých sekundách detektor hudobných poznámok zobrazí odohranú notu a jej frekvenciu.

Odporúča: