Obsah:
- Zásoby
- Krok 1: Vytvorte hardvér pre detektor hudobných nôt
- Krok 2: Naprogramujte detektor hudobných poznámok
- Krok 3: Nastavte hudobný notový detektor
Video: Detektor noty: 3 kroky
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:55
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
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:
Raspberry Pi - TMD26721 Infračervený digitálny bezdotykový detektor Java Výukový program: 4 kroky
Raspberry Pi-TMD26721 Infračervený digitálny bezdotykový detektor Java Výukový program: TMD26721 je infračervený digitálny bezdotykový detektor, ktorý poskytuje kompletný systém detekcie priblíženia a logiku digitálneho rozhrania v jednom 8-kolíkovom module na povrchovú montáž. Detekcia blízkosti obsahuje vylepšený signál-šum a presnosť. Profesionál
Detektor prítomných otrasov: 3 kroky
Detektor otrasov súčasnosti: V tomto projekte vyrobíme zariadenie, ktoré vydá poplach, ak niekto zatrasie darčekom/škatuľou. Dostal som tento nápad, keď sme dostali balíček poštou na Vianoce. Aby sme skúsili uhádnuť, čo v ňom je, samozrejme sme to otriasli tak, ako to robí každý
DIY Detektor kovov s ukazovateľom Arduino Pin: 3 kroky
DIY Arduino Pin Pointer Detektor kovov: Tradičný detektor kovov dokáže nájsť zakopaný predmet a poskytnúť vám hrubé umiestnenie predmetu pri zemi. Pinpointer vám umožní zistiť polohu objektu, vytvoriť menšiu dieru pri kopaní a extrahovať položku. . Tiež môže
Ako kódovať skladbu pomocou noty v programe Sonic Pi: 5 krokov
Ako kódovať skladbu pomocou noty v programe Sonic Pi: Tento návod sa zameriava na vysvetlenie niektorých základných krokov a kúskov kódu, ktoré je potrebné použiť pri kódovaní piesne v programe Sonic Pi pomocou notového záznamu! Existuje milión ďalších kúskov kódu, ktoré sa pokúšajú dodať hotovému dielu príchuť, takže si tiež zahrajte
Detektor dymu IOT: Aktualizujte existujúci detektor dymu pomocou IOT: 6 krokov (s obrázkami)
IOT Detektor dymu: Aktualizujte existujúci detektor dymu pomocou IOT: Zoznam prispievateľov, Vynálezca: Tan Siew Chin, Tan Yit Peng, Tan Wee Heng Vedúci: Dr Chia Kim Seng Katedra mechatronického a robotického inžinierstva, Fakulta elektrotechniky a elektroniky, Universiti Tun Hussein Onn Malajsie. Distribuovať