logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Cyfrowy multiefekt gitarowy

Kwarcu 13 Gru 2023 13:10 5022 16

TL;DR LABEL_AI_GENERATED

  • Cyfrowy multiefekt gitarowy działa jako software na płytce STM32F746G-DISCO i obejmuje tremolo, echo/delay, chorus, reverb, overdrive oraz cab sim.
  • Kod napisano w C++17 z warstwami abstrakcji od sprzętu i RTOS-a, w stylu MVC, a moduły komunikują się zdarzeniami przez kolejki RTOS-a.
  • Audio przetwarzane jest blokowo z podwójnym buforowaniem, w blokach po 128 próbek, przy parametrach 24bit/48kHz i opóźnieniu około 6 ms.
  • Projekt działa jako prototyp/koncepcja urządzenia, a nie gotowy sprzęt sceniczny, choć autor pokazuje działanie na gitarze i głośniku oraz planuje dalsze funkcje.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • Płytka uruchomieniowa STM32F746G-DISCO z wyświetlaczem pokazującym napis GMFX oraz widoczne kable audio i sieciowy.

    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 ;). Poza tym aplikacja jest napisana w stylu wzorca MVC (Model-View-Controller) żeby uzyskać separację pomiędzy głównymi modułami. Model zawiera procesor efektów wraz z algorytmami, view zawiera wszystko co związane z wyświetlaczem i interakcją z użytkownikiem a controller jest pośrednikiem pomiędzy tymi dwoma. Dzięki temu można w miarę łatwo np. dodać kolejny moduł view gdzie interakcja z użytkownikiem i sterowanie urządzeniem będzie się odbywać przez np. terminal. Wspomniane moduły komunikują się za pomocą zdarzeń (event-driven) których mechanizm oparty jest o kolejki RTOSa.

    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.

    tremol..wav (1.82 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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ą.

    echo.wav (1.85 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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.

    chorus.wav (2.09 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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.

    reverb.wav (3.05 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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ę.

    overdri...wav (2.2 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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 ;). Jest to tak naprawdę taki korektor graficzny bez możliwości regulacji. Algorytm polega na wykonaniu splotu odpowiedzi impulsowej danej kolumny z sygnałem audio. Taki splot dla długich odpowiedzi impulsowych jest kosztowny obliczeniowo dlatego stosuje się tu tzw. „szybki” splot za pomocą FFT.

    cab si..wav (2.28 MB)Musisz być zalogowany, aby pobrać ten załącznik.

    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 :/)

    Ekran dotykowy STM32F746G-DISCO z ustawieniami efektu Chorus
    Ekran multiefektu gitarowego z ustawieniem efektu chorus.
    Ekran dotykowy z listą efektów gitarowych: Tremolo, Chorus, Reverb i opcjami edycji.
    Ekran dotykowy z ustawieniami głośności audio oraz obciążeniem CPU 6%.

    Ź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
    O autorze
    Kwarcu
    Poziom 13  
    Offline 
    Kwarcu napisał 78 postów o ocenie 67, pomógł 5 razy. Mieszka w mieście Kraków. Jest z nami od 2007 roku.
  • REKLAMA
  • #2 20859473
    gulson
    Administrator Systemowy
    Posty: 29527
    Pomógł: 150
    Ocena: 6123
    Dzięki za prezentacje! To dopiero nowoczesność się wkradła.
    Ostatnio dzieciaki znajomych mieli gitarę elektryczną, podłączoną do tabletu i słuchawki, tak sobie brzdękali a efekt był niesamowity.
    Niedługo pewnie dodadzą do tego wspomagacz w postaci sztucznej inteligencji.
    Odezwij się z paczkomatem i wyślę mały upominek ;)
    Chciałbym też przetłumaczyć prezentację i wrzucić na cały świat: elektroda.com
  • #3 20859489
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    gulson napisał:
    Niedługo pewnie dodadzą do tego wspomagacz w postaci sztucznej inteligencji.

    Takie rzeczy już się dzieją. Powstał niedawno taki projekt "Neural Amp Modeler" (jako wtyczka do DAW) który wykorzystuje uczenie maszynowe do modelowania brzmień wzmacniaczy. Ponoć brzmi to naprawdę dobrze.
  • REKLAMA
  • #4 20859903
    austin007
    Poziom 17  
    Posty: 768
    Pomógł: 6
    Ocena: 278
    Fajny projekt i na pewno dużo pracy. Czy na słabszych platformach jak STM32F7F4 działałoby czy musi być na STM32F7F7?
  • #5 20859962
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    austin007 napisał:
    Fajny projekt i na pewno dużo pracy. Czy na słabszych platformach jak STM32F7F4 działałoby czy musi być na STM32F7F7?

    Na Cortexach M4 z FPU spokojnie pojedyncze efekty da się zrealizować. Ważne żeby miał sprzętowe wsparcie dla liczb typu float i jakieś przyzwoite taktowanie, powyżej 100MHz. Jednal wiele zależy od algorytmu efektu, bo u mnie proste efekty (tremolo, chorus, echo) zajmują ok. 3 - 10% czasu CPU, a reverb i cab sim już około 25%. Cortex-M4 będzie wolniejszy od M7 bo nie ma np. branch prediction i pamięci podręcznych I-Cache, D-Cache.
  • #6 20860036
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    Świetna rzecz i gratuluję zawzięcia. Kawał fajnej programistycznej roboty.
    Mam jednak kilka pytań bo sam w bardzo podobnym temacie utknąłem... a jak widać warto powrócić bo satysfakcja musi być spora.

    1. Z kodu widzę, że jako DAC masz WM8994 czy jako ADC korzystasz z tego 12-bitowego wbudowanego w uC?

    2. Nie rozważałeś zbudowania tego na nieco szybszym uC zamiast 216MHz np. 550MHz lub 480MHz? Może zamiast latencji 6ms miałbyś 3ms. a to już gra warta świeczki bo takie 3ms podczas grania są już niemal pomijalne. Co stanęło na przeszkodzie by wykorzystać silniejszy układ?

    3. Z czystej ciekawości zapytam o sposób przechowywania plików z grafikami (https://github.com/kwarc93/audio-multieffect/blob/master/app/view/lcd_view/images/ui_img_btn_1_inact_png.c)
    Nie da się tego jakoś mniej "rzeźniczo" przekazywać podczas programowania układu? Ten FreeRTOS nie daje jakiś ułatwień dla "człowiekowatych"?

    4. Czy długo walczyłeś z konfiguracją bibliotek DSP CMSIS? Kiedyś próbowałem je okiełznać na STM32F446 na Nucleo ale poległem. Ostatecznie zbudowałem układ na ADAU1701 - jednak niesmak porażki i braku pełnej swobody obróbki sygnału pozostał :-)
  • #7 20860088
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    @katakrowa
    Dzięki za zainteresowanie ;)
    Co do pytań:
    1. Tak, ADC/DAC to WM8994, do niego są podpięte gniazda jack na płytce.
    2. Zrobiłem to na tej platformie bo po prostu miałem ją pod ręką i dobrze znam STM32. Na początku nie wiedziałem jakie i ile efektów ta płytka pociągnie. Latencję da się tu zmniejszyć dwukrotnie (zmniejszając bufory audio) ale wtedy wzrośnie zużycie CPU, ograniczy się max. liczba efektów w łańcuchu, GUI będzie bardziej klatkować, itp. Dla mnie obecna latencja jest akceptowalna.
    3. Taki sposób przechowywania obrazu to oczywiście jeden z możliwych. Możesz wgrać JPEGa na kartę microSD. Możesz wgrać do zewnętrznej kości FLASH (chyba bardziej uciążliwe). Dążę do tego, że to był domyślny sposób przechowywania obrazów w bibliotece graficznej LVGL. Dodam, że ekrany projektowałem w dedykowanym dla tej biblioteki kreatorze na PC (Squareline Studio), który generuje kod dla ekranu.
    4. Z CMSIS DSP nie musiałem walczyć. Podlinkowałem tylko bibliotekę (używam skompilowanej w postaci pliku *.a) i zdefiniowałem potrzebne makra (typu ARM_MATH_CM7).
  • REKLAMA
  • #8 20860097
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    Kwarcu napisał:
    1. Tak, ADC/DAC to WM8994, do niego są podpięte gniazda jack na płytce.


    Ślepy jestem... faktycznie to ma i ADC i DAC.

    Kwarcu napisał:
    4. Z CMSIS DSP nie musiałem walczyć. Podlinkowałem tylko bibliotekę (używam skompilowanej w postaci pliku *.a) i zdefiniowałem potrzebne makra (typu ARM_MATH_CM7).


    Brzmi łatwo :-) Będę musiał drugi raz do tematu podejść.

    Dziękuję za odpowiedzi.
  • #9 20860512
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2053
    Witam,
    brawo za pomysł i wykonanie,
    kiedyś bawiłem się jeszcze na dsPIC, efekty typu delay, modulacje termolo, proste filtry czy przesterowanie da się policzyć dość łatwo i bez FFT, powinny poradzić sobie nawet prostsze mikrokontrolery.
    Pozdrawiam
  • #10 20860652
    katakrowa
    Poziom 23  
    Posty: 902
    Pomógł: 9
    Ocena: 855
    viayner napisał:
    kiedyś bawiłem się jeszcze na dsPIC, efekty typu delay


    Delay, echo i pogłosy wymagają jednak sporo RAM (sporo jak na mikrokontrolery). Żeby zrobić sekundowy monofoniczny delay, to minimum 88KiB jest potrzebne.
  • #11 20861492
    pierkwadrat
    Poziom 15  
    Posty: 143
    Pomógł: 8
    Ocena: 71
    Gdyby były jeszcze efekty typu phase, flanger, to byłby zestaw marzeń :)
  • #12 20861541
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    pierkwadrat napisał:
    Gdyby były jeszcze efekty typu phase, flanger to byłby zestaw marzeń

    Nic nie stoi na przeszkodzie, jednak bardziej ciekawi mnie efekt vocoder, np. taki jak tu na filmie:



    Sygnał z mikrofonu można podać na drugi kanał wejścia liniowego (albo wykorzystać mikrofony MEMS na płytce).
    W każdym razie, kod jest otwarty - możesz spróbować sam napisać phaser :)
  • REKLAMA
  • #13 20861681
    pierkwadrat
    Poziom 15  
    Posty: 143
    Pomógł: 8
    Ocena: 71
    Niestety nie umiem :(
  • #14 20861994
    viayner
    Poziom 43  
    Posty: 10638
    Pomógł: 1563
    Ocena: 2053
    Witam,
    katakrowa napisał:
    ...Delay, echo i pogłosy wymagają jednak sporo RAM (sporo jak na mikrokontrolery). Żeby zrobić sekundowy monofoniczny delay to minimum 88 KiB jest potrzebne.

    Tak naprawdę nie jest tak źle:
    - efekty polegające na mieszaniu sygnału oryginalnego ze zmodyfikowanym można uzyskać prościej i wiele poważnych firm tak robi.
    - sygnał próbkuje się z mniejszą rozdzielczością np. 12 bitów i to wystarcza, nawet wprawne ucho tego nie wychwyci, podobnie z częstotliwością próbkowania.
    - wszystko wynika z faktu, że sygnał zmodyfikowany jest małą częścią głównego sygnału.
    - w typowych delay'ach/reverb'ach nie potrzeba aż 1 s opóźnienia, więc ilość potrzebnej pamięci szybko topnieje.
    Pozdrawiam
    PS obsługa phaser'a wymaga FFT i analizy częstotliwościowej.
    Z vocoder'em będzie wiele trudniej, sygnał musisz podzielić na kilka pasm filtrem, zmienić obwiednię każdego z pasm i zmieszać.
  • #15 20862199
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    Ciekawe wskazówki dot. optymalizacji ;)

    Jeśli chodzi o pamięć RAM to nie miałem obaw że mi jej zabraknie bo na płytce jest zewnętrzna kość SDRAM 8MB w której trzymam duże bufory dla liń opóźniających (a także ramkę obrazu dla LCD). Ta płytka to fajny mały sprzęt jak na nie-linuxowy embedded i dlatego nie musiałem iść na kompromisy. Na początku miałem audio ustawione na 16bit ale jak sprzęt daje pełne 24bity to czemu nie skorzystać (oczywiście na ucho tego nie słychać a te 24bity i tak ginie w szumach i mamy efektywnie ze 20bitów).

    viayner napisał:
    PS obsługa phaser'a wymaga FFT i analizy częstotliwościowej.
    Z vocoder'em będzie wiele trudniej, sygnał musisz podzielić na kilka pasm filtrem, zmienić obwiednię każdego z pasm i zmieszać.


    Z tego co pamiętam z książek to phasery można zrobić używając filtrów allpass, natomiast przy vocoderze faktycznie bez FFT będzie trudno. Raczej nie obawiam się o braki mocy obliczeniowej bo obecnie symulacja kolumny gitarowej wykorzystuje szybki splot (fast convolution) gdzie najpierw robi się jedno FFT, potem mnożenie zespolonych widm sygnału i impulsu a na koniec jeszcze odwrotne FFT. Ten efekt zajmuje ok 25% CPU.
  • #16 20864815
    yogi009
    Poziom 43  
    Posty: 14697
    Pomógł: 848
    Ocena: 2655
    Coraz więcej z powieści Lema w tych elektrodowych projektach :-) Wielkie brawa za tą prezentację. Zastanawiam się nad poziomem jakościowym, czy to jest sygnał akceptowalny na dużej scenie?
  • #17 20865148
    Kwarcu
    Poziom 13  
    Posty: 78
    Pomógł: 5
    Ocena: 67
    yogi009 napisał:
    Zastanawiam się nad poziomem jakościowym, czy to jest sygnał akceptowalny na dużej scenie?

    Myślę, że to jeszcze nie ten poziom. Dopiero wkroczyłem w temat DSP w audio a moje efekty to raczej podstawowe topologie opisane w literaturze. Żeby osiągnąć naprawdę interesujące brzmienie trzeba by spędzić trochę czasu na dostrajaniu algorytmów (a to często jest proces prób i błędów). Do domowego grania wystarczy - frajda jest :D

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zaprezentował projekt cyfrowego multiefektu gitarowego opartego na płytce STM32F746G-DISCO, koncentrując się na oprogramowaniu. Efekty, takie jak overdrive, cab sim i reverb, są realizowane za pomocą cyfrowego przetwarzania sygnału. Dyskusja obejmowała różne aspekty techniczne, w tym wybór mikrokontrolera, wykorzystanie ADC/DAC WM8994, oraz optymalizację algorytmów DSP. Uczestnicy wymieniali się doświadczeniami związanymi z implementacją efektów, takimi jak delay, tremolo, oraz phaser, a także omawiali wymagania dotyczące pamięci RAM i latencji. Wskazano na możliwości rozwoju projektu, w tym dodanie efektu vocoder. Użytkownik podkreślił, że projekt jest na etapie prototypu i wymaga dalszego doskonalenia, aby osiągnąć akceptowalną jakość dźwięku na scenie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA