Генерация звука

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Генерация звука

Сообщение The trick » 26.06.2010 (Сб) 23:13

Здравствуйте. Меня интересует вопрос генерации звука таблично-волновым синтезом посредством Visual Basic 6 . Вообщем я пишу приложение - музыкальный редактор, что-то типа трекерного (FastTracker и т.п.) и у меня происходит синтез звука из wave файлов.
Вот алгоритм:
=========ФОРМА ОТКРЫТЬ СЭМПЛ===========
1. Открываю wav файл
2. Перекодирываю его в 8 бит 16 кгц.
3. Сохраняю данные data чанка в массив с семплами
4. Добавляю название очередного сэмпла в листбокс
=========ФОРМА ДОБАВИТЬ ИНСТРУМЕНТ======
(На форме расположены коммандные кнопки как на клавиши на пианино, два скролбара Аттака, затухание и таймер)
1. Из листбокса выбираю любой семпл
2. С помощью регулятор аттака задаю звук аттаки
3. При нажатии на клавиши посредством DirectSound воспроизводится семпл с измененной частотой дискретизации
4. По отсчетам таймера уменьшается громкость буффера
---------------------------------------------------------------------------
:?: Вот в чем собственно мой вопрос. Как мне сделать чтобы сначала проигрывалась аттака семпла(например первые 500 байт) а затем зацикленно проигрывалась остальная часть семпла.
Пробывал так создавал два буффера один для аттаки другой для затухания(зацикленной части) с помощью метода WriteBuffer писал в буффер аттаки аттаку а в буфер затухания затухание, но проблемка я немогу проиграть их последовательно, если их проигрывать то они одновременно проигрываются, а мне надо чтобы сначала аттака один раз проигрывалась, а затем тутже циклично затухание. Слышал про метот SetCurrentPos, но может пробывать создавать один буффер, а потом просто проигрывать его не сначала? Помогите пожалуйста разобратся с данным вопросом, буду рад любой информации по генерации звука в RealTime. (сколько ни искал ни где даже под бейсик и не встречал)
UA6527P

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Генерация звука

Сообщение Viper » 27.06.2010 (Вс) 7:36

А не под бейсик встречал?
Весь мир матрица, а мы в нем потоки байтов!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Генерация звука

Сообщение FireFenix » 27.06.2010 (Вс) 11:16

http://blogs.msdn.com/b/rucoding4fun/ar ... /27/c.aspx
http://netlib.narod.ru/library/book0051/ch04_03.htm
http://www.gamedev.ru/community/swrus/a ... sage_basic

я немогу проиграть их последовательно, если их проигрывать то они одновременно проигрываются

Тут либо нада создавать 1 жирный массив и кидать в буфер DS, либо воспроизводить потоково (2ой и 3ий линк, внизу странички пример), постоянно докидывая части семпла
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генерация звука

Сообщение The trick » 27.06.2010 (Вс) 12:49

Спасибо за информацию буду разбиратся
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генерация звука

Сообщение The trick » 27.06.2010 (Вс) 13:24

А не подскажете как в Бейсике получать уведомление от Directsound о достижении конца буффера. Слышал про event object handle, но так и не понял что это.
UA6527P

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Генерация звука

Сообщение FireFenix » 27.06.2010 (Вс) 14:36

Кривоус Анатолий писал(а):А не подскажете как в Бейсике получать уведомление от Directsound о достижении конца буффера. Слышал про event object handle, но так и не понял что это.

Курите 2ой линк до просветления!

Создаём буфер ДС, получаем интерфейс уведомлений, создаём структуру смещения и указателя на событие, атачим интерфейсу уведомлений нашу структуру через SetNotificationPositions

P.S. в простонародии принято юзать проверку текущей позиции GetCurrentPosition, а не через уведомления
Код: Выделить всё
buffers are not provided reliably by all drivers; some may generate false notifications. To work around this problem, you can call IDirectSoundBuffer8::GetCurrentPosition whenever your application receives a notification, to be sure that the notification position has actually been reached.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 105

    TopList