Përmbajtje:
Video: Arduino Muzikë Shënime Detektor: 3 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:14
Zbulimi i shënimeve muzikore nga sinjali audio është i vështirë të bëhet veçanërisht në Arduino për shkak të kujtesës së kufizuar dhe fuqisë përpunuese. Në përgjithësi, shënimi nuk është një valë sinus e pastër që e bën zbulimin të vështirë. Nëse marrim transformimin e frekuencës së instrumenteve të ndryshëm muzikorë, ai mund të përmbajë harmonika të shumta bazuar në notën që luhet. Çdo instrument ka kombinimin e vet të nënshkrimit të harmonikave të ndryshme. Në këtë kod, unë u përpoqa të krijoj një program që mund të mbulojë sa më shumë instrumente të jetë e mundur. Ju mund t'i referoheni videos së bashkangjitur në të cilën u përpoqa të provoja llojet e ndryshme të instrumenteve, llojet e ndryshme të toneve të krijuara nga tastiera, madje edhe tingulli i zërit. Saktësia e zbulimit ndryshon nga instrumenti në instrument. Për disa instrumente (d.m.th. piano) në një gamë të kufizuar (200-500Hz) është i saktë, ndërsa disa instrumente kanë saktësi të ulët (d.m.th. Harmonica).
Ky kod përdor një kod FFT të zhvilluar më parë të quajtur EasyFFT.
Demonstrimi i kodit tregohet në videon e mësipërme me lloje të ndryshme të tingullit të instrumentit, si dhe vokal.
Furnizimet
- Arduino Nano/Uno ose më lart
- Moduli i mikrofonit për Arduino
Hapi 1: Algoritmi për Zbulimin e Shënimeve
Siç u përmend në hapin e mëparshëm, zbulimi është i vështirë për shkak të pranisë së frekuencave të shumta në mostrat audio.
Programi funksionon në rrjedhën e mëposhtme:
1. Marrja e të dhënave:
- ky seksion merr 128 mostra nga të dhënat audio, ndarja midis dy mostrave (frekuenca e marrjes së mostrave) në varësi të frekuencës së interesit. Në këtë rast, ne po përdorim distancën midis dy mostrave përdoret për të aplikuar funksionin e dritares Hann, si dhe llogaritjen e amplitudës/RMS. Ky kod gjithashtu bën zero të përafërt duke zbritur 500 nga vlera analoge e leximit. Kjo vlerë mund të ndryshohet nëse kërkohet. Për një rast tipik, këto vlera funksionojnë mirë. Për më tepër, duhet të shtohet një vonesë për të pasur një frekuencë marrjeje rreth 1200Hz. në rastin e frekuencës së marrjes së mostrës 1200Hz mund të zbulohet maksimumi i frekuencës 600 HZ.
për (int i = 0; i <128; i ++) {a = analogRead (Mic_pin) -500; // zhvendosja e përafërt zero sum1 = shuma1+a; // në vlerën mesatare sum2 = shuma2+a*a; // te vlera RMS a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann dritare në = 4*a; // shkallëzimi për vonesën e konvertimit float në int Mikrosekonda (195); // bazuar në gamën e frekuencës së funksionimit}
2. FFT:
Pasi të dhënat të jenë gati, FFT kryhet duke përdorur EasyFFT. Ky funksion EasyFFT është modifikuar për të rregulluar FFT për 128 mostra. Kodi është modifikuar gjithashtu për të zvogëluar konsumin e kujtesës. Funksioni origjinal EasyFFT i krijuar për të pasur deri në 1028 mostra (me tabelën e pajtueshme), ndërsa na duhen vetëm 128 mostra. ky kod zvogëlon konsumin e kujtesës me rreth 20% në krahasim me funksionin origjinal EasyFFT.
Sapo të bëhet FFT, kodi kthen 5 majat kryesore të frekuencës më dominuese për analiza të mëtejshme. Kjo frekuencë është e rregulluar në rend zbritës të amplitudës.
3. Për çdo kulm, kodi zbulon shënimet e mundshme që lidhen me të. ky kod skanon vetëm deri në 1200 Hz. Nuk është e nevojshme të keni shënim të njëjtë me frekuencën me amplituda maksimale.
Të gjitha frekuencat janë të hartuara midis 0 dhe 255, këtu zbulohet oktava e parë, për shembull, 65.4 Hz në 130.8 përfaqëson një oktavë, 130.8 Hz në 261.6 Hz përfaqëson një tjetër. Për çdo oktavë, frekuencat janë të hartuara nga 0 në 255. këtu hartëzimi fillon nga C në C '.
nëse (f_peaks > 1040) {f_peaks = 0;} nëse (f_peaks > = 65.4 && f_peaks = 130.8 && f_peaks = 261.6 && f_peaks = 523.25 && f_peaks = 1046 && f_peaks <= 2093) {f_peaks = 255*((f_peaks /1046) -1);}
Vlerat e grupit NoteV përdoren për të caktuar shënimin në frekuencat e zbuluara.
byte ShënimV [13] = {8, 23, 40, 57, 76, 96, 116, 138, 162, 187, 213, 241, 255};
4. Pas llogaritjes së shënimit për çdo frekuencë mund të jetë rasti që ekzistojnë frekuenca të shumta që sugjerojnë të njëjtën shënim. Për të pasur një kod dalës të saktë, merrni parasysh edhe përsëritjet. Kodi shton të gjitha vlerat e frekuencës bazuar në rendin e amplitudës dhe përsëritjet dhe arrin notën me amplituda maksimale.
Hapi 2: Aplikimi
Përdorimi i kodit është drejtpërdrejt, megjithatë, ka edhe kufizime të shumta që duhet të mbahen mend gjatë tij. Kodi mund të kopjohet pasi përdoret për zbulimin e shënimeve. Pikat e mëposhtme duhet të merren parasysh gjatë përdorimit të tij.
1. Caktimi i pinit:
Bazuar në bashkëngjitjen, caktimi i kunjit duhet të modifikohet. Për eksperimentin tim, e mbajta në pinin analog 7, void setup () {Serial.begin (250000); Mic_pin = A7; }
2. Ndjeshmëria e mikrofonit:
Ndjeshmëria e mikrofonit duhet të modifikohet, kështu që forma e valës mund të gjenerohet me amplituda të mirë. Kryesisht, moduli i Mikrofonit vjen me një cilësim të ndjeshmërisë. ndjeshmëria e përshtatshme për t'u zgjedhur e tillë që sinjali të mos jetë shumë i vogël dhe gjithashtu të mos fiket për shkak të amplituda më të lartë.
3. Pragu i amplitudës:
Ky kod aktivizohet vetëm nëse amplituda e sinjalit është mjaft e lartë. ky cilësim duhet të vendoset manualisht nga përdoruesi. kjo vlerë varet nga ndjeshmëria e mikrofonit, si dhe aplikimi.
nëse (shuma2-shuma> 5) {
..
në kodin e mësipërm, shuma2 jep vlerë RMS ndërsa shuma 1 jep vlerën mesatare. kështu që ndryshimi midis këtyre dy vlerave jep amplituda e sinjalit të zërit. në rastin tim, funksionon siç duhet me një vlerë amplituda prej rreth 5.
4. Si parazgjedhje, ky kod do të printojë shënimin e zbuluar. megjithatë, nëse planifikoni të përdorni shënimin për ndonjë qëllim tjetër, numri i caktuar drejtpërdrejt duhet të përdoret. për shembull C = 0; C#= 1, D = 2, D#= 3 dhe në vazhdim.
5. Nëse instrumenti ka frekuencë më të lartë, kodi mund të japë dalje false. frekuenca maksimale është e kufizuar nga frekuenca e marrjes së mostrave. kështu që ju mund të luani rreth vlerave nën vonesë për të marrë daljen optimale. në vonesën e kodit nën 195 mikrosekonda. të cilat mund të ndryshohen për të marrë prodhimin optimal. Kjo do të ndikojë në kohën e përgjithshme të ekzekutimit.
{a = analogRead (Mic_pin) -500; // zhvendosje e përafërt zero
shuma 1 = shuma 1+a; // në vlerën mesatare sum2 = shuma2+a*a; // te vlera RMS a = a*(sin (i*3.14/128)*sin (i*3.14/128)); // Hann dritare në = 4*a; // shkallëzimi për vonesën e konvertimit float në int Mikrosekonda (195); // bazuar në gamën e frekuencës së funksionimit}
6. ky kod do të funksionojë vetëm deri në frekuencën 2000Hz. duke eleminuar vonesën mes marrjes së mostrave rreth 3-4 kHz të frekuencave të kampionimit mund të merret.
Masa paraprake:
- Siç u përmend në tutorialin EasyFFT, FFT ha një sasi të madhe të kujtesës së Arduino. Pra, nëse keni një program që duhet të ruajë disa vlera, rekomandohet të përdorni një tabelë me memorie më të lartë.
- Ky kod mund të funksionojë mirë për një instrument/vokalist dhe i keq për një tjetër. Zbulimi i saktë në kohë reale nuk është i mundur për shkak të kufizimeve llogaritëse.
Hapi 3: Veror
Zbulimi i shënimeve është punë intensive llogaritëse, marrja e prodhimit në kohë reale është shumë e vështirë veçanërisht në Arduino. Ky kod mund të japë rreth 6.6 mostra /sekonda (për 195 mikrosekonda shtimi i vonesës). ky kod funksionon mirë me pianon dhe disa instrumente të tjerë.
Shpresoj që ky kod dhe tutorial të jenë të dobishëm në projektin tuaj në lidhje me muzikën. në rast dyshimi ose sugjerimi mos ngurroni të komentoni ose dërgoni mesazh.
Në tutorialin e ardhshëm, unë do të modifikoj këtë kod për zbulimin e akordit muzikor. kështu që qëndroni të sintonizuar.
Recommended:
Muzikë vallëzimi arkivoli duke përdorur Arduino: 6 hapa
Arkivol Dance Music Duke përdorur Arduino: Në këtë tutorial unë jam se si mund të përdorni një Arduino për të bërë muzikë duke përdorur vetëm me një altoparlant (nuk kërkohet modul MP3). Së pari shikoni këtë video tutorial
Muzikë me Arduino dhe Stafetë: 6 hapa
Muzikë me Arduino dhe Stafetë: në këtë tutorial, unë do t'ju tregoj se si të krijoni muzikë me stafetë dhe Arduino, një projekt interesant fillestar miqësor
Muzikë Meme e Vallëzimit të Arkivolit të Arkivolit duke Përdorur Arduino Uno: 5 Hapa
Astronomia Coffin Dance Meme Music Duke përdorur Arduino Uno: Ky është ky blog që ju kemi treguar Astronomia Coffin Dance Tune With Arduino UnoSiç të gjithë e dini për memet e fijeve në lidhje me astronominë e vallëzimit të arkivolit kështu që vendosa ta bëj këtë melodi duke përdorur arduino uno Këtu janë hapat dhe furnizimet e përdorura në këtë projekt
Si të vendosni shënime në një kalkulator TI-84 Plus: 7 hapa
Si të vendosni shënime në një Llogaritës TI-84 Plus: Ruajtja e shënimeve dhe formulave në llogaritësin tuaj të grafikut TI-84 Plus mund të përdoret për të kursyer kohë dhe për të kujtuar formulat në mënyrë më të besueshme. Mund të përdoret gjithashtu për t'i dhënë përparësi provimeve të tilla si SAT, të cilat i lejojnë studentët të përdorin këtë metodë. Në fol
Shënime PDF efektive në Linux: 4 hapa
Shënime PDF efektive në Linux: A keni qenë ndonjëherë të nevojshëm për të shënuar dokumente PDF në Linux? Unë nuk po flas për krijimin e PDF -ve, të cilat mund të bëhen me një numër mjetesh duke përfshirë latex+dvipdf, pdflatex, LibreOffice ose të tjerë. Po flas për shtimin e shënimeve tuaja mbi një ekzistencë