ዝርዝር ሁኔታ:

የሙዚቃ ማስታወሻ መፈለጊያ -3 ደረጃዎች
የሙዚቃ ማስታወሻ መፈለጊያ -3 ደረጃዎች

ቪዲዮ: የሙዚቃ ማስታወሻ መፈለጊያ -3 ደረጃዎች

ቪዲዮ: የሙዚቃ ማስታወሻ መፈለጊያ -3 ደረጃዎች
ቪዲዮ: አልፋና ኦሜጋ ፈጣሪ የሆንክ | Aplfana Omega | Zemari Kinetibeb | ዝማሬ መላእክት 2024, ህዳር
Anonim
Image
Image

በአንድ መሣሪያ የተጫወተውን ማስታወሻ በሚለየው በዚህ ፕሮጀክት ጓደኞችዎን እና ቤተሰብዎን ያስደንቁ። ይህ ፕሮጀክት በኤሌክትሮኒክ ቁልፍ ሰሌዳ ፣ በፒያኖ መተግበሪያ ወይም በሌላ በማንኛውም መሣሪያ ላይ የተጫወተውን ግምታዊ ድግግሞሽ እንዲሁም የሙዚቃ ማስታወሻን ያሳያል።

ዝርዝሮች

ለዚህ ፕሮጀክት ከድምፅ ሞዱል መፈለጊያ የአናሎግ ውፅዓት ወደ አርዱዲኖ ኡኖ ወደ A0 አናሎግ ግብዓት ይላካል። የአናሎግ ምልክቱ ናሙና እና መጠናዊ (ዲጂታል የተደረገ) ነው። የራስ -ማስተካከያ ፣ የክብደት እና የማስተካከያ ኮድ የመጀመሪያዎቹን 3 ወቅቶች በመጠቀም መሠረታዊ ድግግሞሽ ለማግኘት ጥቅም ላይ ይውላል። ግምታዊው መሠረታዊ ድግግሞሽ በአቅራቢያው ያለውን የሙዚቃ ማስታወሻ ድግግሞሽ ለመወሰን በ octaves 3 ፣ 4 እና 5 ክልል ውስጥ ካለው ድግግሞሽ ጋር ይነፃፀራል። በመጨረሻም ለቅርብ ድግግሞሽ የሚገመተው ማስታወሻ በማያ ገጹ ላይ ታትሟል።

ማሳሰቢያ ይህ አስተማሪ ፕሮጄክቱን እንዴት እንደሚገነባ ላይ ብቻ ያተኩራል። ስለዝርዝሮቹ እና የንድፍ ማረጋገጫዎቹ የበለጠ መረጃ ለማግኘት እባክዎን ይህንን አገናኝ ይጎብኙ ተጨማሪ መረጃ

አቅርቦቶች

  • (1) አርዱዲኖ ኡኖ (ወይም ገኒኖኖ ኡኖ)
  • (1) DEVMO ማይክሮፎን ዳሳሽ ከፍተኛ ትብነት ያለው የድምፅ ማወቂያ ሞዱል ተኳሃኝ
  • (1) አልባ አልባ የዳቦ ሰሌዳ
  • (1) ዩኤስቢ-ሀ ለ ቢ ገመድ
  • ዝላይ ሽቦዎች
  • የሙዚቃ ምንጭ (ፒያኖ ፣ የቁልፍ ሰሌዳ ወይም የፓኖ መተግበሪያ ከድምጽ ማጉያዎች ጋር)
  • (1) ኮምፒተር ወይም ላፕቶፕ

ደረጃ 1 ለሙዚቃ ማስታወሻ መፈለጊያ ሃርድዌር ይገንቡ

የሙዚቃ ማስታወሻ መፈለጊያውን ያዋቅሩ
የሙዚቃ ማስታወሻ መፈለጊያውን ያዋቅሩ

