<?xml version="1.0"?>
<rss version="2.0"><channel><title>All Activity</title><link>https://opusmodus.com/forums/discover/</link><description>Opusmodus - All Activity</description><language>en</language><item><title>Save-current-section</title><link><![CDATA[https://opusmodus.com/forums/topic/4112-save-current-section/?do=findComment&comment=14238]]></link><description><![CDATA[Hello everyone,  I would like to share a small utility function I recently developed for Opusmodus that may be useful for people working with long-form generative or multi-section compositions.  The idea is very simple:  The function automatically captures the output of pprint-last-score, creates a file if necessary, and appends the generated def-score into that file while allowing automatic or manual section naming.  For example:  (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp")  Automatically generates:  (def-score section001 ...) (def-score section002 ...) (def-score section003 ...)  Or with a custom name:  (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp"  :name 'coda)  One particularly useful aspect is the possibility to store metadata alongside each section:  (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp"  :metadata `((:seed ,*gseed*)              (:tempo 72)              (:mode octatonic)              (:algorithm score212)))  This allows the score file to become not only a collection of sections, but also a compositional archive containing informations on each section. I have found this especially useful for: large algorithmic works, iterative composition, and building long-form modular pieces. The function automatically: creates the file if needed, appends new sections without overwriting, detects the next available section number, renames the internal def-score, and optionally stores metadata comments. I am sharing the full code below in case it may be useful to others.  (in-package :opusmodus) ;;; ------------------------------------------------------------ ;;; CAPTURE DU DERNIER SCORE ;;; ------------------------------------------------------------ (defun capture-pprint-last-score ()   "Capture le texte produit par pprint-last-score sans la ligne pprint-last-score."   (let* ((txt (with-output-to-string (*standard-output*)                 (pprint-last-score)))          (pos (search "(def-score" txt :test #'char-equal)))     (unless pos       (error "Aucun (def-score ...) trouvé dans pprint-last-score."))     (subseq txt pos))) ;;; ------------------------------------------------------------ ;;; REMPLACEMENT DU NOM DU DEF-SCORE ;;; ------------------------------------------------------------ (defun replace-def-score-name (score-string new-name)   "Remplace le nom du premier def-score par NEW-NAME."   (let* ((new-name-string (string-downcase (string new-name)))          (pos (search "(def-score" score-string :test #'char-equal)))     (unless pos       (error "Aucun (def-score ...) trouvé dans le texte capturé."))     (let* ((start (+ pos (length "(def-score")))            (after-space             (position-if-not              #'(lambda (c)                  (member c '(#\Space #\Tab #\Newline)))              score-string              :start start))            (end-name             (position-if              #'(lambda (c)                  (member c '(#\Space #\Tab #\Newline #\()))              score-string              :start after-space)))       (concatenate 'string                    (subseq score-string 0 after-space)                    new-name-string                    (subseq score-string end-name))))) ;;; ------------------------------------------------------------ ;;; UTILITAIRES ;;; ------------------------------------------------------------ (defun read-file-as-string (file)   "Lit FILE sous forme de string. Renvoie une string vide si le fichier n'existe pas."   (if (probe-file file)       (with-open-file (in file :direction :input)         (let ((contents (make-string (file-length in))))           (read-sequence contents in)           contents))       "")) (defun zero-pad-number (number width)   "Convertit NUMBER en string avec des zéros à gauche."   (let ((s (write-to-string number)))     (concatenate 'string                  (make-string (max 0 (- width (length s)))                               :initial-element #\0)                  s))) (defun collect-auto-section-numbers (text prefix)   "Collecte tous les numéros trouvés dans des noms du type PREFIX001, PREFIX002, etc."   (let* ((prefix-string (string-downcase prefix))          (prefix-length (length prefix-string))          (text-lower (string-downcase text))          (numbers '())          (start 0))     (loop       for pos = (search prefix-string text-lower :start2 start)       while pos do         (let* ((num-start (+ pos prefix-length))                (num-end num-start))           (loop             while (and (&lt; num-end (length text-lower))                        (digit-char-p (char text-lower num-end)))             do (incf num-end))           (when (&gt; num-end num-start)             (push (parse-integer text-lower                                  :start num-start                                  :end num-end)                   numbers))           (setf start num-end)))     numbers)) (defun next-section-number (file prefix)   "Trouve le prochain numéro disponible pour PREFIX dans FILE."   (let* ((text (read-file-as-string file))          (numbers (collect-auto-section-numbers text prefix)))     (if numbers         (1+ (apply #'max numbers))         1))) (defun make-auto-section-name (file prefix digits)   "Crée un nom automatique du type section001."   (intern    (string-upcase     (format nil "~a~a"             prefix             (zero-pad-number              (next-section-number file prefix)              digits))))) ;;; ------------------------------------------------------------ ;;; FONCTION PRINCIPALE ;;; ------------------------------------------------------------ (defun save-current-section (&amp;key                                file                                name                                (prefix "section")                                (digits 3)                                (separator t)                                (comment-date nil)                                metadata)   "Sauvegarde le dernier score Opusmodus dans FILE. Si NAME est fourni, le def-score prendra ce nom. Si NAME est NIL, un nom automatique sera généré : section001, section002, section003, etc. Exemples :   (save-current-section    :file \"/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp\")   (save-current-section    :file \"/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp\"    :name 'introduction)   (save-current-section    :file \"/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp\"    :prefix \"part\"    :digits 2)   (save-current-section    :file \"/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp\"    :metadata '((:seed 12345)                (:mode octatonic-1)                (:tempo 72)))"   (unless file     (error "Tu dois fournir un chemin avec :file."))   (let* ((score-name           (or name               (make-auto-section-name file prefix digits)))          (raw-score           (capture-pprint-last-score))          (renamed-score           (replace-def-score-name raw-score score-name)))     (ensure-directories-exist file)     (with-open-file (out file                          :direction :output                          :if-exists :append                          :if-does-not-exist :create)       (when separator         (format out "~%~%;;; ------------------------------------------------------------~%")         (format out ";;; SCORE: ~a~%" score-name)         (when comment-date           (format out ";;; Exported: ~a~%" (get-universal-time)))         (when metadata           (format out ";;; Metadata: ~s~%" metadata))         (format out ";;; ------------------------------------------------------------~%~%"))       (format out "~a~%" renamed-score))     score-name)) #|USAGE Utilisation automatique : (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp") Cela écrit automatiquement : (def-score section001 ...) Puis au prochain appel : (def-score section002 ...) Avec un nom manuel : (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp"  :name 'coda) Avec métadonnées : (save-current-section  :file "/Users/stephaneboussuge/Opusmodus/Scores/my-piece.lisp"  :metadata `((:seed ,*gseed*)              (:tempo 72)              (:material "octatonic"))) |#      Best, Stéphane]]></description><pubDate>Tue, 12 May 2026 20:05:56 +0000</pubDate></item><item><title>A useful function : Export-to-Dorico</title><link><![CDATA[https://opusmodus.com/forums/topic/4111-a-useful-function-export-to-dorico/?do=findComment&comment=14237]]></link><description><![CDATA[Interesting, Stephane. In Musescore 4, in order to work, you must choose the "outdated" format. It brings all. The other brings an error Undefined function om-capi::assistant-view-quickview-pane called with arguments (#&lt;om-capi::assistant-view "Assistant: gen-rotate.pdf" 4150774DE3&gt;).]]></description><enclosure url="https://opusmodus.com/forums/uploads/monthly_2026_05/image.png.09f4dfbc707931f45399da32abd1dd61.png" length="62700" type="image/png"/><pubDate>Tue, 12 May 2026 12:21:10 +0000</pubDate></item><item><title>A useful function : Export-to-Dorico</title><link><![CDATA[https://opusmodus.com/forums/topic/4111-a-useful-function-export-to-dorico/?do=findComment&comment=14236]]></link><description>Here&#x2019;s a more efficient version for handling large files.   Export-to-dorico.lisp</description><pubDate>Mon, 11 May 2026 13:18:19 +0000</pubDate></item><item><title>A useful function : Export-to-Dorico</title><link><![CDATA[https://opusmodus.com/forums/topic/4111-a-useful-function-export-to-dorico/?do=findComment&comment=14235]]></link><description>Hi dear Opusmodus users,  If you&#x2019;re like me and use Dorico to compose with Opusmodus, you&#x2019;ve probably noticed that the dynamics notation like pp, mf, and ff aren&#x2019;t imported into Dorico when you import an XML file from Opusmodus.  Here&#x2019;s a function that solves this problem. It&#x2019;s probably not perfect, but I&#x2019;m sharing it here in case it helps some Opusmodus/Dorico users.  Be careful not to forget to change the path for your own path in the first parameter inside the Lisp document to make it work properly. Best,  St&#xE9;phane</description><pubDate>Mon, 11 May 2026 10:06:51 +0000</pubDate></item><item><title>How to Change some shortcut ?</title><link><![CDATA[https://opusmodus.com/forums/topic/4110-how-to-change-some-shortcut/?do=findComment&comment=14234]]></link><description>Hello,   I&#xB4;d like to create an easier shortcut for midi input, with less keytrokes, because for typing "ctr+shift + m" I need my 2 hands. If I could make an easier shortcut, like shift + m, I could be with one hand at the midi keyboard and other at the computer keyboard.  Please, any help ? Best, Julio</description><pubDate>Sun, 10 May 2026 22:53:54 +0000</pubDate></item><item><title>Diatonic Transposition or "Set Transposition" Function</title><link><![CDATA[https://opusmodus.com/forums/topic/4109-diatonic-transposition-or-set-transposition-function/?do=findComment&comment=14232]]></link><description><![CDATA[Thank you !!  Below is a much better version. In the new version, the function rounds the notes selectively, according to the spelling and there is no need to rewrite-acidentals. If the referential collection have more sharps the function rounds up and vice-versa for the flats. Also, it preserve the spelling of the referential collections (i.e. tonalities).  Best ! Julio  (defun set-transpose (n omn-sequence sets &amp;key (round 'up))   "Transposição diatônica paramétrica com arredondamento seletivo:    'up' para sets com mais sustenidos e 'down' para sets com mais bemóis."   (let* ((dis (disassemble-omn omn-sequence))          (pitches (getf dis :pitch))          (num-bars (length pitches))          (n-list (gen-trim num-bars (if (listp n) n (list n))))          (set-list (gen-trim num-bars sets)))     (labels ((process-pitch (p val-n collection local-round)                (let* ((p-int (pitch-to-integer p))                       (coll-ints (pitch-to-integer (flatten collection)))                       (coll-pcs (sort (remove-duplicates                                         (mapcar (lambda (x) (mod x 12)) coll-ints))                                        #'&lt;))                       (len-coll (length coll-pcs)))                                    (flet ((transpose-single (single-p)                           (let* ((pc (mod single-p 12))                                  (oct (floor single-p 12))                                  ;; 1. Arredondamento seletivo detectado para este bar                                  (r-info (get-rounded-info pc coll-pcs local-round))                                  (rounded-pc (car r-info))                                  (r-oct-shift (cdr r-info))                                  ;; 2. Transposição diatônica por índices                                  (curr-idx (position rounded-pc coll-pcs))                                  (new-idx (+ curr-idx val-n))                                  ;; 3. Ajuste de oitava final (modular)                                  (final-oct-shift (+ r-oct-shift (floor new-idx len-coll)))                                  (final-pc (nth (mod new-idx len-coll) coll-pcs)))                             (+ (* (+ oct final-oct-shift) 12) final-pc))))                                                (if (listp p-int)                            (mapcar #'transpose-single p-int)                            (transpose-single p-int)))))              (get-rounded-info (pc coll direction)                (if (member pc coll)                    (cons pc 0)                    (case direction                      (up (let ((higher (find pc coll :test #'&lt;)))                            (if higher (cons higher 0) (cons (first coll) 1))))                      (down (let ((lower (find pc coll :from-end t :test #'&gt;)))                              (if lower (cons lower 0) (cons (car (last coll)) -1)))))))              (spell-note (int-val bar-set)                "Reconstrói o símbolo OMN com oitava correta (c4=0) e spelling do set."                (let* ((pc (mod int-val 12))                       (oct-suffix (+ 4 (floor int-val 12)))                       (ref-note (find pc (flatten (pitch-to-integer bar-set))                                        :test (lambda (x y) (= x (mod y 12))))))                  (if ref-note                      (let* ((all-notes (flatten bar-set))                             (orig-sym (nth (position ref-note (pitch-to-integer all-notes)) all-notes))                             (pure-name (string-right-trim "0123456789" (symbol-name orig-sym))))                        (intern (format nil "~a~d" pure-name oct-suffix)))                      (car (integer-to-pitch (list int-val)))))))       ;; --- PROCESSAMENTO BAR-A-BAR COM ARREDONDAMENTO SELETIVO ---       (let ((final-pitches              (mapcar (lambda (bar bar-n bar-set)                        (let* ((set-syms (flatten (list! bar-set)))                               ;; A. Conta sustenidos (s) e bemóis (b) no set                               (sharps (count-if (lambda (s) (search "s" (symbol-name s) :test #'char-equal)) set-syms))                               (flats (count-if (lambda (s) (search "b" (symbol-name s) :test #'char-equal)) set-syms))                               ;; B. Define a direção de arredondamento local                               (local-round (cond ((&gt; sharps flats) 'up)                                                  ((&gt; flats sharps) 'down)                                                  (t round))) ;; Mantém o default se empatar                               ;; C. Processa as notas com o arredondamento calculado                               (trans-ints (mapcar (lambda (p) (process-pitch p bar-n bar-set local-round)) bar)))                                                    (mapcar (lambda (item)                                    (if (listp item)                                        (intern (format nil "~{~a~}" (mapcar (lambda (sub) (spell-note sub bar-set)) item)))                                        (spell-note item bar-set)))                                  trans-ints)))                      pitches n-list set-list)))                  (make-omn :pitch final-pitches                   :length (getf dis :length)                   :velocity (getf dis :velocity)                   :articulation (getf dis :articulation))))))   EXAMPLE  (setf temav1 (gen-repeat 3 '((e. c4 mf s d4 -e e4 e. f4 s g4 - a4) (q b4 mf -e c4 e. d4 s e4 - f4) (q g4 mf -e a4 e. b4 s c4 - d4))))  (setf sets (expand-tonality '((e4 major) (ab4 major) (c4 major) (c4 diminished1))))  (set-transpose 0 temav1 sets)  ((e. cs4 mf s ds4 -e e4 e. fs4 s gs4 - a4) (q bb4 mf -e c4 e. db4 s eb4 - f4) (q g4 mf -e a4 e. b4 s c4 - d4) (e. c4 mf s ds4 -e e4 e. fs4 s g4 - a4) (q b4 mf -e cs4 e. ds4 s e4 - fs4) (q g4 mf -e ab4 e. bb4 s c4 - db4) (e. c4 mf s d4 -e e4 e. f4 s g4 - a4) (q c5 mf -e c4 e. ds4 s e4 - fs4) (q gs4 mf -e a4 e. b4 s cs4 - ds4))  (set-transpose -3 temav1 sets)  ((e. gs3 mf s a3 -e b3 e. cs4 s ds4 - e4) (q f4 mf -e g3 e. ab3 s bb3 - c4) (q d4 mf -e e4 e. f4 s g3 - a3) (e. g3 mf s as3 -e c4 e. cs4 s ds4 - e4) (q fs4 mf -e gs3 e. a3 s b3 - cs4) (q db4 mf -e eb4 e. f4 s g3 - ab3) (e. g3 mf s a3 -e b3 e. c4 s d4 - e4) (q g4 mf -e g3 e. as3 s c4 - cs4) (q ds4 mf -e e4 e. fs4 s gs3 - a3))]]></description><pubDate>Thu, 07 May 2026 20:24:17 +0000</pubDate></item><item><title>Diatonic Transposition or "Set Transposition" Function</title><link><![CDATA[https://opusmodus.com/forums/topic/4109-diatonic-transposition-or-set-transposition-function/?do=findComment&comment=14231]]></link><description>Thanks Julio. good diatonic transpose function.</description><pubDate>Thu, 07 May 2026 19:46:32 +0000</pubDate></item><item><title>Csound-Opusmodus-Framework</title><link><![CDATA[https://opusmodus.com/forums/topic/4102-csound-opusmodus-framework/?do=findComment&comment=14230]]></link><description>Hi there,  I&#x2019;ve just updated the framework.  Here&#x2019;s a short video example taken during testing.   

	
	CSFrameworkDemo2.mp4</description><pubDate>Thu, 07 May 2026 19:35:44 +0000</pubDate></item><item><title>Diatonic Transposition or "Set Transposition" Function</title><link><![CDATA[https://opusmodus.com/forums/topic/4109-diatonic-transposition-or-set-transposition-function/?do=findComment&comment=14229]]></link><description>Well done, Julio.  Jesper</description><pubDate>Thu, 07 May 2026 10:48:19 +0000</pubDate></item><item><title>Diatonic Transposition or "Set Transposition" Function</title><link><![CDATA[https://opusmodus.com/forums/topic/4109-diatonic-transposition-or-set-transposition-function/?do=findComment&comment=14228]]></link><description><![CDATA[Dear All,  Here are a version for a diatonic (or all purpose set-transpose) function that rounds material around a collection  used as reference). Please, Let me know if you find bugs.   Best,  Julio  (defun set-transpose (n omn-sequence sets &amp;key (round 'up))   "Realiza transposição diatônica por N passos em coleções de referência.    Arredonda notas fora do set para cima ou para baixo conforme :round."   (let* ((dis (disassemble-omn omn-sequence))          (pitches (getf dis :pitch))          (num-bars (length pitches))          ;; Alinha N e os Sets ao número de sublistas (compassos)          (n-list (gen-trim num-bars (if (listp n) n (list n))))          (set-list (gen-trim num-bars sets)))     (labels ((process-pitch (p val-n collection)                (let* ((p-int (pitch-to-integer p))                       ;; Normaliza a coleção para pitch-classes (0-11) ordenadas                       (coll-pcs (sort (remove-duplicates                                         (mapcar (lambda (x) (mod x 12))                                                 (flatten (pitch-to-integer collection))))                                        #'&lt;))                       (len-coll (length coll-pcs)))                                    (flet ((transpose-single (single-p)                           (let* ((pc (mod single-p 12))                                  (oct (floor single-p 12))                                  ;; 1. Arredondamento com info de oitava                                  (r-info (get-rounded-info pc coll-pcs round))                                  (rounded-pc (car r-info))                                  (r-oct-shift (cdr r-info))                                  ;; 2. Localiza índice e aplica N passos diatônicos                                  (curr-idx (position rounded-pc coll-pcs))                                  (new-idx (+ curr-idx val-n))                                  ;; 3. Calcula deslocamento de oitava final (wrap-around)                                  (final-oct-shift (+ r-oct-shift (floor new-idx len-coll)))                                  (final-pc (nth (mod new-idx len-coll) coll-pcs)))                             ;; 4. Reconstrói o pitch mantendo o registro original                             (+ (* (+ oct final-oct-shift) 12) final-pc))))                                                ;; Suporte para notas individuais ou acordes                        (if (listp p-int)                            (mapcar #'transpose-single p-int)                            (transpose-single p-int)))))              (get-rounded-info (pc coll direction)                ;; Retorna (rounded-pc . octave-shift)                (if (member pc coll)                    (cons pc 0)                    (case direction                      (up (let ((higher (find pc coll :test #'&lt;)))                            (if higher                                 (cons higher 0)                                (cons (first coll) 1)))) ;; Wrap up: vai p/ próx oitava                      (down (let ((lower (find pc coll :from-end t :test #'&gt;)))                              (if lower                                  (cons lower 0)                                  (cons (car (last coll)) -1)))))))) ;; Wrap down: oitava anterior       ;; Mapeamento bar-a-bar       (let ((new-pitches (mapcar (lambda (bar bar-n bar-set)                                    (mapcar (lambda (p) (process-pitch p bar-n bar-set)) bar))                                  pitches n-list set-list)))                  ;; Remontagem OMN final preservando os outros parâmetros         (make-omn :pitch (integer-to-pitch new-pitches)                   :length (getf dis :length)                   :velocity (getf dis :velocity)                   :articulation (getf dis :articulation))))))   EXAMPLE  (setf temav1 '((e. a4 mf s -e c5 e. f4 s g4 - a4) (q c5 mf -e bb4 e. eb5 s ab4 - eb5)  (q cs5 mf -e e5 e. as4 s b4 - cs5)))   (setf sets (expand-tonality '((ab4 major) (c4 major))))  (set-transpose -4 temav1 sets :round 'down)   ((e. cs4 mf s -e f4 e. bb3 s c4 - cs4) (q f4 mf -e d4 e. g4 s c4 - g4) (q g4 mf -e gs4 e. eb4 s - g4))  (set-transpose -4 temav1 sets :round 'up)  ((e. eb4 mf s -e f4 e. bb3 s c4 - eb4) (q f4 mf -e e4 e. a4 s d4 - a4) (q g4 mf -e bb4 e. eb4 s f4 - g4))   (setf sets (expand-tonality '((ab4 messiaen-mode2) (c4 major))))  (set-transpose -4 temav1 sets :round 'up)]]></description><pubDate>Wed, 06 May 2026 19:58:50 +0000</pubDate></item><item><title>Enhancement request for MusicXML export: adding explicit sound tags for playback compatibility</title><link><![CDATA[https://opusmodus.com/forums/topic/4108-enhancement-request-for-musicxml-export-adding-explicit-sound-tags-for-playback-compatibility/?do=findComment&comment=14227]]></link><description>Hello,  I would like to request an enhancement regarding the MusicXML export engine to improve playback compatibility with MuseScore 4 and other notation software. Currently, when exporting scores from Opusmodus that include articulations like pizzicato and arco, the visual text appears correctly but the playback does not switch automatically in MuseScore. After extensive testing and discussion with the MuseScore community, it has been identified that MuseScore&#x2019;s import engine requires an explicit sound tag, such as sound pizzicato="yes", within the MusicXML code to trigger a playback change. While other software like Sibelius or StaffPad can "infer" the sound from the words tag, MuseScore follows a literal interpretation and ignores the instruction if the explicit sound tag is missing. This creates a significant bottleneck in the workflow, especially for those of us using Opusmodus for automated score generation, as every articulation must be manually re-mapped after each import. I am asking if it would be possible to update the Opusmodus export engine to include these explicit sound tags alongside the textual directions. This would ensure seamless interoperability and a much smoother transition from algorithmic composition to final notation and playback across all platforms.  Thank you.</description><pubDate>Tue, 05 May 2026 08:16:17 +0000</pubDate></item><item><title>Exciting News for Opusmodus Users: Bundle Discounts for Owned Courses!</title><link><![CDATA[https://opusmodus.com/forums/topic/4107-exciting-news-for-opusmodus-users-bundle-discounts-for-owned-courses/?do=findComment&comment=14225]]></link><description>Dear Opusmodus Community, We're thrilled to announce a new feature that many of you have been asking for! You can now purchase our course bundles with automatic discounts applied for any courses you already own. When you buy a bundle, the price will be intelligently adjusted to reflect the value of the courses you've previously acquired, ensuring you only pay for what's new to you. This means more flexibility and even greater value as you continue your learning journey with Opusmodus. Head over to our Bundles section to see how this new system benefits you! CPW Bundles Happy Composing! The ComposerWorkshop Team</description><pubDate>Sun, 03 May 2026 06:48:01 +0000</pubDate></item><item><title>Poly-Demix</title><link><![CDATA[https://opusmodus.com/forums/topic/4106-poly-demix/?do=findComment&comment=14224]]></link><description>Dear All,   An useful function do make various pitch-demix operations at once.  (defun poly-demix (n-list mat-omn)   "Extrai as vozes especificadas em N-LIST de uma sequ&#xEA;ncia OMN     e as combina em um &#xFA;nico fluxo polif&#xF4;nico."   (let* (;; 1. Garante que n-list seja uma lista e extrai cada voz          (extracted-voices (mapcar #'(lambda (n)                                         (pitch-demix n mat-omn))                                     (list! n-list))))          ;; 2. Aplica merge-voices sobre a lista de vozes extra&#xED;das     (apply #'merge-voices extracted-voices)))   (setf mat-omn '((e. g2bb3d4f4a4 mf s -e e c4c5c5 e. g2bb3c4d4f4 s g3g4g4 -s s g2bb3d4f4a4) (q bb2db4f4ab4c5 mf -e e bb3bb4bb4 e. eb4eb5eb5 s ab3ab4ab4 -s s bb2db4ab4c5eb5)))    (poly-demix '(1 2 5) mat-omn)   ((e. g2f4a4 s -e c5 e. g2d4f4 s g4 - g2f4a4) (q bb2ab4c5 -e bb4 e. eb5 s ab4 - bb2c5eb5))  Best, Julio</description><pubDate>Sun, 03 May 2026 00:17:40 +0000</pubDate></item><item><title>Windows Users - Who is using CLM with audio functions ?</title><link><![CDATA[https://opusmodus.com/forums/topic/4105-windows-users-who-is-using-clm-with-audio-functions/?do=findComment&comment=14223]]></link><description>Dear Opusmodus Windows Users  I can&#xB4;t use here the CLM functions (with audio instrumentos and functions). Are you having trouble with this in Windows 11 ? I can run sound samples like in the post below, buto no success with CLM.  Any help or comments ? Thanks !</description><pubDate>Sat, 25 Apr 2026 16:57:43 +0000</pubDate></item><item><title>Loop Midi BUG due to Windows Update</title><link><![CDATA[https://opusmodus.com/forums/topic/4103-loop-midi-bug-due-to-windows-update/?do=findComment&comment=14222]]></link><description>Hi Julio, Thanks for the information. Lately I've been working on my Mac and hadn't noticed that my MIDI ports on my PC were no longer working with Loopmidi. Its window displayed correctly with the MIDI ports, but they had disappeared from the system. And indeed, my latest Windows 11 update caused me some problems, including being without internet access for a few hours before I found a solution. Anyway, the two commands net stop midisrv and net start midisrv in the terminal solved the problem. So, a big thank you.  Best regards,  Didier</description><pubDate>Tue, 21 Apr 2026 13:54:27 +0000</pubDate></item><item><title>Opusmodus 4.0.31105 Update</title><link><![CDATA[https://opusmodus.com/forums/topic/4104-opusmodus-4031105-update/?do=findComment&comment=14221]]></link><description>Update: Wave Functions, Monophonic Analysis, and Harmonics  The wave-function system has been substantially revised and extended. Wave generators now support a clearer and more complete modulation model:  :fm for frequency modulation :am for amplitude modulation :phase-scaling for per-sample phase scaling This replaces the earlier :modulation keyword. :phase-distortion for phase remapping within the waveform cycle  These controls are now available consistently across the main wave families, including the generator, additive, modulatory, and half-wave functions. The Pulse family has also been completed and brought into line with the rest of the system.   The Monophonic Analysis system has now been completed as a full function family, with consistent documentation in the new Markdown format. The analysis set is organised as a unified analytical environment, allowing rhythmic, melodic, harmonic, cadential, formal, textural, density, expressive, and related perspectives to be read together within a single report structure.  To test the analysis functions, download the file below and place it in the ~/Opusmodus/Media/Musicxml folder. This will allow you to evaluate the examples in the documentation directly.  Webern-Op.5.xml   The harmonics function has also been enhanced. Its coefficient behaviour now follows the correct spectral model, rather than simple post-scaling, and the function now supports additional control over partial selection, including patterned partial-nth input and the new :size option for result-length handling.  Best wishes, Janusz</description><pubDate>Sun, 19 Apr 2026 11:40:58 +0000</pubDate></item><item><title>Loop Midi BUG due to Windows Update</title><link><![CDATA[https://opusmodus.com/forums/topic/4103-loop-midi-bug-due-to-windows-update/?do=findComment&comment=14220]]></link><description>Dear Windows Users,  After the Windows 11 26200.7840 Security Update (February 11th 2026), the virtual ports are not showing in windows, only the hardware ones.  At first I though it was related to Opusmodus update, but it&#xB4;s a windows update BUG. Here is the solution.  Close all MIDI apps Open Windows Terminal as an Administrator (&#x201C;run as administrator&#x201D;) Type "net stop midisrv" After that completes, type "net start midisrv" Start up the app you want to use with MIDI  Here is a video:  Best, Julio</description><enclosure url="https://opusmodus.com/forums/uploads/monthly_2026_04/image.png.74c7e5cbb4254bccf95ceaccaf968baa.png" length="51442" type="image/png"/><pubDate>Sat, 18 Apr 2026 15:33:50 +0000</pubDate></item><item><title>Csound-Opusmodus-Framework</title><link><![CDATA[https://opusmodus.com/forums/topic/4102-csound-opusmodus-framework/?do=findComment&comment=14219]]></link><description>Hi dear Opusmodus friends,  I&#x2019;m sharing my personal framework for generating algorithmically Csound files directly from Opusmodus.  I&#x2019;m sharing it &#xAB; as is &#xBB; and I know it can be improved, but it works well for my actual use. You can use it as a starting point for building your own framework.  There are some personal choices in the design of this framework, such as a very simple signal flow. After testing more complex routing like Csound mixers and send FX, I decided to return to a simpler workflow that aligns more closely with my usual Csound practice.  Disclaimer: This tool is intended for individuals who are already proficient in Csound.  Hope you will enjoy it !  GitHubGitHub - Nanotk303/csound-opusmodus-frameworkContribute to Nanotk303/csound-opusmodus-framework development by creating an account on GitHub.</description><pubDate>Fri, 17 Apr 2026 14:04:10 +0000</pubDate></item><item><title>tendencies and vector-smooth</title><link><![CDATA[https://opusmodus.com/forums/topic/4100-tendencies-and-vector-smooth/?do=findComment&comment=14215]]></link><description><![CDATA[Hello, when using vector-smooth my tendencies start around 0.1 but end &gt;0.2 (should be around 0.1 as well) How can I prevent that?  (setf tend-list
'(0.1 0.4 0.2 0.6 0.5 0.5 0.9 0.7 0.7 1 0.9 1.2 0.9 0.9 0.5 0.5 0.6 0.2 0.2 0.1))

(list-plot
(setf dur-mults
(loop for i in durlens
with seed = (init-seed 123)
collect
(vector-smooth 0.3
(gen-tendency i tend-list :variance 0.2))))
:zero-based t :join-points t) Thanks for help, Achim]]></description><pubDate>Mon, 13 Apr 2026 17:35:13 +0000</pubDate></item><item><title>Luminous Fracture 2</title><link><![CDATA[https://opusmodus.com/forums/topic/4099-luminous-fracture-2/?do=findComment&comment=14214]]></link><description>A test of my (work in progress) Csound/Opusmodus framework.   Luminous_Fractures_v2.wav LuminousFracture2.pdf Luminous_Fractures_v2.csd 
LuminousFractures2.opmo</description><pubDate>Mon, 13 Apr 2026 16:12:12 +0000</pubDate></item><item><title>All previous rewrite functions used together</title><link><![CDATA[https://opusmodus.com/forums/topic/4098-all-previous-rewrite-functions-used-together/?do=findComment&comment=14212]]></link><description>Thanks, Jesper I did not remember that one. Mine have the advantage of having the embedded span, so we can have a more elegant code. Best, Julio</description><pubDate>Sat, 11 Apr 2026 14:17:32 +0000</pubDate></item><item><title>All previous rewrite functions used together</title><link><![CDATA[https://opusmodus.com/forums/topic/4098-all-previous-rewrite-functions-used-together/?do=findComment&comment=14211]]></link><description><![CDATA[Hi Julio. You could get the same results with omn-replace I think.  Jesper  ;; Exemplo 1: Dinâmicas simples (setf expressao-omn '((s eb4 d4 e a4 -s s eb4 tie) (h eb4 a4 -s eb4 d4 -s tie) (e. d4 a4 eb4 d4) (-q e f4 s c5 qs fs4))) (rewrite-dyn expressao-omn '(p mf ff)) ;;slightly different  (omn-replace :velocity '(p mf ff) expressao-omn) ;; with span the same (omn-replace :velocity (span expressao-omn '(p mf ff)) expressao-omn) (rewrite-dyn expressao-omn '(ff &gt; p p&lt; ff&gt; pp ff p p&lt; ff p mf ppp p &lt; ff)) (omn-replace :velocity (span expressao-omn '(ff &gt; p p&lt; ff&gt; pp ff p p&lt; ff p mf ppp p &lt; ff)) expressao-omn)]]></description><pubDate>Sat, 11 Apr 2026 08:03:49 +0000</pubDate></item><item><title>All previous rewrite functions used together</title><link><![CDATA[https://opusmodus.com/forums/topic/4098-all-previous-rewrite-functions-used-together/?do=findComment&comment=14210]]></link><description><![CDATA[Ciao, Opusmoders   All previous rewrite functions used in conjunction for transformations.  Ciao !  https://opusmodus.com/forums/topic/4097-rewrite-len-function/#comment-14209  (setf expressao-omn '((s eb4 d4 e a4 -s s eb4) (h eb4 a4 -s eb4 d4 -s)                       (e. d4 a4 eb4 d4)                       (-q e f4 s c5 qs fs4)))     (rewrite-pit  (rewrite-dyn  (rewrite-len expressao-omn  '(h -e s q -h q -q s s s))  '(pp&lt; ff mf fff p &lt; &lt; fff ppp fff mf fff p)) '(c4 g5))       https://opusmodus.com/forums/topic/4097-rewrite-len-function/#comment-14209]]></description><enclosure url="https://opusmodus.com/forums/uploads/monthly_2026_04/image.png.1c1654b4a3d931779f730579ea1de1d2.png" length="47898" type="image/png"/><pubDate>Sat, 11 Apr 2026 02:24:47 +0000</pubDate></item><item><title>rewrite-len function</title><link><![CDATA[https://opusmodus.com/forums/topic/4097-rewrite-len-function/?do=findComment&comment=14209]]></link><description>Last one... Time to go to bed in Brasil  Function to rewrite lengths  BEst, Julio  (defun rewrite-len (expressao-omn new-lengths-list)   "Substitui os comprimentos (lengths) de uma express&#xE3;o OMN por uma lista fornecida,     repetindo-a ciclicamente e mantendo a estrutura de sublistas original."   (let* ((dis (disassemble-omn expressao-omn))          ;; Desmonta a express&#xE3;o original [2]          (old-pit (getf dis :pitch))                    ;; Extrai as alturas [4]          (old-vel (getf dis :velocity))                 ;; Extrai as velocidades [4]          (old-art (getf dis :articulation))             ;; Extrai as articula&#xE7;&#xF5;es [4]                    ;; 1. Mapeia a estrutura original (quantidade de eventos por sublista)          ;; Captura o n&#xFA;mero de elementos r&#xED;tmicos em cada compasso [3, 5]          (structure (mapcar #'length (getf dis :length)))           (total-events (apply #'+ structure))           ;; Soma total de eventos [6]                    ;; 2. Gera a sequ&#xEA;ncia r&#xED;tmica c&#xED;clica com base no total de eventos          ;; gen-trim estende a lista do usu&#xE1;rio para preencher todos os espa&#xE7;os [3, 7]          (new-flat-lengths (gen-trim total-events new-lengths-list))                    ;; 3. Re-organiza os novos ritmos na estrutura de sublistas original [3, 8]          (new-structured-lengths (gen-divide structure new-flat-lengths)))     ;; 4. Remonta o objeto OMN completo com os par&#xE2;metros preservados [3, 4]     (make-omn :pitch old-pit               :length new-structured-lengths               :velocity old-vel               :articulation old-art)))  ;;USE   (setf expressao-omn '((s eb4 d4 e a4 -s s eb4) (h eb4 a4 -s eb4 d4 -s)                       (e. d4 a4 eb4 d4)                       (-q e f4 s c5 qs fs4))) (omn-to-time-signature (rewrite-len expressao-omn '(h -e s q -h q -q s s s)) '(3 4))  ;;RESULT  ((h eb4 mf -e s d4 a4 tie) (e. a4 -h s eb4 mf tie) (e. eb4 mf -q s a4 eb4 d4 e eb4 tie) (q. eb4 -e s d4 mf e. a4 tie) (s a4 -h e. f4 mf tie) (s f4 mf -q s c5 fs4))</description><pubDate>Sat, 11 Apr 2026 02:14:20 +0000</pubDate></item><item><title>rewrite-pit function</title><link><![CDATA[https://opusmodus.com/forums/topic/4096-rewrite-pit-function/?do=findComment&comment=14208]]></link><description><![CDATA[Hey, Opusmoders  Here is one more function in the style of the previous one (rewrite-dyn). This time to rewrite pitches.   (defun rewrite-pit (expressao-omn pitch-list)   "Substitui as alturas de uma expressão OMN por uma lista customizada,     fazendo a repetição cíclica se a lista for menor que o número de notas."   (let* ((dis (disassemble-omn expressao-omn))          ;; Desmonta a expressão [3, 6]          (pitches (getf dis :pitch))                    ;; Extrai alturas atuais          (lengths (getf dis :length))                  ;; Extrai durações (inclui rests) [7]          (velocities (getf dis :velocity))              ;; Extrai dinâmicas [8]          (articulations (getf dis :articulation))        ;; Extrai articulações/ties [9, 10]          ;; 1. Mapeia a quantidade de notas em cada sublista/compasso          (counts (mapcar #'length pitches))             ;; [2, 5]          ;; 2. Calcula o total de eventos de nota para o preenchimento          (total-notes (apply #'+ (flatten counts)))     ;; [2, 11]          ;; 3. Gera a lista de novas alturas repetindo o padrão do usuário          (flat-pitches (gen-trim total-notes pitch-list)) ;; [2, 4]          ;; 4. Redistribui as alturas na estrutura de sublistas original          (structured-pitches (gen-divide counts flat-pitches))) ;; [2, 5]          ;; 5. Remonta o objeto OMN completo preservando os demais parâmetros     (make-omn :pitch structured-pitches               :length lengths               :velocity velocities               :articulation articulations)))            ;; [2, 3]  ;;USE   (setf expressao-omn '((s eb4 d4 e a4 -s s eb4 tie) (h eb4 a4 -s eb4 d4 -s tie)                 (e. d4 a4 eb4 d4)                 (-q e f4 s c5 qs fs4)))  Using both rewrite-dyn and rewrite-pit   (rewrite-pit expressao-omn '(c4 e4 d4 c4 c4)) (rewrite-dyn (rewrite-pit expressao-omn '(c4 e4 d4 c4 c4)) '(ff &gt; p p&lt; ff&gt; pp ff p p&lt; ff p mf ppp p &lt; ff))  Best !!  Julio Herrlein]]></description><pubDate>Sat, 11 Apr 2026 01:24:46 +0000</pubDate></item></channel></rss>
