Ta je zapotřebí, protože skript bude vytvářet zvuk.
library(tuneR)
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)
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)
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))
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]
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]
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
Jednotlivé tóny a akordy pak řadíme za sebe v melodii.
zvuk <- c(tonC1D, tonDisK, tonC2K, tonAisD, tonGD, tonFD, tonGK, tonFD, tonDisD, akordMoll)
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")