አርዱዲኖ ኡኖ ፣ የግንኙነት ሽቦዎች ፣ የማይሸጥ የዳቦ ሰሌዳ እና የ DEVMO ማይክሮፎን ዳሳሽ ከፍተኛ የስሜት ድምጽ ማወቂያ ሞዱል (ወይም ተመሳሳይ) በዚህ ምስል ላይ የሚታየውን ወረዳ ይገንቡ።

ደረጃ 2 - የሙዚቃ ማስታወሻ መፈለጊያውን ያቅዱ

በአርዱዲኖ አይዲኢ ውስጥ የሚከተለውን ኮድ ያክሉ።

gistfile1.txt

/*
ፋይል/የስዕል ስም MusicalNoteDetector
ስሪት ቁጥር: v1.0 ሰኔ 7 ቀን 2020 ተፈጥሯል
የመጀመሪያው ደራሲ - ክላይድ ኤ ሌትሶሜ ፣ ፒኤችዲ ፣ ፒኢ ፣ ኤምኤም
መግለጫ -ይህ ኮድ/ንድፍ በኤሌክትሮኒክ ቁልፍ ሰሌዳ ወይም በፒያኖ መተግበሪያ ላይ የተጫወተውን ግምታዊ ድግግሞሽ እንዲሁም የሙዚቃ ማስታወሻን ያሳያል። ለዚህ ፕሮጀክት የአናሎግ ውፅዓት ከ
የድምፅ ሞዱል መፈለጊያ ወደ አርዱዲኖ ኡኖ ወደ A0 አናሎግ ግብዓት ይላካል። የአናሎግ ምልክቱ ናሙና እና መጠናዊ (ዲጂታዊ) ነው። የራስ -ማስተካከያ ፣ የክብደት እና የማስተካከያ ኮድ ጥቅም ላይ ውሏል
የመጀመሪያዎቹን 3 ወቅቶች በመጠቀም መሠረታዊ ድግግሞሽ ያግኙ። በጣም ቅርብ የሆነውን ሙዚቃ ለመወሰን ግምታዊው መሠረታዊ ድግግሞሽ በኦክቶ 3 ፣ 4 እና 5 ክልል ውስጥ ካለው ድግግሞሽ ጋር ይነፃፀራል።
የማስታወሻ ድግግሞሽ። በመጨረሻም ለቅርብ ድግግሞሽ የተገመተው ማስታወሻ በማያ ገጹ ላይ ታትሟል።
ፈቃድ - ይህ ፕሮግራም ነፃ ሶፍትዌር ነው ፤ በጂኤንዩ አጠቃላይ የህዝብ ፈቃድ (GPL) ስሪት 3 ውሎች ፣ ወይም በማንኛውም በኋላ እንደገና ማሰራጨት እና/ወይም ማሻሻል ይችላሉ
በነጻ ሶፍትዌር ፋውንዴሽን እንደታተመው የመረጡት ስሪት።
ማስታወሻዎች የቅጂ መብት (ሐ) 2020 በ A. Lettsome Services ፣ LLC
ለተጨማሪ መረጃ ይጎብኙ
*/
#define SAMPLES 128 // ማክስ 128 ለአርዱዲኖ ኡኖ።
#መለየት SAMPLING_FREQUENCY 2048 // Fs = በ Nyquist ላይ የተመሠረተ ፣ ከሚጠበቀው ከፍተኛ ድግግሞሽ 2 እጥፍ መሆን አለበት።
#መግለፅ OFFSETSAMPLES 40 // ለ calabrating ዓላማዎች ጥቅም ላይ ውሏል
#ጥራት TUNER -3 // C3 እስከ 130.50 ድረስ ያስተካክሉ
ተንሳፋፊ ናሙና ፔሪዮድ;
ያልተፈረመ ረጅም ማይክሮ ሰከንድ;
int X [ናሙናዎች]; // እውነተኛ እሴቶችን ለመያዝ የመጠን ናሙናዎችን ናሙናዎች (ናሙናዎች) ይፍጠሩ
float autoCorr [SAMPLES]; // ምናባዊ እሴቶችን ለመያዝ የመጠን ናሙናዎች ናሙናዎችን ይፍጠሩ
ተንሳፋፊ ተከማች ኖቴፍሬክ [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]; // የማካካሻ ቬክተር ይፍጠሩ
int avgOffSet; // የማካካሻ ቬክተር ይፍጠሩ
int i ፣ k ፣ periodEnd ፣ periodBegin ፣ ክፍለ ጊዜ ፣ አስተካካይ ፣ ማስታወሻ ቦታ ፣ octaveRange;
ተንሳፋፊ maxValue ፣ minValue;
ረጅም ድምር;
intresh th = 0;
int numOfCycles = 0;
ተንሳፋፊ ምልክት ድግግሞሽ ፣ የምልክት ድግግሞሽ 2 ፣ የምልክት ድግግሞሽ 3 ፣ የምልክት ፍሪኩዌንሲ ፣ ጠቅላላ ፣
ባይት state_machine = 0;
int samplesPerPeriod = 0;
ባዶነት ማዋቀር ()
{
Serial.begin (115200); // 115200 Baud ተመን ለ Serial Monitor
}
ባዶነት loop ()
{
//*****************************************************************
// የመረበሽ ክፍል
//*****************************************************************
Serial.println ("Calabrating. እባክዎን በማሳወቂያ ጊዜ ምንም ማስታወሻ አይጫወቱ።");
ለ (i = 0; i <OFFSETSAMPLES; i ++)
{
offSet = analogRead (0); // እሴቱን ከአናሎግ ፒን 0 (A0) ያነባል ፣ ይለካዋል እና እንደ እውነተኛ ቃል ያስቀምጡት።
//Serial.println(offSet gaad)); // ምንም ድምፅ በማይጫወትበት ጊዜ የድምፅ ማወቂያ ሞጁሉን በግማሽ ወይም በ 512 ለማስተካከል ይህንን ይጠቀሙ።
sumOffSet = sumOffSet + offSet ;
}
samplesPerPeriod = 0;
maxValue = 0;
//*****************************************************************
// ግብዓት ከ A0 ለመቀበል ይዘጋጁ
//*****************************************************************
avgOffSet = ዙር (sumOffSet / OFFSETSAMPLES);
Serial.println ("ወደ ታች መቁጠር");
መዘግየት (1000); // ለ 1 ሰከንዶች ያቁሙ
Serial.println ("3");
መዘግየት (1000); // ለ 1 ሰከንዶች ያቁሙ
Serial.println ("2");
መዘግየት (1000); // ለአፍታ አቁም
Serial.println ("1");
መዘግየት (1000); // ለ 1 ሰከንዶች ያቁሙ
Serial.println ("ማስታወሻዎን ያጫውቱ!");
መዘግየት (250); // ለምላሽ ጊዜ ለ 1/4 ሰከንድ ለአፍታ ያቁሙ
//*****************************************************************
// ናሙና ናሙናዎችን ከ A0 ናሙና ናሙና ጊዜ ጋር ይሰብስቡ
//*****************************************************************
samplingPeriod = 1.0 / SAMPLING_FREQUENCY; // ክፍለ ጊዜ በማይክሮ ሰከንዶች ውስጥ
ለ (i = 0; i <SAMPLES; i ++)
{
ማይክሮ ሰከንዶች = ማይክሮስ (); // የአርዱዲኖ ቦርድ የአሁኑን ስክሪፕት ማካሄድ ከጀመረ ጀምሮ የማይክሮ ሰከንዶችን ቁጥር ይመልሳል።
X = analogRead (0); // እሴቱን ከአናሎግ ፒን 0 (A0) ያነባል ፣ ይለካዋል እና እንደ እውነተኛ ቃል ያስቀምጡት።
/ *በሰከንዶች ውስጥ አስፈላጊ ከሆነ በናሙናዎች መካከል የመጠባበቂያ ጊዜ ይቀራል */
ሳለ (ማይክሮስ () <(microSeconds + (samplingPeriod * 1000000))))
{
// ምንም አታድርጉ ዝም ብላችሁ ጠብቁ
}
}
//*****************************************************************
// የራስ -ማስተካከያ ተግባር
//*****************************************************************
ለ (i = 0; i <SAMPLES; i ++) // i = መዘግየት
{
ድምር = 0;
ለ (k = 0; k <SAMPLES - i; k ++) // የዘገየ ምልክት ካለው ምልክት ጋር ይዛመዱ
{
ድምር = ድምር + (((X [k]) - avgOffSet) * ((X [k + i]) - avgOffSet)); // X [k] ምልክት ሲሆን X [k+i] የዘገየው ስሪት ነው
}
autoCorr = ድምር / ናሙናዎች;
// የመጀመሪያው ፒክ ግኝት ግዛት ማሽን
ከሆነ (state_machine == 0 && i == 0)
{
thresh = autoCorr * 0.5;
state_machine = 1;
}
ሌላ ከሆነ (state_machine == 1 && i> 0 && thresh 0) // state_machine = 1 ፣ የመጀመሪያውን ዑደት ለመጠቀም 1 ጊዜ ያግኙ
{
maxValue = autoCorr ;
}
ሌላ ከሆነ (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;
samplesPerPeriod = (periodBegin - 0);
ጊዜ = ናሙናዎችPerPeriod;
አስተካካይ = TUNER+(50.04 * exp (-0.102 * samplesPerPeriod));
signalFrequency = ((SAMPLING_FREQUENCY) / (samplesPerPeriod))-አስማሚ; // f = fs/N
}
ሌላ ከሆነ (state_machine == 2 && i> 0 && thresh 0) // state_machine = 2 ፣ ለ 1 ኛ እና 2 ኛ ዑደት 2 ጊዜዎችን ያግኙ
{
maxValue = autoCorr ;
}
ሌላ ከሆነ (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;
samplesPerPeriod = (periodEnd - 0);
signalFrequency2 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplesPerPeriod))-አስተካካይ; // f = (2*fs)/(2*N)
maxValue = 0;
}
ሌላ ከሆነ (state_machine == 3 && i> 0 && thresh 0) // state_machine = 3 ፣ ለ 1 ኛ ፣ ለ 2 ኛ እና ለ 3 ኛ ዙር 3 ጊዜዎችን ያግኙ
{
maxValue = autoCorr ;
}
ሌላ ከሆነ (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;
samplesPerPeriod = (periodEnd - 0);
signalFrequency3 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplesPerPeriod))-አስተካካይ; // f = (3*fs)/(3*N)
}
}
//*****************************************************************
// የውጤት ትንተና
//*****************************************************************
ከሆነ (ናሙናዎችPerPeriod == 0)
{
Serial.println (“እምም….. እርግጠኛ አይደለሁም። እኔን ለማታለል እየሞከሩ ነው?”);
}
ሌላ
{
// የክብደት ተግባሩን ያዘጋጁ
ጠቅላላ = 0;
ከሆነ (የምልክት ድግግሞሽ! = 0)
{
ጠቅላላ = 1;
}
ከሆነ (signalFrequency2! = 0)
{
ጠቅላላ = ጠቅላላ + 2;
}
ከሆነ (signalFrequency3! = 0)
{
ጠቅላላ = ጠቅላላ + 3;
}
// የክብደት ተግባሩን በመጠቀም ድግግሞሹን ያስሉ
signalFrequencyGuess = ((1/ጠቅላላ) * signalFrequency) + ((2/ጠቅላላ) * signalFrequency2) + ((3/ጠቅላላ) * signalFrequency3); // ክብደት ያለው ድግግሞሽ ያግኙ
Serial.print ("የተጫወቱት ማስታወሻ በግምት ነው");
Serial.print (signalFrequencyGuess); // የድግግሞሽ ግምትን ያትሙ።
Serial.println ("Hz.");
// በግምት ላይ በመመስረት የኦክታቭ ክልል ያግኙ
octaveRange = 3;
ሳለ (! (signalFrequencyGuess> = የተከማቸ ኖቴፍሬክ [0] -7 && signalFrequencyGuess <= storageNoteFreq [11] +7))
{
ለ (i = 0; i <12; i ++)
{
storageNoteFreq = 2 * የተከማቸ ማስታወሻ ፍሬክ ;
}
octaveRange ++;
}
// በጣም ቅርብ የሆነውን ማስታወሻ ያግኙ
minValue = 10000000;
noteLocation = 0;
ለ (i = 0; i <12; i ++)
{
ከሆነ (minValue> abs (signalFrequencyGuess-storageNoteFreq ))
{
minValue = abs (signalFrequencyGuess-storageNoteFreq );
noteLocation = እኔ;
}
}
// ማስታወሻውን ያትሙ
Serial.print ("የተጫወትክ ይመስለኛል");
ከሆነ (ማስታወሻ ቦታ == 0)
{
Serial.print ("C");
}
ሌላ ከሆነ (noteLocation == 1)
{
Serial.print ("C#");
}
ሌላ ከሆነ (noteLocation == 2)
{
Serial.print ("D");
}
ሌላ ከሆነ (noteLocation == 3)
{
Serial.print ("D#");
}
ሌላ ከሆነ (noteLocation == 4)
{
Serial.print ("E");
}
ሌላ ከሆነ (noteLocation == 5)
{
Serial.print ("F");
}
ሌላ ከሆነ (noteLocation == 6)
{
Serial.print ("F#");
}
ሌላ ከሆነ (noteLocation == 7)
{
Serial.print ("G");
}
ሌላ ከሆነ (noteLocation == 8)
{
Serial.print ("G#");
}
ሌላ ከሆነ (noteLocation == 9)
{
Serial.print ("A");
}
ሌላ ከሆነ (noteLocation == 10)
{
Serial.print ("A#");
}
ሌላ ከሆነ (noteLocation == 11)
{
Serial.print ("B");
}
Serial.println (octaveRange);
}
//*****************************************************************
// እዚህ አቁም። እንደገና ለማስጀመር በ Arduino ላይ የዳግም አስጀምር ቁልፍን ይምቱ
//*****************************************************************
ሳለ (1);
}

