%% DEMO_aani.m
% T-61.2010 Datasta tietoon 
% T-61.3015 Digitaalinen signaalinkäsittely ja suodatus
% Demo Ääni
%
% Jukka Parviainen, parvi@tkk.fi, 201011110

%% Syntetisoidaan ääniä valmiilla funktiolla mySynthVoice
%
% Katso argumenttien merkitys "help mySynthVoice"
% tai/ja aja alla olevat valmiit esimerkit.
%
% Funktiolla mySynthVoice voi helposti luoda harmonisia
% ääniä, joissa signaalin taajuudet ovat jonkun perustaajuuden
% monikertoja.
%
% Mitä enemmän sinikomponentteja on esityksessä, sitä
% "monimutkaisemman" signaalin se pystyy esittämään.
% Toisin päin: jos signaalin spektri koostuu muutamista
% piikeistä, se koostuu silloin muutamasta sinistä ja 
% on yleensä "varsin jaksollisen" oloinen. Jaksollisuus
% riippuu ennen kaikkea sinikomponenttien taajuuksien
% monikerroista (harmonisuudesta).

%% Avautuvat ikkunat Fig 101, 102, 103, 104
%
% Ikkuna 101: koko signaalin aaltomuoto.
%   Tämä usein vain "sinistä", koska näytteitä niin paljon.
%   Jos mukana vaimennus, niin tämä näkyy ns. verhokäyrästä.
%   Voit katsoa signaalin sisään valitsemalla ikkunan yläosasta
%   suurennuslasin, menemällä ikkunan valkoiselle osalle,
%   vetämällä kapea laatikko (pidä vasen hiiri pohjassa).
%
% Ikkuna 102: zoomaus ajan suhteen. 
%   Tästä tod.näk. näkyy jo aaltomuoto.
%  


%% Esimerkki #1: sekunnin pitkän 100 Hz:in ääni
%
%$$x = cos(2*pi*100*t/16000)$$
%
% jossa fT = 16000 Hz on näytteenottotaajuus. Yksi puhdas
% sinisignaali taajuudella f = 100 Hz. Voi olla, ettei kuulu
% huonoista kuulokkeista; nosta tällöin taajuutta.
%
mySynthVoice(100);

%% Esimerkki #2: sekunnin pitkän ääni koostuen neljästä sinistä
%
%$$x = sum_i A_i * cos(2*pi*f_i*t/16000)$$
%
% jossa f_1 = 400 Hz, f_2 = 700 Hz, f_3 = 840 Hz, f_4 = 1020 Hz,
% ja vastaavat voimakkuudet A_i = {1, 1, 1, 0.5}
%
mySynthVoice([400 700 840 1020], [1 1 1 0.5]);

%% Esimerkki #3: sekunnin pitkä harmoninen A4-ääni (440 Hz)
%
%$$x = 1*cos(2*pi*440*t/fT + p1) + 0.6*cos(2*pi*880*t/fT + p2) + ...$$
%
% Mukana 440 Hz, 880 Hz, 1320 Hz, 1760 Hz eri vahvuuksilla.
% Pituus oletusarvon 1 sekunti.
mySynthVoice(440*[1 2 3 4], [1 0.6 0.3 0.2], randn(1,4));

%% Esimerkki #4: 2 sekuntia pitkä vaimeneva harmoninen A4-ääni (440 Hz)
%
%$$x = 1*cos(2*pi*440*t/fT + p1) + 1*cos(2*pi*1320*t/fT + p2) + ...$$
%
% Mukana 440 Hz, 1320 Hz, 2200 Hz, 3080 Hz samoilla vahvuuksilla
% ja ilman vaihe-eroja.
mySynthVoice(440*[1 3 5 7], ones(1,4), zeros(1,4), 2, 1);

%% Esimerkki #5: kolmisointu C-E-G
%
% Luodaan kolme eri ääninäytettä x_i ja summataan ne yhteen.
%
% Nuottien Hertz-määrät (A4 440 Hz), esim.
%  http://www.phy.mtu.edu/~suits/notefreqs.html
%   C4	261.63
%   C#4/Db4	277.18
%   D4	293.66
%   D#4/Eb4	311.13
%   E4	329.63
%   F4	349.23
%   F#4/Gb4	369.99       ...
%   G4	392.00           = 440*2^(-2/12)
%   G#4/Ab4	415.30       = 440*2^(-1/12)
%   A4	440.00           = 440*2^(0)
%   A#4/Bb4	466.16       = 440*2^(1/12)
%   B4	493.88           = 440*2^(2/12)
%   C5	523.25           ...

% Painetaan ensin C, sitten E ja lopuksi G pienillä viiveillä
[xC, fT] = mySynthVoice(261.63*[1 3 5 7], [1 0.5 0.4 0.3], ...
    randn(1,4), 2, 1);
xE = mySynthVoice(329.63*[1 3 5 7], [1 0.5 0.4 0.3], ...
    randn(1,4), 1.9, 1);
xG = mySynthVoice(392*[1 3 5 7], [1 0.5 0.4 0.3], ...
    randn(1,4), 1.8, 1);

lenC   = length(xC);
lenE   = length(xE);
lenG   = length(xG);

% Yhdistetään ykdeksi ääneksi
x  = xC + [zeros(1,lenC-lenE) xE] + [zeros(1,lenC-lenG) xG];

% Kuunnellaan
soundsc(x, fT);

% Piirretään
t  = [1 : lenC]/fT;
figure(1); clf; plot(t, x);
figure(2); clf; spectrogram(x, 256, 128, 256, fT, 'yaxis');

% Kirjoitetaan äänitiedostoon
% wavwrite(0.9*x/max(abs(x)), fT, 8, 'sointu_dCEG.wav');

