সুচিপত্র:

জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার: 10 টি ধাপ (ছবি সহ)
জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার: 10 টি ধাপ (ছবি সহ)

ভিডিও: জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার: 10 টি ধাপ (ছবি সহ)

ভিডিও: জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার: 10 টি ধাপ (ছবি সহ)
ভিডিও: কেনগৱি পেটপুৱেৱ বন্ধু তুয়াৱ লাই | শিল্পী ইকবাল ও জবা | CTG Song 2021| Ancholik song | S Music Star 2024, জুলাই
Anonim
জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার
জাইবো বোর্ডে লেজার হার্প সিনথেসাইজার

এই টিউটোরিয়ালে আমরা একটি সিরিয়াল ইন্টারফেস সহ আইআর সেন্সর ব্যবহার করে একটি সম্পূর্ণ কার্যকরী লেজার বীণা তৈরি করব যা ব্যবহারকারীকে যন্ত্রের সুর এবং সুর পরিবর্তন করতে দেবে। এই বীণা হবে একুশ শতকের পুরনো যন্ত্রের রিমেক। সিস্টেমটি একটি Xilinx Zybo ডেভেলপমেন্ট বোর্ড এবং ভিভাদো ডিজাইন স্যুট ব্যবহার করে তৈরি করা হয়েছিল। প্রকল্পটি সম্পন্ন করতে আপনার যা লাগবে:

  • 12 আইআর সেন্সর এবং এমিটার (কম বেশি স্ট্রিং সংখ্যার উপর নির্ভর করে ব্যবহার করা যেতে পারে)
  • Zybo Zynq-7000 উন্নয়ন বোর্ড
  • ফ্রি আরটিওএস
  • ভিভাদো ডিজাইন স্যুট
  • ওয়্যার (বোর্ডে সেন্সর সংযুক্ত করার জন্য)
  • 3 টুকরা পিভিসি পাইপ ((2) 18 ইঞ্চি এবং (1) 8 ইঞ্চি)
  • 2 পিভিসি কনুই

ধাপ 1: Digilent এর Zybo DMA অডিও ডেমো পান

এই প্রকল্পের FPGA দিকটি মূলত এখানে পাওয়া ডেমো প্রকল্পের উপর ভিত্তি করে। এটি সরাসরি মেমরি থেকে ডেটা পাঠানোর জন্য সরাসরি মেমরি অ্যাক্সেস ব্যবহার করে যা প্রসেসর একটি I2S অডিও ব্লকে AXI স্ট্রীমে লিখতে পারে। নিম্নলিখিত পদক্ষেপগুলি আপনাকে ডিএমএ অডিও ডেমো প্রকল্পটি চালু এবং চালাতে সহায়তা করবে:

  1. জাইবো বোর্ডের জন্য বোর্ড ফাইলের একটি নতুন সংস্করণ প্রয়োজন হতে পারে। ভিভাদোর জন্য নতুন বোর্ড ফাইল পেতে এই নির্দেশাবলী অনুসরণ করুন।
  2. ভিভাদোতে ডেমো প্রকল্পটি খোলার জন্য এই পৃষ্ঠায় নির্দেশাবলীতে ধাপ 1 এবং 2 অনুসরণ করুন। ভিভাদো পদ্ধতি ব্যবহার করুন, এসডিকে হার্ডওয়্যার হ্যান্ডঅফ নয়।
  3. আপনি একটি বার্তা পেতে পারেন যা বলে যে আপনার কিছু আইপি ব্লক আপডেট করা উচিত। যদি তা হয় তবে "আইপি স্ট্যাটাস দেখান" নির্বাচন করুন এবং তারপরে আইপি স্ট্যাটাস ট্যাবে সমস্ত পুরানো আইপি নির্বাচন করুন এবং "আপগ্রেড সিলেক্টেড" ক্লিক করুন। যখন এটি শেষ হয় এবং একটি উইন্ডো পপ আপ করে জিজ্ঞাসা করে যে আপনি আউটপুট পণ্য তৈরি করতে চান, এগিয়ে যান এবং "জেনারেট" ক্লিক করুন। যদি আপনি একটি সমালোচনামূলক সতর্ক বার্তা পান, এটি উপেক্ষা করুন।
  4. সোর্স ফাইলগুলি দেখতে ভিভাদোতে ডিজাইন থেকে সোর্স ট্যাবে স্যুইচ করুন। ব্লক ডিজাইন "design_1" রাইট ক্লিক করুন এবং "HDL Wrapper তৈরি করুন" নির্বাচন করুন। অনুরোধ করা হলে "ব্যবহারকারীর সম্পাদনার অনুমতি দেওয়ার জন্য তৈরি কভার তৈরি করুন" নির্বাচন করুন। প্রকল্পের জন্য একটি মোড়ক ফাইল তৈরি করা হবে।
  5. এখন যেহেতু অন্যান্য টিউটোরিয়ালে যেসব গুরুত্বপূর্ণ পদক্ষেপগুলি একরকম বাদ দেওয়া হয়েছিল সেগুলি সম্পন্ন হয়েছে, আপনি পূর্বে সংযুক্ত টিউটোরিয়ালে ফিরে আসতে পারেন এবং ধাপ 4 থেকে শেষ পর্যন্ত চালিয়ে যেতে পারেন এবং নিশ্চিত করতে পারেন যে ডেমো প্রকল্পটি সঠিকভাবে চলছে। যদি আপনার রেকর্ড করার জন্য অডিও ইনপুট করার উপায় না থাকে তবে আপনার হেডফোন দিয়ে রেকর্ড করুন এবং প্লেব্যাক বোতাম টিপলে 5-10 সেকেন্ডের অস্পষ্ট শব্দ শুনুন। প্লেব্যাক বোতাম টিপলে হেডফোন জ্যাক থেকে যতক্ষণ পর্যন্ত কিছু বেরিয়ে আসে, এটি সম্ভবত সঠিকভাবে কাজ করছে।