GitHub በ hosted የተስተናገደ rawgistfile1.txt ን ይመልከቱ

ደረጃ 3: የሙዚቃ ማስታወሻ መፈለጊያውን ያዋቅሩ

በአርዱዲኖ አይዲኢ ውስጥ በተፃፈው ወይም በተጫነው ኮድ አርዱዲኖ ኡኖን ከፒሲ ጋር ያገናኙ። ኮዱን ያጠናቅሩ እና ወደ አርዱinoኖ ይስቀሉ። ወረዳውን ከሙዚቃው ምንጭ አጠገብ ያድርጉት። ማሳሰቢያ - በመግቢያ ቪዲዮው ውስጥ ከፒሲ ድምጽ ማጉያዎች ጋር እንደ ሙዚቃ ምንጭ ሆኖ በጡባዊ ላይ የተጫነ መተግበሪያን እጠቀማለሁ። በአርዲኖ ቦርድ ላይ የዳግም አስጀምር ቁልፍን ይምቱ እና ከዚያ በሙዚቃው ምንጭ ላይ ማስታወሻ ያጫውቱ። ከጥቂት ሰከንዶች በኋላ የሙዚቃ ማስታወሻ ፈላጊው የተጫወተውን ማስታወሻ እና ድግግሞሹን ያሳያል።

የሚመከር: