From 2d6a241e9a3798d38c7a8821dd3cf2c815e04c15 Mon Sep 17 00:00:00 2001 From: Clinton Ebadi Date: Sun, 23 Nov 2014 21:58:30 -0500 Subject: [PATCH] Something about generating smooth playlists I think this code is intended to use the bpm of a library of input files and generate a playlist that picks songs gracefully moving toward a changing target bpm. --- distance.scm | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 distance.scm diff --git a/distance.scm b/distance.scm new file mode 100644 index 0000000..031c09d --- /dev/null +++ b/distance.scm @@ -0,0 +1,29 @@ +(use-modules (srfi srfi-1)) + +(define distance (a b) + (abs (- a b))) + +(define (distance-change bpm_c bpm_n bpm_n+1) + (- (abs (distance bpm_c bpm_n) (distance bpm_c bpm_n+1)) + (distance bpm_a bpm_b))) + +(define (insert-song song playlist) + (let ((last + (let find-minimum ((current-minimum (inf)) + (min-cons '()) + (plist playlist)) + (cond + ((null? (cdr rest)) + '()) + ((< (distance-change song (first plist) (second plist)) + current-minimum) + (find-minimum (distance-change song (first plist) (second plist)) + (first plist) + (rest plist))) + (else (find-minimum current-minimum min-cons (rest plist))))))) + (let insert-copy ((old-list playlist)) + (cond ((eq? last old-list) + ;; (list... (car old-list) song (cdr old-list)) + (cons* (car old-list) song (cdr old-list))) + (else (cons (car old-list) (insert-copy (cdr old-list)))))))) + -- 2.20.1