Lab 1 1970 lanserade R.A. Moog Inc. en ny synt: Minimoog. Den var designad av Bill Hemsath och Robert Moog och kom att revolutionera musikhistorien. Minimoogen var egentligen en ganska enkel synt. Den består av tre oscillatorer (VCOer), en mixer, ett spänningsstyrt filter (VCF), en spänningsstyrd förstärkare (VCA), och två tämligen enkla envelopgeneratorer. Denna övning går ut på att framställa ett Minimoogliknande ljud med hjälp av Matlab, och det vi ska fokusera på är oscillatorerna och filtret. Lämpligen löser ni alla laborationsuppgifter på kursen genom att skriva funktioner. Då blir det enkelt att spara, och sedan felsöka i koden Kom ihåg att det går enkelt att få fram hjälp och stöd i Matlab genom att skriva help och kommandot/funktionen för att få hjälp direkt i kommandofönstret, samt doc och kommandot/funktionen för att komma till hjälpfilen. Grundljudet Bestäm er för en av de möjliga vågformerna och en frekvens, och skapa sedan den första oscillatorn. Lämpligt för denna laboration är nog sågtandsvåg eller fyrkantsvåg, eftersom laborationen går ut på att göra subtraktiv ljudsyntes och dessa vågformer har mer övertonsinformation jämfört med sinus och triangelvåg. Sätt samplingsfrekvensen till 44100 och ljudlängden till 3 sekunder. För att skapa oscillatorn krävs en tidsvektor. Tidsvektorn (t) ska gå från 0 till ljudlängden, och delas i 1/samplingsfrekvensen antal steg. Då Minimoogen gör ett fantastiskt bra syntbasljud tycker jag att ni ska ta en lägre frekvens att arbeta med, kanske 55Hz. För en sågtand används sawtooth och ramptiden/bredden (width) behöver anges mellan 0 och 1, där 0.5 ger en triangelvåg. För en fyrkantsvåg används square och pulsbredden (width) behöver anges mellan 0 och 100, där 50 ger 50% fyrkantsvåg. minimoogljud = sawtooth(2*pi*frequency*t, width); minimoogljud = square(2*pi*frequency*t, width);
Spela upp ljudet p = audioplayer(minimoogljud, Fs); playblocking(p); Plotta ljudet figure(); plot(minimoogljud); Fler oscillatorer Prova gärna att ändra bredden till andra värden, se och lyssna efter skillnaderna i övertoner och välj det ni tycker blir bäst. Minimoogen hade som sagt tre oscillatorer, och dessa gick att stämma mot varandra. Oscillator 1 användes som master, medan oscillator 2 och 3 gick att snedstämma mot oscillator 1 och varandra. Alla tre oscillatorerna gick dessutom att oktavera, dvs dubbla eller halvera frekvensen. Ett sätt att skapa ett bra basljud är att använda oscillator 1 och 2 i samma oktav men snedställa oscillator 2 något i frekvens gentemot oscillator 1. När två oscillatorer inte riktigt stämmer, dvs inte riktigt har samma frekvens (Hz), uppstår superpositionering som bitvis innebär att de två vågformerna förstärker varandra och bitvis fasutsläcker varandra. Detta påminner om en choruseffekt, och ger ett mer intressant ljud än när två oscillatorer stämmer perfekt. Om skillnaden i frekvens är liten blir effekten en långsam förändring av övertonsserien. Är skillnaden större blir effekten en snabbare förändring, och ökas skillnaden ytterligare blir det tydligt två olika (och falska?) toner. Skapa därför en ny oscillator, gör den på exakt samma sätt som oscillator 1 men sätt frekvensen till frequency+1 eller frequency-1. Mixa de två ljuden genom att summera dem. Eftersom ett ljud inte får överstiga/understiga +/-1 när det spelas upp eller sparas ut från Matlab, måste ni kolla skalningen av summeringen så att inte distorsion uppstår. Enklast åtgärdas detta genom att dela summan med antalet oscillatorer, Matlab kan räkna med hur stora tal som helst så ingen panik. Lyssna er fram till det ni tycker låter bra, och plotta gärna ljudet för att se hur vågformen förändras. För att få mer botten i ljudet skapar vi en tredje oscillator en oktav under oscillator 1.
Mix av oscillatorerna Hittills har vi mixat alla tre ljuden lika starkt. Detta är ju naturligtvis inte nödvändigt. Vid mix är 1 max ljudvolym och 0 är tyst. Det är då möjligt att ta alla värden i en vektor gånger ett värde mellan 0 och 1 för att förändra ljudvolymen. Exempelvis: minimoogljud = (oscillator1+oscillator2+(oscillator3.*0.75)); Fortfarande måste vi dock hålla koll så att inte summan blir för stark. Filtret Även om ljudet nu låter rätt ok så blev inte Minimoogen enbart uppskattad för sina oscillatorer, utan nog mest för det spänningsstyrda filtret. Ett analogt filter skapas enkelt med [b,a] = butter(n,wn); i Matlab. Då returneras filterkoefficienterna för ett lågpassfilter (lågpassfilter är default när inget annat anges) av nte ordningen med brytfrekvensen Wn. Brytfrekvensen Wn ska vara ett värde normaliserat mellan 0 och 1, där 1 motsvaras av halva samplingsfrekvensen (enligt Nyquistteoremet). Då Minimoogens VCF är ett 24dB/oktav-filter, dvs ett filter med fyra poler, ska filtret vara av fjärde ordningen. Brytfrekvensen kan så länge sättas till 2200Hz. Filtret appliceras sedan på ljudet med y = filter(b,a,x), där b och a är filterkoefficienterna och x är originalljudet. Spela upp ljudet, och testa gärna med olika brytfrekvenser. Och studera filtret med: freqz(b, a);. Gör också ett spektrogram för att se hur frekvensinnehållet påverkas av brytfrekvensen. figure(); spectrogram(x, window, noverlap, nfft, Fs, 'yaxis'); Spektrogrammet visar x vilket är ljudvektorn, window är antalet fönster som ljudet delas in i, noverlap är antalet överlapp mellan intilliggande fönster, nfft är antalet samplingar som används för att beräkna Fouriertransformen, Fs är samplingsfrekvensen, och yaxis sätter vilken axel som spektrogrammet ska visas mot. Sätt antalet fönster till 512, antalet överlapp till 256 och antalet samplingar för Fouriertransformen till 512. Följande kan användas för att snygga till visningen av spektrogrammet: ylim([0,2]); title('spektrogram av ljudet'); xlabel('tid (s)'); ylabel('frekvens (khz)'); Vidare utvecklingar Prova att förändra vågformen på de olika oscillatorerna. Oscillator 1, 2, och 3 är egentligen mer eller mindre oberoende av varandra i Minimoogen och kan ha olika vågformer. Ändra pulsbredd, och testa triangelvåg eller en kort pulsvåg. Även om Minimoogen bara hade ett lågpassfilter kan det vara intressant att testa bandpassfilter och högpassfilter. Butterworth-filtret kan göra fyra typer av filter [b,a] = butter(n,wn,ftype). Nämligen lågpass, bandpass, högpass, och stopband (genom att speca en av följande strängar: low, bandpass, high, stop). Finns tid kan ni prova att förändra brantheten, dvs ordningen, på filtren och se vad som händer, om det blir bättre eller sämre.
Ljudet börjar nu faktiskt likna något, men det går att skapa lite mer liv i ljudet genom att lägga till en envelopgenerator. I analoga syntar användes oftast en ADSR (Attack, Decay, Sustain, och Release). Skapa därför en ny vektor som går från 0 till 1 under Attack tid, sedan från 1 till Sustainläget under Decay tid, och som avslutningsvis går från Sustainläget till 0 under Release tid. Totalt ska envelopvektorn vara lika lång som ljudvektorn. Envelopen appliceras sedan på ljudet med.*. Något som skiljer den riktiga Minimoogen mot vad vi gjort hittills är att Minimoogens filter var spänningsstyrt. Det innebar att filtrets brytfrekvens kunde kontrolleras och exempelvis svepa filtret. Ett sätt att göra detta är att skapa en filtervektor som sveper filtret från en startfrekvens på kanske 5000Hz till en slutfrekvens på 500Hz i lika många steg som det finns samples i ljudet. Detta skulle dock kräva en filterberäkning för varje sample, och ta för lång tid att genomföra. Fundera på eventuella andra sätt att lösa ett filtersvep på. Minimoogens filter hade också en återmatning av signalen till början av filtret, en så kallad resonanskontroll eller emphasis som den kallades på Minimoogen. Fundera på hur detta skulle kunna implementeras. Nedan finns en kopia/klon på Minimoogens VCF. Signalen kommer in via Audio in-jacken och skickas till själva filterdelen, dvs transistorstegen som skapas av U1b, Q2-Q7 och U1a. Återmatningen sker sedan via Emphasis-potentiometern, och matas tillbaka in till U1b.
Nedan finns en bild från ett oscilloskop hur resonans påverkar övertonerna och därmed vågformen i en fyrkantsvåg: Att rapportera Namn på er: Redogör för vilken vågform(er) ni använt: Vilken/vilka vågformer skapade det bästa ljudet? Varför?
Hur skiljde sig ljuden ni testade åt? Vad innebar dessa skillnader för slutljudet, och hur mixade ni signalerna? Vilken typ av filter användes? Dvs brytfrekvenser, ordning på filtret, osv? Varför? Hann ni fundera på filtersvep, vad kom ni i så fall fram till? Hann ni fundera på resonans/återmatning i filtret, vad kom ni i så fall fram till? Hann ni testa andra typer än Butterworth-filter? Hur skiljde sig filtren åt? Vilken typ av filter passade bäst? Vidare läsning Yusynths sida om Minimoog-VCF: http://yusynth.net/modular/en/moogvcf/ Moogs webbsida: https://www.moogmusic.com/products/minimoog/minimoog-model-d
Wikipedia om Minimoog: https://en.wikipedia.org/wiki/minimoog 120 Years Of Electronic Music: http://120years.net/ Om additiv ljudsyntes: https://en.wikipedia.org/wiki/additive_synthesis