Jump to content


  • Content Count

  • Joined

  • Last visited

1 Follower

About torstenanders

  • Rank
    Senior Member

Contact Methods

Profile Information

  • Gender

Recent Profile Visitors

2,775 profile views
  1. The best document combining both worlds is likely the following. This was an internal textbook of the algorithmic composition teacher Paul Berg at the Sonology course at the Royal Conservatory of The Hague (the author of the composition system AC Toolbox, https://www.actoolbox.net), but it is unprinted, just a copy of a text processor document for internal use, and difficult to obtain (I only have a hard copy I got from a friend). Berg, Paul (n.d.) Elements of Design. An introduction to Programming with Common Lisp.
  2. http://www.gigamonkeys.com/book/ Common Lisp Books | Common Lisp LISP-LANG.ORG Books about Common Lisp For a more music-related introduction to Common Lisp you might want to look at the following books. These books teach algorithmic composition with Common Lisp. The above books introducing only Common Lisp are far more comprehensive on that matter, but you might prefer learning some foundations first within a musical context. Morgan, N. & Legard, P. (2015) Parametric Composition: Computer-Assisted Strategies for Human Performance. West Yorkshire, UK: Tonality Systems Press. Sorry! Something went wrong! WWW.AMAZON.COM Introduces Opusmodus along with some Lisp. Taube, H. (2004) Notes from the Metalevel. London and New York: Taylor & Francis. Sorry! Something went wrong! WWW.AMAZON.COM Code examples online: http://www.moz.ac.at/sem/lehre/lib/cm/Notes from the Metalevel/00/contents.html This book introduces the algorithmic composition system Common Music, along with Lisp fundamentals. Algorithmic Composition: A Gentle Introduction to Music Composition Using Common LISP and Common Music https://quod.lib.umich.edu/s/spobooks/bbv9810.0001.001/1:3/--algorithmic-composition-a-gentle-introduction-to-music?rgn=div1;view=fulltext I have not read this one...
  3. These functions might try to solve similar problems, but internally they are very different. The build-in Opusmodus functions are internally deterministic, as far as I can tell (cannot see the code). By contrast, the function that calls the constraint solver cluster engine performs a search internally. Therefore, it can solve combinatorial problems better. You can impose pretty arbitrary additional constraints (restrictions) on the result such as counterpoint rules, e.g., how to resolve non-harmonic tones (e.g., you can allow for things like passing tones or auxiliary tones by disallow non-harmonic tones for other cases), rules on the voicing (e.g., if you want to can disallow voice crossing), or harmonic conditions (e.g., you might want to enforce that the distance between lower voices always exceeds the critical bands). A range of rules are predefined by my library cluster rules (http://github.com/tanders/cluster-rules), but the actual power of the cluster engine constraint solver is that you can define your own rules from scratch. Cluster engine provides a wide range of functions that help you doing that, primarily by defining what I call score contexts, namely specifying which sets of variables (parameters in the score for which we search for a value) are affected by a given constraint (e.g., the pitches of consecutive notes in a voice, or of simultaneous notes etc.). However, learning to use this beast is still a bit tricky. The functions are rather well documented by docstrings, and there are various examples as (unit) tests available. However, the introductory documentation (tutorial) was originally written for PWGL, for which these libraries where originally written, and these tutorials are not ported yet (all the tutorial code has been ported to plain vanilla Lisp for testing, but their explanations is still part of the original PWGL patches only). Anyway, I provided an introduction video into Cluster Engine for my students some time ago, which might help to get started. Yet, that video only shows Cluster Engine in action with some rules predefined by Cluster Rules, so you get some idea of how to do music constraint programming. Yet, it does not show the function revise-score-harmonically or the Opusmodus interface: https://www.youtube.com/watch?v=xPXIRmH9rZc. (This video is part of a series of videos on PWGL at https://www.youtube.com/watch?v=MFAZR4Ja__M&list=PLmbpscTxjn_DrdDXD5v7z0GzQRNKM5VyQ). Nevertheless, once you understand these fundamentals, the documentation of the function revise-score-harmonically is hopefully sufficient. Thanks for your interest! Best, Torsten PS: Some time ago I did some optimisation of the cluster engine search, which is not yet part of the definition of revise-score-harmonically. If you are going to use it more and want it to be more efficient, then let me know
  4. I love the focus on generating polyphonic results and the control over the resulting texture!! Great to see that the transformations (methods) used by the new counterpoint function are freely user-definable. That makes this very flexible. Also nice to see that it is accompanied by several convenient auxiliary functions. By contrast, while the polyphony function quasi enforces harmonic rules on the result (enforces certain harmonic intervals between voices), these harmonic rules are seemingly not user definable. The music constraint solver cluster-engine, which can be loaded into Opusmodus, is far more flexible in that regard, and there exists already an Opusmodus interface for some cluster-engine application (the function revise-score-harmonically), which also allows to control the underlying harmony, though based on an underlying chord progression, i.e. harmonic counterpoint, but arbitrary custom rules can be added, see https://tanders.github.io/tot/sources/constraints.html#_g251953. On the other hand, revise-score-harmonically only controls pitches and does not support editing dynamics or articulations (though those are preserved and can be edited otherwise). Anyway, it is great to have both these options now. The density function is great to see Concerning microtonality, is there any way to define custom microtonal deflections (i.e. not just quarter and eighth tones), e.g., as articulations? Also, what kind of exporting of microtonal pitches is supported? MPE (https://www.midi.org/articles-old/midi-polyphonic-expression-mpe), which is already supported by various sound generators, even EastWest PLAY? Are microtones exported to MusicXML? E.g., Dorico -- the scoring app with best support for microtones by far -- just improved its support for import and export of microtones via MusicXML... Thanks for all the hard work!
  5. In case you have abstracts or even papers, that might be relevant to share at this forum, even if they are in Italian (though in case English would be available, that would be even better )
  6. Note that MOZ’Lib seemingly supports arbitrary libraries from the PatchWork / Open Music / PWGL family. Perhaps it is possible to see how they do that to add such functionality to Opusmodus as well? Best, Torsten PS: I was working in a similar direction some time ago, first by porting some library (OM-Tristan) to load directly into a plain Lisp compiler (by replacing all OpusModus dependencies) and that works, but that is a lot of work for each library. I then started to instead port the whole of OpenMusic to ClozureCL, but leaving out all GUI dependencies, but got only half-way with that so far (it is a lot of code ). Of course, if this works already in Julien's library, that would save some work... Unfortunately, I will not be able to take anything like this on in the foreseeable future due to my new job.
  7. Its a great development, but note that it will not work with Opusmodus for multiple reasons, one being that MOZ’Lib depends on SBCL [1], which is called from the shell, and Opusmodus depends on ClozureCL, and I don't think there are plans to make Opusmodus callable from a shell. [1]
  8. > Achim Bornhoeft and I spent some time talking and playing with the Neo-Riemann theory with an outcome of a diagram and a function Thanks for sharing. Do I understand correctly that these transformations always assume triads? Of course, one can always extend the triads afterwards... Best, Torsten
  9. Hi Julio, Could you perhaps share your final setup files for the old VSL instrument library with the community? Thanks! Best, Torsten
  10. > :path nil will give you the shortest path Nice.
  11. Nice! However, what happened to what Bruckner (according to Schönberg) called the "law of the shortest path" (Gesetz des nächsten Weges)? Of course, for expressiveness one should not always choose a "shortest path" voice leading, that tends to become boring. But here, there are predominantly skips. Steps should be more likely, at least that would be more common (e.g., more easy to perform and also to follow by the audience). Is there perhaps a way to control the likelihood of steps vs. skips? Thanks! Best, Torsten
  12. The code is impressively concise for this dense network of relationships
  13. Thanks a lot for working on this. Just to confirm: is the pitch resolution of the actual pitch parameter limited to expressing quarter and eighth tones and for other subdivisions articulations are used? The main/only advantage of 24-ET (equal temperament) and 48-ET is that they contain all 12 tones from 12-ET in the same "grey" approximation of just intervals (i.e. intervals that can relatively easily tuned by ear -- much more easily than anyhow tempered intervals) than 12-ET. They only add 11-limit intervals like 11/8 rather well (nicely used for that, e.g., by Wyschnegradsky). From a harmonic point of view, various other equal subdivisions of the octave are much more interesting, because they either approximate more novel just intervals or/and approximate standard intervals better (e.g., more just thirds). For example, 19-ET and 22-ET have less tones than 24-ET, but are harmonically more interesting in this regard (e.g., https://en.wikipedia.org/wiki/22_equal_temperament) and so is 31-ET (extended meantone with septimal intervals, https://en.wikipedia.org/wiki/31_equal_temperament) or 41-ET. For a good compromise between a tuning that would include 12-ET and additionally is harmonically interesting I would instead propose 72-ET (https://en.wikipedia.org/wiki/72_equal_temperament). This temperament is already relatively widely used by multiple independent communities because of that, and there already exist ASCII notations for this temperament (besides various other notations – their number is just a testament to how useful this temperament has been for many), examples copied below (e.g., see http://tonalsoft.com/enc/number/72edo.aspx). Tuning list standard, based on Sims/Maneri 72edo notation lower raise inflection cents b # semitone 100 ] [ 1/4-tone 50 < > 1/6-tone 331/3 v ^ 1/12-tone 162/3 Monzo 72-edo HEWM notation lower raise inflection cents b # semitone 100 v ^ 1/4-tone 50 < > 1/6-tone 331/3 - + 1/12-tone 162/3 Just my 2 Euro cent... Best, Torsten
  14. Just for the record, when I start Opusmodus without any of my extensions, I run into the same problem. ? (length-divide '(1000 2) '(q ab3 num1+leg c4 leg e ab3 leg g3 leg ab3 num1+leg c4 leg)) length-divide, set: nil ignore: nil section: nil exclude: nil seed: 35424 > Error: The value ab3 is not of the expected type sequence. > While executing: ccl::sequence-type, in process Listener-1(7). > Type cmd-. to abort, cmd-\ for a list of available restarts. > Type :? for other options. 1 >
  15. > You will need to wait for the upgrade. No worries, I already applied a workaround (disabling certain code...). Here is another issue I ran into with length-divide: if the argument ignore is set to either min or max, and all note values are of the same length, then that also causes an error. Now, perhaps that should be expected, but then at least the error message could be more helpful. On the other hand, perhaps it would be preferable in this situation if a warning was printed and the effect of the argument ignore was, well, ignored? (length-divide '(1 4) '(1/8 c4 mf num1+leg 1/8 d4 mf num1+leg 1/8 fs3 mf leg 1/8 gs3 mf) :ignore 'min) Error: The value nil is not of the expected type number. > We have started work on microtonality
  • Create New...