Jump to content


  • Posts

  • Joined

  • Last visited

Everything posted by torstenanders

  1. > There are no restriction of any kind. Indeed, arbitrary Lisp libraries can be loaded into Opusmodus, which is great. I was ported over a number of libraries from other systems this way (some from OpenMusic as well, though not shared yet, as their development status is even more messy). > Opusmodus makes it difficult to use independent Lisp packages Just for completeness, I was talking here not about external Lisp libraries, but Lisp packages. Perhaps I was incorrect above, or at least not up to date. Sorry: this now gets a bit geeky. Are meanwhile *all* user-facing Opusmodus functions and also *all* symbols of its score format external symbols in that package? If so, then my comment above is indeed incorrect, and one could combine the external symbols of Opusmodus with the symbols of other packages in a clean separate package that would then represent Opusmodus extended with some other library in a clean way (and symbol shadowing could be controlled if necessary). At the time I (started to) define the tot library, the above was not the case, and I felt forced to define all my extensions directly within the Opusmodus package. Such package bloating is something I would usually try to avoid.
  2. > Possible workaround for now: remove the source file tuning.lisp and thus all microtonal stuff I should perhaps add that you remove a source file from the tot package by removing or commenting out the relevant line (line 25) in its defsystem statement. Hope this helps...
  3. > the problem is here that Opusmodus makes it difficult to use independent Lisp packages In Opusmodus' defence, this software tries to simplify using Lisp for non-programmers. This design goal somewhat conflicts with the design philosophy of Common Lisp itself to be a programming environment geared particularly towards large-scale and complex programming projects (in contrast to, say, Scheme or Python). Opusmodus therefore simplified a number aspects of Lisp including the discouragement of Lisp packages for Opusmodus programs.
  4. Copied direct response to Jon: Dear Jon, Thanks for your interest. You likely need to use another branch of the cluster-engine repository (optimisations): https://github.com/tanders/cluster-engine/tree/optimisations Background: cluster-engine was initially developed for another Lisp compiler, and I had to do a number of revisions to get it working inside Opusmodus and other compilers. I would ideally clean up the git repository, but don't really have the time to do that in the foreseeable future. > I can load tot, but some things are broken, most likely because Opusmodus has changed in the interim. Indeed, that happens. Opusmodus functions change (even their interface), and there is not really an easy way to see in a single document all the breaking changes, and I currently do not have the time to follow this up anyway. Sorry. Luckily, both Opusmodus and tot are rather modular, so ideally only some things are broken and others still work. Sigh... > The function ratio-to-cent is predefined by Opusmodus. Yes, I vaguely remember that this one cropped up at some stage when Opusmodus introduced that function. In a nutshell, the problem is here that Opusmodus makes it difficult to use independent Lisp packages, and Opusmodus itself defines very many symbols so these clashes happen. ? Possible workaround for now: remove the source file tuning.lisp and thus all microtonal stuff that tot defines for now (because a lot depends on the function ratio-to-cent there) ? Messy... I currently do not have the time to use Opusmodus, and unfortunately it shows in such breaks. Hope this helps. Sorry for all this mess.
  5. I assume you want to use the Lumatone for entering microtonal pitches into Opusmodus, right? The Opusmodus pitch representation currently supports microtonal pitches, but only subdivisions of 12 EDO into quarter and eighth notes. I don't know whether MIDI input for quarter and eighth notes is supported. If it is, then you might be able to hack some mapping of the Lumatone MIDI output to whatever MIDI input Opusmodus would require for the subset of microtonal pitches it supports. I understand that one can freely program whatever MIDI the Lumatone should output for a given key, so if Opusmodus has whatever MIDI input support for its microtonal pitches, you might be able to hack your instrument to output that, but you are most likely on your own there. However, Opusmodus cannot even represent microtonal pitches beyond the above. It cannot represent arbitrary equal divisions of the octave, and certainly no other tunings (e.g., no JI or arbitrary regular temperaments). At some stage I was extending its representation in a private project to support arbitrary regular temperaments, so that I could express, e.g., just intonation intervals in my extended OMN (incomplete state of this work at https://github.com/tanders/tot/blob/master/sources/tuning.lisp). However, I did not add any MIDI input mapping for that at all. If however you want to use the Lumatone simply for playing 12-EDO music with an isomorphic keyboard, then I guess it can output the standard MIDI output for that and I assume that Opusmodus could then handle that like the MIDI input from any other keyboard. BTW: I have another isomorphic keyboard here myself, but instead of using that I meanwhile moved to using MTS-ESP (https://oddsound.com) to always have some subset of my desired microtonal pitches available at any time, and to change this subset by MIDI events if I want to. Not as flexible as an isomorphic keyboard, but not too bad as an option either, and I stay compatible with all the software limited to mere 12-EDO (that software does not need to "know" I "misuse" it for microtonal purposes ).
  6. How much of the current code depends on CCL beyond all functionality of the Graphical User Interface incl. the editor, and the workspace? For example, does the MusicXML support depend on CCL, or the MIDI export, or... ?
  7. Thats a release from Apr 20, 2020. Am I missing anything? Release Clozure CL 1.12 · Clozure/ccl GITHUB.COM This is Clozure CL 1.12. There are two steps to obtain this release. First, obtain the source code for CCL by cloning the repository (with git clone https://github.com/Clozure/ccl.git), or by down...
  8. Thanks for sharing your screen. Is sleep precise enough for realtime scheduling?
  9. Anyway, thanks to Janusz again for adding that after such a feature request!
  10. Actually, it is possible to leave out those logging messages. Execute the following. (Unfortunately, this does not work when defined in an ~/Opusmodus/Extensions/*.lisp file. My guess is that it is overwritten by the system afterwards. However, you can execute it after the startup, e.g., by hand, and it cleans up your listener.) (defparameter *do-verbose* nil "Enable or disable traces printed by do-verbose.") For details see Best, Torsten
  11. If you are looking for something fun to read that still covers the big ideas, there is also The Little Schemer (and a number of related books). Note that this book again uses Scheme for clarity, but the fundamental ideas are the same in Common Lisp. Some incomplete preview: https://books.google.com/books?id=xyO-KLexVnMC&printsec=frontcover&dq=the+little+schemer&hl=en&sa=X&ved=2ahUKEwi8ysjBndrvAhXU_7sIHXmKBmkQ6AEwA3oECAIQAg#v=onepage&q=the little schemer&f=false Quote: What you need to know to read this book.The reader must be comfortable reading English, recognizing numbers, and counting.
  12. SICP is a really excellent book! (Even though meanwhile it is not used for teaching at MIT anymore.) What I alluded to above (higher-order functions) is already covered relatively early in the book in section 1.3 (link). This book provides a really solid foundation for programming. If you just study the first two chapters that might already be enough for your purposes (well organising code for algorithmic composition). (Fun fact: I read this book during our honey moon ~20 years ago.) Note that the book uses the (smaller & more clean) Lisp dialect Scheme, instead of Common Lisp (which is a huge language, a unification effort of multiple Lisp dialects that includes features of multiple older Lisp dialects). Opusmodus is based on Common Lisp. If you want to study higher-order functions and other matters directly for Common Lisp, there are of course also suitable books, e.g., Practical Common Lisp. Functions incl. higher-order functions are discussed in chapter 5 (link).
  13. I understand that builtin functions of Opusmodus are not working on this level of abstraction / expressive power, as it would be a rather steep learning curve for users, but using and defining functions at this flexibility level reduces the length of your code substantially, which then helps to solve bigger problems by very small teams or individuals. I try to have my own libraries work at this kind of level.
  14. > I would like to SORT an (single-event)-list by pitch... Apologies for a late response. Anyway, such functionality is actually built into Common Lisp. Hardly any coding required. Just specify a key attribute to the builtin sort function to tell it what data to look at for the sorting -- and specify a sort function. (setf events '((e e4 mf) (e a4 mf) (e d5 mf) (e g5 mf) (e b5 mf) (e d6 mf) (e b4 mf 2c) (e e5 mf 2c) (e a5 mf 2c) (e d6 mf 2c) (e fs6 mf 2c) (e a6 mf 2c) (e e5 mf) (e a5 mf) (e d6 mf) (e g6 mf) (e b6 mf) (e d7 mf) (e gs5 mf -14c) (e cs6 mf -14c) (e fs6 mf -14c) (e b6 mf -14c) (e eb7 mf -14c) (e fs7 mf -14c) (e b5 mf 2c) (e e6 mf 2c) (e a6 mf 2c) (e d7 mf 2c) (e fs7 mf 2c) (e a7 mf 2c) (e d6 mf -31c) (e g6 mf -31c) (e c7 mf -31c) (e f7 mf -31c) (e a7 mf -31c) (e c8 mf -31c) (e e6 mf) (e a6 mf) (e d7 mf) (e g7 mf) (e b7 mf) (e d8 mf))) (sort events #'< :key #'(lambda (event) (pitch-to-integer (second event)))) See also CLHS: Function SORT, STABLE-SORT CLHS.LISP.SE Note that this high level of programming and flexibility is what makes programming with Lisp so fun and productive. There are a bunch of other functions builtin doing other sequence operations on the same high level, like count (http://clhs.lisp.se/Body/f_countc.htm ), find (http://clhs.lisp.se/Body/f_find_.htm ) etc.
  15. I am aiming for some state-of-the-art microtonal/xenharmonic support for Opusmodus. Here is a first preview. It has been easier than expected to do what I planned when using some unifying ideas proposed by tuning math guys around 20 years ago. The core idea is that just intonation (JI), arbitrary equal temperaments (subdividing the octave or other intervals) and very many other tunings (https://en.xen.wiki/w/Tour_of_Regular_Temperaments ) can all be expressed as regular temperaments. You can find an informal discussion of regular temperaments, its context and motivation -- how it extends/generalises many other tone systems -- at this link: http://x31eq.com/paradigm.html Importantly, regular temperaments can all be mapped to JI. Therefore, they can also all by notated by pitch notation capable of notating JI for arbitrary prime limits. So, as a unifying pitch notation for all these temperaments I am using such a JI notation. Many recent JI staff notations (I found so far 5 of them, one highly developed one is http://sagittal.org ) are all based on the same fundamental idea, which I am also using: the traditional pitch nominals (A, B, C...) and the traditional accidentals (sharp, double-sharp, flat...) are denoting Pythagorean tuning (when the notation is read as a JI notation), i.e. they notate all the pitches we can reach when stacking just fifths (plus their octaves). We can express this in OMN with our standard pitch notation. Here is a dominant seventh chord, which in a JI interpretation would be tuned in Pythagorean tuning. (setf pythagorean-seventh '(h c4e4g4bb4)) We can play this chord in JI with the new macro def-tempered-score, which does pretty much what the Opusmodus builtin def-score does, but it receives a temperament as one of its arguments. Also, there are multiple MIDI channels specified here, as simultaneous tones are played on different MIDI channels, so they can be tuned individually by pitch bend (I am simply using the def-score tuning argument in the background). Using multiple channels instead of multiple ports is more widely supported by existing MIDI MPE-supporting plugins. (def-tempered-score score-name (:temperament '11-limit-JI :time-signature '(4 4)) (instr1 :omn pythagorean-seventh :channel '(1 2 3 4) :sound 'gm)) OK, how about instead of the Pythagorean third we want to use a just major third -- and also a harmonic seventh. All pitches that go beyond Pythagorean tuning are expressed using new JI accidentals that express some microtonal inflection. The core idea of all the above-mentioned JI pitch notations is to introduce a new accidental for every prime limit (https://en.wikipedia.org/wiki/Limit_(music) ) comma (https://en.wikipedia.org/wiki/Comma_(music) ). These different notations mainly differ in what kind of symbols they propose for these commas. When extending OMN by microtonal accidentals, I am restricted to plain ASCII letters and numbers (most of the ASCII special characters are already used for something else, and OMN does also not really support unicode). So, I suggest to use the letter K for denoting that something is a Komma (similar to the Greek kappa, from where the word comma comes -- the letter C is already used for cent values) and then simply complement that letter with the prime of the comma in question. So, the 5-limit comma (syntonic comma, https://en.wikipedia.org/wiki/Syntonic_comma) is notated 5K and the 7-limit comma is 7K. These accidentals raise the pitch by that comma, for a comma flat, put a minus in front of the accidental. So, here is how we can notate and play the just harmonic seventh chord (1K is the natural sign and multiple accidental attributes for a chord are assigned in ascending order of chord tones). (setf 7-limit-seventh '(h c4e4g4bb4 1K+-5K+1K+-7K)) (def-tempered-score score-name (:temperament '11-limit-JI :time-signature '(4 4)) (instr1 :omn 7-limit-seventh :channel '(1 2 3 4) :sound 'gm)) JI leads to an infinite number of different pitches. Temperaments reduce that number. So, how about we want to play the above chord in, say, 22-tone equal temperament (https://en.xen.wiki/w/22edo ). For that, we only need to define that temperament. Each regular temperament (including equal temperaments and also JI) is specified by only two settings: a small number of generator intervals, and a val for each generator. The vals together specify how each prime (up to the prime limit of the temperament) it is mapped to JI. I will explain these details in a later message and for now simply show the definition of 22-EDO, which is pretty brief. (deftemperament 7-limit-22-EDO ;; List of vals (list (list 22 (+ 13 22) (+ 7 (* 2 22)) (+ 18 (* 2 22)))) ;; List of generators (list (/ 1200.0 22))) Now, we can play the above chord (and any other 7-limit OMN intervals) in 22-EDO. (def-tempered-score score-name (:temperament '7-limit-22-EDO :time-signature '(4 4)) (instr1 :omn 7-limit-seventh :channel '(1 2 3 4) :sound 'gm)) Similarily, we can define arbitrary other regular temperaments by simply specifying their vals and generators.
  16. > The best way to work with microtonality is to get a MTS compatible instrument Yes, I understand. I already have Pianoteq, and might get Vienna Instruments just for this, but still the options (i.e. available instruments) would be limited. (By contrast, the microtonal support for Dorico currently only works for VST3 instruments supporting the VST tuning of note expressions. Also very restricted.) Anyway, I would like to use microtonal tuning for electronic music at some stage, not just some mockups for acoustic compositions. In that area, there are simply very many more plugins etc. available where I can tune with pitchbend messages... I very much hope that in the medium term MIDI 2 will solve such problems.
  17. Here is a link to a related discussion. For supporting chords I would need something similar to what André suggests here, by automatically splitting polyphonic parts into multiple monophonic parts, with some custom tuning for each.
  18. Of course, it would be good to have also playback for microtonal pitches with high precision. > In other systems this will end up in a mess: 100 cents equal 100 channels No, you need only as many channels per instrument as there are tones sounding simultaneously. With the MIDI MPE standard the tuning of tones is simply changed on the fly with pitchbend messages. For example, my Tonal Plexus has 205 pitches/keys per octave in its default tuning and each of these pitches requires a custom tuning, but I can play it with just 3 MIDI channels if I play only 3 notes at a time. For higher polyphony more MIDI channels are needed. (Of course, MIDI MPE is only a fancy name for something that was always possible with MIDI, but now that many instruments exist that have built-in support setting this up is considerably simplified.) Anyway, the following specifies some tuning parameter per note, which does work. So, I guess I have to perhaps implement my own version of MPE support in Opusmodus by transforming my scores automatically into this representation with the tuning added. Thanks again! Best, Torsten (def-score test-playback (:key-signature 'chromatic :tempo '(q 60) :time-signature '(4 4)) (inst1 :omn '((h c4) (h c4) (h c4) (h c4)) :channel 1 :sound 'gm :program 0 :port 0 ) (inst2 :omn '((h eb4) (h eb4 -33c) (h eb4-) (h eb4 -33c)) :channel 2 :sound 'gm :program 0 :port 0 :tuning '(0 -0.33 0 -0.33) ) (inst3 :omn '((h bb4) (h bb4 -33c) (h bb4-) (h bb4 -33c)) :channel 3 :sound 'gm :program 0 :port 0 :tuning '(0 -0.33 0 -0.33) ))
  19. Thanks for the quick response. > Cent annotations display only. I thought when we discussed microtonality at the Opusmodus Convention, and Achim Bornhoeft was talking about the importance of having the flexibility of the cent annotations, you mentioned that this is already implemented (again), and just lacked documentation. Did I perhaps misunderstand, and microtonal playback with cent resolution was never implemented so far? Thanks!
  20. > The cents attribute is an additional display of the remain cents values and is not a part of the audition. Could proper audition for cent values be implemented? Pretty please? If polyphonic microtonal playback with 1/8 note resolution is already implemented, what would be missing to get the same support for arbitrary cent values? For me, flexible tuning support is the one missing Opusmodus feature I would be willing to pay extra for, seriously. > To make cents audition we would end up with 100 possible ports - if MTS is not supported - for a one instrument. This problem is solved in MIDI MPE (https://www.midi.org/midi-articles/midi-polyphonic-expression-mpe ), which splits polyphonic chords or multiple voices for a single instrument into multiple MIDI channels (not ports!!) and then then can tune each note of a chord independently via pitch bend (plus independent timbre changes etc.). So, the tuning can change on the fly from note to note. There are already quite a number of synthesisers and samplers supporting MPE, including some of the big players such as EastWest Play (competitor in the league of Vienna Instruments), with which I already used orchestral instruments for microtonal music this way (e.g., played with a Tonal Plexus, https://hpi.zentral.zone/tonalplexus). Below are links with several lists for sampler and synthesiser plugins supporting MPE. Besides, every synth/sampler plugin can be turned into an MPE-supporting plugin when running multiple instances in parallel (e.g., with the help of something like bidule). https://www.kvraudio.com/plugins/mpe https://roli.com/mpe (scroll down to list of DAWs, plugins etc) https://support.roli.com/support/solutions/articles/36000037202-compatible-synths-daws-and-instruments Also, please note that the score example above is only monophonic within each channel, and even for GM with MTS support the cent annotations are not working for me there. Thanks!
  21. Briefly sharing some news: I started to work on greatly improving Opusmodus' support for microtonal/xenharmonic music. I am aiming for supporting arbitrary equal temperaments (both equal divisions of the octave and other intervals), just intonation (JI) for arbitrary prime limits, and arbitrary regular temperaments (https://en.xen.wiki/w/Tour_of_Regular_Temperaments ). I aim to have this whole tuning universe controlled by a single uniform notation embedded in OMN. Still, I try to keep things relatively clear and simple by introducing only a single actual new accidental symbol, and that symbol will then be combined with numbers (for prime limits) to express arbitrary JI pitches, which are then mapped to all the possible tunings. I also aim for some support for dynamic temperaments, so that the tuning can change during the course of a piece. Now, this is all claiming rather a lot, and the result may not necessarily be perfect (e.g., controlling a non-octave-repeating equal temperament with a notation suitable for JI is possible and may actually work well for some situations, but is perhaps not to everyones liking). Anyway, I already have some rather solid foundation for all this. Will update you on more details at a later time. (Technically, pitch deflections will be expressed by articulations, as I cannot change the underlying OMN pitch format. All this depends of course on getting the cent articulations working properly, but I trust that will be sorted at some stage. ) Best, Torsten
  22. I have no luck with the cent annotations in the score (see example below, the cent annotations are seemingly ignored in the playback, but the other microtonal accidentals are not). Am I perhaps missing something? Also, what would be truly great would be some way to have cent annotations for individual pitches of chords. For example, the following does work already. '(c4e4-g4) Would be great if we could also use something like the following. '(h c4e4g4bb4 0c+-14c+-0c+-31c) Thanks! Torsten (def-score test-playback (:key-signature 'chromatic :tempo '(q 60) :time-signature '(4 4)) (inst1 :omn '((h c4) (h c4) (h c4) (h c4)) :channel 1 :sound 'gm :program 0 :port 0 ) (inst2 :omn '((h eb4) (h eb4 -33c) (h eb4-) (h eb4 -33c)) :channel 2 :sound 'gm :program 0 :port 0 ) (inst3 :omn '((h bb4) (h bb4 -33c) (h bb4-) (h bb4 -33c)) :channel 3 :sound 'gm :program 0 :port 0 ))
  23. Ah, great. I just noted that this was already documented and I simply missed it. So, thanks for sharing -- very much appreciated! I hope I soon find some time to play with this! Best, Torsten
  24. > artistic-research with a focus on non-octave scales Could you share some more information on what kind of notation schemes exist for these kind of tunings, and what you would like to do in principle -- independent of Opusmodus, e.g., what you are doing with MaxScore so far? Does there perhaps exist any notation scheme that provides principles suitable for a certain or even wide range of such tunings, or do you use custom/independent notations for each such tuning? Officially, microtonality support in the Opusmodus notation OMN is limited to quarter tones (e.g., c4+) and eighth notes (e.g., c4.) and explained at the front page (https://opusmodus.com ). (Seemingly, there is not even a separate eighth flat accidental symbol, those pitch deviations depend on combinations with standard accidentals). However, according to Janusz Opusmodus additionally supports (or will support) arbitrary microtonal deviations of 12 EDO (or 24/48 EDO?) expressed by cent values to be added as technique, but this is not yet documented. So far, I have not yet delved into the existing microtonality support, but instead I am waiting for this feature (arbitrary cent deviations) to be documented. Then I would add for my own purposes by and by a richer microtonal notation on top of the builtin OMN with custom functions. For example, I plan to define for myself tuning table support, which would allow to arbitrarily detune (in an octave repeating way and/or freely for each octave) the supported pitches incl. all quarter and eighth tones. For example, 31-EDO (septimal meantone) and various other temperaments can be notated with only the accidentals already available in Opusmodus, but we would need to tune all pitches differently. That could be done simply by a function that maps OMN pitches (incl. their cent value deviations relative the the tuning table) to 12 EDO pitches with cent value deviations. The tricky bit with this approach is that enharmonically distinct pitches (like C# vs Db) could be tuned differently in such tuning table (e.g., these are different pitches in 31 EDO), while many pitch-processing functions in Opusmodus seemingly disregard enharmonic distinctions. So, such Opusmodus functions must then be avoided. At a next stage, I might define my own pitch representation from scratch that would support regular temperaments (i.e. incl. just intonation for arbitrary limits, arbitrary equal temperaments, but also things listed at https://en.xen.wiki/w/Tour_of_Regular_Temperaments ) using perhaps accidentals like sagittal notation (which was designed to support a wide range of tunings). For example, I might represent additional accidentals as custom OMN techniques, which could be translated into cent deviations for MIDI playback, but would be included as some ASCII technique text of these accidentals for MusicXML output (which I could then manually translate into proper accidentals with notation software like Dorico). Now, all of this would not directly cover those non-octave scales you are interested in, but perhaps you can use a similar approach, where you translate some custom OMN notation developed for your purposes into the relevant OMN with cent deviations for playback etc. Perhaps we might even work together on something like this at some stage.
  25. > C-c C-l shortcut which loads a lisp file and make its variables available in the REPL Beyond that, you can also (re)-evaluate at any time just individual expressions or definitions (not necessarily a whole file or even a whole program) and that way make your whole development process rather interactive. I use the shortcut for evaluating the last expression (before the point/cursor), C-x C-e, much more often than the one for loading a file. > general Lisp tutorials As a Python developer, this might be helpful for you, even though it is written originally for the opposite "direction" of learning. https://norvig.com/python-lisp.html Best, Torsten
  • Create New...

Important Information

Terms of Use Privacy Policy