Cześć
Od dawna chciałem zrobić własny cyfrowy multi-efekt do gitary elektrycznej. Długo nie mogłem zabrać się za to z powodu różnych rzeczy no ale wreszcie jest. Mój projekt dotyczy tylko oprogramowania na gotową płytkę uruchomieniową STM32F746G-DISCO. Jest to raczej koncepcja/prototyp urządzenia a nie gotowy sprzęt który można zabrać na scenę i grać.
Co to jest?
Dla tych którzy nie wiedzą, efekt do gitary jest urządzeniem (bądź oprogramowaniem) służącym do modyfikacji sygnału gitary w celu uzyskania charakterystycznego brzmienia. Takie efekty mogą być oparte wyłącznie o elektronikę analogową, ale również uzyskuje się je za pomocą cyfrowego przetwarzania sygnału czy to na mikrokontrolerze czy w oprogramowaniu komputerowym.
Jak to działa?
Poniżej jest krótki film pokazujący w skrócie działanie urządzenia. Dodaję tam trzy efekty: overdrive, cab sim i reverb a następnie gram krótką melodię. Do wejścia multiefektu bezpośrednio wpięta jest gitara elektryczna a jego wyjście podpięte jest do zwykłego przenośnego głośnika. Później w opisie pojawią się osobne próbki audio dla każdego efektu.
Sprzęt
Nie miałem w planach budowy dedykowanej platformy sprzętowej do tego celu, ponieważ posiadałem już płytkę uruchomieniową z wszystkim co niezbędne, a poza tym bardziej interesowały mnie algorytmy przetwarzania sygnału. Dlatego, tak jak wspomniałem wcześniej projekt działa na płytce STM32F746G-DISCO. Z punktu widzenia użytkownika, istotne są tu wejście i wyjście liniowe audio oraz graficzny wyświetlacz dotykowy.
Oprogramowanie
Trudno mi będzie (i nie chcę) tutaj opisywać w szczegółach kodu więc streszczę się do najważniejszych rzeczy. Projekt napisany jest w C++17. Kod aplikacji odseparowany jest od sprzętu i RTOSa za pomocą warstw abstrakcji. Okaże się czy dobrze to zrobiłem gdy trzeba będzie przenieść kod na coś innego
Kod źródłowy jest na moim githubie, projekt stworzony w Eclipse.
Efekty
Obecnie działa sześć popularnych efektów gitarowych: tremolo, echo/delay, chorus, reverb, overdrive i cab sim (speaker cabinet simulator). Efekty można dodać do „łańcucha” przetwarzania w dowolnej kolejności z poziomu menu. Przetwarzanie sygnału audio jest podwójnie buforowane i odbywa się blokowo, gdzie rozmiar jednego bloku to 128 próbek. Rozmiar bloku przekłada się bezpośrednio na opóźnienie pomiędzy wejściem a wyjściem które wynosi około 6ms. Parametry cyfrowego audio to 24bit/48kHz.
W poniższym opisie efektów w „łopatologiczny” sposób streszczę podstawy ich działania (a po szczegóły zapraszam do literatury podanej na końcu). Zamieszczone próbki audio na początku zawierają czysty sygnał z gitary a dopiero w drugiej połowie efekt jest aktywny.
Tremolo
Jest to chyba najprostszy efekt, który polega na modulacji amplitudy sygnału gitary za pomocą oscylatora niskiej częstotliwości.
Kontrolki do modyfikacji brzmienia:
- rate: częstotliwość oscylatora, zakres 1 - 20Hz
- depth: intensywność modulacji, zakres 0 – 0.5
- mode: kształt modulacji, sinus/prostokąt
Echo
Głównym elementem tego efektu jest linia opóźniająca. Jak wskazuje nazwa, służy do opóźnienia sygnału wejściowego o podaną wartość czasu, który można regulować. Aby uzyskać efekt wielu powtórzeń (echo), sygnał z jej wyjścia podaje się na wejście uprzednio mnożąc go przez współczynnik mniejszy od 1 aby powtórzenia wygasały. Oprócz mnożenia można zastosować w tym miejscu filtr dolnoprzepustowy aby wytłumić wysokie częstotliwości powtórzeń i uzyskać efekt zbliżony do analogowych efektów echo opartych o taśmę magnetyczną.
Kontrolki do modyfikacji brzmienia:
- blur: rozmycie powtórzeń (filtr dolnoprzepustowy), zakres 2 – 8kHz
- time: czas opóźnienia, zakres 0.05 – 1s
- feedback: zanikanie powtórzeń, zakres 0 – 1
- mode: wybór trybu echo/delay
Chorus
Czyli po prostu chór. Głównym mechanizmem tego efektu jest zdublowanie oryginalnego źródła dźwięku, następnie niewielkie przesunięcie go w czasie (i ewentualna modulacja tego czasu) a na końcu zsumowanie z oryginałem. Tu też wykorzystuje się linię opóźniającą, z tym że jej czas opóźnienia jest modulowany oscylatorem niskiej częstotliwości.
Kontrolki do modyfikacji brzmienia:
- depth: intensywność modulacji, zakres 0 – 1
- rate: częstotliwość modulacji, zakres 0.05 – 4Hz
- mix: miks oryginału z efektem, zakres 0 – 1
- mode: wybór odmiany efektu
Reverb
Jest to efekt symulujący pogłos w pomieszczeniu, hali, itp. Zadaniem algorytmu jest stworzenie dosć dużej liczby „odbić” orginalnego sygnału, ich cyrkulacja, ewentualna modulacja, podtrzymanie a potem wytłumienie. Dobrze brzmiący algorytm reverba jest trudny do opracowania i z reguły jest wymagający obliczeniowo ze względu na swoją złożoność. Tutaj wykorzystałem pewną znaną topologię autorstwa J. Dattorro z lat 90 symulującą analogowy pogłos płytowy.
Kontrolki do modyfikacji brzmienia:
- bandwidth: filtr dolnoprzepustowy na wejściu, zakres 0 – 24kHz
- decay: długość pogłosu, zakres 0 – 0.999
- damping: tłumienie odbić (filtr dp), zakres 0 – 24kHz
- mode: tryb efektu bez modulacji/z modulacją
Overdrive
Jeden z najpopularniejszych efektów w muzyce rockowej i metalowej. Głównym zadaniem algorytmu jest zmiana kształtu sygnału w taki sposób aby „obciąć” lub „spłaszczyć” sygnał gdy przekracza pewną wartość. W analogowych efektach uzyskuje się to np. za pomocą diod połączonych antyrównolegle (obcinanie symetryczne). W cyfrowych natomiast, zwykle stosuje się funkcję nieliniową, np.: y = tanh(kx)/tanh(k) gdzie argument x to sygnał wejściowy a y to wyjście. Stosując takie zabiegi wprowadza się do sygnału szereg harmonicznych, dlatego trzeba pamiętać o zmniejszeniu zjawiska aliasingu. W algorytmach overdrive stosuje się do tego celu nadpróbkowanie i decymację.
Kontrolki do modyfikacji brzmienia:
- gain: wzmocnienie sygnału, zakres 1 – 200
- tone: zmiana tonu (basy/soprany), zakres 0 – 1
- mix: miks oryginału z efektem, zakres 0 – 1
- mode: wybór charakteru obcinania soft/hard
Cab sim
To symulacja brzmienia kolumny gitarowej. Przeważnie „nakłada” się ją bezpośrednio za overdrive dzięki czemu nie mamy w słuchawkach straszliwego jazgotu przesterowanego sygnału
Kontrolki do modyfikacji brzmienia:
- lista z impulsami kolumn gitarowych
Co można dodać/poprawić
Mam listę paru rzeczy które w przyszłości planuję dodać:
1) stroik gitarowy
2) zapis/odczyt ustawień (presetów) efektów
3) zaprojektowanie unikalnych paneli efektów (obecnie każdy panel wygląda prawie tak samo)
4) efekt vocoder
5) obsługa przełącznika nożnego (footswitch) do zmiany efektów
A jakie są wasze sugestie?
Zdjęcia
Poniżej parę zdjęć ekranu (wybaczcie za ich jakośc ale trudno mi zrobić dobre zdjęcie temu ekranowi LCD :/)
Źródła
Większość teorii dot. efektów audio znalazłem w poniższych źródłach:
1) Udo Zölzer, DAFX: Digital Audio Effects, Second Edition
2) Will C. Pirkle, Designing Audio Effect Plugins in C++, Second Edition
3) J. Dattorro, Effect Design, Part 1 – 3
a poza tym wszelkie zakamarki internetu.
Jeśli zapomniałem napisać o czymś istotnym - zapytajcie w komentarzach.
Fajne? Ranking DIY