Compose an actual song

This commit is contained in:
Anthony Wang 2023-01-06 20:13:43 -06:00
parent 4f243c6f49
commit 495b1fa59b
Signed by: a
GPG key ID: 42A5B952E6DD8D38
4 changed files with 70 additions and 20 deletions

BIN
example.wav Normal file

Binary file not shown.

View file

@ -6,7 +6,7 @@
; Get the music as a list sampled at the bitrate ; Get the music as a list sampled at the bitrate
(define (play t end) (define (play t end)
(cons (* 1/4 (tri (* t (music t)))) (cons (music t)
(if (< t end) (if (< t end)
(play (+ t (/ 1 bitrate)) end) (play (+ t (/ 1 bitrate)) end)
'()))) '())))
@ -16,4 +16,4 @@
(let ((b (modulo (inexact->exact (round (* (+ a 2) 32768))) 65536))) cons (let ((b (modulo (inexact->exact (round (* (+ a 2) 32768))) 65536))) cons
(put-u8 (current-output-port) (modulo b 256)) (put-u8 (current-output-port) (modulo b 256))
(put-u8 (current-output-port) (quotient b 256)))) (put-u8 (current-output-port) (quotient b 256))))
(play 0 4)) (play 0 16))

View file

@ -14,4 +14,4 @@
; Gets the frequency of a particular pitch ; Gets the frequency of a particular pitch
(define (getfreq octave pitch) (define (getfreq octave pitch)
(* 55 (ash 1 octave) (expt 2 (/ pitch 13)))) (* 55 (ash 1 octave) (expt 2 (/ pitch 12))))

View file

@ -1,25 +1,75 @@
(include "lib.scm") (include "lib.scm")
; https://musiclab.chromeexperiments.com/Song-Maker/song/5761928473608192
; https://musiclab.chromeexperiments.com/Song-Maker/song/6414430911070208
(define (melody t) (define (melody t)
(apply + (map (lambda (x)
(apply (lambda (octave pitch start len) ((note (getfreq octave pitch) start len) (- t 32))) x))
'(
; (2 5 0 1/4)
; (3 0 1 1/2)
; (2 8 3 1/4)
; (2 7 4 1/2)
; (2 5 6 1/4)
; (3 1 7 1/4)
; (3 0 8 1/4)
; (2 5 0 4)
; (3 0 8 4)
; (2 3 18 1)
; (2 10 20 1)
; (3 0 22 1)
; (3 1 24 1)
; (3 0 26 1)
; (2 10 27 1)
; (2 5 28 1)
; (3 0 30 1)
; (2 5 32 4)
; (3 0 38 4)
; (2 3 42 1)
; (3 1 44 1)
; (3 1 48 1)
; (2 10 49 1)
; (3 0 50 1)
; (3 1 51 1)
; (2 10 52 1)
; (2 8 53 1)
; (2 10 54 1)
; (3 0 56 1)
; (3 1 58 1)
; (3 0 60 1)
; (2 8 62 1)
(2 5 1 2)
(3 0 7 2)
(2 10 15 2)
(3 1 19 2)
(3 0 21 2)
(2 10 29 1)
(3 0 30 2)
))))
(define (base t)
(apply + (map (lambda (x) (apply + (map (lambda (x)
(apply (lambda (octave pitch start len) ((note (getfreq octave pitch) start len) t)) x)) (apply (lambda (octave pitch start len) ((note (getfreq octave pitch) start len) t)) x))
'( '(
(2 5 1 1) (1 5 1 1)
(2 8 4 1) (1 8 4 1)
(3 5 7 1) (2 5 7 1)
(3 0 9 1) (2 0 9 1)
(2 10 10 1) (1 10 10 1)
(2 8 12 1) (1 8 12 1)
(2 7 15 1) (1 7 15 1)
(2 8 17 1) (1 8 17 1)
(2 7 18 1) (1 7 18 1)
(3 3 19 1) (2 3 19 1)
(2 8 21 1) (1 8 21 1)
(3 0 22 1) (2 0 22 1)
(3 3 23 1) (2 3 23 1)
(3 5 25 1) (2 5 25 1)
(3 0 30 1) (2 5 29 1)
(3 3 31 1))))) (2 0 30 1)
(2 3 31 1)))))
(define (music t) (define (music t)
(melody (* t 8))) (+ (* 1/2 (tri (* t (melody (floor-remainder (* t 8) 64)))))
(* 1/4 (tri (* t (base (floor-remainder (* t 8) 32)))))))