Autor Wątek: 1bitowy generator dźwięku  (Przeczytany 2713 razy)

tsulej

  • *
  • Wiadomości: 25
  • Miejsce pobytu:
    Warszawa
1bitowy generator dźwięku
« dnia: 2013.03.14, 23:33:24 »
Bawiąc się takimi narzędziami jak to http://wurstcaptures.untergrund.net/music/ czy androidowy DroidBeat Synth postanowiłem sprawdzić czy da się zrobić coś podobnego na Spectrum przez beeper.
Cała koncepcja nazywa się "bytebeat" i polega na generowaniu 8-bitowego dźwięku na podstawie prostej funkcji zależnej od czasu. Dobrze jest to opisane tu: http://arxiv.org/pdf/1112.1368v1.pdf, tu: http://canonical.org/~kragen/bytebeat/ lub na tym blogu: http://countercomplex.blogspot.com/ (starsze posty).

Ze względu na to, że Spectrum operuje tylko 1 bitem, generujemy jedynie "pulse wave".  I jak się okazało - w ten sposób też się spokojnie da. Moje podejście polega na tym, że badam wybrany bit lub bity funkcji i jeśli przynajmniej jeden jest ustawiony, wysyłam na EAR bit przeciwny do poprzednio wysyłanego, a jeśli żaden nie jest ustawiony nie robię nic. Czas zapisany jest na dwóch bajtach.
 
Kod do jednego z przykładów (numerek 3) wygląda tak:
  t = 0;
  val = 0b00010000;
  while(1) {
if( ( (t | (t >> 9 | t >> 7))*t&(t>>11|t>>9) ) & 15 ) {
val = val ^ 0b00010111; //zmieniamy także border
}
sndport = val; //out(0xfe),val
t++;
  }

Funkcja jak widać jest dość pokraczna, ale efekt jest ciekawy. Generalnie funkcje wziąłem z przykładów z wymienionych wcześniej stron czy programów.
Uboczny efekt takiego postępowania objawia się tym, że im więcej obliczeń, tym wolniej iterujemy, a im wolniej iterujemy tym niższe częstotliwości uzyskujemy. Można by było się pokusić o liczenie taktów, ale szkoda się ograniczać  ;)

Poniżej macie programik z 12 przykładami, całość napisana w C, kompilowana SDCC  :D. Dźwięk może nieco pływać, bo włączone są przerwania (odczytuję klawiaturę przez ROM na razie).