📄 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); endend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -