
Агуулгын хүснэгт:
2025 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2025-01-23 15:00


Хөгжмийн зэмсгээр тоглосон нотыг илрүүлэх энэхүү төслийн тусламжтайгаар найз нөхөд, гэр бүлээ гайхшруулаарай. Энэхүү төсөл нь ойролцоогоор давтамж, электрон гар, төгөлдөр хуурын апп эсвэл бусад хэрэгслээр тоглодог хөгжмийн нотыг харуулах болно.
Дэлгэрэнгүй
Энэхүү төслийн хувьд дууны модулийн детекторын аналог гаралтыг Arduino Uno -ийн A0 аналог оролт руу илгээдэг. Аналог дохиог дээжлэн тоон хэлбэрээр (дижитал хэлбэрт) оруулна. Автокорреляци, жинлэх, тааруулах кодыг эхний 3 үеийг ашиглан үндсэн давтамжийг олоход ашигладаг. Ойролцоох үндсэн давтамжийг 3, 4, 5 -р октавын давтамжтай харьцуулж хамгийн ойрын хөгжмийн нотын давтамжийг тодорхойлно. Эцэст нь хамгийн ойр давтамжийн таамагласан тэмдэглэлийг дэлгэц дээр хэвлэнэ.
Тэмдэглэл: Энэхүү зааварчилгаа нь зөвхөн төслийг хэрхэн бүтээх талаар төвлөрдөг. Дэлгэрэнгүй мэдээлэл, дизайны үндэслэлүүдийн талаар дэлгэрэнгүй мэдээллийг энэ линкээс авна уу: Дэлгэрэнгүй мэдээлэл
Хангамж
- (1) Arduino Uno (эсвэл Genuino Uno)
- (1) DEVMO микрофон мэдрэгч Өндөр мэдрэмжтэй дуу чимээ илрүүлэх модуль нийцтэй
- (1) Гагнуургүй талхны самбар
- (1) USB-A-B кабель
- Холбогч утас
- Хөгжмийн эх сурвалж (төгөлдөр хуур, гар эсвэл чанга яригчтай аппо програм)
- (1) Компьютер эсвэл зөөврийн компьютер
Алхам 1: Хөгжмийн тэмдэглэл илрүүлэгчийн тоног төхөөрөмжийг бүтээх

