Csound · Lydteknik · Musik · Programmering · Uncategorized

Wobblebass algoritme, additiv og fm syntese

Jeg har prøvet at rode lidt med additiv syntese med Csound. Først vidste jeg ikke hvad jeg ville ende med, men ved også at benytte frekvensmodulation endte jeg med at få en såkaldt wobblebass.

Først genererer jeg alle de uharmoniske overtoner med en løkke.
Almindelige overtoner er aritmetiske, hvor man tilføjer den samme frekvensværdi for en overtone for at komme til den næste. Eksempelvis 100, 200, 300, 400, 500, …, hvor der hele tiden tilføjes 100.

Den første ide jeg fik var i stedet bruge geometriske overtoner, hvor vi multiplikere en overtones frekvens med et vist antal (kfreqmult) for at få den næste overtone frekvens.
Eksempelvis 100, 200, 400, 800, 1600, …, hvor der hele tiden ganges med 2.

kfreqmult er dog ikke lig med 2, den er slet ikke konstant, men genereres af en sinus oscillator. Det var min anden ide, og det er frekvensmodulation.

Dernæst er noget tilfældighed tilføjet for at lave en mere interessant lyd, samt chorus effekt at gøre lyden mere “fed”.

Den eksponentielle funktion (exp) bruges fordi hvis vi bevæger os opad i en almindelig musikalsk skala, så vil frekvenserne vokse eksponentielt.

Her er selve koden:

<CsoundSynthesizer> ; Wobblebas lavet med additiv syntese
<CsOptions> ; og frekvens modulation
-odac
</CsOptions>
<CsInstruments>
;  Af Bjørn Houdorf, Marts 2013
; GNU General Public License version 2
sr = 44100
ksmps = 1
nchnls = 2
0dbfs = 1

instr 1
kamp = 24 ; Amplitude
kfreq = p4
iloopnum = p5 ; Antal af overtoner der generes

alyd1 init 0
alyd2 init 0
seed 0

kfreqmult oscili 1, 2, 1
kosc oscili 1, 2.1, 1
ktone randomh 0.5, 2, 0.2 ; Tilføj noget tilfældighed
icount = 1
loop: ; Selve løkken der genererer overtonerne
kfreq = kfreqmult * kfreq
atal oscili 1, 0.5, 1
apart oscili 1, icount*exp(atal*ktone) , 1 ; Modulér hver overtone, fm syntese
anum = apart*kfreq*kosc
asig1 oscili kamp, anum, 1
asig2 oscili kamp, anum*0.51, 1 ; Chorus effekt for et gøre lyden mere »fed”
asig3 oscili kamp, anum*1.51, 1
asig4 oscili kamp, anum*2.02, 1
alyd1 = (alyd1 + asig1+asig3)/icount ;Sum af overtoner
alyd2 = (alyd2 + asig2+asig4)/icount
loop_lt icount, 1, iloopnum, loop ; Slut på løkken
outs alyd1, alyd2 ; Send resulterende lyd ud
endin
</CsInstruments>

<CsScore>
f1 0 128 10 1
i1 0 180 880 50
e
</CsScore>
</CsoundSynthesizer>

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s