Mercurial > hg > camir-aes2014
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mirplay.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,183 @@ +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 = {}; \ No newline at end of file