পদক্ষেপ 2: ভিভাদোতে কিছু পরিবর্তন করুন

ভিভাদোতে কিছু পরিবর্তন করুন
ভিভাদোতে কিছু পরিবর্তন করুন

তাই এখন আপনি Digilent এর DMA অডিও ডেমো কাজ পেয়েছেন, কিন্তু এটি এখানে শেষ লক্ষ্য নয়। সুতরাং আমাদের ভিভাডোতে ফিরে যেতে হবে এবং কিছু পরিবর্তন করতে হবে যাতে আমাদের সেন্সরগুলি PMOD শিরোনামে প্লাগ করা যায় এবং আমরা সফটওয়্যারের দিকে তাদের মান ব্যবহার করতে পারি।

  1. ভিভাদোতে ব্লক ডায়াগ্রামটি খুলুন
  2. ব্লক ডায়াগ্রামে খালি জায়গায় ডান ক্লিক করে এবং মেনু থেকে "আইপি যোগ করুন" নির্বাচন করে একটি জিপিআইও ব্লক তৈরি করুন। খুঁজুন এবং "AXI GPIO" নির্বাচন করুন।
  3. নতুন আইপি ব্লকে ডাবল ক্লিক করুন এবং পুনরায় কাস্টমাইজ আইপি উইন্ডোতে আইপি কনফিগারেশন ট্যাবে যান। সমস্ত ইনপুট নির্বাচন করুন এবং প্রস্থকে বারো সেট করুন, যেহেতু আমাদের বীণায় 12 টি "স্ট্রিং" থাকবে এবং সেইজন্য 12 টি সেন্সর প্রয়োজন। আপনি যদি কম বা বেশি সেন্সর ব্যবহার করতে চান তাহলে এই নম্বরটি যথাযথভাবে সমন্বয় করুন। এছাড়াও সক্ষম ইন্টারাপ্ট সেট করুন।
  4. নতুন GPIO IP ব্লকে ডান ক্লিক করুন এবং "রান অটোমেশন চালান" নির্বাচন করুন। AXI বক্স চেক করুন এবং ঠিক আছে চাপুন। এটি স্বয়ংক্রিয়ভাবে AXI ইন্টারফেসকে সংযুক্ত করবে, কিন্তু ব্লকের আউটপুটগুলিকে সংযোগহীন অবস্থায় ছেড়ে দেবে।
  5. অতিরিক্ত বিরতির জন্য জায়গা তৈরি করার জন্য, xlconcat_0 আইপি ব্লকে ডাবল ক্লিক করুন এবং পোর্টের সংখ্যা 4 থেকে 5 তে পরিবর্তন করুন। তারপর আপনি নতুন GPIO ব্লক থেকে xlconcat ব্লকের নতুন অব্যবহৃত পোর্টে ip2intc_irpt পিন সংযোগ করতে পারেন।
  6. নতুন GPIO IP ব্লকের "GPIO" আউটপুটে ডান ক্লিক করুন এবং "মেক এক্সটার্নাল" নির্বাচন করুন। লাইনটি কোথায় যায় তা সন্ধান করুন এবং সামান্য পার্শ্ববর্তী পঞ্চভুজটিতে ক্লিক করুন এবং বামদিকে একটি উইন্ডো খোলা উচিত যেখানে আপনি নাম পরিবর্তন করতে পারেন। নাম পরিবর্তন করে "SENSORS" করুন। আমাদের কাজ করার জন্য আপনি যে সীমাবদ্ধতা ফাইল চান তা একই নাম ব্যবহার করা গুরুত্বপূর্ণ, অন্যথায় আপনাকে সীমাবদ্ধতা ফাইলে নাম পরিবর্তন করতে হবে।
  7. সোর্স ট্যাবে ফিরে যান, সীমাবদ্ধতা ফাইলটি খুঁজুন এবং আমরা যেটি সরবরাহ করি তার সাথে এটি প্রতিস্থাপন করুন। আপনি ফাইলটি প্রতিস্থাপন করতে বা আমাদের সীমাবদ্ধতা ফাইলের বিষয়বস্তু অনুলিপি করতে এবং পুরানোটির বিষয়বস্তুতে পেস্ট করতে পারেন। আমাদের সীমাবদ্ধতা ফাইলের একটি গুরুত্বপূর্ণ কাজ হল PMOD হেডারে পুলআপ প্রতিরোধক সক্ষম করা। আমাদের ব্যবহৃত বিশেষ সেন্সরের জন্য এটি প্রয়োজনীয়, তবে সব সেন্সর একই নয়। যদি আপনার সেন্সরগুলিকে পুলডাউন প্রতিরোধক প্রয়োজন হয় তবে আপনি "set_property PULLUP true" এর প্রতিটি দৃষ্টান্তকে "set_property PULLDOWN true" দিয়ে পরিবর্তন করতে পারেন। যদি তাদের বোর্ডে একটি ভিন্ন রোধক মান প্রয়োজন হয়, তাহলে আপনি এই লাইনগুলি সরিয়ে ফেলতে পারেন এবং বাহ্যিক প্রতিরোধক ব্যবহার করতে পারেন। পৃষ্ঠা যা এখানে পাওয়া যাবে। যদি আপনি বিভিন্ন pmod পিন ব্যবহার করতে চান তবে সীমাবদ্ধতা ফাইলের নামগুলি পরিকল্পিত লেবেলের সাথে মেলে। আমরা PMOD হেডার JE এবং JD ব্যবহার করি এবং প্রতিটিতে ছয়টি ডেটা পিন ব্যবহার করি, পিন 1 এবং 7 বাদ দিয়ে এই তথ্যটি গুরুত্বপূর্ণ। পরিকল্পিত হিসাবে দেখানো হয়েছে, PMODS- এ পিন 6 এবং 12 হল VCC এবং পিন 5 এবং 11 স্থল।
  8. আগের মতো এইচডিএল রেপারটি পুনরায় তৈরি করুন এবং পুরানোটি অনুলিপি করুন এবং ওভাররাইট করুন। যখন এটি সম্পন্ন হয়, বিটস্ট্রিম তৈরি করুন এবং আগের মতো হার্ডওয়্যার রপ্তানি করুন এবং SDK পুনরায় চালু করুন। যদি আপনি জিজ্ঞাসা করেন যে আপনি পুরানো হার্ডওয়্যার ফাইলটি প্রতিস্থাপন করতে চান কিনা, উত্তরটি হ্যাঁ। আপনি হার্ডওয়্যার রপ্তানি করার সময় SDK বন্ধ করা সম্ভবত সবচেয়ে ভাল যাতে এটি সঠিকভাবে প্রতিস্থাপিত হয়।
  9. এসডিকে চালু করুন।

