Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 165
1

Генератор звуковых волн

17.03.2016, 15:18. Просмотров 3023. Ответов 7
Метки нет (Все метки)


Есть статья, описывающая, как сделать генератор синуса, прямоугольного импульса, пилы и шума: https://blogs.msdn.microsoft.c... 5/27/2413/. Проблема в том, что исходники скачать нельзя. Попробовал повторить, но ничего не вышло. Программа компилируется, но окно главной формы не запускается. Помогите разобраться, чтобы заработало, может что-то напортачил:

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
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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Media;
using Microsoft.DirectX.DirectSound;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;
using Microsoft.DirectX;
 
namespace Генератор
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
        Microsoft.DirectX.DirectSound.WaveFormat waveFormat;
        public short[] GenerateOscillatorSampleData()
{
    // Создаем циклический буфер на основе свойств переданного объекта.
    // Заполняем буфер данными соответствующей волны с указанной частотой.
    int numSamples = Convert.ToInt32(bufferDurationSeconds * 
        waveFormat.SamplesPerSecond);
    short[] sampleData = new short[numSamples];
    double frequency = Frequency.Value;
    int amplitude = Convert.ToInt16(Amplitude.Value);
    double angle = (Math.PI * 2 * frequency) / 
        (waveFormat.SamplesPerSecond * waveFormat.Channels);
 
if (Sine.Checked)
            {
                for (int i = 0; i < numSamples; i++)
                    // Генерируем синусоидальную волну в обоих каналах
                    sampleData[i] = Convert.ToInt16(amplitude * 
        Math.Sin(angle * i));
            }
 
        if ( Square.Checked)
            {
                for (int i = 0; i < numSamples; i++)
                {
                    // Генерируем прямоугольную волну в обоих каналах
                    if (Math.Sin(angle * i) > 0)
                        sampleData[i] = Convert.ToInt16(amplitude);
                    else
                        sampleData[i] = Convert.ToInt16(-amplitude);
                }
            }
 
       if (Sawtooth.Checked)
            {
                int samplesPerPeriod = Convert.ToInt32(
        waveFormat.SamplesPerSecond / 
        (frequency / waveFormat.Channels));
                short sampleStep = Convert.ToInt16(
        (amplitude * 2) / samplesPerPeriod);
                short tempSample = 0;
 
                int i = 0;
                int totalSamplesWritten = 0;
                while (totalSamplesWritten < numSamples)
                {
                    tempSample = (short)-amplitude;
                    for (i = 0; i < samplesPerPeriod && 
        totalSamplesWritten < numSamples; i++)
                    {
                        tempSample += sampleStep;
                        sampleData[totalSamplesWritten] = tempSample;
 
                        totalSamplesWritten++;
                    }
                }
            }
 
if (Noise.Checked)
            {
                Random rnd = new Random();
                for (int i = 0; i < numSamples; i++)
                {
                    sampleData[i] = Convert.ToInt16(
        rnd.Next(-amplitude, amplitude));
                }
            }
 
    return sampleData;
}       
        private static UInt16 bufferDurationSeconds = 44100;
        Microsoft.DirectX.DirectSound.BufferDescription bufferDesc;
        Device device=new Device();
        Microsoft.DirectX.DirectSound.SecondaryBuffer buffer;
 
        void MainFormLoad(object sender, EventArgs e)
        {
    waveFormat = new Microsoft.DirectX.DirectSound.WaveFormat();
    waveFormat.SamplesPerSecond = 44100;
    waveFormat.Channels = 2;
    waveFormat.FormatTag = WaveFormatTag.Pcm;
    waveFormat.BitsPerSample = 16;
    waveFormat.BlockAlign = 4;
    waveFormat.AverageBytesPerSecond = 176400;
 
    bufferDesc = new BufferDescription(waveFormat);
    bufferDesc.DeferLocation = true;
    bufferDesc.BufferBytes = Convert.ToInt32(
        bufferDurationSeconds * waveFormat.AverageBytesPerSecond / waveFormat.Channels);
 
        }
    
        void Button1Click(object sender, EventArgs e)
        {
    short[] sampleData = GenerateOscillatorSampleData();
    buffer = new SecondaryBuffer(bufferDesc, device);            
    buffer.Write(0, sampleData, LockFlag.EntireBuffer);
    buffer.Play(0, BufferPlayFlags.Default);   
        }
    }
}
P.S. прикрепил еще и сам проект
0
Вложения
Тип файла: rar Генератор.rar (27.0 Кб, 40 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2016, 15:18
Ответы с готовыми решениями:

Графический вывод звуковых волн
Имеется звук в формате WAV. Как вывести на экран осциллятор этого сигнала? Не могу найти в...

Замена звуковых волн
Например, есть какие-то звуковые волны, например, звук идет из колонок, можно ли сделать такое...

Создание звуковых волн определенной частоты
Всем привет, у меня такой вопрос. Можно с помощью динамика создать звук определенной частоты,...

Преобразование звуковых волн в цифрой сигнал
Посоветуйте литературу.Спасибо!

7
Модератор
880 / 789 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
17.03.2016, 15:41 2
Microsoft.DirectX; и Microsoft.DirectX.DirectSound; есть ? или самому искать?
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 165
17.03.2016, 16:01  [ТС] 3
В каком смысле?Если в смысле того, есть ли на них ссылки то да. Если в смысле того есть ли они на компьютере, тоже да
0
Модератор
880 / 789 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
17.03.2016, 16:06 4
То что у вас есть я понял. У меня нет))) Скинте
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 165
17.03.2016, 16:11  [ТС] 5
в приложениях dll из локальной копии
0
Вложения
Тип файла: rar Debug.rar (139.5 Кб, 26 просмотров)
Модератор
880 / 789 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
17.03.2016, 16:44 6
Microsoft.DirectX.DirectSound.WaveFormat waveFormat = new WaveFormat(); - что эта строка делает?

