From a702a82f4f47c2dabf2eeb71cbe7317d76431736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gu=C3=A9gan?= Date: Tue, 29 Oct 2024 22:29:59 +0100 Subject: [PATCH] Minor changes --- source/music/code/gamme_naturelle.R | 25 ++++++++++++++++ source/music/code/harmoniques.R | 13 +++++---- source/music/harmoniques.rst | 45 ++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 19 deletions(-) create mode 100755 source/music/code/gamme_naturelle.R diff --git a/source/music/code/gamme_naturelle.R b/source/music/code/gamme_naturelle.R new file mode 100755 index 0000000..e04ccca --- /dev/null +++ b/source/music/code/gamme_naturelle.R @@ -0,0 +1,25 @@ +#!/usr/bin/Rscript + +q=3/2 # Facteur de quinte +t=5/4 # Facteur de tierce + +## Construction de la gamme parfaite +## Les division par deux sont la pour rammener à l'octave +do4=261.63 # do fréquence par convention +sol4=do4*q +re4=sol4*q/2 +fa4=do4*(1/q)*2 +mi4=do4*t +sol4d=mi4*t +re4d=sol4d*q/2 +si4=sol4*t +fa4d=si4*q/2 +la4d=fa4d*t +la4=fa4*t +do4d=la4*t/2 + +names=c("do","do#reb","re","re#/mib","mi","fa","fa#/solb","sol", "sol#/lab", "la", "la#/sib", "si") +frequences=c(do4,do4d,re4,re4d,mi4,fa4,fa4d,sol4,sol4d,la4,la4d,si4) +for( e in Map(list,names,frequences)){ + message(paste0(sprintf("%-8s",e[[1]])," ",e[[2]],"Hz")) +} diff --git a/source/music/code/harmoniques.R b/source/music/code/harmoniques.R index a2d67e7..4e81b35 100755 --- a/source/music/code/harmoniques.R +++ b/source/music/code/harmoniques.R @@ -2,9 +2,9 @@ do4=261.63 # do fréquence par convention do5=2*do4 # do octave suivante -N=27 # Nombre d'harmoniques à explorer +N=8 # Nombre d'harmoniques à explorer (ne pas hésité à faire varier N!) names=c("do","do#reb","re","re#/mib","mi","fa","fa#/solb","sol", "sol#/lab", "la", "la#/sib", "si", "do","NA") -temperee=do4*((2^(1/12))^(0:12)) # Gamme tempere (expliquer plus tard) +naturelle=c(261.63,272.53125,294.33375,306.59765625,327.0375,348.84,367.9171875,392.445,408.796875,436.05,459.896484375,490.55625,2*do4) # Valeurs théoriques de la gamme naturelle (parfaite voir plus loin) ## Ramener à l'octave de do4 toOctave=function(x, i=0){ @@ -18,13 +18,14 @@ toOctave=function(x, i=0){ factors=(1:N/sapply(do4*(1:N),FUN=toOctave)) harmoniques=do4*factors # On calcule les fréquences à l'octave de do4 -## On compare les fréquences trouvé à la gamme tempérée -M=abs(outer(harmoniques,temperee, "-")) # Fonction d'erreur +## On compare les fréquences trouvé à la gamme naturelle +M=abs(outer(harmoniques,naturelle, "-")) # Fonction d'erreur M=t(apply(M,1,FUN=function(row){row==min(row)})) # On selection l'entrée avec l'erreur minimale -v=apply(M,1,FUN=function(row){if(any(row)) (1:13)[row] else 14}) # On selectionne les notes correspondantes +v=apply(M,1,FUN=function(row){if(any(row)) (1:13)[which(row)[1]] else 14}) # On selectionne les notes correspondantes (which est la pour les can ou plusieurs il y a plusieur minima (ici on prends le premier a TRUE)) ## On affiche le résultat for( e in Map(list, 1:N, names[v], sapply(do4*(1:N),FUN=toOctave))){ - message(paste0(e[[1]],"f ",e[[2]])," ",e[[1]],"/",e[[3]]) + message( + paste0(sprintf("%-5s ",paste0(e[[1]],"f")),sprintf("%-10s",e[[2]]),e[[1]],"/",e[[3]])) } diff --git a/source/music/harmoniques.rst b/source/music/harmoniques.rst index c8a65ad..1d055fd 100644 --- a/source/music/harmoniques.rst +++ b/source/music/harmoniques.rst @@ -65,20 +65,18 @@ Le code source suivant détermine pour chacune des harmoniques la note associé .. literalinclude:: code/harmoniques.R :language: R -Example de sortie avec le format : +Example de sortie du programme: .. code-block:: console - 1f do 1/1 - 2f do 2/1 - 3f sol 3/2 - 4f do 4/2 - 5f mi 5/4 - 6f sol 6/4 - 7f la#/sib 7/4 - 8f do 8/4 - 9f re 9/8 - etc... + 1f do 1/1 + 2f do 2/1 + 3f sol 3/2 + 4f do 4/2 + 5f mi 5/4 + 6f sol 6/4 + 7f la#/sib 7/4 + 8f do 8/4 Le *timbre* corresponds aux caracteristiques propres au son d'un instruments, ce qui permet de le reconnaitre. Un do joué sur un piano, @@ -145,14 +143,35 @@ On choisisait les accords qui sonnent le mieux avec le *tempérament mésotoniqu Gamme Tempéré ============== -Il est possible de recontruire l'ensemble des notes d'une tonalité pour que tout les intervalles tombent justent (`source `__). +Il est possible de recontruire l'ensemble des notes d'une tonalité (ce terme sera dévelopé plus tard) pour que toutes les intervalles tombent justent (`source `__). On appelle cela la *gamme naturelle* ou *gamme juste* ou *gamme du physicien*. Sauf que l'on ne pourra pas changer de tonalité sans que celle-ci sonne fausse. Pour cela, il suffit de connaitre les ratios exactes de tierce (:math:`\frac{3}{2}`) ou de quintes (:math:`\frac{5}{4}`) et de contruire l'ensemble des notes avec. Grâce à cette approche, on peu en déduire la valeur théorique de chacune des intervalles en musique. Par example, pour la seconde majeur, on sait que la deuxième quinte de do est ré (intervalle de seconde majeur). On sait également que :math:`f_{do}=261.63` Hz. Ainsi, :math:`f_{ré}=\frac{\frac{3}{2}^2f_{do}}{\underbrace{2}_{\text{Ramène la note à l'octave}}}=294.3293` Hz. En faisant le rapport des fréquences on obtient le ratio d'une seconde majeur :math:`\frac{294.3293}{261.63}=1.125=\frac{9}{8}`. +Le programme suivant génère l'ensemble des fréquence théorique de chacune des notes de la gamme naturelle: +.. literalinclude:: code/gamme_naturelle.R + :language: R + +Sortie du programme: + +.. code-block:: console + + do 261.63Hz + do#reb 272.53125Hz + re 294.33375Hz + re#/mib 306.59765625Hz + mi 327.0375Hz + fa 348.84Hz + fa#/solb 367.9171875Hz + sol 392.445Hz + sol#/lab 408.796875Hz + la 436.05Hz + la#/sib 459.896484375Hz + si 490.55625Hz + Comme on ne peut pas utiliser toutes les tonalités avec une gamme parfaitement accordée, la *gamme tempéré* propose de répartir l'ensemble des désaccords sur toutes les notes. Il s'agit de l'accordage utilisé de nos jours. Ansi, pour passer d'une note à la suivante, on multiplie par facteur :math:`2^\frac{1}{12}`. @@ -161,7 +180,7 @@ Le code suivant génère l'ensemble des notes de la *gamme tempérée*: .. literalinclude:: code/temperee.R :language: R - + .. list-table:: Exemple d'approximations des intervalles faites par la gamme tempérée. Tout les intervalles sont légèrement faux à part l'octave. :align: center :header-rows: 1