সুচিপত্র:
- সরবরাহ
- ধাপ 1: মিউজিক্যাল নোট ডিটেক্টরের জন্য হার্ডওয়্যার তৈরি করুন
- ধাপ 2: মিউজিক্যাল নোট ডিটেক্টর প্রোগ্রাম করুন
- ধাপ 3: মিউজিক্যাল নোট ডিটেক্টর সেটআপ করুন
ভিডিও: মিউজিক্যাল নোট ডিটেক্টর: 3 টি ধাপ
2024 লেখক: John Day | [email protected]. সর্বশেষ পরিবর্তিত: 2024-01-30 07:57
এই প্রকল্পে আপনার বন্ধু এবং পরিবারকে বিস্মিত করুন যা একটি যন্ত্র দ্বারা বাজানো নোট সনাক্ত করে। এই প্রকল্পটি আনুমানিক ফ্রিকোয়েন্সির পাশাপাশি একটি ইলেকট্রনিক কীবোর্ড, পিয়ানো অ্যাপ বা অন্য কোনো উপকরণে বাজানো মিউজিক্যাল নোট প্রদর্শন করবে।
বিস্তারিত
এই প্রকল্পের জন্য, সাউন্ড মডিউল ডিটেক্টর থেকে এনালগ আউটপুট Arduino Uno এর A0 এনালগ ইনপুটে পাঠানো হয়। এনালগ সংকেত নমুনা এবং কোয়ান্টাইজড (ডিজিটালাইজড)। প্রথম 3 পিরিয়ড ব্যবহার করে মৌলিক ফ্রিকোয়েন্সি খুঁজে পেতে অটোকোরিলেশন, ওয়েটিং এবং টিউনিং কোড ব্যবহার করা হয়। আনুমানিক মৌলিক ফ্রিকোয়েন্সি তারপর অষ্টভ 3, 4, এবং 5 পরিসরের ফ্রিকোয়েন্সিগুলির সাথে তুলনা করা হয় নিকটতম বাদ্যযন্ত্রের ফ্রিকোয়েন্সি নির্ধারণ করতে। অবশেষে নিকটতম ফ্রিকোয়েন্সি জন্য অনুমিত নোট পর্দায় মুদ্রিত হয়।
দ্রষ্টব্য: এই নির্দেশযোগ্য কেবল প্রকল্পটি কীভাবে তৈরি করা যায় তার উপর দৃষ্টি নিবদ্ধ করে। বিস্তারিত এবং নকশা ন্যায্যতা সম্পর্কে আরও তথ্যের জন্য, দয়া করে এই লিঙ্কটি দেখুন: আরও তথ্য
সরবরাহ
- (1) Arduino Uno (বা Genuino Uno)
- (1) DEVMO মাইক্রোফোন সেন্সর উচ্চ সংবেদনশীলতা শব্দ সনাক্তকরণ মডিউল সামঞ্জস্যপূর্ণ
- (1) সোল্ডারলেস ব্রেডবোর্ড
- (1) ইউএসবি-এ থেকে বি কেবল
- জাম্পার তার
- মিউজিক্যাল সোর্স (পিয়ানো, কীবোর্ড বা স্পিকার সহ পেইনো অ্যাপ)
- (1) কম্পিউটার বা ল্যাপটপ
ধাপ 1: মিউজিক্যাল নোট ডিটেক্টরের জন্য হার্ডওয়্যার তৈরি করুন
একটি Arduino Uno, সংযোগের তার, একটি ঝালহীন রুটিবোর্ড এবং একটি DEVMO মাইক্রোফোন সেন্সর উচ্চ সংবেদনশীলতা শব্দ সনাক্তকরণ মডিউল (বা অনুরূপ) ব্যবহার করে এই ছবিতে দেখানো সার্কিট তৈরি করুন
ধাপ 2: মিউজিক্যাল নোট ডিটেক্টর প্রোগ্রাম করুন
Arduino IDE তে, নিম্নলিখিত কোড যোগ করুন।
gistfile1.txt
/* |
ফাইল/স্কেচ নাম: MusicalNoteDetector |
সংস্করণ নং: v1.0 7 জুন, 2020 তৈরি করা হয়েছে |
মূল লেখক: ক্লাইড এ লেটসোম, পিএইচডি, পিই, এমইএম |
বর্ণনা: এই কোড/স্কেচ আনুমানিক ফ্রিকোয়েন্সি এবং সেইসাথে ইলেকট্রনিক কীবোর্ড বা পিয়ানো অ্যাপে বাজানো মিউজিক্যাল নোট প্রদর্শন করে। এই প্রকল্পের জন্য, থেকে এনালগ আউটপুট |
সাউন্ড মডিউল ডিটেক্টরটি Arduino Uno এর A0 এনালগ ইনপুটে পাঠানো হয়। এনালগ সংকেত নমুনা এবং কোয়ান্টাইজড (ডিজিটালাইজড)। অটোকরিলেশন, ওয়েটিং এবং টিউনিং কোড ব্যবহার করা হয় |
প্রথম 3 পিরিয়ড ব্যবহার করে মৌলিক ফ্রিকোয়েন্সি খুঁজুন। আনুমানিক মৌলিক ফ্রিকোয়েন্সি তারপর নিকটতম বাদ্যযন্ত্র নির্ধারণ করার জন্য অষ্টভ 3, 4 এবং 5 পরিসরের ফ্রিকোয়েন্সিগুলির সাথে তুলনা করা হয় |
নোট ফ্রিকোয়েন্সি অবশেষে নিকটতম ফ্রিকোয়েন্সি জন্য অনুমিত নোট পর্দায় মুদ্রিত হয়। |
লাইসেন্স: এই প্রোগ্রামটি বিনামূল্যে সফটওয়্যার; আপনি GNU জেনারেল পাবলিক লাইসেন্স (জিপিএল) সংস্করণ 3 এর শর্তাবলীর অধীনে এটি পুনরায় বিতরণ এবং/অথবা পরিবর্তন করতে পারেন |
ফ্রি সফটওয়্যার ফাউন্ডেশন কর্তৃক প্রকাশিত আপনার পছন্দের সংস্করণ। |
নোট: কপিরাইট (c) 2020 C. A. Lettsome Services, LLC দ্বারা |
আরো তথ্যের জন্য ভিজিট করুন |
*/ |
#Arduino Uno এর জন্য নমুনা 128 // সর্বোচ্চ 128 নির্ধারণ করুন। |
#স্যাম্পলিং_ফ্রিকোয়েন্সি 2048 // Fs = Nyquist এর উপর ভিত্তি করে, সর্বোচ্চ প্রত্যাশিত ফ্রিকোয়েন্সি 2 গুণ হতে হবে। |
#সংজ্ঞায়িত OFFSETSAMPLES 40 // calabrating উদ্দেশ্যে ব্যবহৃত |
#ডিফাইন টিউনার -3 // C3 130.50 না হওয়া পর্যন্ত অ্যাডজাস্ট করুন |
ভাসমান নমুনা সময়কাল; |
স্বাক্ষরবিহীন দীর্ঘ মাইক্রোসেকেন্ড; |
int X [নমুনা]; // বাস্তব মান ধরে রাখতে SAMPLES আকারের ভেক্টর তৈরি করুন |
ফ্লোট অটোকোর [নমুনা]; // কাল্পনিক মান ধরে রাখতে SAMPLES আকারের ভেক্টর তৈরি করুন |
float storageNoteFreq [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, adjuster, noteLocation, octaveRange; |
ভাসমান maxValue, minValue; |
দীর্ঘ যোগফল; |
int থ্রেশ = 0; |
int numOfCycles = 0; |
ভাসা সংকেত |
বাইট state_machine = 0; |
int নমুনা PerPeriod = 0; |
অকার্যকর সেটআপ() |
{ |
Serial.begin (115200); // 115200 সিরিয়াল মনিটরের জন্য বাউড হার |
} |
অকার্যকর লুপ () |
{ |
//***************************************************************** |
// ক্যাল্যাব্রেশন বিভাগ |
//***************************************************************** |
Serial.println ("Calabrating। অনুগ্রহ করে ক্যাল্যাব্রেশনের সময় কোন নোট বাজাবেন না।") |
জন্য (i = 0; i <OFFSETSAMPLES; i ++) |
{ |
offSet = analogRead (0); // এনালগ পিন 0 (A0) থেকে মান পড়ে, এটিকে পরিমাপ করুন এবং এটি একটি বাস্তব শব্দ হিসাবে সংরক্ষণ করুন। |
//Serial.println(offSet ); // কোন শব্দ না বাজলে শব্দ সনাক্তকরণ মডিউলকে প্রায় অর্ধেক বা 512 এ সামঞ্জস্য করতে এটি ব্যবহার করুন। |
sumOffSet = sumOffSet + offSet ; |
} |
নমুনা PerPeriod = 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 থেকে নমুনা সংগ্রহ করুন |
//***************************************************************** |
স্যাম্পলিং পিরিয়ড = 1.0 / SAMPLING_FREQUENCY; // মাইক্রোসেকেন্ডে পিরিয়ড |
জন্য (i = 0; i <নমুনা; i ++) |
{ |
মাইক্রোসেকেন্ড = মাইক্রোস (); // Arduino বোর্ড বর্তমান স্ক্রিপ্ট চালানো শুরু করার পর থেকে মাইক্রোসেকেন্ডের সংখ্যা প্রদান করে। |
X = analogRead (0); // এনালগ পিন 0 (A0) থেকে মান পড়ে, এটিকে পরিমাপ করুন এবং এটি একটি বাস্তব শব্দ হিসাবে সংরক্ষণ করুন। |
/ *সেকেন্ডের মধ্যে প্রয়োজনে নমুনার মধ্যে অপেক্ষার অবশিষ্ট সময় */ |
যখন (মাইক্রোস () <(মাইক্রোসেকেন্ডস + (স্যাম্পলিং পিরিয়ড * 1000000))) |
{ |
// কিছু করবেন না শুধু অপেক্ষা করুন |
} |
} |
//***************************************************************** |
// অটোকরিলেশন ফাংশন |
//***************************************************************** |
জন্য (i = 0; i <নমুনা; i ++) // i = বিলম্ব |
{ |
যোগফল = 0; |
জন্য |
{ |
sum = sum + (((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, প্রথম চক্র ব্যবহারের জন্য ১ টি সময় খুঁজুন |
{ |
maxValue = autoCorr ; |
} |
অন্যথায় যদি (state_machine == 1 && i> 0 এবং |
{ |
periodBegin = i-1; |
state_machine = 2; |
numOfCycles = 1; |
নমুনা PerPeriod = (periodBegin - 0); |
সময় = নমুনা PerPeriod; |
adjuster = TUNER+(50.04 * exp (-0.102 * samplePerPeriod)); |
signalFrequency = ((SAMPLING_FREQUENCY) / (samplePerPeriod))-অ্যাডজাস্টার; // f = fs/N |
} |
অন্যথায় (state_machine == 2 && i> 0 && thresh 0) // state_machine = 2 |
{ |
maxValue = autoCorr ; |
} |
অন্যথায় (state_machine == 2 && i> 0 && থ্রেশ <autoCorr [i-1] && maxValue == autoCorr [i-1] && |
{ |
periodEnd = i-1; |
state_machine = 3; |
numOfCycles = 2; |
নমুনা PerPeriod = (periodEnd - 0); |
signalFrequency2 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-অ্যাডজাস্টার; // f = (2*fs)/(2*N) |
maxValue = 0; |
} |
অন্যথায় যদি (state_machine == 3 && i> 0 এবং |
{ |
maxValue = autoCorr ; |
} |
অন্যথায় যদি (state_machine == 3 && i> 0 এবং |
{ |
periodEnd = i-1; |
state_machine = 4; |
numOfCycles = 3; |
নমুনা PerPeriod = (periodEnd - 0); |
signalFrequency3 = ((numOfCycles*SAMPLING_FREQUENCY) / (samplePerPeriod))-অ্যাডজাস্টার; // f = (3*fs)/(3*N) |
} |
} |
//***************************************************************** |
// ফলাফল বিশ্লেষণ |
//***************************************************************** |
যদি (samplePerPeriod == 0) |
{ |
Serial.println ("হুম….. আমি নিশ্চিত নই। আপনি কি আমাকে ঠকানোর চেষ্টা করছেন?"); |
} |
অন্য |
{ |
// ওজন ফাংশন প্রস্তুত |
মোট = 0; |
যদি (signalFrequency! = 0) |
{ |
মোট = 1; |
} |
যদি (signalFrequency2! = 0) |
{ |
মোট = মোট + 2; |
} |
যদি (signalFrequency3! = 0) |
{ |
মোট = মোট + 3; |
} |
// ওজন ফাংশন ব্যবহার করে ফ্রিকোয়েন্সি গণনা করুন |
signalFrequencyGuess = ((1/total) * signalFrequency) + ((2/total) * signalFrequency2) + ((3/total) * signalFrequency3); // একটি ওজনযুক্ত ফ্রিকোয়েন্সি খুঁজুন |
Serial.print ("আপনি যে নোটটি খেলেছেন তা প্রায়"); |
Serial.print (signalFrequencyGuess); // ফ্রিকোয়েন্সি অনুমান মুদ্রণ করুন। |
Serial.println ("Hz।"); |
// অনুমানের উপর ভিত্তি করে অষ্টভ পরিসীমা খুঁজুন |
octaveRange = 3; |
যখন (! (signalFrequencyGuess> = संग्रहीत নোটফ্রেক [0] -7 && |
{ |
জন্য (i = 0; i <12; i ++) |
{ |
storageNoteFreq = 2 * storageNoteFreq ; |
} |
octaveRange ++; |
} |
// নিকটতম নোট খুঁজুন |
minValue = 10000000; |
নোট অবস্থান = 0; |
জন্য (i = 0; i <12; i ++) |
{ |
যদি (minValue> abs (signalFrequencyGuess-storageNoteFreq )) |
{ |
minValue = abs (signalFrequencyGuess-storageNoteFreq ); |
নোট অবস্থান = আমি; |
} |
} |
// নোট প্রিন্ট করুন |
সিরিয়াল.প্রিন্ট ("আমি মনে করি আপনি খেলেছেন"); |
যদি (নোট অবস্থান == 0) |
{ |
সিরিয়াল.প্রিন্ট ("সি"); |
} |
অন্যথায় যদি (noteLocation == 1) |
{ |
Serial.print ("C#"); |
} |
অন্যথায় যদি (noteLocation == 2) |
{ |
সিরিয়াল.প্রিন্ট ("ডি"); |
} |
অন্যথায় যদি (noteLocation == 3) |
{ |
Serial.print ("D#"); |
} |
অন্যথায় যদি (noteLocation == 4) |
{ |
সিরিয়াল.প্রিন্ট ("ই"); |
} |
অন্যথায় যদি (noteLocation == 5) |
{ |
সিরিয়াল.প্রিন্ট ("F"); |
} |
অন্যথায় যদি (noteLocation == 6) |
{ |
Serial.print ("F#"); |
} |
অন্যথায় যদি (noteLocation == 7) |
{ |
সিরিয়াল.প্রিন্ট ("জি"); |
} |
অন্যথায় যদি (noteLocation == 8) |
{ |
Serial.print ("G#"); |
} |
অন্যথায় যদি (noteLocation == 9) |
{ |
Serial.print ("A"); |
} |
অন্যথায় যদি (noteLocation == 10) |
{ |
Serial.print ("A#"); |
} |
অন্যথায় যদি (noteLocation == 11) |
{ |
সিরিয়াল.প্রিন্ট ("বি"); |
} |
Serial.println (octaveRange); |
} |
//***************************************************************** |
//এখানে থাম. আরডুইনোতে পুনরায় চালু করতে রিসেট বোতাম টিপুন |
//***************************************************************** |
যখন (1); |
} |
GitHub দ্বারা raw দিয়ে হোস্ট করা rawgistfile1.txt দেখুন
ধাপ 3: মিউজিক্যাল নোট ডিটেক্টর সেটআপ করুন
Arduino IDE তে লেখা বা লোড করা কোড দিয়ে Arduino Uno কে PC এর সাথে সংযুক্ত করুন। আরডুইনোতে কোডটি কম্পাইল এবং আপলোড করুন। সার্কিটটি সঙ্গীত উৎসের কাছাকাছি রাখুন। দ্রষ্টব্য: ভূমিকা ভিডিওতে, আমি আমার সঙ্গীতের উৎস হিসাবে পিসি স্পিকারের সাথে মিলিয়ে ট্যাবলেটে ইনস্টল করা একটি অ্যাপ ব্যবহার করি। আরডুইনো বোর্ডে রিসেট বোতামটি টিপুন এবং তারপরে সংগীতের উত্সে একটি নোট চালান। কয়েক সেকেন্ড পরে, মিউজিক্যাল নোট ডিটেক্টর প্লে করা নোট এবং তার ফ্রিকোয়েন্সি প্রদর্শন করবে।
প্রস্তাবিত:
আবহাওয়া নোট: 7 টি ধাপ (ছবি সহ)
আবহাওয়া নোট: এটি একটি সংমিশ্রণ আবহাওয়া স্টেশন এবং অনুস্মারক। আমরা সকলেই আমাদের ফোনে আবহাওয়া পরীক্ষা করতে পারি, কিন্তু কখনও কখনও এবং বিশেষ করে যখন কেউ দরজা দিয়ে বেরিয়ে আসার চেষ্টা করে তখন আবহাওয়ার অবস্থার দ্রুত উপায়। এই আবহাওয়া কেন্দ্রটি
Arduino সঙ্গীত নোট ডিটেক্টর: 3 ধাপ
আরডুইনো মিউজিক নোটস ডিটেক্টর: অডিও সিগন্যাল থেকে মিউজিক নোট সনাক্ত করা বিশেষ করে আরডুইনোতে সীমিত মেমরি এবং প্রসেসিং পাওয়ারের কারণে করা কঠিন। সাধারণত, নোটটি বিশুদ্ধ সাইন ওয়েভ নয় যা সনাক্তকরণকে কঠিন করে তোলে। যদি আমরা va এর ফ্রিকোয়েন্সি ট্রান্সফর্ম গ্রহণ করি
কিভাবে একটি TI-84 প্লাস ক্যালকুলেটরে নোট রাখুন: 7 টি ধাপ
কিভাবে একটি TI-84 প্লাস ক্যালকুলেটরে নোট রাখবেন: আপনার TI-84 Plus গ্রাফিং ক্যালকুলেটরে নোট এবং সূত্র সংরক্ষণ করা সময় বাঁচাতে এবং সূত্রগুলিকে আরো নির্ভরযোগ্যভাবে মনে রাখতে ব্যবহার করা যেতে পারে। এটি এসএটি -র মতো পরীক্ষায় নিজেকে এগিয়ে দিতে ব্যবহার করা যেতে পারে, যা শিক্ষার্থীদের এই পদ্ধতিটি ব্যবহার করার অনুমতি দেয়। ফলটিতে
ব্লিঙ্কিং মিউজিক্যাল নোট: 5 টি ধাপ
ব্লিঙ্কিং মিউজিক্যাল নোট: উপকরণ: 4 LED লাইট (ফিরোজা, নীল) সিএনসি মেশিন ওয়্যার সলিডওয়ার্কস 3 ডি প্রিন্টার সোল্ডারিং আয়রন এবং সোল্ডার 2 200 ওহম প্রতিরোধক হট গ্লু 9 ভোল্ট ব্যাটারি এবং স্ন্যাপ কানেক্টর ড্রিল এই প্রকল্পটি খুবই সহজ এবং খুব বেশি সময় লাগবে না
IOT স্মোক ডিটেক্টর: IOT দিয়ে বিদ্যমান স্মোক ডিটেক্টর আপডেট করুন: 6 টি ধাপ (ছবি সহ)
আইওটি স্মোক ডিটেক্টর: আইওটি সহ বিদ্যমান স্মোক ডিটেক্টর আপডেট করুন: অবদানকারীদের তালিকা, আবিষ্কারক: টান সিউ চিন, টান ইয়েট পেং, ট্যান উই হেনং সুপারভাইজার: ডক্টর চিয়া কিম সেং মেকাট্রনিক এবং রোবটিক ইঞ্জিনিয়ারিং বিভাগ, ইলেকট্রিক্যাল অ্যান্ড ইলেকট্রনিক ইঞ্জিনিয়ারিং অনুষদ, ইউনিভার্সিটি টিউন হুসেইন অন মালয়েশিয়া ডিস্ট্রিবিউট