Добавлено через 2 минуты
https://www.cyberforum.ru/csha... 57237.html

))
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 165
17.03.2016, 16:58  [ТС] 7
Ну блин)Я просто хотел повторить ту статью но похоже чего то не понимаю
0
1 / 1 / 3
Регистрация: 22.06.2013
Сообщений: 165
20.03.2016, 15:00  [ТС] 8
Форма так и не запускается:
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
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System;
using System.Windows;
using Microsoft.DirectX.DirectSound;
using System.Windows.Interop;
using System.Windows.Shapes;
using WaveFormat=Microsoft.DirectX.DirectSound.WaveFormat;
using Microsoft.DirectX.AudioVideoPlayback;
//using Video = Microsoft.DirectX.AudioVideoPlayback.Audio;
 
 
namespace проба_генератор2
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        Device device=new Device();
        WaveFormat waveFormat;
        BufferDescription bufferDesc;
        SecondaryBuffer buffer;
        private static UInt16 bufferDurationSeconds = 44100;
        short[] sampleData;
        int amplitude;
        public short[] GenerateOscillatorSampleData()
{
    // Создаем циклический буфер на основе свойств переданного объекта.
    // Заполняем буфер данными соответствующей волны с указанной частотой.
    int numSamples = Convert.ToInt32(bufferDurationSeconds * 
        waveFormat.SamplesPerSecond);
    sampleData = new short[numSamples];
    double frequency = this.Frequency.Value;
    amplitude = (int)this.Amplitude.Value;
    double angle = (Math.PI * 2 * frequency) / 
        (waveFormat.SamplesPerSecond * waveFormat.Channels);
 
  //  switch (osc.WaveType)
    //{
    if( Sine.IsChecked==true)
            {
                for (int i = 0; i < numSamples; i++)
                    // Генерируем синусоидальную волну в обоих каналах
                    sampleData[i] = Convert.ToInt16(amplitude * 
        Math.Sin(angle * i));
            }
           // break;
        if( Square.IsChecked==true)
            {
                for (int i = 0; i < numSamples; i++)
                {
                    // Генерируем прямоугольную волну в обоих каналах
                    if (Math.Sin(angle * i) > 0)
                        sampleData[i] = Convert.ToInt16(amplitude);
                    else
                        sampleData[i] = Convert.ToInt16(-amplitude);
                }
            }
         //   break;
        if( Sawtooth.IsChecked==true) 
            {
                int samplesPerPeriod = Convert.ToInt32(
        waveFormat.SamplesPerSecond / 
        (frequency / waveFormat.Channels));
                short sampleStep = Convert.ToInt16(
        (amplitude * 2) / samplesPerPeriod);
                short tempSample = 0;
 
                int i = 0;
                int totalSamplesWritten = 0;
                while (totalSamplesWritten < numSamples)
                {
                    tempSample = (short)-amplitude;
                    for (i = 0; i < samplesPerPeriod && 
        totalSamplesWritten < numSamples; i++)
                    {
                        tempSample += sampleStep;
                        sampleData[totalSamplesWritten] = tempSample;
 
                        totalSamplesWritten++;
                    }
                }
            }
           // break;
        if( Noise.IsChecked==true) 
            {
                Random rnd = new Random();
                for (int i = 0; i < numSamples; i++)
                {
                    sampleData[i] = Convert.ToInt16(
        rnd.Next(-amplitude, amplitude));
                }
            }
           // break;
   // }
    return sampleData;
}
        
        private void Window_Loaded(object sender, RoutedEventArgs e)
{
    WindowInteropHelper helper = 
        new WindowInteropHelper(Application.Current.MainWindow);
    device.SetCooperativeLevel(helper.Handle, CooperativeLevel.Normal);
 
  //  waveFormat = new Microsoft.DirectX.DirectSound.WaveFormat();
    waveFormat.SamplesPerSecond = 44100;
    waveFormat.Channels = 2;
    waveFormat.FormatTag = WaveFormatTag.Pcm;
    waveFormat.BitsPerSample = 16;
    waveFormat.BlockAlign = 4;
    waveFormat.AverageBytesPerSecond = 176400;
 
    bufferDesc = new BufferDescription(waveFormat);
    bufferDesc.DeferLocation = true;
    bufferDesc.BufferBytes = Convert.ToInt32(
        bufferDurationSeconds * waveFormat.AverageBytesPerSecond / waveFormat.Channels);
 
    // Добавляем три осциллятора
//    Oscillator tmp;
//    for (int i = 0; i < NUM_GENERATORS; i++)
//    {
//        tmp = new Oscillator();
//        Oscs.Children.Add(tmp);
//        mixer.Oscillators.Add(tmp);
//    }            
}
        
        private void btnPlay_Click(object sender, RoutedEventArgs e)
{                                    
   // mixer.Initialize(Application.Current.MainWindow);
 
    //short[] sampleData1 = mixer.MixToStream();
    buffer = new SecondaryBuffer(bufferDesc, device);            
    buffer.Write(0, sampleData, LockFlag.EntireBuffer);
    buffer.Play(0, BufferPlayFlags.Default);            
 
    GraphWaveform(sampleData);
}
    
        private void GraphWaveform(short[] data)
{
    cvDrawingArea.Children.Clear();
 
    double canvasHeight = cvDrawingArea.Height;
    double canvasWidth = cvDrawingArea.Width;
 
    int observablePoints = 1800;
            
    double xScale = canvasWidth / observablePoints;
    double yScale = (canvasHeight / 
                     (double)(amplitude * 2)) * ((double)amplitude); /// MAX_AMPLITUDE);
 
    Polyline graphLine = new Polyline();
    graphLine.Stroke = System.Windows.Media.Brushes.Black;
    graphLine.StrokeThickness = 1;
 
    for (int i = 0; i < observablePoints; i++)
    {
        graphLine.Points.Add(
            new Point(i * xScale, (canvasHeight / 2) - (data[i] * yScale) ));
    }
 
    cvDrawingArea.Children.Add(graphLine);            
}
    }
}
Добавлено через 1 час 38 минут
Самое интересное, что если это просто класс без интерфейса, все работает. Но если я вызываю его из MainForm, все виснет
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 15:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Генератор звуковых сигналов
Всем доброго времени суток. Дали мне задание: сделать на ардуино генератор звуковых сигналов. Что...

Хочу сделать генератор и дешифратор звуковых сигналов
Есть идея, но не знаю, реально ли это реализовать на ATMEGA8 (это почти всё, что я имею, ещё есть...

Интерференция механических волн
Доброго времени суток! На анимации — распространение волны с учётом её строения из частиц. А...

Анимация. Эффект волн
Приветствую! Есть потребность пустить повторяющуюся картинку (волна) по подвалу сайта. В JQ...

Анимация морских волн
Такая проблема: нужна программа, которая рисует картинку, на которой будет анимация волн, то есть...

Амплитуда акустических волн
Здравствуйте! Возник такой вопрос: Уменьшается ли со временем амплитуда акустических волн? Если...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.