Jump to content

Leaderboard


Popular Content

Showing most liked content since 11/18/2017 in all areas

  1. 5 points
    opmo

    Midi In Collect

    Ver 2. will be able to import musicXML files and convert to omn.
  2. 4 points
    WOW !!! GREAT ! Thanks ! It was really a lot of work done ! Lots of sets, but it's really useful, I think. Best ! Julio This will be in the next release, I think. Looking Forward ! added 2 minutes later If you like Set Theory and Guitar, you gonna like my book. Please, Check it out ! https://www.melbay.com/Products/Default.aspx?bookid=30042BCDEB Best, Julio
  3. 4 points
    opmo

    Opusmodus 1.2.22733

    Extended documentation and bug fix in do-timeline and do-timline2 functions if binary list.
  4. 4 points
    Hello, Following the 2017 Pianoteq contest, I was surprised to be ranked 4th in the contest and get a special prize with this little piece written with Opusmodus. Didier http://www.forum-pianoteq.com/viewtopic.php?id=5373
  5. 3 points
    The PCS-ANALYSIS function returns two more results: inverted-form and interval-class: (pcs-analysis '(4 1 8 10 3 7)) => Sequence: (4 1 8 10 3 7) Set: 6-z29 Prime Form: (0 2 3 6 7 9) Inverted Form: nil Pitch: (c4 d4 eb4 fs4 g4 a4) Normal Order: (1 3 4 7 8 10) Complement: (0 2 5 6 9 11) Inversion: (8 11 4 2 9 5) Vector: (2 2 4 2 3 2) Interval Class: (3 5 2 5 4) (pcs-analysis '(0 3 7)) => Sequence: (0 3 7) Set: 3-11 Prime Form: (0 3 7) Inverted Form: (0 4 7) Pitch: (c4 eb4 g4) Normal Order: (0 3 7) Complement: (1 2 4 5 6 8 9 10 11) Inversion: (0 9 5) Vector: (0 0 1 1 1 0) Interval Class: (3 4) (pcs-analysis '(0 4 7)) => Sequence: (0 4 7) Set: 3-11b Prime Form: (0 3 7) Inverted Form: (0 4 7) Pitch: (c4 e4 g4) Normal Order: (0 4 7) Complement: (1 2 3 5 6 8 9 10 11) Inversion: (0 8 5) Vector: (0 0 1 1 1 0) Interval Class: (4 3) The new function PCS-FORMS takes care of both forms: prime-form and inverted-form. The inverted form set ends with letter b: (pcs-forms '((0 4 7) (0 3 7)) :type :set) => (3-11b 3-11)
  6. 3 points
    opmo

    tutorial guide

    Next - which will take some time - I will add all Opusmodus System Function with examples to our forum.
  7. 3 points
    I will add the inverted form into to the system with the next update.
  8. 3 points
    Ah, great! The documentation does not mention that the input can also be MIDI velocity integers, so I missed that. Best, Torsten added 2 minutes later BTW: I needed that to translate values from OpenMusic data objects into Opusmodus. I am currently working on a library that will bring OpenMusic functions/methods to Opusmodus... Best, Torsten
  9. 2 points
    AM

    Length-Legato opposite function

    it was necessary to re-organize "OMN with ties" by "omn-merge-ties" first... and find a solution if staccato-length = length ... added 2 minutes later you're welcome... it's a bit like "BRAINFOOD" solving such things... but TORSTEN is the "code-master" for the complicated things!! :-) so, i have to compose now, the real hard work
  10. 2 points
    Did you see my workaround in the post mentioned by André (to lock the smpte of the track and then change the overall tempo in Logic)? Now I'am working with Reaper (https://www.reaper.fm/ ) which is worth to checkout, very cheap and unbelievable powerful (a bit of a learning curve I admit), no problem to change the tempo of every midi file seperatly.. best ole
  11. 2 points
    o_e

    Length-Legato opposite function

    Hi, Just a minor improvement, the function is now also working with sublists :-) best ole (defun length-staccato-lists (n alist) (let ((newlengths (loop for i in (omn :length (flatten alist)) when (> i 0) append (list n (* -1 (abs (- i n)))) else collect i))) (if (omn-formp alist) (omn-to-time-signature (make-omn :length newlengths :pitch (omn :pitch alist) :velocity (omn :velocity alist) :articulation (omn :articulation alist)) (get-time-signature alist)) newlengths))) (length-staccato-lists 1/16 '((q e4 mp q tasto q -q q q)(q e4 mp q tasto q -q q q))) -->((s e4 mp -e. s e4 tasto -e. s e4 -e. -q s e4 -e. s e4 -e.) (s e4 -e. s e4 tasto -e. s e4 -e. -q s e4 -e. s e4 -e.))
  12. 2 points
    of course: (pcs '3-11b) => (0 4 7) INTERVAL-CLASS: (interval-class '(0 1 2 11 10 9 5 4 3 6 7 8)) => (1 1 3 1 1 4 1 1 3 1 1) (interval-class '(0 1 3 8 4 9 10 7 6 5 11 2)) => (1 2 5 4 5 1 3 1 1 6 3) (interval-class '(0 11 5 7 6 1 3 4 2 9 8 10)) => (1 6 2 1 5 2 1 2 5 1 2)
  13. 2 points
    It's a really interesting issue to study the different approaches of the post tonal Theory. The more hardcore atonal side does not consider prime and inverted form as different things, ontologically but in fact, our tonal oriented ear really can tell the difference between a major and a minor triad as a clear episthemological distinction. Counting or not counting the inverted forms also have implications on the Problems of enumeration of the types of series, as Frippertinger & Lackner recent studies related to group theory and a more modern approach to Hauer Tropes demonstrates. Best Julio
  14. 2 points
    JulioHerrlein

    Lenght-Rest Function

    Here is the answer:
  15. 2 points
    Just helping others to read this code: the key data here are the variables after the comment ;; Group orchestration. Each variable grp1, grp2, etc. set for each part in a single bar whether that part should play in the end or not. The order of those groups (bars specifying which voice is playing) is then randomised. Best, Torsten
  16. 2 points
    Quartal example: (harmonic-progression '(1 2 3 4 5 6 7) '(d4 natural-minor) :size 4 :step 3 :base 1 ) Another example more complex: (setf row (rnd-row :type :pitch :transpose 2)) (setf chords1 (harmonic-progression (rnd-number 24 -6 6) row :size (rnd-sample 24 '(3 4 5 6)) :step (rnd-sample 24 '(1 2 3 (2 3)(1 3))) )) S.
  17. 2 points
    Here is an example of generation of harmonic progression with Opusmodus using chords rules defined with a transition table. The technique presented here uses the concept of tonal degrees, but it is important to note that as you will see later in this article, this concept can be pushed quite far and quite outside the traditional tonal system. First, we define some transition rules from degree to degree: (setf transition '((1 (4 1) (5 1) (6 2)) (2 (5 2) (4 1)) (3 (4 1)) (4 (5 1) (2 1)) (5 (1 3) (6 2) (4 1)) (6 (4 1)) (7 (1 1) (6 1)))) So here is a transition rule saying a 1st degree will be 2 times more likely to be followed by a sixth degree (1 (6 2)) as a 4th or 5th (1 (4 1) (5 1) ). A second degree will be most likely followed by a 5th degree (2 (5 2) than a 4th (2 (4 1)) We define this way all the transition rules for each degree of the scale. We now generate a sequence of degrees we call prog based on these rules with the function GEN-MARKOV-FROM-TRANSITIONS (for more information on Markov chains, you can consult: https://en.wikipedia.org/wiki/Markov_chain ): (setf prog (gen-markov-from-transitions transition :size 24 :start 1)) which can for example give this result: => (1 5 1 4 2 4 2 4 2 5 6 4 5 1 5 6 4 5 1 5 6 4 2 5) Because the function that we'll use to generate chords is based on a numbering starting from zero but our degrees generation is based on a numbering starting from 1, we will subtract 1 to each value of our list prog to able to provide our next function a number list starting from zero. To do this, we use the MAPCAR Lisp function to apply -1 to each value of the list and we store the result in the variable prog.prep. (setf prog.prep (mapcar (lambda(x) (- x 1)) prog)) => (0 4 0 3 1 3 1 3 1 4 5 3 4 0 4 5 3 4 0 4 5 3 1 4) Now we generate chords using the HARMONIC-PROGRESSION function and store the result in the variable named chords: (setf chords (harmonic-progression prog.prep '(d4 major))) The parameters passed to the function are our degrees List prog.prep and a scale with a root base (here d4). Here is the output of this function in notation: Of course, we are not limited to Major and Minor scales, we can use any scale or pitch structure available or generated by Opusmodus, here are some examples: (setf chords (harmonic-progression prog.prep '(d4 messiaen-mode5))) (setf chords (harmonic-progression prog.prep '(c4 acoustic-scale) :root '(d4 f4 g4 e4 bb3))) (setf chords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5) :root '(d4 f4 g4 e4 bb3))) A final example using the keyword :relative enabling a smoother transition between chords with a relative voice leading between chords. (setf chords (harmonic-progression prog.prep '(d4e4fs4gs4as4c5ds5) :root '(d4 f4 g4 e4 bb3) :relative t)) Once these chords generated, you can use them as you want in Opusmodus, map them on musical structures with TONALITY-MAP function or use them as basic materials to create reservoirs of pitch or other kind of pitch material. SB.
  18. 1 point
  19. 1 point
    I opted for a 'physical copy', so will have to wait until Dec. 21st...just in time for a Christmas gift to myself ;-)
  20. 1 point
    Nice work and a good companion to Allan Forte. /Lasse
  21. 1 point
    o_e

    Length-Legato opposite function

    thanks a lot!
  22. 1 point
    AM

    Length-Legato opposite function

    the solution... (defun length-staccato (n alist) (let ((newlengths) (new-omn (omn-merge-ties (flatten alist))) (time-sign (get-time-signature alist))) (progn (setf newlengths (loop for i in (omn :length new-omn) when (> i 0) append (if (= n i) (list i) (list n (* -1 (abs (- i n))))) else collect i)) (if (omn-formp alist) (omn-to-time-signature (make-omn :length newlengths :pitch (omn :pitch new-omn) :velocity (omn :velocity new-omn) :articulation (omn :articulation new-omn)) time-sign) newlengths)))) (length-staccato 1/16 '(q -q q q)) (length-staccato 1/16 '(q e4 mp q tasto q -q q q)) (length-staccato 1/16 '((e. c4 eb4 fs4 a4 tie) (s a4 e. cs4 e4 g4 e bb4 tie) (e bb4 e. d4 f4 gs4 s b4)))
  23. 1 point
    o_e

    Length-Legato opposite function

    You are welcome! Maybe Janusz can chime in and tell us something about how to handle tied notes in functions like this. I really would like to know that!
  24. 1 point
    o_e

    Length-Legato opposite function

    Hi Julio, I've found two problems. The weird one you had I think I could find and solve, but the function also does not handle tied notes properly and I have no idea how to remedy that. That goes waay above my hacking abilities :-) (length-staccato 1/16 '((e. c4 eb4 fs4 a4 tie) (s a4 e. cs4 e4 g4 e bb4 tie) (e bb4 e. d4 f4 gs4 s b4))) -->((s c4 -e s eb4 -e s fs4 -e s a4 -e) (s a4 cs4 -e s e4 -e s g4 -e s bb4 -) (s bb4 - d4 -e s f4 -e s gs4 -e s b4)) Nevertheless the code with the one correction, so it's not perfect but maybe somehow useful for you.. best ole (defun length-staccato (n alist) (let ((newlengths (loop for i in (omn :length (flatten alist)) when (> i n) append (list n (* -1 (abs (- i n)))) else collect i))) (if (omn-formp alist) (omn-to-time-signature (make-omn :length newlengths :pitch (omn :pitch alist) :velocity (omn :velocity alist) :articulation (omn :articulation alist)) (get-time-signature alist)) newlengths)))
  25. 1 point
    AM

    Length-Legato opposite function

    dear julio i don't know if there is a solution in the om-library... coded quickly one for your problem... the basic-rhythms (denominator) should stay constant like in your examples, then it works... first value has to be your "stacc-length", second your omn-list or a length-list, have a look to the example... greetings andré (defun length-staccato (n alist) (let ((newlengths (loop for i in (omn :length alist) when (> i 0) append (list n (* -1 (abs (- i n)))) else collect i))) (if (omn-formp alist) (make-omn :length newlengths :pitch (omn :pitch alist) :velocity (omn :velocity alist) :articulation (omn :articulation alist)) newlengths))) (length-staccato 1/16 '(q e4 mp q tasto q -q q q))
  26. 1 point
    This will save a PNG file in the Opusmodus/Graphs folder: (setf length '(q e = s = = = -q e - = s = = -e.) pitch '(c4 cs5 d4 ds5 e4 f5 fs4 g5 gs4 a5 as4 b5)) (length-pitch-list-plot length pitch :file "length-pitch-plot.png") As for the piano roll you will need to create a screenshot with cmd/shift/4.
  27. 1 point
    Going to, looks good...thanks for the notice ;-)
  28. 1 point
    Congratulation to your book, looks very good. JP
  29. 1 point
    loopyc

    tutorial guide

    SB: https://opusmodus.com/forums/tutorials/tutorial-guide/
  30. 1 point
  31. 1 point
    Very cool, Janusz! Im doing my doctoral dissertation now and I'm doing some thing interesting related to rhythm that certainly could be transformed in a function. I'll tell you soon. This Will be useful there. Best Julio
  32. 1 point
    To do this I would need to rewrite the pitch class set functions. The functions where based on Allen Forte 'The Structure of Atonal Music' book.
  33. 1 point
    (pcs-analysis '(0 3 7)) ? pcs-analysis Sequence: (0 3 7) Set: 3-11 Prime Form: (0 3 7) Pitch: (c4 eb4 g4) Normal Order: (0 3 7) Complement: (1 2 4 5 6 8 9 10 11) Inversion: (0 9 5) Vector: (0 0 1 1 1 0) (pcs-analysis '(0 4 7)) ? pcs-analysis Sequence: (0 4 7) Set: 3-11 Prime Form: (0 3 7) Pitch: (c4 eb4 g4) Normal Order: (0 4 7) Complement: (1 2 3 5 6 8 9 10 11) Inversion: (0 8 5) Vector: (0 0 1 1 1 0) Note: The pitch output form PCS-ANALYSIS is the pitch form prime form.
  34. 1 point
    AM

    Midi In Collect

    to wishlist: xml-import
  35. 1 point
    Contents Annotation Score Notation Annotation SETF is a LISP term that ‘sets’ a word (pitches, in this example) to a given list. This means that every time we use the word pitches, Opusmodus will know that we actually mean the pitch sequence (c4 cs4 fs4 g4 c5). This is known as a variable. It saves us time: instead of writing out all five pitches every time we want to use them, all we have to do is use the variable name pitches. This is very much the same as saying: pitches = (c4 cs4 fs4 g4 c5) This means that pitches can be used to create the variable transposed-pitches by this expression: (setf transposed-pitches (pitch-transpose -12 pitches)) In other words: transposed-pitches = (c3 cs3 fs3 g3 c4) Transposition is a function we constantly use in composing music whether we use computers or not. (pitch-transpose -12 pitches) is a function with a parameter -12 and a variable pitches. In this context, -12 means transpose the variable pitches down an octave. The function SPAN is something else. It’s unique to Opusmodus. We’ve got five pitches, so let’s 'span' a single 1/8 note length across those pitches: lengths = (1/8 1/8 1/8 1/8 1/8) Essentially SPAN will repeat material until it is the same length as the longer of two lists: useful for ensuring your compositional material aligns! For this fragment the metre is 5/8. To get this to show up correctly on the Notation and MIDI displays a time-signature has to be generated. This is how it’s done. Make sure you examine the output of each (use the ⌘E shortcut): (setf timesigs (get-time-signature lengths)) => (5 8) This means 1 bar of 5/8. From here on the score is defined. This is one of two ways to do it. In each part of the piano the musical parameters are each defined separately, drawing on the pitch, length and velocity material previously created. In Lesson 2 we’ll see the other way of doing this – with the Opusmodus Notation (OMN) script. Finally, take a look at the dynamics. By repeating the crescendo < for each note you can get a dynamic hairpin of the correct length. (setf dynamics '(p< < < < ff)) Score (setf pitches '(c4 cs4 fs4 g4 c5)) (setf transposed-pitches (pitch-transpose -12 pitches)) (setf lengths (span pitches '(1/8))) (setf dynamics '(p< < < < ff)) (setf timesigs (get-time-signature lengths)) (def-score lesson-1 (:key-signature 'chromatic :time-signature timesigs :tempo 80 :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :length lengths :pitch pitches :velocity dynamics :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :length lengths :pitch transposed-pitches :velocity dynamics) ) Notation Next page Lesson 2. Introducing OMN Go back to Reference page.
  36. 1 point
    opmo

    Reference

    Learning Opusmodus Lesson 1-30 is a sequence of tutorial guides to composing with Opusmodus. A score-script and its tutorial guide are designed to be studied side-by-side. Here below is a summary of each Lesson of the 30 section of the Guide. Contents Lesson 1. Creating and Processing a List Lesson 2. Introducing OMN Lesson 3. Defining Chords Lesson 4. Rhythm, Repeats and Random Seeds Lesson 5. List Processing Lesson 6. Structure Lesson 7. Retrograde, Transpose and Sections Lesson 8. Changing Metre Lesson 9. The Bass Part Lesson 10. Gesture Lesson 11. Adding an Inner Part Lesson 12. Pitch Variation and Articulation Lesson 13. Working with Binary Rhythmics Lesson 14. Further Working with Binaries Lesson 15. Simplifying Melodic Texture Lesson 16. Ambitus Lesson 17. Working with Integers Lesson 18. A Chorale with Integers Lesson 19. Randomization and Variation Lesson 20. Skipping, Swallowing and Pausing Lesson 21. Mapping, Substituting and Interleaving Lesson 22. Lengths and Rhythms Lesson 23. Intervals and Rows Lesson 24. Tonality 1 Lesson 25. Tonality 2 Lesson 26. Chords to Parts Lesson 27. Merging Parts and Sequencing Score-Scripts Lesson 28. Working with Libraries Lesson 29. Tempo Changes and Percussion Lesson 30. Clusters, Repeats and Ornaments Lesson 1. Creating and Processing a List Pattern #1 from Slonimsky’s Thesaurus is the pitch source of this and almost all the following Lessons. The function SPAN demonstrates how pitch patterns can be spanned to rhythm. Working with PITCH-TRANSPOSE. Lesson 2. Introducing OMN Demonstrates how an OMN list is 'made'. How to use MAKE-OMN to Audition pitch, length and dynamics simultaneously. Lesson 3. Defining Chords How to make chords and use looping inside a metric space. Using GEN-REPEAT. Lesson 4. Rhythm, Repeats and Random Seeds Producing rhythmic variety with LENGTH-WEIGHT. Introducing the control of the random keyword :seed. How the rest-length works where pitches 'skip' rests. Lesson 5. List Processing Writing lists (( ) ( ) ( )) or using the LISP primitive LIST to contain groups of pitches ((c4 cs4 fs4 g4 c5) (c4 cs4 fs4 g4 c5) (c4 cs4 fs4 g4 c5) . . .) rather than (c4 cs4 fs4 g4 c5 c4 cs4 fs4 g4 c5 c4 cs4 fs4 g4 c5) Lesson 6. Structure Creating an A B A structure with ASSEMBLE-SEQ. Introducing DISPLAY-MIDI and COMPILE-SCORE. Saving a Midifile to a personal folder location. Lesson 7. Retrograde, Transpose and Sections How the :section keyword controls processing in sub-lists. Functions GEN-RETROGRADE and PITCH-TRANSPOSE. Lesson 8. Changing Metre How to change metre by creating sub-lists of different lengths to make 2/4 3/8 2/4 3/8 2/4. Using the function MCLIST to place dynamics in specific bars. Lesson 9. The Bass Part Creating a slower and distinct bass part with GET-SPAN and FILTER-FIRST. Lesson 10. Gesture Make melodic gestures with GEN-WHITE-NOISE. Viewing the output in LIST-PLOT. Using VECTOR-MAP and VECTOR-SMOOTH. Lesson 11. Adding an Inner Part Adding an inner part from GEN-WHITE-NOISE. Using functions PITCH-MIX and PITCH-INVERT. Lesson 12. Pitch Variation and Articulation An A B A structure. Using GEN-MARKOV to create the B section. Adding an articulation: stacc. Lesson 13. Working with Binary Rhythmics Creating a binary rhythm with GEN-BINARY-RND. Using BINARY-MAP to make pitch and rhythm patterns. Lesson 14. Further Working with Binaries Using GEN-BINARY-REMOVE to create new rhythms by removing targeted pitches. Lesson 15. Simplifying Melodic Texture How to use GEN-BINARY-CHANGE and GEN-BINARY-ANACRUSIS: to reduce the number of repeated pitches. Working with LENGTH-MERGE to 'add-up' repeated adjacent and similar pitches and lengths. Pitch looping in the left hand. Lesson 16. Ambitus Ambitus functions are used to fit a list of pitches into a defined range or instrument compass. Three different approaches create new material from a simple pitch series: AMBITUS, AMBITUS with flat-invert and AMBITUS with series. Look out for GEN-PAUSE to make a 'silent' section in the piano left-hand. Lesson 17. Working with Integers Much of the composing here uses integer functions before the output is converted into pitch. The function ASSEMBLE-MAP makes mixtures of texture in the right hand. Articulation and dynamics are featured to highlight metre changes. Lesson 18. A Chorale with Integers Creating 4-part chords from rows of integers. Using PITCH-MIX, the global seed function INIT-RND and employing a fermata at the end of each phrase. Lesson 19. Randomization and Variation Creating binary rhythmics with COMBINATION2 and then randomising orders of lists with RND-ORDER. The PITCH-EXPANSION-SERIES function is used to generate variants on the 5-note theme by interval variation. Lesson 20. Skipping, Swallowing and Pausing Two different ways of mapping note-length to pitch within a list. The default 'skip' and the binary template 'swallow' are put together in a single texture, and the function GEN-PAUSE articulates moments of silence in sections. Lesson 21. Mapping, Substituting and Interleaving Deriving chords from rows of pitches. Making a chord progression using SUBSTITUTE-MAP. Creating melodies from chords using PITCH-MELODIZE. Moving melodies and chords between both hands with INTERLEAVE-MAP. Lesson 22. Lengths and Rhythms Creating variables as rhythmic lists from note-lengths and rest-lengths. Using the note-length shorthand function QL. Mapping a pitch range to a pattern of vectors produced by the sine-wave generator GEN-SINE. Lesson 23. Intervals and Rows Using some of the many functions associated with composing with intervals and serial techniques. Producing and auditioning a rhythmic sketch before adding pitches. Pitch material developed from a single pitch-class set. Lesson 24. Tonality 1 Making 'original' tonalities with CREATE-TONALITY. Function tools TONALITY-MAP. HARMONIC-PATH and TONALITY-SERIES are introduced for making and mapping integers lists onto defined tonalities. Lesson 25. Tonality 2 A Slonimsky pattern and the all-interval tetrachord use TONALITY-MAP and TONALILTY-SERIES to form left hand piano chords to the bass line of Giant Steps! Pitches and dynamics from the GEN-SINE function and a play of rhythmic variables build a left hand improvised 'solo'. Lesson 26. Chords to Parts From the Chorale of Lesson 18 a version for piano trio is created. The de-mixing of chords into separate parts with PITCH-DEMIX is introduced and how string instruments with multiple articulations are included within DEF-SOUND-SET. Lesson 27. Merging Parts and Sequencing Score-Scripts A piece in 3 parts for solo guitar demonstrates how polyphony can be notated on a single stave. The function MERGE-VOICES is used and features in the part 2 of the composition. Three separate score-scripts are present in this file and these are sequenced together in the final COMPILE-SONG expression using the keywords :start and :end. Lesson 28. Working with Libraries A piece in Ragtime-style is made using pitch and rhythm material from user-defined Libraries. There are three functions associated with Libraries: CREATE-LIBRARY, DEF-LIBRARY and LIBRARY. There’s an example of how to use the sustaining pedal with the keyword :controllers. Lesson 29. Tempo Changes and Percussion This piece is a version of Lesson 7 enhanced by tempo change and a Latin percussion part. It employs two different approaches to setting the keyword :tempo in DEF-SCORE: one with a simple tempo list containing tempo values configured to each bar/list; the second using delta time to enable smooth accellerando and rallentando across any number of bars. The percussion part shows some of the shorthand OMN notation for note-lengths and rest-lengths. Lesson 30. Clusters, Repeats and Ornaments OM has a multi-keyword function GEN-CLUSTER. The function able to output chords, melodies and mixtures of the two. Here, two distinct sections of ‘cluster material’ are bound to additive rhythms and dynamics and made into OMN lists. A range of repeat signs, ornaments and articulations such as trill, acciaccatura, mordent, arpeggiation, glissando are added manually to these lists to further colour the music. The function GEN-PAUSE is used to split keyboard action between the hands. Next page Lesson 1. Creating and Processing a List
  37. 1 point
    AM

    replace-articulation-of-a-pitch

    i didn't find a OM-library-solution for this kind of thing, so i coded it... if you want to REPLACE the articulation of some specific pitches. perhaps all 'd4 sould be PONTE... you could use this. it was necessary to code it like that, because otherwise you get in trouble with the empty parameter-slots... should work fine greetings andré ;;; SUBFUNCTIONS (defun eliminate-nil (alist) (loop for i in alist when (not (null i)) collect i)) (defun complete-event-slots (omn-list) (let ((omn-art (omn :articulation (single-events (flatten omn-list))))) (single-events (omn-replace :articulation (flatten (eliminate-nil (loop for i in omn-art for cnt = 0 then (incf cnt) when (equal (car i) '-) collect (nth (1- cnt) omn-art) else collect i))) omn-list)))) ;(complete-event-slots '(5q a4 ff pizz 5q e3 -e 5q a4 f)) ;;; MAIN FUNCTION (defun replace-articulation-of-a-pitch (omn-list &key pitches articulation (chance 1.0)) (loop for i in (complete-event-slots (flatten omn-list)) when (and (member (car (omn :pitch i)) pitches) (prob? chance)) append (omn-component-replace i (list articulation)) else append i)) ;;; EXAMPLE (replace-articulation-of-a-pitch '(5q a4 ff pizz 5q e3 p -q 5q d4 pizz) :pitches '(a4 d4) :articulation 'ponte :chance 1.0) -> (5q a4 ff ponte 5q e3 p pizz -q 5q d4 p ponte)
  38. 1 point
    I am a bit overbooked actually and didn't took the time to comment it correctly, but you've made it :-) Thank you Torsten ! In fact the variables grp1, grp2 etc.. are like orchestration presets and can be (for example) stored in a library file to be recalled algorithmically. S.
  39. 1 point
    Hi, An example of group orchestration. I first create some binary représentation of some group of instruments and apply this groups with do-timeline: ;;; Parameters (setf size 12) ;;; Length generation (setf len1 (euclidean-rhythm (gen-repeat size '(16)) 1 12 's :type 2)) (setf len2 (euclidean-rhythm (gen-repeat size '(16)) 1 12 's :type 2)) (setf len3 (euclidean-rhythm (gen-repeat size '(16)) 1 12 's :type 2)) (setf len4 (euclidean-rhythm (gen-repeat size '(16)) 1 12 's :type 2)) ;;; Pitch generation (setf pmat (gen-divide 8 (vector-to-pitch '(c3 c5)(gen-white-noise 32)))) (setf pch1 (pitch-transpose 12 (rnd-sample size pmat))) (setf pch2 (pitch-transpose 8 (rnd-sample size pmat))) (setf pch3 (pitch-transpose 0 (rnd-sample size pmat))) (setf pch4 (pitch-transpose -24 (rnd-sample size pmat))) ;;; Global dynamics (setf dyna (mclist (pink-noise-sample 64 '(pp p mp mf f ff)))) ;;; OMN assembly (setf line1 (make-omn :pitch pch1 :length len1 :velocity dyna)) (setf line2 (make-omn :pitch pch2 :length len2 :velocity dyna)) (setf line3 (make-omn :pitch pch3 :length len3 :velocity dyna)) (setf line4 (make-omn :pitch pch4 :length len4 :velocity dyna)) (setf flute line1) (setf oboe line2) (setf clarinet line3) (setf bassoon line4) ;;; Orchestration and post processing ;; Ambitus (setf flute (ambitus '(g4 c6) flute)) (setf oboe (ambitus '(d4 d5) oboe)) (setf clarinet (ambitus '(c4 g5) clarinet)) (setf bassoon (ambitus '(c2 g3) bassoon)) ;; Re-barring (setf master-meters '(4/4)) (setf flute (omn-to-measure flute master-meters)) (setf oboe (omn-to-measure oboe master-meters)) (setf clarinet (omn-to-measure clarinet master-meters)) (setf bassoon (omn-to-measure bassoon master-meters)) ;; Mute / play (setf olen (length flute)) ;(setf otime (rnd-sample 8 '(wwww www ww w h w ww www))) (setf otime 1) ;; Group orchestration (setf grp1 '(1 1 0 0)) (setf grp2 '(1 1 1 0)) (setf grp3 '(1 1 1 1)) (setf grp4 '(1 0 1 1)) (setf grp5 '(0 0 1 1)) (setf grp6 '(1 1 0 1)) (setf grp7 '(1 0 1 1)) (setf i-list '(grp1 grp2 grp3 grp4 grp5 grp6 grp7)) (setf orchestration (rnd-sample olen i-list)) (setf orch-proc1 (binary-invert (apply-eval orchestration))) (setf instrumentation (matrix-transpose orch-proc1)) (do-timeline2 '(flute oboe clarinet bassoon) instrumentation '(gen-pause x) :time otime) (setf ts (get-time-signature flute)) (def-score group-orch-example (:title "Group orch example " :composer "S.Boussuge" :copyright "2017 s.boussuge " :key-signature 'chromatic :time-signature ts :tempo 88 :layout (list (bracket-group (flute-layout 'flute) (oboe-layout 'oboe) (clarinet-layout 'clarinet) (bassoon-layout 'bassoon)))) (flute :omn flute :channel 1 :sound 'gm :program 'flute :volume 95 :pan 70 :controllers (91 '(52))) (oboe :omn oboe :channel 2 :sound 'gm :program 'oboe :volume 95 :pan 54 :controllers (91 '(55))) (clarinet :omn clarinet :channel 3 :sound 'gm :program 'clarinet :volume 95 :pan 60 :controllers (91 '(57))) (bassoon :omn bassoon :channel 4 :sound 'gm :program 'bassoon :volume 95 :pan 70 :controllers (91 '(57))) ) SB. Group & Orchestration.opmo
  40. 1 point
    Ioannis Andriotis

    Randomize Materials?

    Thanks a lot Stephan! I will check out these functions. Just to mention, I am composing a piece for my dissertation (PhD) for Alto flute and Electronics (MaxMSP). Already the random functions have helped me a lot to put down some ideas fast. Looking forward to learning more about OMN when I will be done with school. Is there any chance that you will provide online tutorials (step-by-step - easy!) based on subscription? Like Lynda.com or MacProVideos? Although private lesson are great for more advanced users, I believe that having online database/resources would benefit many academic students and faculty members. I had this discussion with fellow graduate students and professors at near by universities. just food for thought for expanding this useful piece of software...! Have a nice day, and thanks again!
  41. 1 point
    opmo

    Automatic Cross Staff Piano Layout

    Good solution indeed
  42. 1 point
    opmo

    Automatic Cross Staff Piano Layout

    If the LH and RH pitches are placed correctly then I would use piano-layout: (def-score grand (:key-signature 'atonal :time-signature '(2 8) :tempo 130 :octave-shift '(c2 c6) ;:flexible-clef t :layout (piano-layout 'rh 'lh)) (lh :omn '(e g1 g3) :channel 1 :sound 'gm :program 0) (rh :omn '(e g3 c6)) )
  43. 1 point
    opmo

    Automatic Cross Staff Piano Layout

    here only c6 is in the treble clef. (def-score grand (:key-signature 'atonal :time-signature '(2 8) :tempo 130 :octave-shift '(c2 c6) :flexible-clef t :layout (grand-layout 'pno)) (pno :omn (merge-voices '((e g3 c6) (e g1 g3))) :channel 1 :sound 'gm :program 0) )
  44. 1 point
    opmo

    Automatic Cross Staff Piano Layout

    Is this what you are looking for: (setf sine (gen-sine 120 1 '(0.5 0.2 0.1) :phase 60)) (setf vec (add-sine-waves 4 120 4 0.6 :modulation sine)) (setf mat (vector-to-pitch '(g2 g7) vec)) (setf divide (gen-divide 6 mat)) (setf div1 (gen-collect 3 divide)) (setf div2 (gen-collect 3 divide :remain t)) (setf pich1 (rnd-octaves '(g2 b7) div1)) (setf pich2 (rnd-octaves '(c2 g7) div2)) (setf pitch (gen-mix pich1 pich2 :flatten t)) (setf velocity (rnd-sample 120 '(pp mp mf ff))) (setf omn1 (make-omn :length (rnd-sample 120 '(s -)) :pitch pich1 :velocity velocity :span :pitch)) (setf omn2 (make-omn :length (rnd-sample 120 '(s -)) :pitch pich2 :velocity velocity :span :pitch)) (def-score grand (:key-signature 'atonal :time-signature '(3 8) :tempo 130 :octave-shift '(c2 c6) :accidentals :all :layout (grand-layout 'pno)) (pno :omn (merge-voices omn1 omn2) :channel 1 :sound 'gm :program 0) ) Note: Accidentals types: :accidentals :all :accidentals :natural :accidentals :cautionary The :all-accidentals t is not correct.
  45. 1 point
    opmo

    Opusmodus 1.2.22724

    Optimisation to DO-TIMELINE. MIDI and frequency (partials) conditions. New compact timeline in DO-TIMELINE and DO-TIMELINE2 Example: (do-timeline '( piccolo (---xxxxxxx xxxxxx---- xxx------- xxxxxx---- ---------- xxxxxxx--- ---xxxxxxx xx) flute (--xxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxx---- ---------- xxxxxxxxxx xxxxxxxxxx xx) alto-flute (--xxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxx------ ---------- ---x--xxxx xxxxxxxxxx xx) oboe1 (xx----xxxx xxxxxx---- xxxxxxxxxx ---xxx---- ---------- xxxxxxxxxx xxxxxxxxxx xx) oboe2 (xxxxxxxxxx xxxxxxxxx- xxxxxxxxxx ---xx----- ---------- xxxxxxxxxx xxxxxxxxxx xx) cor-anglais (xxxxxxxxxx xxxxxx---- xxxxxxxxxx ---xx----- ---------- xxxxxxxxxx xxxxxxx-xx xx) clarinet1 (xxx------- xxxxxx---- --xxxxxxxx ---xxx---- ---------- xx-------- --------xx xx) clarinet2 (xxxxxxxxxx xxxx------ xxxxxxxxxx ---xxx---- ---------- ---------- --------xx xx) clarinet3 (xxxxxxxxxx xxxx------ xxxxxxxxxx ---------- ---------- ---------- --------x- --) bass-clarinet (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx x--------- ---------- xxxx--xxxx xxxxxxxxxx xx) bassoon1 (xxxxxxxxxx ---------- xxxxxxxxxx ---xxx---- ---------- ---------- --------xx xx) bassoon2 (xxxxxxxxxx xx-------- xxxxxxxxxx -x-------- ---------- ---------- -------x-- --) contrabassoon (xxxxxxxxxx xxxx------ xxxxxxxxxx xx-------- ---------- ---------- ------xx-- --) horn1 (x--------- xxxxxxxx-- ---------- xxxxxxxxxx ---------- ---------- ---------- --) horn2 (xxxx------ xxxxxxxxxx xxxxxxxxxx xx-x------ ---------- ---------- -------xxx --) horn3 (xxxxxx---- xxxxxxxxxx xxxxxxxxxx xx-xxx---- ---------- ---------- -------xxx xx) horn4 (xxxxxx---- xxxxxxxxxx xxxxxxxxxx xx-x------ ---------- ---------- --------xx --) trumpet1 (xxxxxx---- ---xxxxx-- ---------- ---xxx---- ---------- xxxx----xx xxxxxx--xx xx) trumpet2 (xxx--x---- ---xxxxx-- xxxxxxxxxx ---xxx---- ---------- xxxx----xx xxxx----xx xx) trumpet3 (---------- x--xxxxxxx xxxxxxxxxx ---xxx---- ---------- xxxxxxxxxx xxxxxx--xx xx) bass-trumpet (xxxx------ x--------- ---------- x--xxx---x ---------- --------xx xxxxxxx-xx xx) trombone (------xxxx xxxxxxxxxx ---------- x-xxxxxx-x ---------- ---------- ---xxxx--- --) tenor-tuba (---------- xxxxxxxxxx ---xxxxxxx x--------- ---------- ---------- ---xxxx--- --) bass-tuba (xxxxxx---x xx---xxxxx xxxxxxxxxx x--------- ---------- ---------- ---xxxx--- --) harp-lh (xxxxxxxxx- xxxxxxxxxx xx-xxxxxxx xx-xxx-x-x ---------- xxxxxx-xxx xxxxxxxxxx xx) harp-rh (xxxxxxxxxx xxxxxxxxxx xx-xxxxxxx xx-xxx-x-x ---------- xxxxxx-xxx xxxxxxxxxx xx) violin1 (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx -xxxxxxxxx ---------- ---------- --------xx xx) violin2 (xxxxxxxxxx xxxxxxxxxx xxx------x xxxxxxxxxx ---------- ---------- --------xx xx) viola (xxxxxxxxxx xxxxxxxxxx xxxxxx-xxx xxxx--xxxx ---------- ---------- --------xx xx) violoncello (xxxxxxxxxx xxxxxxxxxx xxxxxxxxxx xx-x--xxxx ---------- ---------- --------xx xx) contrabass (xxxxxx---x xxxxxxxxxx xxxxxxxxxx xx-x--xx-- ---------- xxxxxxx-xx -xx-xx-xxx xx) ) '(gen-pause x)) Binary example: (do-timeline '( piccolo (0001111111 1111110000 1110000000 1111110000 0000000000 1111111000 0001111111 11) flute (0011111111 1111111111 1111111111 1111110000 0000000000 1111111111 1111111111 11) alto-flute (0011111111 1111111111 1111111111 1111000000 0000000000 0001001111 1111111111 11) oboe1 (1100001111 1111110000 1111111111 0001110000 0000000000 1111111111 1111111111 11) oboe2 (1111111111 1111111110 1111111111 0001100000 0000000000 1111111111 1111111111 11) cor-anglais (1111111111 1111110000 1111111111 0001100000 0000000000 1111111111 1111111011 11) clarinet1 (1110000000 1111110000 0011111111 0001110000 0000000000 1100000000 0000000011 11) clarinet2 (1111111111 1111000000 1111111111 0001110000 0000000000 0000000000 0000000011 11) clarinet3 (1111111111 1111000000 1111111111 0000000000 0000000000 0000000000 0000000010 00) bass-clarinet (1111111111 1111111111 1111111111 1000000000 0000000000 1111001111 1111111111 11) bassoon1 (1111111111 0000000000 1111111111 0001110000 0000000000 0000000000 0000000011 11) bassoon2 (1111111111 1100000000 1111111111 0100000000 0000000000 0000000000 0000000100 00) contrabassoon (1111111111 1111000000 1111111111 1100000000 0000000000 0000000000 0000001100 00) horn1 (1000000000 1111111100 0000000000 1111111111 0000000000 0000000000 0000000000 00) horn2 (1111000000 1111111111 1111111111 1101000000 0000000000 0000000000 0000000111 00) horn3 (1111110000 1111111111 1111111111 1101110000 0000000000 0000000000 0000000111 11) horn4 (1111110000 1111111111 1111111111 1101000000 0000000000 0000000000 0000000011 00) trumpet1 (1111110000 0001111100 0000000000 0001110000 0000000000 1111000011 1111110011 11) trumpet2 (1110010000 0001111100 1111111111 0001110000 0000000000 1111000011 1111000011 11) trumpet3 (0000000000 1001111111 1111111111 0001110000 0000000000 1111111111 1111110011 11) bass-trumpet (1111000000 1000000000 0000000000 1001110001 0000000000 0000000011 1111111011 11) trombone (0000001111 1111111111 0000000000 1011111101 0000000000 0000000000 0001111000 00) tenor-tuba (0000000000 1111111111 0001111111 1000000000 0000000000 0000000000 0001111000 00) bass-tuba (1111110001 1100011111 1111111111 1000000000 0000000000 0000000000 0001111000 00) harp-lh (1111111110 1111111111 1101111111 1101110101 0000000000 1111110111 1111111111 11) harp-rh (1111111111 1111111111 1101111111 1101110101 0000000000 1111110111 1111111111 11) violin1 (1111111111 1111111111 1111111111 0111111111 0000000000 0000000000 0000000011 11) violin2 (1111111111 1111111111 1110000001 1111111111 0000000000 0000000000 0000000011 11) viola (1111111111 1111111111 1111110111 1111001111 0000000000 0000000000 0000000011 11) violoncello (1111111111 1111111111 1111111111 1101001111 0000000000 0000000000 0000000011 11) contrabass (1111110001 1111111111 1111111111 1101001100 0000000000 1111111011 0110110111 11) ) '(gen-pause x)) best wishes, JP
  46. 1 point
    AM

    inserting

    here is a function that can be used for "post-..." of an OMN score... you could INSERT a sequence by BAR/BEAT (a slightly modified variant of OVERWRITE), so you can place your insert exactly! greetings andré ;;; INSERTING (defun get-resolution2 (be) (cond ((member (cadr be) '(3 6 12 24 48)) 1/24) ((member (cadr be) '(1 2 4 8 16 32)) 1/16) ((member (cadr be) '(5 10 20 40)) 1/20) ((member (cadr be) '(7 14 28 56 1)) 1/28))) (defun insert (seq &key insert bar/beat) (car (last (let ((bar) (beat) (resolution) (distance)) (progn (setf bar (loop for i in bar/beat collect (car i)) beat (loop for j in bar/beat collect (cadr j))) (loop for ba in bar for be in beat for ins in insert with time-sign = (get-time-signature seq) with ord-time-sign = (get-time-signature seq) ;with ins-rounded = '(0) with ins-add = '(0) do (setf resolution (get-resolution2 be) time-sign (if (listp (car time-sign)) (loop for i in time-sign when (> (caddr i) 1) append (loop repeat (caddr i) collect (list (car i) (cadr i))) else collect (list (car i) (cadr i))) (append time-sign)) distance (if (listp (car time-sign)) (+ (sum (loop repeat (- ba 1) for i in time-sign collect (/ (/ (car i) (cadr i)) (get-resolution2 be)))) (/ (/ (1- (car be)) (cadr be)) (get-resolution2 be)) ;;; ins-rounded add (/ (get-span (flatten ins-add)) (get-resolution2 be)) ) (+ (/ (* (1- ba) (/ (car time-sign) (cadr time-sign))) (get-resolution2 be)) (/ (/ (1- (car be)) (cadr be)) (get-resolution2 be)) ;;; ins-rounded add (/ (get-span (flatten ins-add)) (get-resolution2 be))) )) do (setf seq (omn-to-time-signature (length-rest-merge (flatten (loop repeat (length (omn-to-time-signature seq (list (numerator resolution) (denominator resolution)))) for cnt = 0 then (incf cnt) with new-seq = (omn-to-time-signature seq (list (numerator resolution) (denominator resolution))) with ins-rounded = (append ins (rest (length-rational-quantize (list (apply '+ (mapcar 'abs (omn :length ins)))) :round resolution))) when (= cnt distance) collect ins-rounded and do (setf ins-add (append ins-rounded ins-add)) else collect (nth cnt new-seq)))) ord-time-sign)) do (setf time-sign ord-time-sign) collect (omn-merge-ties seq))))))) ;;; EXAMPLES: ;;; with changing time-signatures (insert '((e c6 a5 h b5 q tie) (q b5 b5 a5 tie) (q a5 q a5) (h. g5)) :insert '((-3q 3q c5 b4 bb4 a4) (-3q 3q c4 b3 bb3 a3)) ;;; bar numbers has to be in ascending order! :bar/beat '((1 (1 12)) (3 (1 12)))) (insert '((e c6 a5 h b5 q tie) (q b5 b5 a5 tie) (q a5 q a5) (h. g5)) :insert '((-2/12)) :bar/beat '((2 (2 12)))) ;;; with constant time-signature (insert '((e c6 a5 h b5 tie) (q b5 b5 a5 tie) (h a5 q a5) (h. g5)) :insert '((3q c5 b4 bb4 a4) (-3q 3q c4 b3 bb3 a3)) ;;; bar numbers has to be in ascending order! :bar/beat '((1 (7 12)) (3 (2 12)))) (insert '((e c6 a5 h b5 tie) (q b5 b5 a5 tie) (h a5 q a5) (h. g5)) :insert '((-h.)) :bar/beat '((2 (1 4))))
  47. 1 point
    AM

    muting every other note

    code from another project, but should work in a similar way. take it, modify it, or code it properly :-) regards andré ;; gen-hoquetus.4 https://en.wikipedia.org/wiki/Hocket ;;; andré meier / 27-4-2016 ;;; write a instrumentation-list (instrument + techniques + velocity), pitch-list ;;; and length-list. the gen-hoquetus-function will split the melody ;;; off... in any possibilities, techniques/articulations/velocities will be added ;;; this is only a function i coded for my actual work... perhaps you could use ;;; it or code it properly :-) ;;; HAVE FUN! regards, andré (setq instrumentation '(((pno ponte ppp)) ((vn pizz p)) ((vn pizz f) (va ponte f)) ((pno tasto ff)) ((pno pizz fff)) ((vn tasto mf) (pno ord ff) (vc tasto mf) (trp ord pp)) ((trp mute pp) (vn ponte mf)))) ;; subfunctions (defun generate-events.4 (durations pitches &key (velocity '(mf)) (articulation '(-)) (optional_data 'nil)) (loop repeat (length durations) with cnt-d = 0 with cnt-rest = 0 when (> (nth cnt-d durations) 0) collect (list (nth cnt-d durations) (nth cnt-rest pitches) (nth cnt-rest velocity) (nth cnt-rest articulation) (nth cnt-rest optional_data)) and do (incf cnt-rest) and do (incf cnt-d) else collect (list (nth cnt-d durations) 'nil 'nil 'nil 'nil) and do (incf cnt-d))) (generate-events.4 '(1 2 -3 4) '(60 61 62) :optional_data instrumentation) ;; (defun filtering-color.4 (selected-color event-stream) (loop for i in event-stream with match = 0 append (loop for x in (fifth i) when (equal (first x) selected-color) do (setq articulation (second x) velocity (third x)) and do (setq match 1)) when (and (= match 1) (> (first i) 0)) append (list (first i) (second i) velocity articulation) else collect (* -1 (abs (first i))) do (setq match 0))) (filtering-color.4 'vn (generate-events.4 (gen-length '(1 -100 2 3 4 5) 1/32) '(c4 d4 e4 e5) :optional_data instrumentation)) ;; mainfuction: (defun gen-hoquetus.4 (filtered-instrument &key pitch length instrument-list) (let ((events (generate-events.4 length pitch :optional_data instrument-list))) (filtering-color.4 filtered-instrument events))) (gen-hoquetus.4 'vn :pitch '(c4 d4 e5 f6) :length '(1/32 2/32 3/32 4/32) :instrument-list instrumentation) ;; OMN_EXAMPLE: (setq pitches (midi-to-pitch '(60 61 62 63 64 65 66 67 68 69 70))) ; only an example (setq lengths (gen-length '(1 2 3 -4 5 6 5 -4 3 -2 1) 1/16)) ; only an example (setq instrumentation (loop repeat 10 collect (rnd-pick '(((pno ponte ppp)) ; only an example ((vn pizz p)) ((vn pizz f) (va ponte f)) ((pno tasto ff)) ((pno pizz fff)) ((vn tasto mf) (pno ord ff) (vc tasto mf) (trp ord pp)) ((trp mute pp) (vn ponte mf)))))) (def-score hoquetus.4 (:key-signature '(c maj) :time-signature '(4 4) :tempo '(120) :layout (bracket-group (trumpet-layout 'trumpet) (piano-grand-layout 'piano) (violin-layout 'violin) (viola-layout 'viola) (violoncello-layout 'violoncello))) (trumpet :omn (gen-hoquetus.4 'trp :pitch pitches :length lengths :instrument-list instrumentation) :channel 1) (piano :omn (gen-hoquetus.4 'pno :pitch pitches :length lengths :instrument-list instrumentation) :channel 1) (violin :omn (gen-hoquetus.4 'vn :pitch pitches :length lengths :instrument-list instrumentation) :channel 1) (viola :omn (gen-hoquetus.4 'va :pitch pitches :length lengths :instrument-list instrumentation) :channel 1) (violoncello :omn (gen-hoquetus.4 'vc :pitch pitches :length lengths :instrument-list instrumentation) :channel 1))
  48. 1 point
    Hi, here's a quiet speed piece playing around the jazz piano ;-) SB.
×