FlopPi – i gra muzyka (na stacjach dyskietek i Raspberry Pi)

Kilka dni temu wrzuciłem na YouTube jeden z utworów odgrywany przez stacje dyskietek. Szybko zyskał popularność a ja ciągle dostaję wiele pytań „jak to działa”. Spieszę z wyjaśnieniami :)

Wstęp

Wszystko zaczęło się od Raspberry Pi i dylematu – postawić na nim domowy serwerek, czy wykorzystać do czegoś ciekawszego i nauczyć się przy tym czegoś nowego. Postawiłem na to drugie. Dość szybko przyszedł mi do głowy pomysł z odgrywaniem muzyki na stacjach dyskietek, ale o tym niżej. W wolnych chwilach starałem się rozwijać projekt, ale szło dość powoli z powodu małej ilości wolnego czasu. Jednym z celów projektu było przypomnienie sobie nieużywanego kilkanaście lat języka C. Innym – oderwanie od codziennej pracy i napisanie całkiem innego oprogramowania.

Projekt wydawał mi się niszowy (ale robiłem go dla siebie, choć z zamiarem udostępnienia w przyszłości – o tym również niżej). Jak pokazały ostatnie dni – byłem w błędzie. Jeden z utworów, na którym testowałem nowo dodaną funkcjonalność (pitch bend) po wrzuceniu na Youtube rozszedł się bardzo szybko po Polskiej części Internetu.

Link do wspomnianego utworu został umieszczony na wielu portalach internetowych, choć najwięcej wejść i odtworzeń było chyba z Facebooka. Wspomniano o nim również w „Teleserwisie” na TVN24 (mam nagrane na dekoderze „n”-ki, ale nie mam jak tego zrzucić na dysk swojego komputera aby Wam pokazać – nie mam odpowiedniego sprzętu). Komentarze pod utworem sugerują, że być może gdzieś jeszcze w telewizji się jakaś wzmianka ukazała, ale mi nic o tym nie wiadomo. Jeśli wiecie – podzielcie się w komentarzach (śmiało, logować można się także popularnymi portalami społecznościowymi).

Zadziwiające jest to, że prawie wszystkie komentarze są bardzo pozytywne – i te pod nagraniem i te na innych portalach. Dziękuję – zmotywowaliście mnie do dalszej pracy nad projektem, a może być dość ciekawie. Do osób twierdzących „ale to już było” – informacja w dalszej cześć wpisu.

Wspomniane nagranie (Ona tańczy dla mnie (Cover) na 8 stacjach dyskietek (Raspberry Pi) – wersja poprawiona):

 

Jak to jest, że to gra

Chyba każdy z Was widział stację dyskietek, choć nie każdy w środku. O budowie stacji rozpisywać się nie będę. Najważniejszym jej elementem jest głowica, która fizycznie odczytuje dane z dyskietki. To ją właśnie słychać podczas pracy stacji dyskietek. Jeśli pominie się kontroler w komputerze i przyłączy się stację do czegoś czym da się nią sterować, możliwe jest prawie dowolne poruszanie głowicą. Ja wykorzystałem Raspberry Pi i własne oprogramowanie. Dzięki temu możliwe jest poruszanie głowicą z określoną częstotliwością a co za tym idzie wydawanie przez głowicę dźwięków o tych częstotliwościach. Odpowiednio dobrane częstotliwości powodują, że możliwe jest „odgrywanie” muzyki na stacjach dyskietek.

Głowica w stacji dyskietek

Bardziej technicznie – aby sterować głowicą stacji dyskietek, należy podać odpowiednie impulsy na jej złącze. Pin 12 zwarty do masy powoduje uaktywnienie stacji dyskietek, pin 18 wykonanie jednego kroku głowicy a pin 20 odpowiada za kierunek głowicy. Kiedyś dokładnie to opiszę w formie wiki dla wszystkich zainteresowanych. Dodam na razie tylko, że pin 12 może być na stałe zwarty do masy, ja połączyłem go z pinem odpowiedzialnym za ruch głowicy, dzięki temu dioda na stacji dyskietek świeci, gdy głowica się rusza. Do wysterowania z Raspberry Pi są zatem tak naprawdę dwa sygnały – krok głowicy i kierunek jej poruszania. Sposób podłączenia opisany jest na przykładzie w poprzednim wpisie.

Piny wykorzystanie do sterowania stacją dyskietek

Stacje dyskietek które posiadam odgrywają maksymalnie dźwięk „A” w zerowej oktawie. Nie jest to regułą. Niektóre zagrają maksymalnie „F#”, inne (te w ogóle się nie nadają) dźwięki z -1 oktawy. Głowice stacji mają różną charakterystykę dźwięku. Jedne stacje przez to nadają się do dźwięków niskich, inne do wysokich, jeszcze inne dają dźwięk przypominający przesterowanie w gitarze elektrycznej. Niektóre stacje dyskietek przy próbie odtworzenia zbyt wysokiego dźwięku (zbyt duża częstotliwość impulsów) zawieszają się całkowicie (do odłączenia i ponownego podłączenia zasilania), inne tylko na chwilę, jeszcze inne nie zawieszają się, choć silniczek nie wykonuje kroku – częstotliwość przekracza jego maksymalną prędkość obrotową. Tylko te ostatnie stacje nadają się do odtwarzania muzyki (choć tu muszę po stronie oprogramowania dodać swego rodzaju zabezpieczenie). Unikać trzeba też wyjątkowo hałasujących stacji. Nie jest łatwo dobrać odpowiednie stacje. Ja jeszcze nie mam tych odpowiednich. Mam nadzieję, ze uda mi się jakoś zgromadzić na tyle dużą kolekcję, aby dobrać najlepsze.

 

Oprogramowanie

„Odtwarzacz” jest moim autorskim oprogramowaniem. Wczytuje wcześniej przygotowane „komendy” i je wykonuje. Brzmi to prosto, ale nie do końca jest takie proste. Komend na chwilę obecną jest jeszcze mało: odtwarzanie określonego dźwięku na określonej stacji, zaprzestanie odtwarzania, pitch bend, odtwarzanie dźwięku perkusji (specjalnie dopasowany dźwięk), oraz koniec utworu.

To widać w nagraniach - informacja o odtwarzanych dźwiękach na stacjach dyskietek. na czerwono perkusja.

Ale same komendy to dopiero początek. Oprogramowanie „wiedząc” jaki dźwięk ma być odtwarzany na stacji wylicza interwały czasowe dla ruchu głowicą każdej stacji i w pętli sprawdza czy upłynął czas do następnego kroku którejś głowicy, a następnie taki ruch wykonuje. Niezależnie sterowane jest obecnie 8 stacji dyskietek. To bardzo skrótowy opis działania oprogramowania. Całość jest trochę bardziej skomplikowana i zawiła.

 

Muzyka

Źródłem muzyki są pliki midi, które przechodzą najpierw przez napisany przeze mnie parser i prosty sekwenser. Sekwenser pozwala na modyfikację dźwięków i przypisane ich do określonych stacji, generując dane dla odtwarzacza. Pozostałe funkcjonalności opisałem w dalszej części. Ta cześć oprogramowania jest napisana w PHP, ponieważ ma pozwalać na generowanie danych dla odtwarzacza przez interfejs webowy (w postaci strony www hostowanej z Raspberry Pi) – to zapewni kilka dodatkowych (unikalnych) funkcjonalności.

Ja nie jestem muzykiem. Lubię słuchać muzyki, mam wrażenie, że słyszę więcej niż inne osoby, ale na tym koniec :) Umiem za to przekonwertować plik midi tak, aby posłużył za źródło muzyki dla całego projektu – to odpowiedź na pytanie, czy ja to jakoś tworzę ze słuchu. :)

 

Ale to już było – porównanie z innymi projektami

Kilka osób pisało, że przecież to już było, podając najczęściej link do kanału MrSolidSnake745 na Youtube. Tak – było, ale czy to przeszkadza w wykonaniu projektu samodzielnie? Usiadłem i zacząłem sam się nad tym zastanawiać – chciałem aby projekt był w pełni autorski, co przy okazji daje wiele korzyści. MrSolidSnake745 był dla mnie inspiracją, ale mój projekt będzie czymś więcej, w zasadzie już jest.

I podkreślę jeszcze raz -moim celem nie było wzięcie gotowego oprogramowania i złożenie całości z gotowych opisów tylko w celu nagrania kilku utworów. Ja chciałem i wykonuję projekt w całości samodzielnie. Z tego powodu nie posiadam np. dobrego sprzętu do nagrywania – jestem programistą, nie muzykiem i nie potrzebowałem takiego sprzętu. :)

Jeśli chodzi o różnice w stosunku do innych projektów, jest ich kilka. Moja wersja obsługuje pitch bend (regulację częstotliwości dźwięku), który słychać w płynnej zmianie wysokości dźwięku w utworach (można by to nazwać pływaniem dźwięku, płynnym podnoszeniem lub opuszczaniem jego częstotliwości). Posiada też emulację perkusji, co wzbogaca odgrywany dźwięk. Sekwenser o którym wspominałem pozwala przypiąć instrumenty do konkretnych stacji lub grupy stacji dyskietek. Pozwala oznaczyć instrument jako perkusję i regulować oktawę w której dźwięki będą odgrywane (na każdy instrument z osobna). Pozwala na dodanie kilka razy tego samego instrumentu (aby wzmocnić go odtwarzając go na więcej niż jednej stacji dyskietek, także w innej oktawie). A to nadal nie wszystkie różnice i możliwości. To te najważniejsze. Nowe będą ciągle przybywać.

 

Problemy

Użycie Raspberry Pi wiąże się z pewnym problemem – systemem operacyjnym. Wielozadaniowy (krótko mówiąc) system operacyjny „usiłuje” wykonywać także inne procesy, co powoduje krótkie przerwy w działaniu mojego programu (takiego problemu nie ma podczas oprogramowywania mikrokontrolerów jak Arduino w przypadku innych projektów). Właśnie staram się jakoś obejść ten problem. Przerwy powodują krótką (ale słyszalną) przerwę w odtwarzaniu i późniejsze szybkie odgrywanie spóźnionych dźwięków – na tyle szybkie, że głowica nie wykonuje tych ruchów (za duża prędkość dla silnika krokowego), choć oprogramowanie tego „nie wie” i ruch zlicza (musi wiedzieć kiedy odwrócić kierunek ruchu głowicy). To powoduje, że głowica znajduje się z innym miejscu niż powinna i oprogramowanie usiłuje przemieścić ją za daleko (na jednym z dwóch końców przestaje zwyczajnie pracować i odgrywać dźwięk). Krótkie przerwy deformują również dźwięk.

Jeśli czyta to jakiś programista języka C znający Raspberry Pi i posiadajacy wiedzę o takim typie sterowania, wskazówki i pomysły będą dla mnie cenne. Mam kilka własnych pomysłów na optymalizację kodu, ale nie wiem czy to wystarczy. Dodatkowo ostatnio używałem języka C kilkanaście lat temu – wiele muszę sobie przypomnieć i wiele nauczyć (szczególnie jeśli chodzi o Raspberry Pi) :)

 

Dalszy rozwój projektu

W chwili obecnej dalej rozwijam oprogramowanie i testuję na różnych utworach. Jest jeszcze wiele do zrobienia. Docelowo cały projekt ze szczegółowymi opisami i kodem źródłowym zostanie opublikowany w Internecie. Jeśli są wśród Was zainteresowane projektem osoby – musicie niestety jeszcze trochę poczekać. :) Jestem jednak otwarty na wszelkie propozycje, uwagi lub konstruktywną krytykę. Możecie też mieć wpływ na ten projekt, bo teraz powstaje on już nie tylko dla mnie, ale i dla Was. Piszcie, proponujcie i dyskutujcie śmiało :)

Aby rozwijać projekt i nagrywać, będę musiał zdobyć i przetestować więcej stacji dyskietek. Dużo więcej. :) Chodzi o to, aby z grupy stacji wybrać te, które grają najlepiej, najładniej i spełniają opisane wyżej warunki. Mam też plan powiększenia liczby stacji, aby móc odgrywać bardziej skomplikowane utwory i móc nagrywać w stereo. Obecnie niektóre dźwięki „skaczą” po różnych stacjach dyskietek i nagrywanie w stereo mija się z celem.

Do osób znających się na audio – potrzebuję jakiś wskazówek jak i czym dobrze nagrać dźwięk. Nie może być to jednak drogi sprzęt – na taki nie mogę sobie pozwolić. Wszelkie wskazówki mile widziane. Chciałbym zacząć go nagrywać bardziej profesjonalnie (z lepszą jakością). Obecny mikrofon nagrywa bardzo cicho (nagrywam na komputerze) i generuje duże szumy, które muszę potem usunąć.

W planach, w odróżnieniu od innych projektów, mam też dodanie innych urządzeń (np. skanery). Wskazówki i pomysły mile widziane. :) Rozrośnie się wtedy część związana z elektroniką (prawdopodobnie użyję dodatkowo zatrzasków, będę musiał też użyć większej płytki prototypowej i dodatkowych kabli).

Planuję również zacząć montować nagrania – jeśli możecie polecić jakieś darmowe oprogramowanie pozwalające na nagrywanie z kilku źródeł i montaż, podzielcie się informacją.

Muszę także popracować nad wizualną częścią projektu – schować elektronikę, prawdopodobnie dodać oplot na kablach. Obecnie jednak projekt jest jeszcze trakcie rozwijania.

Jeśli macie jakieś pytania – pytajcie, z chęcią odpowiem (logować się możecie także portalami społecznościowymi). Jak widzicie plany są spore, ich realizacja jednak trochę potrwa.

 

Informacje na koniec

Na razie nie nagrałem zbyt wielu utworów, ale te nagrane możecie zobaczyć na moim kanale na YouTube. Krótko o projekcie jest również opisane w newsie na portalu PCLab.pl (PCLab.pl jest moim obecnym miejscem pracy).

Wrzucam też kilka zdjęć projektu w obecnej formie :)

 

Galeria

 

Ten wpis został opublikowany w kategorii Debian, Elektronika, FLopPi, Gadżety, Linux, Oprogramowanie, PHP, Programowanie, Technologie i oznaczony tagami , , , , , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

11 odpowiedzi na „FlopPi – i gra muzyka (na stacjach dyskietek i Raspberry Pi)

  1. Witam,
    z tego co się orientuje (a nie orientuje się zbyt dobrze) do generowania określonych częstotliwości w mikro kontrolerach używa się timerów. Ów timery co określoną liczbę taktowania zegara generują przerwanie, które odkłada aktualne zadanie na stos i zaczyna wykonywać zadany przez programistę kod. Procesor używany w RaspberryPi na pewno posiada co najmniej kilka timerów, ale nie wiem jakie są możliwości wykorzystania ich z poziomu linuxa. Słyszałem kiedyś o tym, że programy restrykcyjne czasowo, korzystające z GPIO, umieszcza się w jądrze. Jestem początkującym programistą i to napisałem to tylko zlepek informacji z forów i książek, nie poparty żadnym doświadczeniem. Mam nadzieje, że mogłem pomóc.
    Pozdrawiam Adam Prochownik.

  2. dudek bartek pisze:

    napisałeś że potrzebny jest wyświetlacz LCD …. i że żałujesz tego zakupu.
    to co byś kupił zamiast tego?

    pisałeś też o rezystorach jakie to majom być?
    i diodach i jakim napięciu?

  3. OX OX pisze:

    Witam,

    Pisał Pan o budżetowym, ale dobrze jakościowo, nagraniu audio. Proponował bym uzbroić się w program Audacity (program darmowy, a pozwala na edycję i nagrywanie wielościeżkowe). Do tego potrzebne będą mikrofony (najlepiej dwa, ponieważ nagranie ma być stereo) i tutaj proponowałbym mikrofony Behringer C-2. Kolejną ważną rzeczą jest interfejs lub mikser audio, który pozwoli na podłączenie się do komputera i wyprowadzenie sygnału prosto do software’owego rejestratora. Można zastanowić się nad urządzeniem oferującym przynajmniej dwa wejścia XLR z zasilaniem phantom np:Miditech Audiolink III. Całość będzie Pana kosztować do 500 zł i efekt na pewno będzie satysfakcjonujący. Ewentualnie proszę o kontakt w celu omówienia szczegółów. Również oferuję swoją pomoc w realizacji nagrań.
    Pozdrawiam
    Jarosław Grzelak
    kontakt: jarogrzelak@gmail.com

    Linki:
    http://www.dobreprogramy.pl/Audacity,Program,Windows,11826.html
    http://www.djshop.pl/k5,studio/i11223,miditech,miditech-audiolink-iii.html
    http://www.djshop.pl/i1592,behringer,behringer-c-2-para-.html

  4. Witam .
    Naprawdę fantastyczne dzieło i naprawdę podziwiam pomysł i wykonanie. Sam się zajmuję mechatroniką i wiem co to znaczy czasem źle podłączyć kabelek :P może by pan napisał jeszcze jeden utworek dajmy na to “Dzieci” Elektrycznych gitar :> jeżeli jest to wykonalne

    Pozdrawiam.

    • Witam.
      Dzięki :)
      W wolnych chwilach pracuję nad oprogramowaniem i niedługo pojawi się coś nowego. Nieco zmieniam też elektronikę. Potrzebuję trochę czasu :)
      Dopisuję ten utwór do listy i z pewnością go sprawdzę.
      Co do źle podłączonego kabelka – miałem już okazję zobaczyć dym, ale na szczęście nic nie uszkodziłem :P

      Pozdrawiam.

  5. A jakby najprościej przez nice albo renice zrobić odpowiednie prio programowi ?

Dodaj komentarz

Musisz się zalogować (także Facebook, Google+, Twitter), aby móc dodać komentarz.