(use-modules (ice-9 binary-ports)) ; Bitrate is the number time to sample the music function each second (define bitrate 8000) ; Triangle wave with a period of 1 second (define (tri t) (let ((m (floor-remainder (+ t (/ 1 4)) 1))) (if (< m 1/2) (- (* 4 m) 1) (- 3 (* 4 m))))) ; Square wave with a period of 1 second (define (square t) (let ((m (floor-remainder t 1))) (if (< m 0.5) 1 -1))) ; Creates a note (define (note freq start len) (lambda (t) ( if (or (< t start) (>= t (+ start len))) 0 (* 1/4 (tri (* t freq)))))) ; Gets the frequency of a particular pitch (define (getfreq octave pitch) (* 55 (ash 1 octave) (expt 2 (/ pitch 12)))) ; Get the music as a list sampled at the bitrate (define (play t end) (cons ((lambda (a) (let ((b (modulo (inexact->exact (round (* (+ a 2) 32768))) 65536))) cons (put-u8 (current-output-port) (modulo b 256)) (put-u8 (current-output-port) (quotient b 256)))) (music t)) (if (< t end) (play (+ t (/ 1 bitrate)) end) '())))