ধাপ 3: FreeRTOS রানিং পান

পরবর্তী ধাপ হল জাইবো বোর্ডে ফ্রিআরটিওএস চালানো।

  1. আপনার যদি ইতিমধ্যে একটি অনুলিপি না থাকে তবে এখানে FreeRTOS ডাউনলোড করুন এবং ফাইলগুলি বের করুন।
  2. FreeRTOSv9.0.0 / FreeRTOS / Demo / CORTEX_A9_Zynq_ZC702 / RTOSDemo এ অবস্থিত FreeRTOS Zynq ডেমো আমদানি করুন। আমদানি প্রক্রিয়াটি অন্যান্য ডেমো প্রকল্পের মতোই অনেকটা একই, তবে FreeRTOS Zynq ডেমো FreeRTOS ফোল্ডারের অন্যান্য ফাইলগুলির উপর নির্ভর করে, আপনার ফাইলগুলিকে আপনার কর্মক্ষেত্রে অনুলিপি করা উচিত নয়। পরিবর্তে, আপনার পুরো ফ্রিআরটিওএস ফোল্ডারটি আপনার প্রোজেক্ট ফোল্ডারের ভিতরে রাখুন।
  3. "ফাইল" -> "নতুন" -> "বোর্ড সাপোর্ট প্যাকেজ" এ গিয়ে একটি নতুন বোর্ড সাপোর্ট প্যাকেজ তৈরি করুন। নিশ্চিত করুন যে স্বতন্ত্র নির্বাচন করা হয়েছে এবং শেষ ক্লিক করুন। কিছুক্ষণ পর একটি উইন্ডো পপ আপ হবে, lwip141 এর পাশে বাক্সটি চেক করুন (এটি ফ্রিআরটিওএস ডেমোগুলিকে কম্পাইল করতে ব্যর্থ হওয়া থেকে বিরত রাখে) এবং ওকে চাপুন। এর পরে RTOSdemo প্রকল্পে ডান ক্লিক করুন এবং "বৈশিষ্ট্য" এ যান, "প্রকল্প রেফারেন্স" ট্যাবে যান এবং আপনার তৈরি করা নতুন bsp এর পাশের বাক্সটি চেক করুন। আশা করি এটি স্বীকৃত হবে কিন্তু কখনও কখনও Xilinx SDK এই ধরণের জিনিস সম্পর্কে অদ্ভুত হতে পারে। যদি আপনি এই ধাপের পরেও একটি ত্রুটি পান যে xparameters.h অনুপস্থিত বা এরকম কিছু তাহলে এই পদক্ষেপটি পুনরাবৃত্তি করার চেষ্টা করুন এবং সম্ভবত SDK থেকে বেরিয়ে এসে পুনরায় চালু করুন।

ধাপ 4: লেজার হার্প কোড যোগ করুন

