Jump to content

All Activity

This stream auto-updates

  1. Today
  2.    RST reacted to a post in a topic: Generation of appoggiatura and accacciatura
  3. Yesterday
  4. zaylorshtolze167 joined the community
  5. LucVargas joined the community
  6. Last week
  7. davidtts2488 joined the community
  8. A wonderful tip! Thank you!
  9. Thanks @opmo . Do you mind explaining what you mean by "tuning values that correspond to the cent values"? How do I do this?
  10.    jacobcvt12 reacted to a post in a topic: Exploring just intonation with Opusmodus
  11. Here’s a small function I needed because I’m working with "binary counting patterns". All patterns must always have the same length (a fixed bit length determined by the largest value). (defun dec-to-bin-rhythm (ilist) (let ((span (find-max (mapcar 'length (decimal-to-binary ilist))))) (loop for i in (binary-rhythm span ilist 1 :type 1) collect (loop for x in i when (< x 0) append (gen-repeat (abs x) 0) else collect x)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; to ensure the pattern is always the same length, the bit length for all decimal-to-binary conversions is adjusted to match the largest decimal number ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (dec-to-bin-rhythm '(234234 1 23 110 )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; binary-counting-rhythm -> counting from x to y ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setf bitseq (dec-to-bin-rhythm (gen-integer 1 145))) ;; 8-bit (omn-to-measure (make-omn :pitch '(c5) :length (gen-length bitseq '1/32) :velocity '(mf)) '(2/8)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; examples with list-plot ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (progn (setf bitseq (dec-to-bin-rhythm (gen-integer 1 79))) (length-list-plot (flatten bitseq) :join-points t :style :fill)) (progn (setf bitseq (dec-to-bin-rhythm (gen-integer 1 230 3))) ;; count with step 3 (length-list-plot (flatten bitseq) :join-points t :style :fill)) (progn (setf bitseq (dec-to-bin-rhythm (primes 50))) (length-list-plot (flatten bitseq) :join-points t :style :fill)) A "Binary Counting Filter": You can also think of it (a liitle bit) like Tom Johnson’s work — the filter/binary approach generates all possible combinations etc... (defun binary-count-filter (&key (type 'pos) (n 50) minp maxp minl maxl field (rhy '1/16)) (progn (setf n-chords n) (setf pseq (dec-to-bin-rhythm (gen-integer minp maxp))) (setf lseq (dec-to-bin-rhythm (gen-integer minl maxl)));(cellular-automaton lrule n-chords linit)) (setf positions (loop for i in pseq collect (position-item 1 i))) (setf chords (if (equal type 'neg) (loop for i in positions collect (chordize (remove-duplicates (melodize (position-remove i field))))) (loop for i in positions collect (chordize (position-filter i field))))) (setf lengths (loop for i in (flatten lseq) when (= i 1) collect rhy else collect (* -1 rhy))) (make-omn :pitch chords :length lengths :velocity '(ppp)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; examples counting 1 to 123 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; type: pos -> play/chordize the 1-values (binary-count-filter :type 'pos :minp 1 :maxp 123 :field (make-scale 'c4 11 :alt '(1 2 3 7)) :minl 1 :maxl 123 :rhy '1/16) ;; type: neg -> play/chordize the 0-values (binary-count-filter :type 'neg :minp 1 :maxp 123 :field (make-scale 'c4 11 :alt '(1 2 3 7)) :minl 1 :maxl 123 :rhy '1/16) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 2 more examples with counting 23 to 255 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; type: pos -> play/chordize the 1-values (binary-count-filter :type 'pos :minp 23 :maxp 255 :field (make-scale 'c4 11 :alt '(1 2 3 7)) :minl 23 :maxl 255 :rhy '1/32) ;; type: pos -> play/chordize the 0-values (binary-count-filter :type 'neg :minp 23 :maxp 255 :field (make-scale 'c4 11 :alt '(1 2 3 7)) :minl 23 :maxl 255 :rhy '1/32)
  12.    AM reacted to a post in a topic: Exploring just intonation with Opusmodus
  13.    AM reacted to a post in a topic: Opusmodus 4.0.29941 (Update)
  14.    AM reacted to a post in a topic: Exploring just intonation with Opusmodus
  15. (setf cent-val '(-95 0 95)) (setf cents (cent-to-attribute cent-val)) (setf rh (make-omn :length '(w. w. w.) :pitch '(e4 e4 e4) :articulation cents)) (setf lh (make-omn :length '(w. w. w.) :pitch '(c4 c4 c4))) (def-score cents (:key-signature 'chromatic :time-signature '(4 4) :tempo 80 :layout (piano-solo-layout 'rh 'lh)) (rh :omn rh :tuning (cent-to-tuning cent-val) :channel 1 :sound 'gm :program 'acoustic-grand-piano) (lh :omn lh :channel 2) ) Cents notation is used to indicate micro-tuning of pitch. To hear the cents in a score, I suggest using microtonal notation (1/4 or 1/8 tones) or tuning values that correspond to the cent values.
  16.    Stephane Boussuge reacted to a post in a topic: Opusmodus 4.0.29941 (Update)
  17.    jon reacted to a post in a topic: Opusmodus 4.0.29941 (Update)
  18. All three MusicXML file formats, .xml, .musicxml, and .mxl (compressed) are supported on macOS and Windows. Small improvements to notation display.
  19. KevinVS joined the community
  20.    jacobcvt12 reacted to a post in a topic: Exploring just intonation with Opusmodus
  21. Hi @opmo thank you for your response. This helps me get started. I'm having trouble with playing notes simultaneously. I can verify that in playback of a single line, they cents articulation is observed: (setf cent-rem-third (cent-to-attribute (list '-95 '0 '95))) (setf third (make-omn :length '(w. w. w.) :pitch '(e4 e4 e4) :articulation cent-rem-third))I chose nearly whole steps of offset, and the difference in the three notes is quite audible. However, when I try to add a second line, to form the root of a chord, the articulation is not observed in playback. (setf root (make-omn :length '(w. w. w.) :pitch '(c4 c4 c4))) (ps 'gm :p (list root third) :key-signature 'chromatic :time-signature '(4 4) :tempo 80)Any advice on how to play these lines together?
  22. (setf ratios '(1 567/512 9/8 147/128 1323/1024 21/16 189/128 3/2 49/32 441/256 7/4 63/32 2)) (setf cents (ratio-to-cent ratios)) (setf pitch (vector-to-pitch '(c4 c5) cents :quantize 1/2)) => (c4 d4 d4 d4 e4 f4 g4 g4 g4 a4 bb4 c5 c5) (setf cent-rem (vector-to-pitch '(c4 c5) cents :quantize 1/2 :remain t)) => (0 -23 4 40 44 -29 -25 2 38 42 -31 -27 0) (setf cent-att (cent-to-attribute cent-rem)) (make-omn :length '(q) :pitch pitch :span :pitch :articulation cent-att) ;; With quantize set to 1/8 (setf pitch (vector-to-pitch '(c4 c5) cents :quantize 1/8)) => (c4 cs4.. d4 d4+ e4+ e4.. fs4.. g4 g4+ a4+ a4.. b4.. c5)
  23. Hi all, I'm new to both Opusmodus and just intonation. I'm working through the book "The Arithmetic of Listening" by Kyle Gann, and interested in exploring these topics in Opusmodus. I see the command for ratio-to-cent (documentation excerpt pasted below) which gets me part of the way to what I'm interested in, but what if I want to actually here this scale? Or tune my music to match this scale? I think I can understand how to build out any just intonation scale, but just not sure how to actually hear and write music using the scale. Any advice? LaMonte Young's Well-Tuned Piano: (ratio-to-cent '(1/1 567/512 9/8 147/128 1323/1024 21/16 189/128 3/2 49/32 441/256 7/4 63/32 2/1)) => (0 177 204 240 444 471 675 702 738 942 969 1173 1200)
  24. Earlier
  25. jacobcvt12 joined the community
  26. Great example, thank you.
  27. AndreaSzigetvari joined the community
  28. haruki7049 joined the community
  29. Truly great display of the computation.
  30. Here's a little function that generates OMN-Seqs with CA-filter (pos/neg) with a CA-Rhy - both parameters independently. Have fun - André (defun cellular-automaton-filter (&key (type 'pos) (n 200) prule pinit lrule linit field (rhy '1/16)) (progn (setf n-chords n) (setf pseq (cellular-automaton prule n-chords pinit)) ;'(0 0 0 0 0 0 1 0 0 0 0 0 0))) (setf lseq (cellular-automaton lrule n-chords linit)) (setf positions (loop for i in pseq collect (position-item 1 i))) (setf chords (if (equal type 'neg) (loop for i in positions collect (chordize (position-remove i field))) (loop for i in positions collect (chordize (position-filter i field))) )) (setf lengths (loop for i in (flatten lseq) when (= i 1) collect rhy else collect (* -1 rhy))) (make-omn :pitch chords :length lengths :velocity '(ppp)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; type: pos -> play/chordize the 1-values (cellular-automaton-filter :type 'pos :prule 110 :pinit '(0 0 0 0 0 1 0 0 1 0 0 0 0 0 0) :field (gen-sieve '(f0 f7) '(6 3 4 6 3 4) :type :pitch) :lrule 26 :linit '(0 0 0 0 0 1 0 0 1 0 0 0 0 0 0) :rhy '1/20) ;; type: neg -> play/chordize the 0-values (cellular-automaton-filter :type 'neg :prule 110 :pinit '(0 0 0 0 0 1 0 0 1 0 0 0 0 0 0) :field (gen-sieve '(f0 f7) '(6 3 4 6 3 4) :type :pitch) :lrule 26 :linit '(0 0 0 0 0 1 0 0 1 0 0 0 0 0 0) :rhy '1/32)
  31. Fixed intervals: each generation extracts a predefined interval-sequence. Within the simulation loop—which runs and visualizes multiple generations—users can choose whether to display intervals or absolute pitches. With every generation (or evaluation), the initial binary sequence is modified. This dynamic updating makes the specific behavior of each rule more apparent, allowing for clearer comparisons between different cellular automaton rules. (progn ;; set rule number ;(setf rule 12) (setf rule (random 257)) ;; set n simulations (setf sims 5) (loop repeat sims do (progn (setf intervals (pitch-to-interval (rnd-air :group :symmetric :type :pitch :seed 1234))) (setf seq (cellular-automaton rule 200 (gen-binary-rnd 1 11 1 3))) (setf positions (loop for i in seq collect (position-item 1 i))) (setf ilist (loop for i in positions collect (position-filter i intervals))) (setf plist (loop for i in ilist collect (interval-to-pitch i))) (setf plist2 (interval-to-pitch (flatten ilist)))) ;; intervals ; do (list-plot (flatten ilist) :join-points nil :style :fill) ;; pitches every gen starting on c4 ;do (pitch-list-plot (flatten plist) :join-points t :style :fill)) ;; pitches all (without gen restart) do (pitch-list-plot (flatten plist2) :join-points t :style :fill) do (sleep 1))) Bildschirmaufnahme 2025-06-28 um 16.35.52.mov
  32. Here’s a small technical idea... just with a "random-chord" (progn (setf chord (rnd-sample-seq 10 (gen-sieve '(c3 g7) '(1 2 4 7 4 2) :type :pitch))) (setf rule30 (cellular-automaton 30 200 '(0 0 0 1 0 1 0 0 0 0))) (setf positions (loop for i in rule30 collect (position-item 1 i))) (setf chords (loop for i in positions collect (chordize (position-filter i chord)))) (pitch-list-plot (flatten chords) :join-chords t)) https://plato.stanford.edu/entries/cellular-automata/supplement.html
  33. And this is part of the reason why... https://guides.loc.gov/music-notation-preferred-preservation-formats-for-digital-scores/musicxml
  34. I would always avoid merging complex material using the merge-voices function. The function is useful for simple merges where length is not part of complex divisions. The best way to merge them is to do so at the def-score level in the layout. (setf v1 '((-3he d4 pppp - d4 - d4) (-3he d4 pppp - d4 - -))) (setf v2 '((-7wq - eb5 pppp ten - eb5 ten - eb5 ten) (-7wq eb5 pppp ten - eb5 ten - - -))) (def-score test (:key-signature '(c maj) :time-signature '(4 4) :tempo '(q 120) :layout '(:treble inst1 inst2)) (inst1 :omn v1 :channel 1 :sound 'gm :program 0) (inst2 :omn v2 :channel 1 :sound 'gm :program 0) ) With grace note merge at the moment we are getting messy display, it is a bug.
  35. Weird notation shows up when I merge the following voices—on their own, there’s no problem. ;; two versions (setf v1 '((-3he d4 pppp - d4 - d4) (-3he d4 pppp - d4 - -))) (setf v2 '((-7wq - eb5 pppp ten - eb5 ten - eb5 ten) (-7wq eb5 pppp ten - eb5 ten - - -))) (merge-voices v1 v2) (setf v1 '(-3he d4 pppp - d4 - d4 -3he d4 pppp - d4 - -)) (setf v2 '(-7wq - eb5 pppp ten - eb5 ten - eb5 ten -7wq eb5 pppp ten - eb5 ten - - -)) (merge-voices v1 v2)
  36. Some fixes to the notation display are on the way and will be available soon. Converting from MusicXML to OMN was quite a task, especially when dealing with the many errors in the MusicXML script.
  37. Okay, I will figure it out. Thanks. My goal would be to make some tools and share them here with the community - importantly sharing HOW to do things and for Windows users who are a little under-represented perhaps. I started with the acoustic compiler cmusic around 1981 and worked at CME/CARL for nearly a decade (where I first met BV). In 1989, when I moved to my university post, F. Richard Moore, the author of cmusic (among other things) suggested that I get into Csound - and I have been using it in my work since then. I think there is a lot of possibly in Csound combined with OM as a front-end, and I will be experimenting with it within the OM context. My goal is to simply and openly share information on how I do this with other OM users. The most positive thing about Csound is that it is open-source. Thus inviting the research collaboration of everyone that wishes to work with it. For me this is a crucial and central aspect. I see OM very much as a research tool and not as a strictly "commercial” one and this informs my mindset about sharing tools and techniques. In time.
  38. I totally agree. The import of MusicXML is looking really reliable (only one glitch so far with a file) and the opportunities opened up by this new functionality are fantastic. Building libraries of material from xml scores rather than having to input OMN script manually is going to be a big time saver for me, but I’m already enjoying the flexibility of this new way of working and looking forward to the creative potential of working across platforms. So pleased with this new (and quite unexpected!) update - so thanks to Janusz and everyone involved with this development! bw Andrew
  39. The workflow with importing/exporting MusicXML is really great—it opens up a whole new way of working. Congratulations and thanks to Janusz and the OPMO team! Greetings André
  40. @Jorgalad thanks for your effort to reproduce. I tried it again one more time. The original download in .mxl works as you said. Good! Once I rename the .mxl it to .xml (as I wrote in original post) it now longer works. I am on Mac. The seems to happen more than just renaming when changing the extension. OK, sorry the fuzz @opmo & @Jorgalad . Note to Mac-users, just keep extension as-is.
  41. @Cliff did you do happen to do something to the file? The one attached to your post is also corrupted for me, but the one I downloaded from the MuseScore link open fine in both Opusmodus and Muse

Copyright © 2014-2025 Opusmodus™ Ltd. All rights reserved.
Product features, specifications, system requirements and availability are subject to change without notice.
Opusmodus, the Opusmodus logo, and other Opusmodus trademarks are either registered trademarks or trademarks of Opusmodus Ltd.
All other trademarks contained herein are the property of their respective owners.

Powered by Invision Community

Important Information

Terms of Use Privacy Policy