Jump to content

TomTolleson

Members
  • Posts

    77
  • Joined

  • Last visited

Posts posted by TomTolleson

  1. Hello!


    My apologies if there is a better thread for this topic, but I am wanting to organize a composition to reference other files (one which will contain lists which are large enough to be unwieldy and the other for my functions).

    Approaching this with ADSF would have me creating a system to load.

    Something like:

    (defsystem "composition-lisp"
      :description "composition-lisp: Tom trying to organize and load multiple files."
      :version "0.0.1"
      :author "Tom Tolleson <tom@example.com>"
      :licence "Public Domain"
      :depends-on ("optima.ppcre" "command-line-arguments")
      :components ((:file "/common-lisp/composition-lisp/composition-lisp.ads")
                   (:file "macros" :depends-on ("packages"))
                   (:file "hello" :depends-on ("macros"))))

     

    However, I'm wanting to do things in the most simple way possible and I'm sure I've missed it. I'm happy to delete this and repost as a comment in a more appropriate thread if needed.

    Thanks,

    THT

  2. Another option - as a companion to (midi-to-omn) could we have (omn-to-midi "pathto/file.mid") or something similar?

    Nevermind! I just tested the compile-score with adding a MIDI file and

     

    (compile-score 'piano :file "/Users/ttolleson/opusmodus/Singles/WaveProcessFabric/MIDI/piano.mid")

    (compile-score 'piano :file "/Users/ttolleson/opusmodus/Singles/WaveProcessFabric/MIDI/piano.mid")

     

    Satisfies my need completely. Thanks!

     

    Tom

  3. Hello, I'm having an issue getting MIDI over to a DAW and since this thread mentions the settings explicitly I thought I would add onto this.
    I'm not able to record MIDI using Logic Pro or Ableton when Opus Modus is the source. I'm able to record MIDI from other software but not OpusModus.
    So I'm getting

    ((0 . "Bus 1")) 

    When I evaluate 

    (midi-destinations)

    Which is aligned with the above definition by the admin.
    However, I"m not sure if this is the IAC Driver which I have sending and receiving port 1.

     

    Is there a best practicce for getting this up and running? I haven't tried sending MIDI since I upgraded to OM 3.

    Another solution would be for me to save a MIDI file from OM. But I don't see how to save the last score as MIDI in OM3.

     

    Sorry if I'm missing something obvious here. Thanks.

     

    Tom

  4. Hello,

     

    Is TOT still supported and working with OM 3.0? I see the latest pull request for the repo was July 2021.

     

    The installation instructions on the site seem to only include the git commands to clone the repo. I created the directory /common-lisp under my user folder and pulled all the repos mentioned into the folder.

    Of course, that is not an "installation" unless the folder is already linked to lisp. Which mine isn't. So I tried to load everything via ASDF.

     

    But, when I try to load via asdf using quickload 

    (ql:quickload "/Users/ttolleson/common-lisp/tot")

     

    The response is 

     

    Error: Reader cannot find package QL.

     

    So, without being sure as to how CCL loader prefers to load, I went ahead and attempted the command given in this thread which is

    (require :tot)

    Of course that won't work if it isn't installed. So the result of that was

    Error: REQUIRE was called after delivery time with module :tot.
    To fix this, either require the module before delivery or use :KEEP-MODULES T.
      1 (abort) Return to debug level 1.
      2 Return to top loop level 0.

    Right.

    So I'm not understanding the actually commands to run in OM using ASDF. FOr future readers, the options in the top GUI menu

    Tools> Load 

    and

    Tools > compile

    don't seem to do what's needed here. 

     

    Any advice is appreciated. Thanks!

  5. Hello,

     

    I'm hitting a brick wall with m thinking from object-oriented approaches. Basically, I want to create a melody line that "flutters"  pitches in a key corresponding to a bass pitch, and only when that bass pitch occurs. It's easy enough for an "If, then" statement but my attempt to solve this are leading me to take a first step of interpolating between bass pitches (as integers) and manually calculating the remains of the bar manually.
    However this is not ideal as I would prefer to use euclidean-rhythm with a rotation, so finding a parametric approach this would be ideal. Here's the general approach I've begun. 

    Any advice from people more experienced with LISP is appreciated.

     

    (setf bass '((g2)(c3)(a2)(e3)(fs3)))
    (setf bassint (pitch-to-integer bass))
    => ((-17) (-12) (-15) (-8) (-6))
    
    ;;; create a set of integers from interpolation 
    ;;; between bass integers (bassint), 
    ;;; then convert those to pitches
    
    (setf melody (gen-transition 1 10 10 1))

    Thanks,


    Tom

  6. Hello!

     

    I'm trying to use the arp-down function on some chords and not getting any results. Are they still supported?

     

    (setf protochords (gen-repeat 5 (respell '(eb2eb4g4bb4 arp-down 
    c2c4e4ab4 ab2eb4ab4b4 arp-down d2d4f4a4 arp-down bb2d4f4bb4 arp-down 
    g2eb4g4b4 arp-down c2c4eb4g4 arp-down ab2eb4ab4b4 arp-down d2d4gb4a4 arp-down 
    bb2d4gb4bb4 arp-down g2d4g4bb4 arp-down c2c4eb4g4 arp-down ab2c4eb4ab4 arp-down 
    f2db4f4a4 arp-down bb2db4f4bb4 arp-down g2d4g4bb4 arp-down eb2eb4gb4bb4 arp-down 
    ab2c4eb4ab4 arp-down f2db4f4a4 arp-down d2d4f4a4 arp-down g2d4g4bb4 arp-down 
    eb2eb4g4bb4 arp-down))))

     

    Thanks!

     

    Tom

  7. On 1/5/2023 at 1:07 PM, JulioHerrlein said:

    Dear Stéphane and Tom

     

    I did some edits in the Stéphane´s code. Some functions had names changed.

     

    Hope it can help.

    Best,

    Julio

     

     

    This works perfectly Julio. This provides some solid building blocks. Thanks Julio and Stephane!

  8. The find-closest could do the job but I'm having some difficulty implementing it with variables rather than integers

     

    ;; establish mline and tline (in this case just randomizing the tline)
    
    (setf mline '(d3 e3 d3 a3 f3 g3 c3))
    (setf tline (rnd-sample mlinecount '(c3 e3 g3)))
    
    ;; convert pitches to integer. Both of these work properly. I'm just trying to create variables with integers to apply into the "find-closest" function.
    (setf mlineint (pitch-to-integer mline)) 
    (setf tlineint (pitch-to-integer tline))
    
    ;; The following sample of "find-closest" works properly
    (find-closest 5 '(6 2 8 3))
    
    ;; the following howevfer does not
    (find-closest mlineint '(tlineint))

     

  9. My direction now is beginning with

    (setf mline '(d3 e3 d3 a3 f3 g3 c3))
    (setf mlinecount (get-count mline :length :note))
    
    (setf tline (rnd-sample mlinecount '(c3 e3 g3)))


    I just need to figure out how to replace the 

    rnd-sample

    function with a function that finds the next lowest pitch from (c3 e3 g3), and of course I could also just create a variable out of (c3 e3 and g3) but I hope you get my point.

  10. "I once implemented a version of this in PWGL "

     

     

    Thanks for finding this! I do not have any of these libraries nor use PWGL but I appreciate you jumping in!

     

    14 minutes ago, JulioHerrlein said:

    Dear Tom,

     

    Maybe it would be easier if you specify what kind of "rule" you imagine to implement the sequences.

    After that you could imagine many different ways to put this in movement, like randomizing the notes of the lines, shuffling the lines in a more specific way.

    And how would be the rhythmic and texture treatment ? And the instrumentation / voice layers ?

     

    Best ! 

    Thanks, Julio!


    I'm imagining a melody line of pitches and a "bag" array of the diatonic pitches for that key. Based on the pitch of the m line, the algorithm would select the closest inferior pitch from the diatonic array. Likely there would be a pitch-to-integer conversion to find the smallest difference between the melody line and the pitches in the "bag."

    I am thinking of this in Machine Learning terms as a K-means "nearest neighbor" approach which likely won't help me in Lisp!

     

    Tom

  11. Hello!

     

    I’m trying to approach a (sort of) contrapuntal composition style many know from Arvo Part as Tintinntabuli. The method is generally a tonal-based approach. I didn't see anything in the forums about it so I'm hoping this post isn't a duplicate.

     

    My understanding of it is as follows:

     

    1. In a key, say B minor, we have a melody line that could be:

     

    (Setf pitches ‘(cs3 d3 g3  e3 fs3 b3))

     

    This would be the M-line (melody line)

     

    Underneath we would have one or more T-lines (tintinntabuli). Each would consist only of the B minor triad. The pitch of the triad in the T-line corresponds to the pitch in the triad determined by the rule established by the composer. This can be inferior or superior. So I could have a T1 line that is comprised of the first inferior diatonic pitch the pitch in the M Line and a T2 line comprised of the second inferior diatonic pitch.

     

    So the T1 line would only consist of B, D and F#. To do this manually would be:

     

    ;; M1 Line

    (Setf pitches ‘(cs3 d3 g3  e3 fs3 b3))

     

    ;; T1 Line

    (Setf pitches ‘(b3 b3 fs3  d3 d3 fs2))

     

    What I’m trying to do is automate the creation of the T1 or T2 lines parametrically.

     

    Any advice on the best approach to this?

     

    Thanks!

     

    Tom Tolleson

  12. Hello!

    Sorry I'm just seeing your question. I'm using version 2.2.26813

    Executing the lines

     

    (midi-to-omn "/Users/tom/intermediate/midi/progression.mid"
                 :instrument 1
                 :bars '(1..8)
                 :quantize '(1 2 4 8))


    Returns this error in the listener:

    > Error: There is no applicable method for the generic function:
    >          #<standard-generic-function mts-track-info-tempos #x302000A6CCBF>
    >        when called with arguments:
    >          (nil)
    > While executing: #<ccl::standard-kernel-method no-applicable-method (t)>, in process Listener-2(9).
    > Type cmd-/ to continue, cmd-. to abort, cmd-\ for a list of available restarts.
    > If continued: Try calling it again
    > Type :? for other options.
    5 > 

     

     

    Hope that helps! I'm still unable to save MIDI to score.

    Thanks,


    Tom

  13. Hello!

     

    I’m trying to span a list and produce new lines of pitches, by interval (or otherwise) and with varying rhythmic values but have all the lines end on the same beat in the same bar. 

    To explain more specifically - I'm trying to span a list and perform an operation on each item in the list more than once.

     

    For example, if I have two melodic lines (variables named "pitches" and "basspitches") they might look something like this:

     

    (setf pitches '(fs3 e3 gs3 b2 a3 fs4 d4 b5 e4 gs4 fs4 gs4 cs4 fs4 b3 e4 fs4))

     

    (setf basspitches '(fs2 cs3 a2 e3 fs3 d3 b3 gs3 cs4 e3 cs3 fs3 d3 b3 gs2 fs2))

     

    I can play them together. However, if you notice, the first list “pitches” has 17 elements and “basspitches” has 16.

    But - I want them to end at the same time.

     

    So… I can have basspitches play with a variable “basslengths” set to 1/2 and then create an explicated lengths list for the “pitches” list called “lengths” as such:

     

    (setf lengths '(1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/2 1/4 1/4 1/2 1/2 1/2 1/2 1/2 1/2))

     

    Now they end at the same time. Great. However, this is a very clunky way to go about things.

     

    Additionally, this kind of primitive solution will not scale if I add functions to it.

     

    For example -

     

    If I use interval-scale2 to generate two additional voices (one based on the list “pitches” and one on “bass pitches”) my solution above won’t work if I want interval-scale2 to product one new pitch per 1/2 beat (one new pitch per item in the list) and another list to produce pitches at a 1/8 interval (or over varying intervals).

     

    The reason it won’t work is (obviously) because I’m spanning the “pitches” and “bass pitches” lists and operating on each item once.

     

    My question is - how do I span lists of pitches, producing new lines of pitches with varying rhythmic values and have all of the voices end on the same beat in the same bar? 

     

    Thanks!

     

    Tom Tolleson

  14. Hello again!
    So I've been working with this midi file and still getting no luck. I used miditocsv converter in python and I can see the tempo information there as 500000 ms (120bpm).

    Still having no luck and receiving the same error. I'm attaching both files.


    One possible solution - converting the MIDI to OMN in Python or LISP? I just need the pitch and duration (including rests) information. I'm happy to attemp this but I don't want to reinvent the wheel if there is already a wheel available. I'm attaching my files again.

    0, 0, Header, 1, 2, 480
    1, 0, Start_track
    1, 0, SMPTE_offset, 32, 0, 0, 0, 0
    1, 0, Time_signature, 3, 2, 24, 8
    1, 0, Tempo, 500000
    1, 0, End_track
    2, 0, Start_track
    2, 0, Title_t, "Lead"
    2, 0, Program_c, 0, 80
    2, 0, Control_c, 0, 7, 100
    2, 0, Control_c, 0, 10, 64
    2, 0, Note_on_c, 0, 55, 70
    2, 0, Control_c, 0, 1, 70
    2, 2375, Note_off_c, 0, 55, 0
    2, 2885, Note_on_c, 0, 53, 72
    2, 2885, Control_c, 0, 1, 72
    2, 3340, Note_off_c, 0, 53, 0

    ... so on and so forth (see complete data in attached  file)...
    2, 171816, End_track
    0, 0, End_of_file

    pacing.mid example_converted.csv

  15. Hello,

     

    I have a MIDI file which I'm able to play fine in OpusModus. When I attempt to use

    File > Export > MIDI to score

    I receive the following error:

    "The operation couldn’t be completed. The value NIL is not of the expected type (OR CONS INTEGER)."

    I've tried a variety of export settings, all result in the same error.

    My goal is to import a score in some format (MIDI, MusicXML) and convert to OMN.

     

    Thank you,

     

    Tom

     

  16. Hi @Wim Dijkgraaf- I'm using git and just do a standard commit from the folder my workspace an .opmo files are in once I update files. I use OM on two different machines so version control is essential to me not going crazy. Also, my supporting python files (and the music21 library).

    I think a git integration might be a cool feature and save some time. I doubt it's a high priority though because there are workarounds (like mine). Hope that helps.

×
×
  • Create New...

Important Information

Terms of Use Privacy Policy