Obsah:
- Autor John Day [email protected].
- Public 2024-01-30 11:55.
- Naposledy zmenené 2025-01-23 15:05.
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ť
