// C.f. la série 8 sur le traitement de sons
// Le but est de traiter des sons avec Scilab
// Références :
// https://help.scilab.org/docs/5.3.3/fr_FR/wavread.html
// https://help.scilab.org/doc/5.5.2/en_US/section_d11cd0f9e362390f953e7199c5bb4b3a.html
// https://atoms.scilab.org/
// http://blogs.zynaptiq.com/bernsee/time-pitch-overview/   pour Time stretching  and  Pitch shifting.

funcprot(0); // pour ne pas afficher le message : "redefining function".

function ex0()
//============
// Test la fonction "sleep" et la mesure de temps d'exécution d'une suite d'instructions
tic(); // Démarre le chronométrage
sleep(1350); 
disp(toc()); // Affiche la durée de la pause

yy=loadwave("c:\Travail\cash.wav");
tic(); // Démarre le chronométrage
disp(toc()); // Affiche la durée de la pause

for nn=1:3 do
  playsnd(yy)
  disp(toc()); // Affiche la durée de la pause
  end

endfunction
//ex0();

function ex1()
//============
// Manipulation d'un son "cash.wav" pour apprendre les manipulations de bases d'un son.
yy=loadwave("c:\Travail\cash.wav");
tic(); // Démarre le chronométrage
playsnd(yy)
disp(toc()); // Affiche la durée de la pause
sleep(1000);
disp(toc()); // Affiche la durée de la pause
disp("taille de ''cash.wav'' = " + string(size(yy, 1)) + "  " + string(size(yy, 2)));

scf(1);
clf()
plot(yy(1,:));

scf(2);
clf()
plot(yy(2,:), 'r');
// On constate que les deux canaux de ce son sont identiques.

// c.f. https://help.scilab.org/docs/5.3.3/fr_FR/wavread.html
[y2, Fs, bits] = wavread("c:\Travail\cash.wav")
disp(size(y2));
disp(Fs);
disp(bits);

playsnd(y2, 44100);
playsnd(y2, 11025);

// Double l'intensité du son
y3 = y2*2;
//playsnd(y3);

// Diminution de l'intensité du son
nLen = size(y2,2) // Longueur du vecteur
for jj=1:nLen do
    y3(1,jj) = y2(1,jj) * (nLen - jj) / nLen
    y3(2,jj) = y2(2,jj) * (nLen - jj) / nLen
    end
disp(toc()); // Affiche la durée de la pause
playsnd(y3);
disp(toc()); // Affiche la durée de la pause

//savewave("c:\Travail\cash_2.wav", y3, Fs, 16);

nLenTot = size(y3,2) // Longueur du vecteur
at = linspace(0, nLenTot/Fs, nLenTot);

scf(3);
clf()
plot(at, y3(1,:), 'g');
endfunction
//ex1();

function ex2()
//============
// Manipulation d'un son "chunk.wav" pour apprendre les manipulations de bases d'un son.
[yy, Fs, bits] = wavread("c:\Travail\chunk.wav")
disp("taille de ''cash.wav'' = " + string(size(yy,1)) + "  " + string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));
playsnd(yy)

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

scf(1);
clf()
plot(at, yy(1,:));

scf(2);
clf()
plot(at, yy(2,:), 'r');
// On constate que les deux canaux de ce son sont identiques.

playsnd(yy, 44100); // Joue le son à une fréquence plus élevée.
playsnd(yy, 11025); // Joue le son à une fréquence plus basse.
// Par défaut, la fréquence est de 22'050 [Hz]

// Double l'intensité du son
y2 = yy*2;
playsnd(y2);

// Diminution de l'intensité du son
for jj=1:nLenTot do
    y2(1,jj) = yy(1,jj) * (nLenTot - jj) / nLenTot
    y2(2,jj) = yy(2,jj) * (nLenTot - jj) / nLenTot
    end
playsnd(y2);

scf(3);
clf()
plot(at, y2(1,:), 'g');
endfunction
//ex2();

