Jump to content

All Activity

This stream auto-updates

  1. Yesterday
  2. here some functions (that i'm using currently). perhaps anyone/OPMO would include/optimze them.. take the ideas... greetings andré 1) rnd-order/sort-omn => picks omn-seqs/bars in rnd-order and sorting it (a mix-up and sort-process for OMN) (defun rnd-order/sort-omn (omnlist &key (type nil) (sort 'a) (step nil)) (let* ((int-seq (gen-integer 0 (1-(length omnlist)))) (sorted-int (gen-sort (rnd-order int-seq) :type type :sort sort :step step))) (loop for i in (flatten sorted-int) collect (nth i omnlist)))) (rnd-order/sort-omn '((w c4 mf) (h d4 ppp ten e4 ten) (q g4 leg a4 leg b4 leg) (e c5 d5 e5 f5 g5))) => ((q g4 leg a4 leg b4 leg) (w c4 mf) (h d4 ppp ten e4 ten) (e c5 d5 e5 f5 g5) (w c4 mf) (q g4 leg a4 leg b4 leg) (h d4 ppp ten e4 ten) (e c5 d5 e5 f5 g5) (w c4 mf) (h d4 ppp ten e4 ten) (q g4 leg a4 leg b4 leg) (e c5 d5 e5 f5 g5)) 2) filter-events by pitch (in all octaves!) / pos and neg ;; SUB (defun p-octaves (plist) (loop for i in '(-48 -36 -24 -12 0 12 24 36 48) append (pitch-transpose i plist))) ;;; MAINS (defun filter-events-pos (pitchlist omnlist) (loop for i in (single-events omnlist) when (null (member (second i) (p-octaves pitchlist))) collect '(-1/32) else collect i)) (defun filter-events-neg (pitchlist omnlist) (loop for i in (single-events omnlist) when (null (member (second i) (p-octaves pitchlist))) collect i else collect '(-1/32))) ;;;;; (filter-events-pos '(c4 d4 g4) '(t c4 mf cs4 d4 eb4 e4 f4 fs4 g4 gs4 a4 bb4 b4)) => ((t c4 mf) (-1/32) (t d4 mf) (-1/32) (-1/32) (-1/32) (-1/32) (t g4 mf) (-1/32) (-1/32) (-1/32) (-1/32)) (filter-events-neg '(c4 d4 g4) '(t c4 mf cs4 d4 eb4 e4 f4 fs4 g4 gs4 a4 bb4 b4)) => ((-1/32) (t cs4 mf) (-1/32) (t eb4 mf) (t e4 mf) (t f4 mf) (t fs4 mf) (-1/32) (t gs4 mf) (t a4 mf) (t bb4 mf) (t b4 mf))
  3. Last week
  4. Actually, what I'm finding works well is just to load the MIDI into Musescore and use the Midi Entry function under the Tools menu in OM to record the pitches. So my workflow is fine.
  5. Here you go! Tom progression.mid I have a lot of other files to load though as I output them from Musescore and other applications. It seems to be a bit of a sticking point in my workflow that it's not working with any of my MIDI files. Here's a file I currently need to convert to OMN. track1_percs.mid
  6. Dear André, Here is a project I did some years ago, with PD and Lilypond. Kind of realtime converter of beats to rhythmic notation.
  7. i know, of course, that LISP is not an environment for REALTIME actions (pure data / max would be much more suitable) - so I had to outsmart the system a little to import data (from a modularsynth and other applications) almost "on the fly" to generate a LIVE-SCORE (with the influence of this datas) at the concert/on the stage.... maybe i should learn MAX... for more smart-coded REALTIME things
  8. It´s also possible (using MAX or Pure Data) to convert audio impulses to length values using a value in milliseconds as reference for beats and then convert the results to OMN syntax. Nice Solution, Andre !
  9. MIDI KEYBOARD to OSCulator (translates MIDI to OSC) to OPMO (reading pitch (midi number) and set to variable X) 1) evaluate (setq *osc-receive*.......) 2) start/evaluate LOOP-section 3) start LIVE-CODE 4) play your midi-keyboard => in every cycle of LIVE-CODING the "keyboard-pitch" will be read --- to variable X -> tempo and pitch are changing (by new cycle start) 5) stop all, incl. evaluate (process-kill *osc-receive*)
  10. It is no clear how all this work and where is the midi (x) coming from.
  11. here is a short sketch of how you can integrate a midi keyboard into live coding. evaluate the BASIC SETUP as before but in a LOOP (here 10 times) the LIVE-CODING setup, so a new value X (the PITCH (midi number) from the external keyboard) is always read in (which comes from the keyboard)... these values can now be used on various parameters. for this sketch only pitch + tempo (see: tempo (list (* x 3)) VIDEO: at the beginnig you see data coming in from midi keyboard midi keyboard to live-coding.mov some code/sketch (defparameter *remote-host* "127.0.0.1") (defparameter *in-port* 1234) (defparameter *in-socket* (make-socket :type :datagram :local-port *in-port* :format :binary)) (setq *osc-receive* (process-run-function "osc-receive-process" #'(lambda () (loop do (print (setf x (second (osc::decode-message (receive-from *in-socket* 2048)))) #.*terminal-io*))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (loop repeat 10 do (progn (def-score test1 (:key-signature '(c maj) :time-signature '(4 4) :tempo (list (* x 3)) :start 1 :end 4) (part1 :omn (make-omn :pitch (list (midi-to-pitch x)) :length (gen-length-cartesian 1 1 'n 'n 'q '(2 3) '(13 4) '(1 2 3 4 5 6)) :span :length) :port 4 :channel 1 :sound 'gm :program 0 :volume 127)) (live-coding-midi (compile-score 'test1))) do (print x) do (sleep 3)) (process-kill *osc-receive*) ;; Prozess wieder anhalten
  12. I have now found a SOLUTION that might be also interesting for LIVE CODING: With the APP OSCulator you can convert midi-input (by an external keyboard) into OSC and then read it in real time (via osc-library + code) in OPMO (see video). Of course, it could also be done directly from OSC (then via an APP such as TouchOSC from the mobile or tablet). you just have to reread the values (by a loop-function) as you can see in the video; in this way, certain parameters of the LIVE-CODING could be controlled / influenced from the outside. LINKS: OSC to LISP: GitHub - zzkt/osc: a common lisp implementation of the Open Sound Control protocol aka OSC GITHUB.COM a common lisp implementation of the Open Sound Control protocol aka OSC - GitHub - zzkt/osc: a common lisp implementation of the Open Sound Control protocol aka OSC OSCulator: Home | OSCulator OSCULATOR.NET Links your controllers to your favorite music and video software. Works with Nintendo Wiimote, iPhone and more. TouchOSC: TouchOSC | hexler.net HEXLER.NET VIDEO: left- PROTOKOL to see what's MIDI-in right - midi to osc (OSCulator) bottom - OPMO with midi-data PRINT in the listener midi via osc to opmo.mov BASIC CODE: (defparameter *remote-host* "127.0.0.1") (defparameter *in-port* 1234) (defparameter *in-socket* (make-socket :type :datagram :local-port *in-port* :format :binary)) (setq *osc-receive* (process-run-function "osc-receive-process" #'(lambda () (loop do (print (osc::decode-message (receive-from *in-socket* 2048)) #.*terminal-io*))))) ;; instead of PRINT you could use SETF (process-kill *osc-receive*) ;; STOP "listening process" ;;; CODE by philippe kocher
  13. Earlier
  14. Please send me the midi file. progression.mid
  15. 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
  16. with OSC - (with the external osc-library i've sended you) - it should work similiar? loop-function which PRINT the revcevied osc-values over and over (it works). i would like to do that with MIDI but i'm not a lisp pro.... (code not by me) (defparameter *in-port* 9999) (defparameter *in-socket* (make-socket :type :datagram :local-port *in-port* :format :binary)) (setq *osc-receive* (process-run-function "osc-receive-process" #'(lambda () (loop do (print (osc::decode-message (receive-from *in-socket* 2048)) #.*terminal-io*))))) (process-kill *osc-receive*) ;; Prozess wieder anhalten
  17. Nothing to do with MIDI Entry - I wonder if this is possible with in the loop.
  18. DROP-VOICING (setf mat '(b2cs4eb4e4 cs3eb4f4gs4 c3d4e4f4 fs2bb3cs4e4)) (drop-voicing mat) The following example returns all chords of type 1: (drop-voicing mat :type '(1)) In this example we apply a different type to each chord: (drop-voicing mat :type '(0 1 2 3)) Here the leading voice is set to 'l (lowest voice): (drop-voicing mat :type '(0 1 2 3) :leading 'l) (setf chords '(w b3c4d4e4g4 p h g3b3c4d4e4 mf c4d4e4g4b4 p - q d4fs4g4b4 b3d4e4fs4g4 b3c4e4g4a4 mf a3c4d4e4f4 p c4d4e4f4a4 mp d4e4f4a4c5 w bb3d4f4a4 bb3d4eb4f4g4 p -q eb4f4g4bb4d5 mf c4d4f4a4bb4 mp e4f4g4a4c5 w c4e4g4b4)) (drop-voicing chords :type '(0 1 2 3 4 5 4 3 3 1 2 3 4 5 5)) (drop-voicing (omn :pitch (library 'standard 'chords 'Giant-Steps)) :type (rnd-sample 32 '(0 1 2 3 4 5) :seed 753) :leading 'l) (setf harm-prog '(c3g4c5ds5 c3fs4a4d5 g2g4as4d5 c3ds4as4d5 c3ds4a4c5 a2e4a4cs5 d3f4a4d5 e3e4gs4b4 a2e4a4c5 b2ds4fs4b4 e3e4g4b4 ds3c4fs4fs5 e3b3g4e5 e3as4cs5 as2f4as4d5 d3f4as4f5 ds3g4as4ds5 e3g4as4d5 a2e4a4cs5 d3fs4a4d5 g3g4b4d5 c3g4c5ds5 f3gs4c5d5 f3gs4f5 d3g4b4f5 c3g4c5ds5 gs2gs4c5ds5 gs2f4c5d5 d3fs4a4d5 g2f4b4d5 c3ds4g4c5 c3ds4g4c5)) (drop-voicing harm-prog :type (rnd-sample 32 '(0 1 2 3) :seed 45)) (drop-voicing harm-prog :type (rnd-sample 32 '(0 1 2 3) :seed 45) :leading 'l)
  19. thanx! but... it's "only a LISP problem" with LOOP and SLEEP my code should read X (the midi-values) every 2 seconds - (sleep 2). i don't know why "LISP don't safe" variable X inside the loop when i'm doing "midi-entry"....
  20. I don´t know if I got the whole idea but you can send a bunch of midi notes from any DAW to Opusmodus using a virtual midi cable. Record whatever you like onto reaper, logic, ableton live, etc and set a virtual midi output port to Opusmodus. You can send this midi notes at 3x the speed of original tempo if you like. The length information can be obtained only by import midi, however. Best, Julio It´s a sort of "mechamical solution" but I like it
  21. dear all as so often i try out strange things i switch on midi-entry, read the pitches which i enter from a keyboard. everything clear so far. I am now trying to do this in a 2-second-loop (with sleep-function), so that variable X would always be assigned new values. at the end of the loop sequence, however, X is NIL. only when I evaluate X again are the values assigned. (see video) (the idea is... to IMPORT live-midi into a "realtime-process") some ideas? thanx andré clip.mov
  22. actually, no need, I figured it out! Several other potential questions arose so I'm sure I'll post again soon. thanks!
  23. You need to set different quantisation. There are ornaments therefore the quantisation should be set higher. (midi-to-omn "~/Opusmodus/Media/MIDI/Bach/GV/bach-gv-aria.mid" :instrument 1 :bars '(1..8) :quantize '(1 2 4 8))
  24. I can't figure it out how it works, it gives strange results here (see screeshot), I need some assistance.. Thanks! (midi-to-omn "~/Opusmodus/Media/MIDI/Bach/bach-gv-aria.mid" :instrument 1) gives what is seen on the screenshot
  25. Please send the code (snippets) you are using. Without an example I can't help.
  26. Thanks for the reply and the assistance. Basically that is what I want achieve, but I'm hoping to do it within the confines of a single voice - note the dotted half note F above the phrase in my original example, this whole thing is played by the left hand. Your reply did spur me to solve the issue in a fashion by having a 3rd voice and merging all 3. However, this doesn't quite take care of the overall issue. It's a workaround I'll obviously just embrace for the moment, but I'd really love to not have to split passages into multiple voices and then merge them just for the sake of a couple ties. I have a lot of phrases where a single note is tied to one note an adjacent chord - is there really not a way to achieve that without breaking every such instance into multiple voices when the texture isn't really a contrapuntal situation? At any rate, that did get me out of that snag, so thanks v much, o_e. best, -m
  1. Load more activity
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy