-
Posts
6 -
Joined
-
Last visited
Reputation Activity
-
ydepps reacted to opmo in Opusmodus 1.3.24534
This update completes the CLM integration.
Before opening the new application you need to delete the user Opusmodus directory. Make sure you save your personal files (scores, docs etc...) before. A good solution is to rename the Opusmodus folder first and then compress it. After you have deleted the Opusmodus user folder you can start the new application. At the start, Opusmodus will ask you for permission to create a new user folder in your home directory, if you don’t see a window for it, it means the old directory is still on your computer. Make sure the new Opusmodus directory is installed in your home directory.
For those of you that wish to dive into CLM sound synthesis system, I advise everyone to read the Read Me First document carefully first.
New:
– CLM instruments, utilities and documentation:
load-clm-ins with-sound play stop-sound ring-modulate-file-synth pins-synth expsrc-synth tubebell-synth hammondoid-synth metal-synth fm-synth (generic multi-type FM Instrument) gong-synth fm-drum-synth stochastic-synth definstrument – No bracket when tuplet is beamed.
– Musicxml display improvements.
Fixed:
– Fixed an issue where CLM sound won't stop if there are more then two instances playing.
– Fixed an issue in Preferences where Change Audition Length 1/4 would set to 1/8.
– Fixed navigator drag-and-drop re-arragement on Mojave.
– Fixed an issue where Navigator search instead of jumping to the match, the selection was extended.
Best wishes,
Janusz
-
ydepps reacted to opmo in CLM Installation in Opusmodus 1.3
CLM Installation
Common Lisp Music, by William Schottstaedt is a powerful sound synthesis language implemented in Lisp and C. CLM is essentially a toolbox for instrument building. Although it comes with a number of instruments ready to use, most composers use CLM to define their own instruments.
For those of you that wish to dive into CLM sound synthesis system, I advise everyone to read this document carefully first.
1. Command Line Tools
First you need to find out if "command line tools" are installed in your system.
The C compiler is essential at the instrument compile and load time.
Launch the Terminal, found in /Applications/Utilities/
To check if command line tools are installed run:
xcode-select --version
if installed you will see the below with the version found in your system, something like that:
xcode-select version 1234
If command line tools are not installed run:
xcode-select --install
A software update popup window will appear that asks: “The xcode-select command requires the command line developer tools. Would you like to install the tools now?” choose to confirm this by clicking “Install”, then agree to the Terms of Service when requested. Wait for the Command Line Tools package download to complete, it’ll be about 130MB and installs fairly quickly depending on your connection speed. The installer goes away on its own when complete. Enjoy your new unix command line toolkit!
2. Load and Compile Instruments
CLM system comes with a number of instruments which are a great starting point to see and hear CLM in action. Some of them are simple others are complex. Before you can run any of the instruments you must compile them first. To do that you need to open and evaluate a file "Load CLM Instrument.lisp", you will find the file in the CLM directory. This process will take a minute or so and it will create binary and dynamic library files for each of the instruments. The binary files will be saved in the bin directory and the library files will be saved in the libclm directory. After this process is completed you are ready to run the CLM Examples. If you wish to load your instruments at the startup of the app move the "Load CLM Instrument.lisp" file into the “~/Opusmodus/Extensions/“ directory.
Thats all you need to do to make CLM system work in Opusmodus.
Best wishes,
Janusz
-
ydepps reacted to Stephane Boussuge in Working with large pieces in multiple sections
All of us, as Opusmodus users, know the possibility to compose a piece with multiples sections and assemble later.
We can use the ASSEMBLE-SEQ function in our piece for assemble some material and sections, but we also can use COMPILE-SCORE with multiple pre-defined scores assembled in one COMPILE-SCORE instruction this way:
(compile-score '( score1 score2 score3 etc. ) ) This is a very convenient way for assembling multiple sections as multiple score.
i put this instructions in a separate file named COMPILE-SCORE and all other section-score in files named S1, S2, S3....
But when the piece grown, you can have many score files in you workspace navigator to evaluate before compiling the full score.
In that case, i add a last file named LoadAll. opmo containing the following instruction for load and read in one time all my section's scores:
(mapcar 'load '( "/Users/yourUserName/Opusmodus/Scores/S1.opmo" ;; S1 for section1, s2 for section2 and so on... "/Users/yourUserName/Opusmodus/Scores/S2.opmo" "/Users/yourUserName/Opusmodus/Scores/S3.opmo" "/Users/yourUserName/Opusmodus/Scores/S4.opmo" "/Users/yourUserName/Opusmodus/Scores/S5.opmo" "/Users/yourUserName/Opusmodus/Scores/S6.opmo" "/Users/yourUserName/Opusmodus/Scores/S7.opmo" "/Users/yourUserName/Opusmodus/Scores/S8.opmo" )) Attached to this post, 2 pictures of one of my workspace showing the organisation of the files.
SB.
-
ydepps reacted to Andy in The learning curve..thoughts
It's quite a feeling this Opusmodus thing.
Stephen I have a website so maybe I'll do a 'post' there.
-
ydepps reacted to Andy in The learning curve..thoughts
For me, this is a much easier journey than Max/MSP or ACToolbox or Kyma or PWGL or ...in fact any program for composition where there is a bunch of boxes, wires and annoying graphics! The idea of boxes and graphics..the visual paradigm, is it is meant to make it easier somehow.. but I now realise the reverse is true.
If you are just dealing with text and traditional music notation as in OM, it's really very straight forward. There is a learning 'bump' initially but then it really starts to make sense.
I got so annoyed at Max going from 4 to 5 to 6 to 7 and the ridiculous changes in the GUI that meant I had to relearn the program every time. It was all about them. I feel Opusmodus is all about me. And that's quite a unique experience. And actually the real effort visually in Opusmodus has been put in to functionality, the IDE, which to be honest is totally unique. Thanks.
Onward and upward. (with a few backwards I'm sure)
-
ydepps reacted to opmo in Using Nigel's Book
indeed, it is a great introduction to parametric composition. Nigel started working on this book at the time we were working on Opusmodus documentation. It makes me very happy to hear his work is appreciated by so many, He was a great supporter and teacher of algorithmic composition which has spread over many decades. We all miss him dearly.
Note:
There are a few changes to some of the Opusmodus function names since the release of Nigel's book. Some of the examples might end in error.
-
ydepps reacted to opmo in Opusmodus 1.3.24409
Whats new:
—'Check for Updates...' menu in Opusmodus app menu (no more manual downloads). 🙂
—New CLM instruments with omn-form plist input and documentation.
badd-synth bandedwg-synth circular-scanned-synth fm-bell-synth fm-insect-synth fm-violin-synth grani-synth piano-synth pvoc-synth scanner-synth singbowl-synth
—Additional _About documents for various function groups (Wikipedia).
—CLM bug fixes.
Installation:
There are some changes to the Opusmodus user system folder and CLM implementation.
Before opening the new application you need to delete the old Opusmodus folder.
Make sure you save your personal files (scores, docs etc...) before. A good solution is to rename the Opusmodus folder first and then compress it.
After you have deleted the Opusmodus user folder you can start the new application.
At the start Opusmodus will ask you for permission to create a new user folder in your home directory, if you don’t see a window for it, it means the old folder is still on your computer. Make sure the new Opusmodus folder is installed in your home directory.
Hopefully this is the last time we need to delete the previous Opusmodus user folder from the home directory.
Best wishes,
Janusz
P.S. Few CLM examples from the "3.Howto Score/CLM/Sound Synthesis.opmo" file:
fm-bell-synth
(progn (defparameter count 50) (setf partials (library 'marangona-partials 'partials nil :random 20)) (setf par (rnd-sample count (partial :freq (flatten partials)))) (defparameter freq (gen-divide (rnd-sample count '(1 2 3 4 5)) par)) (defparameter dur (list (length-span 42 (rnd-sample count '(w h q w))))) (do-timeline '(dur (---xx--xx- ---xx---x- --x--xx--- ---x------ x----x---)) '(gen-pause x) :time '(w)) (defparameter vel (rnd-number count 0.05 0.43)) (defparameter dist (rnd-number count 0.5 1.0)) (defparameter env '((0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 .4000 95 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 56 0 60 0 90 .3000 100 0) (0 0 30 1 56 0 60 0 90 .3000 100 0) (0 0 50 1 80 .3000 100 0) (0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 10 1 32 .1000 50 1 90 .3000 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) (with-sound (:reverb jc-reverb :scaled-to .7) (fm-bell-synth dur freq vel :amp-env (rnd-sample count env) :index-env (rnd-sample count env) :index (rnd-number count 0.3 0.9) :reverb-amount 0.30 :distance dist)) )
fm-insect-synth
(progn (defparameter par (library 'tbn-cs3-partials 'partials nil :random 12)) (defparameter dur '(rnd-sample 12 '(-q q. h -h. -w w. d -d.))) (defparameter freq '(rnd-sample 12 (flatten (partial :freq par)))) (defparameter amp '(rnd-sample 12 '(pppp ppp p mp))) (defparameter mod-freq-env '(0 0 40 1 95 1 100 .5)) (defparameter mod-index-env '(0 1 25 .7 75 .78 100 1)) (defparameter amp-env '(0 0 25 1 75 .7 100 0)) (defparameter fm-index '(rnd-number 12 .01 .6)) (defparameter mod-skew '(rnd-number 12 -20.0 -1.0)) (defparameter mod-freq '(rnd-number 12 20 60)) (with-sound '() (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 500.866 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 649.490 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 562.087 mod-index-env (eval fm-index) .500) (fm-insect-synth (eval dur) (eval freq) (eval amp) amp-env (eval mod-freq) (eval mod-skew) mod-freq-env 300.866 mod-index-env (eval fm-index) .500) ) )
grani-synth
(progn (defparameter dur '(q h w d -q -h)) (defparameter amp '(pppp p pp f mp)) (with-sound (:reverb jc-reverb :reverb-channels 2) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grains 10) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 .1 .3 .1 1 .6) :amp-envelope '(0 1 1 1) :grain-density 8 :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-envelope-end '(0 0 .01 1 .99 1 1 0) :grain-envelope-transition '(0 0 .4 1 .8 0 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :amp-envelope '(0 1 1 1) :grain-density 20 :grain-duration '(0 .003 .2 .01 1 .3)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :amp-envelope '(0 1 1 1) :grain-density 20 :grain-duration '(0 .003 .2 .01 1 .3) :grain-duration-limit .02) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :amp-envelope '(0 1 1 1) :grain-density 40 :grain-start '(0 .1 .3 .1 1 .6)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :amp-envelope '(0 1 1 1) :grain-density 40 :grain-start '(0 .1 .3 .1 1 .6) :grain-start-spread .01) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread 0.01 :amp-envelope '(0 1 1 1) :grain-density 40 :srate '(0 0 .2 0 .6 5 1 5)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :srate-base 2 :srate '(0 0 .2 0 .6 -1 1 -1)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :srate-linear t :srate (list 0 1 .2 1 .6 (expt 2 5/12) 1 (expt 2 5/12))) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread .01 :amp-envelope '(0 1 1 1) :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-density (rnd-sample 12 '(40 30 20)) :grain-duration '(0 .02 1 0.1) :grain-duration-spread '(0 0 .5 .1 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-start '(0 0 1 1) :grain-start-spread 0.01 :amp-envelope '(0 1 1 1) :grain-density (rnd-sample 12 '(40 30 20)) :grain-degree '(0 0 1 90) :grain-degree-spread 10) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .06 :grain-density 20 :grain-density-spread 2 :srate 0) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .08 :grain-density (rnd-sample 12 '(40 30 20)) :grain-density-spread 2 :srate 5 :grain-degree 0 :grain-envelope '(0 0 .2 .2 .5 1 .8 .2 1 0) :grain-envelope-end '(0 0 .01 1 .99 1 1 0)) (grani-synth (rnd-sample 12 dur) (rnd-sample 12 amp) "oboe" :grain-duration .05 :grain-density 35 :grain-density-spread 3 :srate -5 :grain-degree 90 :srate (list 0 1 .3 1 .3 (expt 2 5/12) 1 (expt 2 5/12)))) )
piano-synth
(progn (setf frames1 (library 'marangona-partials 'partials nil :random 48)) (setf frames2 (library 'marangona-frames 'partials nil :random 48)) (setf par1 (remove-partial frames1 :type :freq :min 27.5 :max 4186)) (setf par2 (remove-partial frames2 :type :freq :min 27.5 :max 4186)) (defparameter freq1 (rnd-order (gen-collect (rnd-sample 24 '(3 5 6 7 8)) (partial :freq par1)))) (defparameter freq2 (rnd-order (gen-collect (rnd-sample 38 '(2 3 4)) (partial :freq par2)))) (with-sound (:reverb jc-reverb) (piano-synth '(3e) (flatten freq1) '(.2 .3 .4) :bpm 72 :drypedalresonancefactor .25 :singlestringdecayrate-table '(21 -5 24.000 -5.000 36.000 -5.4 41.953 -5.867 48.173 -7.113 53.818 -8.016 59.693 -8.875 66.605 -9.434 73.056 -10.035 78.931 -10.293 84.000 -12.185) :singlestringpole-table '(21 .8 24 0.7 36.000 .6 48 .5 60 .3 84 .1 96 .03 108 .03) :stiffnesscoefficient-table '(21.000 -0.920 24.000 -0.900 36.000 -0.700 48.000 -0.250 60.000 -0.100 75.179 -0.040 82.986 -0.040 92.240 .3 96.000 .5 99.000 .7 108.000 .7)) (piano-synth '(e) freq2 '(0.1 0.2 0.3) :bpm 72 :drypedalresonancefactor .55 :detuningfactor-table '(24 5 36 7.0 48 7.5 60 12.0 72 20 84 30 96 100 108 300))) )
pvoc-synth
(with-sound (:scaled-to .99) (pvoc-synth (rnd-sample 12 '(q h e s w d -q -h)) '(pppp pp ppp f) "marangona" :input-start 0 :input-end 12 :pitch-scaler (rnd-sample 12 '(.5 .1 .05 .8 .3 .16)) :pitch-offset (rnd-sample 20 '(20 100 200 300 440 150 730)) :pitch-offset-env '(0 0 20 0 50 100 70 100 80 0 100 0) :pitch-scaler-env '(0 1 50 2 100 1) :amp-env '(0 1 40 0 50 1 60 0 100 1) :gate 70) )
singbowl-synth
(progn (defparameter size 120) (defparameter partials (library 'marangona-partials 'partials nil :random 50)) (defparameter par (rnd-sample size (partial :freq (flatten partials)))) (defparameter freq (gen-divide (rnd-sample size '(2 3 4 5)) par)) (defparameter length (rnd-sample size '(w h q e))) (defparameter velocity (rnd-number size .05 .43)) (defparameter env '((0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 .4000 95 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 56 0 60 0 90 .3000 100 0) (0 0 30 1 56 0 60 0 90 .3000 100 0) (0 0 50 1 80 .3000 100 0) (0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 10 1 32 .1000 50 1 90 .3000 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) (with-sound (:reverb jc-reverb :scaled-to .7 :output "ma-partials") (singbowl-synth length freq velocity :amp-env (rnd-sample size env) :reverb-amount 0.30)) )
fm-violin-synth
(progn (defparameter size 10) (defparameter count 50) (setf glc-v1 (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-v2 (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-va (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf glc-vc (gen-length-cartesian 1 3 'd '? 'w 3 (rnd-sample size '(13 11 10 8)) '(1 2 3 4 5))) (setf gu-sq (gen-unison (list glc-v1 glc-v2 glc-va glc-vc))) (setf l-v1 (1~ gu-sq)) (setf l-v2 (2~ gu-sq)) (setf l-va (3~ gu-sq)) (setf l-vc (4~ gu-sq)) (setf l-max (first (sort-desc (list (get-count l-v1 :length :note :sum t) (get-count l-v2 :length :note :sum t) (get-count l-va :length :note :sum t) (get-count l-vc :length :note :sum t))))) (setf intervals '((0 7) (0 0) (11 5) (-4 5) (-5 5) (0 13) (-5 18) (-36 13) (-13 13) (8) (-18 7) (-1 17) (-17 17) (-26 13) (-27 23) (-19 19) (-23 23) (18) (0) (7) (-14) (13) (-23 5) (-23 2) (-2 2) (6 2) (6 5) (19) (-10) (-17 11) (-11 11) (-11 5) (-24 13) (1 14) (-14 14) (-29 1) (-1 1) (7 0) (12 6) (-21 7) (-7 7) (-18 0) (1 13) (0 1) (-14 13) (-10 5) (-14 8) (0 6) (6) (-20 6) (-5 1) (17) (1) (-17 5) (-1 5) (-10 16) (-12 8) (0 8) (1 11) (-24 4) (-18 16) (-17) (-6 6) (-18 18) (-15 3) (-6 31) (-2 5) (-29 6) (-6 13) (-13 6) (7 13))) (setf pcount (gen-repeat 2 (get-count l-v1 :length :note))) (setf gr (gen-repeat (length pcount) (list intervals))) (setf gm-v1 (gen-markov gr :size pcount)) (setf gm-v2 (gen-markov gr :size pcount)) (setf gm-va (gen-markov gr :size pcount)) (setf gm-vc (gen-markov gr :size pcount)) (setf im-v1 (interval-map nil (append-sublist gm-v1))) (setf im-v2 (interval-map nil (append-sublist gm-v2))) (setf im-va (interval-map nil (append-sublist gm-va))) (setf im-vc (interval-map nil (append-sublist gm-vc))) (setf s-v1 (span l-v1 im-v1)) (setf s-v2 (span l-v2 im-v2)) (setf s-va (span l-va im-va)) (setf s-vc (span l-vc im-vc)) (setf ra-v1 (rnd-octaves 'violin s-v1)) (setf ra-v2 (rnd-octaves 'violin s-v2)) (setf ra-va (rnd-octaves 'viola s-va)) (setf ra-vc (rnd-octaves 'cello s-vc)) (setf p-v1 (ambitus 'violin ra-v1 :type :invert)) (setf p-v2 (ambitus 'violin ra-v2 :type :invert)) (setf p-va (ambitus 'viola ra-va :type :invert)) (setf p-vc (ambitus '(a2 c5) ra-vc :type :invert)) (setf weight '(29 19 8 8 17)) (setf vel '(0.07 0.1 0.15 0.2 0.25 0.35)) (setf v-v1 (gen-weight l-max (mapcar 'list vel weight))) (setf v-v2 (gen-weight l-max (mapcar 'list vel weight))) (setf v-va (gen-weight l-max (mapcar 'list vel weight))) (setf v-vc (gen-weight l-max (mapcar 'list vel weight))) (setf vln1 (make-omn :length l-v1 :pitch p-v1 :velocity v-v1)) (setf vln2 (make-omn :length l-v2 :pitch p-v2 :velocity v-v2)) (setf vla (make-omn :length l-va :pitch p-va :velocity v-va)) (setf vlc (make-omn :length l-vc :pitch p-vc :velocity v-vc)) (do-timeline '( vln1 (---x---x-- ---x-x-x-- --x--xx--- ---x------ x-) vln2 (---x---x-- ---x---x-- --x--xx--- ---x------ x-) vla (---x---x-- ---x---x-- --x--xx--- ---x------ --) vlc (---x---x-- ---x---xx- --x--xx--- ---x------ --) ) '(gen-pause x) :time '(h h. w)) (defparameter v1 vln1) (defparameter v2 vln2) (defparameter v3 vla) (defparameter v4 vlc) (defparameter env '((0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 .4000 95 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 56 0 60 0 90 .3000 100 0) (0 0 30 1 56 0 60 0 90 .3000 100 0) (0 0 50 1 80 .3000 100 0) (0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 10 1 32 .1000 50 1 90 .3000 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) (with-sound (:reverb jc-reverb :scaled-to .7) (fm-violin-synth v1 v1 v1 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v2 v2 v2 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.03 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v3 v3 v3 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8)) (fm-violin-synth v4 v4 v4 :bpm 30 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.70 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :glissando-amount (rnd-number count 0.00 0.8))) )
scanned-synth
(progn (defparameter size 120) (setf partials1 (library 'tbn-cs3-partials 'partials nil :random 64)) (setf partials2 (library 'tbn-cs3-partials 'partials nil :random 64)) (setf freq1 (rnd-sample size (partial :freq (flatten partials1)))) (setf freq2 (rnd-sample size (partial :freq (flatten partials2)))) (defparameter dur1 (rnd-sample size '(s s s s))) (defparameter dur2 (rnd-sample size '(q e s s s -s))) (defparameter amp1 (rnd-number size .005 .13)) (defparameter amp2 (rnd-number size .005 .13)) (defparameter waves '(1 2 3 4 5 6 7 8 9 10 11 12 13)) (with-sound (:reverb jc-reverb) (scanned-synth dur1 freq1 amp1 :wave (rnd-sample size waves) :bpm 96 :pts (rnd-sample size '(192 256 512))) (scanned-synth dur2 freq2 amp2 :wave (rnd-sample size waves) :bpm 96 :pts (rnd-sample size '(192 256 512))) ) )
circular-scanned-synth
(progn (defparameter size 24) (setf partials1 (library 'tbn-cs3-partials 'partials nil :random 50)) (setf partials2 (library 'tbn-cs3-partials 'partials nil :random 50)) (setf par1 (rnd-sample size (partial :freq (flatten partials1)))) (setf par2 (rnd-sample size (partial :freq (flatten partials2)))) (defparameter dur1 (rnd-sample size '(1 2 3 4 5))) (defparameter dur2 (rnd-sample size '(1 2 3 4 5))) (defparameter freq1 (gen-divide (rnd-sample size '(2 3 4 5)) par1)) (defparameter freq2 (gen-divide (rnd-sample size '(2 3 4 5)) par2)) (defparameter amp1 (rnd-number size .05 .43)) (defparameter amp2 (rnd-number size .05 .43)) (defparameter env '((0 0 40 .1000 60 .2000 75 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 100 0) (0 0 30 1 56 0 60 0 90 .3000 100 0) (0 0 50 1 80 .3000 100 0) (0 0 40 .1000 60 .2000 82 1 100 0) (0 0 10 1 32 .1000 50 1 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) (with-sound (:reverb jc-reverb) (circular-scanned-synth dur1 freq1 amp1 :wave (rnd-sample size '(1 2 3 4)) :recompute-samps (rnd-sample size '(14 222 32 162 211 72)) :pts (rnd-sample size '(192 256 512)) :cycles (rnd-sample size '(1 2 3)) :amp-env (rnd-sample size env)) (circular-scanned-synth dur2 freq2 amp2 :wave (rnd-sample size '(1 2 3 4)) :recompute-samps (rnd-sample size '(14 222 32 162 211 72)) :pts (rnd-sample size '(192 256 512)) :cycles (rnd-sample size '(1 2 3)) :amp-env (rnd-sample size env)) ) )
badd-synth
(progn (defparameter size 12) (setf partials (library 'marangona-partials 'partials nil :random 64)) (setf mpar (remove-partial partials :type :freq :max 1800.0)) (setf par (partial :freq mpar)) (setf freq '(rnd-sample size (flatten par))) (defparameter dur '(rnd-sample size '(1 2 3 4 5))) (defparameter amp '(rnd-number size .12 .33)) (with-sound (:reverb jc-reverb) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) (badd-synth (eval dur) (eval freq) (eval amp)) ) )
bandedwg-synth
(progn (setf row (library 'vienna 'berg 'r11)) (setf degree '(0 3 4 0 -2 -3 -1 0 -2)) (setf mat (gen-eval 6 '(harmonic-progression (setf degree (gen-rotate 2 degree)) row :relative t))) (setf end1 (harmonic-progression '(-13 -13) row :relative t)) (setf end2 (harmonic-progression '(-12 -12) row :relative t)) (setf end3 (harmonic-progression '(-13 -13) row :relative t)) (setf end4 (harmonic-progression '(-12) row :relative t)) (defparameter omn (make-omn :length '((q) (-h)) :pitch (assemble-seq mat end1 end2 end3 end4) :velocity '(mp) :span :pitch)) (with-sound (:reverb jc-reverb) (bandedwg-synth omn omn omn :mode 1) ) )
As you can see it is quite easy to use CLM in OM with OMN.
More CLM instruments to come.
-
ydepps reacted to opmo in Music xml import, convert to Score?
At the moment you can't convert musicxml file into omn score.
But it is in our TODO list.
-
ydepps reacted to Stephane Boussuge in Pluton for Orchestra
In memoriam Narcis Bonet who was one of my teachers.
Opusmodus score attached.
SB.
PlutonV1-02.opmo
-
ydepps reacted to torstenanders in Request: make-omn
> Sometimes is interesting for hearing snippets with different sounds without having to compile the entire score
My Opmo score data structure already allows for that, though you always have to render snippets with an explicit function call, as we cannot define custom shortcuts so far.
It is part of my tools at https://github.com/tanders/tot. Check out the function preview-score (https://tanders.github.io/tot/sources/score.html#_g232191). Various other functions allow to transform polyphonic score snippets for one or more instruments in various ways.
Best,
Torsten
-
ydepps reacted to opmo in Variations on Variations (2019)
It is a new function which generate a variations of a given score or section. The function has around 20 keywords and is not yet ready for release.
-
ydepps reacted to opmo in Opusmodus 1.2.21330
MIDI controller function:
gen-dynamic-controller omn-sequence &key scale loop
[Function]
Arguments and Values:
omn-sequence omn-form sequence.
scale a floating point number from 0.1 to 2.0. The default is 1.0.
loop Nil or T. The T (true) will loop the scale list to the count
of the lists in the sequence. The default is Nil.
Description:
The GEN-DYNAMIC-CONTROLLER function generates controller values from the omn-sequence dynamic symbols.
(setf omn
'((h. eb4 pp tasto q g3 0<pp>0 ponte)
(-e) (q gs4 fp tasto) (-s) (q a5 ffp)
(-e) (q bb4 fffp) (-s) (q cs5 pf)
(-s q. e5 fp -e.) (q cs5 p h. d5 pfp)
(-q h. c5 pp) (h. gs3 0<ppp>0 ponte -e a4 p< tasto)
(h. fs5 mp q bb3 0<pp>0 ponte)
(q c5 p tasto h. e4 pfp) (-e)
(q cs4 fp h d5 pp>pppp) (h. f4 pp>pppp)))
(gen-dynamic-controller omn)
=> ((36 3/4) (:asc-desc 0 36 1/256 1/4) (0 1/8) (80 1/64)
(:desc 30 25 1/256 15/64) (0 1/16) (91 1/64)
(:desc 47 25 1/256 15/64) (0 1/8) (102 1/64)
(:desc 56 25 1/256 15/64) (0 1/16) (25 1/64)
(:asc 30 80 1/256 15/64) (0 1/16) (80 1/64)
(:desc 30 25 1/256 23/64) (0 3/16) (47 1/4)
(:asc-desc 23 80 1/256 3/4) (0 1/4) (36 3/4)
(:asc-desc 0 25 1/256 3/4) (0 1/8)
(:asc 47 58 1/256 1/8) (58 3/4)
(:asc-desc 0 36 1/256 1/4) (47 1/4)
(:asc-desc 23 80 1/256 3/4) (0 1/8) (80 1/64)
(:desc 30 25 1/256 15/64) (:desc 36 14 1/256 1/2)
(:desc 36 14 1/256 3/4))
This is the notation of the sequence, see above:
Audio:
Virtual Instrument: VSL: Violin Solo.
The dynamic controller values are sent to CC11: Expression
Examples:
To scale up the controller values we set the :scale value higher than 1.0. To scale down the controller values we set the :scale value lower than 1.0.
Here the scale value is 1.2:
(gen-dynamic-controller omn :scale 1.2)
=> ((43 3/4) (:asc-desc 0 43 1/256 1/4)
(0 1/8) (96 1/64) (:desc 36 30 1/256 15/64)
(0 1/16) (109 1/64) (:desc 56 30 1/256 15/64)
(0 1/8) (122 1/64) (:desc 67 30 1/256 15/64)
(0 1/16) (30 1/64) (:asc 36 96 1/256 15/64)
(0 1/16) (96 1/64) (:desc 36 30 1/256 23/64)
(0 3/16) (56 1/4) (:asc-desc 24 96 1/256 3/4)
(0 1/4) (43 3/4) (:asc-desc 0 30 1/256 3/4)
(0 1/8) (:asc 56 70 1/256 1/8) (70 3/4)
(:asc-desc 0 43 1/256 1/4) (56 1/4)
(:asc-desc 24 96 1/256 3/4) (0 1/8) (96 1/64)
(:desc 36 30 1/256 15/64) (:desc 43 17 1/256 1/2)
(:desc 43 17 1/256 3/4))
To add more control to the dynamic of the sequence we can set each bar (a list) with their own scale value.
In the example below the 4th value 1.0 will stay for all of the remaining bars (lists).
(gen-dynamic-controller omn :scale '(1.0 1.1 1.2 1.0))
Adding loop to the scale keyword we are looping the scale values to the count of the lists in the sequence:
(gen-dynamic-controller omn :scale '(1.0 1.1 1.2 1.0) :loop t)
;;;---------------------------------------------------------
;;; SCORE EXAMPLE
;;;---------------------------------------------------------
It is important to use the same omn-sequence data that you are using in the DEF-SCORE instrument instance.
(setf omn
'((h. eb4 pp tasto q g3 0<pp>0 ponte)
(-e) (q gs4 fp tasto) (-s) (q a5 ffp)
(-e) (q bb4 fffp) (-s) (q cs5 pf)
(-s q. e5 fp -e.) (q cs5 p h. d5 pfp)
(-q h. c5 pp) (h. gs3 0<ppp>0 ponte -e a4 p< tasto)
(h. fs5 mp q bb3 0<pp>0 ponte)
(q c5 p tasto h. e4 pfp) (-e)
(q cs4 fp h d5 pp>pppp) (h. f4 pp>pppp)))
GM sound set:
(def-score dynamic
(:key-signature 'chromatic
:time-signature (get-time-signature omn)
:tempo 32
:layout (violin-layout 'vln))
(vln
:omn omn
:channel 1
:sound 'gm
:volume 127
:program 'violin
:controllers (11 (gen-dynamic-controller omn)))
)
VSL sound set:
(def-score dynamic
(:key-signature 'chromatic
:time-signature (get-time-signature omn)
:tempo 32
:layout (violin-layout 'vln))
(vln
:omn omn
:port 0
:channel 1
:sound 'vsl-violin-solo
:volume 127
:controllers (11 (gen-dynamic-controller omn)))
)
---
best wishes,
Janusz
-
ydepps reacted to rme in using Emacs and SLIME with Opusmodus
If you want to use Emacs and SLIME with Opusmodus, that is possible.
Here are steps that work:
If you haven't already done so, install Quicklisp. Evaluate (ql:quickload "quicklisp-slime-helper"). Follow its instructions and put (load (expand-file-name "~/quicklisp/slime-helper.el")) into your ~/.emacs file. Start Opusmodus, and evaluate (cl-user::start-swank). This should print something like ";; Swank started at port: 4005". Now, start your Emacs. Type M-x slime-connect and you'll be prompted for a host (use the default, which is 127.0.0.1) and then a port. The port needs to match the port (default 4005) that was printed out earlier. You are now connected to Opusmodus. You should be able to say stuff like (list-plot '(1 2 3)) from the SLIME repl and have it work.
The function cl-user::start-swank basically does (load "home:quicklisp;setup") and then (ql:quickload :swank) and then (swank:create-server :port 4005 :dont-close t), so there's no magic going on there.
If you run into trouble, let me know and I'll try to help out.
-
ydepps reacted to opmo in Variations on Variations (2019)
Variations on "Webern Variationen Fuer Klavier Op.27, I" (2019) by JP
Instrument: VSL Steinway D
-
ydepps reacted to JulioHerrlein in Combinatorial Voice-Leading of Hexachords
Dear All,
HAPPY 2018 !!
With the new PCS organization in Opusmodus is possible to implement a concept of my book, called Combinatorial Voiceleading of Hexachords.
From a Hexachord Set, is possible to find 10 different ways to combine the notes in the for of voice-leading sets. Each hexachord is divided in (3 + 3) way.
This expression:
(setf hexavl (mclist (chordize-list (integer-to-pitch (remove-duplicates (sort-asc (gen-divide 3 (flatten (permute (pcs '6-32))))) :test #'equal)))))
Will result in this combination of the 6-32 hexachord, similar to the idea in the book.
In the book, the material is organized in 70 pages of melodic and harmonic exercises.
Here is a litte sample:
CH_HERRLEIN.pdf
The entire book:
https://www.melbay.com/Products/Default.aspx?bookid=30042BCDEB
Best !
Julio Herrlein
-
ydepps reacted to Stephane Boussuge in Brin d'Or
Here's a short piece for violin solo and Strings ensemble with Fibonacci based harmony.
Full score attached to this post fully commented but in French 🙂
SB.
BrinD'or-V04.opmo
-
ydepps reacted to opmo in Opusmodus with sound synthesis package (CLM)
Since some time we are working on implementing Bill's Schottstaedt 'Synthesis package CLM' into Opusmodus.
As expected we make the CLM working with OMN form sequence or with single parameters - example below.
The score is using partials from The Bells of the Campanile: La Marangona.
Below you will find an audio file of the score which is rendered each time you make evaluation.
Best wishes to all,
Janusz
;; --------------------------------------------------------- ;; MARANGONA ;; --------------------------------------------------------- ;; Parameters (defparameter count 50) (setf partials1 (library 'marangona-partials 'partials nil :random 50)) (setf partials2 (library 'marangona-partials 'partials nil :random 50)) (setf partials3 (library 'marangona-partials 'partials nil :random 50)) (setf partials4 (library 'marangona-partials 'partials nil :random 50)) (setf par1 (rnd-sample count (partial :freq (flatten partials1)))) (setf par2 (rnd-sample count (partial :freq (flatten partials2)))) (setf par3 (rnd-sample count (partial :freq (flatten partials3)))) (setf par4 (rnd-sample count (partial :freq (flatten partials4)))) (defparameter freq1 (gen-divide (rnd-sample count '(2 3 4 5)) par1)) (defparameter freq2 (gen-divide (rnd-sample count '(1 2 3 4 5)) par2)) (defparameter freq3 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3)) (defparameter freq4 (gen-divide (rnd-sample count '(1 2 3 1 4 5)) par3)) (defparameter len1 (list (length-span 42 (rnd-sample count '(w h q w))))) (defparameter len2 (list (length-span 42 (rnd-sample count '(d h h))))) (defparameter len3 (list (length-span 42 (rnd-sample count '(h. w q))))) (defparameter len4 (list (length-span 42 (rnd-sample count '(d d h))))) (do-timeline '( len1 (---xxx-xx- ---xxx---- --x--xx--- ---x------ x-) len2 (---xxx-xx- ---xx-x--- --x--xx--- ---x------ x-) len3 (---xxx-xx- ---xx--x-- --x--xx--- ---x------ --) len4 (---xxx-xx- ---xx---x- --x--xx--- ---x------ --) ) '(gen-pause x) :time '(w)) (defparameter dur1 (omn :length (flatten len1))) (defparameter dur2 (omn :length (flatten len2))) (defparameter dur3 (omn :length (flatten len3))) (defparameter dur4 (omn :length (flatten len4))) (defparameter amp1 (rnd-number count 0.05 0.43)) (defparameter amp2 (rnd-number count 0.05 0.43)) (defparameter amp3 (rnd-number count 0.05 0.43)) (defparameter amp4 (rnd-number count 0.05 0.43)) (defparameter env '((0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 60 .1000 80 .2000 90 .4000 95 1 100 0) (0 0 10 1 16 0 32 .1000 50 1 56 0 60 0 90 .3000 100 0) (0 0 30 1 56 0 60 0 90 .3000 100 0) (0 0 50 1 80 .3000 100 0) (0 0 40 .1000 60 .2000 75 .4000 82 1 90 1 100 0) (0 0 10 1 32 .1000 50 1 90 .3000 100 0) (0 0 60 .1000 80 .3000 95 1 100 0) (0 0 80 .1000 90 1 100 0))) ;; --------------------------------------------------------- ;; Score (with-sound (:play nil :reverb jc-reverb :scaled-to .7 :statistics t :channels 2 :output "marangona-series") (fm-violin-synth dur1 freq1 amp1 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :fm1-rat (rnd-number count 0.00 6.718) :fm2-rat (rnd-number count 0.00 4.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fm-violin-synth dur2 freq2 amp2 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :fm1-rat (rnd-number count 0.00 4.718) :fm2-rat (rnd-number count 0.00 6.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fm-violin-synth dur3 freq3 amp3 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :fm1-rat (rnd-number count 0.00 1.718) :fm2-rat (rnd-number count 0.00 4.414) :fm3-rat (rnd-number count 0.00 6.141) :glissando-amount (rnd-number count 0.00 0.8) ) (fm-violin-synth dur4 freq4 amp4 :degree (rnd-number count 45 85) :fm-index (rnd-number count 0.10 1.0) :reverb-amount 0.30 :noise-amount (rnd-number count 0.00 0.004) :amp-env (rnd-sample count env) :fm1-rat (rnd-number count 0.00 4.718) :fm2-rat (rnd-number count 0.00 6.414) :fm3-rat (rnd-number count 0.00 1.141) :glissando-amount (rnd-number count 0.00 0.8) ) )
Score with omn-form sequence:
(with-sound (:play nil :channels 2 :reverb jc-reverb :scaled-to .6 :statistics t :output "quartet") (fm-violin-omn vn1 :reverb-amount 0.20 :bpm 44) (fm-violin-omn vn2 :reverb-amount 0.20 :bpm 44) (fm-violin-omn va :reverb-amount 0.20 :bpm 44) (fm-violin-omn vc :reverb-amount 0.20 :bpm 44) )
-
ydepps reacted to opmo in Opusmodus 1.3 release
Whats new in version 1.3
Compatibility with macOS Mojave
macOS 10.14 Dark Mode
CLM added
OSC added
MIDI player improvements
New functions:
binary-to-attribute
merge-attributes
circle-pitch-plot
circle-rhythm-plot
xy-plot
pcs-rhythm
edit-events
find-max-span
fit-to-span
gen-osc-data
osc-thread
stop-osc-threads
Enhancements and fixes:
quantizer returns now the count of given length-notes
single-events returns given type
don't join dissimilar rests
fixed rest grouping
fixed tied 8va or 8vb tuplets
Installation:
There are some changes to the Opusmodus user system folder.
Before opening the new application you need to delete the old Opusmodus folder.
Make sure you save your personal files (scores, docs etc...) before. A good solution is to rename the Opusmodus folder first and then compress it.
After you have deleted the Opusmodus user folder you can start the new application.
At the start Opusmodus will ask you for permission to create a new user folder in your home directory, if you don’t see a window for it, it means the old folder is still on your computer. Make sure the new Opusmodus folder is installed in your home directory.
New Opusmodus folder:
Upgrade:
Opusmodus 1.3 requires a new serial number to run.
When purchasing upgrade 1.3 the current user will need to provide an Opusmodus 1.2 serial number.
After the confirmation which takes a few seconds only, you will be redirected to the purchase page.
Following the purchase a new serial number will be sent to you by email.
Happy New Year 2019
Yours,
Janusz Podrazik