From 6be04aee224035745826a4c434e1525bff92c433 Mon Sep 17 00:00:00 2001 From: Darell Chua Yun Da Date: Thu, 2 Dec 2021 08:05:22 +0800 Subject: [PATCH] Create Synthtest.m --- DarellsAnnex/Synthtest.m | 165 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 DarellsAnnex/Synthtest.m diff --git a/DarellsAnnex/Synthtest.m b/DarellsAnnex/Synthtest.m new file mode 100644 index 0000000..c7101aa --- /dev/null +++ b/DarellsAnnex/Synthtest.m @@ -0,0 +1,165 @@ + +filename = '/Users/DarellCHUA/OneDrive - UC San Diego/FA2021/ECE 45/SynthesizerProject/Be Epic.mp3'; +[y,Fs] = audioread(filename); + +lengthy = length(y); +new_y = zeros(1,lengthy); +for n = 1:lengthy + new_y(n) = y(n,1) + y(n,2); +end + +y = new_y; + +Time = (length(y)-1)/Fs; + + +Freq = 200; %Hz +Time = 20; + +LFO = 1; %Hz + +RangeFs = [20 22050]; +Fs = 2*RangeFs(2); %should be 44.1 khz + + +x = 0:1/Fs:Time; +Len = length(x); + +y = sin(Freq*2*pi*x); %sin wave + +beats = 1; +y = y + sin((Freq+beats)*2*pi*x); %adding beats based on superposition +y = y + sin((2*Freq)*2*pi*x); +y = y + sin((2*Freq+beats)*2*pi*x); +y = y + sin((2*Freq+5)*2*pi*x); +y = y + sin((2*Freq+beats+5)*2*pi*x); +y = y + sin((3*Freq)*2*pi*x); +y = y + sin((3*Freq+beats)*2*pi*x); +y = y + sin((3*Freq+5)*2*pi*x); +y = y + sin((3*Freq+beats+5)*2*pi*x); +y = y + 5*sin((10)*2*pi*x); +y = y + sin((10*Freq+5)*2*pi*x); + +y = y + square(Freq*2*pi*x); %square wave +y = y + square((Freq+beats)*2*pi*x); +y = y + square(Freq*2*pi*x); %square wave +y = y + square((Freq+beats)*2*pi*x); + +T = 4; +overlay = Envelope(0.2,0.1,0.5,0.3,T,Fs); +y = overlayAmp(x,y,overlay,T,Fs); + +f = Fs * (-Len/2 : (Len/2 - 1))/Len ; +Mod_Freq = fft(y); +figure(1) +plot(f, abs(fftshift(Mod_Freq))); + +y = bandpassFilter(f,y,0,22000); +Mod_Freq = fft(y); +figure(2) +plot(f, abs(fftshift(Mod_Freq))); + +T = 2; +overlayPitch = Envelope(0.4,0.1,0.9,0.3,T,Fs); +y = PitchEnvelope(f,y,1,overlayPitch,T,Fs,Time); +sound(y,Fs); + + + +function output = bandpassFilter(F,y,LOW,HIGH) + Mod_Freq = fftshift(fft(y)); + Mod_f = fftshift(fft(F)); + lenf = length(F); + output = 0 .* Mod_f; % zero array of len f + + for n = 1:lenf + if ((LOW < abs(F(n))) && HIGH > abs(F(n))) + output(n) = 1; + else + output(n) = 0; + end + end + + filtered_Mod_Freq = fftshift(Mod_Freq .* output); + + output = real(ifft(filtered_Mod_Freq)); + +end + +function output = PitchEnvelope(f,y,percentile,shift,T,Fs,Time) %just need to change percentile to a graph + + x = 0:1/Fs:Time; + leny = length(y); %create zero array of y of len x + lengthxol = T * Fs; + shift = 1 - shift; + for n = 1:leny + y(n) = y(n)*cos(shift(mod(n,lengthxol)+1)*2*pi*x(n)); + end + + Mod_Freq = fftshift(fft(y)); + Mod_f = fftshift(fft(f)); + lenf = length(f); + output = 0 .* Mod_f; % zero array of len f + midpoint = round(lenf/2); + + Filtered_Signal = fftshift(fft(bandpassFilter(f,y,0,22000))); + filtered_Signal = real(ifft(Filtered_Signal)); + + demod_Signal = filtered_Signal .* 0; %create zero array of y of len filtersignal + + for n = 1:leny + demod_Signal(n) = 2* filtered_Signal(n) *cos(shift(mod(n,lengthxol)+1)*2*pi*x(n)); + end + + + Message = fftshift(fft(bandpassFilter(f,demod_Signal,-5000,5000))); + message = real(ifft(Message)); + output = y; + +end +function output = overlayAmp(x,y,overlay,T,Fs) + counter = 1; + lengthx = length(x); + lengthxol = T * Fs; + while counter < lengthx + y(counter) = y(counter) * overlay(mod(counter,lengthxol)+1); + counter = counter+1; + end + output = y; +end + + +function output = Envelope(attack,decay,sustain,release,T,Fs) %percentages for attack, decay, sustain, release + attacktime = attack * T * Fs; + decaytime = attacktime + decay * T * Fs; + sustaintime = (T - (release * T))* Fs; + + x = 0:1/Fs:T; + y = 0 .* x; %create zero array of y of len x + + tcounter = 1; + %attack phase + + while tcounter <= attacktime + y(tcounter) = (1/attacktime) * tcounter; + tcounter = tcounter+1; + end + istart = tcounter; + while tcounter<= decaytime + y(tcounter) = 1 - (((1-sustain)/(decay * T * Fs)) * (tcounter - istart)); + tcounter = tcounter+1; + end + + while tcounter<= sustaintime + y(tcounter) = sustain; + tcounter = tcounter+1; + end + istart = tcounter; + while tcounter < (T * Fs) + y(tcounter) = sustain - ((sustain/(release * T * Fs)) * (tcounter - istart)); + tcounter = tcounter+1; + end + + plot(x,y) + output = y; +end \ No newline at end of file