classdef Proyecto_EQ_exported < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure                       matlab.ui.Figure
        TabGroup                       matlab.ui.container.TabGroup
        ArchivoTab                     matlab.ui.container.Tab
        ExportararchivoButton          matlab.ui.control.Button
        ReproduciendoButtonGroup       matlab.ui.container.ButtonGroup
        FiltradaButton                 matlab.ui.control.RadioButton
        OriginalButton                 matlab.ui.control.RadioButton
        EstereoMonoLabel               matlab.ui.control.Label
        BitspormuestraLabel            matlab.ui.control.Label
        FrecuenciademuestreoLabel      matlab.ui.control.Label
        DuracionLabel                  matlab.ui.control.Label
        NombredelarchivoLabel          matlab.ui.control.Label
        Button                         matlab.ui.control.Button
        ResumeButton                   matlab.ui.control.Button
        PauseButton                    matlab.ui.control.Button
        PlayButton                     matlab.ui.control.Button
        SeleccioneunarchivowavButton   matlab.ui.control.Button
        Image                          matlab.ui.control.Image
        DesarrolladoporAlejandroPalmaZuazaLabel_2  matlab.ui.control.Label
        UIAxes                         matlab.ui.control.UIAxes
        EQTab                          matlab.ui.container.Tab
        freccorteSliderLabel_2         matlab.ui.control.Label
        freccorteSlider_3              matlab.ui.control.Slider
        Lamp_4                         matlab.ui.control.Lamp
        Lamp_3                         matlab.ui.control.Lamp
        Lamp_2                         matlab.ui.control.Lamp
        Lamp                           matlab.ui.control.Lamp
        FILTRARButton                  matlab.ui.control.Button
        GainKnob_3Label_2              matlab.ui.control.Label
        GainKnob_3                     matlab.ui.control.Knob
        Switch_3                       matlab.ui.control.Switch
        BWEditField                    matlab.ui.control.NumericEditField
        BWEditFieldLabel               matlab.ui.control.Label
        dBoctavaDropDown               matlab.ui.control.DropDown
        dBoctavaDropDownLabel          matlab.ui.control.Label
        Switch_2                       matlab.ui.control.Switch
        Switch                         matlab.ui.control.Switch
        GainKnob_2                     matlab.ui.control.Knob
        GainKnob_2Label                matlab.ui.control.Label
        freccentralSlider              matlab.ui.control.Slider
        freccentralSliderLabel         matlab.ui.control.Label
        GainKnob                       matlab.ui.control.Knob
        GainKnobLabel                  matlab.ui.control.Label
        freccorteSlider                matlab.ui.control.Slider
        freccorteSliderLabel           matlab.ui.control.Label
        HFLabel                        matlab.ui.control.Label
        MFLabel                        matlab.ui.control.Label
        LFLabel                        matlab.ui.control.Label
        Image_2                        matlab.ui.control.Image
        DesarrolladoporAlejandroPalmaZuazaLabel_3  matlab.ui.control.Label
        UIAxes2                        matlab.ui.control.UIAxes
        EspectroentiemporealTab        matlab.ui.container.Tab
        Image2                         matlab.ui.control.Image
        ResumeButton_3                 matlab.ui.control.Button
        PlayButton_3                   matlab.ui.control.Button
        ReproduccionportrozosLabel     matlab.ui.control.Label
        TiempodereproduccinsEditField  matlab.ui.control.NumericEditField
        TiempodereproduccinsEditFieldLabel  matlab.ui.control.Label
        Button_2                       matlab.ui.control.Button
        ResumeButton_2                 matlab.ui.control.Button
        PauseButton_2                  matlab.ui.control.Button
        PlayButton_2                   matlab.ui.control.Button
        Image_3                        matlab.ui.control.Image
        DesarrolladoporAlejandroPalmaZuazaLabel_4  matlab.ui.control.Label
        UIAxes3                        matlab.ui.control.UIAxes
    end

    
    properties (Access = private)
        signal_entrada          %Senal del audio original
        signal_filtrada         %Senal despues del filtrado
        signal_a_reproducir     %Senal para reproducir
        fs                      %Frecuencia de muestreo
        reproductor             %Reproductor
        archivo                 %Archivo de entrada
        canales                 %Numero de canales del audio
        lf_switch               %Asociado al on/off del LF
        mf_switch               %Asociado al on/off del MF
        hf_switch               %Asociado al on/off del HF
        pendiente               %Pendiente seleccionada por el usuario
        contador                %Contador para ir actualizando la forma de onda
        time                    %Asociado al marcador de tiempo en la forma de onda
        indices_time            %Indices por donde pasa el marcador de tiempo en la forma de onda
        muestra_a_marcar        %Muestra actual para marcar
        hline                   %Linea que marca por donde va el reproductor
        % Description
    end
    
    methods (Access = private)
        
        function pinta(app)                                                                 %Funcion para el espectro en tiempo real
            cla(app.UIAxes3);                                                               %Borramos la anterior grafica si hubiera alguna

            f = (1:1024/2)*(app.fs/1024);                                                   %Creamos el vector de frecuencia 
            linea_a_actualizar = line(app.UIAxes3, 'XData', f, 'YData', zeros(size(f)), 'Color', 'b'); %Establecemos parametros de la grafica
            nfft = 1024;                                                                    %Tamano de la fft
            i = 1;
            app.hline = xline(app.UIAxes, app.time(i), '--r', 'LineWidth', 1.5);            %Linea vertical en rojo
            
            while isplaying(app.reproductor)                                                %Bucle que pintara solo cuando se este reproduciendo audio

                muestra_actual = app.reproductor.CurrentSample;                             %Seleccionamos la muestra actual
                
                if muestra_actual > (app.contador*app.fs)                                   %Condicion para actualizar los limites 
                    xlim(app.UIAxes, [app.contador, 5+app.contador]);                       %de la forma de onda. Cuando se reproduzca una muestra
                    app.contador = app.contador+5;                                          %fuera del limite actual, lo actualizamos de 5 en 5 seg
                end
                
                if muestra_actual > (app.muestra_a_marcar(i))                               %Si la muestra actual ya no es la muestra que hay que marcar
                    delete(app.hline);                                                      %Borramos la marca anterior  
                    app.hline = xline(app.UIAxes, app.time(app.muestra_a_marcar(i)), '--r', 'LineWidth', 1.5); %Ponemos la nueva marca
                    if i < length(app.muestra_a_marcar)                     
                        i = i+1;                                                            %Actualizamos la muestra a marcar
                    end
                end


                comienzo = max(muestra_actual-nfft+1,1);                                    %Establecemos el comienzo del bloque a procesar
                fin = min(muestra_actual, length(app.signal_a_reproducir));                 %Establecemos el final del bloque a procesar

                bloque = app.signal_a_reproducir(comienzo:fin);                             %Marcamos el bloque a procesar
                transformada = fft(bloque, nfft);                                           %Le hacemos la fft al bloque
                transformada_a_pintar = abs(transformada);                                  %Nos quedamos con el valor absoluto
                transformada_a_pintar = transformada_a_pintar(1:nfft/2);                    %Nos quedamos con la mitad ya que la otra mitad es una replica
                
                transformada_a_pintar = 20*log10(transformada_a_pintar);                    %Los pasamos a dB, con el maximo siendo 0 dB

                set(linea_a_actualizar, 'YData', transformada_a_pintar);                    %Actualizamos la linea a pintar
                

                drawnow                                                                     %Para actualizar la figura y callbacks
   
            end
        end
        
        %Funcion que se activa cuando termina el timer

        function f_temp(app)   

                pause(app.reproductor);     %Paramos el reproductor

        end

    end
    
    methods (Access = public)
        
        %Funcion para tomar los puntos de la respuesta en frecuencia del filtro
        function y = filtrar(app, frec)

            y = arrayfun(@(xi) equ(app, xi), frec);

        end
        

        %Funcion que pinta la respuesta en frecuencia marcada por el
        %usuario
        function y = equ(app,frec)
            %Estos bloques de if/elseif son para asignar el valor 0 a los
            %knobs de frecuencia cuando estos no estan activados

            if (app.lf_switch == 0) && (app.mf_switch == 0) && (app.hf_switch == 0)
                app.GainKnob.Value = 0;
                app.GainKnob_2.Value = 0;
                app.GainKnob_3.Value = 0;

            elseif app.lf_switch == 1 && app.mf_switch == 0 && app.hf_switch == 0
                app.GainKnob_2.Value = 0;
                app.GainKnob_3.Value = 0;

            elseif app.lf_switch == 0 && app.mf_switch == 0 && app.hf_switch == 1
                app.GainKnob.Value = 0;
                app.GainKnob_2.Value = 0;

            elseif app.lf_switch == 1 && app.mf_switch == 0 && app.hf_switch == 1
                app.GainKnob_2.Value = 0;

            elseif app.lf_switch == 1 && app.mf_switch == 1 && app.hf_switch == 0
                app.GainKnob_3.Value = 0;

            elseif app.lf_switch == 0 && app.mf_switch == 1 && app.hf_switch == 1
                app.GainKnob.Value = 0;

                
            elseif app.lf_switch == 0 && app.mf_switch == 1 && app.hf_switch == 0
                app.GainKnob.Value = 0;
                app.GainKnob_3.Value = 0;

            else
            end

                puntomedio1 = (app.freccorteSlider.Value+(app.freccentralSlider.Value-(app.BWEditField.Value/2)))/2;    %Primer punto medio
                puntomedio2 = ((app.freccentralSlider.Value+(app.BWEditField.Value/2))+app.freccorteSlider_3.Value)/2;  %Segundo punto medio
                %hasta la linea 204 asignamos el valor del knob a cada zona
                %frecuencial marcada
                if abs(frec) <= app.freccorteSlider.Value
                    y = app.GainKnob.Value;
                elseif (abs(frec) > (app.freccentralSlider.Value-(app.BWEditField.Value/2))) && (abs(frec) < (app.freccentralSlider.Value+(app.BWEditField.Value/2)))
                    y = app.GainKnob_2.Value;
                elseif abs(frec) > app.freccorteSlider_3.Value
                    y = app.GainKnob_3.Value;

                %A partir de aquí es para unir cada zona de forma correcta
                %(LF, MF y HF)
                %Desde el final de LF hasta el punto medio 1 -200 Hz
                elseif (abs(frec) > app.freccorteSlider.Value) && (abs(frec) < puntomedio1-200)
                    %los max y los min son para que cuando la grafica
                    %tienda siempre a cero y no supere dicho valor por
                    %encima o por abajo.
                   
                    if app.GainKnob.Value > 0
                        y = max(0, app.GainKnob.Value-app.pendiente*log2(abs(frec)/app.freccorteSlider.Value));
                    else
                        y = min(0, app.GainKnob.Value+app.pendiente*log2(abs(frec)/app.freccorteSlider.Value));
                    end

                %Desde el punto medio 1 + 200 Hz hasta el principio de MF
                elseif (abs(frec) > puntomedio1+200) && (abs(frec) < (app.freccentralSlider.Value-(app.BWEditField.Value/2)))
                    if app.GainKnob_2.Value > 0
                        y = max(0, app.GainKnob_2.Value+app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value-(app.BWEditField.Value/2))));
                    else
                        y = min(0, app.GainKnob_2.Value-app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value-(app.BWEditField.Value/2))));
                    end
                
                %Desde el punto medio 1 - 200 Hz hasta el punto medio 1 +
                %200 Hz, para unir el tramo restante. 

                elseif (abs(frec) >= puntomedio1-200) && (abs(frec) <= puntomedio1+200)
                    if app.GainKnob.Value > 0
                        valor1 = max(0, app.GainKnob.Value-app.pendiente*log2(abs(puntomedio1-201)/app.freccorteSlider.Value));
                    else 
                        valor1 = min(0, app.GainKnob.Value+app.pendiente*log2(abs(puntomedio1-201)/app.freccorteSlider.Value));
                    end
                    if app.GainKnob_2.Value > 0
                        valor2 = max(0, app.GainKnob_2.Value+app.pendiente*log2(abs(puntomedio1+201)/(app.freccentralSlider.Value-(app.BWEditField.Value/2))));
                    else 
                        valor2 = min(0, app.GainKnob_2.Value-app.pendiente*log2(abs(puntomedio1+201)/(app.freccentralSlider.Value-(app.BWEditField.Value/2))));
                    end
                    
                    %Mediante valor 1 y valor 2 sacamos la pendiente de
                    %la recta que une ambos puntos
                    m = (valor2-valor1)/((puntomedio1+201)-(puntomedio1-201));
                    n = valor1-(m*(puntomedio1-201));

                    y = m*abs(frec)+n;
                    
                %Desde el final de MF hasta el punto medio 2 - 350 Hz.     
                elseif (abs(frec) > app.freccentralSlider.Value+(app.BWEditField.Value/2)) && (abs(frec) < puntomedio2-350)
                    if app.GainKnob_2.Value > 0
                        y = max(0, app.GainKnob_2.Value-app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value+(app.BWEditField.Value/2))));
                    else
                        y = min(0, app.GainKnob_2.Value+app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value+(app.BWEditField.Value/2))));                        
                    end
                
                %Desde el punto medio 2 + 350 Hz hasta el principio de HF
                elseif (abs(frec) > puntomedio2+350) && (abs(frec) < app.freccorteSlider_3.Value)
                    if app.GainKnob_3.Value > 0
                        y = max(0, app.GainKnob_3.Value+app.pendiente*log2(abs(frec)/(app.freccorteSlider_3.Value)));
                    else
                        y = min(0, app.GainKnob_3.Value-app.pendiente*log2(abs(frec)/(app.freccorteSlider_3.Value)));
                    end
                
                %Desde el punto medio 2 - 350 Hz hasta el punto medio 2 +
                %350 Hz, uniendo el tramo restante.
                elseif (abs(frec) >= puntomedio2-350) && (abs(frec) <= puntomedio2+350)
                    if app.GainKnob_2.Value > 0
                        valor1 = max(0, app.GainKnob_2.Value-app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value+(app.BWEditField.Value/2))));
                    else
                        valor1 = min(0, app.GainKnob_2.Value+app.pendiente*log2(abs(frec)/(app.freccentralSlider.Value+(app.BWEditField.Value/2))));                        
                    end
                    if app.GainKnob_3.Value > 0
                        valor2 = max(0, app.GainKnob_3.Value+app.pendiente*log2(abs(frec)/(app.freccorteSlider_3.Value)));
                    else
                        valor2 = min(0, app.GainKnob_3.Value-app.pendiente*log2(abs(frec)/(app.freccorteSlider_3.Value)));
                    end

                    %Mediante valor 1 y valor 2 sacamos la pendiente de
                    %la recta que une ambos puntos
                    m = (valor2-valor1)/((puntomedio2+351)-(puntomedio2-351));
                    n = valor1-(m*(puntomedio2-351));

                    y = m*abs(frec)+n;
                else 
                    y = 0;
                end
        end


    end
    

    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            app.UIFigure.WindowState = 'maximized';         %Maximizamos la vista del programa al abrirse
        end

        % Button pushed function: SeleccioneunarchivowavButton
        function SeleccioneunarchivowavButtonPushed(app, event)
            app.archivo = uigetfile('.wav', 'Seleccione un archivo .wav');      %Para seleccionar el archivo
            info = audioinfo(app.archivo);                                      %Guardamos info del archivo
            [app.signal_entrada, app.fs] = audioread(app.archivo);              %Leemos el archivo de audio y lo guardamos

            app.NombredelarchivoLabel.Text = ['Nombre del archivo: ', app.archivo];    %Mostramos el nombre

            min = floor(info.Duration/60);
            seg = mod(info.Duration, 60);
            app.DuracionLabel.Text = sprintf('Duracion: %d:%02d', min, floor(seg)); %Mostramos la duracion en minutos

            app.FrecuenciademuestreoLabel.Text = ['Frecuencia de muestreo: ', num2str(info.SampleRate), ' Hz']; %Mostramos la fs

            app.BitspormuestraLabel.Text = ['Bits por muestra: ', num2str(info.BitsPerSample), ' bits']; %Mostramos los bits por muestra

            app.canales = 1;
            if size(app.signal_entrada, 2) == 2                         %Detectamos si el audio es mono o estereo
                app.canales = 2;
            end
            
            if app.canales == 1                                             %Mostramos si es mono o estereo
                app.EstereoMonoLabel.Text = 'Estereo / Mono: Mono';
            else 
                app.EstereoMonoLabel.Text = 'Estereo / Mono: Estereo';
            end
           
            app.time = linspace(0, info.Duration, length(app.signal_entrada)); %Vector de tiempo

            app.indices_time = 0.1:0.1:info.Duration;                           %Vector de tiempo cada 0.1 segundo
            app.muestra_a_marcar = round(app.indices_time * (length(app.signal_entrada) - 1) / info.Duration) + 1; 
            %Obtenemos la muestra a marcar correspondiente a cada 0.1
            %segundo.

            app.hline = xline(app.UIAxes, app.time(1), '--r', 'LineWidth', 1.5); %Marcamos la muestra actual con una línea en rojo
                                                                                 %en la forma de onda
            
            
            
            app.contador = 1;                                                   %Contador para actualizar los límites de la forma de onda
            xlim(app.UIAxes, [0, 5]);                                           %Seteamos los limites iniciales, hasta 5 segundos
            plot(app.UIAxes, app.time, (app.signal_entrada(:,1))');             %Pintamos la forma de onda de la senal


            
            app.signal_a_reproducir = app.signal_entrada;                   %Establecemos la senal que se va a reproducir
            app.reproductor = audioplayer(app.signal_a_reproducir, app.fs); %Le decimos al reproductor que senal utilizar
            
            

            app.lf_switch = 0;                  %Seteamos los switches a 0
            app.mf_switch = 0;
            app.hf_switch = 0;

            
            
        end

        % Button pushed function: PlayButton
        function PlayButtonPushed(app, event)
            play(app.reproductor);                  %Empieza a sonar la señal
            app.contador = 5;                       %Seteamos el contador de los limites de la forma de onda
            xlim(app.UIAxes, [0, 5]);               %Establecemos los limite iniciales
            delete(app.hline);                      %borramos alguna posible marca anterior
            pinta(app);                             %Llamamos a la funcion que nos pinta el espectro en tiempo real
        end

        % Button pushed function: PauseButton
        function PauseButtonPushed(app, event)
            pause(app.reproductor);                 %Paramos la reproducion
        end

        % Button pushed function: ResumeButton
        function ResumeButtonPushed(app, event)
            resume(app.reproductor);                %Continua reproduciendo la señal por donde la dejamos
            delete(app.hline);                      %borramos alguna posible marca anterior
            pinta(app);                             %Llamamos a la funcion que nos pinta el espectro en tiempo real
        end

        % Button pushed function: Button
        function ButtonPushed(app, event)
            stop(app.reproductor);                  %Detenemos la reproducion
        end

        % Button pushed function: FILTRARButton
        function FILTRARButtonPushed(app, event)
            %Proceso al pulsar el boton de filtrar

            app.Lamp_4.Color = 'r';     %Establecemos la luz a rojo mientras se hace el procesamiento
            drawnow;                    %Para actualizar el color

            %Establecemos el valor de la pendiente segun lo seleccionado
            if strcmp(app.dBoctavaDropDown.Value, '3dB')
                app.pendiente = 3;
            elseif strcmp(app.dBoctavaDropDown.Value, '6dB')
                app.pendiente = 6;
            elseif strcmp(app.dBoctavaDropDown.Value, '9dB')
                app.pendiente = 9;
            else 
                app.pendiente = 12;
            end
            
            %Extramos la señal del canal izquierdo y creamos el vector
            %donde guardaremos el canal filtrado
            canal_izq = app.signal_entrada(:,1)';
            audio_fin_i = zeros(1, length(canal_izq));
            
            %Si el audio es stereo, lo mismo para el derecho
            if app.canales == 2
                canal_der = (app.signal_entrada(:,2))';
                audio_fin_d = zeros(1, length(canal_der));
            end
            
            %Establecemos el contador y el tamaño de los bloques
            i = 1;
            size = 2048;
            
            %Creamos el vector de frecuencia con el mismo tamaño que los
            %bloques
            f = linspace(-app.fs/2, app.fs/2, size);
            
            %Llamamos a la funcion para guardar en filtro la respuesta en
            %frecuencia 
            filtro = filtrar(app, f);
            filtro = movmean(filtro, 25); %hacemos un suavizado del filtro
            
            cla(app.UIAxes2);       %Limpiamos la gráfica 
            
            plot(app.UIAxes2, f, filtro); %Dibujamos la respuesta en frecuencia
            filtro = 10.^(filtro/10);     %Pasamos de dB a lineal

            ventana = hann(size)';          %Aplicamos una ventana de Hann y 
            solapamiento = size/2;          %solapamiento para que no haya transiciones bruscas entre bloques
        
            while i < length(canal_izq) - solapamiento

                if i > length(canal_izq)-size %Si es el bloque final hacemos lo mismo de antes pero con el tamaño restante
                    size = length(canal_izq)-i;
                    ventana = hann(size)';
                    solapamiento = size/2;
                    f = linspace(-app.fs/2, app.fs/2, size);
                    
                    filtro = filtrar(app, f);
                    
                    filtro = 10.^(filtro/10);
                    
                end

                bloque_i =  canal_izq(i:i+size-1) .* ventana;       %Multiplicamos la ventana por el bloque
                ei = fft(bloque_i);                                 %Le hacemos la fft al bloque
                sfi = ei.*fftshift(filtro);                         %Multiplicamos el bloque por el filtro centrado
                bloque_i_filt = real(ifft(sfi));                    %Le hacemos la ifft al bloque
                audio_fin_i(i:i+size-1) = audio_fin_i(i:i+size-1) + bloque_i_filt;  %Guardamos el bloque en el vector final
                
                %Si el audio es stereo, lo mismo con el canal derecho
                if app.canales == 2
                    bloque_d = canal_der(i:i+size-1).* ventana;
                    ed = fft(bloque_d, size);
                    sfd = ed.*fftshift(filtro);
                    bloque_d_filt = real(ifft(sfd, size));
                    audio_fin_d(i:i+size-1) = audio_fin_d(i:i+size-1) + bloque_d_filt;
                end
                
                %Actualizamos el contador para en vez de empezar al final
                %del ultimo bloque, lo haga a la mitad para evitar la
                %transicion brusca entre bloques

                i = i+size-solapamiento;

            end
            
            %Asignamos toda la señal procesada a la señal filtrada
            if app.canales == 2
                app.signal_filtrada = [audio_fin_i', audio_fin_d'];
            else
                app.signal_filtrada = audio_fin_i';
            end
            
            
            app.signal_filtrada = app.signal_filtrada/max(app.signal_filtrada); %Normalizamos la señal 
            app.signal_a_reproducir = app.signal_filtrada;                      %Decimos que la señal a reproducir sea la filtrada
            app.reproductor = audioplayer(app.signal_a_reproducir, app.fs);     %Actualizamos el reproductor
            app.Lamp_4.Color = 'g';                                             %Cambiamos el color a verde


        end

        % Value changed function: Switch
        function SwitchValueChanged(app, event)
            %Si el switch de LF esta encendido o apagado lo asociamos a
            %verde o rojo y a 0 o 1 de valor
            value = app.Switch.Value;
            
            if strcmp(value, 'Off')
                app.lf_switch = 0;
                app.Lamp.Color = 'r';
            else 
                app.lf_switch = 1;
                app.Lamp.Color = 'g';
            end
            
        end

        % Value changed function: Switch_2
        function Switch_2ValueChanged(app, event)
            %Si el switch de MF esta encendido o apagado lo asociamos a
            %verde o rojo y a 0 o 1 de valor
            value = app.Switch_2.Value;
            
            if strcmp(value, 'Off')
                app.mf_switch = 0;
                app.Lamp_2.Color = 'r';
            else
                app.mf_switch = 1;
                app.Lamp_2.Color = 'g';
            end

        end

        % Value changed function: Switch_3
        function Switch_3ValueChanged(app, event)
            %Si el switch de HF esta encendido o apagado lo asociamos a
            %verde o rojo y a 0 o 1 de valor
            value = app.Switch_3.Value;

            if strcmp(value, 'Off')
                app.hf_switch = 0;
                app.Lamp_3.Color = 'r';
            else
                app.hf_switch = 1;
                app.Lamp_3.Color = 'g';
            end
            
        end

        % Selection changed function: ReproduciendoButtonGroup
        function ReproduciendoButtonGroupSelectionChanged(app, event)
            %Seleccionamos si la señal a reproducir es la original o la
            %filtrada
            selectedButton = app.ReproduciendoButtonGroup.SelectedObject;
            if strcmp(selectedButton.Text, 'Filtrada')
                app.signal_a_reproducir = app.signal_filtrada;     
            else 
                app.signal_a_reproducir = app.signal_entrada;
            end
            app.reproductor = audioplayer(app.signal_a_reproducir, app.fs);

        end

        % Button pushed function: ExportararchivoButton
        function ExportararchivoButtonPushed(app, event)
            %Exportamos el archivo filtrado
            [filename, filepath] = uiputfile('*.wav', 'Guardar archivo de audio como');

            FullFileName = fullfile(filepath, filename);
            audiowrite(FullFileName, app.signal_filtrada, app.fs);


        end

        % Button pushed function: PlayButton_2
        function PlayButton_2Pushed(app, event)
            %Boton de play duplicado en el RTA
            play(app.reproductor);
            app.contador = 5;
            xlim(app.UIAxes, [0, 5]);
            delete(app.hline);
            pinta(app);
        end

        % Button pushed function: PauseButton_2
        function PauseButton_2Pushed(app, event)
            %Boton de pause duplicado en el RTA
            pause(app.reproductor);
        end

        % Button pushed function: ResumeButton_2
        function ResumeButton_2Pushed(app, event)
            %Boton de resume duplicado en el RTA
            resume(app.reproductor);
            delete(app.hline);
            pinta(app);
        end

        % Button pushed function: Button_2
        function Button_2Pushed(app, event)
            %Boton de stop duplicado en el RTA
            stop(app.reproductor);
        end

        % Button pushed function: PlayButton_3
        function PlayButton_3Pushed(app, event)
            %Boton de reproducion de x segundos
            play(app.reproductor);
            app.contador = 5;
            xlim(app.UIAxes, [0, 5]);

            temp = timer;   %Activamos un contador que se detiene tras el tiempo establecido por el usuario
            temp.StartDelay = app.TiempodereproduccinsEditField.Value; %Retardo inicial 
            temp.ExecutionMode = 'singleShot'; %Solo se ejecuta una vez

            temp.TimerFcn = @(~,~) f_temp(app); %Llamamos a f_temp cuando el timer termina
            start(temp);
            delete(app.hline);
            pinta(app);
            
        end

        % Button pushed function: ResumeButton_3
        function ResumeButton_3Pushed(app, event)
            %Exactamente igual que el anterior, pero reproduce desde donde
            %termino el anterior
            resume(app.reproductor);

            temp = timer;
            temp.StartDelay = app.TiempodereproduccinsEditField.Value; % Retardo inicial 
            temp.ExecutionMode = 'singleShot'; % Solo se ejecuta una vez

            temp.TimerFcn = @(~,~) f_temp(app);
            start(temp);
            delete(app.hline);
            pinta(app);

        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Get the file path for locating images
            pathToMLAPP = fileparts(mfilename('fullpath'));

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 1530 792];
            app.UIFigure.Name = 'MATLAB App';

            % Create TabGroup
            app.TabGroup = uitabgroup(app.UIFigure);
            app.TabGroup.Position = [1 1 1531 792];

            % Create ArchivoTab
            app.ArchivoTab = uitab(app.TabGroup);
            app.ArchivoTab.Title = 'Archivo';

            % Create UIAxes
            app.UIAxes = uiaxes(app.ArchivoTab);
            title(app.UIAxes, 'Forma de Onda')
            xlabel(app.UIAxes, 'Tiempo (s)')
            ylabel(app.UIAxes, 'Amplitud')
            zlabel(app.UIAxes, 'Z')
            app.UIAxes.Position = [818 128 617 537];

            % Create DesarrolladoporAlejandroPalmaZuazaLabel_2
            app.DesarrolladoporAlejandroPalmaZuazaLabel_2 = uilabel(app.ArchivoTab);
            app.DesarrolladoporAlejandroPalmaZuazaLabel_2.Position = [1209 0 225 18];
            app.DesarrolladoporAlejandroPalmaZuazaLabel_2.Text = 'Desarrollado por Alejandro Palma Zuaza';

            % Create Image
            app.Image = uiimage(app.ArchivoTab);
            app.Image.Position = [1433 -1 99 95];
            app.Image.ImageSource = fullfile(pathToMLAPP, 'logo_uma.png');

            % Create SeleccioneunarchivowavButton
            app.SeleccioneunarchivowavButton = uibutton(app.ArchivoTab, 'push');
            app.SeleccioneunarchivowavButton.ButtonPushedFcn = createCallbackFcn(app, @SeleccioneunarchivowavButtonPushed, true);
            app.SeleccioneunarchivowavButton.FontName = 'Arial';
            app.SeleccioneunarchivowavButton.FontSize = 18;
            app.SeleccioneunarchivowavButton.FontWeight = 'bold';
            app.SeleccioneunarchivowavButton.Position = [72 688 246 47];
            app.SeleccioneunarchivowavButton.Text = 'Seleccione un archivo wav';

            % Create PlayButton
            app.PlayButton = uibutton(app.ArchivoTab, 'push');
            app.PlayButton.ButtonPushedFcn = createCallbackFcn(app, @PlayButtonPushed, true);
            app.PlayButton.Icon = fullfile(pathToMLAPP, 'Play.png');
            app.PlayButton.Position = [72 128 99 83];
            app.PlayButton.Text = '';

            % Create PauseButton
            app.PauseButton = uibutton(app.ArchivoTab, 'push');
            app.PauseButton.ButtonPushedFcn = createCallbackFcn(app, @PauseButtonPushed, true);
            app.PauseButton.Icon = fullfile(pathToMLAPP, 'Pause.png');
            app.PauseButton.Position = [213 128 99 83];
            app.PauseButton.Text = '';

            % Create ResumeButton
            app.ResumeButton = uibutton(app.ArchivoTab, 'push');
            app.ResumeButton.ButtonPushedFcn = createCallbackFcn(app, @ResumeButtonPushed, true);
            app.ResumeButton.Icon = fullfile(pathToMLAPP, 'Resume.png');
            app.ResumeButton.Position = [358 128 99 83];
            app.ResumeButton.Text = '';

            % Create Button
            app.Button = uibutton(app.ArchivoTab, 'push');
            app.Button.ButtonPushedFcn = createCallbackFcn(app, @ButtonPushed, true);
            app.Button.Icon = fullfile(pathToMLAPP, 'Stop_b.png');
            app.Button.Position = [506 128 99 83];
            app.Button.Text = '';

            % Create NombredelarchivoLabel
            app.NombredelarchivoLabel = uilabel(app.ArchivoTab);
            app.NombredelarchivoLabel.FontSize = 14;
            app.NombredelarchivoLabel.Position = [72 642 713 23];
            app.NombredelarchivoLabel.Text = 'Nombre del archivo:';

            % Create DuracionLabel
            app.DuracionLabel = uilabel(app.ArchivoTab);
            app.DuracionLabel.FontSize = 14;
            app.DuracionLabel.Position = [72 565 713 23];
            app.DuracionLabel.Text = 'Duracion:';

            % Create FrecuenciademuestreoLabel
            app.FrecuenciademuestreoLabel = uilabel(app.ArchivoTab);
            app.FrecuenciademuestreoLabel.FontSize = 14;
            app.FrecuenciademuestreoLabel.Position = [72 484 713 23];
            app.FrecuenciademuestreoLabel.Text = 'Frecuencia de muestreo:';

            % Create BitspormuestraLabel
            app.BitspormuestraLabel = uilabel(app.ArchivoTab);
            app.BitspormuestraLabel.FontSize = 14;
            app.BitspormuestraLabel.Position = [72 385 713 23];
            app.BitspormuestraLabel.Text = 'Bits por muestra:';

            % Create EstereoMonoLabel
            app.EstereoMonoLabel = uilabel(app.ArchivoTab);
            app.EstereoMonoLabel.FontSize = 14;
            app.EstereoMonoLabel.Position = [72 290 713 23];
            app.EstereoMonoLabel.Text = 'Estereo / Mono:';

            % Create ReproduciendoButtonGroup
            app.ReproduciendoButtonGroup = uibuttongroup(app.ArchivoTab);
            app.ReproduciendoButtonGroup.SelectionChangedFcn = createCallbackFcn(app, @ReproduciendoButtonGroupSelectionChanged, true);
            app.ReproduciendoButtonGroup.Title = 'Reproduciendo:';
            app.ReproduciendoButtonGroup.FontSize = 14;
            app.ReproduciendoButtonGroup.Position = [627 127 123 84];

            % Create OriginalButton
            app.OriginalButton = uiradiobutton(app.ReproduciendoButtonGroup);
            app.OriginalButton.Text = 'Original';
            app.OriginalButton.Position = [11 38 63 22];
            app.OriginalButton.Value = true;

            % Create FiltradaButton
            app.FiltradaButton = uiradiobutton(app.ReproduciendoButtonGroup);
            app.FiltradaButton.Text = 'Filtrada';
            app.FiltradaButton.Position = [11 16 65 22];

            % Create ExportararchivoButton
            app.ExportararchivoButton = uibutton(app.ArchivoTab, 'push');
            app.ExportararchivoButton.ButtonPushedFcn = createCallbackFcn(app, @ExportararchivoButtonPushed, true);
            app.ExportararchivoButton.FontName = 'Arial';
            app.ExportararchivoButton.FontSize = 18;
            app.ExportararchivoButton.FontWeight = 'bold';
            app.ExportararchivoButton.Position = [1060 688 166 47];
            app.ExportararchivoButton.Text = 'Exportar archivo';

            % Create EQTab
            app.EQTab = uitab(app.TabGroup);
            app.EQTab.Title = 'EQ';

            % Create UIAxes2
            app.UIAxes2 = uiaxes(app.EQTab);
            title(app.UIAxes2, 'Respuesta en frecuencia')
            xlabel(app.UIAxes2, 'Frecuencia (Hz)')
            ylabel(app.UIAxes2, 'Amplitud (dB)')
            zlabel(app.UIAxes2, 'Z')
            app.UIAxes2.XLim = [20 20000];
            app.UIAxes2.YLim = [-12 12];
            app.UIAxes2.XTick = [20 50 100 200 300 500 700 1000 2000 3000 5000 7000 10000 15000 20000];
            app.UIAxes2.XScale = 'log';
            app.UIAxes2.XTickLabel = {'20'; '50'; '100'; '200'; '300'; '500'; '700'; '1000'; '2000'; '3000'; '5000'; '7000'; '10000'; '15000'; '20000'};
            app.UIAxes2.XMinorTick = 'on';
            app.UIAxes2.YTick = [-12 -9 -6 -3 0 3 6 9 12];
            app.UIAxes2.YTickLabel = {'-12'; '-9'; '-6'; '-3'; '0'; '3'; '6'; '9'; '12'};
            app.UIAxes2.XGrid = 'on';
            app.UIAxes2.XMinorGrid = 'on';
            app.UIAxes2.YGrid = 'on';
            app.UIAxes2.FontSize = 14;
            app.UIAxes2.Position = [578 128 914 537];

            % Create DesarrolladoporAlejandroPalmaZuazaLabel_3
            app.DesarrolladoporAlejandroPalmaZuazaLabel_3 = uilabel(app.EQTab);
            app.DesarrolladoporAlejandroPalmaZuazaLabel_3.Position = [1209 0 225 18];
            app.DesarrolladoporAlejandroPalmaZuazaLabel_3.Text = 'Desarrollado por Alejandro Palma Zuaza';

            % Create Image_2
            app.Image_2 = uiimage(app.EQTab);
            app.Image_2.Position = [1433 -1 99 95];
            app.Image_2.ImageSource = fullfile(pathToMLAPP, 'logo_uma.png');

            % Create LFLabel
            app.LFLabel = uilabel(app.EQTab);
            app.LFLabel.FontSize = 18;
            app.LFLabel.Position = [72 699 26 23];
            app.LFLabel.Text = 'LF';

            % Create MFLabel
            app.MFLabel = uilabel(app.EQTab);
            app.MFLabel.FontSize = 18;
            app.MFLabel.Position = [74 450 31 23];
            app.MFLabel.Text = 'MF';

            % Create HFLabel
            app.HFLabel = uilabel(app.EQTab);
            app.HFLabel.FontSize = 18;
            app.HFLabel.Position = [62 208 29 23];
            app.HFLabel.Text = 'HF';

            % Create freccorteSliderLabel
            app.freccorteSliderLabel = uilabel(app.EQTab);
            app.freccorteSliderLabel.HorizontalAlignment = 'right';
            app.freccorteSliderLabel.FontSize = 14;
            app.freccorteSliderLabel.Position = [41 664 67 22];
            app.freccorteSliderLabel.Text = 'frec. corte';

            % Create freccorteSlider
            app.freccorteSlider = uislider(app.EQTab);
            app.freccorteSlider.Limits = [30 500];
            app.freccorteSlider.Position = [129 673 404 3];
            app.freccorteSlider.Value = 30;

            % Create GainKnobLabel
            app.GainKnobLabel = uilabel(app.EQTab);
            app.GainKnobLabel.HorizontalAlignment = 'center';
            app.GainKnobLabel.Position = [174 485 30 22];
            app.GainKnobLabel.Text = 'Gain';

            % Create GainKnob
            app.GainKnob = uiknob(app.EQTab, 'continuous');
            app.GainKnob.Limits = [-12 12];
            app.GainKnob.Position = [157 541 60 60];

            % Create freccentralSliderLabel
            app.freccentralSliderLabel = uilabel(app.EQTab);
            app.freccentralSliderLabel.HorizontalAlignment = 'right';
            app.freccentralSliderLabel.FontSize = 14;
            app.freccentralSliderLabel.Position = [29 403 78 22];
            app.freccentralSliderLabel.Text = 'frec. central';

            % Create freccentralSlider
            app.freccentralSlider = uislider(app.EQTab);
            app.freccentralSlider.Limits = [1000 3500];
            app.freccentralSlider.Position = [130 429 404 3];
            app.freccentralSlider.Value = 1000;

            % Create GainKnob_2Label
            app.GainKnob_2Label = uilabel(app.EQTab);
            app.GainKnob_2Label.HorizontalAlignment = 'center';
            app.GainKnob_2Label.Position = [169 254 30 22];
            app.GainKnob_2Label.Text = 'Gain';

            % Create GainKnob_2
            app.GainKnob_2 = uiknob(app.EQTab, 'continuous');
            app.GainKnob_2.Limits = [-12 12];
            app.GainKnob_2.Position = [156 302 60 60];

            % Create Switch
            app.Switch = uiswitch(app.EQTab, 'slider');
            app.Switch.ValueChangedFcn = createCallbackFcn(app, @SwitchValueChanged, true);
            app.Switch.Position = [154 701 45 20];

            % Create Switch_2
            app.Switch_2 = uiswitch(app.EQTab, 'slider');
            app.Switch_2.ValueChangedFcn = createCallbackFcn(app, @Switch_2ValueChanged, true);
            app.Switch_2.Position = [156 452 45 20];

            % Create dBoctavaDropDownLabel
            app.dBoctavaDropDownLabel = uilabel(app.EQTab);
            app.dBoctavaDropDownLabel.HorizontalAlignment = 'right';
            app.dBoctavaDropDownLabel.Position = [602 713 58 22];
            app.dBoctavaDropDownLabel.Text = 'dB/octava';

            % Create dBoctavaDropDown
            app.dBoctavaDropDown = uidropdown(app.EQTab);
            app.dBoctavaDropDown.Items = {'3dB', '6dB', '9dB', '12dB'};
            app.dBoctavaDropDown.Position = [675 713 100 22];
            app.dBoctavaDropDown.Value = '3dB';

            % Create BWEditFieldLabel
            app.BWEditFieldLabel = uilabel(app.EQTab);
            app.BWEditFieldLabel.HorizontalAlignment = 'right';
            app.BWEditFieldLabel.Position = [338 321 25 22];
            app.BWEditFieldLabel.Text = 'BW';

            % Create BWEditField
            app.BWEditField = uieditfield(app.EQTab, 'numeric');
            app.BWEditField.Position = [378 321 100 22];

            % Create Switch_3
            app.Switch_3 = uiswitch(app.EQTab, 'slider');
            app.Switch_3.ValueChangedFcn = createCallbackFcn(app, @Switch_3ValueChanged, true);
            app.Switch_3.Position = [154 209 45 20];

            % Create GainKnob_3
            app.GainKnob_3 = uiknob(app.EQTab, 'continuous');
            app.GainKnob_3.Limits = [-12 12];
            app.GainKnob_3.Position = [156 53 60 60];

            % Create GainKnob_3Label_2
            app.GainKnob_3Label_2 = uilabel(app.EQTab);
            app.GainKnob_3Label_2.HorizontalAlignment = 'center';
            app.GainKnob_3Label_2.Position = [172 1 30 22];
            app.GainKnob_3Label_2.Text = 'Gain';

            % Create FILTRARButton
            app.FILTRARButton = uibutton(app.EQTab, 'push');
            app.FILTRARButton.ButtonPushedFcn = createCallbackFcn(app, @FILTRARButtonPushed, true);
            app.FILTRARButton.FontSize = 18;
            app.FILTRARButton.Position = [936 699 217 50];
            app.FILTRARButton.Text = 'FILTRAR';

            % Create Lamp
            app.Lamp = uilamp(app.EQTab);
            app.Lamp.Position = [239 701 20 20];
            app.Lamp.Color = [1 0 0];

            % Create Lamp_2
            app.Lamp_2 = uilamp(app.EQTab);
            app.Lamp_2.Position = [239 452 20 20];
            app.Lamp_2.Color = [1 0 0];

            % Create Lamp_3
            app.Lamp_3 = uilamp(app.EQTab);
            app.Lamp_3.Position = [239 209 20 20];
            app.Lamp_3.Color = [1 0 0];

            % Create Lamp_4
            app.Lamp_4 = uilamp(app.EQTab);
            app.Lamp_4.Position = [1169 713 20 20];
            app.Lamp_4.Color = [1 0 0];

            % Create freccorteSlider_3
            app.freccorteSlider_3 = uislider(app.EQTab);
            app.freccorteSlider_3.Limits = [5000 15000];
            app.freccorteSlider_3.MajorTicks = [5000 7500 10000 12500 15000];
            app.freccorteSlider_3.MajorTickLabels = {'5k', '7.5k', '10k', '12.5k', '15k'};
            app.freccorteSlider_3.Position = [137 168 404 3];
            app.freccorteSlider_3.Value = 5000;

            % Create freccorteSliderLabel_2
            app.freccorteSliderLabel_2 = uilabel(app.EQTab);
            app.freccorteSliderLabel_2.HorizontalAlignment = 'right';
            app.freccorteSliderLabel_2.FontSize = 14;
            app.freccorteSliderLabel_2.Position = [41 159 67 22];
            app.freccorteSliderLabel_2.Text = 'frec. corte';

            % Create EspectroentiemporealTab
            app.EspectroentiemporealTab = uitab(app.TabGroup);
            app.EspectroentiemporealTab.Title = 'Espectro en tiempo real';

            % Create UIAxes3
            app.UIAxes3 = uiaxes(app.EspectroentiemporealTab);
            title(app.UIAxes3, 'Espectro en tiempo real')
            xlabel(app.UIAxes3, 'Frecuencia (Hz)')
            ylabel(app.UIAxes3, 'Amplitud (dB)')
            zlabel(app.UIAxes3, 'Z')
            app.UIAxes3.XLim = [45 22050];
            app.UIAxes3.YLim = [-60 60];
            app.UIAxes3.XTick = [20 50 100 200 300 500 700 1000 2000 3000 5000 7000 10000 15000 20000];
            app.UIAxes3.XScale = 'log';
            app.UIAxes3.XTickLabel = {'20'; '50'; '100'; '200'; '300'; '500'; '700'; '1k'; '2k'; '3k'; '5k'; '7k'; '10k'; '15k'; '20k'};
            app.UIAxes3.XMinorTick = 'on';
            app.UIAxes3.YTick = [-60 -50 -40 -30 -20 -10 0 10 20 30 40 50 60];
            app.UIAxes3.YTickLabelRotation = 0;
            app.UIAxes3.YTickLabel = {'-60'; '-50'; '-40'; '-30'; '-20'; '-10'; '0'; '10'; '20'; '30'; '40'; '50'; '60'};
            app.UIAxes3.XGrid = 'on';
            app.UIAxes3.XMinorGrid = 'on';
            app.UIAxes3.YGrid = 'on';
            app.UIAxes3.FontSize = 14;
            app.UIAxes3.Position = [190 178 1150 568];

            % Create DesarrolladoporAlejandroPalmaZuazaLabel_4
            app.DesarrolladoporAlejandroPalmaZuazaLabel_4 = uilabel(app.EspectroentiemporealTab);
            app.DesarrolladoporAlejandroPalmaZuazaLabel_4.Position = [1209 0 225 18];
            app.DesarrolladoporAlejandroPalmaZuazaLabel_4.Text = 'Desarrollado por Alejandro Palma Zuaza';

            % Create Image_3
            app.Image_3 = uiimage(app.EspectroentiemporealTab);
            app.Image_3.Position = [1433 -1 99 95];
            app.Image_3.ImageSource = fullfile(pathToMLAPP, 'logo_uma.png');

            % Create PlayButton_2
            app.PlayButton_2 = uibutton(app.EspectroentiemporealTab, 'push');
            app.PlayButton_2.ButtonPushedFcn = createCallbackFcn(app, @PlayButton_2Pushed, true);
            app.PlayButton_2.Icon = fullfile(pathToMLAPP, 'Play.png');
            app.PlayButton_2.Position = [190 53 99 83];
            app.PlayButton_2.Text = '';

            % Create PauseButton_2
            app.PauseButton_2 = uibutton(app.EspectroentiemporealTab, 'push');
            app.PauseButton_2.ButtonPushedFcn = createCallbackFcn(app, @PauseButton_2Pushed, true);
            app.PauseButton_2.Icon = fullfile(pathToMLAPP, 'Pause.png');
            app.PauseButton_2.Position = [338 53 99 83];
            app.PauseButton_2.Text = '';

            % Create ResumeButton_2
            app.ResumeButton_2 = uibutton(app.EspectroentiemporealTab, 'push');
            app.ResumeButton_2.ButtonPushedFcn = createCallbackFcn(app, @ResumeButton_2Pushed, true);
            app.ResumeButton_2.Icon = fullfile(pathToMLAPP, 'Resume.png');
            app.ResumeButton_2.Position = [477 53 99 83];
            app.ResumeButton_2.Text = '';

            % Create Button_2
            app.Button_2 = uibutton(app.EspectroentiemporealTab, 'push');
            app.Button_2.ButtonPushedFcn = createCallbackFcn(app, @Button_2Pushed, true);
            app.Button_2.Icon = fullfile(pathToMLAPP, 'Stop_b.png');
            app.Button_2.Position = [620 53 99 83];
            app.Button_2.Text = '';

            % Create TiempodereproduccinsEditFieldLabel
            app.TiempodereproduccinsEditFieldLabel = uilabel(app.EspectroentiemporealTab);
            app.TiempodereproduccinsEditFieldLabel.HorizontalAlignment = 'right';
            app.TiempodereproduccinsEditFieldLabel.FontSize = 15;
            app.TiempodereproduccinsEditFieldLabel.Position = [1031 143 193 22];
            app.TiempodereproduccinsEditFieldLabel.Text = 'Tiempo de reproducción (s):';

            % Create TiempodereproduccinsEditField
            app.TiempodereproduccinsEditField = uieditfield(app.EspectroentiemporealTab, 'numeric');
            app.TiempodereproduccinsEditField.Position = [1239 143 100 22];
            app.TiempodereproduccinsEditField.Value = 1;

            % Create ReproduccionportrozosLabel
            app.ReproduccionportrozosLabel = uilabel(app.EspectroentiemporealTab);
            app.ReproduccionportrozosLabel.FontSize = 15;
            app.ReproduccionportrozosLabel.Position = [838 143 168 22];
            app.ReproduccionportrozosLabel.Text = 'Reproduccion por trozos';

            % Create PlayButton_3
            app.PlayButton_3 = uibutton(app.EspectroentiemporealTab, 'push');
            app.PlayButton_3.ButtonPushedFcn = createCallbackFcn(app, @PlayButton_3Pushed, true);
            app.PlayButton_3.Icon = fullfile(pathToMLAPP, 'Play.png');
            app.PlayButton_3.Position = [873 53 99 83];
            app.PlayButton_3.Text = '';

            % Create ResumeButton_3
            app.ResumeButton_3 = uibutton(app.EspectroentiemporealTab, 'push');
            app.ResumeButton_3.ButtonPushedFcn = createCallbackFcn(app, @ResumeButton_3Pushed, true);
            app.ResumeButton_3.Icon = fullfile(pathToMLAPP, 'Resume.png');
            app.ResumeButton_3.Position = [1078 53 99 83];
            app.ResumeButton_3.Text = '';

            % Create Image2
            app.Image2 = uiimage(app.EspectroentiemporealTab);
            app.Image2.Position = [748 50 100 91];
            app.Image2.ImageSource = fullfile(pathToMLAPP, 'linea.png');

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = Proyecto_EQ_exported

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end