Introdução
Vamos usar como referência a escala de temperamento igual, onde a afinação tem como base o Lá na quarta oitava que vibra na frequência de 440 Hz A4 = 440.00
. Isso significa que se tocarmos esse Lá no violão, a corda vibrará 440 vezes por segundo.
Se multiplicarmos essa frequência por 2, vamos encontrar o A5 = 880.00
. Que nada mais é que oito notas (uma oitava) acima desse lá. Na música é chamado de escala cromática as notas com seus respectivos intervalos de semitons entre elas.
note que existe diferença entre escala maior e escala cromática
Em uma escala cromática ascendente começando pelo dó, por exemplo, encontramos as seguintes notas:
C - C# - D - D# - E - F - F# - G - G# - A - A# - B
(Total de 12 semitons)
Para encontrarmos a frequência do semiton acima do A4 podemos usar a fórmula:
A#4 = A4 * 21/12
A mesma lógica pode ser aplicada para encontrarmos semitons abaixo do A4:
F = A4 * 2-4/12 (onde F é 4 semitons abaixo de A4)
Limites da audição humana
O ouvido humano é capaz de captar frequências de som entre 16 e 20.000 (hz). Como a nota mais baixa que conseguimos ouvir é o C0 = 16(hz)
, podemos utilizá-lo na nossa fórmula para encontrar a tonalidade de uma determinada frequência. Uma tabela com as frequências sonoras pode ser encontrada em https://pages.mtu.edu/~suits/notefreqs.html
Matemática
Para uma tonalidade T, o número de semitons de C0 até T é:
S = 12 log2(T / C0)
Algoritmo
Trecho de um código em python que calcula o número de semitons de C0 até uma frequência, e então computa a tonalidade correspondente:
from math import log2, pow
A4 = 440
C0 = A4*pow(2, -4-9/12)
sigla = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
def tom(frequencia):
semitom = round(12*log2(frequencia/C0))
oitava = semitom // 12
nota = semitom % 12
return f"{sigla[nota]}{str(oitava)}"
Na linguagem C:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int tom(double frequencia)
{
double A4 = 440;
double C0 = A4 * pow(2, -4.75);
char* sigla[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};
double semitons = round(12*log2(frequencia/C0));
int oitava = semitons / 12;
int nota = (int) semitons % 12;
printf("%s%d\n", sigla[nota], oitava);
return 0;
}
O tom A4 possui sua propria variável para caso você precise modificar o código para uma afinação diferente.
Crédito do trecho em python: https://www.johndcook.com/blog/2016/02/10/musical-pitch-notation/