2.2 Модель музыкального плеера в Simulink
Matlab – отличный пакет для решения математических задач. Мы воспользуемся им для моделирования нашего музыкального плеера с эффектом phaser.
Приступим к реализации нашего эффекта.
Еще раз повторяя сказанное ранее, мы должны разделить поток на два или несколько, один пустить без искажений, а на другие наложить небольшую временную задержку. Затем все сигналы суммируются и выводятся в аудиоустройство.
Вот как выглядит схема, собранная в симулинке.
Рис. 1

Остановимся поподробнее на каждом элементе этой схемы.
Рис. 2
Этот элемент позволяет нам указать путь к нашему аудиофайлу и использовать его в качестве сигнала.
Зайдем в его настройки:
Рис. 3

Самый главный параметр здесь – Samples per audio frame. Ставим его в единицу. Что такое sample и frame? Это базовые понятия в цифровой обработке музыкальных сигналов. Отцифрованный звук поступает в виде числовых отчетов непрерывным потоком. Для удобства обработки эти отсчеты формируются в массивы, sample (сэмплы). Сэмплы в свою очередь группируются в двумерную матрицу (frame). Поставив единицу в эту графу, мы объявили, что фрейм у нас будет состоять всего из одного сэмпла, т.е. фактически не будет отличаться от него.
Рис. 4
Блок Delay определяет задержку звукового сигнала. Индекс 0 в показатели степени означает, что задержки не будет и сигнал без искажений пройдет через этот блок. Задержка измеряется в сэмплах. В 1 сэмпле 8 бит = 1 байт информации. Для нашего не совсем качественного mp3 файла при частоте дискретизации 44 кГц необходима передача данных хотя бы 128 кбит/с. Таким образом происходит передача около 16000 сэмплов в секунду. Варьируя задержку в блоке Delay мы можем добиться нужного нам звучания.
Рис. 5
Это
окно настроек блока Delay.
Мы можем менять параметры Delay (samples) от 0 до неограниченного числа, но запомните, что при 16000 у нас будет задержка ровно на секунду в музыке, а нам нужна задержка гораздо меньшая.
Как видно из Рис 1, сигнал разделяется на 6 потоков, один который без блока задержки, а 5 остальных с таким блоком. Потом все сигналы суммируются при помощи сумматора.

В конце суммирующий сигнал выводится на аудиоустройство пр помощи блока to audio device

Теперь для задания нашего эффекта phaser установим в блоках delay следующие значения:
Delay1 1000
Delay2 2000
Delay3 3000
Delay4 4000
Delay5 5000
Звук приобрел характерный металлический оттенок. Вы можете сами попробовать поменять значения задержки и понаблюдать за изменениями.
Теперь приступим к реализации схемы нашего плеера с эквалайзером. В прошлом семестре мы выполняли аналогичную работу, поэтому я не буду вдаваться в подробности проектирования эквалайзера. Полученная итоговая схема:
Рис. 6

Как видно из рисунка, звук разделяется на 7 потоков и каждый идет через свой фильтр, каждый из которых проектируется в специальном инструмент matlab fdatool. После чего звук поступает в блок gain, который либо усиливает его, либо ослабевает. Таким образом мы можем отрегулировать звучание по частотам, сделать его высотным или басовым.
Для отладки и наглядного тестирования эффекта phaser я быстро создал пользовательский интерфейс в инструменте matlab guide

Подробный код описан в прошлом семестре, скажу только, что вертикальные ползунки управляют усилением полос, каждый в своем диапазоне частот от BASS до TOP OCTAVE
Возможные значения усиления от -10 до +10 дБ
Кнопка default возвращает значения усиления всех полос в 0 дБ
Горизонтальные ползунки управляют задержкой звукового сигнала, каждый своим потоком. Возможные значения задержки от 0 до 16000 сэмплов в каждом из потоков. Кнопка swith phaser off возвращает значение задержки в 0.
Таким образом, можно пробовать изменять значения очень быстро и динамично для нахождения оптимального звучания.
Теперь, когда мы разобрались с устройством нашего проигрывателя и со схемой нашего эффекта, можно смело приступать к его разработке на языке высокого уровня.
2.3 Возможные пути выполнения на
высокоуровневом языке
Для начала необходимо определиться с выбором операционной системы, на которой будем выполнять работу. В методических указаниях для каждой ОС были рекомендованы свои инструменты, а именно:
-
Для Windows самая рациональная связка - Visual Studio, WinForms, DirectShow.
-
Для Mac OS X - XCode, Cocoa, CoreAudio.
-
Для Linux – Geany, GTK, Gstreamer.
В моем активе были все 3 операционные системы, но я решил начать с самой распространенной – Windows, тем более, что мы неплохо освоили в свое время Visual Studio и WinForms. К моему сожалению, поставить DirectShow не удалось, спросить было не у кого, поэтому это быстро мне отбило охоту.
Что касается Mac OS и в частности CoreAudio, мне удалось наткнуться на отличную книгу,
Learning Core Audio: A Hands-On Guide to Audio Programming for Mac and iOS [Chris Adamson, Kevin Avila]
Я прочитал введение на русском языке, автор готовит читателей к решению сложных задач на достаточно низком уровне программирования, предполагает знания objective c и библиотек cocoa. Я решил подтянуть свои знания, поставил XCode, прочитал небольшую, но хорошо написанную книгу по objective C
Become an Xcoder. Start Programming the Mac Using Objective-C. By Bert Altenberg, Alex Clarke and Philippe Mougin
Рекомендую тем, кто хочет быстро научиться что-либо писать на Mac и OS X
Кроме того, я прослушал видеокурс по библиотекам cocoa на youtube, там их достаточное количество.
К моему разочарованию, дальше работа не двинулась, т.к. после русского предисловия книги мне предложили заказать такую книгу, чего я делать не стал, а в сети найти удалось только англоязычный вариант, который для изучения был весьма непрост. Тем не менее, у меня твердо сложилось убеждение, что CoreAudio определенно лучший инструмент для создания мультимедийных приложений. Появилось желание это изучить, чем я возможно займусь, когда появится время.
Итак, остается Linux, система, с которой я был не знаком до сиз пор, но проект выполнил именно на ней. Тут были уже люди, у кого можно спросить и получить вразумительный ответ. Я установил Ubuntu, Geany - компилятор языка С, библиотеки gstreamer и gtk.
Я и моя коллега Евгения Ахунзянова написали подробную инструкцию, как все это устанавливается и компилируется на Linux. Это можно найти в самой последней версии методички.
Как устанавливать Linux на компьютер мы описывать не стали, т.к. все это подробно рассказывается на курсе Технологии Программирования.
Хоть это и было подчеркнуто в методичке, но позволю повториться себе еще раз про gtk и gstreamer.
Это не какие-то программы, где вы можете себе взять и создать плеер или что-то еще. Это просто библиотеки различных функций и объектов, которые можно подключить к среде программирования и использовать в своих проектах на языке С.
Gstreamer – мультимедийный фреймворк, написаный на языке C и использующий систему типов GObject. Используется в различных плеерах, редакторах, программах для создания конференций и портативных устройствах. Документацию на него можно найти по адресу:
https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html
Все на английском, поиск непростой, но реальный и все описания и даже примеры кодов там есть.
Как работает звуковой поток в Gstreamer описано в методичке.
Что касается gtk, это тоже библиотеки, только интерфейса.
Документацию можно найти здесь:
http://www.gtk.org/api/2.6/gtk/index.html
Наряду с библиотеками интерфейса gtk я рекомендую обратить внимание на библиотеки Qt. Описание происходит на языке С++
Я немного поразбирался с этими библиотеками для системы Mac OS, очень просто в освоении, только вопрос о связи с gstreamer или другими инструментами остается открытым.
Такой простенький интерфейс можно написать буквально за пару минут. Кому интересно, советую обратить внимание. На youtube можно найти множество видеокурсов по програмированию на С++ с использованием библиотек Qt
Теперь, когда мы знаем возможные пути развития, можно уже остановится конкретно на нашем методе реализации, а именно:
Ubuntu + geany + gstreamer + gtk на языке С.
3
Практическая часть
