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