Sign in to follow this  
Followers 0
torstenanders

Varying dynamics

2 posts in this topic

It is nice to have velocity transformation functions like velocity-variant and friends, but I would like to go further. How about being able to easily increasing or decreasing the overall volume (basically a dynamics/velocity transposition), or to smoothen dynamics differences in order to create dynamics variations in the composition process? Here are two examples.

 

(velocity-add 0.1 '(mf> > > > > pp))
 => (f> > > > > p)

 

(velocity-smooth 0.7 '((ppp p mf ff p< < <) (fff> > f><p ff mf p ppp)))
  => ((ppp< < < mp< < mp< <) (f< ff> > < ff> > mp))

 

Below is an implementation of these functions. Further functions like this can now easily be implemented with velocity-transform. The principle idea is to transform OMN velocities into a numeric OMN vector (list), and do whatever transformation you want to do on that vector, and finally to transform the result back into OMN velocities. The details are explained in the comment string of the functions below.

 

Note that these definitions depend on my function simplify-dynamics.

 

Best,

Torsten

 

(defun velocity-transform (fun args &key (simplify T))
  "Higher-order function for transforming velocities by processing them as an Openmodus vector in the background.
  
  Args
  fun: a function expecting a vector and possibly more arguments.
  args: the arguments for `fun'. Velocities should be explicitly transformed into numeric values. 
        Example: (get-velocity '(mf> > > > > pp)) 
  simplify (default T): whether or not to simplify cresc. and dim. in the result with simplify-dynamics.

  Example
  (velocity-transform #'vector-add (list (get-velocity '(mf> > > > > pp)) '(0.1)))"
  (let* ((vel-vector (apply fun args))
         (result (velocity-to-dynamic 
                  (vector-to-velocity (apply #'min vel-vector) (apply #'max vel-vector)
                                      vel-vector))))
    (if simplify
      (simplify-dynamics result)
      result)))


(defun velocity-add (offset velocities &key (simplify T))
  "Adds an offset to a list of OMN velocities. Quasi the dynamics equivalent of pitch transposition.

  Args
  offset: an offset added to `velocities', can be numeric (between 0 and 1) or a velocity symbol (e.g., pp), and also a list of either. 
  velocities: list of velocities, can be nested.

  Examples
  (velocity-add 0.1 '(mf> > > > > pp))
  => (f> > > > > p)
  (velocity-add 'pppp '(mf> > > > > pp))
  => (f> > > > > p)
  (velocity-add 0.1 '((mf> > >) (> > pp)))
  => ((f> > >) (> > p))
  (velocity-add '(0.1 0.2 0.3 0.4 0.5 0.6) '(mf> > > > > pp))
  => (f< < < < < ffff)
  "
  (span velocities
        (velocity-transform #'vector-add 
                            (list (get-velocity (flatten velocities))
                                  (if (listp offset)
                                    (mapcar #'get-velocity offset)
                                    (list (get-velocity offset))))
                            :simplify simplify)))


(defun velocity-smooth (alfa velocities &key (simplify T))
  "Smoothes velocity values.

  Args
  alfa: parameter controlling the degree of exponential smoothing (usually  0 < alpha < 1).
  velocities: list of velocities, can be nested.

  Example
  (velocity-smooth 0.7 '((ppp p mf ff p< < <) (fff> > f><p ff mf p ppp)))
  => ((ppp< < < mp< < mp< <) (f< ff> > < ff> > mp))
  (velocity-smooth 0.2 '((ppp p mf ff p< < <) (fff> > f><p ff mf p ppp)))
  => ((ppp< < < < < < <) (< mf mf mf mf mf mf))"
  (span velocities
        (velocity-transform #'vector-smooth 
                            (list alfa
                                  (get-velocity (flatten velocities)))
                            :simplify simplify)))

 

opmo likes this

Share this post


Link to post
Share on other sites

Edit: Here are slight variations of these functions that now support arbitrary OMN input -- more useful for varying the dynamics in full snippets directly :)

 

Note that these definitions depend now also on my function edit-omn.

 

Best,

Torsten

 

(defun velocity-add-aux (offset velocities &key (simplify T))
  (velocity-transform #'vector-add 
                      (list (get-velocity velocities)
                            (if (listp offset)
                              (mapcar #'get-velocity offset)
                              (list (get-velocity offset))))
                      :simplify simplify))

(defun velocity-add (offset velocities &key (simplify T))
  "Adds an offset to a list of OMN velocities. Quasi the dynamics equivalent of pitch transposition.

  Args
  offset: an offset added to `velocities', can be numeric (between 0 and 1) or a velocity symbol (e.g., pp), and also a list of either. 
  velocities: list of velocities, can be nested.
  simplify (default T): whether or not to simplify cresc. and dim. in the result with simplify-dynamics.

  Examples
  (velocity-add 0.1 '(mf> > > > > pp))
  => (f> > > > > p)
  (velocity-add 'pppp '(mf> > > > > pp))
  => (f> > > > > p)
  (velocity-add 0.1 '((mf> > >) (> > pp)))
  => ((f> > >) (> > p))
  (velocity-add '(0.1 0.2 0.3 0.4 0.5 0.6) '(mf> > > > > pp))
  => (f< < < < < ffff)
  ; omn input
  (velocity-add 0.1 '((e c4 p< d4 < e4 mf< f4 < g4 f)))
  "
  (edit-omn :velocity velocities
            #'(lambda (vs) (velocity-add-aux offset vs :simplify simplify))))


(defun velocity-smooth-aux (alfa velocities &key (simplify T))
  (velocity-transform #'vector-smooth 
                      (list alfa (get-velocity velocities))
                      :simplify simplify))

(defun velocity-smooth (alfa velocities &key (simplify T))
  "Smoothes velocity values.
  
  Args
  alfa: parameter controlling the degree of exponential smoothing (usually  0 < alpha < 1).
  velocities: list of velocities, can be nested.
  simplify (default T): whether or not to simplify cresc. and dim. in the result with simplify-dynamics.
  
  Example
  (velocity-smooth 0.7 '((ppp p mf ff p< < <) (fff> > f><p ff mf p ppp)))
  => ((ppp< < < mp< < mp< <) (f< ff> > < ff> > mp))
  (velocity-smooth 0.2 '((ppp p mf ff p< < <) (fff> > f><p ff mf p ppp)))
  => ((ppp< < < < < < <) (< mf mf mf mf mf mf))
  "
  (edit-omn :velocity velocities
            #'(lambda (vs) (velocity-smooth-aux alfa vs :simplify simplify))))

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0