воскресенье, 24 января 2010 г.

Заголовок WAV-файлов и модификация звука

Заголовок WAV-файлов и модификация звука
В этой статье я обещал рассказать о модификаторах звука. Однако они бесполезны без возможности записать модификацию в файл. А при их использовании стандартными средствами в файл ничего не запишется. Поэтому придётся записывать всё вручную. И для этого я сделал новый компонент для HiAsm.

Но для начала сделаем простейшую схему записи звука.



Достаточно лишь инициализировать устройство записи по умолчанию и можно уже записывать (правда, это самый простой случай, без возможности выбора устройства). А теперь обратите внимание на параметр Mode у компонента BASS_RecordStart. Он был у нас в прошлой статье "File". Это значит, что запись идёт в файл. А сейчас нам нужно не записывать в файл, а получать звуковые данные в программе, поэтому установим его в "Stream".

Если вы забыли про файловые потоки, то почитайте здесь и там ещё две следующие статьи.

В нашем примере звуковые данные больше не будут записываться в файл, а будут выдаваться на точку onData. Это обычные данные Stream, их можно записывать и в файл. А можно модифицировать. Для этого есть группа "Модификаторы звука". Вот пример с первым компонентом (обратите внимание, что у графика MaxH=0).



Это простейший пример преобразования звуковых данных. Компоненты для преобразования можно комбинировать. И выдают они тоже Stream.


Как же записать модифицированный звук в файл? Это не так просто, как может показаться. Одни только звуковые данные, записанные в файл WAV, воспроизводиться не будут. Дело в том, что многие параметры данных - частоту дискретизации, количество каналов - проигрыватель определяет по заголовку WAV-файла. Поэтому сначала в файл нужно записать заголовок. Это первые 44 байта в файле WAV. Назначение каждого из них можно найти в Интернете, а я просто выложу сделанный компонент, который будет создавать заголовок для файла (а также читать заголовок готового файла).

Скачивайте. Если будет обновление компонента, просто будет заменён этот файл, а я скажу об этом в комментариях.

Установить компонент очень просто - сбросьте ini-файл в окно программы и выберите вкладку, куда хотите поместить новый компонент. К сожалению, я не мастер рисовать иконки, поэтому у компонента пока будет стандартная иконка. Возможно, впоследствии иконка появится.

Поставьте этот компонент на рабочее поле и посмотрите, какие параметры нужно задать для создания заголовка. Частота (Frequency) и количество каналов (Channels) должны быть такими же, как и у BASS_RecordStart. Если выставить в компоненте WaveHeader другие значения, то проигрыватель будет искажённо воспроизводить такой файл. Например, частота дискретизации определяет, какое количество байт в секунду будет браться из файла. Если записано на частоте 44100, а в заголовке указано 22050, то звучание файла будет замедленным в два раза. Так что внимательно следите за этим.

Обратите также внимание на точку Size сверху. На неё нужно подать размер звуковых данных в байтах. Но до окончания записи он неизвестен. Поэтому заголовок придётся составлять уже после окончания записи (т.е. после нажатия кнопки "Стоп").



Сначала происходит открытие файла. При записи звук модифицируется и передаётся в MemoryStream. Однако при каждой новой передаче через метод doCopy предыдущие данные стираются, а нам нужно накапливать их. Поэтому для накапливания используется другой MemoryStream, в который данные копируются без удаления предыдущих (это достигается благодаря StreamCopy).

При нажатии на "Стоп" размер звуковых данных берётся именно из этого накопителя. Составляется заголовок и записывается в файл (заголовок в компоненте представлен тоже как stream), а затем записываются звуковые данные. Проверьте - всё работает!

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






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

5 комментариев:

  1. Внимание! Компонент WaveHeader изменился! По старой ссылке скачивается старая версия! Новая версия дана в следующей статье.

    ОтветитьУдалить
  2. А старый компонент уже не работает?

    ОтветитьУдалить
  3. Не работает. В новом поменялся принцип работы и точки. Он находится в статье "Доктор WAV"

    ОтветитьУдалить
  4. Админ напиши пожалуйста урок по использованию компонента SoundBuffer, как его можно применить, очень интересует этот компонент но примеров нет, спасибо!

    ОтветитьУдалить
  5. Честно говоря, я не представляю, как работать с этим компонентом. По идее, в него долдны добавляться данные с точки onData компонента BASS_RecordStart, чтобы потом быть записанными в файл. Но узнать точный размер данных в компоненте невозможно, потому что процентное состоние заполнения округляется, и рассчёты будут уже неточными. Я этим компонентом никогда не пользовался и не считаю его необходимым. На всякий случай - можете спросить у самого автора HiAsm (Dilma) - hiasm.com.

    ОтветитьУдалить