Jump to content

opmo

Administrators
  • Posts

    2,869
  • Joined

  • Last visited

Everything posted by opmo

  1. New: POSITION-ATTRIBUTE ATTRIBUTE-MAP EVENTS-ANALYSIS OM Developer/Predicates: 12TONEP CONTAIN-ATTRIBUTEP ATTRIBUTE-SYMBOLP EVENT-RESTP POSITION-ATTRIBUTE: The function POSITION-ATTRIBUTE returns a lists of bar numbers and positions values of a given attribute in a sequence. This function is a companion to the ATTRIBUTE-MAP function. Examples: (setf mat '((h. f6 mp stacc) (-q h a4d2 p fermata e fermata) (e. a4d2 p - h e4g3 mf s fs6 p e c6 mp ten e. cs4 p tie) (e cs4 p q gs5eb6 h b2 p stacc e stacc) (q b2 p tie s q f6a4 mf -e q. d2 p ten) (h d2 p tie s q e4 mp tr2 s tr2 -q. q f4 stacc) (s f4 h. a3gs5 p fermata -e. -s))) (position-attribute 'fermata mat) => ((2 (1/4 3/4)) (7 (1/16))) (position-attribute '(fermata stacc) mat) => (((2 (1/4 3/4)) (7 (1/16))) ((1 (0)) (4 (3/8 7/8)) (6 (5/4)))) ATTRIBUTE-MAP: The function ATTRIBUTE-MAP aligns attributes of one sequence (instrument) to another sequence. It is especially useful when aligning attributes like fermatas. Examples: (setf inst1 '((5h fs6 mp stacc 5q f6 ten - fs6 fermata) (3h bb6 p stacc -3q) (5q gs6 f stacc a6 ten - gs6 fs6 fermata) (5e gs6 mf stacc fs6 stacc 5q g6 ten - gs6 fermata g6) (s bb6 mp stacc b6 ten bb6 -) (5q f6 p stacc 5h fs6 ten 5q f6 -) (5q eb6 f stacc - 5h e6 ten 5q eb6))) (setf inst2 '((3q c6 mf -3h) (-5q gs5 p 5h g5 5e gs5 g5) (-3q 3h bb5 p) (-3h 3e bb5 mf a5) (-3q 3h a5 mp) (5e bb5 p c6 -5q 5h b5 5e 5e cs6) (-s c6 f d6 e6))) Inserting fermata attribute into the inst2 sequence: (setf map (position-attribute 'fermata inst1)) => ((1 (1/5)) (3 (1/5)) (4 (3/20))) (attribute-map 'fermata map inst2) => ((3q c6 mp -3h fermata) (-5q gs5 p 5h g5 5e gs5 g5) (-3q 3h bb5 f fermata) (-3h 3e bb5 mf fermata a5) (-3q 3h a5 mp) (5e bb5 p c6 -5q 5h b5 5e 5e cs6) (-s c6 f d6 e6)) Inserting fermata and stacc attributes into the inst2 sequence: (setf map2 (position-attribute '(fermata stacc) inst1)) => (((1 (1/5)) (3 (1/5)) (4 (3/20))) ((1 (0)) (2 (0)) (3 (0)) (4 (0 1/40)) (5 (0)) (6 (0)) (7 (0)))) (attribute-map '(fermata stacc) map2 inst2) => ((3q c6 mf stacc -3h fermata) (-5q gs5 mf 5h g5 5e gs5 g5) (-3q 3h bb5 mf fermata) (-3h 3e bb5 mf stacc+fermata a5) (-3q 3h a5 mp) (5e bb5 p stacc c6 -5q 5h b5 5e 5e cs6) (-s c6 f d6 e6)) EVENTS-ANALYSIS: The function EVENTS-ANALYSIS analyses a list of events of a given bar in a sequence. Examples: (setf mat '((5h fs6 mp stacc 5q f6 ten - fs6 fermata) (3h bb6 p stacc -3q) (5q gs6 f stacc a6 ten - gs6 fs6 fermata) (5e gs6 mf stacc fs6 stacc 5q g6 ten - gs6 fermata g6) (s bb6 mp fermata-l b6 ten bb6 -) (5q f6 p stacc 5h fs6 ten 5q f6 -) (5q eb6 f stacc - 5h e6 ten 5q eb6))) (events-analysis 2 mat) => Bar: 2 Time Signature: (1 4 1) Events: ((3h bb6 p stacc) (-3q)) Span: (1/6 1/12) Pitch: (bb4) Prime Form: nil Normal Order: nil Velocity: (p) Ambitus: (bb6 bb6) Interval Ambitus: 0 (events-analysis 4 mat) => Bar: 4 Time Signature: (1 4 1) Events: ((5e gs6 mf stacc) (5e fs6 mf stacc) (5q g6 mf ten) (-5q) (5q gs6 mf fermata) (5q g6 mf)) Span: (1/40 1/40 1/20 1/20 1/20 1/20) Pitch: (gs4 fs4 g4) Prime Form: (0 1 2) Normal Order: (6 7 8) Velocity: (mf) Ambitus: (fs6 gs6) Interval Ambitus: 2 (setf mat2 '((h. f6 mp stacc) (-q h a4d2 p fermata e fermata) (e. a4d2 p - h e4g3 mf s fs6 p e c6 mp ten e. cs4 p tie) (e cs4 p q gs5eb6 h b2 p stacc e stacc) (q b2 p tie s q f6a4 mf -e q. d2 p ten) (h d2 p tie s q e4 mp tr2 s tr2 -q. q f4 stacc) (s f4 h. a3gs5 p fermata -e. -s))) (events-analysis 5 mat2) => Bar: 5 Time Signature: (17 16 1) Events: ((q b2 p tie) (s b2 p) (q f6a4 mf) (-e) (q. d2 p ten)) Span: (1/4 1/16 1/4 1/8 3/8) Pitch: (b4 f4 a4 d4) Prime Form: (0 2 5 8) Normal Order: (9 11 2 5) Velocity: (p mf) Ambitus: (d2 f6) Interval Ambitus: 51 12tonep: Returns true if list is a 12-tone scale, and NIL otherwise. Examples: (12tonep '(4 10 1 3 5 2 6 8 9 11 7 0)) => t (12tonep '(e4 as4 cs4 ds4 f4 d4 fs4 gs4 a4 b4 g4 c4)) => t (12tonep '(e4 as4 cs4 ds4 f4 d4 fs4 gs4 a4 b4 f4 c4)) => nil CONTAIN-ATTRIBUTEP: Returns true if attribute is found in the sequence, and NIL otherwise. Examples: (contain-attributep 'fermata '(-h fermata)) => t (contain-attributep 'stacc '(-e a4 fermata+stacc d4 p fermata)) => t ATTRIBUTE-SYMBOLP: Returns true if object is a attribute, and NIL otherwise. Examples: (attribute-symbolp 'tie) => t (attribute-symbolp 'ponte+ten) => t EVENT-RESTP: Returns true if event is a rest, and NIL otherwise. Examples: (event-restp '(-q)) => t (event-restp '(-q fermata)) => t Best wishes, JP
  2. In the velocity documents you find all the answers. Example All 127 velocities in floating point numbers: (vector-to-velocity 0.1 1.0 (gen-integer 1 127) :type :float) => (0.1 0.11 0.11 0.12 0.13 0.14 0.14 0.15 0.16 0.16 0.17 0.18 0.19 0.19 0.2 0.21 0.21 0.22 0.23 0.24 0.24 0.25 0.26 0.26 0.27 0.28 0.29 0.29 0.3 0.31 0.31 0.32 0.33 0.34 0.34 0.35 0.36 0.36 0.37 0.38 0.39 0.39 0.4 0.41 0.41 0.42 0.43 0.44 0.44 0.45 0.46 0.46 0.47 0.48 0.49 0.49 0.5 0.51 0.51 0.52 0.53 0.54 0.54 0.55 0.56 0.56 0.57 0.58 0.59 0.59 0.6 0.61 0.61 0.62 0.63 0.64 0.64 0.65 0.66 0.66 0.67 0.68 0.69 0.69 0.7 0.71 0.71 0.72 0.73 0.74 0.74 0.75 0.76 0.76 0.77 0.78 0.79 0.79 0.8 0.81 0.81 0.82 0.83 0.84 0.84 0.85 0.86 0.86 0.87 0.88 0.89 0.89 0.9 0.91 0.91 0.92 0.93 0.94 0.94 0.95 0.96 0.96 0.97 0.98 0.99 0.99 1.0)
  3. What about floating point numbers velocity (make-omn :length '(e = = = = = = =) :pitch '(c4 cs5 b3 c4) :velocity '(0.1 0.2 0.21 0.32)) => (e c4 0.1 cs5 0.2 b3 0.21 c4 0.32 0.1 cs5 0.2 b3 0.21 c4 0.32)
  4. When you suggest something please in context of a function: input (var) and output (result). This will enhance the communication.
  5. The EVENTS-ANALYSIS function will be useful for editing: (events-analysis 34 sequence) => Bar: 34 Time Signature: (5 4 1) Contents: (h bb5 mf q e3 mp tr2 -s f4 tr2 q. bb5) Number of events: 5 Events: ((h bb5 mf) (q e3 mp tr2) (-s) (s f4 mp tr2) (q. bb5 mp)) Events span: (1/2 1/4 1/16 1/16 3/8) Pitches: (bb5 e3 f4 bb5) Ambitus: (-8 22) At the moment I am work on INSERT-FERMATA and EDIT-EVENTS which will allow us to edit any event in a sequence. The INSERT-FERMATA function will insert a fermata attribute in the same position (measure) into all of the instruments.
  6. Function name change: PAUSE-EVENTS now FILTER-EVENTS New: OMN-MERGE-RESTS This function merge adjacent rests values into a single rest. (omn-merge-rests '(q c4 p d4 f - - e e4g4 tie q. e4g4)) => (q c4 p d4 f -h e e4g4 tie q.) (omn-merge-rests '(q c4 p d4 f - - q e4g4 tie q e4g4 - -e fermata)) => (q c4 p d4 f -h q e4g4 tie e4g4 - -e fermata) OMN-MERGE-TIES This function merge ties (tie) in phrases of omn into a single note or chord. (omn-merge-ties '(q c4 p d4 f - - e e4g4 tie q. e4g4)) => (q c4 p d4 f - - h e4g4) (omn-merge-ties '((e g6 f stacc ab5 mp ten c4 mf ten cs5 ff) (e c3 p tie s c3 tie c3 e eb3 mf stacc s bb4 pp tie bb4))) => ((e g6 f stacc ab5 mp ten c4 mf ten cs5 ff) (q c3 p e eb3 mf stacc bb4 pp)) (omn-merge-ties '(s c4 tie s c4 tie s c4 tie s c4 s d4 tie s d4 tie s d4 tie s d4 s e4 tie s e4 tie s e4 t gs5 g5 fs5 f5 e5 -t s g4 tie s g4 tie s g4 tie s g4 tie s g4 tie s g4)) => (q c4 d4 e. e4 t gs5 g5 fs5 f5 e5 - q. g4)
  7. New: FILTER-EVENTS The function FILTER-EVENTS internally brakes-up an omn sequence into single-events (l p v a) and checks whether an event contains the given element. When an element is found the event is returned. All other events are transformed into rests. The option remain will invert the process. (filter-events 'd4 '(e c4 mp -e fermata e. d4 -h e. c4 e e4)) => (-q e. d4 mp -h.s) (filter-events 'd4 '(e c4 mp -e fermata e. d4 -h e. c4 e e4) :remain t) => (e c4 mp -e fermata -he. e. c4 e e4) These two options are useful for orchestration. Examples: (setf mat1 '(e c4 mp arco+ponte -e fermata e. d4 mp tasto -h e. c4 p pizz+ponte e e4 p arco+tasto)) (filter-events 'arco+ponte mat1) => (e c4 mp arco+ponte -we) (filter-events 'arco+ponte mat1 :remain t) => (-e -e fermata e. d4 mp tasto -h e. c4 p pizz+ponte e e4 arco+tasto) (filter-events 'fermata mat1 :remain t) => (e c4 mp arco+ponte - e. d4 tasto -h e. c4 p pizz+ponte e e4 arco+tasto) (filter-events 'fermata mat1) => (-e -e fermata -w) (filter-events 'd4 mat1 :remain t) => (e c4 mp arco+ponte -e fermata -he. e. c4 p pizz+ponte e e4 arco+tasto) (filter-events '(e d4) mat1) => (e c4 mp arco+ponte - e. d4 tasto -he. e e4 p arco+tasto) (filter-events '(e d4) mat1 :remain t) => (-e -e fermata -he. e. c4 p pizz+ponte -e) (setf mat2 '((e c4 mp arco+ponte -e fermata e. d4 mp tasto -h e. c4 p pizz+ponte e e4 p arco+tasto) (e c4 f stacc e. d4 -h e. c4 p ord -e fermata e4 stacc))) (filter-events 'e. mat2 :section 1 :remain t) => ((e c4 mp arco+ponte -e fermata e. d4 mp tasto -h e. c4 p pizz+ponte e e4 p arco+tasto) (e c4 f stacc -h.. -e fermata e4 p stacc)) (filter-events '((e.) (e4 fermata)) mat2) => ((-q e. d4 mp tasto -h e. c4 p pizz+ponte -e) (-w -e fermata e4 p stacc)) (filter-events '(e4 fermata) mat2 :remain t) => ((e c4 mp arco+ponte - e. d4 tasto -h e. c4 p pizz+ponte -e) (e c4 f stacc e. d4 -h e. c4 p ord -q)) Best wishes, JP
  8. Fix: TIE-BARS and FILTER-TIE TIE-BARS: (setf mat '((e c3 g2 fs2 cs2 c2) (e c2 stacc cs2 fs2 g2 c3) (e c3 stacc g2 fs2 cs2 c2) (e c2 ten cs2 fs2 g2 c3) (e c3 g2 fs2 cs2 c2))) (tie-bars mat) => ((e c3 g2 fs2 cs2 c2 tie+stacc) (e c2 cs2 fs2 g2 c3 tie+stacc) (e c3 g2 fs2 cs2 c2 tie+ten) (e c2 cs2 fs2 g2 c3 tie) (e c3 g2 fs2 cs2 c2)) In the following example we tie bars 2 and 3: (tie-bars mat :section '(2 3)) => ((e c3 g2 fs2 cs2 c2) (e c2 stacc cs2 fs2 g2 c3) (e c3 stacc g2 fs2 cs2 c2 tie+ten) (e c2 cs2 fs2 g2 c3) (e c3 g2 fs2 cs2 c2)) FILTER-TIE: (filter-tie '(-q c4 f c4 p gliss d4 p e4 e4 e4 fermata)) => (-q h c4 p gliss q d4 h. e4 fermata) (filter-tie '((-q c4 d4 f4 e4) (q e4 f4 g4 a4) (e a4 a4 stacc g4 f4 = = q a4) (q a4 d4 f4 e4))) => ((-q c4 mf d4 f4 e4 tie) (q e4 mf f4 g4 a4 tie+stacc) (q a4 mf e g4 q. f4 q a4 tie) (q a4 mf d4 f4 e4)) Best wishes, JP
  9. (omn-merge-ties '(s c4 tie s c4 tie s c4 tie s c4 s d4 tie s d4 tie s d4 tie s d4 s e4 tie s e4 tie s e4 t gs5 g5 fs5 f5 e5 -1/32 s g4 tie s g4 tie s g4 tie s g4 tie s g4 tie s g4)) => (q c4 d4 e. e4 t gs5 g5 fs5 f5 e5 - q. g4) (omn-merge-ties '(s c4 tie s c4 tie s c4 tie s c4 s d4 tie s d4 tie s d4 tie s d4 s e4 tie s e4 tie s e4 1/24 gs5 1/24 1/24 s g4 tie s g4 tie s g4 tie s g4 tie s g4 tie s g4 tie s g4)) => (q c4 d4 e. e4 3e gs5 gs5 gs5 q.. g4) I will make a doc for the function soon.
  10. Export the two data files from SPEAR app: Text - Resampled Frames Text - Partials and save them in the ~/Opusmodus/Spectral Data/Data folder. Next: Import the SPEAR frames and partials data into Opusmodus format. Frames: (import-spectral-spear :frames "tbn cs3 frames" ;<- imported file "tbn-cs3-frames") ;<- output file name Partials: (import-spectral-spear :partials "tbn cs3 partials" "tbn-cs3-partials") The last step is to create a library file for an easy access to all the partials. To do that we need to load the file with the LOAD function (the path should point to the file in the Data folder): (load "~/Opusmodus/Spectral Data/Partials/tbn-cs3-partials.opmo") (load "~/Opusmodus/Spectral Data/Partials/tbn-cs3-frames.opmo") or alternatively you can open the file in the Assistant panel and evaluate. And finally we create the library: The expression below will create a folder Partials with inside a library file tbn-cs3-frames.opmo. (create-library 'tbn-cs3-frames 'frames 'p tbn-cs3-frames :file "Partials/tbn-cs3-frames") (create-library 'tbn-cs3-partials 'partials 'p tbn-cs3-partials :file "Partials/tbn-cs3-partials") Having followed the stages as above a new library with the name tbn-cs3-frames.opmo is created in the Def-Library folder.
  11. Update to GEN-CONTROLLER function: The GEN-CONTROLLER function generates controller values in a given span (total length) with a defined time for each of the values (<value> <time>). The count of the sent messages is the sum of the time values equal to the span value. For example span 1/4 with time 1/128 will produce 32 values. (setf values (gen-sine 32 4 1.0)) (gen-controller 1/4 values) => ((64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (64 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128)) The :min and :max option allows you to control the minimum and maximum value of the sent messages: (gen-controller 1/4 values :min 20 :max 80) => ((50 1/128) (71 1/128) (80 1/128) (71 1/128) (50 1/128) (29 1/128) (20 1/128) (29 1/128) (50 1/128) (71 1/128) (80 1/128) (71 1/128) (50 1/128) (29 1/128) (20 1/128) (29 1/128) (50 1/128) (71 1/128) (80 1/128) (71 1/128) (50 1/128) (29 1/128) (20 1/128) (29 1/128) (50 1/128) (71 1/128) (80 1/128) (71 1/128) (50 1/128) (29 1/128) (20 1/128) (29 1/128)) If the values count is less than the sum of the time values equal to the span then the last value of the list is used to complete the count. (gen-controller 1/2 values) => ((64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (64 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128) (19 1/128)) The loop option will trim the values to complete the time count: (gen-controller 1/2 values :loop t) => ((64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (64 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (64 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128) (64 1/128) (108 1/128) (127 1/128) (108 1/128) (63 1/128) (19 1/128) (0 1/128) (19 1/128)) Example with user defined times: (setf length '(q = s = = = h)) (gen-controller 2 values :time length) => ((64 1/4) (108 1/4) (127 1/16) (108 1/16) (63 1/16) (19 1/16) (0 1/2) (19 1/4) (64 1/4) (108 1/16) (127 1/16) (108 1/16) (64 1/16)) GEN-CONTROLLER inside the DEF-SCORE instrument instance: :controllers (45 (gen-controller 1/2 values :loop t)) Score Example: (progn (setf vec1 (gen-sine 1024 3 1)) (setf vec2 (gen-sine 1024 4 1)) (setf vec3 (gen-sine 1024 10 0.5)) (def-score ctrl (:key-signature 'chromatic :time-signature '(8 4) :tempo 78) (ctrl :omn '((w c4 c4) (w cs5 cs5) (w d4 d4) (w eb5 eb5) (d eb5)) :sound 'gm :channel 1 :program 'String-Ensemble-1 :volume (gen-controller 10 vec1 :min 20 :max 100) :tuning '((0 0.25) (-0.5 0) (0 0.5) (0.5 0.75) (0.5)) :pan (assemble-seq (gen-controller 5 vec2) (gen-controller 5 vec1)) :controllers (1 (assemble-seq '(127 5) (gen-controller 5 vec1)))) )) Best wishes, JP
  12. Just use numbers to pitch, lengths etc... conversion. I would advise you to check the System Function documentation and play with the examples a bit :-) Example: (setf fib (interval-modus (fibonacci 0 23) :mod 12)) (setf pitch (integer-to-pitch fib)) => (c4 cs4 cs4 d4 eb4 f4 gs4 cs4 a4 bb4 g4 f4 c4 f4 f4 bb4 eb4 cs4 e4 f4 a4 d4 b4 cs4) (setf length (vector-to-length 1/16 1 2 fib)) => (1/16 1/16 1/16 1/16 1/16 1/16 1/8 1/16 1/8 1/8 1/8 1/16 1/16 1/16 1/16 1/8 1/16 1/16 1/16 1/16 1/8 1/16 1/8 1/16) (make-omn :length length :pitch pitch) => (s c4 cs4 cs4 d4 eb4 f4 e gs4 s cs4 e a4 bb4 g4 s f4 c4 f4 f4 e bb4 s eb4 cs4 e4 f4 e a4 s d4 e b4 s cs4)
  13. There are endless possibilities: Example 1 (let* ((l '(0 1 -1 0)) (r l)) (loop repeat 3 collect (x+b l (car (setf r (gen-rotate -1 r)))) into bag finally (return (append (list l) bag)))) => ((0 1 -1 0) (1 2 0 1) (-1 0 -2 -1) (0 1 -1 0)) Example 2 (gen-eval 4 '(x+b (rnd-order '(0 1 -1 0)) (rnd-pick '(0 1 -1 0)))) => ((0 0 1 -1) (-1 -2 0 -1) (1 2 0 1) (-1 0 -2 -1)) Example 3 (progn (setf l '(0 1 -1 0)) (gen-eval 4 '(setf l (x+b (rnd-order l) (rnd-pick '(0 1 -1 0)))))) => ((1 0 2 1) (2 3 2 1) (1 0 1 2) (1 0 2 1))
  14. You define the sound set for the virtual instrument and not for the DAW. Opusmodus supports any CC and naturally continuously sending of messages, for that you use the :controller keyword. The :tuning is not a controller as such. This is fixed:
  15. New functions: HALF-SINE, HALF-SAWTOOTH, HALF-TRIANGLE, HALF-SQUARE JOIN-ATTRIBUTES, DISJOIN-ATTRIBUTES HALF-SINE The HALF-SINE function generates a sequence of vectors that describe and simulate the characteristics of a half sine wave. First the GEN-SINE: (gen-sine 32 1 0.5) Now the HALF-SINE: (half-sine 32 0.5) With control over resolution (the length of the wave), frequency and amplitude (and additional control over phase and modulation) this function can be a remarkably effective tool for creating gestural forms in pitch, rhythm, dynamics and structure. Examples: With the shortcut ⌃1 (menu: Plot/Numbers) as a guide it's possible to experiment with shapes and forms before applying these to musical parameters. (half-sine 120 1.0 :phase 90) In the example below the keyword :modulation is applied and its values are generated by the GEN-SINE function. (half-sine 120 1.0 :phase 90 :modulation (gen-sine 120 1 0.2)) In the example below the amplitude parameter '(0.5 0.2 0.1) has three values. These represent a sequence of alternating amplitudes. (half-sine 120 '(0.5 0.2 0.1)) In this final example the keyword :phase is used to produce a different start point (90) in the 360 degree range. (half-sine 120 '(0.5 0.2 0.1) :phase 90) In this final example the GEN-SINE the amplitude values are generated by the HALF-SINE function: (gen-sine 120 5 (half-sine 120 1.0 :phase 180)) (gen-sine 120 5 (half-sine 240 1.0 :phase 180)) Here below there's a clear example of how alternating amplitude values can affect the wave output when the vectors are mapped to pitches. (vector-to-pitch '(g3 g5) (gen-sine 120 32 (half-sine 120 1.0 :phase 180)) HALF-TRIANGLE The HALF-TRIANGLE function generates a sequence of vectors that describe and simulate the characteristics of a half triangle wave. First the GEN-TRIANGLE: (gen-triangle 32 1 0.5) Now the HALF-TRIANGLE: (half-triangle 32 0.5) With control over resolution (the length of the wave), frequency and amplitude (and additional control over phase and modulation) this function can be a remarkably effective tool for creating gestural forms in pitch, rhythm, dynamics and structure. Examples: With the shortcut ⌃1 (menu: Plot/Numbers) as a guide it's possible to experiment with shapes and forms before applying these to musical parameters. (half-triangle 120 1.0 :phase 45) In the example below the keyword :modulation is applied and its values are generated by the GEN-TRIANGLE function. (half-triangle 120 1.0 :phase 45 :modulation (gen-triangle 120 1 0.2)) In the example below the amplitude parameter '(0.5 0.2 0.1) has three values. These represent a sequence of alternating amplitudes. (half-triangle 120 '(0.5 0.2 0.1)) In this final example the keyword :phase is used to produce a different start point (90) in the 360 degree range. (half-triangle 120 '(0.5 0.2 0.1) :phase 90) In this final example the GEN-TRIANGLE the amplitude values are generated by the HALF-TRIANGLE function: (gen-triangle 120 5 (half-triangle 120 1.0 :phase 180)) (gen-triangle 120 5 (half-triangle 240 1.0 :phase 180)) Here below there's a clear example of how alternating amplitude values can affect the wave output when the vectors are mapped to pitches. (vector-to-pitch '(g3 g5) (gen-triangle 120 32 (half-triangle 120 1.0 :phase 180)) HALF-SQUARE The HALF-SQUARE function generates a sequence of vectors that describe and simulate the characteristics of a half square wave. First the GEN-SQUARE: (gen-square 32 1 0.5) Now the HALF-SQUARE: (half-square 32 0.5) With control over resolution (the length of the wave), frequency and amplitude (and additional control over phase and modulation) this function can be a remarkably effective tool for creating gestural forms in pitch, rhythm, dynamics and structure. Examples: With the shortcut ⌃1 (menu: Plot/Numbers) as a guide it's possible to experiment with shapes and forms before applying these to musical parameters. (half-square 120 1.0 :phase 45) In the example below the keyword :modulation is applied and its values are generated by the GEN-SQUARE function. (half-square 120 1.0 :phase 90 :modulation (gen-square 120 1 0.7)) In the example below the amplitude parameter '(0.5 0.2 0.1) has three values. These represent a sequence of alternating amplitudes. (half-square 120 '(0.5 0.2 0.1)) In this final example the keyword :phase is used to produce a different start point (90) in the 360 degree range. (half-square 120 '(0.5 0.2 0.1) :phase 90) In this final example the GEN-SQUARE the amplitude values are generated by the HALF-SQUARE function: (gen-square 120 5 (half-square 120 1.0 :phase 180)) (gen-square 120 5 (half-square 240 1.0 :phase 180)) Here below there's a clear example of how alternating amplitude values can affect the wave output when the vectors are mapped to pitches. (vector-to-pitch '(g3 g5) (gen-square 120 32 (half-square 120 1.0 :phase 180)) HALF-SAWTOOTH The HALF-SAWTOOTH function generates a sequence of vectors that describe and simulate the characteristics of a half sawtooth wave. First the GEN-SAWTOOTH: (gen-sawtooth 32 1 0.5) Now the HALF-SAWTOOTH: (half-sawtooth 32 0.5) With control over resolution (the length of the wave), frequency and amplitude (and additional control over phase and modulation) this function can be a remarkably effective tool for creating gestural forms in pitch, rhythm, dynamics and structure. Examples: With the shortcut ⌃1 (menu: Plot/Numbers) as a guide it's possible to experiment with shapes and forms before applying these to musical parameters. (half-sawtooth 120 1.0 :phase 90) In the example below the keyword :modulation is applied and its values are generated by the GEN-SAWTOOTH function. (half-sawtooth 120 1.0 :phase 90 :modulation (gen-sawtooth 120 1 0.7)) In the example below the amplitude parameter '(0.5 0.2 0.1) has three values. These represent a sequence of alternating amplitudes. (half-sawtooth 120 '(0.5 0.2 0.1)) In this final example the keyword :phase is used to produce a different start point (90) in the 360 degree range. (half-sawtooth 120 '(0.5 0.2 0.1) :phase 90) In this final example the GEN-SAWTOOTH the amplitude values are generated by the HALF-SAWTOOTH function: (gen-sawtooth 120 5 (half-sawtooth 120 1.0 :phase 180)) (gen-sawtooth 120 5 (half-sawtooth 240 1.0 :phase 180)) Here below there's a clear example of how alternating amplitude values can affect the wave output when the vectors are mapped to pitches. (vector-to-pitch '(g3 g5) (gen-sawtooth 120 32 (half-sawtooth 120 1.0 :phase 180)) DISJOIN-ATTRIBUTES The function DISJOIN-ATTRIBUTES separates a combined articulations into a list of its individual attributes. (disjoin-attributes 'leg+ponte) => (leg ponte) (disjoin-attributes 'leg+ponte+stacc) => (leg ponte stacc) JOIN-ATTRIBUTES The function JOIN-ATTRIBUTES merges a list of attributes into one articulation. (join-attributes '(leg ponte)) => leg+ponte (join-attributes '(leg+ponte stacc)) => leg+ponte+stacc Fix to OMN-REPLACE :articulation Best wishes, JP
  16. Logic, Reaktor, Kontakt and VSL Ensemble Pro works beautifully with Opusmodus. The Mozarteum is using Opusmodus with Reaper as well :-)
  17. The :tuning has no timing resolution control. To control the timing you must use :controller keyword.
  18. The new PPRINT-SCORE function will print the bar numbers in each of the instruments: (pprint-score (compile-score 'add-triangle :output :score)) Result: (def-score add-triangle (:title "Waves Add-Triangle" :composer "OPMO" :copyright "© 2014 Opusmodus" :key-signature 'chromatic :layout '(:brace (:flexible-treble rh) (:flexible-bass lh) :name "" :abbr "" :flexible-clef t) :rewrite-lengths 't :time-signature '((1 4 1) (3 8 1) (5 16 1) (3 8 2) (1 4 3) (5 16 2) (3 8 1) (1 4 1) (5 16 1) (3 8 2) (5 16 2) (1 4 2) (3 8 1) (1 4 1) (3 8 1) (7 16 1) (5 16 2) (7 16 1) (1 4 1) (5 16 1) (1 4 3) (3 8 1) (5 16 1) (3 8 2) (1 4 3) (5 16 2) (3 8 1) (1 4 1) (5 16 1) (3 8 2) (5 16 2) (1 4 2) (3 8 1)) :tempo '120) (rh :omn '(#|1|# (s g1 ff gs1 mf a1 p b1 mf) #|2|# (e c2 p cs2 ff s d2 p e2 mf) #|3|# (e f2 s fs2 ff g2 p a2 ff) #|4|# (e b2 ff c3 s cs3 eb3) #|5|# (e e3 mf f3 ff s fs3 a3 mf) #|6|# (s bb3 b3 ff c4 mf e4 ff) #|7|# (s e4 p f4 ff mf b4 p) #|8|# (s b4 mf ff mf fs5) #|9|# (s fs5 p e f5 mf s p cs6) #|10|# (s cs6 mf c6 b5 ff e g6 mf) #|11|# (s g6 ff e e f6 s g6) #|12|# (s g6 p ff g6 fs6) #|13|# (s g6 ff g6 e s fs6) #|14|# (e fs6 mf s e p s ff) #|15|# (s fs6 p e s e mf) #|16|# (s fs6 ff e s s f6 mf) #|17|# (e fs6 ff s mf p f6 mf) #|18|# (s f6 ff fs6 fs6 mf f6 ff) #|19|# (s f6 ff fs6 p ff f6 p) #|20|# (e f6 p s ff e fs6 mf s f6) #|21|# (s f6 ff mf p ff) #|22|# (s f6 ff mf e p ff) #|23|# (e f6 ff f6 f6 p s mf) #|24|# (s f6 f6 e ff s) #|25|# (s f6 p f6 e mf s) #|26|# (e f6 p mf s p e) #|27|# (s f6 p f6 e6 f6 mf) #|28|# (s f6 ff e6 p e eb6 s f6 ff) #|29|# (s f6 mf e6 ff d6 f6 p) #|30|# (s f6 mf e6 d6 ff f6) #|31|# (s f6 mf e6 p cs6 ff f6 p) #|32|# (e f6 p mf s cs6 ff f6 mf) #|33|# (e f6 s p cs6 fs6 ff) #|34|# (e f6 ff e6 p s bb5 f6 mf) #|35|# (e e6 p b5 ff s f5 mf eb6 p) #|36|# (s bb5 mf fs5 p cs5 mf a5 ff) #|37|# (s e5 p c5 mf gs4 p d5 mf) #|38|# (s bb4 ff fs4 p d4 g4) #|39|# (s e4 ff e d4 mf s b3 p eb4) #|40|# (s cs4 ff bb3 p gs3 mf e c4) #|41|# (s a3 ff e p b3 s gs3 mf) #|42|# (s bb3 ff c4 d4 mf b3 ff) #|43|# (s cs4 p eb4 e f4 mf s eb4 ff) #|44|# (e e4 mf s fs4 e gs4 p s fs4 mf) #|45|# (s g4 p e a4 s bb4 ff e a4 mf) #|46|# (s bb4 p e c5 ff s cs5 p c5) #|47|# (e cs5 p s eb5 e5 eb5 mf) #|48|# (s e5 ff fs5 g5 mf fs5 p) #|49|# (s g5 mf gs5 a5 p mf) #|50|# (e bb5 p s b5 e c6 s)) :channel 1 :sound 'gm :program 'acoustic-grand-piano :volume 90 :pan 64) (lh :omn '(#|1|# (s gs1 p g1 b0 mf a0 ff) #|2|# (e c1 p cs1 mf s d1 p e1 mf) #|3|# (e a1 p s g1 mf fs1 f1) #|4|# (e b1 ff c2 s cs2 mf eb2) #|5|# (e e2 ff f2 mf s fs2 a2 p) #|6|# (s e3 mf c3 p b2 mf bb2 ff) #|7|# (s b3 mf f4 f4 ff fs4) #|8|# (s b3 ff p mf fs4 p) #|9|# (s cs5 mf e a5 s p gs5 mf) #|10|# (s g5 ff eb6 p d6 mf e cs6 ff) #|11|# (s g5 p e a5 mf g5 ff s) #|12|# (s fs5 p g5 mf g5 g5 ff) #|13|# (s g5 ff mf e p s fs5 ff) #|14|# (e fs5 p s ff e p s mf) #|15|# (s fs5 p e s mf e p) #|16|# (s f5 mf e fs5 ff s s mf) #|17|# (e f5 ff s fs5 mf fs5 fs5) #|18|# (s f5 e5 p e5 f5 ff) #|19|# (s f5 ff e5 e5 mf f5 ff) #|20|# (e f5 ff s fs5 mf e f5 ff s mf) #|21|# (s f5 ff mf ff f5) #|22|# (s f5 ff f5 e e) #|23|# (e f5 mf ff p s ff) #|24|# (s f5 p ff e p s) #|25|# (s f5 mf ff e mf s ff) #|26|# (e f5 mf f5 s p e mf) #|27|# (s f5 p f5 fs5 f5 ff) #|28|# (s f5 ff fs5 p e g5 s f5) #|29|# (s f5 mf f5 e5 p d5 mf) #|30|# (s f5 gs5 fs5 p f5 mf) #|31|# (s f5 p fs5 a5 ff f5) #|32|# (e f5 ff p s a5 f5 mf) #|33|# (e fs5 s f5 p ff cs5) #|34|# (e f5 ff fs5 p s c6 ff f5) #|35|# (e e5 ff b4 s f4 mf eb5 p) #|36|# (s bb4 mf d5 p g5 ff b4 mf) #|37|# (s e4 p gs4 c5 fs4 mf) #|38|# (s g3 p d3 mf fs3 p bb3) #|39|# (s e3 mf e fs3 ff s a3 p f3 mf) #|40|# (s c3 ff gs2 mf bb2 p e cs3) #|41|# (s b2 p e a2 ff mf s gs2) #|42|# (s b2 gs2 p bb2 mf c3) #|43|# (s eb3 f3 p e eb3 mf s cs3 ff) #|44|# (e fs3 ff s gs3 e fs3 s e3 p) #|45|# (s g3 p e a3 ff s bb3 mf e a3) #|46|# (s c4 ff e cs4 s c4 mf bb3 ff) #|47|# (e e4 p s eb4 eb4 cs4 ff) #|48|# (s e4 mf fs4 ff g4 p fs4 ff) #|49|# (s a4 mf p bb4 mf b4 ff) #|50|# (e bb4 p s a4 e gs4 s)) :channel 1 :sound 'gm :program 'acoustic-grand-piano :volume 90 :pan 64)) You don't need to use the function PPRINT-SCORE. After the evaluation of the score just press ⌥⌘⇥
  19. I just tested the Ableton Live and Opusmodus Live Coding system - no problems here, but only on 1 port. added 6 minutes later Any program (Ableton Live, Logic etc...) can be controlled by OM. It is important to make a DEF-SOUND-SET file for your system first.
  20. Using length symbols is even better :-) (init-seed 434) (setf pitch '(a3 b3 c4 d4 a3 b3 c4 d4)) (setf theme1 (make-omn :pitch (gen-eval 12 '(rnd-octaves '(c1 c7) (rnd-order pitch))) :length '(e - - - = - - -) :velocity '(ff) :span :pitch )) (setf theme2 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-e s = -e - - = - -) :velocity '(ff) :span :pitch )) (setf theme3 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-e - = - - - = -) :velocity '(ff) :span :pitch )) (setf theme4 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-e - - = - - - 3e = =) :velocity '(ff) :span :pitch )) (def-score temp ( :key-signature 'chromatic :time-signature '(4 4) :composer "Alain Jamot" :copyright "Copyright © 2017 alain jamot" :tempo 120 :flexible-clef t :ignore-velocity t ) (piano :omn theme1 :channel 1 :sound 'gm :program 'acoustic-grand-piano ) (flute :omn theme2 :channel 2 :sound 'gm :program 'flute ) (violin :omn theme3 :channel 3 :sound 'gm :program 'violin ) (marimba :omn theme4 :channel 4 :sound 'gm :program 'marimba ) )
  21. You might find the function OMN-RECONSTRUCT useful in your work: (omn-reconstruct '(e c4 mp stacc -3/16 -1/2 e. c4 p ord -1/8)) => (e c4 mp stacc -e. -h e. c4 p ord -e) (omn-reconstruct '(e c4 mp stacc -3/16 -1/2 e. c4 p ord -1/8 (leg q c4 d4 e4))) => (e c4 mp stacc -e. -h e. c4 p ord -e q c4 leg d4 leg e4) (omn-reconstruct '((e c4 p stacc -3/16) (-1/2 e. c4 ord) (-1/8 (leg q c4 d4 e4)))) => ((e c4 p stacc -e.) (-h e. c4 ord) (-e q c4 leg d4 leg e4)) (omn-reconstruct '((e c4 p stacc -3/16) (-1/2 e. c4 ord) (-1/8 (leg q c4 d4 e4))) :velocityp t) => ((e c4 p stacc -e.) (-h e. c4 p ord) (-e q c4 p leg d4 leg e4))
  22. Note: It Is better to add the velocity with MAKE-OMN. You can hide the the velocity symbols with :ignore-velocity t As you are using repeat (length) you can :span the lengths to :pitch (count). I made the example a bit longer using GEN-EVAL function :-) (init-seed 434) (setf pitch '(a3 b3 c4 d4 a3 b3 c4 d4)) (setf theme1 (make-omn :pitch (gen-eval 12 '(rnd-octaves '(c1 c7) (rnd-order pitch))) :length '(1/8 -1/8 -1/8 -1/8 1/8 -1/8 -1/8 -1/8) :velocity '(ff) :span :pitch )) (setf theme2 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-1/8 1/16 1/16 -1/8 -1/8 -1/8 1/8 -1/8 -1/8) :velocity '(ff) :span :pitch )) (setf theme3 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-1/8 -1/8 1/8 -1/8 -1/8 -1/8 1/8 -1/8) :velocity '(ff) :span :pitch )) (setf theme4 (make-omn :pitch (gen-eval 12 '(rnd-order pitch)) :length '(-1/8 -1/8 -1/8 1/8 -1/8 -1/8 -1/8 1/24 1/24 1/24) :velocity '(ff) :span :pitch )) (def-score temp ( :key-signature 'chromatic :time-signature '(4 4) :composer "Alain Jamot" :copyright "Copyright © 2017 alain jamot" :tempo 120 :flexible-clef t :ignore-velocity t ) (piano :omn theme1 :channel 1 :sound 'gm :program 'acoustic-grand-piano ) (flute :omn theme2 :channel 2 :sound 'gm :program 'flute ) (violin :omn theme3 :channel 3 :sound 'gm :program 'violin ) (marimba :omn theme4 :channel 4 :sound 'gm :program 'marimba ) )
×
×
  • Create New...

Important Information

Terms of Use Privacy Policy