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źwięk może nieco pływać, bo włączone są przerwania (odczytuję klawiaturę przez ROM na razie).