Mercurial > hg > camir-aes2014
view toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirplay.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line source
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 = {};