Częstotliwość na nutę…

Ostatnio zostałem postawiony przed ciekawym problemem zamiany częstotliwości dźwięku na nutę. Przez nutę rozumiem „nazwę” dźwięku (jak. C, D, E, itd.) oraz oktawę.

Po krótkim używaniu Google i przyglądaniu się różnym stronom Wikipedii okazało się to być prostsze niż się na początku zdawało. Funkcja konwertująca wygląda następująco:

f(x) = log2(x/440)*12 + 57

Wzór ten zwraca jak widać jedną liczbę w której zakodowany jest numer dźwięku oraz oktawa. Aby wydostać te informacje wystarczy kawałek kodu:

int tmp = (int)(log( freq / 440 ) / log(2) * 12 + 57.5);
int note = tmp % 12;
int octave = tmp / 12;

W powyższym przykładzie dodałem 57.5 zamiast 57. Jest to spowodowane potrzebą zaokrąglenia. Jeśli przy konwersji na typ int zostanie obcięta część ułamkowa to dodanie 0.5 pozwoli zaokrąglić wartość matematycznie bez używania dodatkowych funkcji.

W wyniku działania kodu otrzymujemy dwunastostopniową skalę dla zmiennej note, w której numery 0, 1, 2… odpowiadają kolejno dźwiękom C, C#, D, D#, …

Jeśli natomiast chcielibyśmy  zrobić coś odwrotnego – zamienić nutę (na częstotliwość) to wystarczy znaleźć funkcję odwrotną do podanej powyżej. Czyli coś takiego:

f^(-1)(x) = 440 * 2^((x-57)/12)

double getFrequency(int note, int octave) {
return 440 * pow(2,  (octave*12+note-57)/12 );
}

Tym sposobem mamy funkcje do zamiany częstotliwości dźwięków na nuty i odwrotnie 🙂 Nie jest to specjalnie odkrywcze gdyż podobne wzory podane są na wikipedii. Jedyna różnica jest taka, że tam wzór jest trochę inny gdyż odpowiada tej tablicy. U mnie natomiast dźwięk 0 częstotliwości 12.352 (C0) będzie miał numer 0 (a nie -48). Wszystko to kwestia dostosowania wartości 57 z powyższych wzorów do własnych potrzeb.

Reklamy

Jedna myśl nt. „Częstotliwość na nutę…

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s