Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337

Воспроизведение двух и более частот

18.08.2014, 10:17. Показов 1895. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Есть код:
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <vcl.h>
#include "windows.h"
#include "math.h"
#include "Mmsystem.h"
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
struct WAVHEADER
{
    char    sigRIFF[4];     
    DWORD   sizeRIFFch;     
    char    sigWAVE[4];     
    char    sigFMT[4];      
    DWORD   sizeFMTch;      
    WORD    wFormatTag;     
    WORD    wChannels;      
    DWORD   dwSamplesPerSec;
    DWORD   dwAvgBytesPerSec;
    WORD    wBlockAlign;    
    WORD    wBitPerSample;  
    char    sigDATA[4];     
    DWORD   sizeDATAch;     
};
 
void SuperBeep(DWORD dwFrequency, DWORD dwMilliSeconds)
{
    
    if(!dwFrequency || dwFrequency>44100)
        return;
   
    DWORD numSamples = 44100 / dwFrequency;
    
   
    DWORD size = sizeof(WAVHEADER) + numSamples;
    void *buff = new char[size ];
    
    //  WAV-header
    WAVHEADER *head = (WAVHEADER*)buff;
    strcpy(head->sigRIFF, "RIFF");
    strcpy(head->sigWAVE, "WAVE");
    head->sizeRIFFch = size - 8; 
    strcpy(head->sigFMT, "fmt ");
    head->sizeFMTch = 16;
    head->wFormatTag = 1;
    head->wChannels = 1; // ìîíî
    head->dwSamplesPerSec = 44100;
    head->dwAvgBytesPerSec = 44100;
    head->wBlockAlign = 1;
    head->wBitPerSample = 8;
    strcpy(head->sigDATA, "data");
    head->sizeDATAch = size;
    
    BYTE *samples = (BYTE*)(head+1);
    for(DWORD i=0; i<numSamples; i++)
        samples[i] = BYTE(255*sin(6.28*double(i)/double(size)));
   
    PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
   
    Sleep(dwMilliSeconds);
    
    PlaySound(0, 0, SND_ASYNC);
}
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SuperBeep(900, 5000);
 
}
Воспроизводящий синусоиду с чатотой 900 Гц и длительностью 5 сек.

Подскажите пожалуйста, как можно воспроизвести одновременно рядом стоящую(любую) частоту?

Можно ли сделать так?

C++
1
2
SuperBeep(900, 5000);
SuperBeep(930, 5000);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.08.2014, 10:17
Ответы с готовыми решениями:

Условие выполнения опреции при наличии более двух условий
Подскажите пожалуйста! Есть значение (допустим Х) которое должно быть равно или меньше значения (допустим Y) и выполнять заданное действие...

Печать на принтере двух и более страниц из StringGrid вместе с сеткой
Добро всем! :senor: Подсобите как распечатать содержимое StringGridа вместе с сеткой. Я пробую так но печатает что-то мулепусенькое в...

Воспроизведение звука (Массив частот)
Всем доброго дня! Хотел бы задать такой вопрос: у меня имеется массив с семью элементами. Каждый элемент - это частота, соответствующая...

9
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.08.2014, 11:48
Цитата Сообщение от Pir12345 Посмотреть сообщение
можно воспроизвести одновременно
Неа. PlaySound не позволяет запускать два файла одновременно.

Вам нужно в шестьдесят шестой строке суммировать частоты.

Цитата Сообщение от Pir12345 Посмотреть сообщение
C++
1
2
PlaySound((const char*)buff, 0, SND_ASYNC|SND_LOOP|SND_MEMORY);
Sleep(dwMilliSeconds);
Какой смысл выводить звук с помощью SDN_ASYNC, когда Sleep все равно подвесит все приложение?
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
18.08.2014, 11:52  [ТС]
SatanaXIII, а можете показать кодом как и суммировать? Любые частоты к примеру

