Autor: Dondu
Stawiamy przed Wami kolejne proste zadanie, w którym można się wykazać i zdobyć książkę. Tym razem jest to generowanie obwiedni typu ADSR. Brzmi groźnie?
W latach 80 tych tworzyliśmy syntezatory opisywane w miesięczniku "RE Radiolelktronik" na bazie tranzystorów itp. Potężne płytki, ciągłe problemy .... aktualnie wystarczy jeden malutki mikrokontroler i krótki program, by ADSR realizować :-)
Uwaga!!!
Linki do rozwiązań konkursowych znajdziesz na końcu niniejszego artykułu.
W pierwszym konkursie ograniczymy się jedynie do wygenerowania obwiedni ADSR. W następnych konkursach będziemy dodawać dodatkowe elementy. Naszym celem końcowym jest zrobienie prostego syntezatora dźwięków.
Obwiednia ADSR, to nic innego jak regulacja amplitudy (np. dźwięku) podzielona na 4 etapy:
- Attack - narastanie amplitudy,
- Decay - opadanie amplitudy,
- Sustain - wybrzmiewanie,
- Release - wybrzmiewanie końcowe (wyciszenie)
Obwiednia ADSR - wersja podstawowa. |
w praktyce na przykład tak:
Obwiednia ADSR - przykład rzeczywisty. |
Jak rozumieć te wykres? To naprawdę jest proste i wytłumaczę to poniżej :-)
Nagroda
Nagrodą dla zwycięzcy będzie książka (w wersji eBook) ufundowana przez eBookPoint:
za pomocą platformy Arduino, systemu Android i zwykłego komputera
Wszyscy uczestnicy (łącznie ze zwycięzcą) będą mieli drugą szansę, tym razem na dowolną książkę w wersji papierowej, o czym piszę pod koniec niniejszego artykułu.
Zadanie 1 - podstawa
Pierwszym zadaniem do wykonania będzie więc otrzymanie powyższego przebiegu za pomocą timera z PWM przy następujących założeniach czasowych:
- czas trwania ataku: AT = 250ms,
- czas trwania opadania: DT = 100ms,
- czas trwania wybrzmiewania: ST = 350ms,
- czas trwania wyciszania: RT = 300ms.
Założenia te na wykresie będą wyglądały więc następująco:
Obwiednia ADSR - czasy trwania. |
Pozostaje nam jeszcze ustalić amplitudy ataku (A) oraz wybrzmiewania (S):
- amplitudę ataku przyjmiemy jako maksymalną, którą reprezentuje PWM o wypełnieniu 100% czyli dla timera 8-bitowego będzie to liczba 255, stąd APWM=255,
- amplitudę poziomy wybrzmiewania (S) ustawimy na poziomie np. 60% czyli dla nas będzie to liczba SPWM = 255 * 60% = 153.
Stąd:
Jak zrealizować zadanie nr 1?
Należy wykorzystać timer do generowania sygnału PWM oraz ten sam timer lub inny do generowania przerwań:
- ustawiasz wybrany timer tak, by generował sygnał PWM o zadanym wypełnieniu,
- przerwanie za pomocą programu zmienia wypełnienie timera w zależności od miejsca na osi czasu (t), w którym znajduje się program generujący przebieg ADSR,
- jeżeli dojdziemy do końca generowania obwiedni, rozpoczynamy generować ją od początku.
Należy przyjąć z jaką dokładnością będziemy odtwarzać wykres obwiedni. Przyjmijmy więc, że przerwanie powinno być wywoływane co około 1ms - to wystarczająca dla nas dokładność.
Jak obliczać wartość PWM na skośnych zboczach obwiedni ADSR?
Sądzę, że nie sprawi Ci to problemu ponieważ zbocza są odcinkami prostymi, czyli zwykłą funkcją liniową.
Wystarczy więc ustalić współczynnik nachylenia zbocza za pomocą czasu jego trwania i zakresu jego zmiany w tym czasie (różnica wartości PWM na początku i końcu zbocza w stosunku do ilości kroków, które mamy na wykonanie tej zmiany - w naszym przypadku 1 krok, to 1ms).
Współczynnik ten będzie przyjmował wartości dodatnie (dla zbocza narastającego) lub ujemne (dla zbocza opadającego). Tak obliczony współczynnik należy za każdym przerwaniem dodawać do ustawionej aktualnie wartości PWM.
Gdy kończymy dany fragment obwiedni np. A, obliczamy współczynnik dla kolejnego odcinka w tym wypadku D i dalej nasze przerwanie już działa normalnie. Można także przed wygenerowaniem obwiedni, obliczyć współczynniki dla każdego odcinka.
Wyjątek stanowi oczywiście współczynnik nachylenia dla wybrzmiewania (S), który będzie wynosił zero, ponieważ ten fragment wykresu obwiedni jest płaski.
Czy to jest trudne? Nie to jest naprawdę proste, ale zapewne przydałby się jakiś przykład ...
Przykład - wzorzec
Na przykładzie z Drzaśkowego Pamiętnika: FAST PWM - Sposób na DAC
możesz prześledzić jak generowane są przebiegi sinus i piła, czyli jak ustawić PWM, a jak timer generujący przerwania zmieniające parametry PWM oraz jak zrobić prosty schemat.
Filtr dolnoprzepustowy
Na powyżej wskazanym schemacie znajdziesz na wyjściach PWM prosty schemat filtru dolnoprzepustowego, który pozwala zamienić sygnał PWM na żądany przez nas przebieg widziany na oscyloskopie. Bez tego filtru na oscyloskopie będziesz widział jedynie prostokątny przebieg sygnału PWM, co słusznie zauważył Miłosz Rachwał, w komentarzu do tego artykułu.
Jeżeli chcesz możesz oczywiście opracować własny filtr dolnoprzepustowy, by dokładniej odtwarzać naszą obwiednię. Na pewno się on przyda w dalszych konkursach z tego cyklu, co pozwoli uzyskać znacznie lepszy dźwięk.
Oscyloskop
W efekcie na oscyloskopie powinieneś zaobserwować powyższy wykres. Jeżeli nie masz oscyloskopu możesz wykorzystać kartę dźwiękową komputera: Oscyloskop za darmo
UWAGA!!!
Jeżeli nie masz dostępnego oscyloskopu cyfrowego i będziesz korzystał z darmowego powyżej, to możesz skrócić czasy ADSR np. o 50 razy, by na oscyloskopie uzyskać powtarzalne przebiegi w zakresie pasma przenoszenia karty dźwiękowej komputera.
Zadanie 2 - dodajemy przycisk
Jeżeli już mamy dokładnie odtworzoną obwiednię i generowaną raz za razem, należałoby wprowadzić, jakiś rodzaj inicjatora startu generowania obwiedni. Najlepiej byłoby, gdyby był to po prostu przycisk.
Naciśnięcie przycisku powinno więc:
- rozpocząć generowanie obwiedni,
- lub przerwać generowanie aktualnej obwiedni i rozpocząć generowanie nowej.
Rozwiązania zadań 1 i 2
Jako pierwsze prezentuję rozwiązanie moje (pozakonkursowe), które stanowi jednocześnie podstawę kolejnego konkursu: Generator obwiedni ADSR na mikrokontrolerze ATmega8 (wersja Dondu)Zwycięzca!
Zwycięskie rozwiązania zadań 1 i 2 nadesłał Maciej Łukaszewicz: Obwiednia ADSR: Zadania 1 i 2 by Maciej Łukaszewicz
Nie bawiłem się jeszcze Drzaśka artykułem dotyczącym generowania przebiegów za pomocą mikrokontrolera, ale zaglądnąłem i faktycznie nie jest to trudne. Praktycznie gotowy przykład jest tam zawarty nawet dla sinusa itp. A tutaj jest o wiele prościej, bo wszystko jest oparte o linie proste, a nie sinusy, czy piły. Nie podaliście jak należy przesyłać swoje rozwiązania.
OdpowiedzUsuńJuż dodałem informację jak wysłać materiały konkursowe.
UsuńTen syntezator w filmu to niezły bajer szczególnie pod koniec filmu.
OdpowiedzUsuńCzyli w tym konkursie, chodzi tylko o wygenerowanie obwiedni, a nie dźwięku jako takiego?
OdpowiedzUsuńTak, tylko obwiedni o zadanych parametrach.
UsuńCzy mamy zbudować układ (uC + low-pass + oscyloskop) i zaprezentować działanie układu?
OdpowiedzUsuńPrzede wszystkim program. Jeżeli będzie do tego schemat z prostym filtrem, to super. Należy jednak wziąć pod uwagę, ze filtr będzie musiał w kolejnym konkursie mieć taką charakterystykę, by jakieś przyzwoite częstotliwości dźwięków przepuszczać. Nie mam na myśli oczywiście jakości CD :-)
UsuńOscyloskop - jeżeli mam ktoś taką możliwość, żeby pokazać przebiegi, to także będzie super.
Zapraszam do uczestnictwa, bo zadanie jest proste a ja nie chcę znowu książek zwracać tym razem do eBookPoint :-)
Ale co da oscyloskop z karty dźwiękowej, jak na nim zamiast obwiedni widać tylko sygnał PWM?
OdpowiedzUsuńMasz rację. W zadaniu nr 1 powyżej wskazałem przykład z Drzaśkowego pamiętnika, gdzie realizowany jest przetwornik DAC (cyfrowo-analogowy) do generowania przebiegów sinus i piła. W przetworniku Drzasiek zastosował prosty filtr dolnoprzepustowy, który wygładza przebieg zamieniając PWM na przebiegi sinus i piłę. W naszym przypadku filtr ten pozwoli uzyskać obwiednię.
UsuńAle ponieważ nie napisałem tego wprost, to faktycznie należy to uzupełnić. Zaraz dodam odpowiedni punkt, by nie było wątpliwości.
Dziękuję za zwrócenie uwagi.
Już dodałem i wspomniałem o Tobie :-)
UsuńPróbowałem się za to zabrać ale chyba generowanie linii mnie przerasta :/
OdpowiedzUsuń