Skip to content
View in the app

A better way to browse. Learn more.

Opusmodus

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

User Extensions Source Code

Here you can share your functions source code

  1. Hello everyone, I’d like to share a first experimental version of a small project I’ve been developing around Opusmodus: Livecode. GitHub: https://github.com/Nanotk303/Livecode Livecode is a Common Lisp live-coding prototype for Opusmodus / LispWorks. The idea is to evaluate Lisp/OMN expressions on the fly, in a pattern-based live-coding spirit, while keeping an idiomatic Lisp syntax and a direct connection with the Opusmodus workflow. This is an alternative directly accessible by code to the Opusmodus Livecoding Instrument. Minimal example: (load "/path/to/Livecode/load.lisp") (setf p1 '((q c4 e d4 e e4 q g4))) (live '((inst1 :omn p1 :port "Bus 1" :channel 1)) :t…

  2. Hi dear Opusmodus users, If you’re like me and use Dorico to compose with Opusmodus, you’ve probably noticed that the dynamics notation like pp, mf, and ff aren’t imported into Dorico when you import an XML file from Opusmodus. Here’s a function that solves this problem. It’s probably not perfect, but I’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éphane

  3. Dear all, I really love Opusmodus and VCV Rack. Opusmodus has wonderful microtonal capabilities, and it was a shame not to be able to use them in conjunction with the amazing modular synth VCV Rack. I built a VCV Rack module as a MIDI-to-CV input with MTS support. Now you can drive VCV Rack from Opusmodus with full tonality support. Here’s a short video showing it in action. Sorry for the small audio glitches — my VCV Rack was not optimized at the time. You can find the code on my GitHub if you’d like to compile it for your own computer. All the best, Stéphane GitHubGitHub - Nanotk303/VCVRackContribute to Nanotk303/VCVRack development by creating an account on GitHub. …

    • 0 replies
    • 152 views
  4. Started by Stephane Boussuge,

    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 :…

    • 0 replies
    • 190 views
  5. Hi dear Opusmodus friends, I’m sharing my personal framework for generating algorithmically Csound files directly from Opusmodus. I’m sharing it « as is » 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 ! GitHu…

  6. Started by AM,

    A special form of BINARY LAYERS: each new list is applied to the 1-values of the previous list, i.e., added. The next generation is then applied to 2, the next to 3, and so on. Like structure on structure on structure. I programmed it to read a kind of sample matrix, which results in a continuous replacement process that happens generatively, kind of a tree structure. Bildschirmaufnahme 2026-04-05 um 18.59.59.mov (defun binary-layers (seqs) (append (list (car seqs)) (loop repeat (1- (length seqs)) with seq = (car seqs) with seqcnt = 1 with interf = 1 collect (setf seq (loop for i in seq …

  7. Started by AM,

    I still have no idea what I could use this for in OPMO. In Max/MSP, it has interesting und usefull applications in the area of corpus-sampling. I didn’t write this code myself (Copilot), but it seems to fit. GeeksforGeeksK-Nearest Neighbor(KNN) Algorithm - GeeksforGeeksYour All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, co;; kNN implementation in Common Lisp with weighted voting ;; ------------------------------------------------------- ;; This program classifies a new data point based on the k nearest neighbors ;; from a given…

    • 0 replies
    • 199 views
  8. Started by AM,

    Make a length sequence integer-valued using the least common multiple, then apply the proportions to gen-length. Another kind of augmentation/diminution. (defun ratios-to-integers (lst) (let* ((lcm (reduce #'lcm (denominators lst)))) (mapcar (lambda (x) (* x lcm)) lst))) ;; a rhythm to integers via LCM (list-plot (ratios-to-integers '(1/12 1/16 1/20 1/24 1/28)) :join-points t) ;; gen same proportions with 1/32 (list-plot (gen-length (ratios-to-integers '(1/12 1/16 1/20 1/24 1/28)) 1/32) :join-points t) ;; very strange proportions back to gen-length 1/32 (gen-length (ratios-to-integers '(1/12 -3/12 5/20 1/16 -1/20 1/24…

  9. Started by Stephane Boussuge,

    Hi, I’ve experimented with Opusmodus GPT and created this tool for my personal use. However, I thought it might be helpful for some of you, so I’m sharing it. GEN-SLONIMSKY-PATTERNSynopsis (gen-slonimsky-pattern octaves divisions &key interpolation infrapolation ultrapolation root direction dedupe dedupe-mode dedupe-tolerance limit-to-octave trim-with-gen-trim interpolation-permutation remove-consecutive-repeats transpose rotate)DescriptionGEN-SLONIMSKY-PATTERN generates a Slonimsky-like procedural pitch pattern as an Opusmodus pitch list. Conceptually, the function builds a chain of “principal tones” across a span of octaves (co…

  10. Started by AM,

    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

  11. Started by Stephane Boussuge,

    Hi folks, here's a function I find useful for my work and sharing it here. This is an anti oscillation function to remove aba type patterns when working on algorithmically generated material. (defun anti-oscil (lst) "Supprime les éléments formant des oscillations de type x _ x dans LST. Exemple : (anti-oscil '(a b a a c)) => (a b c)" (labels ((rec (remaining result) (if (null remaining) ;; Plus rien à traiter, on renvoie le résultat tel quel result (let ((x (car remaining))) (if (and (>= (length result) 2) (equal x (nth (- (length result) 2) result))) ;…

  12. Started by MarkTownsend,

    I'm new to Opusmodus and Lisp programming. It will be awhile before I can implement some of the ideas that I have. In the meantime I've discovered that the Opusmodus GPT can do some programming for me. Here are two functions that it generated for me. A one dimensional totalistc CA with an arbitrary number of states, and a function to generate random rule sets. It took some prompting to get them to this stage. Totalistic CA rules are symmetrical, so if your initial state is a palindrome all generations will be. (defun totalistic-cellular-automaton (states rules initial-state generations) "Generates a multi-state totalistic cellular automaton. STATES: the num…

  13. Started by Stephane Boussuge,

    here's a useful function (for me at least) who use unfold internally to apply some variations from a reservoir to some OMN material. This function can surely be much improved (adding seed etc...) but actually I'm using it like this... Example of usage is at the end of the function definition file, a short string quartet example. ;;; OMN-RND-VAR ;;; Base sur ma vieille pratique ;;; avec omn-rnd-variations1. (defun generate-variation (max-length num-measures) "Generate a sorted list of unique random numbers based on num-measures." (sort-asc (find-unique (rnd-number num-measures 1 max-length :norep t)))) (defun omn-rnd-var (variations measures omn-sequen…

  14. Started by AM,

    kind of ... "position-insert" with OVERWRITE (defun position-insert-seq (&key alist insert item) (let ((pos (car (position-item item alist)))) (position-replace (gen-integer pos (+ pos (1- (length insert)))) insert alist))) (setf alist '(0 0 0 0 0 0 1 0 2 0 0 0 3 5 7)) (setf insert '(a b c d)) (position-insert-seq :alist '(0 0 0 0 0 0 1 0 2 0 0 0 3 5 7) :insert '(a b c d) :item 2) => (0 0 0 0 0 0 1 0 a b c d 3 5 7)

    • 0 replies
    • 1.6k views
  15. Edit: Thanks to Janusz and Stephane I could correct and improve the function . See below. This is an earlier version: For the fun of it and hopefully some use I wrote this simple function: ;;;;;;;;; (defun rk_rnd-order-omn (inomnl &key (exclude nil) seed (flat nil)) "to exclude use l for :length, p for :pitch, v for :velocity; d for :duration, a for :articulation, leg for :leg, ped for :ped; i.e :exclude '(p leg) To be even more random flatten the omn with :flat t" (let* ( (state *init-seed* ) (vseed (rnd-seed seed)) (omnl (if flat (flatten inomnl) inomnl)) (len (if (member…

  16. Started by AM,

    i like the concept of "brownian bridge" to produce complex curves from a to b, but not completely randomized or controlled. in the video you see all the generations for one evaluation... how it could sound - mapped on different tonalities Brownsche Brücke – Wikipedia DE.WIKIPEDIA.ORG for understanding in OPMO: axiom: start end (50 23) gen1 => 1 step (50 8 23) gen2 => 3 steps (50 15 8 -3 23) gen3 => 7 steps (50 40 15 13 8 -14 -3 29 23) gen4 => 15 steps (50 58 40 33 15 22 13 4 8 4 -14 -16 -3 1…

  17. Started by opmo,

    The ITERATE library is build in version 1.2.20405, therefore there is no need to load the library with QUICKLISP anymore. About ITERATE library: https://common-lisp.net/project/iterate/

  18. Started by LdBeth,

    Inspired by the example from this thread but I could not find the related function been shipped with the OM application. The code requires OM3.0 because of LispWorks specific API but the concept should be simple enough to be implemented in Clozure CL. After some midi objects has been compiled and inserted to the playlist one can use run-playlist to start play. While it is still playing one can feed more midi objects queued to the playlist. When the playlist is empty and after the specified seconds of timeout, the player process would exit. (setq midi1 (compile-score 'score1)) (setq midi2 (compile-score 'score2)) (setq midi3 (compile…

  19. Started by AM,

    ;; 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)) …

  20. In many scores, Pierre Boulez use a lot of accacciatura or appoggiatura , for exemple like in Dérive (1984), a score composed for and based on the name SACHER (famous hexachord used also in "Message esquisse"). Here's a function to help to add such appoggiature in your score based on a list of rhythmic values. There is a draft doc in French joined to the function definition. Hope it could be useful for some of us and may be improved and better coded and refined. My best to all of Opmo users. SB. gen-ornament.lisp gen-ornament.rtfd.zip

  21. Started by Stephane Boussuge,

    Hi, here's a function i've made for my own usage and i think could be useful for others. It is a split point function which divide an OMN flux according to a list of split points. Attached, you will find the French doc of the function 😉 ;;; SPLIT-POINT ;;; SB. 2020 ;;; Fonction utile pour séparer les 2 mains pour une partie de piano ;;; renvoie une liste de listes (defun split-point (split-points omn-seq) (do-verbose ("split-point") (let* ( (spltconvert (if (numberp (car split-points)) split-points (pitch-to-integer split-points))) (spltp (gen-trim (length omn-seq) splt…

  22. Started by AM,

    here is a function to MAP a 2d-field to chords (via intervals) // an idea i got from "Nierhaus - Algorithmic Composition" - Cellular Automata (p. 198). so you can "import/map" some GAME-OF-LIFE configurations or whatelse (a pixel photo?) // the PITCH-MAPPING is like in Miranda's CAMUS. ;; FUNCTION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun 2d-field-to-chord (matrix &key (start 'c4) (merge-chords nil)) (let* ((int-horizontal (x+b (loop for x in (loop for i in matrix collect (position-item 1 i)) when (not (null x)) collect x) …

  23. Started by Stephane Boussuge,

    Hi, here's a function I've made for my personal usage. May be it could be useful for some users... Best Stéphane ;;;=================================== ;;; PITCH-TRAJECTORY ;;;=================================== ;;; SB 1.11.21 ;;;=================================== (defun pitch-trajectory (nbpitch range tendency &key (variance 0.5) (type :around) (quantize 1/2) (smooth 1) filter-repeat seed …

  24. Started by AM,

    here a function... to barraqué's techniques (defun serie-proliferantes (row) (let* ((ri_row (pitch-invert (gen-retrograde row))) (row (loop for z in (loop for x in (pitch-to-midi ri_row) collect (or (position x (pitch-to-midi row)) (position (- x 12) (pitch-to-midi row)) (position (+ x 12) (pitch-to-midi row)))) collect (nth z ri_row)))) row)) (serie-proliferantes '(c5 ab4 g4 db5 e4 d4 bb4 eb4 b4 f4 fs4 a4)) => (fs…

  25. Started by Wim Dijkgraaf,

    I'm new to the OpusModus IDE and project/file structure. As a senior programmer my version control system (mainly GIT and TFVC) with a proper version control / branching strategy is an import friend. Any ideas/experience in applying version control on OpusModus scripts while composing? Big hug, Wim Dijkgraaf


Copyright © 2014-2026 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

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.