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

    function [signal] = synth(pscore, Fs, method)
% SYNTH Synthesis sequencer
%
% SYNTH(pscore,Fs,method)
%-------------------------------------------------------
%	MATLAB code created for MAT201a: Signals and Systems
%		Dr. Jerry Gibson
%	Copyright University of California, Santa Barbara
%-------------------------------------------------------
%	synth.m
%	This code parses the pscore and sends data to the relevant
%	synthesis program.
%
%	Author: Bob L. Sturm	20030701-03
%-------------------------------------------------------

switch lower(method)
	case 'add'
		% Reformat pscore
		num_notes = size(pscore,1);
		freq_envs = cell(1,num_notes);
		amp_envs = cell(1,num_notes);
		partials = cell(1,num_notes);
		for i=1:num_notes,
			begins(i) = floor(pscore{i,1}*Fs);
			durs(i) = floor(pscore{i,2}*Fs);
			freqs(i) = pscore{i,3};
			freq_skews(i) = pscore{i,4};
			amps(i) = pscore{i,5};
			freq_envs(i) = {pscore{i,6}};
			amp_envs(i) = {pscore{i,7}};
			partials(i) = {pscore{i,8}};
		end
		notes = length(durs);
		total_samples = max(begins)+max(durs)+1;
		signal = zeros(1,total_samples);

		for i=1:notes,
			num_samples = begins(i)+durs(i);
			x = signal((begins(i)+1):num_samples);
			y = additive(durs(i),freqs(i),freq_skews(i),amps(i),...
					freq_envs(i),amp_envs(i),partials(i), Fs);
			signal((begins(i)+1):num_samples) = x + y;
		end

		if (max(signal) < 0.5)
			signal = signal/(max(signal)+0.3);
		end
	case 'fm'
		% Reformat pscore
		num_notes = size(pscore,1);
		car_envs = cell(1,num_notes);
		mod_envs = cell(1,num_notes);
		for i=1:num_notes,
			begins(i) = floor(pscore{i,1}*Fs);
			durs(i) = floor(pscore{i,2}*Fs);
			freqs(i) = pscore{i,3};
			freq_ratios(i) = pscore{i,4};
			amps(i) = pscore{i,5};
			car_envs(i) = {pscore{i,6}};
			mod_envs(i) = {pscore{i,7}};
			ix1(i) = pscore{i,8};
			ix2(i) = pscore{i,9};
		end
		notes = length(durs);
		total_samples = max(begins)+max(durs)+1;
		signal = zeros(1,total_samples);

		for i=1:notes,
			num_samples = begins(i)+durs(i);
			x = signal((begins(i)+1):num_samples);
			y = freqmod(durs(i),freqs(i),freq_ratios(i),amps(i),...
					car_envs(i),mod_envs(i),ix1(i),ix2(i),Fs);
			signal((begins(i)+1):num_samples) = x + y;
		end

		if (max(signal) < 0.5)
			signal = signal/(max(signal)+0.3);
		end
end