a spinning rat

PinheiroCosta

Música

Frequência Sonora

Tags: música , python e C

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/