2

#DIOProGrátis - Algoritmo de Frequência Sonora

#Python
Rômulo Pinheiro
Rômulo Pinheiro

Introdução

Neste artigo você vai encontrar informações úteis na hora de escrever um algorítmo que computa a tonalidade de uma determinada frequência sonora. Ao final do texto deixarei três exemplos de algoritmo utilizando Python, Javascript, e a linguagem C.


Teoria Musical

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á. Entre essas duas oitavas existe também, o que na música chamamos de escala cromática, que são 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 seguinte fórmula:

A#4 = A4 * 21/12

(leia-se Lá sustenido na quarta oitava é igual a Lá na quarta oitava vezes dois elevado a um dividido por doze)


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:


Python

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)}"


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;

}


Javascript:

function tom(soundFrequency) 
{
    const frequencia = parseFloat(soundFrequency);   
    const sigla = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; 
    
    const A4 = parseFloat(440); 
    const C0 = parseFloat(A4 * Math.pow(2, -4.75));

    const semitons = Math.round(12 * Math.log2(frequencia/C0)); 
    const oitava = parseInt(semitons / 12); 
    const nota = parseInt(semitons % 12); console.log(sigla[nota] + oitava);

    return String(sigla[nota] + oitava); 
}


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/

2
55

Comentários (2)

1
CARLOS SILVA

CARLOS SILVA

26/08/2021 18:36

Valeu Rômulo Costa,

Super recomendo refazer esses exemplo para compreendermos, vou tentar fazer com C#.


Tudo de bom,

1
Joilson Silva

Joilson Silva

26/08/2021 17:55

Nossa um universo a parte, unir as linguagens de programação e musical! Espero poder crescer no aprendizado, por enquanto estou na busca, mas em breve pretendo retornar para compreender melhor.

Passa a maior parte do tempo testando novas ideias e se surpreendendo com o que o Linux é capaz de fazer.

Brasil