1. Volání knihovny tuneR

Ta je zapotřebí, protože skript bude vytvářet zvuk.

library(tuneR)

2. Definování základních hodnot

S pomocí těchto hodnot vytvoříme tóny: fs - vzorkovací frekvence [Hz]; f - frekvence daného tónu - v tomto případě tónu c1, ostatní tóny pak vypočítáme z něj; trvaniK a trvaniD - trvání krátkých a dlouhých tónů [s], tedy čtvrťových a půlových; tK a tD - jednotlivé vzorky zvukové vlny v čase; ST - hodnota, kterou se násobí tón, jestliže jej chceme o zvýšit o jeden půltón; tlumeniK a tlumeniD - exponenciály, kterými se násobí tóny, aby byly postupně zatlumovány.

fs          <- 44100         
f           <- 131
trvaniK     <- 0.4                   
trvaniD     <- 0.8
tK          <- seq (from = 0, to = trvaniK - 1/fs, by = 1/fs)
tD          <- seq (from = 0, to = trvaniD - 1/fs, by = 1/fs)
ST          <- 2^(1/12)             
tlumeniK    <- exp(-3*tK)
tlumeniD    <- exp(-3*tD)

3. Fade in & fade out

I přes tlumení podle exponenciály to při přechodu z jednoho tónu na druhý “lupne”, proto je vhodné ještě začátek i konec každého tónu postupně zcela zatlumit, aby byly přechody mezi tóny hladší. n - počet vzorků tónu, které chceme postupně zatlumovat; fadeout - sekvence hodnot od 1 do 0 s počtem stupňů n, kterou budeme násobit konec tónu; fadein - totéž co fadeout, ale od 0 do 1, tímto vektorem budeme násobit naopak začátek tónu.

n       <- 500 
fadeout <- seq(1, 0, length.out = n)
fadein  <- seq (0, 1, length.out = n)

4. Vytvoření krátkých tónů

Tónů je celkem 12, tj. jedna oktáva včetne půltónů: od c1 po c2. Každý tón je součtem sedmi harmonických složek (sinusoid s frekvencemi, které jsou celočíselnými násobky frekvence první, základní harmonické složky). Poměry frekvencí tónů udává násobení půltóny. Celý výsledný vektor je pak postupně zatlumen, tedy násoben exponenciálou, která byla definována ve druhém kroku. Ukázky krátkých tónů c 1 a cis 1:

tonC1K <- tlumeniK * (0.6*sin(2*pi*f*(ST^0)*tK) + 0.2*sin(2*pi*2*f*(ST^0)*tK) +
                      0.05*sin(2*pi*3*f*(ST^0)*tK) + 0.05*sin(2*pi*4*f*(ST^0)*tK) +
                      0.03*sin(2*pi*5*f*(ST^0)*tK) + 0.02*sin(2*pi*6*f*(ST^0)*tK) +
                      0.01*sin(2*pi*7*f*(ST^0)*tK) )

tonCisK <- tlumeniK * (0.6*sin(2*pi*f*(ST^1)*tK) + 0.2*sin(2*pi*2*f*(ST^1)*tK) +
                       0.05*sin(2*pi*3*f*(ST^1)*tK) + 0.05*sin(2*pi*4*f*(ST^1)*tK) +
                       0.03*sin(2*pi*5*f*(ST^1)*tK) + 0.02*sin(2*pi*6*f*(ST^1)*tK) + 
                       0.01*sin(2*pi*7*f*(ST^1)*tK))

5. Zatlumení začátků a konců tónů

V tomto bodě budou zatlumeny začátky a konce tónů, a to pomocí hodnot fadein a fadeout definovaných ve třetím kroku. NK je počet vzorků krátkého tónu. Toto číslo potřebujeme k určení vzorků, které mají být tlumeny na konci tónu. Tlumíme počátečních a koncových n vzorků každého krátkého tónu (n bylo definováno ve třetím kroku).

NK <- length(tonC1K)
tonC1K[(NK-n+1):(NK)]   <- fadeout * tonC1K[(NK-n+1):(NK)] 
tonCisK[(NK-n+1):(NK)]  <- fadeout * tonCisK[(NK-n+1):(NK)]
tonC1K[1:n]  <- fadein * tonC1K[1:n]
tonCisK[1:n] <- fadein * tonCisK[1:n]  

6. Dlouhé tóny

Stejným způsobem vytvoříme vektory pro dlouhé tóny.

tonC1D <- tlumeniD * (0.6*sin(2*pi*f*(ST^0)*tD) + 0.2*sin(2*pi*2*f*(ST^0)*tD) +
                      0.05*sin(2*pi*3*f*(ST^0)*tD) + 0.05*sin(2*pi*4*f*(ST^0)*tD) +
                      0.03*sin(2*pi*5*f*(ST^0)*tD) + 0.02*sin(2*pi*6*f*(ST^0)*tD) + 
                      0.01*sin(2*pi*7*f*(ST^0)*tD))

tonCisD <- tlumeniD * (0.6*sin(2*pi*f*(ST^1)*tD) + 0.2*sin(2*pi*2*f*(ST^1)*tD) + 
                       0.05*sin(2*pi*3*f*(ST^1)*tD) + 0.05*sin(2*pi*4*f*(ST^1)*tD) +
                       0.03*sin(2*pi*5*f*(ST^1)*tD)  + 0.02*sin(2*pi*6*f*(ST^1)*tD) +
                       0.01*sin(2*pi*7*f*(ST^1)*tD))
ND <-     length(tonC1D)

tonC1D[(ND-n+1):(ND)] <- fadeout * tonC1D[(ND-n+1):(ND)] 
tonCisD[(ND-n+1):(ND)] <- fadeout * tonCisD[(ND-n+1):(ND)]
tonC1D[1:n]     <- fadein * tonC1D[1:n] 
tonCisD[1:n]    <- fadein * tonCisD[1:n]

7. Akordy

Součtem dlouhých tónů vytvoříme akordy. Výsledné vektory pak musíme vynásobit takovou hodnotou, aby čísla uvnitř nich, která vznikla součtem čtyř čísel v dílčích vektorech, nebyla větší než 1 - v tom případě by nebylo možné z takových vektorů vytvořit zvuk.

akordDur    <- (tonC1D+tonED+tonGD+tonC2D)*0.4
akordMoll   <- (tonC1D+tonDisD+tonGD+tonC2D)*0.4

8. Sestavení melodie

Jednotlivé tóny a akordy pak řadíme za sebe v melodii.

zvuk <- c(tonC1D, tonDisK, tonC2K, tonAisD, tonGD, tonFD, tonGK, tonFD, tonDisD, akordMoll)

9. Vytvoření zvuku

Nakonec z výsledného vektoru vytvoříme zvuk.

nbits <- 16
zvukMono <- Wave (
    round (zvuk*(2^(nbits - 1))),
    samp.rate = fs, bit = nbits)
writeWave(zvukMono, filename = "melodie.wav")