![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/7088978900_1642922589_thumb.jpg)
Witam forumową brać

Przyszedł w końcu czas aby pochwalić się konstrukcją, którą pierwszy raz popełniłem jeszcze jakoś na początku słusznie już minionego, 2021 roku. Dziś, prawie rok i dobre 5 prototypów później, mogę z umiarkowaną stanowczością stwierdzić że projekt zakończyłem. Ale po kolei...
[Wstęp]
Nie tak znowu dawno temu, jeszcze gimnazjalistą będąc natrafiłem na ten artykuł z Elektrody. Nie rozumiejąc jeszcze, że jest to jedynie swojego rodzaju enkoder bez większej funkcjonalności jako-takiej, zacząłem sobie wyobrażać jak ciekawe rzeczy można by z czegoś takiego zbudować. Mniej-więcej w tamtym czasie natrafiiłem również na gwiazdę dzisiejszego wieczoru - procesor DSP FV-1. Zakupiłem nawet kit AVT5159, niestety na tym się skończyło z uwagi na marny poziom mojej wiedzy w tamtym czasie. Aż do zeszłego roku kiedy to wygrzebałem z piwnicy stary dysk HDD...
[Koń roboczy]
Układ FV-1 (właściwie SPN1001) jest procesorem DSP zaprojektowanym przez śp. Keitha Barra oraz Franka Thompsona, a produkowanym przez ich firmę - SpinSemiconductor od roku 2006.
Cechą szczególną tej jednostki jest jej kompaktowa budowa - jak twierdzi autor; pomimo swojego zaawansowania, może być ona traktowana jak zwyczajny układ audio. A to za sprawą zintegrowania w jednym chipie wszystkiego co niezbędne; od przetworników ADC/DAC, przez bloki cyfrowe, na wewnętrznej pamięci ROM kończąc. Innymi słowy - podajemy na wejścia sygnał audio, ustalamy kilka stanów na wejściach cyfrowych i dostajemy na wyjściach znów sygnał audio.
Krótko o najważniejszych parametrach procesora:
- dwa niezależne kanały analogowe,
- czułość wejściowa na poziomie 1Vrms,
- pamięć RAM o pojemności 32k sampli,
- 3 wejścia analogowe do regulacji trzech niezależnych parametrów programu w czasie (prawie) rzeczywistym,
- do 128 instrukcji wykonywanych na każdym samplu,
- 8 wbudowanych programów demonstracyjnych
- możliwość podłączenia zewnętrznej pamięci EEPROM I2C z własnymi programami
Wybór padł na ten procesor po pierwsze, z racji dużych możliwości i prostoty aplikacji oraz, co chyba ważniejsze, z racji rozbudowanej dokumentacji zawierającej opisy instrukcji, oscylatorów LFO i działania samego chipu. No i dzięki forum SpinSemi, które działając już jakieś 15 lat stało się wręcz kopalnią wiedzy i pomysłów na efekty, a także wielu gotowych kodów i ich opisów.
[Opis konstrukcji]
Układ składa się z dwóch płytek drukowanych - dolnej i górnej. Połączone są ze sobą złączem 2x9 goldpin.
Górne PCB realizuje funkcję panelu sterującego; zawiera wyświetlacz, wskaźnik wysterowania i kolejno od lewej strony: enkoder głównego parametru/wyboru z poświetleniem LED wskazującym proporcję sygnału dry/wet, przycisk tap-tempo, linijkę LED wskazującą orientacyjną pozycję głównego parametru, enkoder parametru dodatkowego oraz potencjometr miksu, sprzężony ze wspomnianym wcześniej podświetleniem LED w enkoderze.
Dolne PCB, natomiast to serce całego układu. Cała elektronika sterująca (uC, DSP), pamięci, przetworniki DAC, tory audio, etc. Myślę, że nie ma sensu abym się rozwodził nad każdym pojedynczym blokiem układu. Zainteresowanych odsyłam do schematu ideowego

2 z 3 wejść potencjometrycznych sterowane są poprzez przetworniki DAC (sygnały ustawiane enkoderami), natomiast miks sygnału wejściowego i wyjściowego realizowany jest bezpośrednio w DSP, przy pomocy potencjmetru.
[Wady]
Żeby nie było, FV-1 posiada też wady. I to wcale nie tak nieznaczne jak mogłoby się wydawać.
Po pierwsze: pamięć RAM. Przy standardowej częstotliwości próbkowania, pamięci starczy na równo 1000ms opóźnienia. A tą wartość trzeba jeszcze podzielić na 2, jeśli urządzenie jest stereo. 500ms daje maksymalnie 1 beat przy prędkości 120BPM, a więc szału nie ma.
Po drugie: procesor nie posiada żadnej magistrali zewnętrznej, za pomocą której można by w sposób cyfrowy zmieniać parametry programów w czasie rzeczywistym. Są co prawda 3 wejścia potencjometryczne, ale;
Po trzecie: ich finalna rozdzielczość to jedynie 9 bitów, dodatkowo posiadają wewnętrzną filtrację, która trwa ~100ms. Co prawda, do obsługi potencjometrów wystarczy to w zupełności, jednak do dokładnych nastaw się nie nadają.
[Triki]
Jak głosi ludowe porzekadło: potrzeba matką wynalazków. A więc do rzeczy;
• FV-1 jest w stanie zaadresować jedynie pierwsze 4kB danych z pamięci EEPROM. Ilość ta odpowiada 8 efektom, które można zapisać w zewnętrznej pamięci. Już w AVT5159 pokonano to ograniczenie stosując większą pamięć i przepisując banki w zależności do którego efektu użytkownik się odwołał. Niemniej, miało to oczywistą wadę - czas, który musiał upłynąć zanim bloki zostały podmienione. Dlaczego więc nie zastosować dwóch osobnych pamięci? Albo więcej, jak kto woli. Każda z popularnych kości 24LC posiada 3 wejścia adresowe, a to pozwala zaadresować do 8 kości na raz, a więc i łącznie 64 efekty. W zależności, w której kości znajduje się pożądany efekt, procesor sterujący najpierw musi ustawić adres wybranej pamięci jako 0, a następnie zainicjować zmianę efektu w procesorze DSP. DSP, z kolei, 'widzi' na magistrali I2C jedynie pamięć o adresie 0. Proste? Proste. Aż dziw bierze, że autor kitu AVT na to nie wpadł.
• Domyślnie FV-1 pracuje z rezonatorem kwarcowym, który wyznacza częstotliwość próbkowania układu. Standardowo jest to kwarc tzw. zegarkowy, o częstotliwości 32768Hz. Ta częstotliwość wpływa bezpośrednio m.in. na dwa parametry: górną granicę pasma przenoszenia (wprost proporcjonalnie) oraz na dostępny czas opóźnienia (odwrotnie proporcjonalnie). Przy domyślnym kwarcu, częstotliwość graniczna wynosi ~15kHz przy spadku -3dB. Ja to na przykład słyszę, stąd też moja decyzja o podniesieniu częstotliwości próbkowania do prawie 48kHz. Sam procesor jest w stanie próbkować (ponoć) z częstotliwością >50kHz. Ciężko byłoby znaleźć taki kwarc, a więc postanowiłem generować sygnał zegarowy przy pomocy procesora sterującego. Wygenerowany przebieg 47751Hz podawany jest na bufory CD4010, które przy okazji obniżają jego napięcie do napięcia pracy procesora (3,3V). Rozwiązanie to ma w zasadzie same zalety - zaoszczędzone miejsce na PCB oraz możliwość zmiany częstotliwości próbkowania w zależności od potrzeby, lub nawet całkowite zatrzymanie procesora.
• Niektóre z efektów są tzw. efektami synchronizowanymi (np. echo czy delay). Jak już pisałem, sam procesor nie posiada żadnej magistrali danych, która umożliwiała by przesłanie informacji o tempie, są jedynie wejścia potencjometryczne. Niestety, są tylko trzy, a potrzeba czterech bo główny parametr, parametr dodatkowy, miks i sygnał synchronizacji. Co zrobić?
Tutaj wkracza moje autorskie, choć genialne w swojej prostocie rozwiązanie. Jeśli założymy, że sygnał do synchronizacji może zostać zmieniony jedynie gdy efekt jest nieaktywny oraz zawrzemy w kodzie efektu prostą funkcję, która będzie odczytywać jedno z wejść potencjometrycznych tylko raz przy uruchomieniu efektu, możemy tak zaprogramować procesor sterujący aby po każdej aktywacji efektu, na wejściu potencjometrycznym przez chwilę była wartość reprezentująca sygnał synchronizacji (w tym czasie DSP ją sobie odczyta i na jej podstawie ustali tempo efektu), a po chwili już normalnie był tam podawany sygnał ustalany np. enkoderem, który będzie już służył jedynie do zmiany parametru efektu. Stąd na schemacie etykieta "SYNC/MOD".
Ta 'funkcja', o której pisałem wygląda następująco:
Code: armasm
[Efekty]
Warto wyjaśnić kilka szczegółów dotyczących efektów i ich pracy.
1. Low Pass Filter - klasyczny filtr dolnoprzepustowy z regulacją rezonansu, lekko ubarwiony phaserem i reverbem.
2. High Pass Filter - Praktycznie identycznie jak wyżej.
3. Filtered Delay - opóźnienie z nałożonym filtrem. Filtr można regulować zarówno jeśli chodzi o typ (HP/LP) jak i rezonans. A to wszystko jednym knobem - mając ustawione > 50% wybrany jest filtr górnoprzepustowy, a im bliżej do 100% tym większy rezonans tego filtru. Analogicznie w drugą stronę: poniżej 50% mamy filtr dolnoprzepustowy i im bliżej 0% tym większy rezonans. Efekt synchronizowany.
4. Single Delay - pojedyńcze powtórzenie. Talerz reguluje głośność efektu, natomiast drugi enkoder długość opóźnienia podawaną w częściach beatu. 100% to cały beat, 50% to 1/2 beatu, 25% to 1/4 beatu, itd. Efekt synchronizowany.
5. Echo - jak sama nazwa wskazuje. Talerz reguluje tłumienie - sygnał zwrotny (feedback) przechodzi przez filtr dolnoprzepustowy regulowany talerzem właśnie, to tworzy taki "dumping effect". Drugi enkoder, jak wyżej, reguluje długość opóźnienia. Efekt synchronizowany.
6. Flanger - talerz reguluje modulację efektem.
7. Phaser - jak wyżej, talerz reguluje modulację efektem.
8. Reverb - wprowadza pogłos do sygnału. Ciekawy efekt daje ustawienie głównego parametru blisko 100% - uzyskuje się efekt tzw. "infinite hold" - można wyłączyć sygnał wejściowy, a procesor dalej odtwarza taką "zatrzymaną" próbkę.
9. BitCrusher - talerz reguluje głębokość degradacji bitów sygnału. Drugi enkoder obsługuje częstotliwość odcięcia filtra dolnoprzepustowego. Rezonans ustawiony jest na stałe.
10. PitchShifter - talerz reguluje wysokość tonu.
11. Gate - "szatkuje" sygnał, tworząc dziurę o odpowiedniej długości. Talerzem regulujemy głębokość tej dziury, natomiast drugi enkoder reguluje proporcję sygnału, który jest blokowany do sygnału przepuszczanego (wypełnienie). Efekt synchronizowany.
12. Reverse - efekt odtwarzający sygnał od tyłu. Oczywiście nie jest to taki prawdziwy reverse jak puszczenie nagrania od tyłu; tutaj po prostu każdy beat najpierw jest wgrywany do pamięci, a następnie odtwarzany od tyłu. Taki trochę reverse-delay. Efekt synchronizowany.
13. Noise - generator szumu z filtrem dolnoprzepustowym. Jak można zauważyć na filmie, szum jest modulowany uśrednioną amplitudą sygnału wejściowego. Celem takiego zabiegu było aby głośność szumu zawsze była dopasowana (mniej-więcej) do amplitudy sygnału. Talerz reguluje częstotliwość odcięcia filtra, rezonans jest ustawiony na stałe.
14. TapeBreak - historia tego efektu jest dość zabawna. Pracowałem nad ulepszeniem PitchShiftera i coś zepsułem. Ale zepsułem w taki sposób, że powstał z tego nowy efekt

