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.

Polifonia w syntezatorze

Obywatel LutZek 10 Sep 2014 13:40 1401 4
  • #1
    Obywatel LutZek
    Level 13  
    Witam

    Chciałbym się zmierzyć z cyfrową syntezą dźwięku tworząc prosty syntezator cyfrowy. Podstawowe założenia już opracowałem, mam natomiast pewien problem z polifonią.

    Pytanie brzmi - czy aby uzyskać efekt polifonii muszę wysyłać naprzemiennie próbki z każdego dźwięku, czy muszę odwzorować jakiś rodzaj modulacji?

    Pozdrawiam
  • #2
    jhusak
    Level 13  
    Nic nie rozumiem.

    Ale spróbuję. Z polifonią tak jak w życiu, chcesz mieć więcej, to kup/zrób/zaprogramuj więcej.

    Czyli jeśli syntezator analogowy - polifonia polega na powieleniu torów syntezatora.
    Jeśli cyfrowy, to albo jak wyżej, albo oprogramowanie ma zaszyte kilka niezależnych torów.
    Na końcu jest mikser, który sumuje sygnały poszczególnych torów. Najprostszy mikser to złączone wyjścia na krótko.
  • #3
    Obywatel LutZek
    Level 13  
    Odpowiedź aktualna, bo właśnie dzisiaj skończyłem prace nad syntezatorem (tak, działa). Nie chciało mi się wierzyć, że to po prostu zwykła suma sygnałów i zastanawiałem się czy do osiągnięcia tego efektu muszę multipleksować próbki z kilku NCO, czy też są to jakieś inne dziwne operacje na sygnale fonicznym.

    Bardzo dziękuję za odpowiedź.

    Co do projektu - myślę, że póki co nie podzielę się nim jeszcze w dziale DIY. Po pierwsze nie wiem czy coś takiego tam się nadaje, a po drugie - chciałbym z pewnych względów poczekać z tym przynajmniej 2 miesiące. Jest to czterokanałowy syntezator, którego rdzeniem jest układ FPGA - Spartan 3. Jest zdolny do generowania przebiegów sinusoidalnych / trójkątnych / prostokątnych i piłokształtnych, z możliwością modyfikacji parametrów obwiedni ADSR. Być może w przyszłości rozszerzę ten układ o 16-kanałową polifonię, interfejs MIDI i syntezę substraktywną.

    Pozdrawiam
  • #4
    jhusak
    Level 13  
    Hehe, tak to bywa, jak specjalista w jakiejś dziedzinie zabiera się za zupełnie nowe poletko. Wówczas i terminologia nie ta, i braki podstaw teorii - wrażenie (jakże mylne), że zupełnie początkujący.

    Płaszczę się i gratuluję - ja musiałbym przebić się przez vhdl czy inny verilog, aby takie coś zrobić... Pewnie by mi to zajęło zbyt dużo czasu...

    Ale - żeby nie być w tyle, proponuję propozycję :)
    Jest taki sprzęcik, nazywa się MIST, opracował i zbudował pierwsze egzemplarze Till Harbaum, a produkuje to lotharek.pl. Jest to fpga+przydatki, które pozwala na uruchamianie AtariST, Amigi(z agą!) i innych C64, ZX, AtariXL, 2600, 5200, MSX, NES. Jak się do niego uśmiechnąć, to zejdzie z ceny, a i całkiem sporo może, jeśli mu się obieca, że się coś pod ten sprzęt napisze. Jako, że mnie interesują takie sprawy, czy byłbyś łaskaw rzucić okiem na stronę mist-board (szukaj w guglu pod takim hasłem) i stwierdzić, czy nie dało by się prostym ruchem przeportować taki syntezator na to urządzenie? W sumie ma ono wyprowadzone MIDI w jednej z wersji, ma też wyjście audio, oraz wyjście na monitor vga. No i 32 mega ramu.

    Da radę?
  • #5
    RaStEr31
    Level 10  
    Witaj
    ... jeśli chodzi Tobie o otrzymanie cyfrowego dźwięku polifonicznego, musisz stworzyć w swoim programie coś w rodzaju "miksera" (sumatora) próbek sygnału.
    Można zrobić to na kilka sposobów :)
    Wszystko zależne jest od tego, czy Twoje próbki dźwięku przechowywane są w ośmiu, czy też 16 bitach.

    1. Jeśli przechowujesz próbki w ośmiu bitach, a posiadasz szesnastobitowe rejestry

    ... załóżmy, że stworzymy polifonię 4 głosową :)
    a).
    1). Pobieramy pierwszą ośmiobitową próbkę i rozszerzamy rejestr do 16 bitów

    EXT.l próbka
    próbka= 1111111111100111

    2). pobieramy kolejne próbki i wykonujemy z nimi dokładnie to samo.
    b).
    Załóżmy, że próbki to rejestry A,B,C,D ...
    Wykonujemy operację sumowania próbek ( pamiętając, że pracujemy na rejestrach szesnastobitowych)

    ADD.w A,B
    ADD.w C,D
    ADD.w B,D

    c).
    Mamy zsumowane próbki ( w rejestrze D ), teraz należy je znów przeskalować do 8 bitów. Uzyskamy to poprzez podzielenie wartości tego rejestru (D) przez sumę ilości próbek, które zostały do siebie dodane ( w naszym przypadku 4) ...
    Uzyskujemy to poprzez przesunięcie bitowe w prawo zawartości tego rejestru.
    Należy wziąć pod uwagę, że przesunięcie to musi odbywać się ze znakiem ! ... W przeciwnym wypadku stracimy, a tym samym "zafałszujemy" rzeczywisty "kształt dźwięku" :)

    ... a więc
    ASR.w D - przesuwamy o 1 ( dzieląc przez 2 !)
    ASR.w D - przesuwamy o 1 ( dzieląc przez 2 !)

    d.
    Wysyłamy zawartość rejestru D na przetwornik cyfrowo-analogowy ... i to już koniec :)

    Dodano po 15 [minuty]:

    2. Jeśli posiadasz próbki i rejestry ośmiobitowe.

    a.
    pobierasz 4 kolejne próbki i wykonujesz następujące czynności
    ASR.b A ; A=A/2 (ze znakiem)
    ASR.b B ; B=B/2 (ze znakiem)
    ADD.b A,B ; B=B+A
    ASR.b C ; C=C/2 (ze znakiem)
    ASR.b D ; D=D/2 (ze znakiem)
    ADD.b C,D ; D=D+C
    ASR.b B ; B=B/2 (ze znakiem)
    ASR.b D ; D=D/2 (ze znakiem)
    ADD.b B,D ; D=D+B


    ... I to by było chyba na tyle ... Myślę, że czegoś nie pomieszałem :)

    Proponował bym jednak tą pierwszą metodę, ponieważ zajmuje mniej czasu procesora, a nawet wielkość rejestrów rozszerzył bym ( gdyby to było możliwe ) do 32 bitów, a wtedy bawiłbym się na 16 bitowych próbkach ...

    Pozdrawiam :)