Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Побитная запись в контейнер wav - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как исполльзовать оператор goto? http://www.cyberforum.ru/cpp-beginners/thread1104039.html
Как его юзать?
C++ Классы и объем ОЗУ Помогите пожалуйста с задачей... Создать класс таким образом, чтобы он отслеживал количество существующих в данный момент объектов и объем оперативной памяти, который они занимают. Указание:... http://www.cyberforum.ru/cpp-beginners/thread1104010.html
ПРограмма определяет цвет пикселя по координатам C++
В dev c++ пишу программу, которая определяет координаты, где сейчас находится мышь и цвет пикселя, находящегося в этих координатах. Что надо дописать, чтобы третьей строчкой выводился на экран цвет...
Задача про комплексные числа(закрытые переменные) C++
Нужна срочно ваша помощь, помогите не смыслящему человеку:cry:, модифицировать программу таким образом, чтобы класс содержал закрытые переменные. Код готов. И еще проблема в программе есть когда...
C++ Ввести несколько структур типа «Зачетка студента» http://www.cyberforum.ru/cpp-beginners/thread1103965.html
Вот условие задачи: Ввести несколько структур типа «Зачетка студента» с полями {Фамилия студента Номер зачетки Массив из 4 оценок } Написать программу, выполняющую следующие действия:...
C++ Посоветуйте, как найти мёртвый код Интересуют целые мёртвые функции. подробнее

Показать сообщение отдельно
Sonance
6 / 6 / 3
Регистрация: 15.02.2013
Сообщений: 55
24.02.2014, 22:31  [ТС]
Возможно кому-то пригодиться. Класс генерирует синусоидальную звуковую волну.

В структуре заголовка Регистр букв должен быть именно таким, иначе небудет работать.
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
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <Windows.h>
 
 
 
double PI=3.14159265358979323846;
class Generator {
    public: 
 
        static void Wave() {
            int sampleRate = 8000;// частота дискретизации.
            short *data = new short[sampleRate]; // Инициализируем массив 16 битных значений
            double frequency = PI * 2 * 440.0 / sampleRate; // Рассчитываем требующуюся частоту.
            for (int index = 0; index < sampleRate; index++) { 
                 data[index] = (short)(Sine(index, frequency) * SHRT_MAX);// Приводим уровень к амплитуде от 32767 до -32767.
            }
            SaveWave(data, sampleRate);
        }
 
        static double Sine(int index, double frequency) {//Расчет значений для синусоидальной волны
            return sin(frequency * index);
        }
        //Header WAV файла
        struct WAVHEADER{
            // WAV-формат начинается с RIFF-заголовка:
            char chunkId[4];// Содержит символы "RIFF" в ASCII кодировке
            unsigned long chunkSize;// 36 + subchunk2Size, или более точно:
            char format[4];// Содержит символы "WAVE"
            char subchunk1Id[4];// Содержит символы "fmt "
            unsigned long subchunk1Size;// 16 для формата PCM.
            unsigned short audioFormat;// Для PCM = 1 (то есть, Линейное квантование).
            unsigned short numChannels;// Количество каналов. Моно = 1, Стерео = 2 и т.д.
            unsigned long sampleRate;// Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
            unsigned long byteRate;// sampleRate * numChannels * bitsPerSample/8
            unsigned short blockAlign;// Количество байт для одного сэмпла, включая все каналы. numChannels * bitsPerSample/8
            unsigned short bitsPerSample;// Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
            char subchunk2Id[4];// Подцепочка "data" содержит аудио-данные и их размер.Содержит символы "data"
            unsigned long subchunk2Size;// Количество байт в области данных. numSamples * numChannels * bitsPerSample/8
        };
        //Функция записи WAV файла
        static void SaveWave( short *data, int sampleRate){
            short frameSize = (short)(16 / 8);
            WAVHEADER stream;
            stream.chunkId[0] = 'R';
            stream.chunkId[1] = 'I';
            stream.chunkId[2] = 'F';
            stream.chunkId[3] = 'F';
            stream.chunkSize = (36 + sampleRate * frameSize);
            stream.format[0] = 'W';
            stream.format[1] = 'A';
            stream.format[2] = 'V';
            stream.format[3] = 'E';
            stream.subchunk1Id[0] = 'f';
            stream.subchunk1Id[1] = 'm';
            stream.subchunk1Id[2] = 't';
            stream.subchunk1Id[3] = ' ';
            stream.subchunk1Size = (16);
            stream.audioFormat = ((short)1);
            stream.numChannels = ((short)1);
            stream.sampleRate = sampleRate;
            stream.byteRate = (sampleRate * frameSize);
            stream.blockAlign = frameSize;
            stream.bitsPerSample = ((short)16);
            stream.subchunk2Id[0] = 'd';
            stream.subchunk2Id[1] = 'a';
            stream.subchunk2Id[2] = 't';
            stream.subchunk2Id[3] = 'a';
            stream.subchunk2Size = (sampleRate * frameSize);
 
            FILE *f1;
            f1 = fopen("test.wav", "w+b");
            fwrite(&stream, sizeof(stream), 1, f1);
            for (int i = 0; i < sampleRate; i++){   
                    fwrite(&data[i], sizeof(short),1, f1);//записываем байты элемента i массива data
            }
            fclose(f1);
        }
 };
int main()
{
    Generator r;
    r.Wave();
    std::cin.get(); 
    return 0;
}
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru