exponenta event banner

Разработка пользовательского интерфейса для аудиоплагина

Аудиоплагины позволяют настраивать параметры алгоритма обработки при потоковой передаче звука в реальном времени. Для повышения удобства использования можно определить пользовательский интерфейс (ПИ), который сопоставляет параметры интуитивно разработанным и позиционированным элементам управления. Вы можете использовать audioPluginInterface, audioPluginParameter, и audioPluginGridLayout для определения пользовательского интерфейса пользователя. С пользовательским интерфейсом пользователя в MATLAB ® можно взаимодействовать с помощью parameterTunerили развернуть подключаемый модуль с пользовательским интерфейсом пользователя на цифровой звуковой рабочей станции (DAW). В этом учебном пособии рассматриваются ключевые возможности разработки аудиоплагинов путем последовательного расширения интерфейса пользователя базового аудиоплагина.

Дополнительные сведения о аудиоплагинах в целом см. в разделе Аудиоплагины в MATLAB.

Пользовательский интерфейс по умолчанию

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

classdef equalizerV1 < audioPlugin
    properties
        GainLow = 0
        FreqLow = sqrt(20*500)
        GainMid = 0
        FreqMid = sqrt(500*3e3)
        GainHigh = 0
        FreqHigh = sqrt(3e3*20e3)
        Volume = 1
        Enable = true
    end
    properties (Constant)
        PluginInterface = audioPluginInterface( ...
            audioPluginParameter('GainLow', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}), ...
            audioPluginParameter('FreqLow', ...
                'Label','Hz', ...
                'Mapping',{'log',20,500}), ...
            audioPluginParameter('GainMid', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}), ...
            audioPluginParameter('FreqMid', ...
                'Label','Hz', ...
                'Mapping',{'log',500,3e3}), ...
            audioPluginParameter('GainHigh', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}), ...
            audioPluginParameter('FreqHigh', ...
                'Label','Hz', ...
                'Mapping',{'log',3e3,20e3}), ...
            audioPluginParameter('Volume', ...
                'Mapping',{'lin',0,2}), ...
            audioPluginParameter('Enable'))
    end
    properties (Access = private)
        mPEQ
    end
    methods
        function obj = equalizerV1
            obj.mPEQ = multibandParametricEQ('HasHighpassFilter',false, ...
                'HasLowShelfFilter',false,'HasHighShelfFilter',false, ...
                'HasLowpassFilter',false,'Oversample',false,'NumEQBands',3, ...
                'EQOrder',2);
        end
        function y = process(obj, x)
            if obj.Enable
                y = step(obj.mPEQ,x);
                y = y*obj.Volume;
            else
                y = x;
            end
        end
        function reset(obj)
            obj.mPEQ.SampleRate = getSampleRate(obj);
            reset(obj.mPEQ);
        end
        function set.FreqLow(obj,val)
            obj.FreqLow = val;
            obj.mPEQ.Frequencies(1) = val; %#ok<*MCSUP>
        end
        function set.GainLow(obj,val)
            obj.GainLow = val;
            obj.mPEQ.PeakGains(1) = val;
        end
        function set.FreqMid(obj,val)
            obj.FreqMid = val;
            obj.mPEQ.Frequencies(2) = val;
        end
        function set.GainMid(obj,val)
            obj.GainMid = val;
            obj.mPEQ.PeakGains(2) = val;
        end
        function set.FreqHigh(obj,val)
            obj.FreqHigh = val;
            obj.mPEQ.Frequencies(3) = val;
        end
        function set.GainHigh(obj,val)
            obj.GainHigh = val;
            obj.mPEQ.PeakGains(3) = val;
        end
    end
end

Звонить parameterTuner для визуализации пользовательского интерфейса аудиоплагина по умолчанию.

parameterTuner(equalizerV1)

Стиль и компоновка элемента управления

Чтобы определить сетку пользовательского интерфейса, добавьте audioPluginGridLayout в audioPluginInterface. Можно указать количество, размер, интервал и границу ячеек в сетке пользовательского интерфейса. В этом примере укажите RowHeight как [20,20,160,20,100] и ColumnWidth как [100,100,100,50,150]. При этом создается следующая сетка пользовательского интерфейса:

Чтобы определить стиль элемента управления пользовательского интерфейса, обновите audioPluginParameter определение каждого параметра, включающего пары имя-значение «Стиль» и «Макет». Style определяет тип управления (например, поворотная ручка, ползун или переключатель). Layout определяет ячейки, занимаемые элементами управления в сетке пользовательского интерфейса. Можно указать Layout как [строка, столбец] занимаемой сетки или как [верхний, левый; ниже, справа] группы занимаемых клеток. По умолчанию отображаемые имена элементов управления также отображаются и занимают собственные ячейки в сетке пользовательского интерфейса. Ячейки, которые они занимают, зависят от пары имя-значение DisplayNameLocation.

Комментируемые стрелки указывают на разницу между equalizerV1 и equalzierV2.

classdef equalizerV2 < audioPlugin
    ... % omited for example purposes
    properties (Constant)
        PluginInterface = audioPluginInterface( ...
            audioPluginParameter('GainLow', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...                                     %<--
                'Layout',[2,1;4,1], ...                                    %<--
                'DisplayName','Low','DisplayNameLocation','Above'), ...    %<--
            audioPluginParameter('FreqLow', ...
                'Label','Hz', ...
                'Mapping',{'log',20,500}, ...
                'Style','rotaryknob', ...                                  %<--
                'Layout',[5,1], ...                                        %<--
                'DisplayNameLocation','None'), ...                         %<--
            audioPluginParameter('GainMid', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...                                     %<--
                'Layout',[2,2;4,2], ...                                    %<--
                'DisplayNameLocation','None'), ...                         %<--
            audioPluginParameter('FreqMid', ...
                'Label','Hz', ...
                'Mapping',{'log',500,3e3}, ...
                'Style','rotaryknob', ...                                  %<--
                'Layout',[5,2], ...                                        %<--
                'DisplayNameLocation','None'), ...                         %<--
            audioPluginParameter('GainHigh', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...                                     %<--
                'Layout',[2,3;4,3], ...                                    %<--
                'DisplayName','High','DisplayNameLocation','Above'), ...   %<--
            audioPluginParameter('FreqHigh', ...
                'Label','Hz', ...
                'Mapping',{'log',3e3,20e3}, ...
                'Style','rotaryknob', ...                                  %<--
                'Layout',[5,3], ...                                        %<--
                'DisplayNameLocation','None'), ...                         %<--
            audioPluginParameter('Volume', ...
                'Mapping',{'lin',0,2}, ...
                'Style','rotaryknob', ...                                  %<--
                'Layout',[3,5], ...                                        %<--
                'DisplayNameLocation','Above'), ...                        %<--
            audioPluginParameter('Enable', ...
                'Style','vtoggle', ...                                     %<--
                'Layout',[5,5], ...                                        %<--
                'DisplayNameLocation','None'), ...                         %<--
                ...
            audioPluginGridLayout( ...                                     %<--
                'RowHeight',[20,20,160,20,100], ...                        %<--
                'ColumnWidth',[100,100,100,50,150])                        %<--
    end
    ... % omitted for example purposes
end

Layout и DisplayNameLocation определено в audioPluginParameters отображает соответствующие параметры на управляющую сетку следующим образом:

Звонить parameterTuner для визуализации пользовательского интерфейса equalizerV2.

parameterTuner(equalizerV2)

Фоновое изображение и цвет

Чтобы настроить фон пользовательского интерфейса, укажите BackgroundImage и BackgroundColor в audioPluginInterface.

BackgroundColor может быть указана как короткая или длинная строка имени цвета или как триплет RBG. Посмотрите ColorSpec (Color Specification) для получения подробной информации. При указании BackgroundColor, цвет применяется ко всему пространству пользовательского интерфейса, за исключением пространства, занятого элементами управления или BackgroundImage. Если элемент управления или фоновое изображение содержит прозрачность, то цвет фона отображается через прозрачность.

BackgroundImage может быть указан как файл PNG, GIF или JPG. Изображение наносится на сетку пользовательского интерфейса путем выравнивания верхних левых углов сетки пользовательского интерфейса и изображения. Если изображение больше размера сетки пользовательского интерфейса, определенного в audioPluginGridLayoutзатем изображение обрезается до размера сетки пользовательского интерфейса. Размер фонового изображения не изменяется. Если изображение меньше сетки пользовательского интерфейса, то незанятые области сетки пользовательского интерфейса считаются прозрачными.

В этом примере выполняется увеличение заполнения по периметру сетки для создания пространства для логотипа MathWorks ®. Вы можете вычислить общую ширину сетки UI как сумма всей ширины столбцов плюс левая и правая набивка плюс интервал колонки (интервал колонки по умолчанию 10 в этом примере используются пикселы): (100 + 100 + 100 + 50 + 150) + (20 + 20) + (4 × 10) = 580. Общая высота сетки пользовательского интерфейса равна сумме всех высот строк плюс верхняя и нижняя заливка плюс интервал между строками (в этом примере используется интервал между строками 10 пикселов по умолчанию): (20 + 20 + 160 + 20 + 100) + (20 + 120) + (4 × 10) = 500. Чтобы разместить логотип в нижней части сетки пользовательского интерфейса, используйте изображение размером 580 на 500:

classdef equalizerV3 < audioPlugin
    ... % omitted for example purposes
    properties (Constant)
        PluginInterface = audioPluginInterface( ...
            audioPluginParameter('GainLow', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,1;4,1], ...
                'DisplayName','Low','DisplayNameLocation','Above'), ...
            audioPluginParameter('FreqLow', ...
                'Label','Hz', ...
                'Mapping',{'log',20,500}, ...
                'Style','rotaryknob', ...
                'Layout',[5,1], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('GainMid', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,2;4,2], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('FreqMid', ...
                'Label','Hz', ...
                'Mapping',{'log',500,3e3}, ...
                'Style','rotaryknob', ...
                'Layout',[5,2], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('GainHigh', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,3;4,3], ...
                'DisplayName','High','DisplayNameLocation','Above'), ...
            audioPluginParameter('FreqHigh', ...
                'Label','Hz', ...
                'Mapping',{'log',3e3,20e3}, ...
                'Style','rotaryknob', ...
                'Layout',[5,3], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('Volume', ...
                'DisplayName','Volume', ...
                'Mapping',{'lin',0,2}, ...
                'Style','rotaryknob', ...
                'Layout',[3,5], ...
                'DisplayNameLocation','Above'), ...
            audioPluginParameter('Enable', ...
                'Style','vtoggle', ...
                'Layout',[5,5], ...
                'DisplayNameLocation','None'), ...
                ...
            audioPluginGridLayout( ...
                'RowHeight',[20,20,160,20,100], ...
                'ColumnWidth',[100,100,100,50,150], ...
                'Padding',[20,120,20,20]), ...                             %<--
                ...
            'BackgroundImage','background.png', ...                        %<--
            'BackgroundColor',[210/255,210/255,210/255])                   %<--
    end
    ... % omited for example purposes
end

Звонить parameterTuner для визуализации пользовательского интерфейса equalizerV3.

parameterTuner(equalizerV3)

Настраиваемый элемент управления Filmstrips

Для использования пользовательских пленочных полос укажите пары имя-значение Filmstrip и FilmstripFrameSize в audioPluginParameter. Пленочная полоса может быть файлом PNG, GIF или JPG и должна состоять из кадров, расположенных сквозно либо вертикально, либо горизонтально. В соответствии с диапазоном элемента управления, при настройке параметров на плагинном интерфейсе пользователя отображается соответствующий кадр. В этом примере укажите двухкадровую полосу для Enable параметр. В качестве наилучшей практики размер каждого кадра кинопленки должен быть равен размеру области, занятой параметром. Enable параметр занимает одну ячейку размером 150 на 100 пикселей. Чтобы создать вертикальную полоску, где каждый кадр 150 на 100, сделайте общий размер полоски 150 на 200 и установите FilmstripFrameSize кому [150,100]. Пленочная полоса, используемая в этом примере, сначала содержит кадр, соответствующий позиции выключения, затем позиции включения:

classdef equalizerV4 < audioPlugin
    ... % omitted for example purposes
    properties (Constant)
        PluginInterface = audioPluginInterface( ...
            audioPluginParameter('GainLow', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,1;4,1], ...
                'DisplayName','Low','DisplayNameLocation','Above'), ...
            audioPluginParameter('FreqLow', ...
                'Label','Hz', ...
                'Mapping',{'log',20,500}, ...
                'Style','rotaryknob', ...
                'Layout',[5,1], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('GainMid', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,2;4,2], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('FreqMid', ...
                'Label','Hz', ...
                'Mapping',{'log',500,3e3}, ...
                'Style','rotaryknob', ...
                'Layout',[5,2], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('GainHigh', ...
                'Label','dB', ...
                'Mapping',{'lin',-20,20}, ...
                'Style','vslider', ...
                'Layout',[2,3;4,3], ...
                'DisplayName','High','DisplayNameLocation','Above'), ...
            audioPluginParameter('FreqHigh', ...
                'Label','Hz', ...
                'Mapping',{'log',3e3,20e3}, ...
                'Style','rotaryknob', ...
                'Layout',[5,3], ...
                'DisplayNameLocation','None'), ...
            audioPluginParameter('Volume', ...
                'Mapping',{'lin',0,2}, ...
                'Style','rotaryknob', ...
                'Layout',[3,5], ...
                'DisplayNameLocation','Above'), ...
            audioPluginParameter('Enable', ...
                'Style','vtoggle', ...
                'Layout',[5,5], ...
                'DisplayNameLocation','None', ...
                'Filmstrip','vtoggle.png', ...                             %<--
                'FilmstripFrameSize',[150,100]), ...                       %<--
                ...
            audioPluginGridLayout( ...
                'RowHeight',[20,20,160,20,100], ...
                'ColumnWidth',[100,100,100,50,150], ...
                'Padding',[20,120,20,20]), ...
                ...
            'BackgroundImage','background.png', ...
            'BackgroundColor',[210/255,210/255,210/255])
    end
    ... % omitted for example purposes
end

Кинопленки не поддерживаются parameterTuner. Чтобы увидеть пользовательский интерфейс подключаемого модуля, необходимо развернуть подключаемый модуль в DAW. Использовать generateAudioPlugin для создания подключаемого модуля VST.

generateAudioPlugin equalizerV4
.......

В этом примере плагин был открыт в REAPER. Ниже показан снимок экрана пользовательского интерфейса в REAPER.

Связанные темы

См. также

| | | | |