Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> генерация звука в игре, как имея осцилограмму звука её проиграть 
:(
    Опции темы
Dubinsky
Дата 2.10.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



ну собственно всё в названии темы ... как имея "рисунок" звука его проиграть и наоборот ?
PM MAIL WWW   Вверх
mr.DUDA
Дата 3.10.2005, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Пишем осцилограмму в Wav-файл, и проигрываем с пом. PlaySound().


--------------------
user posted image
PM MAIL WWW   Вверх
Dubinsky
Дата 3.10.2005, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



хммм , ну примерно так я и думал что мне ответят ...

ну вообщем логично , да , а вот как записать в ВАВ файл что то ?и нельзя ли напрямую в буффер Директ саунда записать ?
PM MAIL WWW   Вверх
mr.DUDA
Дата 4.10.2005, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата
а вот как записать в ВАВ файл что то


Код

#include "stdafx.h"
#include "windows.h"
#include "math.h"
#include "Mmsystem.h"

// подключаем LIB-файл для ф-ции PlaySound
#pragma comment(lib, "winmm.lib")

// описание заголовка файла WAV
struct WAVHEADER
{
    char    sigRIFF[4];     // должно быть равно "RIFF"
    DWORD   sizeRIFFch;     // размер чанка RIFF
    char    sigWAVE[4];     // должно быть равно "WAVE"
    char    sigFMT[4];      // должно быть равно "fmt "
    DWORD   sizeFMTch;      // размер чанка FMT
    WORD    wFormatTag;     // категория формата, для PCM = 1
    WORD    wChannels;      // кол-во каналов: 1-моно 2-стерео
    DWORD   dwSamplesPerSec;// кол-во сэмплов в сек.
    DWORD   dwAvgBytesPerSec;// среднее число байт в сек
    WORD    wBlockAlign;    // выравнивание данных в дата-чанке
    WORD    wBitPerSample;  // бит в сэмпле
    char    sigDATA[4];     // должно быть равно "data"
    DWORD   sizeDATAch;     // размер data-чанка
};


void SuperBeep(DWORD dwFrequency, DWORD dwMilliSeconds)
{
    // частота дискретизации = 44100 Гц
    // кол-во бит на сэмпл = 8
    // если требуемая частота > 44100 или равна нулю, то выходим
    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);
}


//////////////////////////////////////////////////////////////////////////
// Тестовый звук - 900 Гц, одна секунда

int main(int argc, char* argv[])
{
    SuperBeep(900, 1000);
    return 0;
}

Добавлено @ 08:04
З.Ы. насчёт директсаунда я пока не разбирался, но по идее - можно... smile


--------------------
user posted image
PM MAIL WWW   Вверх
Dubinsky
Дата 10.10.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



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

и всё таки интересно а как хранится звук в буферах директ саунда ?
PM MAIL WWW   Вверх
DragonFire
Дата 10.10.2005, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



А кода для Delphi нет?


--------------------
PM MAIL ICQ   Вверх
mr.DUDA
Дата 12.10.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Dubinsky @ 10.10.2005, 18:58)
и всё таки интересно а как хранится звук в буферах директ саунда ?

в том вся и "фишка", что воспроизводимый звук хранится в буферах директ саунда smile

Цитата(DragonFire @ 10.10.2005, 21:53)
А кода для Delphi нет?

может, есть в Delphist FAQ (форум по Delphi), нужно спросить у Vit'а.


--------------------
user posted image
PM MAIL WWW   Вверх
DragonFire
Дата 13.10.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Цитата(mr @ 12.10.2005, 22:28)
нужно спросить у Vit'а.

smile smile smile Спрашиваю у Vit'a smile smile smile



--------------------
PM MAIL ICQ   Вверх
Dubinsky
Дата 13.10.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



Цитата(mr @ 12.10.2005, 22:28)
в том вся и "фишка", что воспроизводимый звук хранится в буферах директ саунда


стоп стоп стоп ! как эту фразу понимать ? тот звук , что воспроизводится , тот и хранится , или это намёк на то что в буфере директа вав формат используется ?
PM MAIL WWW   Вверх
mr.DUDA
Дата 14.10.2005, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 7
Всего: 232



Цитата(Dubinsky @ 13.10.2005, 14:39)
тот звук , что воспроизводится , тот и хранится , или это намёк на то что в буфере директа вав формат используется ?

Эххх, не хотелось мне, но пришлось поднять документацию по DirectSound... smile

Вкратце, DS работает так. При инициализации DS автоматом создаётся главный буфер (primary buffer), с которым программер не работает явно; в этом буфере микшируются звуки из всех вторичных буферов (secondary buffer), которые нужно создать явно, и которыми полностью распоряжается программер. Теперь - что такое secondary буфер и с чем его едят. Создать буфер можно вызвав IDirectSound8::CreateSoundBuffer. При создании буфера мы полностью описываем формат WAV-данных, которые туда будут записаны, и способ которым DS получает эти данные. Да, именно WAV без компрессии ! Никаких там MP3. Прокатит даже WAV, созданный в ф-ции SuperBeep, только без WAVHEADER-а; он не нужен, т.к. вся инфа о формате данных описывается при создании буфера. Пример, как создаётся буфер, есть в документации из DX SDK, но если нужно будет - спрашивайте, напишу как.

Дальше - больше... smile

Чтобы записать данные в буфер, можно пойти двумя путями. Можно создавать буфер статическим (static buffer) либо динамическим (streaming buffer). В статический буфер данные записываются как правило (но необязательно) один раз. Чтобы записать данные в буфер, нужно его залочить и получить начальный адрес в памяти, затем положить WAV-данные по полученному адресу, и наконец - разлочить буфер. Все эти действия выполняет интерфейс IDirectSoundBuffer8. Проиграть содержимое буфера можно с пом. IDirectSoundBuffer8::Play.
Добавлено @ 09:39
Цитата(DragonFire @ 13.10.2005, 12:25)
Спрашиваю у Vit'a

У Vit'а нужно спрашивать в форуме по Delphi, хотя можно спросить и у p0s0l, и у других участников того же форума smile.


--------------------
user posted image
PM MAIL WWW   Вверх
DragonFire
Дата 14.10.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

Репутация: 5
Всего: 9



Спасибо, уже спросил...


--------------------
PM MAIL ICQ   Вверх
Dubinsky
Дата 14.10.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



спасибо , теперь есть от чего плясать , подумаем ...
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.