Да, подвесит все приложение. А как иначе?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
18.08.2014, 15:11
...подготовить буфер с данными и в WaveOutWrite().

Кликните здесь для просмотра всего текста
Delphi
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
program variant1;
uses
  Windows, mmsystem,classes;
 
type
TVolumeLevel = 0..127;
var MS,ms2: TMemoryStream;
 
procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
var
 WaveFormatEx: TWaveFormatEx;
 i, TempInt, DataCount, RiffCount: integer;
 SoundValue: byte;
 w: double; // omega ( 2 * pi * frequency)
 const
 Mono: Word = $0001;
 SampleRate: Integer = 22050;
 RiffId: string = 'RIFF';
 WaveId: string = 'WAVE';
 FmtId: string = 'fmt ';
 DataId: string = 'data';
begin
 if Frequency > (0.6 * SampleRate) then Exit;
 
 with WaveFormatEx do begin
  wFormatTag := WAVE_FORMAT_PCM;
  nChannels := Mono;
  nSamplesPerSec := SampleRate;
  wBitsPerSample := $0008;
  nBlockAlign := (nChannels * wBitsPerSample) div 8;
  nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
  cbSize := 0;
 end;
 
 MS := TMemoryStream.Create;
 with MS do begin
  {Calculate length of sound data and of file data}
  DataCount := (Duration * SampleRate) div 1000; // sound data
  RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
  SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
  {write out the wave header}
  Write(RiffId[1], 4); // 'RIFF'
  Write(RiffCount, SizeOf(DWORD)); // file data size
  Write(WaveId[1], Length(WaveId)); // 'WAVE'
  Write(FmtId[1], Length(FmtId)); // 'fmt '
  TempInt := SizeOf(TWaveFormatEx);
  Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
  Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
  Write(DataId[1], Length(DataId)); // 'data'
  Write(DataCount, SizeOf(DWORD)); // sound data size
  {calculate and write out the tone signal} // now the data values
  w := 2 * Pi * Frequency; // omega
  for i := 0 to DataCount - 1 do begin
   SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
   Write(SoundValue, SizeOf(Byte));
  end;
 
 
 end
