logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak odtworzyć pliki MIDI na mikrokontrolerze 8051 lub AVR? Szukam wskazówek!

bartek96 04 Wrz 2007 10:41 4128 20
REKLAMA
  • #1 4248917
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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?
  • REKLAMA
  • #2 4249398
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4249659
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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
  • REKLAMA
  • #5 4252322
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 :)
  • REKLAMA
  • #6 4252415
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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(_at_)o2.pl
  • #7 4252435
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4252438
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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 4252445
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4252469
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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 4252915
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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.
  • REKLAMA
  • #12 4253000
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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 4253057
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4256985
    Paweł Es.
    VIP Zasłużony dla elektroda
    Posty: 6981
    Pomógł: 1236
    Ocena: 693
    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 4269032
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4273723
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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]
  • #17 4274005
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Fotki ???

    Co masz na myśli ??
  • #18 4276307
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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 4278524
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    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 4337249
    bartek96
    Poziom 13  
    Posty: 83
    Pomógł: 4
    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
  • #21 4337597
    Jdsoul
    Poziom 23  
    Posty: 501
    Pomógł: 47
    Ocena: 10
    Beze problemu PROTON :)

Podsumowanie tematu

✨ Dyskusja dotyczy możliwości odtwarzania plików MIDI na mikrokontrolerach z rdzeniem 8051 lub AVR, ze szczególnym uwzględnieniem syntezy polifonicznej na prostych układach. Format MIDI jest stosunkowo złożony, co wymaga buforowania danych i odpowiedniego sprzętu do generacji dźwięku, np. przetwornika DAC lub generatora FM. Propozycje obejmują wykorzystanie PWM z filtracją dolnoprzepustową do generacji prostych fal prostokątnych lub stabilizowanych sinusoid, a także cyfrowe miksowanie kanałów w celu uzyskania polifonii. Wskazano, że AVR może być bardziej odpowiedni niż 8051 ze względu na większą moc obliczeniową, choć 8-bitowe mikrokontrolery mogą mieć ograniczenia w przetwarzaniu dźwięku w czasie rzeczywistym. Rozważano także podejście polegające na wcześniejszym zdekodowaniu pliku MIDI do uproszczonej tablicy nutowej, którą mikrokontroler mógłby odtwarzać. W dyskusji pojawiły się sugestie wykorzystania zewnętrznych peryferiów do syntezy dźwięku, takich jak karty dźwiękowe lub dedykowane układy audio, aby odciążyć mikrokontroler. Wspomniano o układach Realtek ALC5620 (kodek audio na interfejsie I2S) jako przykładzie peryferium do odtwarzania i kodowania dźwięku. Poruszono także temat pamięci FLASH (np. AT45DB161D) do przechowywania dźwięków w formacie ADPCM oraz dyskutowano o jakości dźwięku przy 8-bit/8kHz próbkowaniu z kompresją ADPCM. Wskazano, że MIDI przesyła dane sterujące, które różnią się od surowych danych audio, co wymaga syntezy dźwięku na podstawie parametrów nutowych. Podsumowując, realizacja odtwarzania MIDI na mikrokontrolerach 8051/AVR wymaga kompromisów między złożonością formatu, możliwościami sprzętowymi i jakością dźwięku, a praktyczne podejście może polegać na upraszczaniu danych MIDI i wykorzystaniu prostych metod syntezy dźwięku z wykorzystaniem PWM i filtrów analogowych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA