Jump to content


  • Content count

  • Joined

  • Last visited

  • Days Won


Reputation Activity

  1. Thanks
    JulioHerrlein reacted to AM in neg-sieve   
    ...how ti filter all "unused/complementary" pitches inside a sieve (if you like to extend the function... could be interesting if it works also with chords)
    (defun neg-sieve (pitchlist) (let ((pitchlist (pitch-to-midi pitchlist))) (midi-to-pitch (loop for i from (car pitchlist) to (car (last pitchlist)) when (null (member i pitchlist)) collect i)))) (setf sieve '(fs3 g3 as3 b3 c4 cs4 ds4 e4 f4 gs4 a4 d5 eb5 fs5 g5 gs5 bb5 b5 c6 cs6 e6 f6)) (neg-sieve sieve) => (gs3 a3 d4 fs4 g4 bb4 b4 c5 cs5 e5 f5 a5 d6 eb6) (neg-sieve '(c4 d4 e4 fs4 gs4 as4 c5)) => (cs4 eb4 f4 g4 a4 b4)  
  2. Thanks
    JulioHerrlein got a reaction from opmo in Opusmodus 1.2.23374   
    Really Cool and musical function !
  3. Thanks
    JulioHerrlein reacted to opmo in Opusmodus 1.2.23374   
    View File Opusmodus 1.2.23374
    I think many of you will love the new function 
    The function GEN-CHORD-SERIES builds chords using a scale in three types of harmonic steps: fifth (default), fourth and third.
    The scale needs to be in a range between c4 and b4 (0 11) and the root must be an element of the scale.
    Method 1
    (c4 g4 d5 a5 e6 b6 f7) (d4 a4 e5 b5 f6 c7 g7) (e4 b4 f5 c6 g6 d7 a7) (f4 c5 g5 d6 a6 e7 b7) (g4 d5 a5 e6 b6 f7 c8) (a4 e5 b5 f6 c7 g7 d8) (b4 f5 c6 g6 d7 a7 e8)  
    (c4 f4 b4 e5 a5 d6 g6) (d4 g4 c5 f5 b5 e6 a6) (e4 a4 d5 g5 c6 f6 b6) (f4 b4 e5 a5 d6 g6 c7) (g4 c5 f5 b5 e6 a6 d7) (a4 d5 g5 c6 f6 b6 e7) (b4 e5 a5 d6 g6 c7 f7)  
    (c4 e4 g4 b4 d5 f5 a5) (d5 f5 a5 c6 e6 g6 b6) (e4 g4 b4 d5 f5 a5 c6) (f4 a4 c5 e5 g5 b5 d6) (g4 b4 d5 f5 a5 c6 e6) (a4 c5 e5 g5 b5 d6 f6) (b4 d5 f5 a5 c6 e6 g6)  
    Method 2 (intervals)
    Fifth: (7 7 7 7 7 7 -5 -5 -5 -5 -5)
    Fourth: (5 5 5 5 5 5 5 -7 -7 -7 -7)
    Third: (3 3 3 4 3 3 3 4 3 3 3)
    For example if the root is fs4 and the type is 5 (fifth) then the map we use is: (f4 c5 g5 d6 a6 e7 b7). In method 1 it doesn’t matter whether the notes are natural, sharp, or flat.
    Let’s examine the three types:
    (setf hexachord '(d4 eb4 fs4 g4 a4 bb4))
    (gen-chord-series hexachord 'fs4) => (fs4g4d5a5eb6bb5)
    (gen-chord-series hexachord 'fs4 :type 3) => (fs4a4eb5g5bb5d6)
    (gen-chord-series hexachord 'fs4 :type 4) => (fs4bb4eb5a5d6g5)
    Building chords using a hexachord scale:
    (gen-chord-series hexachord 'fs4 :type 3 :segment t) => (fs4eb5bb5 a4g5d6)
    With the segment option set to T we divide the chord into two segments by selecting every other second note:
    (gen-chord-series hexachord '(fs4 fs4)                   :type 3                   :width '(30 24)                   :segment t) => (fs4eb5bb5 a4g5d6 fs4eb5bb5 a4g5d5)
    Below the type is selected at random:
    (gen-chord-series hexachord '(fs4 a4 d4)                   :type '? :segment '? :seed 56) => (fs4bb4eb5a5d6g5 a4d5g5fs6bb5eb6 d4a4g5 fs4eb5bb5)
    In the next few examples we use a list of width values (ambitus) - each value assigned to each chord:
    (gen-chord-series hexachord hexachord                   :type 3 :width '(30 24 36 12)) => (d4fs4a4eb5g5bb5 eb4g4bb4d5fs5a5 fs4a4eb5g5bb5d6     g4bb4d4fs4a4eb4 a4eb5g5bb5d6fs6 bb4d5fs5a5eb5g5)
    Please note, if the root list length is bigger than the width list length then the width list values will be looped:
    (gen-chord-series hexachord hexachord                   :type 4 :width '(30 24 36 12)) => (d4g4fs5bb5eb6a5 eb4a4d5g5fs5bb5 fs4bb4eb5a5d6g6     g4fs4bb4eb4a4d4 a4d5g5fs6bb5eb6 bb4eb5a5d5g5fs5)
    (gen-chord-series hexachord hexachord                   :width '(30 24 36 12)) => (d4a4eb5bb5fs6g5 eb4bb4fs5g5d5a5 fs4g4d5a5eb6bb6    g4d4a4eb4bb4fs4 a4eb5bb5fs6g5d6 bb4fs5g5d5a5eb5)
    (gen-chord-series hexachord hexachord                   :type '?                   :width '(30 24 36 12)                   :segment t                   :seed 23) => (d4a4g5 fs4eb5bb5 eb4fs5d5 bb4g5a5 fs4eb5d6 bb4a5g6     g4d4a4 bb4fs4eb4 a4g5d6 eb5bb5fs6 bb4a5g5 eb5d5fs5)
    Building chords using C Major scale:
    (setf c-major '(c4 d4 e4 f4 g4 a4 b4))
    (gen-chord-series c-major c-major :width 36) => (c4g4d5a5e6b6f6 d4a4e5b5f6c7g6 e4b4f5c6g6d6a6     f4c5g5d6a6e6b6 g4d5a5e6b6f6c7 a4e5b5f6c7g6d6 b4f5c6g6d6a6e6)
    (gen-chord-series c-major c-major :type 3 :width 36) => (c4e4g4b4d5f5a5 d4f4a4c5e5g5b5 e4g4b4d5f5a5c6     f4a4c5e5g5b5d6 g4b4d5f5a5c6e6 a4c5e5g5b5d6f6 b4d5f5a5c6e6g6)
    (gen-chord-series c-major c-major :type 4 :width 36) => (c4f4b4e5a5d6g6 d4g4c5f5b5e6a6 e4a4d5g5c6f6b6     f4b4e5a5d6g6c7 g4c5f5b5e6a6d6 a4d5g5c6f6b6e6 b4e5a5d6g6c7f6)
    Here we use transposition values for each chord or segments:
    (gen-chord-series c-major '(b4 f4 d4 c4 e4 g4 a4)                   :type '?                   :width 36                   :segment t                   :seed 45                   :transpose '(0 6 -1 13)) => (b4a5g6f6 e5d6c7 b4cs6eb6f6 fs5gs6bb6 cs4gs4eb5bb5 e4b4fs5     cs5gs5eb6bb6 f5c6fs6 e4f5g6a6 b4c6d6 cs5eb6f6fs6 gs5bb6b6     gs4eb5bb5e6 b4fs5cs6)
    (gen-chord-series c-major (rnd-order c-major :seed 543)                   :type '?                   :width '(12 12 18 24 30 36 36)                   :segment t                   :seed 5462) => (a4e4b4f4 c5g4d4 d4c5b4a4 g4f4e4 e4b4f5c5 g4d5a4 b4c6d5e5     f5g5a5 c4b4a5g5 f4e5d6 g4a5b6c7 d5e6f6 f4e5d6c7 b4a5g6)
    (gen-chord-series c-major '(f4 b4 d4) :width 12 :type 3 :chord nil) => ((f4 a4 c5 e4 g4 b4 d4) (b4 d4 f4 a4 c5 e4 g4) (d4 f4 a4 c5 e4 g4 b4))
    (gen-chord-series c-major '(f4 b4 d4) :width 12 :type 4 :chord nil) => ((f4 b4 e4 a4 d4 g4 c5) (b4 e4 a4 d4 g4 c5 f4) (d4 g4 c5 f4 b4 e4 a4))
    (gen-chord-series c-major '(f4 b4 d4) :width '(36 24 28) :chord nil) => ((f4 c5 g5 d6 a6 e6 b6) (b4 f5 c6 g5 d5 a5 e5) (d4 a4 e5 b5 f5 c6 g5))
    Some more examples with method 1 and method 2:
    (setf a-scale '(c4 eb4 e4 g4 gs4 b4))
    First with method 1 (default):
    (gen-chord-series a-scale a-scale                   :type '(4 4 5 5 4 3) :width 36 :segment t) => (c4eb5g5 b4e5gs5 eb4g4c5 e4gs4b5 e4g4c5 eb4gs4b5     g4c5eb6 gs4b5e6 gs4c5eb6 g4b5e6 b4e5gs5 eb5g5c6)
    Now with method 2:
    (gen-chord-series a-scale a-scale                   :type '(4 4 5 5 4 3)                   :method 2                   :width 36                   :segment t) => (c4eb5e6 g4gs5b6 eb4b4e5 gs4c5g5 e4g5c6 b4gs5eb6     g4e5eb6 c5b5gs6 gs4b5c7 eb5e6g6 b4c6e6 gs5eb6g6)  

    (setf chrom '(c4 cs4 d4 ds4 e4 f4 fs4 g4 gs4 a4 bb4 b4)) (gen-chord-series chrom chrom :method 1 :width 36)
    (gen-chord-series chrom chrom :method 2 :width 36)
    (gen-chord-series chrom chrom :method 1 :width 36 :segment t)
    (gen-chord-series chrom chrom :method 2 :width 36 :segment t)
    As we can see there are endless possibilities. Just copy a few of the expressions to your Composer (Editor) and start exploring.
    Best wishes,
    Submitter opmo Submitted 05/13/2018 Category Opusmodus Latest Release  
  4. Thanks
    JulioHerrlein reacted to opmo in mapping integer?   
    There is an internal function which expand any scale (a sequence) to a total octaves span with ambitus from -60 to 67.
    I will make a document for it.
  5. Thanks
    JulioHerrlein reacted to AM in mapping integer?   
    i coded a function now, that maps all integers to all TONALITIES, like i want it... 
    SORTING OLIVIER's MODI and going crazy 🙂
    ;;; SUB (defun multiple-expand-tonality (&key startpitch octaves tonality) (remove-duplicates ;remove is for "cutting" if there are too much pitches (OMN loops last octave!) (loop repeat octaves with pitch = startpitch with cnt = 0 when (= cnt (length tonality)) do (setq cnt 0) append (expand-tonality (list pitch (nth cnt tonality))) do (incf cnt) do (setq pitch (car (pitch-transpose 12 (list pitch))))))) ;;; MAIN (defun integer-to-tonality (seq tonality &key (startpitch 'c4)) (progn (if (not (pitchp (car tonality))) (setf tonality (multiple-expand-tonality :startpitch startpitch :octaves 8 :tonality tonality)) tonality) (loop for i in seq collect (nth i tonality)))) ;;;;;;;;;;;;; (setf seq (flatten (gen-sort (rnd-order (gen-integer 24) :seed 49) :type 'selection))) (def-score example-score (:key-signature 'atonal :time-signature '(4 4) :tempo 90 :layout (piano-solo-layout 'rhand 'lhand)) (rhand :omn (make-omn :pitch (integer-to-tonality seq '(messiaen-mode4 messiaen-mode5 messiaen-mode6) :startpitch 'c4) :length (gen-repeat (length seq) 't))) (lhand :omn (make-omn :pitch (integer-to-tonality (x+b seq 3) ; transp integer-seq '(messiaen-mode3 messiaen-mode1 messiaen-mode2) :startpitch 'c2) :length (gen-repeat (length seq) 't))))  
  6. Thanks
    JulioHerrlein reacted to Stephane Boussuge in mapping integer?   
    With vector-map function, you can map anything:
    (vector-map (expand-tonality '(c4 messiaen-mode5)) '(0 1 2 3 4 2 1 5 3 1)) SB.
  7. Thanks
    JulioHerrlein reacted to AM in mapping integer?   
    in LISP
    (loop for i in '(0 1 2 3 4 2 1 5 3 1) collect (nth i (expand-tonality '(c4 messiaen-mode5))))  
  8. Like
    JulioHerrlein reacted to Stephane Boussuge in Classical accomp. Example   
    Here's the rendering of the score "Classical Accomp Example" i've made for the last version of Opusmodus.

  9. Like
    JulioHerrlein got a reaction from Jorvd in Chord Inversions & Arpeggios   
    For example:
    This syntax
    (expand-chord '(c4 69))
    will give you a C(6,9) chord. Evaluate the expression via CMD+1 to get the snippet in notation.
    added 5 minutes later Maybe Janusz can help me here:
    When I evaluate this:
    (chord-inversion 1 (expand-chord '(c4 69)))
    I get this
    However, when I try to get the snippet, via CMD+1, I get an error:
    > Error: The value e4g4a4d5c6 is not of the expected type list.
    > While executing: parse-chord-form-from-stream, in process Listener-1(6).
    > Type cmd-. to abort, cmd-\ for a list of available restarts.
    > Type :? for other options.
  10. Like
    JulioHerrlein reacted to Stephane Boussuge in Chord Inversions & Arpeggios   
    (list (chord-inversion 1 (expand-chord '(c4 69)))) S.
  11. Thanks
    JulioHerrlein reacted to Yuichi Yamamoto in Quantization   
    Hi people,

    Though I've been using Opusmodus for about 2 years now, and in great love with it,
    I haven't really had a chance to share my work on the community.

    But here I have my piano piece vastly written with Opusmodus, and guess what, it's got a cool video, too!

    Yamaha corporation kindly offered me to use their automated piano for filming, and I think an algorithmic music like this goes very well with it!

  12. Thanks
    JulioHerrlein reacted to opmo in Quantization   
    Thank you Yuichi for sharing, great piece, I am very happy to see Opusmodus is able to help you realise your ideas.
  13. Thanks
    JulioHerrlein reacted to opmo in Playback of articulations   
    Will see what I can do.
  14. Like
    JulioHerrlein reacted to Stephane Boussuge in Playback of articulations   
    i agree totally :-)
    Actually, i always finish my scores in a DAW for such reason but with this new possibilities into Opusmodus, it would be no more necessary and i love the idea to stay in Opusmodus from start to end of the music process.
  15. Like
    JulioHerrlein reacted to torstenanders in Changing MIDI channels with articulations   
    It would also be useful, e.g., for combining sample instruments by different brands etc. where certain articulations are available in one plugin, and others in another.
  16. Thanks
    JulioHerrlein reacted to torstenanders in Changing MIDI channels with articulations   
    How is it possible to change the MIDI output channel of an instrument? For example, when writing for organ, you have two staffs for the right and left hand, but hands can change manuals, and this is best represented by different MIDI channels. Is there a way to define articulations that result in changing the MIDI channel?
  17. Thanks
    JulioHerrlein reacted to Stephane Boussuge in Changing MIDI channels with articulations   
    i would love a possibility to change midi channel from articulation :-)
  18. Thanks
    JulioHerrlein reacted to opmo in Changing MIDI channels with articulations   
    We will add this, I love it too :-)
  19. Thanks
    JulioHerrlein reacted to Stephane Boussuge in Nuit d'hiver For Woodwinds   
    Small piece for Woodwinds.

  20. Like
  21. Thanks
    JulioHerrlein reacted to torstenanders in Modulo 12 Function ?   
    You can roll such a function easily yourself. The modulus function is part of Common Lisp.
    ;; modulus 12 of 60
    (mod 60 12)
    ; => 0
    (defun mod12 (xs)
      (loop for x in xs
        collect (mod x 12)))
    (mod12 '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 24 48))
    ; => (0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 0 0)
    To empower yourself, once you know how to program a simple function, you simply need to google for the modulus function
      http://lmgtfy.com/?q=common lisp modulo
  22. Thanks
    JulioHerrlein reacted to torstenanders in Modelling Tonality (1) Diatonic Transposition (some intuitions)   
    You already know how to translate a MIDI pitch number into a representation consisting of two pieces of information, a pitch class integer and an octave integer. The conversion can be applied in both directions.
    Now, you can apply a similar conversion to a pitch class integers, converting them into a scale degree (integer) and an accidental (another integer), depending on a scale (a set of pitch classes). Again, this conversion can be done in both ways (there are multiple solutions if you allow for enharmonic equivalence).
    Once you have such a representation, you can then do diatonic transpositions (depending on whatever scale) within the scale degree domain, and finally translate your  results back into pitch classes, or MIDI pitch numbers.
    I have a draft of a paper discussing this formally. A preliminary version of this paper has been published at SMC, http://uobrep.openrepository.com/uobrep/handle/10547/622264 Don't get scared away by the constraint programming aspect. Such conversions can also be implemented as plain deterministic functions.
    This can be seen as a kind of mapping, if you want, if you also see the relation between MIDI pitch numbers and pitch classes as a mapping :)
  23. Like
    JulioHerrlein reacted to opmo in Saving Plots and Piano Rolls to PDF Vectorial Graphics ETC   
    The multi screen support will be part of ver. 2.0
  24. Thanks
    JulioHerrlein reacted to Stephane Boussuge in Modelling Tonality (1) Diatonic Transposition (some intuitions)   
    also if you want to control the voice leading, i use harmonic-path function who allow me to keep exactly the voice leading defined in my chord progression.
  25. Like
    JulioHerrlein reacted to Stephane Boussuge in Modelling Tonality (1) Diatonic Transposition (some intuitions)   
    Here's my way for diatonic transposition.
    It is very simple but do exactly what i want when composing
    I use this system extensively in all my compositions now, not always in diatonic context but also with synthetic modes, row, algorithmic pitch material etc...
    I love the concept of degree and transpositions inside a scale and use that technique very often.
    (setf motiv '((q c4 e4 g4)(q c4 e4 g4)(q c4 e4 g4)(q c4 e4 g4)(q c4 e4 g4))) (setf degree '(1 4 2 5 1)) (setf harmonic-path (harmonic-progression degree '(c4 major) :step 1 :size 7 :base 1 )) (setf p1 (tonality-map (mclist harmonic-path) motiv))