Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera

MocnyAmper 21 Jul 2022 19:42 1419 1
IGE-XAO
  • [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera

    Jak niedawno zapowiadałem, prace nad projektem efektora do miksera Behringer DJX700 praktycznie zostały zakończone. Na chwilę obecną mam działający układ wraz z devboardem i ukończone programy efektów.

    Ale po kolei.
    O samym procesorze FV-1 możecie poczytać w innych moich tematach; konkretnie to tutaj i tutaj.
    Zmiany jakie wprowadziłem do projektu względem podstawowej aplikacji procesora to zwiększenie częstotliwości próbkowania do 47,751kHz oraz ładowanie programów do procesora nie bezpośrednio z zewnętrznej pamięci EEPROM, ale poprzez procesor sterujący (atmega324). Taki sposób ładowania programów związany jest z kotwicami, o których pisałem w poprzednim temacie dotyczącym prototypu tego projektu. Teraz rozwinę tą koncepcje.

    [Kotwice]
    Idea jest bardzo prosta. Skoro procesor nie posiada żadnej magistrali danych, po której można by dostarczyć mu informacji o tempie utworu, trzeba to zrealizować w inny sposób. Wejścia potencjometryczne nie są dokładne - mają rozdzielczość zaledwie 9 bitów. Pewnym rozwiązaniem tego problemu są "kotwice" - miejsce w kodzie efektu, które zawiera charakterystyczny ciąg znaków, którego 'nasłuchuje' procesor sterujący podczas ładowania efektu do pamięci procesora DSP i w locie podmienia go na konkretną wartość liczbową wyliczoną na podstawie wprowadzonej informacji o tempie utworu.
    Podczas testów pojawił się pewien problem - procesor sterujący zwyczajnie nie wyrabiał aby na czas "podstawić" kolejne bity programu na magistralę I2C procesora DSP. Okazało się jednak, że wszystkie zegary FV-1 są ze sobą połączone i przez odpowiednie mnożniki są sterowane z tej samej linii zegarowej, mianowicie tej, która wyznacza częstotliwość próbkowania. Konkretnie to częstotliwość magistrali I2C stanowi Fs x 8. Uzbrojony w tą wiedze rozwiązałem to w taki sposób, że po prostu przed rozpoczęciem transmisji procesor sterujący zwalnia zegar procesora DSP kilkukrotnie, a po zakończeniu transmisji zwiększa go do normalnej częstotliwości ~48kHz. Tym sposobem może i efekty są ładowane niezauważalnie wolniej, ale procesor ma wystarczająco dużo czasu aby "przemielić" każdy z nich. Co do samych kotwic - warto nadmienić, że program w uC przeszukuje cały kod efektu w poszukiwaniu kotwic (może ich być więcej niż 1) - każda z nich zostanie podmieniona. To bardziej czasochłonne niż przerwanie wyszukiwania po napotkaniu pierwszej kotwicy, ale gwarantuje, że każdy z efektów zostanie załadowany w takim samym czasie. W zasadzie nie ma to większego znaczenia dla działania programu, ale tak jakoś się przyjęło i tak już zostało.
    Spójrzmy na przykładowy fragment kodu, który zarządza ustawieniem wskaźnika pamięci (tzw. address pointera) do odczytu z pamięci opóźnienia FV-1:
    Code:
    clr                     ; wyczysc akumulator
    
    or    0xABCDEF          ; kotwica
    sof   1.457244873, 0    ; przeskaluj wartosc do wielkosci bloku pamieci
    mulx  pot0              ; przeskaluj ponownie, tym razem przez POT0
    wrax  addr_ptr, 0       ; zapisz do rejestru wskaznika adresu

    Co my tu mamy? Otóż najpierw należy wyczyścić akumulator gdyż następna operacja to logiczna suma (OR), a więc ustawiamy konkretną wartość więc musi ona być wcześniej wyzerowana. Następna linijka to kotwica - tutaj wartość 0xABCDEF. Dlaczego taka? A dlaczego nie? :D Jest to wartość na tyle niestandardowa, że raczej nie zostanie przez nikogo przypadkiem użyta. Warto tutaj zaznaczyć, że liczby w FV-1 są zapisywane w postaci 24-bitowej (dokładniej to w formacie S.23). Procesor będzie nasłuchiwał tego ciągu znaków w kodzie HEX (ABCDEF) i podmieni go na jakąś wartość wyliczoną na podstawie BPM. Będzie to po prostu długość beatu w ułamkowych częściach sekundy. Przykładowo dla 128BPM:
    128BPM = 0,46875s
    0x7FFFFF * 0,46875 = 3932160
    3932160 to 0x3C0000 w zapisie szesnastkowym i taka też wartość zostanie podstawiona zamiast ABCDEF.
    Dalej ta wartość jest skalowana instrukcją SOF. Wynika to z tego, że blok pamięci nie ma długości równo 1 sekundy przy tej częstotliwości próbkowania. Skąd taka wartość dla instrukcji SOF?
    Dostępna pamięć opóźnienia to 686,23ms (32768/47751Hz) - to jest wielkość całego bloku pamięci. Trzeba tak przeskalować wartość BPM aby wskaźnik adresu, zależnie od BPM, odczytywał pamięć we właściwym miejscu. Matematycznie wygląda to następująco: 1/(32768/Fs). Fs to częstotliwość próbkowania, tutaj 47751Hz.
    Dalej mamy kolejne skalowanie tej wartości, właściwie to dzielenie jej przy użyciu wartości z potencjometru. Liczbowo może ona się zmieniać w zakresie od 0 do (prawie) 1.0, a więc kiedy ustawimy 50%, wtedy odczyt z bloku pamięci zostanie zmniejszony o połowę, a w efekcie otrzymamy 2x krótszy czas opóźnienia, lecz nadal zsynchronizowany z ustawionym tempem.

    Ten sam mechanizm można wykorzystać np do kontroli oscylatorów LFO. Z tym, że dostępne sprzętowe oscylatory w FV-1 nie nadają się do generowania tak wolnych i jednocześnie w miarę dokładnych przebiegów jak np 3,75 sekundy. Bardziej chodzi tu o tą dokładność. Pewnym rozwiązaniem, które zastosowałem jest stworzenie generatora DDS, który będzie programowo generował zadany przebieg.
    I tak: przebieg typu piłokształtnego (ramp) można dość prosto wytworzyć, dodając po prostu co próbkę do licznika zadaną wartość, a kiedy przekroczy ona jakiś próg - zresetować licznik. Gorzej z sinusoidą. Tutaj pewnym rozwiązaniem okazują się być równania rekurencyjne, konkretniej:
    Code:
    SIN = SIN + freq * COS
    
    COS = COS - freq * SIN

    freq to zmienna, którą należy obliczyć ze wzoru: (2 * pi * f) / R, gdzie f to żądana częstotliwość LFO, natomiast R to częstotliwość próbkowania.
    No i wszystko fajnie, odrobina przekształceń i powinno działać. Problem pojawia się w samym procesorze FV-1, właściwie to w jego dokładności. Aby uzyskać przebieg o okresie np 5 sekund, zmienna freq powinna wynosić 0.00002631645, a więc bardzo mało. Instrukcje umożliwiające modyfikację zmiennych w FV-1 (np mulx) mają rozdzielczość 15 bitów (format S.15). Przy tak małych liczbach zwyczajnie zaczyna gubić dokładność i niestety, jest to problem, którego nie da się rozwiązać. Można próbować go obchodzić na różne sposoby, ale nigdy nie uda się uzyskać idealnej dokładności. Niemniej, w mojej konstrukcji jakoś to działa i nawet LFO nie rozjeżdża się jakoś bardzo. Być może gdyby zostawić włączony np flanger na chwile dłużej to zacznie się rozjeżdżać, ale przy normalnym używaniu nie powinno być problemu.

    [Efekty]
    Efekty są praktycznie takie same jak te wykorzystane w projekcie RFX. Różnią się jednym efektem, a do kilku innych zostały dodane generatory LFO.
    LowPass (LP) - filtr dolnoprzepustowy z ustawionym na stałe rezonansem.
    HighPass (HP) - filtr górnoprzepustowy z ustawionym na stałe rezonansem.
    HighPass Delay (HD) - filtr górnoprzepustowy zintegrowany z efektem delay. Rezonans oraz czas opóźnienia ustawione są na stałe - opóźnienie wynosi pół beatu.
    Delay (DL) - opóźnienie z jednokrotnym powtórzeniem. Długość opóźnienia można zmieniać w zakresie od 0 do 1 beatu.
    Echo (EH) - opóźnienie ustawione na stałe na 1 beat z dodanym sygnałem zwrotnym (feedback). Regulacja polega na zmianie głośności sygnału zwrotnego, jednocześnie jest on przepuszczany przez filtr dolnoprzepustowy ustawiony na stałe.
    Flanger (FL) - myślę, że tego efektu nie trzeba nikomu przedstawiać. Okres LFO można ustawiać w zakresie od (prawie) 0 do 10 beatów.
    Phaser (PH) - efekt podobny do flangera, ale uzyskiwany poprzez modulację fazy filtra wszechprzepustowego. Podobnie jak w przypadku flangera, okres LFO można regulować w zakresie 0-10 beatów.
    Pitch Shifter (PT) - zmiana wysokości dźwięku o +/- oktawę.
    Reverb (RB) - efekt tworzący pogłos. Regulacja polega na zmianie głośności/długości tworzonego pogłosu. Kiedy parametr efektu będzie bliski maksimum, wejdzie on w tryb "infinity hold" - po prostu zapętli aktualnie posiadaną w pamięci próbke tworząc z niej nieskończoną pętle.
    BitCrusher (BC) - aliaser dający wrażenie degradacji sygnału audio. Im wyższy parametr efektu tym większa degradacja.
    Reverser (RV) - efekt, który odtwarza wgrany wcześniej do pamięci fragment utworu od tyłu (z uwagi na to, że fragment musi najpierw zostać wgrany do pamięci, efekt może być wykorzystany jako reverse delay). Regulacja parametru efektu wpływa na długość sampla wgranego do pamięci i mieści się w przedziale (prawie) 0 do 1 beatu.
    Noise (NS) - generator szumu połączony z filtrem dolnoprzepustowym. Amplituda szumu jest uśrednioną amplitudą sygnału wejściowego. Regulacja parametru powoduje regulację częstotliwości odcięcia filtru.
    Gate (GT) - bramka "tnąca" sygnał. Prędkość bramki ustawiona jest na 1 beat. Regulacja polega na zmianie proporcji pomiędzy sygnałem przepuszczonym, a wyciętym.
    Break (BR) - efekt przypominający wyłączenie magnetofonu kasetowego. Regulacja parametru wpływa na czas, w którym dźwięk się "zatrzyma" i jest w zakresie 0 - 10 beatów.
    Freezer (FR) - efekt pozwalający na zapętlenie sampla utworu i zmianę prędkości jego odtwarzania od bardzo szybkiego przy maksymalnej wartości parametru aż do całkowitego zatrzymania przy minimalnej wartości. Tutaj należy wyjaśnić dwie kwestie: efekt ten powinien zostać uruchomiony z wartością początkową równą 50. Zmiana wartości parametru na wyższą lub niższą spowoduje wejście w tryb odtwarzania sampla. Aby z niego wyjść należy ponownie uruchomić efekt. Druga sprawa; ten efekt nie posiada synchronizacji. Nie da się po prostu tego zrobić z użyciem FV-1. Stąd też sampel zawsze będzie miał długość ~686ms (~87,5BPM).
    Shimmer (SH) - efekt będący połączeniem reverbu i pitch shiftera. Jest aplikowany na średnie i wysokie częstotliwości sygnału. Reverb ustawiony jest na stałe, regulacja natomiast wpływa na wysokość dźwięku.

    [Problemy]
    Są pewne ograniczenia, o których należy wspomnieć. O ograniczeniach samego procesora FV-1 już pisałem (m.in. stosunkowo niska dokładność LFO). Natomiast są też niezrozumiałe dla mnie decyzje, które w swoim mikserze wprowadził sam Behringer. Pierwsza rzecz - efektor jest monofoniczny. Tzn, sam efektor nie jest. Posiada bowiem stereofoniczny przetwornik (nawet z wejściami różnicowymi). Problemem jest tutaj sama płyta główna miksera. Z niewiadomych względów Behringer postanowił zsumować oba kanały w mono, a potem z użyciem DSP stworzyć sygnał pseudo-stereo na wyjściu procesora. Ta jedna decyzja sprawia, że sygnał pochodzący z efektora ma znacznie węższą panoramę stereo niż normalnie. Kolejna rzecz, wyjście efektora jest zwyczajnie sumowane z sygnałem wejściowym. To znaczy, że potencjometr głośności efektu faktycznie jest potencjometrem głośności efektu zamiast regulować stosunek sygnału dry/wet. To również jest problematyczne i np w przypadku efektów takich jak filtry wymusza na użytkowniku manipulowanie faderem głośności i wspomnianym potencjometrem co wymaga odrobinę wprawy, której ja akurat nie posiadam :P Warto tutaj jeszcze zaznaczyć, że sam procesor FV-1 wprowadza opóźnienie sygnału pomiędzy wejściem, a wyjściem na poziomie 1ms. Niby niewiele, ale jeśli "domiksowujemy" sygnał z efektora do czystego sygnału, robi się efekt takiego "zamrożonego flangera" - po prostu słychać to opóźnienie i paradoksalnie dodanie kolejnego (już programowego) opóźnienia na poziomie 4-5ms poprawia brzmienie. Trzecia kwestia to użycie takiego samego (potrójnego) wyświetlacza 7-segmentowego w sekcji efektów co w sekcjach liczników BPM, ale już nie pokuszono się o dodanie trzeciego tranzystora żeby sterował anodą trzeciej cyfry pomimo, że sam efektor ma nawet pin opisany jako przeznaczony dla niej. Ja rozumiem, że oszczędności oszczędnościami, ale bez przesady. Skoro pakujemy droższy wyświetlacz to szkoda było już tych kilku centów na tranzystor? Etykiety efektów wyglądały by o wiele czytelniej gdyby były złożone z 3 znaków, a tak muszą wystarczyć dwa.
    Generalnie zarówno problem monofonicznego efektora jak i braku sterowania tym trzecim znakiem dałoby się obejść lutując 2 przewody z płytki efektora do płyty głównej miksera, ale moim założeniem było stworzyć moduł w 100% plug&play. Nie każdy bowiem posiada lutownicę oraz na tyle wiedzy i/lub odwagi aby podjąć się grzebania na płycie głównej. Mimo wszystko, sądzę, że efekty jakie uzyskałem są zadowalające. A sam efektor na pewno jest bardziej funkcjonalny niż oryginał i jeszcze można go dowolnie programować przy odrobinie chęci i wiedzy.

    Gdyby znaleźli się chętni, mogę co-nieco pomóc przy ewentualnych próbach tworzenia własnych efektów, na ile oczywiście dam radę, choć teraz planuję się przerzucić na assembler dla FXCore więc z czasem pewnie wiele rzeczy związanych z FV-1 zapomnę :D

    [DevBoard]
    Jest to płytka uruchomieniowa zasilana z USB (polecam użyć do tego celu gniazda usb typu power delivery lub USB-C) pozwalająca na proste programowanie efektora i testowanie gotowych efektów. DevBoard posiada możliwość zmiana udziału efektu w sygnale wejściowym (dry/wet) oraz wyjście słuchawkowe, co według mnie jest dość wygodne. Sam zestaw deweloperski nie jest może najwyższych lotów układem, ale spełnia swoje zadanie. Dla upartych powiem tylko, że można go pominąć i z pomocą przejściówki USB-UART podłączyć się bezpośrednio do pinów komunikacyjnych modułu efektora. DevBoard jest całkowicie opcjonalny - moduł DSP ma już wgrane efekty demonstracyjne.
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera

    [Instalacja]
    Instalacja modułu wewnątrz miksera jest bardzo prosta i nie powinna zająć więcej niż 15 minut. Sprowadza się do odkręcenia 8 śrubek i podmiany modułu.
    Niemniej - prezentuję prostą instrukcję jak taką operację przeprowadzić. Wszystko co będzie potrzebne to mikser, moduł DSP i śrubokręt (najlepiej "krzyżak").
    1. Odłączamy wszystkie przewody (szczególnie kabel zasilający) i ustawiamy mikser na stole lub innym stabilnym podłożu.
    2. Wykręcamy 6 śrub na panelu czołowym (zaznaczone na czerwono):
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera
    3. Ostrożnie unosimy panel czołowy go góry. Może on gdzieś haczyć po bokach - bez nerwów. Trzeba nim poruszać na boki (prawo-lewo), wyjdzie bez większego problemu.
    4. Panel czołowy unosimy ponad mikser i odkładamy za dolną częścią obudowy (tak jak na zdjęciu) lub po prostu odłączamy wszystkie 3 wtyczki łączące go z dolną częścią obudowy.
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera
    5. Odkręcamy kolejne dwie śrubki mocujące oryginalny moduł DSP i instalujemy w jego miejsce CustomFX. Należy się upewnić, że wszystkie piny w dwurzędowym złączu trafiły w swoje miejsca na płycie głównej. 4 piny z prawej strony płytki pozostają niepodłączone - mają po prostu wisieć w powietrzu.
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera
    6. Przykręcamy dwie śruby mocujące moduł DSP do płyty głównej.
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera
    7. Ostrożnie osadzamy panel czołowy na swoim miejscu. Tutaj ponownie - gdyby były jakieś problemy, nie chciałby wskoczyć - poruszać nim na boki.
    8. Przykręcamy 6 śrub, które wykręciliśmy w punkcie 2. Tyle, mikser można podłączyć i przetestować.

    [Dystrybucja]
    No i kwestia chyba najważniejsza - cena. Jako, że jest to projekt w pełni komercyjny, nie udostępniam wsadu do procesora sterującego, ani plików źródłowych uC/DSP. Udostępniam natomiast skompilowane banki efektów demonstracyjnych, wszystkie pliki devboardu oraz schemat modułu DSP. Zainteresowanych, o ile takowi się znajdą, zapraszam na Allegro - tam też prowadzona będzie sprzedaż (ewentualnie poprzez PW jeśli ktoś nie posiada konta na w/w portalu). Szukajcie na Allegro u użytkownika o nazwie sebxx_2008 lub pod nazwą CustomFX. Ceny kształtują się następująco:
    299zł za sam moduł DSP
    199zł za DevBoard
    399zł za zestaw Dev+DSP.

    [Przydatne linki]
    Osoby chcące jakkolwiek zacząć pracę z tym procesorem powinny zacząć od przekopania poniższych materiałów, które stanowią naprawdę cenne źródło wiedzy nie tylko o samym FV-1, ale i o technice DSP ogółem.
    • Forum SpinSemi
    • Baza wiedzy
    • Darmowe programy DSP dla FV-1
    • SpinCAD Designer
    Ten ostatni link jest szczególnie ciekawy. Jest to program napisany w javie, który jest swoistym emulatorem procesora FV-1. Ma pewne wady, ale można za jego pomocą szybko i, przede wszystkim, bez posiadania fizycznego procesora potestować różne dostępne tam bloki funkcyjne. A jest tego sporo ;)

    Na chwilę obecną to chyba wszystko. W przygotowaniu jest jeszcze aplikacja konsolowa służąca do wgrywania efektów, podobna do tej, którą stworzyłem dla RFX-a, ale to za jakiś czas. Mam nadzieję, że ten projekt jakkolwiek Wam przypadnie go gustu bo, moim zdaniem, warto. Zwłaszcza, że wiele osób jeszcze ten mikser posiada (głównie amatorzy i początkujący DJ-e) i on sam w sobie może tragiczny nie jest, ale za to możliwości jego efektora też są średnie. A tutaj za całkiem nieduże pieniądze można sobie ulepszyć sprzęt i tchnąć w niego swojego rodzaju powiew świeżości, a i przy okazji zgłębić trochę wiedzy na temat cyfrowej obróbki sygnałów :)

    Standardowo zamieszczam również film demonstracyjny:

    (na filmie widać jakby wyświetlacz migał, jednak w rzeczywistości jest to widoczne jedynie w kamerze)

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    MocnyAmper
    Level 24  
    Offline 
    Has specialization in: Psuję wszystko po trochu
    MocnyAmper wrote 747 posts with rating 223, helped 75 times. Live in city Katowice. Been with us since 2021 year.
  • IGE-XAO
  • #2
    MocnyAmper
    Level 24  
    UPDATE:
    Dostałem w ostatnim czasie kilka zapytań dotyczących devboardu, mianowicie czy może on pełnić funkcję osobnego efektora wraz z modułem CustomFX. Odpowiadam: owszem, może. Natomiast warto mieć na uwadze, że sam moduł CustomFX jest monofoniczny (co wynika ze specyfikacji toru DSP w DJX700), a więc i cały efektor będzie mono.

    Dla osób chcących sprawić sobie efektor typu stand-alone z prawdziwego zdarzenia oparty na FV-1, za kilka tygodni będę miał coś dedykowanego ;)
    [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera