Something about generating smooth playlists
authorClinton Ebadi <clinton@unknownlamer.org>
Mon, 24 Nov 2014 02:58:30 +0000 (21:58 -0500)
committerClinton Ebadi <clinton@unknownlamer.org>
Mon, 24 Nov 2014 02:58:30 +0000 (21:58 -0500)
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 [new file with mode: 0644]

diff --git a/distance.scm b/distance.scm
new file mode 100644 (file)
index 0000000..031c09d
--- /dev/null
@@ -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))))))))
+