#!/usr/bin/Rscript do4=261.63 # do fréquence par convention do5=2*do4 # do octave suivante N=27 # Nombre d'harmoniques à explorer 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) ## Ramener à l'octave de do4 toOctave=function(x, i=0){ if(x<=do5) # On verifie si on est au bonne octave 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é à la gamme tempérée M=abs(outer(harmoniques,temperee, "-")) # 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 ## 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]]) }