end;
 
 
procedure MakeSound2(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
var
 WaveFormatEx: TWaveFormatEx;
 i, TempInt, DataCount, RiffCount: integer;
 SoundValue: byte;
 w: double; // omega ( 2 * pi * frequency)
 const
 Mono: Word = $0001;
 SampleRate: Integer = 22050;
 RiffId: string = 'RIFF';
 WaveId: string = 'WAVE';
 FmtId: string = 'fmt ';
 DataId: string = 'data';
begin
 if Frequency > (0.6 * SampleRate) then Exit;
 
 with WaveFormatEx do begin
  wFormatTag := WAVE_FORMAT_PCM;
  nChannels := Mono;
  nSamplesPerSec := SampleRate;
  wBitsPerSample := $0008;
  nBlockAlign := (nChannels * wBitsPerSample) div 8;
  nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
  cbSize := 0;
 end;
 
 MS2 := TMemoryStream.Create;
 with MS2 do begin
  {Calculate length of sound data and of file data}
  DataCount := (Duration * SampleRate) div 1000; // sound data
  RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
  SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
  {write out the wave header}
  Write(RiffId[1], 4); // 'RIFF'
  Write(RiffCount, SizeOf(DWORD)); // file data size
  Write(WaveId[1], Length(WaveId)); // 'WAVE'
  Write(FmtId[1], Length(FmtId)); // 'fmt '
  TempInt := SizeOf(TWaveFormatEx);
  Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
  Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
  Write(DataId[1], Length(DataId)); // 'data'
  Write(DataCount, SizeOf(DWORD)); // sound data size
 
  w := 2 * Pi * Frequency; // omega
  for i := 0 to DataCount - 1 do begin
   SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
   Write(SoundValue, SizeOf(Byte));
  end;
 
 
 end
end;
 
 
begin
 MakeSound(728,30000,90);
 MakeSound2(1024,30000,90);
 
 sndPlaySound(MS.Memory, SND_MEMORY or SND_aSYNC);
 sndPlaySound(MS2.Memory, SND_MEMORY or SND_aSYNC);
 messagebox(0,'','',0);
 
 MS.Free; MS2.Free;
end.


Что до PlaySound, то флаг async, а вместо слипа использовать таймер или поток с однократным вызовом по срабатыванию флага-триггера-защелки (просто булева переменная).
Миниатюры
Воспроизведение двух и более частот  
Вложения
Тип файла: txt variant1.dpr.txt (3.9 Кб, 6 просмотров)
Тип файла: zip генерация Waveform.zip (4.3 Кб, 9 просмотров)
2
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
26.08.2014, 09:18  [ТС]
raxp, большое спасибо за код.
Если запускать его в делфи- выходит ошибка, что не найден DTMF.dcu.

А у вас есть такой же код, только на С++ ?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
26.08.2014, 11:37
...для генерации в данном примере он не нужен, это мой модуль спектроанализатора (просто убрать из uses). Но все остальное также верно и для билдера, меняется лишь синтаксис (точки на тире со стрелкой, оператор присваивания и прочие мелочи).
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
26.08.2014, 12:12  [ТС]
raxp, круто, получилось, генерация пошла. Еще пара вопросов.
Не отображается красное "бегание" частот - это из-за отсутствия dtmf ?
Вы выложили проект и еще txt файл. Это что два разных варианта подхода к генерации?
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
26.08.2014, 12:18
...два разных. По сути ваша тема дубликат на программерсе когда-то в прошлом ...там был аналогичный вопрос и я продублировал сюда два своих решения. Правда их уже четыре, но не будем забегать вперед.

Не отображается красное "бегание" частот - это из-за отсутствия dtmf
это спектроанализатор отображает, у меня есть вариант под билдер XE5 этого анализатора, а также есть просто DLL - FFTR.DLL, вы можете ее использовать ...по сути либа - упрощение FFTW. Темы по использованию FFTW вы найдете в подфоруме "Цифровая обработка сигналов", справка http://www.fftw.org
0
43 / 1 / 1
Регистрация: 05.01.2014
Сообщений: 337
26.08.2014, 12:29  [ТС]
А можете дать хоть какой нибудь вариант анализатора?чтобы можно было встроить в выложенный вами проект. Сам проект буду адаптировать под Билдер(согласно вашим комментариям)
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
26.08.2014, 14:10
- Описание API вызова библиотеки FFTR.DLL
- Описание API вызова библиотеки DTMFW
Вложения
Тип файла: zip Описание API вызова библиотеки DTMFW.zip (263.5 Кб, 7 просмотров)
Тип файла: zip Описание API вызова библиотеки FFTR.DLL.zip (265.8 Кб, 5 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2014, 14:10
Помогаю со студенческими работами здесь

Построить гистограммы частот и относительных частот
Построить гистограммы частот и относительных частот распределения(в первом столбце указан частичный интервал,во втором-сумма частот вариант...

Одновременное воспроизведение двух звуков
Сделал прогу в которой по нажатию на кнопку звучит музыка. Ну так для создания атмосферы. Потом дописал прогу: по нажатию на левую кнопку...

напечатать произведение двух наибольших из трёх из заданых чисел, используя при этом не более двух сравнений
напечатать произведение двух наибольших из трёх из заданых чисел, используя при этом не более двух сравнений

Синхронное воспроизведение двух звуковых файлов
Создаём новый проект. Добавляем библиотеку звуковую wmp Для этого заходим в: Свойства проекта Ссылки Добавить ссылку ...

Параллельное воспроизведение двух разных звуков
Помогите пожалуйста. Есть форма, на ней кнопки(на кнопках звуковые эффекты нажатия), при загрузке формы запускается музыка. Когда я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru