MATLAB에서 IR (Impulse Response) Speaker Simulator VST Plugin 3

Impulse Response(IR)로부터 응답 특성의 시스템 동정을 실시해, 동등한 특성의 이펙트를 만들어 보는 이야기의 제3탄으로, 드디어 VST Plugin을 생성했다.

이전 기사



MATLAB에서 IR (Impulse Response) Speaker Simulator VST Plugin 1
MATLAB에서 IR (Impulse Response) Speaker Simulator VST Plugin 2

MATLAB Class



MATLAB에서 VST Plugin을 생성하려면 클래스 파일을 만들어야합니다. 이것은 통상의 함수형의 MATLAB 파일이 아니고, 객체 지향으로 쓴 코드로, propertiers, methods에 각종 속성이 있거나, 문법이 약간 다르거나 해 조금 어렵다.
부모 클래스를 계승하고, 기능을 계승한다는 개념이 있어, 그것을 행두에 쓴다.
예를 들어 신호 처리용 클래스 System Object와 VST Plugin 생성에 필요한 audioPlugin을 상속하면 이런 느낌.
classdef IRSpeakerSim < matlab.System & audioPlugin 
end

System Object는 Simulink에 가져올 수 있고, 안에서 System Object 클래스(dsp.FIRFilter)를 사용하고 있거나, setup/step/reset과 같은 메소드가 미리 정의되어 있어 사용하기 쉽기 때문에 사용하고 있다.

처리용 코드는 단 1행
out = step(obj.hFilter, in, temp)*10^(obj.inputVol/20);

하지만, VST Plugin으로 했을 때의 파라미터 등등 넣으면 이런 코드가 되었다.
classdef IRSpeakerSim < matlab.System & audioPlugin 
    properties
        SpeakerType = 'VHTVintage2x12';
        inputVol = 0;
    end
    properties (Constant)
        PluginInterface = audioPluginInterface(...
            'PluginName', 'IR Speaker Simulator', ...
            'InputChannels', 1, ...
            'OutputChannels', 1, ...
            'VendorName', 'SacredTubes', ...
            'VendorVersion', '1.0.0', ...
            audioPluginParameter('SpeakerType','DisplayName', 'Speaker Type', 'Label', 'Type', 'Mapping',...
            {'enum', 'VHTVintage2x12', 'BoogieRectiVintage2x12', 'BoogieRectiModern2x12', 'SealedVintage4x12',...
            'OpenVintage2x12'},'Layout',[2,2], 'DisplayNameLocation','Left'),...
            audioPluginParameter('inputVol','DisplayName', 'Input Volume', ...
            'Label', 'dB', 'Mapping', {'lin',-20,+20},...
            'Style','rotaryknob', 'Layout',[4, 2], 'DisplayNameLocation','Left'),...
            audioPluginGridLayout('RowHeight',[20,20 20 150 10],...
                'ColumnWidth',[100 200])...
            )
    end
    properties(Access = private)
        hFilter
        num
    end

    methods
        % Constructor
        function obj = IRSpeakerSim(varargin)
            % Support name-value pair arguments when constructing object
            setProperties(obj,nargin,varargin{:})
        end
    end

    methods(Access = protected)
        %% Common functions
        function setupImpl(obj)
            % Perform one-time calculations, such as computing constants
            obj.hFilter = dsp.FIRFilter('NumeratorSource', 'Input port');
            temp = coder.load('filterCoef.mat');
            % temp.num = [ones(5,1) zeros(5, 10)];    % for test
            obj.num = temp.num;

        end

        function out = stepImpl(obj,in)
            % Implement algorithm. Calculate y as a function of input u and
            % discrete states.
            switch obj.SpeakerType
                case 'VHTVintage2x12'
                    spSel = 1;
                case 'BoogieRectiVintage2x12'
                    spSel = 2;
                case 'BoogieRectiModern2x12'
                    spSel = 3;
                case 'SealedVintage4x12'
                    spSel = 4;
                case 'OpenVintage2x12'
                    spSel = 5;
                otherwise
                    spSel = 1;
            end
            temp = obj.num(spSel, :);
            out = step(obj.hFilter, in, temp)*10^(obj.inputVol/20);
        end

        function resetImpl(obj)
            % Initialize / reset discrete-state properties
            reset(obj.hFilter);
        end
    end
end

오디오 신호를 입력하고 테스트



우선 이것에 음악 신호를 입력하여 테스트한다.
시험은>> audioTestBench에서 테스트 벤치를 시작. 아래와 같은 GUI가 나오고, 입출력 파일/디바이스를 설정해 테스트할 수 있다.


VST Plugin 생성



제대로 동작하면 드디어 플러그인 생성. 단지 이것만으로 VST Effect를 만들 수 있습니다. . .>> generateAudioPlugin('IRSpeakerSim')
코드에 에러가 없으면 폴더에 VST Plugin의 파일 *.dll이 생성되고 있으므로, 그것을 DAW의 Effect용 폴더에 카피하면 사용할 수 있다.

MATLAB에서 실행하고 있다고 외형은 변하지 않지만, 여기는 DAW상에서 자동 생성된 VST로 이펙트를 걸고 있다.


좋은 웹페이지 즐겨찾기