Jump to content

Featured Replies

Posted

Rose (pink) is in French the name of a color, a flower but also the name of a theoretical noise: the pink noise.

Other name for pink-noise is 1/f noise.

First, I define a 1/f function.

1/F-VALUE function is a modified version of 1-OVER-F function found in: 

Algorithmic Composition: A Gentle Introduction to Music Composition Using Common LISP and Common Music by Mary Simoni.

(defun 1/f-value (number min max)
  (do* ((counter 0 (incf counter))
        (blue (+ 1 (random max))
              (if (= counter 4)
                (+ 1 (random max)) blue))
        (green (+ 1 (random max))
               (if (or (= counter 2)
                       (= counter 4)
                       (= counter 6))
                 (+ 1 (random max)) green))
        (red (+ 1 (random max)) (+ 1 (random max)))
        (total (+ blue green red) (+ blue green red))
        (the-list (cons total ()) (cons total the-list)))
       ((= counter (- number 1)) (vector-round min max (reverse the-list)))))

 

Now, definition of a melody generator with pitch, length and velocity parameters taken from 1/F-VALUE function.

(defun gmel (lenmap nbvalp nbvalr min max amb velmin velmax restprob)
  (length-rest-weight
   restprob
   (make-omn
    :pitch (vector-to-pitch amb (1/f-value nbvalp min max))
    :length (vector-map lenmap (1/f-value nbvalr min max))
    :velocity (vector-to-velocity
               velmin velmax
               (vector-smooth 0.2 (1/f-value nbvalp min max))))))

 

Length parameters:

(setf lenmap1 '(1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/12 1/16))
(setf lenmap2 '(1/3 1/4 1/5 1/6 1/7 1/8 1/12 1/16))
(setf lenmap3 '(1/6 1/7 1/8 1/12 1/16))
(setf lenmap4 '(1/8 1/12 1/16))

 

Now, create some parts (p1 p2 etc..) with a repeated use of the gmel function with GEN-LOOP:

(setf p1 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p2 (gen-loop 8
          (gmel
           (apply-eval (rnd-pick '(lenmap1)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p3 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8 4 12))
           1
           (rnd-pick '(40 20 10))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p4 (gen-loop 8
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8 4 12))
           1
           (rnd-pick '(100))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p5 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p6 (gen-loop 8
          (gmel
           (apply-eval (rnd-pick '(lenmap1)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(3 1))))

 

(setf p7 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 1232 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(6 1))))

 

(setf p8 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(g5 c7) 'p 'ff '(2 1))))

 

(setf p9 (gen-loop 12
          (gmel
           (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
           (rnd-pick '(64 12 32 24))
           (rnd-pick '(8))
           1
           (rnd-pick '(100 50 40 10))
           '(c4 c6) 'p 'ff '(6 1))))

 

(setf p10 (gen-loop 12
           (gmel
            (apply-eval (rnd-pick '(lenmap1 lenmap2 lenmap3 lenmap4)))
            (rnd-pick '(64 12 32 24))
            (rnd-pick '(8))
            1
            (rnd-pick '(100 50 40 10))
            '(c4 c6) 'p 'ff '(3 1))))

 

(setf p11 (gen-loop 8
           (gmel
            (apply-eval (rnd-pick '(lenmap1)))
            (rnd-pick '(64 12 32 24))
            (rnd-pick '(8))
            1
            (rnd-pick '(100 50 40 10))
            '(c4 c6) 'p 'ff '(3 1))))

 

Assemble all the part into one piece

(setf full (assemble-seq p2 p1 p3 p4 p5 p6 p7 p8 p9 p10 p11))

 

Define a template (master-span) for time signatures

(setf master-span (rnd-sample (length full) '(1 2/4 3/4 4/4 5/4 6/8 9/8 7/4)))

 

Apply the template to the piece

(setf full-msp (length-span master-span full))

 

Score definition:

(def-score rose
           (:composer "S.Boussuge"
            :copyright "Copyright © 2014 S.Boussuge"
            :key-signature atonal
            :time-signature (get-time-signature full-msp)
            :tempo 138
            :layout (flute-layout 'flute))
  
  (flute :omn full-msp
         :channel 1
         :sound 'gm
         :program 'flute))

SB.

Create an account or sign in to comment


Copyright © 2014-2025 Opusmodus™ Ltd. All rights reserved.
Product features, specifications, system requirements and availability are subject to change without notice.
Opusmodus, the Opusmodus logo, and other Opusmodus trademarks are either registered trademarks or trademarks of Opusmodus Ltd.
All other trademarks contained herein are the property of their respective owners.

Powered by Invision Community

Important Information

Terms of Use Privacy Policy