آموزش تولید صدا بدون تداخل PWM و کنترل MIDI در آردوینو

آردوینو54
10 بازدید
۱۴۰۵-۰۴-۱۶
5 دقیقه
  • نویسنده: محمد کبیر
  • درباره نویسنده: ---

در آموزش های قبلی آموزش آردوینو به تولید صدا با آردوینو، تولید تن و پخش ملودی با استفاده از تابع tone پرداختیم. در این قسمت قصد داریم در مورد تولید تن‌های صوتی بدون تداخل با PWM و کنترل MIDI صحبت کنیم.

تولید تن‌های صوتی بدون تداخل با PWM

فرض کنید می‌خواهید از طریق یک بلندگو یا مبدل صوتی دیگر صدا تولید کنید و باید به‌جای استفاده از یک timer، تن را به‌صورت نرم‌افزاری تولید کنید؛ برای مثال، زمانی که لازم است از تابع analogWrite روی پایه 3 یا 11 استفاده کنید.

تابع tone که در بخش‌های قبلی توضیح داده شد، استفاده آسانی دارد، اما به یک timer سخت‌افزاری نیاز دارد که ممکن است برای کارهای دیگری مانند analogWrite لازم باشد. کد زیر از timer استفاده نمی‌کند، اما تا زمانی که نت پخش می‌شود نمی‌تواند کار دیگری انجام دهد. برخلاف تابع tone آردوینو، تابع playTone که در اینجا توضیح داده شده مسدودکننده است؛ یعنی تا زمانی که پخش نت تمام نشود، بازنمی‌گردد.

این sketch شش نت را پخش می‌کند که هرکدام فرکانسی دو برابر یا یک اکتاو بالاتر از نت قبلی دارند. تابع playTone یک تن را برای مدت‌زمان مشخص روی یک بلندگو یا مبدل Piezo که به یک پایه خروجی دیجیتال و زمین متصل است تولید می‌کند؛ شکل 1 را ببینید:

شکل( 1 ) اتصالات بلندگو و LED

شکل1 – اتصالات بلندگو و LED

تابع playTone از دو مقدار period و duration استفاده می‌کند. متغیر period زمان لازم برای پخش یک چرخه از تن را مشخص می‌کند. بلندگو به مدت تعداد میکروثانیه‌ای که period مشخص می‌کند، ابتدا High و سپس Low پالس می‌شود. حلقه for این پالس‌ها را به تعداد میلی‌ثانیه‌هایی که در آرگومان duration مشخص شده است تکرار می‌کند.

اگر ترجیح می‌دهید به‌جای period با فرکانس کار کنید، می‌توانید از رابطه معکوس بین فرکانس و period استفاده کنید؛ period برابر است با 1 تقسیم بر فرکانس.

مقدار period باید بر حسب میکروثانیه باشد؛ از آنجا که در یک ثانیه 1 میلیون میکروثانیه وجود دارد، period به شکل 1000000L / frequency محاسبه می‌شود. حرف L در انتهای این عدد به کامپایلر اعلام می‌کند که محاسبه را با اعداد صحیح long انجام دهد تا مقدار محاسبه از محدوده یک عدد صحیح معمولی فراتر نرود؛ توضیح اعداد صحیح long را در بخش 2.2 ببینید:

شاید برای شما مفید باشد:
include# در آردوینو

باقی کد همان کد تابع playTone است:

کد این بخش تا زمانی که پخش یک تن کامل نشود متوقف می‌ماند و نمی‌تواند پردازش دیگری انجام دهد. با قرار دادن کد تولید صدا در یک interrupt handler می‌توان صدا را در پس‌زمینه، بدون انتظار برای پایان پخش صدا، تولید کرد. کد منبع تابع tone که همراه با Arduino ارائه می‌شود نشان می‌دهد که این کار چگونه انجام می‌شود.

کنترل MIDI

فرض کنید می‌خواهید یک synthesizer MIDI را با استفاده از Arduino به پخش موسیقی وادار کنید.

برای اتصال به یک دستگاه MIDI به یک فیش یا سوکت DIN پنج‌پین نیاز دارید. اگر از سوکت استفاده می‌کنید، برای اتصال آن به دستگاه به یک کابل نیز نیاز خواهید داشت. کانکتور MIDI را با استفاده از یک مقاومت 220 اهم و مطابق شکل 2 به Arduino متصل کنید.

شکل ( 2 ) اتصالات MIDI

شکل2- اتصالات MIDI

برای آپلود کد روی Arduino باید دستگاه MIDI را قطع کنید، زیرا ممکن است در روند آپلود اختلال ایجاد کند. پس از آپلود اسکچ، یک دستگاه صوتی MIDI را به خروجی Arduino متصل کنید. هر بار که کلید متصل به پایه 2 را فشار دهید، یک گام موسیقی پخش می‌شود:

این اسکچ از پایه TX سریال برای ارسال اطلاعات MIDI استفاده می‌کند. مدار متصل به پایه 1 ممکن است هنگام آپلود کد روی برد تداخل ایجاد کند. هنگام آپلود، سیم متصل به پایه 1 را جدا کنید و پس از پایان آپلود دوباره آن را وصل کنید.

MIDI در ابتدا برای اتصال سازهای موسیقی دیجیتال به یکدیگر استفاده می‌شد تا یک ساز بتواند ساز دیگر را کنترل کند. مشخصات MIDI اتصالات الکتریکی و پیام‌هایی را که باید ارسال کنید توصیف می‌کند.

MIDI درواقع یک اتصال سریال با سرعت غیراستاندارد 31,250 baud است؛ بنابراین Arduino می‌تواند با استفاده از سخت‌افزار پورت سریال خود و پایه‌های 0 و 1، پیام‌های MIDI را ارسال و دریافت کند. از آنجا که پورت سریال توسط پیام‌های MIDI اشغال شده است، نمی‌توانید پیام‌ها را در Serial Monitor چاپ کنید؛ بنابراین اسکچ هر بار که یک نت ارسال می‌کند LED داخلی را روشن می‌کند.

هر پیام MIDI دست‌کم از یک بایت تشکیل شده است. این بایت مشخص می‌کند چه کاری باید انجام شود. برخی فرمان‌ها به اطلاعات دیگری نیاز ندارند، اما بعضی فرمان‌ها برای معنی‌دار شدن به داده نیاز دارند. پیام این اسکچ note on است که به دو بخش اطلاعات نیاز دارد: اینکه کدام نت باید پخش شود و صدا با چه بلندی نواخته شود. هر دو مقدار در بازه صفر تا 127 قرار دارند.

شاید برای شما مفید باشد:
آموزش راه‌اندازی سروو موتور (Servo) با آردوینو + کدهای عملی

sketch پورت سریال را با سرعت 31,250 baud مقداردهی اولیه می‌کند؛ سایر کدهای مخصوص MIDI در تابع playMidiNote قرار دارند:

این تابع سه پارامتر می‌گیرد و با استفاده از اطلاعات channel، اولین بایتی را که باید ارسال شود محاسبه می‌کند.

اطلاعات MIDI در کانال‌های مختلف از 1 تا 16 ارسال می‌شوند. هر کانال می‌تواند روی یک ساز متفاوت تنظیم شود، بنابراین می‌توان موسیقی چندکاناله پخش کرد. فرمان note on برای پخش صدا ترکیبی از 0x90، یعنی چهار بیت بالایی b1001، است که چهار بیت پایینی آن با اعداد بین b0000 تا b1111 تنظیم می‌شوند تا کانال‌های MIDI را مشخص کنند. این بایت برای نمایش کانال‌های 1 تا 16 از مقادیر 0 تا 15 استفاده می‌کند، بنابراین ابتدا 1 از شماره کانال کم می‌شود.

سپس مقدار نت و بلندی صدا ارسال می‌شود. بلندی صدا در MIDI با نام velocity شناخته می‌شود، زیرا در ابتدا به سرعت حرکت کلید روی صفحه‌کلید مربوط بود.

دستورهای Serial.write مشخص می‌کنند که مقادیر باید به‌صورت بایت، نه مقدار ASCII، ارسال شوند. از println استفاده نمی‌شود، زیرا نویسه بازگشت خط بایت‌های اضافی و ناخواسته‌ای به سیگنال اضافه می‌کند.

صدا با ارسال پیامی مشابه، اما با مقدار velocity برابر با 0، خاموش می‌شود.

این بخش با دستگاه‌های MIDI دارای کانکتور MIDI in از نوع DIN پنج‌پین کار می‌کند. اگر دستگاه MIDI شما تنها یک کانکتور USB دارد، این روش کار نخواهد کرد. این روش بدون سخت‌افزار اضافی، مانند یک مبدل MIDI-to-USB، امکان کنترل برنامه‌های موسیقی MIDI در حال اجرا روی رایانه را توسط Arduino فراهم نمی‌کند. با اینکه Arduino یک کانکتور USB دارد، رایانه آن را به‌عنوان یک دستگاه سریال شناسایی می‌کند، نه یک دستگاه MIDI.

اطلاعات
10
0
0
اشتراک و حمایت
profile نویسنده: محمد کبیر متخصص الکترونیک

ویراستار: حسین زنجانی زاده
مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله