www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/birds/birdsfn.m

    %
function birdsfn(action)

    if nargin < 1
        action='init';
    end

	name = mfilename;
    figname = [name(1:end-2) '_fig'];
    f=findobj('Tag',figname);
    handles = get(f,'UserData');

    switch action
        case 'help'
			display_help(figname);
        case 'init'
			setwindow(f);
            movegui(f,'center');
			birds = {'Yellow_Warbler', 'Western_Meadowlark', 'Orchard_Oriole',...
			'Chipping_Sparrow', 'Scissor_Tailed_Flycatcher',...
			'Black_Throated_Gray_Warbler', 'Cassins_Kingbird',...
			'Black_Necked_Stilt', 'Chestnut_Sided_Warbler',...
			'Great_Horned_Owl', 'Grasshopper_Sparrow', 'Swamp_Sparrow',...
			'Golden_Crowned_Sparrow', 'Indigo_Bunting', 'Robin',...
			'Nashville_Warbler', 'Rufous_Sided_Towhee', 'Random_Bird'};
			set(handles.birdlist,'String',birds);
		case 'plot'
			if ~isfield(handles,'pscore')
				[handles.audiodata,handles.pscore] = synthbird(handles);
			end
			plotdata(handles.pscore);
		case 'play'
			[handles.audiodata,handles.pscore] = synthbird(handles);
			play_audiodata(handles.audiodata);
		case 'save'
			if isfield(handles, 'audiodata')
                save_audiodata(handles.audiodata);
            end
		case {'sonogram','fourier'}
			handles.audiodata = synthbird(handles);
			switch action
				case 'sonogram'
					sonoexpogui(handles.audiodata);
				case 'fourier'
					fourierexpo(handles.audiodata);
			end
		case 'close'
			close_figure(f,figname(1:end-4));
            return;
	end
	set(f,'UserData',handles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	
function setwindow(f)
	load 'forest.mat';
	set(f,'Units','Pixels',...
		'Position',[100 100 size(x,2)*1.1 size(x,1)*1.1]);
	setdefaults;
	axes('pos',[0 0 1 1]);
	image(x);
	axis image;
	colormap(cmap);

	switch computer
		case {'GLNX86','MAC'}
			birdfontsize = 12;
			titlesize = 24;
			authorsize = 14;
		case 'PCWIN'
			birdfontsize = 10;
			titlesize = 18;
			authorsize = 12;
	end
	y = -35;
	text(52.5,y+60,'Additive Synthesis Forest',...
		'fontsize',titlesize,...
		'fontweight','bold',...
		'color',[0.5 0.9 0.8]);


function [audiodata,pscore] = synthbird(handles)

	contents = get(handles.birdlist,'String');
	bird = contents{get(handles.birdlist,'Value')};
	if strncmp(bird,'Random',6)
		birdname=['RandBird_' num2str(rand*5280) '_' char(floor(rand*26+65))];
		fprintf('%s\n', birdname);
		pscore = randbird(floor(rand*40));
	else
		pscore = birdcall(bird);
	end

	timestretch = str2num(get(handles.timestretch,'String'));
	randtime = str2num(get(handles.randtime,'String'));
	randamp = str2num(get(handles.randamp,'String'));
	randfreq = str2num(get(handles.randfreq,'String'));

	% Format is: {begin dur freq freq_skew amp freq_env amp_env <partials>}
	for i=1:size(pscore,1)
		pscore{i,1} = pscore{i,1}*(timestretch+(rand-0.5)*randtime);
		pscore{i,2} = pscore{i,2}*(timestretch+(rand-0.5)*randtime);
		pscore{i,3} = pscore{i,3}*(1+(rand-0.5)*randfreq);
		pscore{i,4} = pscore{i,4}*(1+(rand-0.5)*randfreq);
		pscore{i,5} = pscore{i,5}*(1+(rand-0.5)*randamp);
		freqenv = pscore{i,6};
		freqenv(1:2:end) = freqenv(1:2:end).*(timestretch+(rand-0.5)*randtime);
		freqenv(2:2:end) = freqenv(2:2:end).*(1+(rand-0.5)*randfreq);
		freqenv = freqenv./max(freqenv(1:2:end));
		pscore{i,6} = freqenv;
		ampenv = pscore{i,7};
		ampenv(1:2:end) = ampenv(1:2:end).*(timestretch+(rand-0.5)*randtime);
        ampenv(2:2:end) = ampenv(2:2:end).*(1+(rand-0.5)*randamp);
		ampenv = ampenv./max(ampenv(1:2:end));
		pscore{i,7} = ampenv./max(ampenv(1:2:end));
	end

	Fs = 44100;
	audiodata.data = normalize(synth(pscore, Fs,'add')');
	audiodata.Fs = Fs;

function plotdata(pscore)
	% Format is: {begin dur freq freq_skew amp freq_env amp_env <partials>}
	% Make plot for each note?
	figure;
	for i=1:size(pscore,1)
		ampenv = pscore{i,7};
		amptimes = pscore{i,1} + pscore{i,2}*ampenv(1:2:end);
		ampvals = pscore{i,5}*ampenv(2:2:end);
		freqenv = pscore{i,6};
		freqtimes = pscore{i,1} + pscore{i,2}*freqenv(1:2:end);
		freqvals = pscore{i,3} + pscore{i,4}*freqenv(2:2:end);
		subplot(size(pscore,1),2,i*2-1)
		plot(amptimes,ampvals);
		axis tight;
		if i == 1,
			title('Amplitude Envelopes');
		end
		if i == size(pscore,1)
			xlabel('Time (s)');
		end
		ylabel(['Note ' num2str(i)]);
		subplot(size(pscore,1),2,i*2)
		plot(freqtimes,freqvals);
		axis tight;
		if i == 1,
            title('Frequency Envelopes');
        end
		if i == size(pscore,1)
			xlabel('Time (s)');
		end
	end