2024-10-29 11:17:29 +01:00
#!/usr/bin/Rscript
do4 = 261.63 # do fréquence par convention
do5 = 2 * do4 # do octave suivante
2024-10-29 22:29:59 +01:00
N = 8 # Nombre d'harmoniques à explorer (ne pas hésité à faire varier N!)
2024-10-29 11:17:29 +01:00
names = c ( " do" , " do#reb" , " re" , " re#/mib" , " mi" , " fa" , " fa#/solb" , " sol" , " sol#/lab" , " la" , " la#/sib" , " si" , " do" , " NA" )
2024-10-29 22:29:59 +01:00
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)
2024-10-29 11:17:29 +01:00
## 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
2024-10-29 22:29:59 +01:00
## On compare les fréquences trouvé à la gamme naturelle
M = abs ( outer ( harmoniques , naturelle , " -" ) ) # Fonction d'erreur
2024-10-29 16:35:58 +01:00
M = t ( apply ( M , 1 , FUN = function ( row ) { row == min ( row ) } ) ) # On selection l'entrée avec l'erreur minimale
2024-10-29 22:29:59 +01:00
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))
2024-10-29 11:17:29 +01:00
## On affiche le résultat
for ( e in Map ( list , 1 : N , names [v ] , sapply ( do4 * ( 1 : N ) , FUN = toOctave ) ) ) {
2024-10-29 22:29:59 +01:00
message (
paste0 ( sprintf ( " %-5s " , paste0 ( e [ [1 ] ] , " f" ) ) , sprintf ( " %-10s" , e [ [2 ] ] ) , e [ [1 ] ] , " /" , e [ [3 ] ] ) )
2024-10-29 11:17:29 +01:00
}