Jump to content

Recommended Posts

Hello, I am Marco.
With this score and description, I aim to contribute to the emerging form within 'Strategies and Methods to Control Complexity.'

 

Description:

 

OP-28-VAR

This piece for trio (flute, B flat clarinet, cello) proposes a parametric elaboration of the well-known twelve-tone row used by Anton Webern in his string quartet Op. 28. In the design, I aimed to give ample space to stochastic algorithms which, on a probabilistic basis, allow the orientation of the composition’s possible developments across a wide range of solutions, depending on the values assigned to different parameters. On this premise, the code-text produced by Opusmodus ends up identifying not just a single, specific musical object but a class of musical objects that share the same origin (morphogenetic class). These objects, while originating from the same code-text, differentiate from one another significantly, only due to the varying degrees of diversity in the assigned parameters and/or input data.

 

Having defined the initial seed and the “center-order” function, for clarity, I have segmented the code-text into six distinct sections: (1) General parameters; (2) Harmony; (3) Rhythm; (4) Velocity; (5) OMN form; (6) Def Score.

 

(1) General parameters

In this section, the general parameters that condition the character of the composition are defined: numvoices = number of voices (parts); n-loop-1 and n-loop-2 = number of length matrices that the “gen-tuplet” function will generate; random-rest-1 and random-rest-2 = parameters that control the number of rest figures in the respective length matrices (via the “rnd-rest” function); transp = intervals allowed in bi-chords; measure = meter of the individual cells in which each length matrix will be segmented; meter = meter of the composition; speed = metronome marking (speed of execution).

 

(2) Harmony

Given that in this context “harmony” refers to both aggregations (chords) and successions (rows) of pitches, the succession of pitches that defines Webern’s original row is first specified. Then, after a random octave transposition (via the “ambitus-octaves” function), the main variants (original form, inversion, retrograde, retrograde inversion, etc.) are collated through the “pitch-variant” function.

 

(3) Rhythm

First, using the “gen-tuplet” function, two length matrices (rhy-A and rhy-B) are produced, whose lengths are conditioned by the parameters n-loop-1 and n-loop-2. These matrices are immediately merged into a single matrix (rhy-1) by the “unify-rhythms” function. From this matrix, two more matrices (rhy-2 and rhy-3) are obtained using the “rnd-rest” function, which replaces some sound values with rest values based on the random-rest-1 and random-rest-2 parameters. The “length-divide” function allows the creation of three additional length matrices by dividing four, five, or six values of each matrix into four submultiples, respectively. Thus, six length matrices are obtained, which are segmented into distinct isometric cells (cells of equal length) using the “omn-to-measure” function. The “length-diminution” function then produces three more length matrices by shortening, followed by doubling. These nine length matrices are grouped into a single list (rhy-list-0), where the “center-order” and “rnd-order” functions perform a reorganization (centripetal and random) of the individual cells (rhy-list-1, rhy-list-2, and rhy-list-3). Finally, the “make-omn” function transforms the duration matrices into melodic lines, assigning to each matrix the pitch succession established in the Harmony section.

 

(4) Velocity

A list of experimental values has been defined based on the distances of the eight planets from the sun, with reference Earth = 100. The application of the FFT (Fast Fourier Transform), calculated on eight harmonics, generates a varied curvilinear trend that characterises the dynamic variations in the piece. The “omn-replace” function assigns these dynamic variations to each OMN form.

 

(5) OMN Form

The “dictum” function allows the assignment of “trill” articulation to particularly long durations and “stacc” (staccato) articulation to other particularly short durations. The “tie-bars” function allows for ties between one bar and the next, while the “ambitus” function limits the pitch range to a defined extension. The “chord-interval-add” function randomly selects and forms a bi-chord by adding an interval from the allowed set (transp), subject to conditions governed by another “dictum” function. The “chord-interval-remove” function finally removes any unwanted bi-chords (in our case, unison bi-chords where the interval = 0).

 

(6) Def Score

In this section, using the “def-score” macro-instruction, the previously processed data is translated into a score, which can be displayed in musical notation and exported in both MusicXML and/or MIDI formats.

Now the score:
 

(progn
  (init-seed 250824)

  ;; CENTER-ORDER inverts the order of a list and appends it the cdr of the original 
  ;; es. (center-order '(1 2 3 4 5)) => (5 4 3 2 1 2 3 4 5)

  (defun center-order (lista)
    (let ((c-list (list (first lista))))
      (dolist (next lista c-list)
	(setq c-list (append (cons (first (cdr lista)) c-list) 
                             (list (first (cdr lista)))))
 	(setq lista (cdr lista)))
      (cdr (butlast c-list))))

  ;; GENERAL PARAMETERS
  (setf numvoices 3)
  (setf n-loop-1 2)
  (setf n-loop-2 2)
  (setf random-rest-1 0.6)
  (setf random-rest-2 0.2)
  (setf trasp '(5 7 12))
  (setf measure '(2 4))
  (setf metro '(2 4))
  (setf speed 76)

  (setf bic-cello-p t)

  ;;  HARMONY
  (setf row '(bb4 a4 c5 b4 ds5 e5 cs5 d5 gb4 f4 ab4 g4)) ; row of Webern's op. 28
  (setf harmo (ambitus-octaves 'c4 2 row))

  (setf harmoline (list harmo
                        (pitch-variant harmo :variant 'i)
                        (pitch-variant harmo :variant 'r)
                        (pitch-variant harmo :variant 'ri)
                        (pitch-variant harmo :variant 'ad)
                        (pitch-variant harmo :variant 'ro)))

  ;; RHYTHM
  (setf rhy-A (gen-loop n-loop-1 (gen-tuplet 1 1 '? 'o 'w '(2 4 8))))
  (setf rhy-B (gen-loop n-loop-2 (gen-tuplet 1 1 '? 'o 'w '(3 4 8))))

  (setf rhy-1 (unify-rhythms rhy-A rhy-B))
  (setf rhy-2 (rnd-rest random-rest-1 rhy-1))
  (setf rhy-3 (rnd-rest random-rest-2 rhy-1))

  (setf rhy-4 (length-divide '(4 4) rhy-1))
  (setf rhy-5 (length-divide '(5 4) rhy-2))
  (setf rhy-6 (length-divide '(6 4) rhy-3))

  (setf pat-1 (omn :length (omn-to-measure rhy-1 measure)))
  (setf pat-2 (omn :length (omn-to-measure rhy-2 measure)))
  (setf pat-3 (omn :length (omn-to-measure rhy-3 measure)))
  (setf pat-4 (omn :length (omn-to-measure rhy-4 measure)))
  (setf pat-5 (omn :length (omn-to-measure rhy-5 measure)))
  (setf pat-6 (omn :length (omn-to-measure rhy-6 measure)))

  (setf pat-7 (gen-repeat 2 (length-diminution 2 pat-1)))
  (setf pat-8 (gen-repeat 2 (length-diminution 2 pat-2)))
  (setf pat-9 (gen-repeat 2 (length-diminution 2 pat-3)))

  (setf rhy-list-0 (append pat-1 pat-2 pat-3 
                           pat-4 pat-5 pat-6
                           pat-7 pat-8 pat-9))

  (setf rhy-list-1 (center-order rhy-list-0))
  (setf rhy-list-2 (center-order (reverse rhy-list-0)))
  (setf rhy-list-3 (rnd-order rhy-list-1))

  (setf patt-1 (make-omn :length rhy-list-1 :pitch (flatten harmoline)))
  (setf patt-2 (make-omn :length rhy-list-2 :pitch (flatten harmoline)))
  (setf patt-3 (make-omn :length rhy-list-3 :pitch (flatten harmoline)))

  ;; VELOCITY 
  (setf distance '(39 74 100 152 5520 954 1920 3006)) ; planets distance from sun

  (setf dyne (mclist
              (filter-first
               (length patt-1) 
               (vector-to-velocity
                'pp 'f 
                (scale-ramp (length patt-1)(ffth 8 0.02 distance))))))

  (setf vx-1 (omn-replace :velocity dyne patt-1))
  (setf vx-2 (omn-replace :velocity dyne patt-2))
  (setf vx-3 (omn-replace :velocity dyne patt-3))

  ;; OMN FORM
  ;; OMN form 1 - flute
  (setf dic-1 (dictum '((:within (h w) :do tr1) (:within (u s) :do stacc)) vx-1))
  (setf tie-vx-1 (tie-bars (ambitus '(c4 g7) (pitch-transpose 12 dic-1))))

  ;; OMN form 2 - clarinett
  (setf dic-2 (dictum '((:within (h w) :do tr1) (:within (u s) :do stacc)) vx-2))
  (setf tie-vx-2 (tie-bars (ambitus '(c4 a6) dic-2))) 

  ;; OMN form 3 - violoncello
  (setf dic-3
        (dictum '(:within (u s) :do stacc)
                (if bic-cello-p
                    (dictum '(:within (q w)
                              :do (chord-interval-add (list (rnd-pick trasp)) x)) vx-3)
                  vx-3)))

  (setf tie-vx-3 (tie-bars (ambitus '(d2 g4) (pitch-transpose -12 dic-3))))
  (setf zero-rem-3 (chord-interval-remove 0 tie-vx-3))

  (setf vox-1 (quantize tie-vx-1 '(1 2 3 4 8)))
  (setf vox-2 (quantize tie-vx-2 '(1 2 3 4 8)))
  (setf vox-3 (quantize zero-rem-3 '(1 2 3 4 8)))

  ;; DEF SCORE
  (def-score OP-28-VAR
      (:key-signature 'atonal
       :time-signature metro
       :tempo speed
       :flexible-clef t
       :layout (square-group
                (flute-layout 'fl)
                (clarinet-layout 'cl)
                (violoncello-layout 'vc)
                ))

    (fl  :omn vox-1  :channel 1 :sound 'gm :program 'flute)
    (cl  :omn vox-2  :channel 2 :sound 'gm :program 'clarinet)
    (vc  :omn vox-3  :channel 3 :sound 'gm :program 'cello))

  (init-seed nil)
  (audition-musicxml-last-score)
  )

 

Best wishes,

Yours,

Marco

Link to comment
Share on other sites

Really nice to share this.  I will look forward to digging into the details! 

 

At first glance, this seems like a very clear outworking of the serial method.  One of the clearest I have seen so far in the OM community focusing on tone row composition.

 

I especially appreciate the details you are sharing about your compositional method here.  This is the kind of thing that enriches the community so much.  To learn what is behind the various decisions you are making with code is enlightening.

 

It does occur to me, that as in the practice of electroacoustic music composition, using CAC software (computer-aided composition) can often be a "layered process."  In electroacoustic composition one sound process often yields a starting point for the next one, and so on, in the elaboration of materials - and the shaping of the elemental sound objects of the composition.  Spatialization and mix; yet more layers added upon.

In composing for acoustic instruments with OM I  am often reminded of Ferneyhough and his suggestion that he is a "layers man" - sometimes working from the foundational rhythmic lattice as a starting point and adding detail (pitch, dynamics, articulations) successively as he proceeds.  Over time in my own working with OM, it has often happened that one succinct score is insufficient to "define" the totality of the musical structure I am working on.  Therefore, the use of OM as general method comes to hand - sharing outputs between programs, using the tools of deconstruction/reconstruction that OMN offers, and so on.  This is a rich context.

Edited by RST
Link to comment
Share on other sites

What another great post in this section, thanks to Marco. I look forward to exploring this further, but this looks like a good example of modularity in code.

 

I agree with Robert that working with OM does tend to blur the distinction between CAC and 'classic' electro-acoustic or MUSIC-N ways of working, in that there are significant advantages to following an iterative and modular approach to building a composition. Trevor Wishart discusses the typical studio approach in 'On Sonic Art' in some depth, where it is a combination of planned and spontaneous processes in real-time that distinguishes an electro-acoustic compositional practice from a more 'traditional' compositional practice. CAC can definitely be similar, but with the possibility to set up OM in such a way to produce immediate audition and capture live audio output, it closely approximates what Wishart describes but in a very focused way 'in the box' of the PC. The key difference appears to be how much attention one wants to pay to sonic design and/or abstract design and this is what differentiates OM from Composers Desktop Project.  Whereas Wishart wants to link compositional structure entirely to sonic design, I think OM offers a route to bridge the two very flexibly. With DAW and OM, one can live in 'both worlds', so to speak, and/or produce pure scores for acoustic instrumental performance.

 

Working iteratively in this context to me means not being too concerned with end-to-end OM, but being prepared to integrate OM into a studio-like approach, using a range of tools and techniques. Lots of work, but potentially very productive.

Link to comment
Share on other sites

I'm glad that you appreciated the modular description of the Opusmodus code with which I illustrate my code-texts, so I will continue in this way in the future. For now, I thank you for your kind words and I hope to continue a fruitful dialogue with you. To this end, I offer you a variation of OP 28 VAR that uses the "centercross" function instead of the "center-order" function and the "rhythm-series" function instead of the "gen-tuplet" function. I look forward to your feedback.
Marco

 

(progn
(init-seed 300824)

;; CENTERCROSS

;; cross the order of a list spreading its elements around the center 
;; es. (centercross '(1 2 3 4 5) direction) => (5 3 1 2 4) or (4 2 1 3 5)
;; direction = 0 -> even clockwise - direction = 1 -> odd clockwise

(defun centercross (list direction)
  (let* ((total (length list))
         (values (gen-integer (1- total)))
         (map (case direction
                (0 (append (reverse (find-even values)) (find-odd values)))
               (1 (append (reverse (find-odd values)) (find-even values))))))
    (loop for i in map collect (nth i list))))


;; GENERAL PARAMETERS

(setf numvoices 3)
(setf elements-h 6)
(setf elements-l 3)
(setf random-rest-1 0.6)
(setf random-rest-2 0.2)
(setf trasp '(5 7 12))
(setf measure '(2 4))
(setf metro '(2 4))
(setf speed 76)

(setf bic-cello-p t)

;;  HARMONY

(setf row '(bb4 a4 c5 b4 ds5 e5 cs5 d5 gb4 f4 ab4 g4)) ; row of Webern's op. 28

(setf harmo (ambitus-octaves 'c4 2 row))

(setf harmoline (list harmo (pitch-variant harmo :variant 'i)
                            (pitch-variant harmo :variant 'r)
                            (pitch-variant harmo :variant 'ri)
                            (pitch-variant harmo :variant 'ad)
                            (pitch-variant harmo :variant 'ro)))

;; RHYTHM

(setf rhy-A (rhythm-series 2 elements-h measure)) 
(setf rhy-B (rhythm-series 2 elements-l measure)) 

(setf rhy-1 (unify-rhythms rhy-A rhy-B))
(setf rhy-2 (rnd-rest random-rest-1 rhy-1))
(setf rhy-3 (rnd-rest random-rest-2 rhy-1))

(setf rhy-4 (length-divide '(4 4) rhy-1))
(setf rhy-5 (length-divide '(5 4) rhy-2))
(setf rhy-6 (length-divide '(6 4) rhy-3))

(setf pat-1 (omn :length (omn-to-measure rhy-1 measure)))
(setf pat-2 (omn :length (omn-to-measure rhy-2 measure)))
(setf pat-3 (omn :length (omn-to-measure rhy-3 measure)))
(setf pat-4 (omn :length (omn-to-measure rhy-4 measure)))
(setf pat-5 (omn :length (omn-to-measure rhy-5 measure)))
(setf pat-6 (omn :length (omn-to-measure rhy-6 measure)))

(setf pat-7 (gen-repeat 2 (length-diminution 2 pat-1)))
(setf pat-8 (gen-repeat 2 (length-diminution 2 pat-2)))
(setf pat-9 (gen-repeat 2 (length-diminution 2 pat-3)))

(setf rhy-list-0 (append pat-1 pat-2 pat-3 
                         pat-4 pat-5 pat-6
                         pat-7 pat-8 pat-9))

(setf rhy-list-1 (centercross rhy-list-0 0))
(setf rhy-list-2 (centercross rhy-list-0 1))
(setf rhy-list-3 (rnd-order rhy-list-1))

(setf patt-1 (make-omn :length rhy-list-1 :pitch (flatten harmoline)))
(setf patt-2 (make-omn :length rhy-list-2 :pitch (flatten harmoline)))
(setf patt-3 (make-omn :length rhy-list-3 :pitch (flatten harmoline)))

;; VELOCITY 

(setf distance '(39 74 100 152 5520 954 1920 3006)) ; planets distance from sun

(setf dyne (mclist
           (filter-first
            (length patt-1) 
            (vector-to-velocity
             'pp 'f 
             (scale-ramp (length patt-1)(ffth 8 0.02 distance))))))

(setf vx-1 (omn-replace :velocity dyne patt-1))
(setf vx-2 (omn-replace :velocity dyne patt-2))
(setf vx-3 (omn-replace :velocity dyne patt-3))

;; OMN FORM

;; OMN form 1 - flute

(setf dic-1 (dictum '((:within (h w) :do tr1) (:within (u s) :do stacc)) vx-1))
(setf tie-vx-1 (tie-bars (ambitus '(c4 g7) (pitch-transpose 12 dic-1))))

;; OMN form 2 - clarinett
(setf dic-2 (dictum '((:within (h w) :do tr1) (:within (u s) :do stacc)) vx-2))
(setf tie-vx-2 (tie-bars (ambitus '(c4 a6) dic-2))) 

;; OMN form 3 - violoncello
(setf dic-3
      (dictum '(:within (u s) :do stacc)
              (if bic-cello-p
                  (dictum '(:within (q w) :do 
                          (chord-interval-add (list (rnd-pick trasp)) x)) vx-3)
                vx-3)))
(setf tie-vx-3 (tie-bars (ambitus '(d2 g4) (pitch-transpose -12 dic-3))))

(setf zero-rem-3 (chord-interval-remove 0 tie-vx-3))

(setf vox-1 (quantize tie-vx-1 '(1 2 3 4 8)))
(setf vox-2 (quantize tie-vx-2 '(1 2 3 4 8)))
(setf vox-3 (quantize zero-rem-3 '(1 2 3 4 8)))

;; DEF SCORE

(def-score OP-28-VAR-CROSS

          (:key-signature 'atonal
           :time-signature metro
           :tempo speed
           :flexible-clef t
            :layout (square-group
                     (flute-layout 'fl)
                     (clarinet-layout 'cl)
                     (violoncello-layout 'vc)
                     ))

  (fl  :omn vox-1  :channel 1 :sound 'gm :program 'flute)
  (cl  :omn vox-2  :channel 2 :sound 'gm :program 'clarinet)
  (vc  :omn vox-3  :channel 3 :sound 'gm :program 'cello))

(init-seed nil)
)

 

Link to comment
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.

Guest
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.

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy