(require 'stdlib) (define sampling-frequency 1000) ; Hz (define bits 8) (define range (ash 1 (1- bits))) (define min (- (ash 1 (1- bits)))) (define max (1- (ash 1 (1- bits)))) (printf "(bits %s min %s max %s)\n" bits min max) (define (clip value) (cond ((< value min) min) ((> value max) max) (t (inexact->exact (round value))))) (define (a-d value) "[-1.0 .. 1.0] -> [-128 .. 127]" (clip (* value range))) (define (d-a value) (exact->inexact (/ value range))) (dolist (v '(-1.0 0 1.0)) (printf "%s -> %s\n" v (a-d v))) (dolist (v (list min 0 max)) (printf "%s -> %s\n" v (d-a v))) ;; effects (define (volume sample value) (clip (* sample value))) (define (limiter sample max) (if (> sample max) max sample)) (define (process fx sound) (let (result) (printf "original: %s\n" sound) ;;(setq result (mapcar convert-a-d sound)) (setq result (mapcar (lambda (x) (volume x 12/10)) sound)) ;;(setq result (mapcar (lambda (x) (limiter x 95/100)) result)) ;;(setq result (mapcar d-a result)) ;;(setq result (mapcar clip result)) (printf "result : %s\n" result))) (define silence (make-list 10 0)) (process nil silence) (define noise '(-100 -60 2 50 127 127 3 -4 -53 -128 100)) (process nil noise) ;; generate a wave using sine function composite ;; start with a-d conversion (define (generate fn duration) (let* ((samples (* duration sampling-frequency)) (i 0) (wave (make-vector samples 0))) (while (< i samples) (aset wave i (fn i)) (setq i (1+ i))) (vector->list wave))) (define (wave-440hz x) (sin (* 440 x))) (define w (mapcar a-d (generate wave-440hz 1))) ;;(process nil w)