ریمیکس آهنگ خونه مادربزرگه با برنامهنویسی
تا حالا به این فکر کردی که کامپیوترها صدا را چگونه درک و تعریف میکنند؟ ♪ ♫
هر تصویری را با رنگهای زیادی که در کنار هم قرار میگیرند نشان میدهند. هر رنگ با یک عدد نشان داده و ذخیره میشه. صدا را هم میتوان با اعداد نشان داد و ذخیره کرد. هر آهنگی که به آن گوش میدهیم، مجموعهای از این اعداد است که به ترتیب پخش میشوند. در پایتون این میشه یک لیست. به این لیست از این به بعد سیگنال میگوییم.
اما صدا یک تفاوت با تصویر داره؛ در یک آهنگ علاوه بر لیست اعداد، زمان هم مهم هست. برای همین یک پارامتر اضافه هم داره که میگه در هر ثانیه چنتا از اعداد پخش بشوند. به این پارامتر، فرکانس نمونهبرداری گفته میشه. برای مثال، اگر فرکانس ۱۰ باشه یعنی اینکه در ثانیه اول ۱۰ عدد اول لیست به ترتیب پخش بشوند.
در این خواندنی میخواهیم که با تغییر و ترکیب این لیستهای از اعداد، یک نمونه جدید از یک آهنگ بسازیم.
آمادهسازی محیط
این خواندنی با استفاده از ماژولهای معروف numpy و scipy در محیط پایتون ۲.۷ انجام میشه.
در پایلیباکس
در پایلیباکس تنها کاری که باید انجام بدی اینه که Terminal را از روی دسکتاپ باز کنی و دو دستور زیر را تایپ و اجرا کنی:
1 |
pip install numpy |
1 |
pip install scipy |
در ویندوز
اگر پایتون ۲.۷ روی کامپیوترت نصب نیست، از اینجا دانلودش کن. بعد از نصب، به مرحله اول این خواندنی مراجعه و با دستورالعملی که اونجا هست اول ماژول numpy و بعد ماژول scipy را نصب کن.
اگر کامپیوترت نتونست ماژولها را خودش دانلود کنه، میتونی از اینجا مستقیما دانلود کنی و بعدش با دستور زیر نصبشون کنی:
1 |
pip install C:\\Users\Ali\numpy-1.13.3-cp27-none-win_amd64.whl |
1 |
pip install C:\\Users\Ali\scipy-1.0.0-cp27-none-win_amd64.whl |
آدرس را به آدرس فایلهای ماژول در کامپیوتر خودت تغییر بده.
دانلود فایلهای صدا
از اینجا دانلود و unzip کن. در این فولدر سه فایل صدا هست: آهنگ خونه مادربزرگه، صدای بارون، و صدای کلاغ. 🎼
یک فولدر جدید خالی به اسم PylieStudio بساز و هر سهتا فایل را درش کپی کن.
فایلها را اجرا کن تا صداشون را بشنوی. در پایلیباکس میتونی روش راست-کلیک کنی و از نرمافزار Audacious که از پیش نصب شده استفاده کنی.
وارد کردن ماژولها
یک فایل پایتون جدید با اسم remix.py در فولدر PylieStudio بساز. مثلا با استفاده از پایچارم.
در این برنامه از ۳ ماژول استفاده میکنیم:
os: برای گرفتن مسیر فایل ها
numpy: وصلکردن سیگنالها به هم
scipy.io: برای خواندن و نوشتن فایلهای صوتی
از ماژول دوم و سوم فقط دو دستورشون رو نیاز داریم که در دو خط زیر وارد می کنیم:
1 2 3 4 5 |
# Pylie Music Studio
from numpy import concatenate
from scipy.io import wavfile import os |
گرفتن مسیر فایل های صوتی
1 |
dir_path = os.path.dirname(os.path.realpath(__file__)) |
در خط بالا از دستور path از ماژول os استفاده کردیم. این خط از کد، مسیر فولدری که فایل پایتونی که این خط در اون اجرا شده رو در متغیر dir_path قرار میده. dir مخفف دایرکتوری و path به معنای مسیر است.
1 2 3 |
path_crow = dir_path + "/crow.wav"
path_granny = dir_path + "/granny.wav"
path_rain = dir_path + "/rain.wav" |
تمام فایلهای صوتی در داخل فولدری قرار دارند که فایل پایتون هم قرار دارد. پس تنها کاری که برای گرفتن مسیر بقیه فایل ها نیاز داریم این هست که مسیر دایرکتوری فایل پایتونی رو که قبل بدست آوردیم (dir_path) رو به نام فایلی که میخواهیم اضافه کنیم. این سه خط بالا مسیر فایل های صوتی کلاغ (crow)، خونه مادربزرگه (granny) وباران (rain) را به متغیرهایشان میدهند.
خواندن و تبدیل فایلهای صوتی به لیست
1 2 3 |
frequency_crow, signal_crow = wavfile.read(path_crow) frequency_granny, signal_granny = wavfile.read(path_granny) frequency_rain, signal_rain = wavfile.read(path_rain) |
اولین خط بالا frequency فایل crow.wav را به متغیر frequency_crow و لیست را به متغیر signal_crow میدهد.
تابع تکرار یک قطعه آهنگ
1 2 3 4 5 |
def repetition(signal, n):
signal_repeated = signal
for i in range(n-1):
signal_repeated = concatenate([signal_repeated, signal])
return signal_repeated |
بعد یک سیگنال جدید که n بار تکرار سیگنال ورودی هست را میسازد و برمیگرداند. این کار در حلقه به n منهای ۱ (زیرا اگر بخواهیم ۲ بار قطعه تکرار شود فقط یکبار لازم است این قطعه را به خودش وصل کنیم) انجام میدهد. وصلکردن با دستور concatenate انجام میشود.
تکرار صدای کلاغ
1 |
signal_crow_repeat = repetition(signal_crow, 3) |
رویهمگذاری آهنگ و صدای باران
1 2 3 |
signal_rain_cut = signal_rain[:len(signal_granny)] signal_rain_cut_soft = signal_rain_cut / 3 signal_granny_rain = signal_granny + signal_rain_cut_soft |
برای اینکار باید هر عدد در سیگنال آهنگ را با عدد متناظرش در سیگنال باران جمع کنیم. چون سیگنال باران طولانیتر هست، ابتدا در خط اول به اندازه طول آهنگ از باران جدا میکنیم و در signal_rain_cut ذخیره میکنیم. از دستور len هم برای گرفتن طول سیگنال آهنگ استفاده کردیم.
چون صدای باران در زمینه میخواهیم باشه، اون را تقسیم بر ۳ میکنیم که صداش آهستهتر باشه.
در خط سوم هم سیگنال آهنگ را با سیگنال کوتاه و آهستهشده باران جمع میکنیم.
اتصال صدای کلاغ
1 |
signal_remix = concatenate([signal_crow_repeat, signal_granny_rain]) |
تبدیل لیست به فایل صوتی
1 2 |
path_remix = dir_path + "/myremix.wav" wavfile.write(path_remix, frequency_granny, signal_remix) |
همه برنامه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# Pylie Music Studio from numpy import concatenate from scipy.io import wavfile import os # Get path to the my directory ... dir_path = os.path.dirname(os.path.realpath(__file__)) # Set path for audio files ... path_crow = dir_path + "/crow.wav" path_granny = dir_path + "/granny.wav" path_rain = dir_path + "/rain.wav" # Read audio files ... frequency_crow, signal_crow = wavfile.read(path_crow) frequency_granny, signal_granny = wavfile.read(path_granny) frequency_rain, signal_rain = wavfile.read(path_rain) # Function for repeating a signal for n times def repetition(signal, n): signal_repeated = signal for i in range(n-1): signal_repeated = concatenate([signal_repeated, signal]) return signal_repeated # Repeat crow signal for 3 times signal_crow_repeat = repetition(signal_crow, 3) # Overlay granny and rain signals signal_rain_cut = signal_rain[:len(signal_granny)] signal_rain_cut_soft = signal_rain_cut / 3 signal_granny_rain = signal_granny + signal_rain_cut_soft # Join all signal_remix = concatenate([signal_crow_repeat, signal_granny_rain]) # Write path_remix = dir_path + "/myremix.wav" wavfile.write(path_remix, frequency_granny, signal_remix) |
کارهای پیشرفتهتر
با توسعه این برنامه و استفاده از فایلهای صوتی دیگه میتونی ریمیکسهای خیلی جالب دیگری هم حالا خودت درست کنی.
با یک مقدار برنامهنویسی پیشرفتهتر و ریاضیات حتی میتونی صداسازی هم انجام بدی. مثلا برنامه زیر صدای بیپ را با استفاده از توابع مثلثاتی میسازد. اینجا دیگه وارد جزییاتش نمیشویم اما خودت میتونی بیشتر دربارهاش مطالعه کنی.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Pylie Music Studio from scipy.io import wavfile import os import numpy as np # Generate signal frequency = 44100 duration = 1 sine_frq = 1000 sine_wave = np.sin(np.linspace(start=0, stop=sine_frq * 2*np.pi * duration, num=frequency*duration)) # Write dir_path = os.path.dirname(os.path.realpath(__file__)) path_remix = dir_path + "/mysound.wav" wavfile.write(path_remix, frequency, sine_wave) |
پایلی را میتوانید در تلگرام و اینستاگرام دنبال کنید.
نظرات
adelniya_m
سلام
ممنون از آموزش عالی تون
من برنامه رو در Pycharm نوشتم اما هر کاری می کنم اجرا نمیشه و فقط پیام میده Process finished with exit code 0 و تموم. باید چیکار کنم؟
Admin
سلام
اگر بدون خطا برنامه اجرا شده است، یک فایل صوتی جدید باید در فولدر خود برنامه ساخته شده باشد.
myremix.wav
mysound.wav
qwe123
عالی بود!
اما من همین کد هارو نوشتم اما اجرا نکرد!