![[CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/4689387300_1658423863_thumb.jpg)
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:
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?

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

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ę

[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](https://obrazki.elektroda.pl/4979095800_1658425295_thumb.jpg)
![[CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/6141541600_1658425323_thumb.jpg)
[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 [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/4085437300_1658424054_thumb.jpg)
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 [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/9713456500_1658424108_thumb.jpg)
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](https://obrazki.elektroda.pl/2236396800_1658424149_thumb.jpg)
![[CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/6747339900_1658424213_thumb.jpg)
6. Przykręcamy dwie śruby mocujące moduł DSP do płyty głównej.
![[CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera [CFX] Behringer DJX700 CustomFX - programowalny efektor do Twojego miksera](https://obrazki.elektroda.pl/9469906200_1658424234_thumb.jpg)
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