Jump to content
Sign in to follow this  

ALL Interval 12-tone Rows and 12-tone control

Recommended Posts


Dear Friends,


I need some help on functions related to more control over 12-tone rows,

specially the interval content.

For example, below there are Berg's Lyric Suite 12-tone Row.

This is an example of all interval series, a combination of every interval.

Please, check this:



This All interval series are very interesting harmonically, since it

produces very consonant trichords.


1) I'd like to control the building of the 12-tone rows, in relation to

 it's properties to get more control over the harmonic output.


What are the methods and fuctions related to it ?

(setf berglyric '(f4 e4 c4 a4 g4 d4 ab4 db4 eb4 gb4 bb4 b4))

(pitch-to-interval berglyric)

(respell (gen-chord2 20 '(3 3 3) no012row))
(respell (gen-chord2 40 '(3 3 3 1) berglyric))

2) How to retrieve the notes of the series for genarating chords in different

 ways and matrices, like in sequence or every other note.

For example

Hypothetical ROW

(0 1 2 3 4 5 6 7 8 9 10 11)


How to retrieve:

0 2 4 6 8 10 (skipping every one note)


0 3 6 9






(0 1 2)

(3 4 5)

(6 7 eight)

(9 10 11)




(0 4  😎

(1 5 9)

(2 6 10)

(3 7 11)


Any help is welcome !



Share this post

Link to post
Share on other sites

Hi Julio,

for creating All interval row, you can use the Opusmodus function air and also the two other related functions air-group and rnd-air.


For extracting chords etc, my favorite way is to use the function harmonic-progression but several other way are possible.


Here's a short exemple of using the function harmonic-progression on All Interval Row:


(setf row (air 24 :prime :type :pitch))

=> (c4 cs4 eb4 a4 gs4 e4 d4 f4 bb4 g4 b4 fs4)

;; extracting some chords /scales

(setf chords1 (harmonic-progression
               (rnd-number 8 -6 6)
               :step 2
               :size 4

(setf chords2 (harmonic-progression
               (rnd-number 8 -6 6)
               :step '(2 1 2 3)
               :size 4
               :relative t

(setf chords3 (harmonic-progression
               (rnd-number 8 -6 6 :seed 4738)
               :step '(2 (1 2) 3)
               :size 4
               :relative t
               :seed 384

Have a nice day.




Share this post

Link to post
Share on other sites

Dear Stephane,


Thanks a lot for this insigthful answer !


There are so many beautiful hidden secrets in Opusmodus.

I was searching for row, 12-tone, series, but never ocurred to

me searching "air".


There's a need for some historical music-oriented tutorials.

All the best !



Share this post

Link to post
Share on other sites
13 hours ago, AM said:

... a keyword/text search within the feature descriptions would be very useful.... so if i search "all-interval" i could find AIR etc....

Great idea Andre! 



Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Similar Topics

    • By AM
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; rnd-walk in a pitchfield - with interval-control ;;; ;;; this is a little function which does an rnd-walk in a special way ;;; the function is checking all possible interval-pairs first inside the pitchfield ;;; so that is on one hand all the time "inside" the pitchfield/sieve, but also only ;;; uses the :POSSIBLE-INTERVALS, so you could control the "interval-color" of the walk ;;; in an non-chromatic-pitchfield/sieve ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun enlarge-intervals (possible-intervals &key (octaves 2)) (let ((possible-intervals (append possible-intervals (loop repeat octaves for i = 12 then (incf i 12) append (x+b possible-intervals i))))) (append possible-intervals (neg! possible-intervals)))) ;(enlarge-intervals '(2 3 4)) ;;;;;;;;;;; (defun special-rnd-walk (n &key pitchfield startpitch possible-intervals (interval-octaves 2)) (let ((int-list (loop for i in pitchfield collect (list (pitch-to-midi i) (loop for x in pitchfield with int do (setf int (car (pitch-to-interval (list i x)))) when (/= int 0) collect int)))) (possible-intervals (enlarge-intervals possible-intervals :octaves interval-octaves))) (append (list startpitch) (midi-to-pitch (loop repeat n with int with pitch = (pitch-to-midi startpitch) do (setf int (rnd-pick (filter-preserve possible-intervals (cadr (assoc pitch int-list))))) when (null int) do (setf int (rnd-pick (cadr (assoc pitch int-list)))) collect (setf pitch (pitch-to-midi (cadr (interval-to-pitch (list int) :start (midi-to-pitch pitch)))))))))) ;;;;;;;;;;; EXAMPLES ;;; rnd-walk in a "chromatic-field" - as the most easiest example/way ;;; => so all possible-intervals could be used -> THE ORDINARY WAY... (special-rnd-walk 20 :startpitch 'cs4 :pitchfield '(gs3 a3 bb3 b3 c4 cs4 d4 ds4 e4 f4 fs4 g4 gs4 a4) :possible-intervals '(1 2 3)) ;;; BUT have a look to the next examples!!! ;;; rnd-walk in a PITCHFIELD -> the function is checking all possible interval-pairs inside the pitchfield ;;; so that the rnd-walk INSIDE the PITCHFIELD could be done with specific intervals (if they are inside the field) ;;; COMPARE THE RESULT with the PITCHFIELD!!! ;;; (setf pitchfield '(gs3 cs4 ds4 g4 a4 b4 d5 e5 fs5 bb5 c6 f6)) ;;; "interval-color" of the walk is made with :possible-intervals (special-rnd-walk 5 :startpitch 'ds4 :pitchfield '(gs3 cs4 ds4 g4 a4 b4 d5 e5 fs5 bb5 c6 f6) :possible-intervals '(1 2 3)) ; + octaves of this intervals (special-rnd-walk 10 :startpitch 'ds4 :pitchfield '(gs3 cs4 ds4 g4 a4 b4 d5 e5 fs5 bb5 c6 f6) :possible-intervals '(1 3 4 5) :interval-octaves 0) ;;; reduced interval-span (special-rnd-walk 10 :startpitch 'ds4 :pitchfield '(gs3 cs4 ds4 g4 a4 b4 d5 e5 fs5 bb5 c6 f6) :possible-intervals '(5 6 7)) ; + octaves of this intervals  
      more examples -> SOUND
      ;;; rnd-versions so you will here the different interval-colors inside the pitchfield (setf seq (gen-sieve '(f3 fs6) '(4 2 1 1 1 2 4 7) :type :pitch)) ;(setf seq (gen-sieve '(f3 fs6) '(7 4 2 1 1 1 2 4) :type :pitch)) ;(setf seq '(gs3 cs4 ds4 g4 a4 b4 d5 e5 fs5 bb5 c6 f6)) (setf pitchlist (special-rnd-walk (rnd-pick '(3 5 7 11)) :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals (rnd-pick '((1 2) (3 4) (5 6 7))) :interval-octaves 3)) (def-score intervals (:title "walk" :key-signature 'atonal :time-signature '(4 4) :tempo 90) (instrument :omn (make-omn :pitch pitchlist :length '(t) :span :pitch) :channel 1 :sound 'gm :program 'acoustic-grand-piano))  
      ;;; rnd-walk in SIEVE only with intervals '(5 6 8) (setf seq (gen-sieve '((c4 g7) (c2 g7)) '((2 1 10) (3 5)) :type :pitch)) (setf pitchlist (special-rnd-walk 30 :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals '(5 6 8))) (def-score intervals (:title "intervals" :key-signature 'atonal :time-signature '(4 4) :tempo 90) (instrument :omn (make-omn :pitch pitchlist :length '(t) :span :pitch) :channel 1 :sound 'gm :program 'acoustic-grand-piano))  
      (setf seq (gen-sieve '((c2 g7) (c2 g7)) '((2 1 10) (3 5)) :type :pitch)) ;;; EXAMPLE with changes -> all inside the same SIEVE (setf pitchlist (append (special-rnd-walk 50 :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals '(1)) ; minor second (special-rnd-walk 50 :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals '(2)) ; major second (special-rnd-walk 50 :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals '(3 4)) ;thirds (special-rnd-walk 50 :startpitch (rnd-pick seq) :pitchfield seq :possible-intervals '(5 7)))) ; fourth-fifth (def-score intervals (:title "intervals" :key-signature 'atonal :time-signature '(4 4) :tempo 90) (instrument :omn (make-omn :pitch pitchlist :length '(t) :span :pitch) :channel 1 :sound 'gm :program 'acoustic-grand-piano))  
    • By born
      how can I convert binaries to intervals?
      (gen-binary-euclidean 1 14 8 8) => (1 0 1 1 0 1 0 1 0 1 1 0 1 0)
      Each set of (1 0) shoud be replaced by 2 resulting in  '(2 1 2 2 2 1 2 2).
      Thanks for help.
    • By terekita
      I'm aware of pcs-analysis (which prints data), but I'm looking for a way to collect lists of Forte-style interval vectors into a data structure in order to query them for similarity and difference. Something like:
      (get-interval-vector '3-1)
      -> (2 1 0 0 0 0)
      Is there an easy way to do this?
      thanks, Michael
  • Create New...