PDA

View Full Version : تولید صدا با فرکانسهای مختلف



sh_roohani
شنبه 26 آذر 1384, 13:17 عصر
سلام،
من دنبال مجموعه ای از توابع در Windows می گردم که بتونم با اونا صدایی رو با فرکانس دلخواه تولید کنم و به خروجی کارت صدا بفرستم. مثلا می دونید با خانواده توابع mixer می شه دامنه صدا رو دستکاری کرد و این دامنه هم روی همه صداهایی که از این به بعد تولید می شن اعمال می شه. اما چیزی که من می خوام تابع یا توابعیه که بتونم مثلا یه صدای 20kHz رو روی خروجی speaker کارت صدا تولید کنم (و تاکید می کنم که نمی خوام این صدا رو با استفاده از speaker داخلی کامپیوتر تولید کنم).
البته پیش از اینکه این پست رو بفرستم توی سایت جستجو کردم، چند تایی سوالات مشابه بود که همه به تابع Beep یا کتابخانه OpenAL منتهی می شد، که اگه چاره ای جز این دوتا نداشته باشم، دومی رو ترجیح می دم. اما پیش از اینکه بخوام برم سراغ OpenAL، می خوام مطمئن بشم که توی Windows راه بهتری وجود نداره.
مثلا من هیچ تجربه ای به DirectSound ندارم. کسی می دونه که آیا می شه از اون واسه این کار استفاده کرد؟
در ضمن این تابع Beep ظاهرا یه پارامتر زمان می گیره و صدا رو به همون مدت تولید می کنه. در حالیکه چیزی که مد نظر منه اینه که بشه با زدن یه کلید تولید صدا رو شروع کرد (و احتمالا به صورت پویا فرکانس اونو تغییر داد، یعنی بدون قطع کردن صدا) و با زدن یه کلید هم صدا رو قطع کرد.
ممنون می شم اگه راهنمایی کنین.

Blaster
یک شنبه 27 آذر 1384, 17:35 عصر
سلام،
من دو سال پیش کمی با DirectSound کار کردم ، ولی فقط در حد پخش کردن Wav .
اما با توجه به اینکه در DirectSound ، بافرهایی وجود داره که صدا در اونها نگهداری میشن و البته امکان دسترسی به اطلاعات بافرها هم وجود داره! این احتمال هست که بتونید صدا رو دستکاری و یا effect هایی رو به اون اضافه کنید !

sh_roohani
یک شنبه 27 آذر 1384, 17:43 عصر
سلام Blaster جان،
ممنون که همیشه به دادم می رسی. من یه چیزی با توابع wave form پیدا کردم. یه Sample که مورس تولید می کنه. توی توضیحاتش نوشته که این Sample نحوه دستکاری فرکانس رو نشون می ده. فکر می کنم از Code Project پیداش کردم. البته امشب تازه می خوام روش کار کنم.
حالا یه سوال دیگه برام پیش اومده. می دونی توی خانواده توابع mixer اون مقداری که برای صدا می گیریم بر حسب دسی بل هست یا چیز دیگه ای؟

seyedof
یک شنبه 27 آذر 1384, 19:29 عصر
سلام
Beep رو فراموش کنید. با دایرکت ساند میشه اما خب راه خیلی ساده تری هم داره. با خود API توابعی داره که با waveOut شروع میشن. کار آسونیه. اینها هم یک بافر دارن که اشاره گر به اوون رو پخش میکنند. شما میتونید توی این اشاره گر مقادیر sample های صوت رو خودتون بریزید مثلا یه موج سینوسی... خیلی هم کامله. توابع میکسر بیشتر برای تنظیم ولوم است. اینکه دسی بل میده یا نه رو نمیدونم ولی میدونم که لگاریتمیکه معمولا و خطی نیست.
شما هم چه چیزای عجیبی میخواهید :) چکار میکنید؟

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

sh_roohani
یک شنبه 27 آذر 1384, 19:36 عصر
سلام،
به گمانم حد بالای شنوایی یه انسان معمولی همون 20kHz باشه. درست می گم؟
من شغلم برنامه نویسی سیستم های صوتی و تصویریه. مثل هر بخش دیگه ای تو کار برنامه نویسی گاهی کارا خوب پیش می ره. گاهی هم گیرای عجیب غریبی پیش میاد. واسه همینم هست که من از این چیزای عجیب می پرسم :)
پس اگه لگاریتمیه، احتمالا باید دسیبل باشه. چون gain صدا با یه تابع لگاریتمی به دسیبل تبدیل می شه.
در ضمن من اصلا تو فکر خروجی موج نیستم، یعنی فعلا :)

ممنون.