Страница: 1 |
Страница: 1 |
Вопрос: Работа со звуком
Добавлено: 09.10.06 21:59
Автор вопроса: RNB-X
Как определить частоту сигнала подаваемого на вход звуковой карты? И наоборот - как подать на выход звуковой карты сигнал определённой частоты! Буду очень благодарен за дельные советы!
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 09.10.06 23:35
Direct Sound все это умеет.
Примеры в SDK. Скачать можно с сайта MS.
Номер ответа: 2
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #2
Добавлено: 10.10.06 18:49
Создание звука с определенной частотой:
#include <iostream>
#include <cstdio>
#include <cmath>
#pragma comment (lib, "winmm.lib"
using namespace std;
#ifndef ANY_SIZE
#define ANY_SIZE 1
#endif
#define FOURCC(x) ((x[0] + (x[1] << 8) + (x[2] << 16) + (x[3] << 24)))
#define PI 3.14159265358979323
struct WAVEDATA {
DWORD dID; // "data"
DWORD dLen; // Length of data in the dData field
BYTE dData[ANY_SIZE]; // The actual waveform data
};
struct WAVE {
DWORD wID; // "WAVE"
// Format
DWORD fID; // "fmt "
DWORD fLen; // Length of data in the format chunk
WORD wFormatTag; // format type
WORD nChannels; // number of channels (i.e. mono, stereo, etc.)
 WORD nSamplesPerSec; // sample rate
 WORD nAvgBytesPerSec; // for buffer estimation
WORD nBlockAlign; // block size of data
WORD FormatSpecific; // Format specific data area
// Data
WAVEDATA wd;
};
struct RIFF {
DWORD rID; // "RIFF"
DWORD rLen; // The length of the data in the next chunk
WAVE rData; // The data chunk
};
int main(){
// Одна секунда звука 440 Hz, частота дискретизации 11025 Hz, 8-битный, несжатый
int freq = 440;
int discr = 11025;
int bits = 8;
int t = 2;
// Генерим звук
double currtime, ampl;
int a;
int datalen = t * discr * bits / 8;
BYTE *data = new BYTE [datalen];
for(int i = 0; i < t * discr; i++){
currtime = (double)i / (double)discr;
// Вычисление амплитуды
ampl = sin(currtime * freq * 2 * PI);
// Нормализация и запись
switch(bits){
case 8:
a = (int)((ampl + 1) / 2 * 255);
data[i] = a;
break;
case 16:
a = (int)(ampl * (2^15 - 1));
data[i*2] = a % 256;
data[i*2+1] = a / 256;
break;
}
}
RIFF riff;
riff.rID = FOURCC("RIFF"
riff.rLen = sizeof(WAVE) - 1 + datalen;
riff.rData.wID = FOURCC("WAVE"
riff.rData.fID = FOURCC("fmt "
riff.rData.nBlockAlign = bits / 8;
riff.rData.nChannels = 1;
riff.rData.nSamplesPerSec = discr;
riff.rData.FormatSpecific = 8; // hz
riff.rData.fLen = 16;
riff.rData.wFormatTag = 1;
riff.rData.nAvgBytesPerSec = discr * bits / 8;
riff.rData.wd.dID = FOURCC("data"
riff.rData.wd.dLen = datalen;
BYTE *image = new BYTE [sizeof(RIFF) - 1 + datalen];
CopyMemory((void *)image, (const void *)&riff, sizeof(RIFF) - 1);
CopyMemory((void *)&image[sizeof(RIFF) - 1], (const void *)data, datalen);
PlaySound((LPCTSTR)image, NULL, SND_MEMORY);
delete [] image;
delete [] data;
return 0;
}
Определение частоты поступающего сигнала основано на быстром преобразовании Фурье (БПФ aka FFT), получаешь сигнал, раскладываешь в спектр и ищешь частотный максимум.
Номер ответа: 3
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #3
Добавлено: 15.10.06 11:56
О ужос! ЭТО ЖЕ C++!
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 15.10.06 16:16
Это не ужас, а единственный нормальный язык программирования, избавленный от костылей Java и детских побрякушек в стиле "сделай говносайт за 5 минут" а ля .NET. Не нравится? Забудь о программировании.
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 15.10.06 16:29
Да ну, как язык в котором есть даже циклы может считаться нормальным языком? Это те же костыли, для тех кто не может рализовать цикл с помощью машинных кодов.
Вообще после того как я познакомился с машинным кодом, я ни один язык не считаю нормальным языком, тк в каждом языке тем или иным образом есть костыли и побрякушки, даже в ассемблере.
Номер ответа: 6
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #6
Добавлено: 15.10.06 19:08
ой как Sharp в точку сказанул, прям передал все одним предложением, что я хотел сказать от .нете
только чуть чуть бы перефразировать, чтобы не только сайты обосрать но и проги под винду ) Сам трогать произведение боюсь, пусть лучше Sharp
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 15.10.06 23:33
Как можно называть столь примитивный набор из 1-2 сотен инструкций с жестко фиксированным синтаксисом языком? В нем даже думать не над чем, только печатать надо.
Как вообще можно называть кусок говнокода, делающего вид, что исполняется под другим куском говнокода, слепленного из говнокода 70-х, 80-х и 90-х годов, написанного малограмотными грязными индусами за 20$ в месяц, программой?
Номер ответа: 8
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #8
Добавлено: 15.10.06 23:44
оооо фсее.. print и в рамку!!! Respect!! ))
Номер ответа: 9
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #9
Добавлено: 15.10.06 23:50
А я что назвал его языком?
Типа на ассемблере или .NET думать надо
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 16.10.06 04:11
не ну на ассемблере можно долго и нудно высчитывать позицию чего-то в памяти... это иногда бывает увлекательно, например при многомерых матрицах ))
Номер ответа: 11
Автор ответа:
RNB-X
Вопросов: 17
Ответов: 29
Профиль | | #11
Добавлено: 04.12.06 21:25
может кто-то по сути проблемы выскажется???
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 04.12.06 23:26
Археолог, а ты пост 2 прочитал? В нем содержится полный развернутый ответ на твой вопрос с исходником. После этого, согласно неписанному кодексу митуя, мы все можем славно пофлудить.