⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 synth.m

📁 非常好的数字处理教程
💻 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);		endend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -