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.

Odtwarzacz plików MIDI na 8051 lub AVR

bartek96 04 Sep 2007 13:50 3852 20
Optex
  • #1
    bartek96
    Level 12  
    Czołem

    Mam takie pytanko, czy ktoś z was próbował kiedyś napisać program który umożliwiłby odtworzenie pliku MIDI przez jakikolwiek mikrokontroler oparty na rdzeniu 8051 lub AVR? Albo bardziej ogólnie: poszukuję porady dotyczcącej odczytania pliku midi tak, zeby później sobie samemu melodię zsyntezować... Myślę że temat jest ciekawy, czekam na Wasze opinie i pomysły

    pzdr

    Bartek Wawrzyniak

    Dodano po 3 [godziny] 9 [minuty]:

    ps. znalazłem coś ciekawego w necie, tylko że po niemiecku :(

    http://www.mikrocontroller.net/articles/Midi_Rekorder_mit_MMC/SD-Karte
    może się ktoś do tego ustosunkuje?
  • Optex
  • #2
    Jdsoul
    Level 23  
    Cóż nie osobiście, ale obserwowałem wątek na stronie www.8052.com

    http://www.8052.com/codelib/My 20Midi.zip jest tam troszkę kodu do repeatera MIDI o baudrate 31250. Myśle że raczej to się nadaje do celów transmisji i rozdziału sygnału niż do budowy jakiegoś zdekodowanego dźwięku.

    Natomiast samo dekodowanie danych na rodzinie 8051 hhm.
    Format MIDI nie jest zbyt złożony, ale jednak złożony.
    W procku przydałoby się buforowanie danych i dobry przetwornik DAC lub jeszcze lepiej generator FM, o co w prostych 51 trudno może na DS890 lub na ADuC.
    Generacja dźwięku od zera wymaga jednak troszkę obliczeń, a nawet sprzętu , najlepiej kilku generatorów dla poszczególnych składowych.


    Myślę że dużo łatwiej będzie to zrobić na AVR. A najlepiej na TMS320 szczególnie bardziej złożone wielościeżkowe pliki muzyczne :)

    Dodano po 40 [minuty]:

    Projekt, który wskazałeś jest właśnie takim recorderem danych po procesie analizy MIDI, już obrobionego formatu MIDI tzn takiego pliku MID.

    Np. bierzesz klawisze Rolanda podłączasz się pod wyjście MIDI z tym recorderem i do pamięci MMC/SD zapisujesz "plik" zczytywany z wyjścia klawiszy. Masz plik MIDI teraz możesz go sporotem wysłać do klawisza i odtworzyć za pomocą syntetyzera zawartego w klawiszu przez wejście MIDI :). uProcek pełni rolę interfejsu UART- MMC/SD i MMC/SD UART :)

    Fajne :)

    Wydaje mi się że projekt który wskazałem poprzedni nada się do tego również baud 31500, daje jeszcze dużo czasu na obsługę nr. 24C256 i możesz zrobić recorder na EEPROM, np. zgrać jakiś bardzo długi utworek , czy nawet melodyjkę i puścić spowrotem do klawiszy, syntetyzera.

    Inna sprawa to FAT, czyli system plików, tutaj niestety nie pomogę :)
  • #3
    bartek96
    Level 12  
    co do procka, to w zasdzie będzie to AVR, jaki? jeszcze nie wiem... A temat poruszyłem, bo potrzebuję zrobić polifoniczny dzwonek do słuchawki domofonu bezprzewodowego... Najprostsze rozwiazanie które się nasuwa to dodanie do układu pamieci FLASH i wgranie tam pliku WAV (mam na oku taką pamieć 16MBit) tylko że to generuje dodatkowe koszty.

    Pomysł z midi wpadł mi do głowy dlatego, że możnaby ewntualnie kod potrzebny na odczyt danych z pliku *.mid i syntezę dźwięku wykorzystać w innych projektach - urządzenie które gra melodię, zamiast piszcześ i buczeć wygląda ciekawiej.

    Jesli chodzi o jakość dźwięku, to wydaje mi się ze na dobry początek wystarczyłaby prosta synteza z fali prostokątnej, a dane wyjściowe podałbym po prostu na PWM, filtr dolnoprzepustowy i jakiś niewielki głośniczek :)

    A teraz pytanko: czy dane które są wysyłane przez port MIDI np. z syntezatora odpowiadają chociaż w przybliżeniu formatowi, jaki można zobaczyć po otwarciu pliku .mid (np. w edytorze HEX)?

    Dla zainteresowanych dekodowaniem pliku .mid - link do opisu formatu tego pliku: http://www.pckurier.pl/archiwum/art0.asp?ID=916
    (dla mnie wszystko jest jasne do momentu, w którym zaczyna się opis bloków ścieżkowych ::::)))))


    .).\.).\...........pozdro
    (@_@)...........Bartek
    .../..\................Waw
  • Optex
  • #5
    Jdsoul
    Level 23  
    Jeśli rzeczywiście ma być to dzwonek to zwróć uwagę na hasło polifoniczny :)

    Dowcip polifoniczny polega na tym, że jest kilka źródeł (generatorów m.cz.), które są sumowane na wejściu miksera , to sumowanie może być analogowe lub cyfrowe, co w efekcie daje to poli.

    To troszkę tak jak w gitarze, akordy etc. sześć strun itd.

    Na jednym pwm uzyskasz co najwyżej 1 częstotliwość na raz więc możemy mówić o dźwięku monofonicznym lub nawet o obwiedniowym po filtracji FDP.

    Ścieżki w MIDI to nic innego jak właśnie zapis danych do syntezy dla tych generatorków FM lub innych syntetyzerów, które na końcu są sumowane w polifonię.

    Tak działają typowe klawisze, syntezer, etc, a nawet karty dźwiękowe. Lekkim wyłomem był WaveTable, gdzie zamiast syntetyzować były odtwarzane samplowane zapisy instrumentów (ale w to się bawić nie chcesz :) ).

    DosinskY podesłał kolejny rekoder MIDI - ale znów efekty pracy klawisza są rejestrowane jako MIDI, a ciebie z tego co zrozumiałem interesuje proces odtwarzania :) i generowania dźwięku.

    Polifonia na amatorsko to niezłe wyzwanie - może wykorzystać układ VIA karty zgodnej z SB.

    Dodano po 26 [minuty]:

    Jeśli nie chcesz komplikować układu i możesz sobie pozwolić na "mono" przy jakości rzędu 8 bitów to AVR z powodzeniem pociągnie hybrydę czytania z pamięci i2c na przetwornik DAC typowego PCM-a lub Wava.

    Szczególnie, że pamięć EEPROM możesz czytać całymi stronami z prędkością 400kHz lub więcej, a pojemność może sięgać 512 kB lub nawet 1024 kB.

    Wtedy nie musiałbyś stosować pamięci równoległej i wystarczyłby trzy przewody i zasilanie, a zapis pliku można by zrealizować z użyciem RS-232.

    "Skrajnym" rozwiązaniem realizacji takiego dzwonka jest układ :) przetestowany przez lata w systemach alarmowych, nagłośnieniowych etc. :)

    Pamięć równoległa EPROM lub Flash, licznik adresujący magistralę danych w taki sposób, żeby przemiatać pamięć od 00 do końca() i przetwornik 8 bitowy DAC na wyjściu danych pamięci :) ;) :).

    Procek wtedy może służyć jako uruchamiacz i zatrzymywacz licznika i źródło taktowania danych - fajne efekty modulacyjne w zależności od szybkości przemiatania pamięci :).

    Oczywiście to totalny żart, ale tak działały moduły komunikatów w SM30 Philipsa w latach 80-tych :) tam używali nawet SRAM i baterejki :)

    Sam nagrywałem na to dźwięk i powiem że nawet dało się to zrozumieć po odtworzeniu :)
  • #6
    bartek96
    Level 12  
    Tak tak, ja wiem że polifonia to kilka dzwięków o różnych wysokościach zmiksowanych do kupy i wystawionych na przetwornik C/A. Pomysł miałem taki, żeby zmiksować je cyfrowo i tak obliczoną wartość wywalać na np. PWM (myślę że nie byłoby to trudne) no i najlepiej byłoby zamiast prostokąta użyć jednak innej funkcji, np. stablicowanego sinusa, nawet takiego zrobionego z 32 próbek... mniej wtedy będzie charmonicznych niż przy prostokącie i dzwięki różniące się o oktawę nie będą tak do siebie podobne.

    Jeśli chodzi o moje doświadczenie z podobmymi zagadnieniami, to już kiedyś przy okazji innnego projektu napisałem prostą procedurkę w C na aduc841, której na wejście podawałem tabelę z zapisem nutowym melodi (oczywiście odpowiednio zakodowanym) a ona (procedurka) to syntezowała i za pomocą programowego PWM-a wywalała na jakiś tam pin mikrokontrolera. Oczywicie nie była to polifonia , ale jak się postarałem i wlkepałem melodię (np. kolejne dźwięki z akodru C) to brzmiało bardzo fajnie:)

    Pomysł z MIDI to w zasdzie rozszerzenie tego, co już zrobiłem o więcej kanałów, no i chodzi też o to, żeby nie trzeba było wklepywać żmudnie tych nut do tabllicy, ale posłużyć się gotowcem w postaci pliku ściagniętego z netu

    ps. a jesli chodzi o miksowanie kanałów, to można by to zrobić tak: do każdego kanału przyporządkowac osobne wyprowadzenie mikrokontrolera, zrealizować programowego PWM-a obsługującego poszczególne kanały, a następnie uzyskane przebiegi zsumować we wzmacniacziu sumującym:) no i nie zależy mi na tym, zeby grało od razu 16 kanaów na raz - wystarczyłoby mi gdyby mój atmelek odtwarzał chociażby 4 kanały


    Z kolei jeśli chodzi o link DosinskYego, to i tak zdobędę ten numer EP - moze będzie tam dokładniej opisany standard plików .mid
    ; a jeśliby ktoś może zupełnie przypadkiem miał skana tego artykułu (lub numeru czasopisma) to będę wdzięczny za podesłanie

    .).\.).\...........pozdro
    (@_@)...........Bartek
    .../..\................ mr_bartek96(malpa)o2.pl
  • #7
    Jdsoul
    Level 23  
    Kilka sprzętowych PWM i mikser może dać radę:)

    Zostanie kwestia dosyłu danych (SPI, ) ,stworzenia modelu urządzenia MIDI w procku i obsługi rzeczonych PWM-ów, jak urządzeń przynależych do poszczególnych ścieżek dźwiękowych.

    Parametry dźwięków to częstotliwość , czas narastania, czas opadania, transienty etc. mam gdzieś książkę o budowie karty Sound Blaster i tam było troszkę wyjaśnione jak to karta syntezuje dźwięki i szumy !!!.

    Co do obróbki dźwięku w locie przez AVR cyfrowo, może troszkę mocy zabraknąć bo to 8 bitówka jest a nie DSP, ale kto wie kto wie.
    DS890 ma 30MHz i 1 cyklowy rozkaz , może dałby radę z 4 kanałami , kto wie :)
  • #8
    bartek96
    Level 12  
    Dla porządku dodam, że temat MIDI męczę już tak czysto dla własnej przyjemności; w urzadzeniu które projektuję będzie szeregowa pamieć FLASH AT45DB161D od atmelka , a dzwonki będą do niej wgrywane w trakcie produkcji jaimś złączem, no i będą w formacie ADPCM.

    Apropos, nan pytanko: jak sądzicie, czy 8bit/8kHz próbkowania z kompresją ADPCM wystarczy do tego, żeby taki dzwionek miał zadowalającą jakość? pytam bo w takim właśnie formacie planuję zrealizować transmisję głosu miedzy słuchawkami, no i mógłbym się oprzeć na jednym, a nie na 2 algorytmach do dekodowania ADPCM...
  • #9
    Jdsoul
    Level 23  
    Coś wspominałeś o głośniczku :) jak wyda 400Hz do 5 kHz to będzie naprawdę dobry głośniczek :)

    Więc o jakości dźwięku bym nie dyskutował, co najwyżej przy nagrywaniu skompresuj jeszcze dynamikę dźwięku do 20dB, i unikaj ostrego rocka :););)
  • #10
    bartek96
    Level 12  
    Jdsoul, idea odtwarzania tego midi jest taka, żeby w jak najprostrzy sposób umożliwoć takim małym, biednym atmelkom odtwarzanie polifonii:) nie chodzi tu o jak najlepszą jakość odtwarzanego dźwięku, ja raczej chciałbym pójść w drugą stronę: upraszczania. Fajnie byłoby np. żeby w trakcie projektowania jakiegoś tam urządzenia, możnabyło dołączyć plik nagłówkowy z funkcją do odtwarzania .mid-a, dodać do projektku jakiegoś prostego mid-a (niech on nawet będzie dodany do kodu programu) i np. odtwarzania do w momencie uruchamiania urządzenia... Właśnie tym tropem idę, to nie ma byc urządzeine na miarę Yammpa

    Dodano po 12 [minuty]:

    :D:D:D:D akurat ostry rock to zły przykład - na 8 bitach brzmi świetnie, ten przester :D Ten klimat samplowania na Amidze za pomocą ADC0804... :D
  • #11
    Jdsoul
    Level 23  
    Nie ma to jak fuzz na dwóch diodach ostrzowych.

    Wracając do uproszczeń, to myślę że nie tędy droga :( MID wbrew pozorom jest dość skomplikowanym formatem do dość profesjonalnych zastosowań, nawet PC średnio sobie z tym radził bez WaveTable.

    Myslę że należałoby się zastanowić nad czymś pośrednim, tzn. wykorzystać opis paramtryczny MID i troszkę go "uprościć" do możliwości syntetyzacyjnych AVR. Wiesz to tak jak z PDA. dokument Word jest konwertowany na PocketWord etc.
  • #12
    bartek96
    Level 12  
    Też mi coś takiego po głowie przez chwilę chodziło... np. zdekodować plik MID za pomocą odpowiedniej aplikacji, następnie przerobić to postaci jakiejś tablicy z zapisem nutowym, i ewentualnie odpowiednio zakodowanymi niektórymi efektami dźwiękowymi, i taką tablicę dodać do kodu programu.

    Pomyślę jeszcze nad tym, no i oczywiście nad odpowiednią syntezą dźwięku
  • #13
    Jdsoul
    Level 23  
    Byłoby dobrze żeby tym dźwiękiem zajęło się jakieś peryferium , coś ala wyświetlacz LCD , czy pamięć EEPROM :) A AVR jedynie dosyłał pakiety, ramki sterujące czy coś.

    Dodano po 2 [minuty]:

    Wtedy rzeczywiście twój pomysł nabierze kolorów. Bo w procku zostaną wolne moce na inne towarzyszące procesy ;)
  • #14
    Paweł Es.
    VIP Meritorious for electroda.pl
    Może jakąś prostą kartę muzyczną wykorzystaj (ze złączem ISA) do tego w miarę łatwo można by się przyssać prockiem a karta odwali za niego sprzętowo syntezę dźwięku.
  • #15
    Jdsoul
    Level 23  
    Całe złącze ISA, jak złącze ISA - ale wykorzystanie chipa, czemu nie.

    Na necie jest sporo ciekawych projektów opartych o kontroler Ethernet RTL8019AS stosowany na kartach ISA.
    Najczęściej wykorzystuje się go w trybie 8 bitowym + 4 adresy rejestrów wewnętrznych :) jako kontroler ethernet.

    W sumie przez analogię można by wykorzystać chip ESS1668 lub AV007.
    zgodne z SoundBlaster. zakres 220h i przerwanie itd. itd.:)

    Co najwyżej warto byłoby użyć kontrolera z własnym wewnętrznym buforem pamięci :)

    Problem jest tylko taki że trzeba dać 8-bitową magistralę i szynę adresową min. 4 bitową - co zabierze piny z mikroprocka :) ale jeśli ktoś i tak zakłada korzystanie z pamięci zewnętrznej równlogłej to taką magistrale tworzy :)
  • #16
    bartek96
    Level 12  
    Sorki, temat podejmę jak zdam komisa (kampania wrześniowa) życzcie mi powodzenia:D:D:D:D

    Dodano po 1 [minuty]:

    ps. dzięki Jdsoul za fotki, nawet nieźle wyszły[/u]
  • #18
    bartek96
    Level 12  
    sorki ,przez tą naukę już mi się w głowie mieza:D To DosinskY-emu chciałem podzękować za fotki artykułu z EP dotyczącego odtwarzacza MIDI
  • #19
    Jdsoul
    Level 23  
    Wracając do karty do obróbki to masz fajowy sprzęt od Realteka TW - na I2S :) model ALC5620.

    Zarówno do odtwarzania dźwięku jak i do kodowania dźwięku - sampler, jako całkowite peryferium na szynę szeregową .

    Myślę że jakikolwiek zdekodowany dźwięk będzie na tym śmigał aż miło :).

    Generalnie stosowany chip do kart USB , PDA itp. Może być naprawdę oki szczególnie że daje tory Stereo.

    ftp://202.65.194.211/pc/caudio/ALC5620_DataSheet_1.0.pdf

    Załącznik skasowałem, proszę umieszczać linki do dokumentacji. [c_p]
  • #20
    bartek96
    Level 12  
    Fajna rzecz ten ALC5620, tylko czy wiesz jak jest z dostępnością tego układu w Polsce? Są w naszym kraju albo w europie jacyś dystrybutorzy realteka?

    pzdr

    Bartek