31 lines
1.5 KiB
R
Executable file
31 lines
1.5 KiB
R
Executable file
#!/usr/bin/Rscript
|
|
|
|
do4=261.63 # do Fréquence de convention
|
|
do5=2*do4 # do à l'octave suivante
|
|
N=8 # Nombre d'harmoniques à explorer (faire varier!)
|
|
names=c("do","do#reb","re","re#/mib","mi","fa","fa#/solb","sol", "sol#/lab", "la", "la#/sib", "si", "do","NA")
|
|
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
|
|
|
|
## Ramener à l'octave de do4 en divisant par 2 autant de fois que nécessaire
|
|
toOctave=function(x, i=0){
|
|
if(x<=do5) # On verifie si on est à l'octave de do4
|
|
2^i
|
|
else
|
|
toOctave(x/2, i+1)
|
|
}
|
|
|
|
## On calcule les facteurs permettant de passer à l'octave de do4 pour chaque harmoniques
|
|
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ées à la gamme naturelle
|
|
M=abs(outer(harmoniques,naturelle, "-")) # Calcule de l'erreur à la gamme naturelle
|
|
M=t(apply(M,1,FUN=function(row){row==min(row)})) # On selectionne les entrées avec l'erreur minimale
|
|
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 cas avec plusieurs minima(s), on choisir arbitrairement le premier
|
|
|
|
## On affiche le résultat
|
|
for( e in Map(list, 1:N, names[v], sapply(do4*(1:N),FUN=toOctave))){
|
|
message(
|
|
paste0(sprintf("%-5s ",paste0(e[[1]],"f")),sprintf("%-10s",e[[2]]),e[[1]],"/",e[[3]]))
|
|
}
|
|
|