এখন যেহেতু ফ্রিআরটিওএস আমদানি করা হয়েছে, আপনি লেজার হারপ প্রকল্প থেকে ফাইলগুলি ফ্রিআরটিওএস ডেমোতে আনতে পারেন

  1. FreeRTOS ডেমোতে src ফোল্ডারের অধীনে একটি নতুন ফোল্ডার তৈরি করুন এবং এই ফোল্ডারে main.c ব্যতীত প্রদত্ত সমস্ত সি ফাইলগুলি কপি এবং পেস্ট করুন।
  2. RTOSDemo main.c কে প্রদত্ত main.c দিয়ে প্রতিস্থাপন করুন।
  3. যদি সবকিছু সঠিকভাবে করা হয়, আপনি এই সময়ে লেজার বীণা কোড চালাতে সক্ষম হওয়া উচিত। পরীক্ষার উদ্দেশ্যে, ডিএমএ ডেমো প্রকল্পে ব্যবহৃত বোতাম ইনপুট এখন সেন্সর সংযুক্ত না করে শব্দ চালাতে ব্যবহৃত হয় (চারটি প্রধান বোতামগুলির মধ্যে যে কোনওটি কাজ করবে)। এটি প্রতিবার আপনি একটি স্ট্রিং বাজাবেন এবং একাধিক প্রেসের মাধ্যমে সিস্টেমের সমস্ত স্ট্রিং দিয়ে চক্র চালাবেন। জাইবো বোর্ডে হেডফোন জ্যাকের সাথে কিছু হেডফোন বা স্পিকার লাগান এবং নিশ্চিত করুন যে আপনি যখন একটি বোতাম টিপবেন তখন স্ট্রিংগুলির শব্দগুলি শুনতে পাবেন।

ধাপ 5: কোড সম্পর্কে

আপনারা অনেকেই এই টিউটোরিয়ালটি পড়ছেন সম্ভবত এখানে শিখবেন কিভাবে অডিও সেট আপ করতে হয় বা ডিএমএ ব্যবহার করে ভিন্ন কিছু করতে হয়, অথবা একটি ভিন্ন বাদ্যযন্ত্র তৈরি করতে হয়। সেই কারণে পরবর্তী কয়েকটি বিভাগ ডিএমএ ব্যবহার করে একটি কার্যকরী অডিও আউটপুট পাওয়ার জন্য পূর্বে বর্ণিত হার্ডওয়্যারের সাথে কীভাবে সরবরাহ করা কোড কাজ করে তা বর্ণনা করার জন্য উৎসর্গ করছে। কোড টুকরা কেন আছে তা যদি আপনি বুঝতে পারেন তবে আপনি যা তৈরি করতে চান তার জন্য সেগুলি সামঞ্জস্য করতে সক্ষম হওয়া উচিত।

বাধা দেয়

প্রথমে আমি উল্লেখ করব কিভাবে এই প্রকল্পে বাধা সৃষ্টি হয়। আমরা যেভাবে এটি করেছি তা হল প্রথমে একটি ইন্টারাপ্ট ভেক্টর টেবিল স্ট্রাকচার তৈরি করে যা আইডি, ইন্টারাপ্ট হ্যান্ডলার এবং প্রতিটি ইন্টারাপ্টের জন্য ডিভাইসের রেফারেন্স রাখে। বাধা আইডিগুলি xparameters.h থেকে আসে। ইন্টারাপ্ট হ্যান্ডলার হল একটি ফাংশন যা আমরা ডিএমএ এবং জিপিআইওর জন্য লিখেছিলাম, এবং I2C ইন্টারাপ্ট Xlic I2C ড্রাইভার থেকে এসেছে। ডিভাইসের রেফারেন্স প্রতিটি ডিভাইসের দৃষ্টান্ত নির্দেশ করে যা আমরা অন্যত্র শুরু করি। _Init_audio ফাংশনের শেষের কাছাকাছি একটি লুপ ইন্টারাপ্ট ভেক্টর টেবিলে প্রতিটি আইটেমের মধ্য দিয়ে যায় এবং দুটি ফাংশনকে কল করে, XScuGic_Connect () এবং XScuGic_Enable () ইন্টারাপ্টগুলিকে সংযোগ এবং সক্ষম করতে। তারা xInterruptController উল্লেখ করে, যা ডিফল্টরূপে FreeRTOS main.c- এ তৈরি একটি ইন্টারাপ্ট কন্ট্রোলার। তাই মূলত আমরা আমাদের প্রতিটি ইন্টারাপ্টকে এই ইন্টারাপ্ট কন্ট্রোলারের সাথে সংযুক্ত করি যা ইতিমধ্যেই ফ্রিআরটিওএস আমাদের জন্য তৈরি করেছে।

ডিএমএ