Arduino Uno ашиглан холболтын утас, гагнуургүй талх, DEVMO микрофоны мэдрэгчийн өндөр мэдрэмжтэй дуу чимээг илрүүлэх модуль (эсвэл үүнтэй төстэй) ашиглан энэ зураг дээр үзүүлсэн хэлхээг байгуулна.
Алхам 2: Хөгжмийн нот илрүүлэгчийг програмчлах
Arduino IDE дээр дараах кодыг нэмнэ үү.
gistfile1.txt
/* |
Файл/Ноорог нэр: MusicalNoteDetector |
Хувилбарын дугаар.: V1.0 2020 оны 6 -р сарын 7 -нд үүсгэсэн |
Анхны зохиогч: Клайд А. Леттсом, доктор, PE, MEM |
Тодорхойлолт: Энэхүү код/ноорог нь ойролцоогоор давтамж, электрон гар эсвэл төгөлдөр хуурын апп дээр тоглодог хөгжмийн нотыг харуулдаг. Энэхүү төслийн хувьд аналог гаралт нь |
дууны модуль илрүүлэгчийг Arduino Uno -ийн A0 аналог оролт руу илгээдэг. Аналог дохиог дээжлэн тоон хэлбэрээр (дижитал хэлбэрт) оруулна. Автокорреляци, жинлэх, тааруулах кодыг ашигладаг |
Эхний 3 үеийг ашиглан үндсэн давтамжийг олох. Ойролцоо үндсэн давтамжийг 3, 4, 5 -р октавуудын давтамжтай харьцуулж хамгийн ойрхон хөгжимийг тодорхойлно. |
давтамжийг тэмдэглэх. Эцэст нь хамгийн ойр давтамжийн таамагласан тэмдэглэлийг дэлгэц дээр хэвлэнэ. |
Лиценз: Энэ програм нь үнэгүй програм хангамж юм; Та үүнийг GNU General Public License (GPL) 3 -р хувилбарын нөхцлийн дагуу дахин тарааж,/эсвэл өөрчилж болно. |
Чөлөөт програм хангамжийн сангаас нийтэлсэн таны сонгосон хувилбар. |
Тэмдэглэл: Зохиогчийн эрх (c) 2020 он C. A. Lettsome Services, LLC |
Дэлгэрэнгүй мэдээллийг https://clydelettsome.com/blog/2020/06/07/my-weekend-project-musical-note-detector-using-an-arduino/ хаягаар орж үзнэ үү. |
*/ |
#SAMPLES 128 -ийг тодорхойлно уу // Max 128 нь Arduino Uno -д зориулагдсан болно. |
#тодорхойлох SAMPLING_FREQUENCY 2048 // Fs = Nyquist дээр үндэслэн хамгийн их хүлээгдэж буй давтамжаас 2 дахин их байх ёстой. |
#define OFFSETSAMPLES 40 // калабратын зориулалтаар ашигладаг |
#define TUNER -3 // C3 -ийг 130.50 болгож тохируулна уу |
хөвөх дээж авах хугацаа; |
гарын үсэг зураагүй урт microSeconds; |
int X [SAMPLES]; // бодит утгыг хадгалахын тулд SAMPLES хэмжээтэй вектор үүсгэх |
float autoCorr [SAMPLES]; // төсөөллийн утгыг хадгалахын тулд SAMPLES хэмжээтэй вектор үүсгэх |
float хадгалагдсанNoteFreq [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, period, тохируулагч, noteLocation, octaveRange; |
float maxValue, minValue; |
урт нийлбэр; |
int thresh = 0; |
int numOfCycles = 0; |
хөвөх дохио Давтамж, дохиоFrequency2, signalFrequency3, signalFrequencyGuess, total; |
байтын төлөв_машин = 0; |
int samplePerPeriod = 0; |
хүчингүй тохиргоо () |
{ |
Цуваа.begin (115200); // 115200 Serial Monitor -ийн Baud rate |
} |
хоосон давталт () |
{ |
//***************************************************************** |
// Калабрацийн хэсэг |
//***************************************************************** |
Serial.println ("Calabrating. Calabration хийх явцад ямар ч тэмдэглэл бүү тоглоорой."); |
for (i = 0; i <OFFSETSAMPLES; i ++) |
{ |
offSet = analogRead (0); // Аналог зүү 0 (A0) -ээс утгыг уншиж, тоон хэмжээг гаргаж, жинхэнэ нэр томъёо болгон хадгална. |
//Serial.println(offSet ); // үүнийг ашиглан дуу илрүүлэх модулийг ямар ч дуу тоглоогүй байхад ойролцоогоор хагас буюу 512 болгож тохируулна уу. |
sumOffSet = sumOffSet + offSet ; |
} |
samplePerPeriod = 0; |
maxValue = 0; |
//***************************************************************** |
// A0 -аас оруулсан оролтыг хүлээн авахад бэлтгэ |
//***************************************************************** |
avgOffSet = дугуй (sumOffSet / OFFSETSAMPLES); |
Serial.println ("Буцааж тоолох."); |
саатал (1000); // 1 секундын турш түр зогсоо |
Serial.println ("3"); |
саатал (1000); // 1 секундын турш түр зогсоо |
Serial.println ("2"); |
саатал (1000); // 1 түр зогсоо |
Serial.println ("1"); |
саатал (1000); // 1 секундын турш түр зогсоо |
Serial.println ("Тэмдэглэлээ тоглуул!"); |
саатал (250); // урвалын хугацаанд 1/4 секундын турш түр зогсооно |
//***************************************************************** |
// A0 -аас SAMPLES дээжийг түүвэрлэх хугацаатай түүвэрлэх |
//***************************************************************** |
samplingPeriod = 1.0 / SAMPLING_FREQUENCY; // Микроекунд дэх үе |
for (i = 0; i <SAMPLES; i ++) |
{ |
microSeconds = micros (); // Arduino самбар одоогийн скриптийг ажиллуулж эхэлснээс хойшхи микросекундын тоог буцаана. |
X = analogRead (0); // Аналог зүү 0 (A0) -ээс утгыг уншиж, тоон хэмжээг гаргаж, жинхэнэ нэр томъёо болгон хадгална. |
/ *шаардлагатай бол секундын дотор дээжийн хооронд хүлээх хугацаа үлдэх */ |
while (micros () <(microSeconds + (samplepingPeriod * 1000000))) |
{ |
// юу ч хийхгүй зүгээр хүлээ |
} |
} |
//***************************************************************** |
// Автокорреляцийн функц |
//***************************************************************** |
for (i = 0; i <SAMPLES; i ++) // i = саатал |
{ |
нийлбэр = 0; |
for (k = 0; k <SAMPLES - i; k ++) // Сигнал хоцрогдсонтой таарна |
{ |
нийлбэр = нийлбэр + ((((X [k]) - avgOffSet) * ((X [k + i]) - avgOffSet)); // X [k] нь дохио бөгөөд X [k+i] нь хойшлогдсон хувилбар юм |
} |
autoCorr = нийлбэр / SAMPLES; |
// First Peak Detect State Machine |
хэрэв (state_machine == 0 && i == 0) |
{ |
thresh = autoCorr * 0.5; |
төлөв_машин = 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; |
төлөв_машин = 2; |
numOfCycles = 1; |
samplePerPeriod = (periodBegin - 0); |
хугацаа = samplePerPeriod; |
тохируулагч = TUNER+(50.04 * exp (-0.102 * samplePerPeriod)); |
signalFrequency = ((SAMPLING_FREQUENCY) / (samplePerPeriod))-тохируулагч; // 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; |
төлөв_машин = 3; |
numOfCycles = 2; |
samplePerPeriod = (periodEnd - 0); |
signalFrequency2 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-тохируулагч; // 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; |
төрийн машин = 4; |
numOfCycles = 3; |
samplePerPeriod = (periodEnd - 0); |
signalFrequency3 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-тохируулагч; // f = (3*fs)/(3*N) |
} |
} |
//***************************************************************** |
// Үр дүнгийн шинжилгээ |
//***************************************************************** |
хэрэв (samplePerPeriod == 0) |
{ |
Serial.println ("Хмм….. би сайн мэдэхгүй байна. Та намайг хуурах гэж байна уу?"); |
} |
өөр |
{ |
// жинлэх функцийг бэлтгэх |
нийт = 0; |
хэрэв (дохионы давтамж! = 0) |
{ |
нийт = 1; |
} |
if (signalFrequency2! = 0) |
{ |
нийт = нийт + 2; |
} |
if (signalFrequency3! = 0) |
{ |
нийт = нийт + 3; |
} |
// жинлэх функцийг ашиглан давтамжийг тооцоолох |
signalFrequencyGuess = ((1/total) * signalFrequency) + ((2/total) * signalFrequency2) + ((3/total) * signalFrequency3); // жигнэсэн давтамжийг олох |
Serial.print ("Таны тоглосон тэмдэглэл ойролцоогоор"); |
Цуваа.хэвлэх (signalFrequencyGuess); // Давтамжийн таамаглалыг хэвлэх. |
Serial.println ("Гц."); |
// таамаглал дээр үндэслэн октавын мужийг олох |
octaveRange = 3; |
байхад (! (signalFrequencyGuess> = хадгалагдсанNoteFreq [0] -7 && signalFrequencyGuess <= хадгалагдсанNoteFreq [11] +7)) |
{ |
for (i = 0; i <12; i ++) |
{ |
хадгалагдсанNoteFreq = 2 * хадгалагдсанNoteFreq ; |
} |
octaveRange ++; |
} |
// Хамгийн ойрын тэмдэглэлийг олоорой |
minValue = 10000000; |
noteLocation = 0; |
for (i = 0; i <12; i ++) |
{ |
if (minValue> abs (signalFrequencyGuess-storedNoteFreq ))) |
{ |
minValue = abs (signalFrequencyGuess-storedNoteFreq ); |
noteLocation = i; |
} |
} |
// Тэмдэглэлийг хэвлэх |
Serial.print ("Та тоглосон гэж бодож байна"); |
хэрэв (noteLocation == 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 -аас ❤ -тай зохион байгуулагдсан rawgistfile1.txt -ийг үзэх
Алхам 3: Хөгжмийн тэмдэг илрүүлэгчийг тохируулна уу
Arduino Uno -г Arduino IDE дээр бичсэн эсвэл ачаалагдсан кодоор компьютерт холбоно уу. Кодыг эмхэтгэн Arduino руу байршуулна уу. Хөгжмийн эх үүсвэрийн ойролцоо хэлхээг байрлуул. Тэмдэглэл: Танилцуулах видеон дээр би таблет дээр суулгасан програмыг компьютерийн чанга яригчтай хамт хөгжмийн эх сурвалж болгон ашигладаг. Arduino самбар дээрх дахин тохируулах товчийг дараад хөгжмийн эх сурвалж дээр тэмдэглэл тоглуулна уу. Хэдэн секундын дараа Musical Note Detector нь тоглож буй тэмдэглэл болон түүний давтамжийг харуулна.
Зөвлөмж болгож буй:
Цахилгаан хөгжмийн зэмсэг 3D хэвлэсэн өсгөгч: 11 алхам (зурагтай)

Цахилгаан хөгжмийн зэмсэг 3D хэвлэмэл өсгөгч: Төслийн тодорхойлолт. Цахилгаан хийл эсвэл бусад цахилгаан хэрэгсэлд ашиглахын тулд хэвлэх өсгөгч хийх гэж найдаж байна. Тодорхойлолт. 3D хэвлэх боломжтой аль болох олон хэсгийг зохион бүтээж, стерео болгож, идэвхтэй өсгөгч ба жижиг байлгах
Гэртээ Arduino Nano ашиглан 32 хамтлагтай LED аудио хөгжмийн спектрийн анализаторыг хэрхэн яаж хийх вэ #arduinoproject: 8 алхам

Гэртээ Arduino Nano ашиглан 32 хамтлагтай LED аудио хөгжмийн спектрийн анализаторыг хэрхэн яаж хийх вэ 100 к резисторийн урд холбогдсон байх ёстой, эс тэгвээс дуу чимээ
Хөгжмийн Skittles: 4 алхам

Хөгжмийн Skittles: Өвөө эмээ байхын нэг зүйл бол та гайхалтай өвөө хүүхдүүдээ зугаацуулах шинэ, сонирхолтой арга замыг үргэлж хайж байдаг. Хөгжмийн зэмсгийг оруулаарай. ATTiny13 (b
Идэвхтэй хөгжмийн намын LED дэнлүү ба Bluetooth чанга яригч нь харанхуйд гэрэлтдэг PLA: 7 алхам (зурагтай)

Идэвхтэй хөгжмийн үдэшлэгийн LED дэнлүү ба Bluetooth чанга яригч нь харанхуйд гэрэлтдэг PLA: Сайн байна уу, миний зааварчилгааг тааруулж өгсөнд баярлалаа! Би жил бүр 14 настай хүүтэйгээ сонирхолтой төсөл хэрэгжүүлдэг. Бид квадрокоптер, усан сэлэлтийн цаг бүтээсэн. (энэ нь бас зааварчилгаа болно), CNC хаалттай вандан сандал, Fidget Spinners.Wi
Arduino хөгжмийн тэмдэглэл илрүүлэгч: 3 алхам

Arduino Music Notes Detector: Санах ой, боловсруулалтын хүчин чадал хязгаарлагдмал тул аудио дохионоос хөгжмийн тэмдэглэлийг илрүүлэх нь ялангуяа Arduino дээр хийхэд хэцүү байдаг. Ерөнхийдөө тэмдэглэл нь илрүүлэхэд хүндрэл учруулдаг цэвэр синус долгион биш юм. Хэрэв бид va -ийн давтамжийн хувиргалтыг авч үзвэл