Code covered by the BSD License  

Highlights from
MIRtoolbox

image thumbnail
from MIRtoolbox by Olivier Lartillot
An innovative environment, on top of Matlab, for music and audio analysis

mirplay(a,varargin)
function varargout = mirplay(a,varargin)
%   mirplay(a) plays audio signal, envelope, or pitches.
%       If a is an envelope, what is actually played is a white noise of
%           same envelope.
%       If a is a mirpitch object, pitches are played using sinusoids.
%   Optional arguments:
%       mirplay(...,'Channel',i) plays the channel(s) of rank(s) indicated by 
%           the array i.
%       mirplay(...,'Segment',k) plays the segment(s) of rank(s) indicated by 
%           the array k.
%       mirplay(...,'Sequence',l) plays the sequence(s) of rank(s) indicated
%           by the array l.
%       mirplay(...,'Increasing',d) plays the sequences in increasing order
%           of d, which could be either an array or a mirscalar data.
%       mirplay(...,'Decreasing',d) plays the sequences in decreasing order
%           of d, which could be either an array or a mirscalar data.
%       mirplay(...,'Every',s) plays every s sequence, where s is a number
%           indicating the step between sequences.
%       mirplay(...,'Burst',0) toggles off the burst sound between
%           segments.
%       Example: mirplay(mirenvelope('Folder'),...
%                        'increasing', mirrms('Folder'),...
%                        'every',5)

if ischar(a)
    varargout = mirplay(miraudio(a),varargin{:});
elseif isscalar(a)
            ch.key = 'Channel';
            ch.type = 'Integer';
            ch.default = 0;
        option.ch = ch;

            sg.key = 'Segment';
            sg.type = 'Integer';
            sg.default = 0;
        option.sg = sg;

            se.key = 'Sequence';
            se.type = 'Integer';
            se.default = 0;
        option.se = se;

            inc.key = 'Increasing';
            inc.type = 'MIRtb';
        option.inc = inc;

            dec.key = 'Decreasing';
            dec.type = 'MIRtb';
        option.dec = dec;

            every.key = 'Every';
            every.type = 'Integer';
        option.every = every;

            burst.key = 'Burst';
            burst.type = 'Boolean';
            burst.default = 1;
        option.burst = burst;

    specif.option = option;

    specif.eachchunk = 'Normal';

    varargout = mirfunction(@mirplay,a,varargin,nargout,specif,@init,@main);
    if nargout == 0
        varargout = {};
    end
else
    mirerror('mirplay','You cannot play this type of object.')
end


function [x type] = init(x,option)
type = '';


function noargout = main(a,option,postoption)
if iscell(a)
    a = a{1};
end
d = get(a,'Data');
if isa(a,'mirpitch')
    amp = get(a,'Amplitude');
end
f = get(a,'Sampling');
n = get(a,'Name');
c = get(a,'Channels');
fp = get(a,'FramePos');
if not(option.se)
    if length(d)>1
        if isfield(option,'inc')
            [unused order] = sort(mirgetdata(option.inc));
        elseif isfield(option,'dec')
            [unused order] = sort(mirgetdata(option.dec),'descend');
        else
            order = 1:length(d);
        end
        if isfield(option,'every')
            order = order(1:option.every:end);
        end
    else
        order = 1;
    end
else
    order = option.se;
end
if not(isempty(order))
    for k = order(:)'
        display(['Playing analysis of file: ' n{k}])   
        dk = d{k};
        if not(iscell(dk))
            dk = {dk};
        end
        if option.ch
            if isempty(c{k})
                chk = option.ch;
            else
                [unused unused chk] = intersect(option.ch,c{k});
            end
        else
            chk = 1:size(dk{1},3);
        end
        if isempty(chk)
            display('No channel to play.');
        end
        for l = chk
            if chk(end)>1
                display(['  Playing channel #' num2str(l)]);
            end
            if option.sg
                sgk = option.sg(find(option.sg<=length(dk)));
            else
                sgk = 1:length(dk);
            end
            for i = sgk
                if sgk(end)>1
                    display(['      Playing segment #' num2str(i)])
                end
                di = dk{i};
                if isa(a,'mirpitch')
                    ampi = amp{k}{i};
                end
                synth = zeros(1,ceil((fp{k}{i}(end)-fp{k}{i}(1))*44100)+1);
                for j = 1:size(di,2)
                    if iscell(di)
                        dj = di{j};
                    else
                        dj = di(:,j);
                    end
                    dj(isnan(dj)) = 0;
                    if isa(a,'mirpitch')
                        ampj = zeros(size(dj));
                        if iscell(ampi)
                            ampj(1:size(ampi{j})) = ampi{j};
                        else
                            ampj(1:size(ampi(:,j))) = ampi(:,j);
                        end
                    end
                    if not(isempty(dj))
                        k1 = floor((fp{k}{i}(1,j)-fp{k}{i}(1))*44100)+1;
                        k2 = floor((fp{k}{i}(2,j)-fp{k}{i}(1))*44100)+1;
                        if isa(a,'mirpitch')
                            ampj = repmat(ampj,1,k2-k1+1);
                        else
                            ampj = ones(size(dj),k2-k1+1);
                        end
                        synth(k1:k2) = synth(k1:k2) ...
                            + sum(ampj.*sin(2*pi*dj*(0:k2-k1)/44100),1) ...
                                    .*hann(k2-k1+1)';
                        %plot((ampj.*sin(2*pi*dj*(0:k2-k1)/44100))')
                        %drawnow
                    end
                end
                soundsc(synth,44100);
                if option.burst && sgk(end)>1
                    sound(rand(1,10))
                end
                %pause(0.5)
            end
        end
    end
end
noargout = {};

Contact us at files@mathworks.com