function vibrating_L
    % MathWorks logo, vibrating L-shaped membrane.
    % See Cleve's Corner, Dec. 13, 2023
    % https://blogs.mathworks.com/cleve/2023/12/13/blog-post-number-300-vibrating-logo.
    stop = init_fig;
    fps = 6;
    f = 0;
    % Loop until stop is toggled.
    while stop.Value == 0
        f = f + 1;
        vibrating_logo_frame(f)
        pause(1/fps)
    end

    % ------------------------------------------------------

    function vibrating_logo_frame(f)
        % 
        % One frame of animation.
        if f == 1
            first_frame
        end
        fud = get(gcf,'UserData');
        [mu,L,s] = deal(fud{:});
        t = (f-1)/fps;
        Z = cos(mu(1)*t)*L{1} + sin(mu(2)*t)*L{2} + sin(mu(3)*t)*L{3} +  ...
            sin(mu(4)*t)*L{4} + sin(mu(5)*t)*L{5} + sin(mu(6)*t)*L{6};
        s.ZData = Z;
    end

    function first_frame
        cla
        axis off

        % First six eigenvalues.
        mu = sqrt([9.6397238445, 15.19725192, 2*pi^2, ...
                   29.5214811, 31.9126360, 41.4745099]);

        % First six eigenfunctions.
        L{1} = 30*membrane(1,25);
        L{2} = 2*membrane(2,25);
        L{3} = -2*membrane(3,25);
        L{4} = 5*membrane(4,25);
        L{5} = -3*membrane(5,25);
        L{6} = 4*membrane(6,25);

        % Surf plot with custom lighting.
        axes('CameraPosition', [-193.4013 -265.1546  220.4819],...
             'CameraTarget',[26 26 10], ...
             'CameraUpVector',[0 0 1], ...
             'CameraViewAngle',9.5, ...
             'DataAspectRatio', [1 1 .9],...
             'Visible','off', ...
             'XLim',[1 51], ...
             'YLim',[1 51], ...
             'ZLim',[-13 40]);
        s = surface(zeros(size(L{1})), ...
             'EdgeColor','none', ...
             'FaceColor',[0.9 0.2 0.2], ...
             'FaceLighting','phong', ...
             'AmbientStrength',0.3, ...
             'DiffuseStrength',0.6, ... 
             'Clipping','off',...
             'BackFaceLighting','lit', ...
             'SpecularStrength',1.0, ...
             'SpecularColorReflectance',1, ...
             'SpecularExponent',7);
        light('Position',[40 100 20], ...
             'Style','local', ...
             'Color',[0 0.8 0.8]);
        light('Position',[.5 -1 .4], ...
             'Color',[0.8 0.8 0]);
        set(gcf,'UserData',{mu,L,s})
    end

    function stop = init_fig
        % Initialize figure.
        fig = gcf;
        fig.Color = 'k';
        fig.MenuBar = 'none';
        fig.ToolBar = 'none';
        fig.NumberTitle = 'off';
        fig.Clipping = 'off';
        stop = uicontrol;
        stop.Style = 'togglebutton';
        stop.String = 'X';
        stop.FontSize = 12;
        stop.FontWeight = 'bold';
        stop.Units = 'normalized';
        stop.Position = [.92 .92 .06 .06];  
        cla
        shg
    end
end