ডিএমএ প্রারম্ভিক কোড lh_main.c এ শুরু হয়। প্রথমে একটি XAxiDma কাঠামোর একটি স্ট্যাটিক উদাহরণ ঘোষণা করা হয়। তারপর _init_audio () ফাংশনে এটি কনফিগার করা হয়। প্রথমে ডেমো প্রকল্প থেকে কনফিগার ফাংশন বলা হয়, যা dma.c. এটি বেশ ভালভাবে নথিভুক্ত এবং সরাসরি ডেমো থেকে আসে। তারপরে বাধা সংযুক্ত এবং সক্ষম হয়। এই প্রকল্পের জন্য শুধুমাত্র মাস্টার-টু-স্লেভ ইন্টারাপ্ট প্রয়োজন, কারণ সমস্ত তথ্য DMA দ্বারা I2S কন্ট্রোলারে পাঠানো হচ্ছে। আপনি যদি অডিও রেকর্ড করতে চান, তাহলে আপনার স্লেভ-টু-মাস্টার ইন্টারাপ্টেরও প্রয়োজন হবে। মাস্টার-টু-স্লেভ ইন্টারাপ্ট ডাকা হয় যখন ডিএমএ পাঠানোর কাজ শেষ করে পাঠায়। এই বাধাটি আমাদের প্রকল্পের জন্য অবিশ্বাস্যভাবে গুরুত্বপূর্ণ কারণ যখনই ডিএমএ অডিও নমুনার একটি বাফার পাঠানো শেষ করে তখনই তা অবিলম্বে পরবর্তী বাফারটি পাঠানো শুরু করতে হবে, অন্যথায় পাঠানোর মধ্যে একটি শ্রবণযোগ্য বিলম্ব ঘটবে। Dma_mm2s_ISR () ফাংশনের ভিতরে আপনি দেখতে পারেন কিভাবে আমরা বাধাটি পরিচালনা করি। গুরুত্বপূর্ণ অংশটি শেষের কাছাকাছি যেখানে আমরা xSemaphoreGiveFromISR () এবং portYIELD_FROM_ISR () ব্যবহার করে _audio_task () জানিয়ে দিই যে এটি পরবর্তী DMA স্থানান্তর শুরু করতে পারে। আমরা ধ্রুবক অডিও ডেটা পাঠানোর উপায় হল দুটি বাফারের মধ্যে পর্যায়ক্রমে। যখন একটি বাফার I2C ব্লকে প্রেরণ করা হয় তখন অন্য বাফার তার মান গণনা করে সংরক্ষণ করে থাকে। তারপরে যখন ডিএমএ থেকে বাধা আসে সক্রিয় বাফার সুইচগুলি এবং সম্প্রতি লিখিত বাফার স্থানান্তরিত হতে শুরু করে যখন পূর্বে স্থানান্তরিত বাফারটি নতুন ডেটা দিয়ে ওভাররাইট করা শুরু করে। _Audio_task ফাংশনের মূল অংশ হল যেখানে fnAudioPlay () বলা হয়। fnAudioPlay () ডিএমএ উদাহরণ, বাফারের দৈর্ঘ্য এবং বাফারের একটি পয়েন্টার নেয় যা থেকে তথ্য স্থানান্তর করা হবে। আরো কিছু নমুনা আসছে তা জানাতে I2S রেজিস্টারে কিছু মান পাঠানো হয়। তারপর XAxiDma_SimpleTransfer () ট্রান্সফার শুরু করার জন্য ডাকা হয়।

I2S অডিও

audio.c এবং audio.h যেখানে I2S আরম্ভ হয়। I2S ইনিশিয়ালাইজেশন কোড হল বেশ কয়েকটি সাধারণ কোড যা অনেক জায়গায় ভাসমান, আপনি অন্যান্য উৎস থেকে সামান্য বৈচিত্র খুঁজে পেতে পারেন কিন্তু এটি কাজ করা উচিত। এটি বেশ ভালভাবে নথিভুক্ত এবং বীণা প্রকল্পের জন্য খুব বেশি পরিবর্তন করার প্রয়োজন নেই। ডিএমএ অডিও ডেমো যা এটি থেকে এসেছে তাতে মাইক বা লাইন ইনপুটগুলিতে স্যুইচ করার ফাংশন রয়েছে যাতে আপনি যদি সেই কার্যকারিতা প্রয়োজন হয় তবে আপনি সেগুলি ব্যবহার করতে পারেন।

শব্দ সংশ্লেষণ

সাউন্ড সিনথেসিস কিভাবে কাজ করে তা বর্ণনা করার জন্য, আমি ডেভেলপমেন্টে ব্যবহৃত প্রতিটি সাউন্ড মডেলের তালিকা করতে যাচ্ছি যা চূড়ান্ত পদ্ধতির দিকে পরিচালিত করে, কারণ এটি আপনাকে কেন এটি করা হয় সেভাবে একটি ধারণা দেবে।

পদ্ধতি 1: প্রতিটি স্ট্রিং এর জন্য একটি স্ট্রিং এর মিউজিক্যাল নোটের জন্য সংশ্লিষ্ট ফ্রিকোয়েন্সি তে সাইন ভ্যালু গণনা করা হয় এবং একটি অ্যারেতে সংরক্ষণ করা হয়। উদাহরণস্বরূপ, অ্যারের দৈর্ঘ্য হবে নমুনায় সাইন ওয়েভের সময়কাল, যা # নমুনা / চক্রের সমান। যদি নমুনার হার 48kHz হয় এবং নোটের ফ্রিকোয়েন্সি 100Hz হয়, তাহলে সেখানে 48, 000 নমুনা/সেকেন্ড এবং 100 চক্র/সেকেন্ড প্রতি চক্রের 4800 টি নমুনা থাকে, এবং অ্যারের দৈর্ঘ্য 4800 নমুনা হবে এবং এতে একটি সম্পূর্ণের মান থাকবে সাইন ওয়েভ পিরিয়ড। যখন স্ট্রিংটি বাজানো হয়, অডিও নমুনা বাফারটি সাইন ওয়েভ অ্যারে থেকে একটি মান গ্রহণ করে এবং নমুনা হিসাবে অডিও বাফারের মধ্যে রেখে, তারপর সাইন ওয়েভ অ্যারেতে ইনডেক্স বৃদ্ধি করে যাতে আমাদের আগের উদাহরণটি ব্যবহার করে 4800 টি নমুনার মধ্যে একটি সাইন ওয়েভ চক্র অডিও বাফারে রাখা হয়। অ্যারে ইনডেক্সে একটি মডুলো অপারেশন ব্যবহার করা হয় যাতে এটি সর্বদা 0 এবং দৈর্ঘ্যের মধ্যে পড়ে এবং যখন অ্যারে ইনডেক্স একটি নির্দিষ্ট থ্রেশহোল্ডের উপরে চলে যায় (যেমন 2 সেকেন্ডের নমুনার মূল্য) স্ট্রিংটি বন্ধ হয়ে যায়। একই সময়ে একাধিক স্ট্রিং বাজানোর জন্য, প্রতিটি স্ট্রিং এর অ্যারে ইনডেক্স আলাদাভাবে ট্র্যাক রাখুন এবং প্রতিটি স্ট্রিং এর সাইন ওয়েভ থেকে মান যোগ করুন প্রতিটি নমুনা পেতে।