15. Freezer - efekt, który pozwala nagrać fragment utworu i zapętlić go, a także przyspieszyć lub zwolnić do zera. Efekt niestety nie jest synchronizowany gdyż prawdopodobnie nie da się tego zrobić z uwagi na ograniczenia procesora FV-1. W efekcie tego, nagrywany sampel zawsze będzie miał maksymalną długość.
16. Looper - synchronizowany sampler pozwalający ustawić długość sampla (maksymalnie 1 beat) i zapętlić go.
Warto jeszcze wyjaśnić dwie kwestie:
- 'efekt synchronizowany' odnosi się do faktu, że np. czas trwania opóźnienia jest ustalony na 1 beat. Synchronizowany do tempa, nie do beatu. Ma to znaczenie np. w przypadku efektu Gate - zależnie w którym "miejscu" w beacie zostanie uruchomiony, inaczej zabrzmi.
- Jak wspominałem, pamięć RAM procesora jest dość uboga, a ja jeszcze podniosłem częstotliwość próbkowania. W moim przypadku, przy częstotliwości prawie 48kHz dostępny czas opóźnienia to ~686ms łącznie (na oba kanały). Moje założenie było takie aby 7/8 tej wartości było przeznaczone na główne opóźnienie (600ms = 1 beat przy 100BPM), a pozostałe 4096 sampli (1/8 pamięci) na inne zastosowania, jak reverb czy pitchshifter. W rezultacie, każdy z efektów, który używa opóźnienia o długości maksymalnej 1 beatu jest efektem pseudo-stereo. Tzn, opóźniony sygnał mono jest miksowany z każdym z kanałów stereo. Natomiast sam sygnał pseudo-stereo do opóźnienia tworzony jest przy pomocy prostego algorytmu opartego na małym opóźnieniu i odwracaniu fazy. Brzmi to znośnie.
[Programator]
Do układu dołączam również programatory w dwóch wersjach. Są to proste, konsolowe aplikacje napisane w C++, służące do ładowania skompilowanego pliku wynikowego z programu spinASM do pamięci eeprom urządzenia przez kabel USB. O samym procesie tworzenia listy efektów i kompilacji nie będę się rozpisywał, a przynajmniej nie tu. Skompilowany plik HEX należy nazwać jako "eeprom.hex" i umieścić we wspólnym katalogu z odpowiednim programatorem. Programatory natomiast są dwa: jeden oznaczony jako RFX_PL (lub RFX_EN, zależnie od wersji językowej) - ten służy do wgrania całego banku 8 efektów na raz, wraz z ich nazwami oraz głównym parametrem startowym. Drugi, RFX_SU_PL/EN to tzw. SimpleUpdater - uproszczony programator, który nie wymaga podawania nazw czy parametru startowego. Nadpisuje jedynie pierwszy efekt banku A, przydatne do testowania. Wszystko jest opisane w programatorze.
Warto dodać, że wartość startowa drugiego enkodera jest z góry ustalona na 50% przy wgrywaniu programu i można ją zmienić dopiero po wgraniu programu, w przeciwieństwie do parametru startowego talerza, który można zdefiniować już przy wgrywaniu efektów.
Na tę chwilę to chyba wszystko co chciałem Wam przekazać. Jak sobie jeszcze coś ważnego przypomnę to będe edytował ten post, a mniej ważne rzeczy wyjaśnię w dyskusji.
W załączniku gotowe skompilowane banki efektów, pliki Eagle z PCB, pliki wsadowe do uC, manuale, programatory, schematy, sterowniki oraz oprogramowanie SpinSemi. Pozwoliłem sobie pobrać daninę w wysokości jednego punktu


PS. No i tradycyjnie zagadka



![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/4890107200_1642172230_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/7353866900_1642180001_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/6389276900_1642180000_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/7370967400_1642180001_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/2088096200_1642180008_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/9577296500_1642180010_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/1848610000_1642180012_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/3129655900_1642180017_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/1531306700_1642180017_thumb.jpg)
[EDIT 23.01.2022]
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/7436834000_1642922659_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/9709896900_1642922660_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/1312218300_1642922660_thumb.jpg)
![[RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD [RFX] RotaryFX - drugie (bardziej muzyczne) życie dysku HDD](https://obrazki.elektroda.pl/8356408300_1642922665_thumb.jpg)
Cool? Ranking DIY