function ex3()
//============
// Création de l'écho d'un son.
[yy, Fs, bits] = wavread("c:\Travail\chunk.wav")
disp("taille de ''cash.wav'' = " + string(size(yy,1)) + "  " + string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau

y2 = yy(1,:); // Duplifie le son, en ne gardant que le premier canal.

// Ajoute un écho
/*  Amélioration ci-dessous
for jj=1:nLenTot do
    y2(nLenTot + jj) = y2(jj) * 0.3;
    y2(2*nLenTot + jj) = y2(jj) * 0.3^2;
    y2(3*nLenTot + jj) = y2(jj) * 0.3^3;
    end
*/
y2(nLenTot+1:2*nLenTot) = yy(1,:) * 0.3;
y2(2*nLenTot+1:3*nLenTot) = yy(1,:) * 0.3^2;
y2(3*nLenTot+1:4*nLenTot) = yy(1,:) * 0.3^3;
y2(4*nLenTot+1:5*nLenTot) = yy(1,:) * 0.3^4;

// Graphique du son avec son écho
//disp(is_handle_valid(get_figure_handle(1)))
//xdel(winsid()); // Efface toutes les fenêtres graphique, donc les nouvelles viendront devant.
win_position = gdf().figure_position; // Position par défaut de la fenêtre graphique.
if (size(get_figure_handle(1)) <> [0, 0]) then
    win_position = get_figure_handle(1).figure_position; // Récupère la position de la figure
    xdel(1); // Efface la fenêtre, pour qu'elle réapparaisse devant les autres.
end

nLenTot2 = size(y2,2)
at = linspace(0, nLenTot2/Fs, nLenTot2);
win1 = scf(1);
clf()
plot(at, y2, 'g');
//show_window(win1); // Ne marche pas !

// C.f. : https://help.scilab.org/doc/5.5.2/en_US/figure_properties.html
win1.figure_position = win_position; // Positionne la fenêtre graphique

// Joue le son avec son écho
playsnd(y2, Fs);
endfunction
//ex3();

function ex4()
//============
// Inversion d'un son pour le jouer de la fin vers le début
[yy, Fs, bits] = wavread("c:\Travail\cash.wav")
disp("taille de ''cash.wav'' = " + string(size(yy,1)) + "  " + string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour n'avoir plus qu'un vecteur ligne
yy = yy(2,:);

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

// Inverse le son, le lit donc de la fin vers le début.
/* Amélioration ci-dessous
for jj=1:nLenTot do
    y2(nLenTot+1 - jj) = yy(jj);
    end

y2 = y2'; // Pour le transformer en vecteur ligne
*/

y2=yy(nLenTot:-1:1) // Inverse le vecteur

// Graphique du son
scf(1);
clf()
plot(at, yy, 'b');

// Graphique du son inversé
scf(2);
clf()
plot(at, y2, 'g');

// Joue le son
playsnd(yy, Fs);

// Joue le son inversé
playsnd(y2, Fs);
endfunction
//ex4();

function ex5()
//============
// // Inversion d'un texte prononcé par une personne pour le jouer de la fin vers le début
[yy, Fs, bits] = wavread("c:\Travail\text02.wav")
//[yy, Fs, bits] = wavread("c:\Travail\text_abcd.wav")
disp("taille de ''text01.wav'' = " +  string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);
y2=yy(nLenTot:-1:1) // Inverse le vecteur

// Graphique du son
scf(1);
clf()
plot(at, yy, 'b');

// Graphique du son inversé
scf(2);
clf()
plot(at, y2, 'g');

// Joue le son
playsnd(yy, Fs);

// Joue le son inversé
playsnd(y2, Fs);
endfunction
//ex5();

function ex6()
//============
// Filtre passe bas.
// On fait la moyenne des amplitudes, ce qui filtre les hautes fréquences.
[yy, Fs, bits] = wavread("c:\Travail\text_filtre_Hautes_Frequences.wav")
disp("taille de ''text01.wav'' = " +  string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

// Graphique du son avant filtrage
scf(1);
clf()
plot(at, yy, 'b');

coef = 0.001;
vMoyenne = yy(1); // On commence avec la première amplitude
// Filtre avec une moyenne flottante.
for jj=1:nLenTot do
    vMoyenne = yy(jj)*coef + vMoyenne*(1-coef); // Moyenne pondérée flottante
    yy(jj) = vMoyenne;
    end

// Amplification
yy = 80*(yy - sum(yy) / nLenTot);

// Graphique du son après filtrage
plot(at, yy, 'g');

// Joue le son
playsnd(yy, Fs);
endfunction
//ex6();


function ex7()
//============
// Filtre passe bas.
// On fait la moyenne des amplitudes, ce qui filtre les hautes fréquences.
[yy, Fs, bits] = wavread("c:\Travail\text_filtre_Hautes_Frequences.wav")
disp("taille de ''text01.wav'' = " +  string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

// Graphique du son avant filtrage
scf(1);
clf()
plot(at, yy, 'b');

// Filtre
//nLenFiltre = round(Fs*0.001);
nLenFiltre = 5;
for jj=nLenFiltre+1:(nLenTot-nLenFiltre) do
    y2(jj) = sum(yy(jj-nLenFiltre:jj+nLenFiltre)) / (2*nLenFiltre);
    end

// Amplification
y2 = (y2 - sum(y2) / nLenTot);
y2(1:nLenFiltre) = 0;
y2(nLenTot-nLenFiltre:nLenTot) = 0;

// Graphique du son après filtrage
//scf(2);
//clf()
plot(at, y2, 'r');

// Joue le son
playsnd(y2, Fs);
endfunction
//ex7();
// Une amélioration possible serait d'utiliser une fenêtre de filtrage qui n'est pas carrée
// Par exemple avec une fenêtre de forme en cloche.

function ex8()
//============
// Filtre passe bas.
// On fait la moyenne des amplitudes, ce qui filtre les hautes fréquences.
// Amélioration avec une fenêtre de filtre en cloche
[yy, Fs, bits] = wavread("c:\Travail\text_filtre_Hautes_Frequences.wav")
disp("taille de ''text01.wav'' = " +  string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

// Graphique du son avant filtrage
scf(1);
clf()
plot(at, yy, 'b');

// Filtre
//nLenFiltre = round(Fs*0.001);
nLenFiltre = 15;
for jj=nLenFiltre+1:(nLenTot-nLenFiltre) do
    y2(jj) = sum(yy(jj-nLenFiltre:jj+nLenFiltre) .* sin((0:2*nLenFiltre) * %pi / (2*nLenFiltre))) / (2*nLenFiltre);
    end

// Amplification
y2 = 2*(y2 - sum(y2) / nLenTot);
y2(1:nLenFiltre) = 0;
y2(nLenTot-nLenFiltre:nLenTot) = 0;

// Graphique du son après filtrage
//scf(2);
//clf()
plot(at, y2, 'r');

// Joue le son
playsnd(y2, Fs);
endfunction
//ex8();

function ex9()
//============
// Filtre passe bas.
// On fait la moyenne des amplitudes, ce qui filtre les hautes fréquences.
// Amélioration avec une fenêtre de filtre en cloche
[yy, Fs, bits] = wavread("c:\Travail\text_filtre_Hautes_Frequences_avec_bruit2.wav")
disp("taille de ''text01.wav'' = " +  string(size(yy,2)));
disp("Fréquence d''échantillonage = " + string(Fs));
disp("Nombre de bites d''échantillonage = " + string(bits));

// Pour avoir la durée totale du son
nLenTot = size(yy, 2); // Dimension du vecteur = longueur de tableau
at = linspace(0, nLenTot/Fs, nLenTot);

// Graphique du son avant filtrage
scf(1);
clf()
plot(at, yy, 'b');

// Filtre
//nLenFiltre = round(Fs*0.001);
nLenFiltre = 40;
for jj=nLenFiltre+1:(nLenTot-nLenFiltre) do
    y2(jj) = sum(yy(jj-nLenFiltre:jj+nLenFiltre) .* sin((0:2*nLenFiltre) * %pi / (2*nLenFiltre))) / (2*nLenFiltre);
    end

// Amplification
y2 = 7*(y2 - sum(y2) / nLenTot);
y2(1:nLenFiltre) = 0;
y2(nLenTot-nLenFiltre:nLenTot) = 0;

// Graphique du son après filtrage
//scf(2);
//clf()
plot(at, y2, 'r');

// Joue le son
playsnd(yy, Fs);

playsnd(y2, Fs);
endfunction
//ex9();