পদ্ধতি 2: আরো সঙ্গীত সুর তৈরি করার জন্য, আমরা আগের মডেল দিয়ে শুরু করি এবং প্রতিটি মৌলিক ফ্রিকোয়েন্সিতে হারমোনিক যোগ করি। হারমোনিক ফ্রিকোয়েন্সি হল ফ্রিকোয়েন্সি যা মৌলিক ফ্রিকোয়েন্সি এর পূর্ণসংখ্যা গুণক। দুটি অসম্পূর্ণ ফ্রিকোয়েন্সি একসাথে সংক্ষেপিত হওয়ার বিপরীতে, যার ফলে দুটি স্বতন্ত্র ধ্বনি একসঙ্গে বাজানো হয়, যখন হারমোনিক্স একসাথে যুক্ত করা হয় তখন এটি কেবলমাত্র একটি শব্দের মতো চলতে থাকে, কিন্তু একটি ভিন্ন সুরের সাথে। এটি সম্পন্ন করার জন্য, প্রতিবার যখন আমরা অডিও নমুনায় সাইন ওয়েভের মান (অ্যারে ইনডেক্স % অ্যারের দৈর্ঘ্য) যোগ করি, তখন আমরা (2 * অ্যারে ইনডেক্স % অ্যারের দৈর্ঘ্য), এবং (3 * অ্যারের সূচক % অ্যারের দৈর্ঘ্য) যোগ করি), এবং তাই জন্য যদিও অনেক harmonics পছন্দসই হয়। এই গুণিত সূচকগুলি ফ্রিকোয়েন্সিগুলিতে সাইন ওয়েভ অতিক্রম করবে যা মূল ফ্রিকোয়েন্সিটির পূর্ণসংখ্যা গুণক। সুরের আরো নিয়ন্ত্রণের জন্য, প্রতিটি হারমোনিকের মানগুলি একটি ভেরিয়েবল দ্বারা গুণিত হয় যা সামগ্রিক শব্দে সেই হারমোনিকের পরিমাণকে প্রতিনিধিত্ব করে। উদাহরণস্বরূপ, মৌলিক সাইন ওয়েভ এর মানগুলি 6 দ্বারা গুণিত হতে পারে যাতে এটি সামগ্রিক ধ্বনিকে আরও একটি ফ্যাক্টর করে, যখন 5 ম হারমোনিকের 1 এর গুণক থাকতে পারে, যার অর্থ সামগ্রিক শব্দে এর মান অনেক কম অবদান রাখে।

পদ্ধতি 3: ঠিক আছে, তাই এখন আমরা নোটগুলিতে খুব সুন্দর স্বর পেয়েছি, তবে এখনও একটি বেশ গুরুত্বপূর্ণ সমস্যা রয়েছে: তারা একটি নির্দিষ্ট সময়ের জন্য একটি নির্দিষ্ট ভলিউমে খেলবে। একটি বাস্তব যন্ত্রের মতো শব্দ করার জন্য বাজানো একটি স্ট্রিং এর ভলিউম সময়ের সাথে মসৃণভাবে ক্ষয় হওয়া উচিত। এটি সম্পন্ন করার জন্য, একটি অ্যারে একটি দ্রুত ক্ষয়কারী ফাংশনের মান দিয়ে ভরা হয়। এখন যখন অডিও নমুনা তৈরি করা হচ্ছে, প্রতিটি স্ট্রিং থেকে আসা শব্দটি আগের পদ্ধতির মতো গণনা করা হয় কিন্তু অডিও নমুনায় যুক্ত হওয়ার আগে এটি সূচকীয় ক্ষয় ফাংশন অ্যারেতে স্ট্রিংয়ের অ্যারে সূচকের মান দ্বারা গুণিত হয়। এটি সময়ের সাথে সাথে শব্দটি সহজেই ছড়িয়ে পড়ে। যখন অ্যারে সূচক ক্ষয় অ্যারের শেষে পৌঁছায়, স্ট্রিং বন্ধ হয়ে যায়।

