সুচিপত্র:

মিউজিক্যাল নোট ডিটেক্টর: 3 টি ধাপ
মিউজিক্যাল নোট ডিটেক্টর: 3 টি ধাপ

ভিডিও: মিউজিক্যাল নোট ডিটেক্টর: 3 টি ধাপ

ভিডিও: মিউজিক্যাল নোট ডিটেক্টর: 3 টি ধাপ
ভিডিও: ১ নোট জানলে ৩ টি রাগ বাজাতে পারবেন। Harmonium Tutorial | গ্যারান্টি এমন টিপস কেও শেখাবে না 2024, নভেম্বর
Anonim
Image
Image

এই প্রকল্পে আপনার বন্ধু এবং পরিবারকে বিস্মিত করুন যা একটি যন্ত্র দ্বারা বাজানো নোট সনাক্ত করে। এই প্রকল্পটি আনুমানিক ফ্রিকোয়েন্সির পাশাপাশি একটি ইলেকট্রনিক কীবোর্ড, পিয়ানো অ্যাপ বা অন্য কোনো উপকরণে বাজানো মিউজিক্যাল নোট প্রদর্শন করবে।

বিস্তারিত

এই প্রকল্পের জন্য, সাউন্ড মডিউল ডিটেক্টর থেকে এনালগ আউটপুট 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 এর সাথে সংযুক্ত করুন। আরডুইনোতে কোডটি কম্পাইল এবং আপলোড করুন। সার্কিটটি সঙ্গীত উৎসের কাছাকাছি রাখুন। দ্রষ্টব্য: ভূমিকা ভিডিওতে, আমি আমার সঙ্গীতের উৎস হিসাবে পিসি স্পিকারের সাথে মিলিয়ে ট্যাবলেটে ইনস্টল করা একটি অ্যাপ ব্যবহার করি। আরডুইনো বোর্ডে রিসেট বোতামটি টিপুন এবং তারপরে সংগীতের উত্সে একটি নোট চালান। কয়েক সেকেন্ড পরে, মিউজিক্যাল নোট ডিটেক্টর প্লে করা নোট এবং তার ফ্রিকোয়েন্সি প্রদর্শন করবে।

প্রস্তাবিত: