Jump to content

Avner Dorman

  • Posts

  • Joined

  • Last visited

Everything posted by Avner Dorman

  1. How can I do that? The check for updates doesn't work....
  2. I just updated my OS to Monterey. I've been using opusmodus version 2.1.26209 (so not 2.2) and now it crashes when I try to open any file or create a new workspace. It also reports an error when I try to Check for Updates. Do I need to purchase v2.2? Is there another problem? How do I solve this? Many thanks!
  3. Thank you so much Torsten, I will definitely look at orgmode! All the best, Avner
  4. Dear Julio, I am very happy I could be of help! All the best, Avner
  5. Following up on this - is there a way to have Opusmodus work within a Jupyter notebook? I think it would be very useful in educational settings. I know there are lisp implementations that work in Jupyter: fredokun/cl-jupyter GITHUB.COM An enhanced interactive Shell for Common Lisp (based on the Jupyter protocol) - fredokun/cl-jupyter - but is there a way to include Opusmodus as well? At least the functions and notation?
  6. another p.s. - Ernst Levy's book is available on google play A Theory of Harmony BOOKS.GOOGLE.DE In this introduction to natural-base music theory, Ernst Levy presents the essentials of a comprehensive, consistent theory of harmony developed from tone structure. A Theory of Harmony is a highly original explanation of the harmonic language of the last few centuries, showing the way toward an understanding of diverse styles of music. Basic harmony texts exist, but none supply help to students seeking threads of logic in the... My favorite book on the subject is David Lewin's: Generalized Musical Intervals and Transformations. New Haven, CT, and London: Yale University Press, 1987. Reprinted, Oxford and New York: Oxford University Press, 2007.
  7. Hi Julio, The so called "negative harmony" is the same as "inversion and symmetrical axes" in set theory (which is the same as saying Neo-Riemannian theory - all transformations are In operations). An inversion of a pitch class is given by subtracting the pc from index of the inversion operation, n. In(pc1, pc2,pc3) = (n-pc1, n-pc2, n-pc3) If you want to think of it as an inversion around an axis, the axis would be n/2 (or 12-n/2 on the other side of the clock-face). So the function could be written like this: (defun axis-inversion (axis pitches) (integer-to-pitch (loop for i in pitches collect (- (* 2 axis) (pitch-to-integer i))))) And if you want to use Eb-E as the axis it would be 3.5 (e is pc3 and eb is pc4) (axis-inversion 3.5 '(c4 e4 g4)) ;;; results in (g4 eb4 c4) This doesn't account for octaves etc. - for that you'll need to use midi. Now the axis is given in midi number - so 63.5 would be Eb4: (defun midi-inversion (axis pitches) (midi-to-pitch (loop for i in pitches collect (- (* 2 axis) (pitch-to-midi i))))) (midi-inversion 63.5 '(c4 e4 g4)) ;;; you get (g4 eb4 c4) (midi-inversion 60 '(c4 e4 g4)) ;;; you get (g4 eb4 c4) (midi-inversion 53.5 '(c4 e4 g4)) ;;; you get (b2 g2 e2) If I missed any cases I am happy to check them out All the best, Avner p.s. - (midi-inversion 63.5 '(a4 g4 fs4 a4 d5 a4 fs5 d5 a5 fs5 e5 d5)) ;;; results in (bb3 c4 cs4 bb3 f3 bb3 cs3 f3 bb2 cs3 eb3 f3) ;;; as you expected (I think? I only checked the first few notes :-)
  8. Thank you! Sorry you're having computer problems - and thank you for looking into it. Avner
  9. I received three responses from Stephane Boussuge to my email but none of them appear here..... Would be great if this can be fixed! Many thanks!
  10. I am finding that the harmonic-progression function is not always predictable when using the steps option. For example: (append '(w) (harmonic-progression '(0 1 2 3 4 5 6 7) '(c3 db3 eb3 e3 fs3 g3 a3 bb3) :size '4 :step '((3 1 3)))) > (w c3e3a3bb3 cs3fs3bb3c4 eb3g3c4cs4 e3a3cs4eb4 fs3bb3eb4e4 g3c4e4fs4 a3cs4fs4g4 bb3eb4g4a4) If you look at these chords, the steps are actually ordered ( 3 3 1) and not (3 1 3). Am I missing something? Thanks!
  11. Just to clarify - the version in the download page thinks I'm downloading the demo version and then locks me saying the 30 days have expired. However, I've been using Opusmodus for years now and have purchased the 1.3 upgrade as well - but somewhere in the process my computer 'loses' the registration certificate but the license server thinks I'm still using it elsewhere. I'm not sure why this happens - but I think it would make sense for the registration to be attached to a specific machine so if I download a new version that machine is still licensed to use it. Also, perhaps users can go a remove a specific registration manually? Many thanks, Avner
  12. I was reluctant to do this until today because I was worried the license server would get confused - and surely enough I am now locked out of opusmodus It would be great to have a more streamlined way to do this.... Many thanks, Avner
  13. Thank you! Do I download the trial version and enter my license? I've already purchased a 1.3 upgrade a few months back.
  14. I would like to download version 1.3.24962 but I don't see the link on the main forums page. I have a new computer and I'd like to install opusmodus! Many thanks, Avner
  15. Maybe closest-path and keep chord-closest-path as the non strict version? either way - thank you so much!!!
  16. Hi Janusz, These look correct to me! I haven’t done the math, but I don’t see any voice leading issues. Thanks! Avner
  17. Yes - obviously you're right - that one is the best. So is there a way to implement that? I actually appreciate that chord-closest-path gives different options on different runs (it's quite creative ) but I would also like to have the option of a truly parsimonious voice leading function. Julio's solution seems to work, but I can't quite manage to make it into a function....and I don't know enough Python (and maybe not enough lisp) to easily convert Tymoczko's code to lisp. By the way - I love Opusmodus as well! Thanks Avner
  18. Hi Janusz, If I try this: (chord-closest-path '(b4g4e4c4) '(b4g4e4c4 c5a4e4f4 b4a4f4d4 b4g4e4d4)) It produces either or My question is why does it produce two variants and how can one make sure it always chooses the shortest path? To me it seems like the second option is the correct one since the total half steps between all the voices is 6 (b-c, g-f, c-a) and in the first the total half steps between the voices is 8. Thanks! Avner p.s. - if anyone's curious - Dmitri Tymoczko wrote a software that does minimal voice leading for music 21 in Python. It's available here - http://dmitri.mycpanel.princeton.edu/voiceleading_utilities.py
  19. Dear Julio, Thanks for sharing these codes. So I'm trying to understand if the following approach could work - it seems to work for your example (but not for every progression). (setf chordstovl2 '(b3eb5g3 cs6e7gs3 b4f5g6 f7e5c2 d4f7e4 gs7e2a8)) (defun voicelead (chords) (chord-closest-path (list (car chords)) chords)) (voicelead (ambitus '(c4 c5) chordstovl2)) but (voicelead (harmonic-progression '(0 3 6 2) '(c major) :size 4 :step 2 :relative nil :variant 'r)) can generate one of two options. The second one is obviously better since it uses a common tone. Even with ambitus-chord I'm not able to make it work consistently. If you have any thoughts I'd be happy to hear them. All the best, Avner
  20. Hi Janusz, Any idea why this stopped working? I've changed :map shift to :map step but it's still not working... thanks! Avner
  21. Avner Dorman

    Avner Dorman

  22. Hi Torsten, Would these work? (pitch-melodize '(c4e4g4)) => (c4 e4 g4) And (pitch-to-midi '(c4e4g4)) =>((60 64 67)) or (flatten (pitch-to-midi '(c4e4g4))) => (60 64 67) All the best, Avner
  23. Thanks so much!!! This is great! I wrote the following functions that automatically add the pitch class as text above each note. This is really useful for me when teaching set theory. I am sharing them in case anyone else needs something like this Also, I'd be curious to know how the text font might be modified. ;; convert pitch-classes to nums (defun pc-to-num (pitches) (substitute-map '(num0 num1 num2 num3 num4 num5 num6 num7 num8 num9 num10 num11) '(0 1 2 3 4 5 6 7 8 9 10 11) (modus (pitch-to-integer pitches)))) ;; interweave two lists (defun interweave (list1 list2) (if (null list1) list2 (cons (car list1) (interweave list2 (cdr list1))))) ;; add pcs as a num to each pitch (defun show-pcs (pitches) (interweave pitches (pc-to-num pitches))) ;; test (setf pitches '(c4 bb4 f4 eb4 fs4 d4 g4 b4 e4 a4 cs4 gs4)) (show-pcs pitches) Pitches with PCS.pdf Pitches.pdf
  • Create New...

Important Information

Terms of Use Privacy Policy