পদ্ধতি 4: এই শেষ ধাপটি আসলে স্ট্রিংগুলিকে তাদের বাস্তবসম্মত স্ট্রিং শব্দ দেয়। তারা আনন্দদায়ক কিন্তু স্পষ্টভাবে সংশ্লেষিত শোনাচ্ছে আগে। একটি বাস্তব বিশ্বের বীণা স্ট্রিং ভাল অনুকরণ করার চেষ্টা করার জন্য, প্রতিটি হারমোনিকের জন্য একটি ভিন্ন ক্ষয় হার নির্ধারিত হয়। আসল স্ট্রিংগুলিতে, যখন স্ট্রিংটি প্রথমে আঘাত করা হয় সেখানে উচ্চ ফ্রিকোয়েন্সি হারমোনিক্সের একটি উচ্চ সামগ্রী থাকে যা একটি স্ট্রিং থেকে আমরা যে ধরণের প্লাকিং শব্দ আশা করি তা তৈরি করে। এই উচ্চ ফ্রিকোয়েন্সি হারমোনিকগুলি খুব সংক্ষিপ্তভাবে শব্দের মূল অংশ, স্ট্রিং এর শব্দ আঘাত করা হয়, কিন্তু ধীর হারমোনিকগুলি গ্রহণ করার সাথে সাথে তারা খুব দ্রুত ক্ষয় হয়। ধ্বনি সংশ্লেষণে ব্যবহৃত প্রতিটি হারমোনিক সংখ্যার জন্য একটি ক্ষয় অ্যারে তৈরি করা হয় যার প্রত্যেকটির নিজস্ব ক্ষয় হারের সাথে। এখন প্রতিটি হারমোনিককে স্ট্রিং এর অ্যারে ইনডেক্সে তার সংশ্লিষ্ট ক্ষয় অ্যারের মান দ্বারা স্বাধীনভাবে গুণ করা যায় এবং শব্দে যুক্ত করা যায়।

সামগ্রিকভাবে শব্দ সংশ্লেষণ স্বজ্ঞাত কিন্তু হিসাব ভারী। পুরো স্ট্রিং শব্দটি একবারে মেমরিতে সংরক্ষণ করলে খুব বেশি মেমরি লাগবে, কিন্তু প্রতিটি ফ্রেমের মধ্যে সাইন ওয়েভ এবং সূচকীয় ফাংশন গণনা করলে অডিও প্লেব্যাকের হার ধরে রাখতে অনেক বেশি সময় লাগবে। গণনার গতি বাড়ানোর জন্য কোডে বেশ কয়েকটি কৌশল ব্যবহার করা হয়। সাইন এবং সূচকীয় ক্ষয় সারণির প্রাথমিক সৃষ্টি ব্যতীত সমস্ত গণিত পূর্ণসংখ্যা বিন্যাসে করা হয়, যার জন্য 24 বিট অডিও আউটপুটে উপলব্ধ সংখ্যাসূচক স্থান ছড়িয়ে দেওয়া প্রয়োজন। উদাহরণস্বরূপ, সাইন টেবিলটি 150 এর প্রশস্ততা যাতে এটি মসৃণ কিন্তু এত বড় না যে একসঙ্গে বাজানো অনেকগুলি স্ট্রিং 24 বিটের বেশি হতে পারে। একইভাবে, সূচকীয় সারণির মানগুলি পূর্ণসংখ্যা এবং সংরক্ষণের আগে 80 দ্বারা গুণিত হয়। হারমোনিক ওজন 0 থেকে 10 এর মধ্যে বিচ্ছিন্ন মান গ্রহণ করতে পারে। এছাড়াও সমস্ত নমুনা আসলে দ্বিগুণ হয় এবং সাইন ওয়েভগুলি 2 এর দ্বারা সূচিত হয়, যা স্যাম্পলিংয়ের হারকে অর্ধেক করে দেয়। এটি সর্বাধিক ফ্রিকোয়েন্সি সীমাবদ্ধ করে যা বাজানো যেতে পারে, কিন্তু বর্তমান সংখ্যার স্ট্রিং এবং হারমোনিকের জন্য যথেষ্ট দ্রুত গণনা করা প্রয়োজন ছিল।

এই সাউন্ড মডেলটি তৈরি করা এবং এটিকে কাজে লাগানো প্রসেসর পক্ষ থেকে যথেষ্ট প্রচেষ্টা নিয়েছিল, এবং এই প্রকল্পের সময়সীমার মধ্যে স্ক্র্যাচ থেকে fpga সাইডে কাজ করা অবিশ্বাস্যভাবে কঠিন হবে সময় শব্দ পরীক্ষা করার জন্য ভেরিলগের একটি টুকরা পরিবর্তন করা হয়েছিল)। যাইহোক, এটি fpga এ করা সম্ভবত এটি করার একটি ভাল উপায় হতে পারে, সম্ভবত যথেষ্ট দ্রুত নমুনা গণনা করতে না পারার সমস্যাটি দূর করে এবং আরো স্ট্রিং, হারমোনিক্স, এবং এমনকি অডিও প্রভাব বা অন্যান্য কাজগুলি চালানোর অনুমতি দেয় প্রসেসর পাশ।

ধাপ 6: সেন্সর আপ তারের

সেন্সর আপ তারের
সেন্সর আপ তারের

স্ট্রিং তৈরির জন্য আমরা আইআর ব্রেক বিম সেন্সর ব্যবহার করেছি যা স্ট্রিং বাজানো অবস্থায় সনাক্ত করবে। আমরা নিচের লিঙ্ক থেকে আমাদের সেন্সর অর্ডার করেছি। সেন্সরগুলির একটি পাওয়ার, গ্রাউন্ড এবং ডেটা ওয়্যার থাকে যখন এমিটারে কেবল পাওয়ার এবং গ্রাউন্ড ওয়্যার থাকে। আমরা PMOD শিরোলেখ থেকে 3.3 V এবং গ্রাউন্ড পিনগুলি এমিটার এবং সেন্সর উভয়কেই পাওয়ার জন্য ব্যবহার করেছি। সমস্ত সেন্সর এবং নির্গমনকে শক্তি দেওয়ার জন্য সমস্ত সেন্সর এবং এমিটারকে সমান্তরালভাবে সংযুক্ত করা প্রয়োজন। সেন্সর থেকে ডেটা তারের প্রতিটি তাদের নিজস্ব pmod পিন যেতে হবে।

ধাপ 7: কঙ্কাল নির্মাণ

কঙ্কাল নির্মাণ
কঙ্কাল নির্মাণ

বীণার আকৃতি তৈরি করার জন্য তিনটি টুকরা সেন্সর এবং নির্গমনকারীকে কঙ্কাল হিসাবে ব্যবহার করা হয়। পিভিসি পাইপের দুটি 18 ইঞ্চি টুকরোর একটিতে সেন্সর এবং নির্গমনকারীগুলিকে একে অপরের থেকে 1.5 ইঞ্চি পর্যায়ক্রমে সারিবদ্ধ করুন এবং তারপরে তাদের পাইপে টেপ করুন। অন্য 18 ইঞ্চি পিভিসি পাইপ সেন্সর এবং emitters বিকল্প ক্রমে সারিবদ্ধ কিন্তু অর্ডার অফসেট নিশ্চিত করুন (যেমন যদি প্রথম পাইপ একটি সেন্সর আগে দ্বিতীয় দ্বিতীয় একটি emitter প্রথম এবং বিপরীত হওয়া উচিত)ডেটা, পাওয়ার এবং গ্রাউন্ড ওয়্যারগুলিতে লম্বা তারের সোল্ডার করা প্রয়োজন যাতে তারা বোর্ডে পৌঁছাতে সক্ষম হয়।

ধাপ 8: কাঠের বাহ্যিক নির্মাণ

কাঠের বাহ্যিক নির্মাণ
কাঠের বাহ্যিক নির্মাণ

এই পদক্ষেপটি alচ্ছিক কিন্তু এটি অত্যন্ত প্রস্তাবিত। কাঠের বাইরের অংশটি কেবল বীণাকে সুন্দর দেখায় না এটি সেন্সর এবং তারগুলিকে ক্ষতি থেকে রক্ষা করে। কাঠ থেকে একটি হলু আয়তক্ষেত্রাকার রিং দ্বারা কাঠের ফ্রেম তৈরি করা যেতে পারে। আয়তক্ষেত্রের ভিতরে পাইপ এবং সেন্সর কঙ্কালের জন্য কমপক্ষে 1-1/2 ইঞ্চি খোলার প্রয়োজন। একবার ফ্রেমটি তৈরি হয়ে গেলে দুটি গর্ত ড্রিল করুন যা সেন্সর এবং নির্গমনকারী থেকে তারগুলিকে বোর্ডের সাথে সংযুক্ত করার অনুমতি দেবে।

*দ্রষ্টব্য: মেরামতের প্রয়োজন হলে বা সামান্য সমন্বয় করার প্রয়োজন হলে পাইপ কঙ্কাল অপসারণ এবং সন্নিবেশ করতে সক্ষম হওয়ার জন্য অ্যাক্সেস পয়েন্ট যুক্ত করার সুপারিশ করা হয়।

ধাপ 9: সব টুকরা একসাথে রাখা

সব টুকরা একসাথে রাখা
সব টুকরা একসাথে রাখা

আগের সব ধাপ শেষ হয়ে গেলে বীণা তৈরির সময়। প্রথমে কাঠের বাইরের ভিতরে পাইপের কঙ্কাল রাখুন। তারপর সেন্সর এবং emitters জন্য তারের প্লাগ বোর্ডে সঠিক অবস্থানে। তারপরে SDK খুলুন এবং বোর্ড প্রোগ্রাম করার জন্য ডিবাগ বোতামটি ক্লিক করুন। একবার বোর্ডে প্রোগ্রাম করা হলে একজোড়া হেডফোন বা স্পিকারে প্লাগ লাগান। কোন সেন্সরটি শেষ হয় তার উপর নির্ভর করে কোন pmod পোর্টে আপনার বীণার স্ট্রিংগুলি সম্ভবত শুরু হওয়ার বাইরে থাকবে। যেহেতু অনেকগুলি তারের সাথে যুক্ত হলে কোন তারটি কোন সেন্সরে যায় তা বলা কঠিন হতে পারে, আমরা সফ্টওয়্যারে বিট পজিশনকে ব্যাহত করার জন্য স্ট্রিং নম্বরগুলি ম্যাপ করার একটি উপায় অন্তর্ভুক্ত করেছি। "স্ট্যাটিক ইন্ট সেন্সর_ম্যাপ [NUM_STRINGS]" খুঁজুন এবং স্ট্রিংগুলি সর্বনিম্ন থেকে সর্বোচ্চ ক্রম পর্যন্ত বাজানো পর্যন্ত অ্যারের মানগুলি সামঞ্জস্য করুন।

সিরিয়াল টার্মিনাল (উদা Real রিয়েলটার্ম) খোলার মাধ্যমে মেনু ব্যবহার করা যেতে পারে এবং বড রেট 115200 এবং ডিসপ্লে এএনএসআইতে সেট করা যেতে পারে। মেনুতে w এবং s কী ব্যবহার করে উপরে ও নিচে এবং a এবং d কী ব্যবহার করে মান পরিবর্তন করা যায়।

ধাপ 10: রক আউট

একবার বীণা পুরোপুরি কাজ করে। বীণা আয়ত্ত করুন এবং আপনার নিজের সংগীতের মিষ্টি শব্দ শুনুন!

প্রস্তাবিত: