Granny Cover صدا

ریمیکس آهنگ خونه مادربزرگه با برنامه‌نویسی

تا حالا به این فکر کردی که کامپیوترها صدا را چگونه درک و تعریف می‌کنند؟  ♪ ♫

هر تصویری را با رنگ‌های زیادی که در کنار هم قرار می‌گیرند نشان می‌دهند. هر رنگ با یک عدد نشان داده و ذخیره میشه. صدا را هم می‌توان با اعداد نشان داد و ذخیره کرد. هر آهنگی که به آن گوش می‌دهیم، مجموعه‌ای از این اعداد است که به ترتیب پخش می‌شوند. در پایتون این میشه یک لیست. به این لیست از این به بعد سیگنال می‌گوییم.

sound-wave

اما صدا یک تفاوت با تصویر داره؛ در یک آهنگ علاوه بر لیست اعداد، زمان هم مهم هست. برای همین یک پارامتر اضافه هم داره که میگه در هر ثانیه چنتا از اعداد پخش بشوند. به این پارامتر، فرکانس نمونه‌برداری گفته میشه. برای مثال، اگر فرکانس ۱۰ باشه یعنی اینکه در ثانیه اول ۱۰ عدد اول لیست به ترتیب پخش بشوند.

در این خواندنی می‌خواهیم که با تغییر و ترکیب این لیست‌های از اعداد، یک نمونه جدید از یک آهنگ بسازیم.

آماده‌سازی محیط

این خواندنی با استفاده از ماژول‌های معروف numpy و scipy در محیط پایتون ۲.۷ انجام میشه.

در پایلی‌باکس

در پایلی‌باکس تنها کاری که باید انجام بدی اینه که Terminal را از روی دسکتاپ باز کنی و دو دستور زیر را تایپ و اجرا کنی:

در ویندوز

اگر پایتون ۲.۷ روی کامپیوترت نصب نیست، از اینجا دانلودش کن. بعد از نصب، به مرحله اول این خواندنی مراجعه و با دستورالعملی که اونجا هست اول ماژول‌ numpy و بعد ماژول scipy را نصب کن.

اگر کامپیوترت نتونست ماژول‌ها را خودش دانلود کنه، میتونی از اینجا مستقیما دانلود کنی و بعدش با دستور زیر نصبشون کنی:

آدرس را به آدرس فایل‌های ماژول در کامپیوتر خودت تغییر بده.

دانلود فایل‌های صدا

از اینجا دانلود و unzip کن. در این فولدر سه فایل صدا هست: آهنگ خونه مادربزرگه، صدای بارون، و صدای کلاغ. 🎼

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

فایل‌ها را اجرا کن تا صداشون را بشنوی. در پایلی‌باکس می‌تونی روش راست-کلیک کنی و از نرم‌افزار Audacious که از پیش نصب شده استفاده کنی.

وارد کردن ماژول‌ها

یک فایل پایتون جدید با اسم remix.py در فولدر PylieStudio بساز. مثلا با استفاده از پایچارم.

در این برنامه از ۳ ماژول استفاده می‌کنیم:
os: برای گرفتن مسیر فایل ها
numpy: وصل‌کردن سیگنال‌ها به هم
scipy.io: برای خواندن و نوشتن فایل‌های صوتی
از ماژول دوم و سوم فقط دو دستورشون رو نیاز داریم که در دو خط زیر وارد می کنیم:

گرفتن مسیر فایل ‌های صوتی

در خط بالا از دستور path از ماژول os استفاده کردیم. این خط از کد، مسیر فولدری که فایل پایتونی که این خط در اون اجرا شده رو در متغیر dir_path قرار میده. dir مخفف دایرکتوری و path به معنای مسیر است.

تمام فایل‌های صوتی در داخل فولدری قرار دارند که فایل پایتون هم قرار دارد. پس تنها کاری که برای گرفتن مسیر بقیه فایل ها نیاز داریم این هست که مسیر دایرکتوری فایل پایتونی رو که قبل بدست آوردیم (dir_path) رو به نام فایلی که میخواهیم اضافه کنیم. این سه خط بالا مسیر فایل های صوتی کلاغ (crow)، خونه مادربزرگه (granny) وباران (rain) را به متغیرهایشان می‌دهند.

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

دستور read از wavfile فایل‌های صوتی را می‌خواند و آنها را به یک لیست تبدیل می‌کند. این دستور  فرکانس را هم می‌دهد.
اولین خط بالا frequency فایل crow.wav را به متغیر frequency_crow و لیست را به متغیر signal_crow می‌دهد.

تابع تکرار یک قطعه آهنگ

تابع بالا یک سیگنال و تعداد تکرار (n) را می‌گیرد.
بعد یک سیگنال جدید که n بار تکرار سیگنال ورودی هست را می‌سازد و بر‌می‌گرداند. این کار در حلقه به n منهای ۱ (زیرا اگر بخواهیم ۲ بار قطعه تکرار شود فقط یکبار لازم است این قطعه را به خودش وصل کنیم) انجام می‌دهد. وصل‌کردن با دستور concatenate انجام می‌شود.

تکرار صدای کلاغ

با استفاده از تابعی که در قسمت قبل نوشتیم، صدای کلاغ را ۳ بار تکرار می‌کنیم و آن را در متغیر جدید signal_crow_repeat ذخیره می‌کنیم.

روی‌هم‌گذاری آهنگ و صدای باران

می‌خواهیم صدای باران رو به پس‌زمینه آهنگ اضافه کنیم. اینطور آهنگ به همراه صدای باران در زمینه پخش میشه.

برای اینکار باید هر عدد در سیگنال آهنگ را با عدد متناظرش در سیگنال باران جمع کنیم. چون سیگنال باران طولانی‌تر هست، ابتدا در خط اول به اندازه طول آهنگ از باران جدا می‌کنیم و در signal_rain_cut ذخیره می‌کنیم. از دستور len هم برای گرفتن طول سیگنال آهنگ استفاده کردیم.

چون صدای باران در زمینه می‌خواهیم باشه، اون را تقسیم بر ۳ می‌کنیم که صداش آهسته‌تر باشه.

در خط سوم هم سیگنال آهنگ را با سیگنال کوتاه و آهسته‌شده باران جمع می‌کنیم.

اتصال صدای کلاغ

از دستور concatenate دوباره استفاده می‌کنیم و صدای تکرارشده کلاغ را به اول ترکیب صدای آهنگ و باران اضافه می‌کنیم. لیست جدید را در متغیر signal_remix ذخیره می‌کنیم.

تبدیل لیست به فایل صوتی

دستور write از wavfile یک لیست را به یک فایل صوتی تبدیل و ذخیره می‌کند. خط بالا لیست signal_remix را در مسیر path_remix و با فرکانس اصلی آهنگ به فایل صوتی تبدیل می‌کند. حالا می‌تونی اجراش کنی تا ریمیکس نهایی را بشنوی.

همه برنامه

کارهای پیشرفته‌تر

با توسعه این برنامه و استفاده از فایل‌های صوتی دیگه می‌تونی ریمیکس‌های خیلی جالب‌ دیگری هم حالا خودت درست کنی.

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


پایلی را می‌توانید در تلگرام و اینستاگرام دنبال کنید.

نظرات

  • adelniya_m

    سلام
    ممنون از آموزش عالی تون
    من برنامه رو در Pycharm نوشتم اما هر کاری می کنم اجرا نمیشه و فقط پیام میده Process finished with exit code 0 و تموم. باید چیکار کنم؟

    • Admin

      سلام
      اگر بدون خطا برنامه اجرا شده است، یک فایل صوتی جدید باید در فولدر خود برنامه ساخته شده باشد.
      myremix.wav
      mysound.wav

  • qwe123

    عالی بود!
    اما من همین کد هارو نوشتم اما اجرا نکرد!