# opmo

Janusz Podrazik

1,178

178

1. ## Saving Plots and Piano Rolls to PDF Vectorial Graphics ETC

This will save a PNG file in the Opusmodus/Graphs folder: (setf length '(q e = s = = = -q e - = s = = -e.) pitch '(c4 cs5 d4 ds5 e4 f5 fs4 g5 gs4 a5 as4 b5)) (length-pitch-list-plot length pitch :file "length-pitch-plot.png") As for the piano roll you will need to create a screenshot with cmd/shift/4.
2. ## Pcs: how to retrieve inverted forms from this function ?

Congratulation to your book, looks very good. JP
3. ## Pcs: how to retrieve inverted forms from this function ?

of course: (pcs '3-11b) => (0 4 7) INTERVAL-CLASS: (interval-class '(0 1 2 11 10 9 5 4 3 6 7 8)) => (1 1 3 1 1 4 1 1 3 1 1) (interval-class '(0 1 3 8 4 9 10 7 6 5 11 2)) => (1 2 5 4 5 1 3 1 1 6 3) (interval-class '(0 11 5 7 6 1 3 4 2 9 8 10)) => (1 6 2 1 5 2 1 2 5 1 2)
4. ## Pcs: how to retrieve inverted forms from this function ?

The PCS-ANALYSIS function returns two more results: inverted-form and interval-class: (pcs-analysis '(4 1 8 10 3 7)) => Sequence: (4 1 8 10 3 7) Set: 6-z29 Prime Form: (0 2 3 6 7 9) Inverted Form: nil Pitch: (c4 d4 eb4 fs4 g4 a4) Normal Order: (1 3 4 7 8 10) Complement: (0 2 5 6 9 11) Inversion: (8 11 4 2 9 5) Vector: (2 2 4 2 3 2) Interval Class: (3 5 2 5 4) (pcs-analysis '(0 3 7)) => Sequence: (0 3 7) Set: 3-11 Prime Form: (0 3 7) Inverted Form: (0 4 7) Pitch: (c4 eb4 g4) Normal Order: (0 3 7) Complement: (1 2 4 5 6 8 9 10 11) Inversion: (0 9 5) Vector: (0 0 1 1 1 0) Interval Class: (3 4) (pcs-analysis '(0 4 7)) => Sequence: (0 4 7) Set: 3-11b Prime Form: (0 3 7) Inverted Form: (0 4 7) Pitch: (c4 e4 g4) Normal Order: (0 4 7) Complement: (1 2 3 5 6 8 9 10 11) Inversion: (0 8 5) Vector: (0 0 1 1 1 0) Interval Class: (4 3) The new function PCS-FORMS takes care of both forms: prime-form and inverted-form. The inverted form set ends with letter b: (pcs-forms '((0 4 7) (0 3 7)) :type :set) => (3-11b 3-11)
5. ## tutorial guide

Next - which will take some time - I will add all Opusmodus System Function with examples to our forum.
6. ## Pcs: how to retrieve inverted forms from this function ?

I will add the inverted form into to the system with the next update.
7. ## Pcs: how to retrieve inverted forms from this function ?

To do this I would need to rewrite the pitch class set functions. The functions where based on Allen Forte 'The Structure of Atonal Music' book.
8. ## Pcs: how to retrieve inverted forms from this function ?

(pcs-analysis '(0 3 7)) ? pcs-analysis Sequence: (0 3 7) Set: 3-11 Prime Form: (0 3 7) Pitch: (c4 eb4 g4) Normal Order: (0 3 7) Complement: (1 2 4 5 6 8 9 10 11) Inversion: (0 9 5) Vector: (0 0 1 1 1 0) (pcs-analysis '(0 4 7)) ? pcs-analysis Sequence: (0 4 7) Set: 3-11 Prime Form: (0 3 7) Pitch: (c4 eb4 g4) Normal Order: (0 4 7) Complement: (1 2 3 5 6 8 9 10 11) Inversion: (0 8 5) Vector: (0 0 1 1 1 0) Note: The pitch output form PCS-ANALYSIS is the pitch form prime form.
9. ## Midi In Collect

Ver 2. will be able to import musicXML files and convert to omn.
10. ## OMN Examples

Play and display snippets in Opusmodus Place the mouse cursor at the end of each expression and press ⌘1 for audition and notation, ⌘2 for audition or ⌘3 for notation. You can stop audition at anytime by pressing ⌘ESC keys. Contents G. Ph. Telemann, 12 Fantasie per clavicembalo TWV 33, n.1, 1732 D. Scarlatti, Sonata B-Dur, 1736 F. Chopin, Etudes, Op. 10, No. 5, 1833 J. S. Bach, Brandenburg Concerto No.4 in G major, BWV 1049, 1720 I. Strawinsky, Petruschka, 1911/21 L. Janáček, In the Mists, 1914 J. Podrazik, Piano Study No.3, 2013 J. S. Bach, Goldberg-Variationen, Variato 18 a 1 Clav., 1741 M. Reger, Aus meinem Tagebuch, I, 3, 1904/12 K. Stockhausen, Mantra für 2 Pianisten, 1970 B. Smetana, Aus meinem Leben, Streichquartett e-Moll, 1876 Opusmodus, Algorithmic, 2014 L. v. Beethoven, op. 59, No.1, Finale S. Prokofiev, Peter and the Wolf, op.67 A. Bruckner, Symphony no.9, d-minor J. Podrazik, Kritiken Nostalgia, 2004 J. S. Bach, BWV 639, Orgelbüchlein J. Cesaris, Bonté biauté, 1420 C. Debussy, Prélude à l’après-midi d’un faune, 1892-94 N. Paganini, Violinkonzert Es-Dur, op. 6, 1812-18 N. A. Rimski-Korsakow, Scheherazade, op. 35, 1888 W. A. Mozart, Variationen KV 265 A. Dvořák, Violinkonzert a-Moll, op 53, 1882 L. v. Beethoven, Sonate op. 2, Nr. 1, f-Moll, 1795 G. F. Kaufmann, 1733 R. Schumann, Davidsbündlertänze, op. 6, 1837 L. v. Beethoven, Sturm-Sonate, op 31 2, 1802 Opusmodus, 2014 J. S. Bach, Goldberg-Variationen, Variatio 7, 1741 Fr. Couperin, Pieces de Clavecin, 1713 C. F. Pollarolo, II Farmando, 1699 H. Berlioz, Symphonie fantastique, op14, 1830 J. S. Bach, Brandenburgische Konzerte, No. 2, 1721 G. F. Handel, Orgelkonzert Nr. 4, F-Dur, 1. Satz, 1738 J. Haydn, Die Schöpfung, 1798 J. S. Bach, Goldberg-Variationen, Aria, 1741 G. Meyerbeer, Les Huguenots, 1836 L. v. Beethoven, Streichquartett F-Dur, op. 135, 1826 Dialog-Lauda, anonym, 1577 E. Gould, Behind Bars, Woodwind and Brass, p. 259-260, 2011 E. Gould, Behind Bars, Woodwind and Brass, p.247, 2011 A. Webern Satz für Streichtrio, 1925 E. Gould, Behind Bars, p.405, 2011 E. Gould, Behind Bars, p.405, 2011 E. Gould, Behind Bars, p.407, 2011 A. Webern, Sechs Bagatellen für Streichquartett, op. 9, III, 1913 A. Webern, Streichtrio, op. 20, 1927 C. Debussy, La Mer, 1905 A. Schönberg, Streichtrio, 1947 A. Webern, Sechs Bagatellen für Streichquartett, 1913 E. Elgar, Symphony No.1, 1907 N. Morgan, Matins for solo flute J. Podrazik, String Quartet No.2, Part 1, 2011 J. S. Bach, Sechs Suiten Sonaten fuer Violoncello solo, Suite I, Preludium, 1722 G. Ph. Telemann, 12 Fantasie per clavicembalo TWV 33, n.1, 1732 '((s a4 d5 fs4 d5 g4 d5) (s a4 d5 fs4 d5 g4 d5) (s a4 d5 cs5 b4 a4 g4) (s fs4 d4 e4 c4 e d4)) D. Scarlatti, Sonata B-Dur, 1736 '((e e5 3e g5 bb4 g4 e a4) (3e a5 c4 a4 e bb4 3e g5 bb4 g4) (s a4 c6 c6 a5 a5 f5) (s f5 d5 d5 c5 d5 bb5)) F. Chopin, Etudes, Op. 10, No. 5, 1833 '((3e gb6 bb6 db6 gb6 eb6 gb6 db6 gb6 bb5 db6 gb5 bb5) (3e gb5 bb5 db5 gb5 eb5 gb5 db5 gb5 bb4 db5 gb4 bb4) (3e db4 db5 ab4 db5 ab4 ab5 ab4 ab5 eb5 ab5 eb5 eb6) (3e eb5 eb6 ab5 eb6 ab5 ab6 ab5 ab6 db6 ab6 db6 db7)) J. S. Bach, Brandenburg Concerto No.4 in G major, BWV 1049, 1720 '((e g5g3 g5g3 fs5fs3) (e e5e3 g5g3 e5e3) (e a4a2 a5a3 g5g3) (e fs5fs3 a5a3 fs5fs3) (e b4b2 b5b3 a5a3) (e g5g3 b5b3 g5g3) (e e5e3 e6e4 d6d4) (s cs6cs4 e6e4 e6e4 cs6cs4 cs6cs4 a5a3) (s a5a3 cs6cs4 cs6cs4 a5a3 a5a3 fs5fs3) (s fs5fs3 a5a3 a5a3 fs5fs3 fs5fs3 d5d3) (e d5d3 -q) (e a4a2 -q) (e d4d2 -q)) I. Strawinsky, Petruschka, 1911/21 '((s d5f5b5 f e5g5c6 e f5a5d6 s g5b5e6 f5a5d6 e5g5c6 d5f5b5) (e c5e5a5 c5e5a5 q d5f5b5 marc) (s d5f5b5 e5g5c6 f5a5d6 g5b5e6 e f5a5d6 s e5g5c6 d5f5b5) (e c5e5a5 c5e5a5 q d5f5b5 marc)) L. Janáček, In the Mists, 1914 '((t cs5 pp< bs4 < cs5 < dn5 mp> cs5 > bn4 > gs4 > es4 pp -s fermata) (t gs4 fss4 gs4 an4 gs4 fss4 en4 cs4 -s fermata)) J. Podrazik, Piano Study No.3, 2013 '((e b6as7d7cs7 ff a6as7 p b6c6b5b4as5 mp e5f4b4a3 ffff s. ds3cs3c4b3 ff t c4fs3as2b2 mp) (3e= ds1a0gs1as1 mf a1gs1d1cs2d2ds2 ffff tie 3s a1gs1d1cs2d2ds2 ffff 3e d4c4 mp s b4f5a4as4d4ds4 ffff e cs2g1) (3h d1c1b0as0 pp as0c1fs1f1e1 b2cs3c4cs4 mf 3q d4cs4ds5e4fs4 mp f7e6 c6b5fs5c5e5as4 mf)) J. S. Bach, Goldberg-Variationen, Variato 18 a 1 Clav., 1741 '((-h q g5 tie) (h. g5) (h. fs5) (e g5 fs5 h e5 tie) (q e5 e d5 cs5 q d5 tie) (q d5 -h)) M. Reger, Aus meinem Tagebuch, I, 3, 1904/12 '((q d4f4bb4d5 f< leg c4eb4a4c5 < leg bb3d4g4bb4 < leg e c4eb4a4c5 < leg d4f4ab4d5 ff> leg) (q f4ab4d5f5 > leg e4g4bb4e5 > leg h fs4a4d5 mf) (q c4ds4a4 p< leg bb3e4g4 < leg b3d4fs4 f leg e3g3cs4 > leg) (h d3fs3d4 pp)) K. Stockhausen, Mantra für 2 Pianisten, 1970 '(t a3 p stacc a3 stacc a3 stacc a3 tie e a3 q... b3 t f h. gs4 mp (acc e e4 p f4 e4 d4) w e4) B. Smetana, Aus meinem Leben, Streichquartett e-Moll, 1876 '((e b4 f) (w b4 sf leg) (q e4 marc+stacc+espr - - -e fs4 stacc) (w g4 sf leg) (q b3 stacc+marc - - -e ds4 stacc) (h e4 sf marc+leg q g3 stacc+marc -e a3 stacc) (h b3 sf leg q e3 stacc+marc -e fs3 stacc) ((leg q g3 marc e e3 -s fs3 ten))) Opusmodus, Algorithmic, 2014 '((s cs5 p g6 mp mf -) (s cs5 f e g3 ff s p) (s cs5 mp g6 mf f -) (-s cs5 ff e g3 p) (s g3 mp - e cs5 mf) (s g6 f ff e cs5 p) (s g3 mp mf e cs5 f) (s g6 ff p cs5 mp g3 mf) (e g3 f s cs5 ff g6 p) (e g6 mp -s cs5 mf) (e g3 f -s g3 ff) (s cs5 p e g6 mp s mf)) L. v. Beethoven, op. 59, No.1, Finale '(((leg q d3 e c3 s d3 e3)) ((stacc e f3 f3 g3 g3 p)) (q a3 leg e c4 s stacc bb3 stacc) ((leg q a3 < e. c4 mp s bb3 >)) ((leg q a3 p e g3 s a3 e3)) ((stacc e f3 d3 cs3 a2)) ((stacc e d3 f3 e3 a3))) S. Prokofiev, Peter and the Wolf, op.67 '(h g2bb2d3 mp marc (leg s d3g3bb3 eb3fs3a3 d3g3bb3 eb3fs3a3 e d3g3bb3) d3g3bb3 g3bb3d4 ten eb3a3cs4 ten g3bb3d4 ten g3bb3 ten (acc e c3) h f3c4 marc) A. Bruckner, Symphony no.9, d-minor '(h a5 mart h_q a4 mart q g5 marc f5 marc e5 marc h... eb5 mart s d4 marc w eb4 mart) J. Podrazik, Kritiken Nostalgia, 2004 '(((marc e e3 mp eb4 fs3 c3) s g3 stacc e fs2 < marc (stacc s g2 < 5q gs2 < d3 < cs4 < e4 < d3 <)) (e c3 < marc gb2 < marc (stacc 5q c3 < d3 < c3 < ab2 < g3 < d3 < cs4 < eb4 < a3 < bb2 < d3 < a2 < b2 < bb2 < c4 mf))) J. S. Bach, BWV 639, Orgelbüchlein '((s g5 a5 g5 a5 e. a5 tr2-x t g5 a5 q b5 comma e. s c6) (q d6 s c6 e b5 s a5 q g5 e a5 b5) (qs c6 t d6 e6 s c6 b5 q b5 comma)) J. Cesaris, Bonté biauté, 1420 '((q. ab4 bb4) (q. ab4 g4) (q. f4 e4) (q f4 e g4 q f4 e e4) (h. f4 fermata)) C. Debussy, Prélude à l’après-midi d’un faune, 1892-94 '((leg h cs5 tie s s b4 3e as4 a4 gs4 e. g4 s a4 b4 c5)) N. Paganini, Violinkonzert Es-Dur, op. 6, 1812-18 '((q e5 leg e fs5 leg gs5 q a5 ten cs6 ten) (h cs6 leg q b5 e d6 leg cs6 leg) (q a5 cs6 marc+leg gs5 cs6 leg) (h. fs5)) N. A. Rimski-Korsakow, Scheherazade, op. 35, 1888 '(((leg h e5 tie e e5 3e d5 e5 d5 c5 d5 c5) (leg b4 c5 b4 a4 c5 e5 g5 fs5 e5))) W. A. Mozart, Variationen KV 265 '(e. c5 leg s g4 e. e5 leg s c5 e g5 q g5 e g5 c5g5a5 fp q c5f5a5 e e c5f5g5 fp q c5e5g5 e) A. Dvořák, Violinkonzert a-Moll, op 53, 1882 '((-q (acc e a3e4) h c5e5 f (leg 3q a4c5 ten b4d5 ten c5e5 ten)) ((acc e e4) h. c5e5 q e5) ((leg q d5 e. c5 t d5 c5) q b4 leg a4) (q gs4 cresc leg h e4 (leg 3q d4 f4 a4)) (q gs4 leg h e4 (leg 6q d4 f4 a4 d5 f5 a5 ff))) L. v. Beethoven, Sonate op. 2, Nr. 1, f-Moll, 1795 '((q c4 p) (q f4 ab4 c5 f5) ((leg q. ab5 3e g5 f5 e5 q f5) -) (q g4 c5 e5 g5) ((leg q. bb5 3e ab5 g5 f5 q g5) -) ((acc e c5 leg) q. ab5 3e g5 f5 e5 q f5 -) ((acc e c5 leg) q. bb5 3e ab5 g5 f5 q g5 -) (h c5f5ab5c6 arp e bb5 ab5 g5 f5) ((app s e5 leg f5 leg g5 leg) q f5 leg e5 -q fermata -)) G. F. Kaufmann, 1733 '((h d4 leg (-app e e4) h e4 (-app s d4 e4)) (h f4 g4 leg (-app e a4)) (h f4 (-app s e4 f4) h e4) (w d4)) R. Schumann, Davidsbündlertänze, op. 6, 1837 '((q d4fs4 arp) (q cs4e4g4 arp c4eb4fs4a4 arp bb3d4g4bb4 arp) (h a3d4fs4c5 arp q bb3d4g4bb4 arp)) L. v. Beethoven, Sturm-Sonate, op 31 2, 1802 '((-h cs2e2a2cs3e3a3 tie+arp) (h. cs2e2a2 fermata q cs3a3 stacc) ((stacc q d3a3 e3a3 f3a3 cs3a3))) Opusmodus, 2014 '(q c4 kgliss b5 kgliss c4 kgliss e c5 kgliss q cs4 kgliss b5 kgliss c4 kgliss cs5 kgliss f4 kgliss c5) J. S. Bach, Goldberg-Variationen, Variatio 7, 1741 '((q a4 t b4 leg cs5 leg d5 leg e5 leg e. fs5 s d5 e a4) (q b4 t cs5 leg d5 leg e5 leg fs5 leg e. g5 s e5 e b4) ((app. e b4) e. cs5 s a4 e a5 e. d5 s e5 e cs5) ((app e cs5) q d5 tie h)) Fr. Couperin, Pieces de Clavecin, 1713 '((q g5 lmordent2 e fs5 mordent1+leg (-app s e5 leg fs5)) (q g5 e b4 (app e b4) q c5 lmordent1 e d5) (q b4 mordent1 e a4 c5 lmordent1+leg e b4 mordent1) (q e5 lmordent2 (app s e5 leg fs5 leg) e g5 e. c5 mordent1 s d5 e b4 mordent1)) C. F. Pollarolo, II Farmando, 1699 '((-q e d5 a4 q d4 e d5 a4) (e fs4 d4 a4 d5 q cs5 fs5 trem-s) (q g4 trem-s e5 trem-s fs4 trem-s d5 trem-s) (q e4 trem-s cs5 trem-s e d4 s e4 fs4 g4 a4 b4 cs5) (e d5 g4 a4 a3) (q d4)) H. Berlioz, Symphonie fantastique, op14, 1830 '((q g4 (acc e b4) c5 q g4 (acc e ds5) e5) ((acc e ds5) q e5 (acc e e5) f5 q f5 tr2 e e5) (q e5 tr1 e d5 q d5 tr2 e c5)) J. S. Bach, Brandenburgische Konzerte, No. 2, 1721 '((e c5 g5 g5 tr2 s f5 g5) (e a5 s g5 f5 e g5 c6) (e g5 tr2 s e5 f5 e g5 tr2 s f5 g5)) G. F. Handel, Orgelkonzert Nr. 4, F-Dur, 1. Satz, 1738 '((q g5 lmordent2 lmordent2 q. tr2 e c6) (q. g5 tr2 e c6 q. g5 tr2 e c6) (s g5 fs5 g5 bb5)) J. Haydn, Die Schöpfung, 1798 '((e ab4 eb4 g4 ab4 eb4 g4 turn12+leg) (e ab4 eb4 b4 c5 ab4 e4)) J. S. Bach, Goldberg-Variationen, Aria, 1741 '((q d5 q d5 leg e. e5 lmordent2-t s f5) (e e5 (app s d5) e c5 (app. s b4) q. a4 e fs5 turn12) (t g5 leg s. fs5 t a5 leg s. g5 t fs5 leg s. e5 t d5 leg s. c5 (app. e c5) e. a5 s c5) (t b4 leg s. g4 e fs4 (app e fs4) h g4 lmordent1-t)) G. Meyerbeer, Les Huguenots, 1836 '((h bb3gb3 mp ttrem db4 q cb4ab3gb3 ttrem db3) (h bb3gb3 ttrem db4 q cb4ab3gb3 ttrem db3)) L. v. Beethoven, Streichquartett F-Dur, op. 135, 1826 '((q. g2g3 p e e2e3 < h ab2ab3 < c5 mp tie+cue) ((cue e c5 bb4 ab4 g4 f4 a4 c5 e5 q f5 comma) a4 f)) Dialog-Lauda, anonym, 1577 '((repeat (-q q. g4bb4d5 e g4bb4d5 q c4c5eb5) (q f4a4c5 g4bb4 h f4a4c5) (h bb3bb4 g3g4bb4) (h d4f4a4 q g4bb4 f4a4c5 tie) (q f4a4c5 g4bb4 h d4fs4a4) (end1 (h g4)) (end2 (h g4)))) E. Gould, Behind Bars, Woodwind and Brass, p. 259-260, 2011 '(s cs4 key-slap d5 -e s ab4 ten+key-slap f5 stacc) E. Gould, Behind Bars, Woodwind and Brass, p.247, 2011 '((h f4 trem+frull+tie e f4 trem-s a4) (-q h e4 trem+frull+tie) (e e4 ord d4 leg q a4)) A. Webern Satz für Streichtrio, 1925 '(-t. x d6 pp> stacc+arco 3s f4 > leg e5 > leg fs6 ppp -t. x cs4 p t. eb5 > leg x e4 ppp) E. Gould, Behind Bars, p.405, 2011 '(((stacc e a4 spicc+ubow s c5 dbow+leg b4 e a4 ubow s g4 dbow+leg f4 e e4 ubow))) E. Gould, Behind Bars, p.405, 2011 '((dbow e d5 = = = = = = =)) E. Gould, Behind Bars, p.407, 2011 '(((stacc s b3 legno-batt = e e d4 =)) (-h d5 arco-ord+leg) (h d4 -) (h_e c4 legno-tratto -e q f4 tie) (h f4 q d4 marc+pizz -)) A. Webern, Sechs Bagatellen für Streichquartett, op. 9, III, 1913 '((-3e c4 pp< pizz+stacc stacc -e - 5e f5 mf< arco a5 e6 fs6 bb6) (-e q. g5 < trem+harm) (q g5 trem+harm -s f4e5 ff stacc+pizz -e)) A. Webern, Streichtrio, op. 20, 1927 '((e bb4 p> leg s fs5 stacc fs5 stacc+pizz - (acc b3 arco+harm+leg) c4 pp c4 stacc+pizz - a5 p> arco+leg d6 stacc (acc cs5 leg) gs4 stacc -) (s cs5 pp stacc+pizz (acc a5 leg+arco) gs4 stacc -e -s gs4 p> stacc+ten (acc a5 leg) d6 stacc eb4 pp ten+pizz)) C. Debussy, La Mer, 1905 '(((leg q. f4 ff vib+sul4 e e4 sul4 q. ds4 sul4 e e4 sul4)) ((leg q. f4 mf sul4 e e4 sul4 3h ds4 < ten+sul4 fs4 < ten+sul4 gs4 < ten+sul4)) (q. f4 f leg+sul4 e e4 leg+sul4 q. ds4 leg+sul4 e e4 leg+sul4) (q. f4 > leg+sul4 e e4 > leg+sul4 3h eb4 > leg+stacc+sul4 d4 > leg+stacc+sul4 cs4 p leg+stacc+sul4)) A. Schönberg, Streichtrio, 1947 '((h db5bb5 ppp trem e db5bb5 - -q) (-h a3 pp ponte+tie) (h a3 fermata -h fermata)) A. Webern, Sechs Bagatellen für Streichquartett, 1913 '((-e -s (leg eb5 pp< ponte+con-sord 3e a6 < eb5 < a6 < leg)) ((leg 3e eb5 mp> a6 > eb5 >) -e -e) (-e -3e - (leg+stacc e4 ppp< < < p))) E. Elgar, Symphony No.1, 1907 '(((leg h b2 pp< 3h as2 > marc b2 > c3 > tie)) (3h c3 (leg cs3 mp e3 tie e3 > d3 c3 pp)) ((leg 3h b2 < marc as2 b2 c3 marc b2 c3 mp))) N. Morgan, Matins for solo flute '((-s db4 mp e. b4 tie) (s b4 db4 b4 e. g4 tie) (s g4 db4 b4 g4 gs5 b4 g4) (s gs5 b4 db4 e. g4 tie) (s g4 comma b4 db4) (s c6 eb4 e. a4)) J. Podrazik, String Quartet No.2, Part 1, 2011 '((e. a3 p<mf s a3 p<mf tie s a3 e. a3 p<mf s a3 mp stacc e a3 s a3 marc s p ord+stacc stacc e non-vib) (h. a3 pfp s b3 p ord+stacc s c4 stacc s stacc s marc+trem+tasto)) J. S. Bach, Sechs Suiten Sonaten fuer Violoncello solo, Suite I, Preludium, 1722 '(((leg s g2 mf e3 b3 a3 b3 g3 fs3 g3) (leg e3 g3 dig2 fs3 g3 b2 > dig1 d3 > cs3 > b2 >)) ((leg s cs3 p dig3 g3 dig2 a3 sul g3 dig2 a3 g3 a3 g3) (leg cs3 g3 a3 g3 a3 g3 a3 g3)) ((leg s fs3 p< dig1 a3 < sul d4 < cs4 d4 mf a3 dig4 g3 a3 fs3) (leg a3 g3 a3 d3 > sul fs3 > dig3 e3 > d3 >)) ((leg s e2 p dig1 b2 g3 fs3 g3 b2 g3 b2) (leg e2 b2 g3 fs3 g3 b2 g3 b2)))
11. ## Lesson 30. Clusters, Repeats and Ornaments

Contents Annotation Score Notation Annotation Clusters have become a feature of piano writing since the experiments of Henry Cowell in the early 20th century. Written ornaments and repeat signs appeared much earlier, around the 16th century. This piece brings these additions together. This composition introduces manually written OMN ornaments and articulations into an existing part. It also processes the resultant OMN list produced initially from MAKE-OMN with GEN-PAUSE and GET-TIME-SIGNATURE. It shows how, with GEN-PAUSE, a keyboard texture can be split between the hands. The first focus is on using the function GEN-CLUSTER. This a formidable function with many parameters and keywords: (setf clusters-mix (gen-cluster cluster-size :type '? :rotate '(0 2 -1 3 0 -2 2 -2 2 -1) :transpose (rnd-sample 10 integers :seed 72))) The variable cluster-size is a list of cluster lengths: (setf cluster-size '(2 4 3 5 2 4 3 1 3 4)) These cluster-size values can be processed as chords or separate pitches (melodies) or as a random selection of both.The keyword :type may have the value 'c, 'm or '?. So in clusters-mix we have a random selection ('?). The keyword :rotate is a musical rather than mathematical rotation, thus moving rotated pitches into higher or lower octaves. Notice how chords and single pitches in a list are rotated with minus values. Then, there’s the keyword :transpose: . . . :transpose (rnd-sample 10 transp-values :seed 72) The variable transp-values gives a list of the transposition values associated with the Slonimsky pattern we’ve used in almost all the tutorials: => (0 1 6 7 12) The result here is that 10 RND-SAMPLE values from transp-values move the clusters into different transpositions. => ((c5cs5) (gs4 a4 fs5 g5) (d3c4cs4) (a4 as4 fs5 g5 gs5) (c5 cs5) . . .) When examining this output, keep in mind the effect of rotation on the pitch order. Before we move to the next cluster expression Audition the variable cl-1. You’ll hear that the piano texture moves obliquely from treble to bass and back: it needs to be played using both hands. Using GEN-PAUSE we can achieve this . . . but there are ornaments and articulations to add first. The second cluster expression is almost identical to the first, but the output is melodic and the random :seed that dealt with the :transpose keyword is different. Now to the rhythm. This calls for a straightforward span of pitch lists to a note-length value: (setf rhy (span clusters-mix '(e))) => ((1/8) (1/8 1/8 1/8 1/8) (1/8) (1/8 1/8 1/8 1/8 1/8) (1/8 1/8) (1/8) . . .) However, the sensible composer wants a longer duration on those lists that contain a single note-length, partly because the pitches that occupy these lists are in the bass register and need more sounding space. So those values are augmented by using the :section keyword to manually specify the lists to be replaced with longer length values: (setf rhy-aug (position-replace '(0) '(1/4) rhy :section '(0 2 5 7))) => ((1/4) (1/8 1/8 1/8 1/8) (1/4) (1/8 1/8 1/8 1/8 1/8) . . .) We can use the same technique to replace dynamics when single list values occur: (setf dyn-ff (position-replace '(0) '(ff) dyn :section '(0 2 5 7))) We could end the basic composing here, but there’s an opportunity, once we’ve created an OMN list for each cluster expression, to add musical detail and articulations. Here’s the basic output: (setf cl-1 (make-omn :length rhy-aug :pitch clusters-mix :velocity dyn-ff)) => ((q c5cs5 ff) (e gs4 mp a4 fs5 g5) (q d3c4cs4 ff) (e a4 mp as4 fs5 g5 gs5) . . .) And here is a new OMN sequence of sublists complete with added repeats, arpeggiation of chords, legato and a glissando: (setf cl-1a '((q c5cs5 ff =) (e gs4 mp leg a4 leg fs5 leg g5) (q d3c4cs4 ff =) (e a4 mp leg as4 leg fs5 leg g5 leg gs5) (e c5 mp leg cs5) (q d3ds3c4cs4 fff arp) (e ds4 mp leg cs5 leg d5) (q c2 key-gliss c4 ff) (e ds4 mp leg cs5 leg d5) (e ds4 mp leg c5 p leg cs5 pp leg d5 ppp :repeat 2))) A new variable cl-1a has been created and the edits and additions written by hand. These include repeats like :repeat 2, arpeggiation arp, and glissandi key-gliss. In the other cluster expression there are trills tr1, acciaccaturas (acc c5), appoggiaturas (app b5) and staccato stacc: (setf cl-2a '((e c5 p cs5 tr1) (e d5 p (acc c5) ds5 c6 cs6) (e a3 p g4 gs4 tr1) (e as4 p b4 g5 gs5 a5) (e fs4 p g4) (e d3 p ds3 c4 cs4) (e d5 p (app b5) c6 cs6) (e c3 fff) (e gs4 p stacc fs5 stacc g5 stacc) (e ds3 p stacc c4 stacc cs4 stacc d4 stacc))) Now, to bring this material together and in a different way from previous tutorials, as all the lists we are using are OMN lists: (setf rh-1 (gen-pause cl-1a :section '(0 2 5 7))) (setf lh-1 (gen-pause cl-1a :section (find-complement '(0 2 5 7) :high 9))) These expressions using GEN-PAUSE with the addition of FIND-COMPLEMENT split the keyboard texture between right and left hands. Finally, notice how the function GET-TIME-SIGNATURES flawlessly interprets the OMN lists to produce the time-signature: (setf timesigs (get-time-signature rh-1)) => ((2 4 1) (2 4 1) (2 4 1) (5 8 1) (1 4 1) . . .) Coda: Using and extending OMN script is a great way to add the sort of detail that is often left out of a parametric score-script. Composers often feel it’s easier to add such detail when working on the final notated piece on a score-writer. With Opusmodus, and with a little practice, adding performance detail can be achieved successfully, and the MIDI realisation of ornaments, for example, is excellent. Sometimes it is also very useful and necessary to examine the elements of an OMN list separately, which can easily be done with the function DISESSEMBLE-OMN: (disassemble-omn cl-2a) => (:length ((1/8 1/8) (1/8 0 1/8 1/8 1/8) (1/8 1/8 1/8) (1/8 1/8 1/8 1/8 1/8) (1/8 1/8) (1/8 1/8 1/8 1/8) (1/8 0 1/8 1/8) (1/8) (1/8 1/8 1/8) (1/8 1/8 1/8 1/8)) :pitch ((c5 cs5) (d5 c5 ds5 c6 cs6) (a3 g4 gs4) (as4 b4 g5 gs5 a5) (fs4 g3) (d3 ds3 c4 cs4) (d5 b5 c6 cs6) (c3) (gs4 fs5 g5) (ds3 c4 cs4 d4)) :velocity ((p p) (p p p p p) (p p p) (p p p p p) (p p) (p p p p) (p p p p) (fff) (p p p) (p p p p)) :articulation ((- tr1) (- acc - - -) (- - tr1) (- - - - -) (- -) (- - - -) (- app - -) (-) (stacc stacc stacc) (stacc stacc stacc stacc))) Finally, note how the function RESPELL has been added to the left hand part of the piano within the final DEF-SCORE expression. (piano-lh :omn (respell lh-2 :type :chord)) ) Score (setf pitches '(c4 cs4 fs4 g4 c5)) (setf transp-values (pitch-to-integer pitches)) (setf cluster-size '(2 4 3 5 2 4 3 1 3 4)) (setf clusters-mix (gen-cluster cluster-size :type '? :rotate '(0 2 -1 3 0 -2 2 -2 2 -1) :transpose (rnd-sample 10 transp-values :seed 72))) (setf clusters-mel (gen-cluster cluster-size :type 'm :rotate '(0 2 -1 3 0 -2 2 -2 2 -1) :transpose (rnd-sample 10 transp-values :seed 51))) (setf rhy (span clusters-mix '(e))) (setf rhy-2 (span clusters-mel '(e))) (setf rhy-aug (position-replace '(0) '(1/4) rhy :section '(0 2 5 7))) (setf dyn (span rhy '(mp))) (setf dyn-ff (position-replace '(0) '(ff) dyn :section '(0 2 5 7))) (setf cl-1 (make-omn :length rhy-aug :pitch clusters-mix :velocity dyn-ff)) (setf cl-2 (make-omn :length rhy-2 :pitch clusters-mel :velocity '(p))) ;; Edited output from cl-1 (setf cl-1a '((q c5cs5 ff =) (e gs4 mp leg a4 leg fs5 leg g5) (q d3c4cs4 ff =) (e a4 mp leg as4 leg fs5 leg g5 leg gs5) (e c5 mp leg cs5) (q d3ds3c4cs4 fff arp) (e ds4 mp leg cs5 leg d5) (q c2 kgliss c4 ff) (e ds4 mp leg cs5 leg d5) (e ds4 mp leg c5 p leg cs5 pp leg d5 ppp :repeat 2))) ;; Edited output from cl-2 (setf cl-2a '((e c5 p cs5 tr1) (e d5 p (acc c5) ds5 c6 cs6) (e a3 p g4 gs4 tr1) (e as4 p b4 g5 gs5 a5) (e fs4 p g4) (e d3 p ds3 c4 cs4) (e d5 p (app s b5) e c6 cs6) (e c3 fff) (e gs4 p stacc fs5 stacc g5 stacc) (e ds3 p stacc c4 stacc cs4 stacc d4 stacc))) #| Examine the elements of an OMN list separately (disassemble-omn cl-2a) |# (setf rh-1 (gen-pause cl-1a :section '(0 2 5 7))) (setf lh-1 (gen-pause cl-1a :section (find-complement '(0 2 5 7) :high 9))) (setf rh-2 (assemble-seq rh-1 cl-2a rh-1)) (setf lh-2 (assemble-seq lh-1 (pitch-transpose -12 cl-2a) lh-1)) (setf timesigs (get-time-signature rh-2 :group '((5)))) (def-score lesson-30 (:key-signature 'chromatic :time-signature timesigs :tempo 120 :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-2 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn (respell lh-2 :type :chord)) ) Notation Go back to Reference page.
12. ## Lesson 29. Tempo Changes and Percussion

Contents Annotation Score Notation Annotation This is an earlier piece Lesson 7 transformed by the addition of tempo changes and a percussion part for Latin percussion. There are two ways to add tempo changes to a score-file. Both are explained here and in detail in the DEF-SCORE documentation. The first way produces very straightforward changes that are triggered at the start of a particular bar/list. The second is more complex but does allow for ritardando and accelerando and produces a very finely graduated tempo change over any number of bars/lists using the concept of ‘delta time’. The piece is in an A B A structure and lasts for 15 bars of 5/8. Here's the first approach to tempo change: (setf tempo-list-1 '(60 70 80 90 100 110 120 60 120 110 100 90 80 70 60)) (setf tempo-1 (make-tempo tempo-list-1 bars)) => ((60 :length 5/8) (70 5/8) (80 5/8) (90 5/8) (100 5/8) (110 5/8) (120 5/8) (60 5/8) (120 5/8) (110 5/8) (100 5/8) (90 5/8) (80 5/8) (70 5/8) (60 5/8)) Each bar in this approach requires a tempo-change value even if many bars might require the same value. The variable tempo-1 is then placed inside the DEF-SCORE expression: (def-score lesson-29 (:key-signature '(c maj) :time-signature ts-list :tempo tempo-1) The second approach is more sophisticated and its results more subtle. The downside is the tempo-change list is a little more complex. (setf tempo-2 '(("Mixed Tempi" q :accel 60 100 1/32 5) (110 1) (120 1) (60 1) (120 1) (110 1) (:rit 100 60 1/32 5))) The expression begins with a list that includes a tempo marking and value to be placed at the start of the notation score. There are four slots in all. Here's the document instruction itself: <tempo-name> is a string for the tempo to be printed by notation, e.g. \"Allegro\". <beat-note> is an OMN note symbol denoting the note that gets a beat, e.g. q or e. <:bars/:length>, if included, determines whether <count> is a number of bars or a length (number of quarter notes). Defaults to :bars. The first list of tempo changes has an accelerando from 60 to 100 bpm with a delta-time value of 1/32 over a period of 5 bars: (:accel 60 100 1/32 5) This is followed by 5 bars each set to a different tempo. . . . (110 1) (120 1) (60 1) (120 1) (110 1) Then, to finish there's a gradual ritardando indicated. (:rit 100 60 1/32 5)) Finally, the tempo-2 variable is placed within the DEF-SCORE expression: (def-score lesson-29 (:key-signature '(c maj) :time-signature ts-list :tempo tempo-2) The additional percussion part is an opportunity to see how such a part might be organised and notated. The pitch organisation uses a preliminary mapping, if only because the pitch layout of GM percussion is hardly intuitive! The mapping sonically is low to high (a b c d) even though the pitches that trigger the percussion samples are not the same. Mapping the percussion kit is made possible by defining new variables with an alphabetical series of variables whose names are suggestive of pitches, but which actually encapsulate the ‘correct’ GM percussion note: (setf c '(cs4) ;bongo l d '(c4) ;bongo h a '(e4) ;conga l b '(ds4)) ;conga h The rhythms are notated here directly in OMN. here’s the A section: (setf rhy-p '((e = = - e) (e - s =‌= = e) (-e e = - s =) (e = s = e e) (-e e - s = = =))) OMN also has particular shorthand notations for repeats and rests: = repeats a note-length - is a rest-length =‌= doubles up the note-length =‌=‌= triples the note-length. See how the function APPLY-EVAL turns the alphabetical percussion mapping series into pitches: (setf p-kit-i (apply-eval ' ((a a a b) (a c d c d b) (a b c d) (a b c c b) (a c d c d)))) => ((e4 e4 e4 ds4) (e4 cs4 c4 cs4 c4 ds4) (e4 ds4 cs4 c4) (e4 ds4 cs4 cs4 ds4) (e4 cs4 c4 cs4 c4)) Score ;; Mapping percussion kit (setf c '(cs4)) ; bongo l (setf d '(c4)) ; bongo h (setf a '(e4)) ; conga l (setf b '(ds4)) ; conga h (setf line (gen-repeat 5 '((c4 cs4 fs4 g4 c5)))) (setf line-t (pitch-transpose '(0 1 7 6 0) line)) (setf bass (pitch-transpose -24 line)) (setf bass-r (gen-retrograde bass :section '(0 2 4))) (setf chords '(c4cs4fs4 fs4g4c5)) (setf rhythm (span line '(e))) (setf rhy-c (span rhythm chords)) (setf rhy-w (length-weight rhythm :weight '(2 1) :seed 30)) (setf rhy-wi (length-weight rhythm :weight '(3 1) :seed 23)) (setf rhy-p '((e = = - e) (e - s =‌= = e) (-e e = - s =) (e = s = e e) (-e e - s = = =))) (setf rhy-p1 '((e = = =‌=) (e = = - =) (e = = = =) (-e = = - =) (e = = - e))) (setf p-kit-i (apply-eval '((a a a b) (a c d c d b) (a b c d) (a b c c b) (a c d c d)))) (setf p-kit-ii (apply-eval '((a b a d a) (a b a c) (c d d c d) (a b a) (d a c d)))) (setf perc-1 (make-omn :length rhy-p :pitch p-kit-i :velocity '(f))) (setf perc-2 (make-omn :length rhy-p1 :pitch p-kit-ii :velocity '((mf) (f) (fff) (f) (mf)))) (setf line-1 (make-omn :length rhy-w :pitch line-t :velocity'(f))) (setf bass-1 (tie-bars (make-omn :length rhythm :pitch bass-r :velocity '(mp)))) (setf line-2 (make-omn :length rhy-w :pitch chords :velocity '((mp) (mf) (fff) (mf) (mp)))) (setf bass-2 (make-omn :length rhy-wi :pitch bass-r :velocity '(f))) (setf part-1-rh (assemble-seq line-1 line-2 line-1)) (setf part-1-lh (assemble-seq bass-1 bass-2 bass-1)) (setf perc-1-2-1 (assemble-seq perc-1 perc-2 perc-1)) ;; Two different forms of tempo change - try each in the tempo slot of def-score. ;; Tempo-change 1 (setf tempo-list-1 '(60 70 80 90 100 110 120 60 120 110 100 90 80 70 60)) (setf tempo-1 (make-tempo tempo-list-1 part-1-rh)) ;; Tempo-change 2 (setf tempo-2 '(("Mixed Tempi" q :accel 60 100 1/32 5) (110 1) (120 1) (60 1) (120 1) (110 1) (:rit 100 60 1/32 5))) (setf ts-list (get-time-signature part-1-rh :group '((5)))) (def-score lesson-29 (:key-signature 'chromatic :time-signature ts-list :tempo tempo-2 :layout (list (piano-layout 'piano-rh 'piano-lh) (percussion-layout 'percussion))) (piano-rh :omn (respell part-1-rh :type :chord) :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn part-1-lh) (percussion :omn perc-1-2-1 :channel 10 :pan 64) ) Notation Next page Lesson 30. Clusters, Repeats and Ornaments Go back to Reference page.
13. ## Lesson 28. Working with Libraries

Contents Annotation Score Notation Annotation Back to the piano and a piece with a ragtime feel using Opusmodus libraries as way of working with collections of pitch and rhythm material. There are three functions associated with libraries: CREATE-LIBRARY, DEF-LIBRARY and LIBRARY. We'll use them all here. In this composition we'll work with the libraries within the score-file itself, but it's worth looking at the Library Section of the Utilities Pane just to get an idea of the kind of material that can be kept there. We'll start by creating two libraries: one for rhythm, one for pitch. Here's the one for rhythm: (create-library 'Binary-Rhythmics '4-bit-binary 'binr (combination2 4 '(1 0))) In the above code, the CREATE-LIBRARY function will create a library definition for 'Binary-Rhythmics, which in this case includes only one sub-section '4-bit-binary. The definition will be printed directly to the Listener. Note that each definition in the library is also user-defined prefix 'binr. So, to access the first item in the library we would refer to it as 'binr0. We end up with a list like this, copied from the Listener and pasted into our Composer panel: (def-library binary-rhythmics (:section 4-bit-binary binr0 '(0 0 0 0) binr1 '(1 0 0 0) binr2 '(0 1 0 0) . . . )) The output shown here is from the function COMBINATION2, a function that can output all the possible occurrences in a list of 4 items consisting in this instantce of the binary digits (1 0). With this print-out a library can be defined with the function DEF-LIBRARY. Here's part of it: (def-library binary-rhythmics (:section 4-bit-binary binr0 '(0 0 0 0) binr1 '(1 0 0 0) binr2 '(0 1 0 0) binr3 '(1 1 0 0) binr4 '(0 0 1 0) binr5 '(1 0 1 0) binr6 '(0 1 1 0) binr7 '(1 1 1 0) binr8 '(0 0 0 1) binr9 '(1 0 0 1) binr10 '(0 1 0 1) binr11 '(1 1 0 1) binr12 '(0 0 1 1) binr13 '(1 0 1 1) binr14 '(0 1 1 1) binr15 '(1 1 1 1) )) The output from the Listener can not only be copied and pasted onto the working file itself (as it is here), but also can be saved in a dedicated file to the composer's own user-library. Now for the pitch library. As the Slonimsky library is already part of the Opusmodus libraries we don't have to create a library, only define one (see the Libraries tab in the Utilities panel to access the Slonimsky Thesaurus library). Here we've copied a section from the Slonimsky library and labelled it as :section tritone27-31. Notice these entries are for both upward and downward patterns. Again we could create a separate user-file or, as here, simply paste it to our working file. Composing begins with these expressions using the function LIBRARY to pick out random lists from each library using the :random keyword: (setf rh-pitches (library 'slonimsky-s 'tritone27-31 nil :random 20 :seed 61)) => ((c4 f4 fs4 g4) (c5 gs4 fs4 e4) (c5 gs4 fs4 e4) . . .) (setf rh-rhythms (library 'binary-rhythmics '4-bit-binary nil :random 20 :seed 51)) => ((1 1 0 1) (0 0 1 1) (1 1 1 0) (1 0 0 1) . . .) Because we're using binary lists in conjunction with BINARY-MAP, the pitches will be swallowed by the rhythm pattern rather than skipping length-rests. (setf rh-pitches-s (binary-map rh-rhythms rh-pitches)) => ((c4 f4 g4) (fs4 e4) (c5 gs4 fs4) . . .) (setf rh-rhythms-s (binary-map rh-rhythms '(s))) => ((1/16 1/16 -1/16 1/16) (-1/16 -1/16 1/16 1/16) (1/16 1/16 1/16 -1/16) . . .) This is fine, but the texture of the right hand isn't quite finished. (setf rhy-inversion (length-invert rh-rhythms-s :section '(0 3 4 5 6 8 11 12 14 16 18))) A secondary part is created here using the LENGTH-INVERT function. This changes the rhythm list rh-rhythms-s into: => ((-1/16 -1/16 1/16 -1/16) (-1/16 -1/16 1/16 1/16) (1/16 1/16 1/16 -1/16) . . .) But there's more, as the LENGTH-INVERT function is only being applied to this part on certain sections (lists) in the piece. The result is contrary-motion figures and chordal passages all playable by a single hand. In the left hand part the pitch library-based expression is set to a different :seed, but in the rhythm library-based expression it's been removed. Here a further aspect of LIBRARY is revealed: the ability to be able to :collect together a list of chosen rhythms. Here a template has been collected based on the order of the library list of rhythms. The template is used to pick from the library via the keyword :collect: (setf template '(11 12 7 9 15 13 12 4 2 6)) (setf lh-rhy (library 'binary-rhythmics '4-bit-binary nil :collect template)) => ((1 1 0 1) (0 0 1 1) (1 1 1 0) (1 0 0 1) . . .) In the pitch parameter, intervals are added with CHORD-INTERVAL-ADD, but only to lists that have one or two notes: (setf lh-pitches-s (chord-interval-add '(-5 -6) (binary-map lh-rhythms lh-pitches) :section '(1 3 6 8))) => ((c3 bb2 d3) (fs3cs3 eb3a2) (c3 g3 fs3) . . .) In the rhythm parameter, LENGTH-AUGMENTATION is used to create bars of 5/8 rather than the 2/8 bars of the right hand. This is the reason only 10 rhythms and pitch selections have been made from the library collections. (setf lh-rhythms-s (length-augmentation 2 (binary-map lh-rhythms '(s)))) => ((1/8 1/8 -1/8 1/8) (-1/8 -1/8 1/8 1/8) (1/8 1/8 1/8 -1/8) . . .) Notice in the :layout part of the expression there is the keyword :ignore-velocity t. This enables you to block the appearance of dynamics signs in the notation output. (def-score lesson-28 (:key-signature 'chromatic :time-signature '((1 1 1 1 1) 8) :tempo '(q 60) :layout (piano-solo-layout 'piano-rh 'piano-lh :ignore-velocity t)) (piano-rh :omn (merge-voices rh-1 rh-2) :channel 1 :sound 'gm :program 'acoustic-grand-piano :controllers (ped '(0 127 0 127 0 0 0 0 127 0 0 0 127 0 127 0 127 0 127))) (piano-lh :omn lh-1) ) Score (create-library 'Binary-Rhythmics '4-bit-binary 'binr (combination2 4 '(1 0))) (def-library binary-rhythmics (:section 4-bit-binary binr0 '(0 0 0 0) binr1 '(1 0 0 0) binr2 '(0 1 0 0) binr3 '(1 1 0 0) binr4 '(0 0 1 0) binr5 '(1 0 1 0) binr6 '(0 1 1 0) binr7 '(1 1 1 0) binr8 '(0 0 0 1) binr9 '(1 0 0 1) binr10 '(0 1 0 1) binr11 '(1 1 0 1) binr12 '(0 0 1 1) binr13 '(1 0 1 1) binr14 '(0 1 1 1) binr15 '(1 1 1 1) )) (def-library Slonimsky-s (:section tritone27-31 s27u '(c4 cs4 fs4 b4) s27d '(c5 b4 fs4 cs4) s28u '(c4 d4 fs4 as4) s28d '(c5 as4 fs4 d4) s29u '(c4 ds4 fs4 a4) s29d '(c5 a4 fs4 ds4) s30u '(c4 e4 fs4 gs4) s30d '(c5 gs4 fs4 e4) s31u '(c4 f4 fs4 g4) s31d '(c5 g4 fs4 f4))) ;; Right-hand (setf rh-pitches (library 'slonimsky-s 'tritone27-31 nil :random 20 :seed 61)) (setf rh-rhythms (library 'binary-rhythmics '4-bit-binary nil :random 20 :seed 51)) (setf rh-pitches-s (binary-map rh-rhythms rh-pitches)) (setf rh-rhythms-s (binary-map rh-rhythms '(s))) (setf rhythm-inversion (length-invert rh-rhythms-s :section '(0 3 4 5 6 8 11 12 14 16 18))) (setf rhythm-inversion-p (span rhythm-inversion rh-pitches)) (setf dynamics '((mp) (f) (f) (mp) (p ) (mp) (mf) (f f f f mf) (p) (ff))) (setf rh-1 (make-omn :length rh-rhythms-s :pitch rh-pitches-s :velocity dynamics)) (setf rh-2 (make-omn :length rhythm-inversion :pitch rhythm-inversion-p :velocity (reverse dynamics))) ;; Left-hand (setf lh-pitches (ambitus '(g2 g3) (library 'slonimsky-s 'tritone27-31 nil :random 10 :seed 52 :transpose -12))) (setf template '(11 12 7 9 15 13 12 4 2 6)) (setf lh-rhythms (library 'binary-rhythmics '4-bit-binary nil :collect template)) (setf lh-pitches-s (chord-interval-add '(-5 -6) (binary-map lh-rhythms lh-pitches) :section '(1 3 6 8))) (setf lh-rhythms-s (length-augmentation 2 (binary-map lh-rhythms '(s)))) (setf lh-1 (make-omn :length lh-rhythms-s :pitch lh-pitches-s :velocity '(f))) (def-score lesson-28 (:key-signature '(c maj) :time-signature '((5) 8) :tempo '(q 60) :ignore-velocity t :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn (merge-voices rh-1 rh-2) :channel 1 :sound 'gm :program 'acoustic-grand-piano :controllers (ped '(0 127 0 127 0 0 0 0 127 0 0 0 127 0 127 0 127 0 127))) (piano-lh :omn lh-1) ) Notation Next page Lesson 29. Tempo Changes and Percussion Go back to Reference page.
14. ## Lesson 27. Merging Parts and Sequencing Score-Scripts

Contents Annotation Score Notation Annotation For this score-script we change instruments: from piano to the classical guitar. This is the first movement of Nigel Morgan’s 4 Movements for Peace titled Invocation. The reason for including this is that its score-script includes the function MERGE-VOICES and the playing of multiple score-scripts. There are in fact three score-scripts in this file: part-1, 2 and 3. Organising your composition this way has many advantages as you can build the sections as separate score-scripts and when complete paste them together in a single file. The technique of composition used in Invocation is a little unusual in that most of the pitches played by the guitar are generated from fingering patterns. (setf E-string '(0 1 2 3 4)) (setf D-string '(0 1 2 3 4)) There is a precedent for this in the Autumn movement of Nigel Morgan’s large-scale guitar work Sense of Place. Part-1 produces a 2-part homophonic texture with a rhythm produced by LENGTH-WEIGHT and with repeated notes processed by FILTER-TIE: (setq rep-tie0 (filter-tie (list p-1&4 rw-1&4))) This function outputs lists of both pitch and length: => (gs4f3 e4e3 fs4d3 f4fs3 e4e3 f4d3 e4f3 . . .) => (1/8 1/8 -1/8 1/8 1/8 1/8 -1/8 -1/8 1/8 . . .) These lists are aligned inside the MAKE-OMN expression: (setf s14 (make-omn :pitch (1~ rep-tie0) :length (2~ rep-tie0))) In Part-2 the homophony becomes polyphony. Although the generation of pitches is again from fingering positions the rhythm of each string is unique. Also the rhythmic 'gaps' in part-1 are replaced by an open-string diad. This is where LENGTH-REST-POSITION comes into its own - indicating the positions in the list that are rest-lengths: (setq p-1xi (position-replace (length-rest-position rw-1i) 'g3 p-1i)) (setq p-4xi (position-replace (length-rest-position rw-4i) 'a2 p-4i)) Again FILTER-TIE is used, this time with considerable effect, producing suspensions as here in the higher voice: => (e g3 e4 fs4 h_e g3 e gs4 . . .) Part-3 is homophonic like Part-1 but its pitch content comes from generating fingering positions on two different strings: (setf G-string '(0 1 2 3 4)) (setf A-string '(0 1 2 3 4)) It begins exactly like Part-1 with rhythmic gaps but then is restated with the texture developed by 'filling' these rhythmic gaps with an open-string diad: (setq p-1z (position-replace (length-rest-position rw-3&5) 'e5d4 p-3&5)) => (b3c3 g3b2 e5d4 gs3cs3 g3b2 gs3a2 e5d4 . . .) (setq p-1v (position-replace (position-item 'e5d4 (1~ rep-tie01)) 'p (span r-3&5 '(f)))) => (f f p f f f p f p f f f . . .) This diad on the guitar is a chord of harmonics and is simulated by assigning a lighter dynamic to its occurrence, as the expression above demonstrates. In Lesson 24 we saw how an ending was created with :start and :end settings. Note that in Invocation, each section has its own DEF-SCORE, which are used to structure the whole piece by calling on the three score definitions within COMPILE-SCORE: (compile-score '((invocation-1 :start 1 :end 8) (invocation-2 :start 1 :end 16) (invocation-3 :start 1 :end 16) (invocation-1 :start 1 :end 8))) Score ;; Invocation ;; Part I (setf E-string '(0 1 2 3 4)) (setf D-string '(0 1 2 3 4)) (setf s-1 (rnd-sample 32 E-string :seed 437)) (setf s-4 (rnd-sample 32 D-string :seed 421)) (setf p-1 (pitch-transpose 4 (integer-to-pitch s-1))) (setf p-4 (pitch-transpose -10 (integer-to-pitch s-4))) (setf p-1&4 (pitch-mix (list p-1 p-4))) (setf r-1&4 (span p-1&4 '(e))) (setf rw-1&4 (length-weight r-1&4 :weight '(2 1) :seed 45)) (setq rep-tie0 (filter-tie (list p-1&4 rw-1&4))) (setf s14 (make-omn :pitch (1~ rep-tie0) :length (2~ rep-tie0))) (def-score invocation-1 (:key-signature 'chromatic :time-signature '(2 4) :tempo 80) (guitar :omn s14 :channel 1 :sound 'gm :program 'acoustic-guitar-nylon) ) ;; Part II (setf Ei-string '(0 1 2 3 4)) (setf Di-string '(0 1 2 3 4)) (setf s-1i (rnd-sample 64 E-string :seed 437)) (setf s-4i (rnd-sample 64 D-string :seed 421)) (setf p-1i (pitch-transpose 4 (integer-to-pitch s-1i))) (setf p-4i (pitch-transpose -10 (integer-to-pitch s-4i))) (setf r-1&4i (span p-1i '(e))) (setf rw-1i (length-weight r-1&4i :weight '(2 1) :seed 45)) (setq rw-4i (length-weight r-1&4i :weight '(3 1) :seed 451)) (setq p-1xi (position-replace (length-rest-position rw-1i) 'g3 p-1i)) (setq p-4xi (position-replace (length-rest-position rw-4i) 'a2 p-4i)) (setf rep-tie4 (filter-tie (list p-4xi r-1&4i))) (setf rep-tie1 (filter-tie (list p-1xi r-1&4i))) (setf s1c (make-omn :pitch (1~ rep-tie1) :length (2~ rep-tie1))) (setf s4c (make-omn :pitch (1~ rep-tie4) :length (2~ rep-tie4))) (def-score invocation-2 (:key-signature 'chromatic :time-signature '(2 4) :tempo 80 :layout (guitar-down8-layout 'guitar)) (guitar :omn (merge-voices s1c s4c) :channel 1 :sound 'gm :program 'acoustic-guitar-nylon) ) ;; Part III (setf G-string '(0 1 2 3 4)) (setf A-string '(0 1 2 3 4)) (setf s-3 (rnd-sample 32 G-string :seed 437)) (setf s-5 (rnd-sample 32 A-string :seed 421)) (setf p-3 (pitch-transpose -5 (integer-to-pitch s-3))) (setf p-5 (pitch-transpose -15 (integer-to-pitch s-5))) (setf p-3&5 (pitch-mix (list p-3 p-5))) (setf r-3&5 (span p-1&4 '(e))) (setf rw-3&5 (length-weight r-3&5 :weight '(2 1) :seed 45)) (setq p-1z (position-replace (length-rest-position rw-3&5) 'e5d4 p-3&5)) (setq rep-tie0 (filter-tie (list p-3&5 rw-3&5))) (setq rep-tie01 (filter-tie (list p-1z r-3&5))) (setq p-1v (position-replace (position-item 'e5d4 (1~ rep-tie01)) 'p (span r-3&5 '(f)))) (setf s35 (make-omn :pitch (1~ rep-tie0) :length (2~ rep-tie0))) (setf harm '(- - harm - - - harm - harm - - - harm - - - harm - - - - - harm)) (setf art-rest (gen-repeat 22 '-)) (setf artic (flatten (list harm art-rest))) (setf s35i (make-omn :pitch (1~ rep-tie01) :length (2~ rep-tie01) :velocity p-1v :articulation artic)) (setq s2x (assemble-seq s35 s35i)) (def-score invocation-3 (:key-signature 'chromatic :time-signature '(2 4) :tempo 80) (guitar :omn s2x :channel 1 :sound 'gm :program 'acoustic-guitar-nylon) ) ;; Assemble score (compile-score '((invocation-1 :start 1 :end 8) (invocation-2 :start 1 :end 16) (invocation-3 :start 1 :end 16) (invocation-1 :start 1 :end 8)) ) Notation Next page Lesson 28. Working with Libraries Go back to Reference page.
15. ## Lesson 26. Chords to Parts

Contents Annotation Score Notation Annotation A Piano Trio This score-script returns to Lesson 18 to create a version of the chorale, this time for piano trio. So the score opens with an opportunity to see how DEF-SOUND-SET is used to set up a violin and a cello part. This is more than setting a program change: it includes the mapping of program changes to reflect the string articulations of arco, pizz, staccato and tremolo. Most of the score-script remains the same until we get to the articulation and remix expressions: (setq art-1 '((arco arco arco arco arco+fermata) (stacc stacc stacc stacc stacc+fermata) (trem trem trem trem trem+fermata) (pizz pizz pizz pizz pizz+fermata) (arco arco arco arco arco+fermata))) Notice how the combining of arco and fermata requires a joining together as arco+fermata. (setf vn-1 (pitch-demix 1 rh-ab)) (setf vc-1 (pitch-demix 2 lh-abt)) In 'remixing' the right and left hand diads played by the piano to a single part we indicate which of the two notes in the diads should be de-mixed. The original expression is this: (setf rh-ab (pitch-mix (list (integer-to-pitch rh-a) (integer-to-pitch rh-b)))) => ((bb4eb4 bb4e4 bb4f4 gs4cs4 bb4f4 . . .) (setf vn-1 (pitch-demix 1 rh-ab)) => (bb4 bb4 bb4 gs4 bb4 gs4 bb4 b4 c5 . . .) So setting the position value to 1 separates the treble from the alto voice in the diad and outputs the treble. To get the cello part we use the same approach, but setting the position value to 2 separates the tenor from the bass voice in the diad and outputs the bass. The only remaining tasks are to MAKE-OMN for both new parts, (setf vn (make-omn :length rhy-1 :pitch vn-1 :velocity dyn-1 :articulation art-1)) (setf vc (make-omn :length rhy-1 :pitch vc-1 :velocity dyn-1 :articulation art-1)) and create a new DEF-SCORE expression for violin and cello. (violin :omn vn :channel 2 :sound 'gm-violin) (violoncello :omn vc :sound 'gm-cello :channel 3) Score ;; Sound Sets (def-sound-set GM-violin :programs (:group violin arco 40 trem 44 pizz 45)) (def-sound-set GM-cello :programs (:group violin arco 42 trem 44 pizz 45)) ;; Material (init-seed 2) (setf row-1 '(12 11 10 9 8) row-2 '(7 8 9 10 11) row-3 '(6 7 6 7 6) row-4 '(1 2 3 4 5)) (setf r-1 (rnd-pick (list row-1 row-1 row-1 row-2 row-3)) r-2 (rnd-pick (list row-2 row-3 row-3 row-4 row-4)) r-3 (rnd-pick (list row-1 row-1 row-2 row-2 row-3)) r-4 (rnd-pick (list row-2 row-3 row-4 row-4 row-4))) (setq rh-a (rnd-sample 25 r-1) rh-b (rnd-sample 25 r-2)) (setf lh-a (rnd-sample 25 r-3) lh-b (rnd-sample 25 r-4)) (setf rh-ab (pitch-mix (list (integer-to-pitch rh-a) (integer-to-pitch rh-b)))) (setf lh-ab (pitch-mix (list (integer-to-pitch lh-a) (integer-to-pitch lh-b)))) (setf lh-abt (pitch-transpose -12 lh-ab)) (setf rhy (span rh-ab '(q))) (setf rhy-1 (gen-repeat 5 (list '(q q q q q)))) (setf ferm (gen-repeat 5 (list '(- - - - fermata2)))) (setq dyn-1 '((f mp< < < ff) (mf f mp> > pp) (p< < mf mp mf) (f ff f> > mp) (mf p mp> > pp))) (setq art-1 '((arco - - - fermata) (stacc stacc stacc stacc stacc+fermata) (trem trem trem trem trem+fermata) (pizz - - - fermata) (arco - - - fermata))) (setf vn-1 (pitch-demix 1 rh-ab)) (setf vc-1 (pitch-demix 2 lh-abt)) (setf vn (make-omn :length rhy-1 :pitch vn-1 :velocity dyn-1 :articulation art-1)) (setf vc (make-omn :length rhy-1 :pitch vc-1 :velocity dyn-1 :articulation art-1)) (setf rh-1 (make-omn :length rhy-1 :pitch rh-ab :velocity dyn-1 :articulation ferm)) (setf lh-1 (make-omn :length rhy-1 :pitch lh-abt :velocity dyn-1 :articulation ferm)) (def-score lesson-26 (:key-signature 'chromatic :time-signature (get-time-signature vn) :tempo '(q 70) :layout (list (bracket-group (violin-layout 'violin) (violoncello-layout 'violoncello)) (piano-layout 'piano-rh 'piano-lh))) (violin :omn vn :channel 2 :sound 'gm-violin :pan 20) (violoncello :omn vc :channel 3 :sound 'gm-cello :pan 110) (piano-rh :omn rh-1 :channel 1 :sound 'gm :program 'acoustic-grand-piano :pan 64) (piano-lh :omn lh-1) ) ;; Setting random back to NIL (init-seed nil) Notation Next page Lesson 27. Merging Parts and Sequencing Score-Scripts Go back to Reference page.
16. ## Lesson 25. Tonality 2

Contents Annotation Score Notation Annotation Here is another view of the tonality functions in Opusmodus. This time the objective is to model a piece of jazz piano. Think Vijay Iyer! The composition starts by defining two tonalities: (create-tonality slo '(c4 cs4 fs4 g4)) (create-tonality ait '(b3 c4 cs4 f4)) slo is also PCS 4-9, or Slonimsky pattern #1. The second, ait, is the all-interval tetrachord. If you think of this as '(0 1 4 6) you can generate all intervals from different combinations of it and its inversions. (combination 2 '(0 1 4 6)) The next data list is a sequence of roots for the chords we are going to generate. This list contains the root notes of the chords to John Coltrane's Giant Steps, a song known to work well with the all-interval tetrachord. (setf path (tonality-series '(slo ait slo ait slo slo ait) :root root-list)) Using TONALITY-MAP we can order the change of tonality and include the root-list. Now we have the path we can do the mapping of chord tone to a list of integers generated by RND-NUMBER. Notice there isn’t a random seed set in this expression so don’t expect this list below to match up with the one you’ve just evaluated. => ((b4 fs4 f4 b4) (d5 gs4 d5 e4) (g4 gs3 g4 d4) (c4 c4 e4 e4) . . .) And the same with this expression we group the pitches into chords: (setf chords (chord-pitch-unique (chordize pitch-lists))) => ((b4fs4f4) (d5gs4e4) (g4gs3d4) (c4e4) . . . Now we'll put the root-note of Giant Steps alongside the chords using GEN-COMBINE and apply GEN-RETROGRADE to get that classic modern jazz 'bass chord' pattern. Notice there's lots of flattening and dividing to make sure we keep the list organisation in place. Now for the rhythm. The left hand chord rhythm is very easy, but for the 'improvised' right hand we're going to create rhythmic variables again, only this time enable their position to be randomised. (setf rh-rhy (flatten (rnd-sample 32 (apply-eval '(r1 r2 r3 r4 r5 r6 r7 r8))))) => (1/8 1/4 1/8 1/4 1/8 1/8 -1/4 1/4 -1/4 1/4 . . .) With both right hand rhythms and melody we won't set random seeds, so that every time the score-script is compiled you'll hear a different performance. To create the right hand 'improvised' melody we'll create a scale that is a composite of PCS 4-9 and the all-interval tetrachord, then in the i-pitch expression transpose it to each degree of its scale. There are two different wave expressions to try out using VECTOR-TO-PITCH and VECTOR-MAP respectively. The first wave-1 outputs a chromatic stream, the second wave-2 outputs the i-scale stream. (setf wave-2 (vector-map i-pitch gen-sine p-value 2 '(0.2 0.7)))) => (g5 gs5 g5 fs5 gs5 b5 as5 fs5 as5 gs5 f5 c6 f5 . . .) Like the rh-rhy this is in a single list, which allows for the use of the function FILTER-TIE, which adds tied notes into the improvisation. Finally, the dynamics of the right hand part take the contours of the GEN-SINE 'wave' generation. (setf i-dyn (vector-to-velocity 0.27 0.87 (gen-sine p-value 2 '(0.2 0.7)))) Try playing the piece through a few times, and experiment with changing the wave content from wave-2 to wave-1. Score (init-seed 35) (create-tonality slo '(c4 cs4 fs4 g4)) (create-tonality ait '(b3 c4 cs4 f4)) (setf root-list '(b3 d4 g3 bb3 eb4 b3 d4 g3 bb3 eb4 fs4 bb3 f4 bb3 eb4 eb4 a3 d4 g3 cs4 fs4 bb3 bb3 f4 bb3 eb4 cs4 fs4)) ;Giant Steps! (setf root-list-t (mclist (pitch-transpose -12 root-list))) (setf path (tonality-series '(slo ait slo ait slo slo ait) :root root-list :seed 31)) (setf pitch-list (integer-to-pitch (rnd-number (* (length root-list) 4) 0 12))) (setf pitch-lists (tonality-map path (gen-divide 4 pitch-list))) (setf chords (chord-pitch-unique (chordize pitch-lists))) (setf chords-i (gen-divide 2 (flatten (gen-combine root-list-t chords)))) (setf chords-r (gen-retrograde chords-i :section (gen-integer-step 0 14 '(2)))) (setf chords-ri (gen-divide 4 (flatten chords-r))) ;; Rhythm (chords & improvisation) (setf chd-rhy (gen-repeat 4 '((q q q q) (q q q q) (h h) (q q q q)))) (setf r1 '(q q) r2 '(3q = = = = =) r3 '(e = s = e) r4 '(-e = = =) r5 '(e q e) r6 '(e = q) r7 '(-q =) r8 '(q e =)) (setf rh-rhy (flatten (rnd-sample 32 (apply-eval '(r1 r2 r3 r4 r5 r6 r7 r8))))) ;; Solo melody (improvisation) (setf i-scale '(bb3 b3 c4 e4 f4 g4)) (setf i-pitch (flatten (pitch-transpose 15 (pitch-transpose (pitch-to-integer i-scale) (gen-repeat 5 (list i-scale)))))) (setf p-value (get-count rh-rhy :sum t)) (setf wave-1 (vector-to-pitch '(fs4 fs6) (gen-sine p-value 2 '(0.2 0.7)))) (setf wave-2 (vector-map i-pitch (gen-sine p-value 2 '(0.2 0.7)))) (setf i-dyn (vector-to-velocity 0.27 0.87 (gen-sine p-value 2 '(0.2 0.7)))) (setf dyn (span chd-rhy '((mf f ff mf) (mf f ff mf) (f ff) (mf f mf mp)))) (setf rh-rhy-ft (filter-tie (list wave-2 rh-rhy))) (setf ferm (append (gen-repeat 15 '((- - - -))) '((- - - fermata2)))) (setf rh-1 (make-omn :length (2~ rh-rhy-ft) :pitch (1~ rh-rhy-ft) :velocity i-dyn)) (setf lh-1 (make-omn :length chd-rhy :pitch chords-ri :velocity dyn :articulation ferm)) (def-score lesson-25 (:key-signature 'chromatic :time-signature '((1 1 1 1) 4) :tempo 100 :flexible-clef t :layout (piano-layout 'piano-rh 'piano-lh :ignore-velocity t)) (piano-rh :omn rh-1 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn (respell lh-1 :type :chord)) ) ;; Setting random back to NIL (init-seed nil) Notation Next page Lesson 26. Chords to Parts Go back to Reference page.
17. ## Lesson 24. Tonality 1

Contents Annotation Score Notation Annotation Composers are keen to do novel and interesting things with tonality, and Opusmodus has three powerful tonality functions to realise mapping to chords and scales. The Opusmodus system carries within it an extensive list of pre-defined tonalities, but in this piece we're going to create tonalities from the pitch-class-set PCS 4-9 and its complementary form: (pcs '4-9 :type :pitch) => (c4 cs4 fs4 g4) (pcs-complement 4 4 (pcs '4-9) :type :pitch) => (d4 ds4 e4 f4 gs4 a4 as4 b4) First, let's use CREATE-TONALITY to make two scales made from the intervals of PCS 4-9 and its complement. (create-tonality scale-1 '(0 1 6 7 12)) (create-tonality scale-2 '(2 3 4 5 8 9 10 11)) The aim is to map a stream of integers on to each of the tonalities (scale-1 and scale-2). Here is the integer stream: => (9 4 5 11 10 5 10 5 11 10 3 7 5 6 8 1 2 4 10 5 2 7 5 10 1) Now we can use TONALITY-MAP to map the tonality on to the stream. (setq stream-1 (tonality-map '(scale-1) (integer-to-pitch stream))) => (g4 cs4 cs4 g4 c5 g4 c4 g4 c5 c5 fs4 c5 c5 cs4 g4 cs4 fs4 c4 fs4 c5 cs4 g4 cs4 fs4 c5) Let's do the same with scale-2: (setq stream-2 (tonality-map '(scale-2 :root d4) (integer-to-pitch stream))) To get the complementary pitches we have to fix a :root d4: => (b4 eb4 e4 b4 d5 bb4 d4 b4 b4 d5 f4 d5 b4 eb4 b4 e4 gs4 d4 gs4 b4 eb4 bb4 eb4 gs4 b4) Now to structure the rhythm of the piece: (setf bar-lengths '(5 3 4 6 7 5 4 3 7 5)) (setf bar-lengths-addup (find-sum bar-lengths)) Later we'll see why we need to know just how many beats there are in the collection of bar-lengths. But for now, we use the function FIND-SUM to find out. If we SPAN stream-1 and stream-2 with rhy-a we get a list in sequence: (setf str-a (span rhy-a (list stream-1 stream-2))) => ((g4 cs4 cs4 g4 c5) (b4 eb4 e4) (g4 cs4 cs4 g4) (b4 eb4 e4 b4 d5 bb4) (g4 cs4 cs4 g4 c5 g4 c4) (b4 eb4 e4 b4 d5) (g4 cs4 cs4 g4) (b4 eb4 e4) (g4 cs4 cs4 g4 c5 g4 c4) (b4 eb4 e4 b4 d5)) Moving to Section B let's use the function HARMONIC-PATH. This is like one of those simple electronic keyboard arpeggiators (!) only written into a software function. (setq sc-1 (harmonic-path scale-1 stream-p :type 'rnd-order :octave '? :seed 121)) => (c4 g4 cs4 c4 fs4 c4 g4 cs4 c4 fs4 c4 g4 cs4 c4 fs4 c4 g4 cs4 c4 fs4 c4 g4 cs4 c4 fs4) Notice the pattern repeating in the list. This section uses the CHORD-INTERVAL-ADD function to harmonise notes in both hands, but only on selected sections: (setf p-group (chord-interval-add '(5 7) (span rhy-1 (list sc-1 sc-2)) :section '(1 3 5 7 9))) In Section C the chordal material moves to the right hand. We use the third tonality function - TONALITY-SERIES. This is a little similar to what we did in Section A, sequencing one tonality after an other, only we could use any number of tonalities 'as a series'. The source for the pitch material (to be mapped to our scale tonalities) is quite complex: (setf v-mat (gen-accumulate (rnd bar-lengths-addup :low -1.0 :high 1.0))) (setf v-ptchs (gen-divide bar-lengths (integer-to-pitch (vector-round 0 24 v-mat)))) The right hand makes chords whilst the left hand plays a stream of pitches in the bass, always corresponding with the changes in tonality at every bar. Finally, something quite unusual happens at the end. Evaluate and Play and wait for the final bars of the piece to see/hear for yourself: (compile-score '((lesson-24 :start 1 :end 41) (lesson-24 :start 40 :end 41) (lesson-24 :start 40 :end 41))) This :start and :end feature of COMPILE-SCORE lets the composer play with the ordering and sequencing of a score-script. And this is the tip of the iceberg, as we'll discover in Lesson 27! Score ;; Section A #| (pcs '4-9) => (0 1 6 7) (pcs-complement (pcs '4-9) :type :integer) => (2 3 4 5 8 9 10 11) (pcs '4-9 :type :pitch) => (c4 cs4 fs4 g4) (pcs-complement (pcs '4-9) :type :pitch) => (d4 ds4 e4 f4 gs4 a4 as4 b4) |# (create-tonality scale-1 '(0 1 6 7 12)) (create-tonality scale-2 '(2 3 4 5 8 9 10 11)) (setq stream (rnd-number 25 0 12 :seed 341)) (setq stream-p (integer-to-pitch stream)) (setq stream-1 (tonality-map '(scale-1) (integer-to-pitch stream))) (setq stream-2 (tonality-map '(scale-2 :root d4) (integer-to-pitch stream))) (setf bar-lengths '(5 3 4 6 7 5 4 3 7 5)) (setf bar-lengths-addup (find-sum bar-lengths)) (setf rhy-a (gen-repeat bar-lengths (gen-repeat (length bar-lengths) '((s))))) (setf rhy-b (mclist (get-span rhy-a))) (setf str-a (span rhy-a (list stream-1 stream-2))) (setf str-b (pitch-transpose -24 (mclist (rnd-pick str-a :seed 5676)))) (setf rh-1 (make-omn :length rhy-a :pitch str-a)) (setf lh-1 (make-omn :length rhy-b :pitch str-b)) ;; Section B (setq sc-1 (harmonic-path scale-1 stream-p :type 'rnd-order :octave '? :seed 121)) (setf sc-2 (pitch-transpose 2 (harmonic-path scale-2 stream-p :type 'desc :octave '? :seed 12))) (setf rhy-1 (gen-repeat bar-lengths (gen-repeat (length bar-lengths) '((s))))) (setq rhy-2 (mclist (get-span rhy-1))) (setf p-group (chord-interval-add '(5 7) (span rhy-1 (list sc-1 sc-2)) :section '(1 3 5 7 9))) (setf b-group (pitch-transpose -24 (mclist (rnd-pick p-group :seed 56)))) (setf rh-2 (make-omn :length rhy-1 :pitch p-group)) (setf lh-2 (make-omn :length rhy-2 :pitch b-group)) ;; Section C (setq path (tonality-series (list scale-1 scale-2) :root '(c4 d4))) (setf v-mat (gen-accumulate (rnd bar-lengths-addup :low -1.0 :high 1.0))) (setf v-ptchs (gen-divide bar-lengths (integer-to-pitch (vector-round 0 24 v-mat)))) #| Graph (list-plot v-mat :point-radius 0 :style :fill) |# (setf ptchs (filter-repeat 3 (tonality-map path v-ptchs))) (setf rh-ch (chord-pitch-unique (chordize ptchs))) (setf lh-bass (pitch-transpose -12 ptchs)) (setf rhy-3 (span lh-bass '((s)))) (setf rhy-4 (mclist (get-span rhy-3))) (setf rh-3 (make-omn :length rhy-4 :pitch rh-ch)) (setf lh-3 (make-omn :length rhy-3 :pitch lh-bass)) (setf p-rh (assemble-seq rh-1 rh-2 rh-3 rh-1)) (setf p-lh (assemble-seq lh-1 lh-2 lh-3 lh-1)) (setf timesigs (get-time-signature p-rh :group '((5) (7)))) (def-score lesson-24 (:key-signature 'chromatic :time-signature timesigs :tempo '(e 140) :flexible-clef t :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn (respell p-rh :type :chord) :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn p-lh) ) ;; Assemble score (compile-score '((lesson-24 :start 1 :end 41) (lesson-24 :start 40 :end 41) (lesson-24 :start 40 :end 41)) ) Notation Next page Lesson 25. Tonality 2 Go back to Reference page.
18. ## Lesson 23. Intervals and Rows

Contents Annotation Score Notation Annotation A 12-tone Invention This score-script takes further the techniques used for length and rhythm composition used in Lesson 22. Like many pieces in an atonal / serial idiom a rhythmic sketch is devised first. The objective is to create a 2-part invention in the spirit of J. S. Bach. Notice in this score there's a division made between rhythm and length, and pitch material. We start with rhythm: (setf r1 '(s s s s) r2 '(e e) r3 '(e s s) r4 '(s s e) r5 '(-e e e e) r6 '(-q h) . . .) Just as in Lesson 22, groups of note-lengths are brought together as rhythmic units and identified as variables. We can now assemble bars / list of these rhythms. (setf rh (apply-eval '((r1 r1 r2) (r6) (r15 r1 r8) (r9) (r10) . . . )) Of course, we could just write out each bar/list in OMN lengths: => ((s s s s s s s s e e) (-q h) (-q s s s s e e e) (e e e q) (q q q -q) (q h q) . . .)) Don't forget you can Audition these rhythms. Also, it might be a good move to check the rhythmic interplay between the hands before adding pitches. Next we create the pitch content. This is to be based yet again on the Slonimsky pattern used in almost all the stages so far. But we'll use it as a pitch-class-set. In this context it is known as the double tritone tetramirror and in Forte pitch class notation has the reference 4-9. We can use the many Opusmodus interval and pitch-class-set functions to explore its potential as material for a composition for solo piano using the techniques of 12-note atonal composition. Here are just some of the processes you might use to manipulate pitch class sets: (setf pcs-4-9-i (pcs-inversion pcs-4-9 :type :pitch)) => ((c4 b4 fs4 f4) (b4 as4 f4 e4) (as4 a4 e4 ds4) (a4 gs4 ds4 d4) . . .)) (pcs-complement 4 4 (pcs '4-9) :type :pitch) => (d4 ds4 e4 f4 gs4 a4 as4 b4) (pcs-complement 4 4 (pcs '4-9) :type :integer) => (2 3 4 5 8 9 10 11) (pcs '4-9 :type :pitch) => (c4 cs4 fs4 g4) (interval-randomize 4 (pcs '4-9)) => ((0 -1 -6 7) (0 -1 6 -7) (0 1 -6 -7) (0 -1 6 7)) (interval-randomize 4 (pcs '4-9) :rnd-order t) => ((1 6 -7 0) (-6 -1 7 0) (-6 7 0 -1) (1 0 6 -7)) (interval-scale 1.5 (pcs '4-9)) => (0 2 9 10) (row-matrix (pcs '4-9)) => ((0 1 6 7) (11 0 5 6) (6 7 0 1) (5 6 11 0)) (interval-row-matrix (pcs '4-9)) => ((0 1 6 7) (-11 0 5 6) (-6 -7 0 1) (-5 -6 -11 0)) As a result of this exploration of PCS 4-9 it was discovered that when the set was transposed there were six unique sets all having intervals that were not shared with the PCS set 4-9. This seemed a good premise from which to work. (setq row (pcs '4-9)) => (0 1 6 7) (setf transposed-rows-r (pcs-transpose (gen-integer 0 11) (gen-repeat 12 (list row)))) => ((0 1 6 7) (1 2 7 8) (2 3 8 9) (3 4 9 10) 1 2 (4 5 10 11) (5 6 11 0) 6 7 0 1) (7 8 1 2) 3 (8 9 2 3) (9 10 3 4) (10 11 4 5) (11 0 5 6)) 4 5 6 The next step was randomise this tranposed-row collection and scale it to give a wider interval range: (setf scaled-intervals-r (interval-scale 0.75 (rnd-sample (length lh) transposed-rows-r :seed 34))) (setf rhy-to-rh (span rh scaled-intervals-r)) By spanning the rhythms in the right hand the output of each list now aligns: => ((6 7 2 2 6 7 2 2 6 7) (4) (2 3 7 -8 2 3 7) (-2 -3 -7 -8) (-6 -7 -2) (-2 -3 -7) (-8 0) (-3 4) (4 5 0 1 4 5 0 1) (8 8 3 4 8 8 3 4 8 8 3) (6 7 2 2 6 7 2) (7 8 2 -3 7 8 2 -3 7 8 2 -3) (-4 -4 -8 0) (-5 -6 -1 -2 -5 -6) (-8 0 -4 -4 -8 0) (-7 -8 -2 -3 -7) (-7 -8 -2) (2 2 6 7)) => ((s s s s s s s s e e) (-q h) (-q s s s s e e e) (e e e q) (q q q -q) (q h q) (-q -q e e) (q q -q) (-e e e e e e e s s) (-e s s s s s s 5q 5q 5q 5q 5q) (6q 6q 6q 6q 6q 6q -e q.) (s s s s s s s s s s s s) (q q q q) (-q 3q 3q 3q 3q 3q 3q) (3q 3q 3q -q 3q 3q 3q) (5h 5h 5h 5h 5h -q) (-q e q e) (e e e e)) And finally, as above, the integers are changed into pitches and transposed up an octave: (setf rh-p (pitch-transpose 12 (integer-to-pitch rhy-to-rh))) But it's necessary to do a little more to these melodic patterns to make them more varied and interesting: (setf lhp-r (rnd-order (sort-desc lh-p :section '(7 9 10 11 )) :section '(3 4 8) :seed 761)) As we've been so careful to organise the bar/list structure, putting in the dynamics is very straightforward. (setf dyn-rh '((f) (mp) (mf) (f) (mf) (ff) (mp) (mf) (mp) (f) (ff) (p) (mp mf f ff) (f) (f) (mf) (mp) (p mp f fff))) Notice how the crescendo has been created in the last bar of the rh-2 part. This whole process is then repeated in the left hand but with a different random sampling of the transposed-rows and a different scaling using INTERVAL-SCALE2. Score ;; Material - rhythm (setf r1 '(s s s s) r2 '(e e) r3 '(e s s) r4 '(s s e) r5 '(-e e e e) r6 '(-q h) r7 '(5q 5q 5q 5q 5q) r8 '(e e e) r9 '(e e e q) r10 '(q q q -q) r11 '(6q 6q 6q 6q 6q 6q) r12 '(q q q q) r13 '(3q 3q 3q) r14 '(5h 5h 5h 5h 5h) r15 '(-q) r16 '(e q q e) r17 '(e q e) r18 '(q h q) r19 '(e e q q) r20 '(q q -q) r21 '(-e s s) r22 '(-e q.) r23 '(q h) r24 '(h) r25 '(q)) (setf rh (apply-eval '((r1 r1 r2) (r6) (r15 r1 r8) (r9) (r10) (r18) (r15 r15 r2) (r20) (r5 r2 r3) (r21 r1 r7) (r11 r22) (r1 r1 r1) (r12)(r15 r13 r13) (r13 r15 r13) (r14 r15) (r15 r17) (r2 r2)))) (setf lh (apply-eval '((r15 r2 r1) (r23) (r1 r1 r8) (r9) (r24 r1 r1) (r18) (r2 r25 r25) (r2 r2 r2) (r1 r1 r1 r4) (r2 r2 r2) (r25 r22) (r15 r15 r1) (r1 r1 r25 r25) (r2 r2 r2) (r16)(r16) (r15 r17) (r24)))) ;; Material - pitch ;; Right hand (setq row (pcs '4-9)) (setf transposed-rows-r (pcs-transpose (gen-integer 0 11) (gen-repeat 12 (list row)))) (setf scaled-intervals-r (interval-scale 0.75 (rnd-sample (length lh) transposed-rows-r :seed 34))) (setf rhy-to-rh (span rh scaled-intervals-r)) (setf rh-p (pitch-transpose 12 (integer-to-pitch rhy-to-rh))) (setf rhp-r (rnd-order rh-p :section '(0 2 3 6 7 11 17) :seed 76)) ;; Left hand (setf transposed-rows-l (pcs-transpose (gen-integer 0 11) (gen-repeat 12 (list row)))) (setf scaled-intervals-l (interval-scale2 '(0.5 1.0) (rnd-sample (length lh) transposed-rows-l :seed 36))) (setf rhy-to-lh (span rh scaled-intervals-l)) (setf lh-p (pitch-transpose -12 (integer-to-pitch rhy-to-lh))) (setf lhp-r (rnd-order (sort-desc lh-p :section '(7 9 10 11)) :section '(3 4 8) :seed 761)) ;; Dynamics (setf dyn-rh '((f) (mp) (mf) (f) (mf) (ff) (mp) (mf) (mp) (f) (ff) (p) (mp mf f ff) (f) (f) (mf) (p) (p mp f fff))) (setf dyn-lh '((mf) (mp f) (mf) (f) (mf f) (ff) (mf) (f) (f) (p) (f) (mp) (mp) (mf p) (f) (f) (p) (mf))) (setf rh-1 (make-omn :length rh :pitch rhp-r :velocity dyn-rh)) (setf rh-2 '((s g5 f fs5 d5 g5 fs5 g5 d5 d5 e d5 fs5) (-q h e5 mp) (-q s d5 g5 ds5 d5 e g5 e4 ds5) (e f4 f e4 a4 q as4) (q fs4 f4 as4 -) (q as4 ff h a4 q f4) (-q - e e4 mp c5) (q e5 a4 -) (-e e5 mp f5 c5 cs5 e5 f5 s c5 cs5) (-e s gs5 f gs5 ds5 e5 gs5 gs5 5q ds5 e5 gs5 gs5 ds5) (3e fs5 ff g5 d5 d5 fs5 g5 -e q. d5) (s gs5 p g5 g5 a4 a4 gs5 d5 d5 a4 gs5 g5 d5) (q gs4 mp mf e4 f c5 ff) (-q 3q g4 f fs4 b4 as4 g4 fs4) (3q e4 f c5 gs4 -q 3q gs4 e4 c5) (5h f4 e4 as4 a4 f4 -q) (-q e f4 p< q e4 < e as4 <) (e d5 < g5 < fs5 < d5 fff))) (setf lh-1 (make-omn :length lh :pitch lhp-r :velocity dyn-lh)) (setf lh-2 '((-q e ds3 f3 s c3 cs3 ds3 f3) (q fs3 mp h f) (s d3 e3 a3 c3 d3 e3 a3 d3 e e3 a3 c3) (e e2 f d3 cs2 q ds3) (h b2 s as2 f2 mf b2 as2 f2 b2 as2 f2) (q gs2 ff h f2 q a2) (e g2 f2 q g2 f2) (e g3 f gs2 g3 gs2 g3 gs2) (s e3 f e3 ds3 e3 g3 ds3 g3 e3 tie e e3 s ds3 e3 g3 ds3 e g3) (e f3 p f3 tie f3 ds3 tie q ds3) (q gs3 f -e q. fs3) (-q - s fs3 mp fs3 fs3 fs3 tie) (s fs3 mp c3 e3 fs2 fs3 c3 e3 fs2 q fs3 c3) (e as2 gs2 p ds2 mf c3 p as2 mf gs2 p) (e b2 f q as2 f2 e ds2) (e a2 f q g2 c3 e b2) (-q e fs2 p q c3 e gs2) (h c3))) (setf timesigs (get-time-signature rh-2 :group '((2 2 3)))) (def-score lesson-23 (:key-signature 'chromatic :time-signature timesigs :tempo '(q 85) :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-2 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn lh-2) ) Notation Next page Lesson 24. Tonality 1 Go back to Reference page.
19. ## Lesson 22. Lengths and Rhythms

Contents Annotation Section A Section B Score Notation Annotation Unlike most of the other Stages this piece begins with rhythm. This is very much a 20th century approach to composition often employed by Stravinsky and Messiaen. But this piece takes something of the rhythmic (and later the melodic) character of Bartok. It begins with a collection of variables of rhythms occupying a quarter or dotted quarter beat. Section A If we describe the rhythms as individual variables we can build lists with them and evaluate them with APPLY-EVAL. We’ll let the function RND-SAMPLE help us improvise a ten-beat phrase of these rhythms for the right hand until a suitable collection appears. Then, using the output of rhy-1 as a guide, the composer writes a left hand rhythmic part as a complement to the right hand part. This is done with the QL function, a kind of musical shorthand for writing note lengths. Using QL, (4 s) is the same as writing (s s s s). Now we can add pitches. To achieve the Bartokesque pitch series the GEN-SINE function creates a wave-form that outputs chromatic pitches between e4 and b4. (gen-sine (get-count rhy-1 :sum t) 2 '(0.2 0.7)) The important part of this expression is: (get-count rhy-1 :sum t) The function GET-COUNT is a more advanced version of the LISP primitive LENGTH. It counts the note-lengths in the lists of rhy-1: => ((e e e) (s s e) (e s s) . . .)) (3 3 3 . . .) . . and then sums them together. We now know exactly how many pitches GEN-SINUS must generate. By doing things this way we could change the rhythmic sequence and not have to worry about counting! At this point we just have a long list of pitches. By spanning the variable rhy-1 to wave the lists become organised. => ((gs4 a4 gs4) (b4 a4 b4) (gs4 gs4 g4) . . .)) Notice that the pitch for the left hand is simply '(b2 e2) and it's written into the MAKE-OMN expression. So it loops . . . Section B In Section B the roles are reversed. The piano right hand has two chords that loop and the left hand has a wave-generated melody. This time the rhythms described as variables with a quarter or dotted quarter beat are more complex. They include tuplets, rest-lengths and a tied note. '(5q = = = =) The = above means repeat the note length, while in the list: '(-s s_3q 3q 3q) -s means a rest-length for a 1/16 s_3q means a 1/16 is tied to a triplet 1/8 Finally, notice in Section B how we've created two expressions together and inverted the wave-form: (setf wave-i (vector-to-pitch '(fs2 fs3) (gen-sine (get-count rhy-2 :sum t) 2 '(0.2 0.7)))) (setf wave-l (span rhy-2 (pitch-invert wave-i))) Score ;; Section A (setf rhy-1 '((e = =) (s = e) (e s =) (s e s) (e =) (s e s) (e s =) (s = e) (e s =) (e = =))) (setf rhy-a (ql '((1 q.) (2 e) (2 e) (2 e) (4 s) (1 q) (1 q) (1 q) (2 e) (2 e 2 s)))) (setf wave (vector-to-pitch '(e4 b4) (gen-sine (get-count rhy-1 :sum t) 2 '(0.2 0.7)))) (setf wave-r (span rhy-1 wave)) (setf rh-1 (make-omn :pitch wave-r :length rhy-1 :velocity '(f))) (setf lh-1 (make-omn :pitch '(b2 e2) :length rhy-a :velocity '(p))) ;; Section B (setf rhy-2 '((-s = = = = =) (5q = = = =) (-s = = = = =) (-s s_3q 3q =) (-s = = = = =) (3h 3q) (-s s_3q 3q =) (-3q = =) (3h 3q) (-s = = = = =))) (setf rhy-b (ql '((3 e) (1 q) (2 e 2 s) (1 q 1 e) (3 e) (2 e) (1 e 1 q) (1 q) (1 q) (1 q 1 e)))) (setf wave-i (vector-to-pitch '(fs2 fs3) (gen-sine (get-count rhy-2 :sum t) 2 '(0.2 0.7)))) (setf wave-l (span rhy-2 (pitch-invert wave-i))) (setf rh-2 (make-omn :pitch '(cs4fs4 e4b4) :length rhy-b :velocity '(p))) (setf lh-2 (make-omn :pitch wave-l :length rhy-2 :velocity '(ff))) (setf p-rh (assemble-seq rh-1 rh-2 rh-1)) (setq p-lh (assemble-seq lh-1 lh-2 lh-1)) (setf timesigs (get-time-signature p-rh)) (def-score lesson-22 (:key-signature 'chromatic :time-signature timesigs :tempo 60 :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn p-rh :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn p-lh) ) Notation Next page Lesson 23. Intervals and Rows Go back to Reference page.
20. ## Lesson 21. Mapping, Substituting and Interleaving

Contents Annotation Section A Section B Score Notation Annotation The score-script of this piece begins with a function. It does the same thing as GEN-CHORD, but it is very simplified and at this stage a little easier to explain and use. It's also an example of how a composer with a little knowledge of LISP can write his/her own functions. This function only uses LISP primitives, that is words that are available to everyone using Opusmodus. Section A The objective with Lesson 21 is to compose a piece using chords derived from pitches. To see how this is done let's take apart the expression called chord-sequence: (setf chord-seqeunce (sort-asc ;3 (gen-bundle (rnd-sum 10 '(2 3) :seed 22 ) ;2 (rnd-order (flatten p-transp) ;1 :seed 56)))) Here's the output of the line marked ;1 => (g4 cs5 gs4 cs5 d5 fs5 cs4 g4 gs4 cs4 c5 c6 c5 c4 fs4 d4 g5 fs4 cs5 g4 cs5 g5 g4 fs5 c5) We've randomised the order of p-tranpose. Now evaluate the lines marked ;2 and ;1: (gen-bundle (rnd-sum 10 '(2 3) :seed 22) (rnd-order (flatten p-transp) :seed 56)) => (g4cs5gs4 cs5d5fs5 cs4g4 gs4cs4 c5c6c5 c4fs4d4 g5fs4 cs5g4 cs5g5g4 fs5c5)) Now we can see what GEN-BUNDLE does. It creates chords of 2 or 3 pitches: (sort-asc (gen-bundle (rnd-sum 10 '(2 3) :seed 22) (rnd-order (flatten p-transp) :seed 56))) Finally, adding SORT-ASC makes a rising progression for this chord-sequence. To help the next step the output has been placed on the score-script itself and numbered one to ten: (setf chd-order '(7 8 4 10 4 3 9 3 6 2 6 2 7 8 10 4)) (setf chd-play (substitute-map chord-seqeunce (gen-integer 1 12) chd-order)) The function SUBSTITUTE-MAP enables the composer to write a progression of chords with chd-order and then substitute that list for chord-sequence: => (g4cs5g5 c5c5c6 fs4g5 cs5d5fs5 fs4g5 cs4gs4 . . .) Once the new progression is in place the rest of the composition of Section A follows the usual pattern except for the next expression chd-lengths. We saw in Lesson 20 the value of the LISP primitive LENGTH. With GET-COUNT we can see how many chords tones we have in each chord because we want the left hand of the piano to play melodically: (pitch-melodize (mclist chd-play)) => ((g4 cs5 g5) (c5 c5 c6) (fs4 g5) (cs5 d5 fs5) . . .)) So we map with GET-COUNT to find out the length of each list. (setf chd-lengths (get-count (pitch-melodize (mclist chd-play)))) => (3 3 2 3 2 2 2 2 2 2 2 2 3 3 3 2) And with this string of numbers we can make the bass-play variable and get the list/bar length to create the correct metre grouping. Section B This section uses the INTERLEAVE-MAP function to move the melody and chords between both hands. For an easy example of how it works look up INTERLEAVE-MAP in the documents. (setf i-1 '(1 2 1 2) i-2 '(2 1) p-1 '(c4 cs4 fs4 g4 c5) p-2 '(c5 b4 fs4 f4 c4) ) (interleave-map (list i-1 i-2) (list p-1 p-2)) => (c4 c5 b4 cs4 fs4 fs4 g4 f4 c4 c5) ;(c4 cs4 fs4 g4 c5) ;( c5 b4 fs4 f4 c4 ) Now here’s INTERLEAVE-MAP being used in Section B: (setf i-map (interleave-map (list i-1 i-2) (list (span rhy chd-play) (pitch-transpose 12 bass-play))))) Now to use AMBITUS in the interleaved part for the right hand. This moves the melodic pitches of bass-play up into the treble clef: (setf i-rh (ambitus '(g4 c6) i-map)) => ((g3 cs3 g3) (g3cs3g3 c4c4c4 fs3g3) (cs3d3fs3 fs3g3 cs3gs3) (c3 c3 c3) . . .)) When we come to do the same for the left hand we’ll put AMBITUS together with INTERLEAVE-MAP. (setf j-map (interleave-map (list i-1 i-2) (list bass-play (span rhy chd-play)))) In the expressions for dynamics see how the final dynamic in the list is replaced using POSITION-REPLACE by a triple forte! Remember when counting sections 0 is the starting point. Hence this expression: (position-replace (- (length chd-order) 1) '((fff)) . . .) (- (length chd-order) 1) => 15 Score ;; Function (defun gen-bundle (n-bundle pitch-list) (mapcar (function (lambda (x) (compress x))) (gen-divide n-bundle pitch-list))) ;; Section A (setf pitches '(c4 cs4 fs4 g4 c5)) (setf p-transp (pitch-transpose (pitch-to-integer pitches) (gen-repeat 5 (list pitches)))) (setf chord-sequence (respell (sort-asc (gen-bundle (rnd-sum 10 '(2 3) :seed 22) (rnd-order (flatten p-transp) :seed 561))))) ;(c4d4fs4 cs4g4 cs4gs4 fs4g5 g4ab4cs5 ; 1 2 3 4 5 ; g4cs5 g4cs5g5 c5c5c6 c5fs5 cs5d5fs5) ; 6 7 8 9 10 (setf chd-order '(7 8 4 10 4 3 9 3 6 2 6 2 7 8 10 4)) (setf chd-play (substitute-map chord-sequence (gen-integer 1 10) chd-order)) (setf chd-lengths (get-count (pitch-melodize (mclist chd-play)))) (setf bass-play (ambitus '(c2 g3) (gen-divide chd-lengths (pitch-transpose -12 (pitch-melodize chd-play))))) (setf rhy (span bass-play '(e))) (setf rhy-c (get-span rhy)) (setq rh-1 (make-omn :length rhy-c :pitch (span rhy chd-play) :velocity '(mp))) (setq lh-1 (make-omn :length (length-weight rhy :weight '(4 1) :seed 231) :pitch bass-play :velocity '(f))) ;; Section B (setf i-1 '(1 2 1 2)) (setf i-2 '(2 1)) (setf i-map (interleave-map (list i-1 i-2) (list (span rhy chd-play) (pitch-transpose 12 bass-play)))) (setf i-rh (ambitus '(g4 c6) i-map)) (setf j-map (interleave-map (list i-1 i-2) (list bass-play (span rhy chd-play)))) (setf i-lh (ambitus '(g2 c4) j-map)) (setf i-dyn-k (span rhy (interleave-map (list i-1 i-2) (list (span bass-play '(ff)) (span rhy '(p)))))) (setf i-dyn-l (position-replace (- (length chd-order) 1) '((fff)) i-dyn-k :type 'list)) (setq rh-2 (make-omn :length (length-weight rhy :weight '(4 1) :seed 231) :pitch i-rh :velocity i-dyn-l)) (setq lh-2 (make-omn :length rhy :pitch i-lh :velocity i-dyn-l)) (setq rh-AB (chord-pitch-unique (assemble-seq rh-1 rh-2))) (setq lh-AB (chord-pitch-unique (assemble-seq lh-1 lh-2))) (setf timesigs (get-time-signature lh-AB)) (def-score lesson-21 (:key-signature 'chromatic :time-signature timesigs :tempo 80 :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-AB :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn lh-AB) ) Notation Next page Lesson 22. Lengths and Rhythms Go back to Reference page.

22. ## Lesson 19. Randomization and Variation

Contents Annotation Score Notation Annotation The piece begins with an evolving sequence of rhythmic patterns in each hand. It uses the function COMBINATION2, which here lists all the possible combinations of a 1 and 0 (the binary pair) spread over a list of five ‘bits’: => ((0 0 0 0 0) (1 0 0 0 0) (0 1 0 0 0) (1 1 0 0 0) (0 0 1 0 0) . . .)) With the function RND-ORDER the variable series can be re-ordered: (rnd-order series :seed 312 :list t)) => ((1 0 0 0 0) (0 0 0 1 0) (0 0 0 0 1) (0 0 1 0 1) (0 1 1 1 1) . . .)) These binary lists now provide the rhythmic template for right and left hands. With the BINARY-MAP function the rhythmic value (e), or (1/8) notes, can be mapped onto both binary templates creating patterns of note lengths and rests. Next the collection of pitches is processed and extended by PITCH-EXPANSION-SERIES to make variations. This function uses a list of interval values to make changes to each five-pitch list: (setf p-rows (pitch-expansion-series (length series) '(1 -1 2 -2 3 4 5) '(2 1) pitches)) This is quite a complex function that has at its heart randomisation. This is how it works in a simplified example from the OM Documentation. As you can see, the function runs four times, selecting 2 to 3 items to transpose according to a given series of intervals: (pitch-expansion-series 4 '(1 -1 2 2) '(2 3) '(c4 g4 g4 db5 ab5)) => (c4 g4 g4 db5 ab5) (d4 g4 = eb5 ab5) ; step original 2 0 0 2 0 ; count 2 (db4 g4 a4 eb5 ab5) (db4 a4 b4 eb5 bb5)) ; step -1 0 2 0 0 0 2 2 0 2 ; count 2 3 But we need to know how many lists of pitches to expand to, to work out the first parameter slot in the function. In the midst of the expression you'll find: (length series) => 32 This is another good example of using the LISP primitive LENGTH to find out the length of a list. By using this we actually don't have to know the length of series and can make a global change (perhaps to the list length) if necessary. The function PITCH-EXPANSION-SERIES is the first of several functions that contain a string of parameter slots and keywords. They seem at first a little forbidding, but you'll soon learn how they work by looking at the document entry for the function. (setf p-rows-t (sort-asc (pitch-transpose -12 p-rows))) In the material for the left hand we're using the same expanded pitch list but it's been reorganised by SORT-ASC (a function that sorts each list in ascending order). It is also mapped to a different binary rhythm. => ((c4 cs4 fs4 g4 c5) (c4 cs4 fs4 c5 =) (as3 cs4 fs4 c5 b4) . . .)) Finally, notice how GEN-LOOP is used to generate a dynamic structure for each of the lists, and again that LENGTH function is used to count the length of series. Score (setf series (combination2 5 '(1 0))) (setf reordered-series (rnd-order series :seed 312 :list t)) (setf rhythm (binary-map reordered-series '(e))) (setf rhy-b (binary-map series '(e))) (setf pitches '(c4 cs4 fs4 g4 c5)) (setf p-rows (pitch-expansion-series (length series) '(1 -1 2 -2 3 4 5) '(2 1) pitches)) (setf p-rows-t (sort-asc (pitch-transpose -12 p-rows))) (setf dyn-1 (gen-eval (length series) '(rnd-pick (mclist '(p mp mf f ff))) :seed 23)) (setq rh-1 (make-omn :length rhythm :pitch p-rows :velocity dyn-1)) (setq lh-1 (make-omn :length rhy-b :pitch p-rows-t :velocity dyn-1)) (def-score lesson-19 (:key-signature 'chromatic :time-signature '((5) 8) :tempo '(q 140) :flexible-clef t :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-1 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn lh-1) ) Notation Next page Lesson 20. Skipping, Swallowing and Pausing Go back to Reference page.
23. ## Lesson 18. A Chorale with Integers

Contents Annotation Score Notation Annotation The aim of this piece is to make a chorale in 4 voices using integers as the building block for pitch and structure. The opening expressions use two random functions: RND-PICK and RND-SAMPLE. It would be usual to apply the keyword :seed for each occurrence of the random function, but here, at the very opening of the score-script we'll apply a global seed instead: (init-seed 32) This covers all the possible seed settings throughout the piece. Try changing this global seed and listen / see the difference in the chord voicings. (setf row-1 '(12 11 10 9 8) row-2 '(7 8 9 10 11) row-3 '(6 7 6 7 6) row-4 '(1 2 3 4 5)) This is the first occasion a short-cut to naming variables has been used. The row material is a matrix of integer-derived pitches based on the first 5 patterns from Slonimsky's Thesaurus. The pitch material used so far in the Stages has been just the first pattern in this set. The INTEGER-TO-PITCH conversion takes place here inside the PITCH-MIX expression. (setf rh-ab (pitch-mix (list (integer-to-pitch rh-a) (integer-to-pitch rh-b)))) Evaluate this expression in sections to see the structure necessary to mix two lists of pitches into diads. (integer-to-pitch rh-b) (list (integer-to-pitch rh-a) (integer-to-pitch rh-b)) (pitch-mix (list (integer-to-pitch rh-a) (integer-to-pitch rh-b))) Remember you can evaluate an expression from inside these guidance notes! A feature of most chorales is the fermata at the end of each phrase: (setf ferm (gen-repeat 5 (list '(- - - - fermata2)))) Think of the fermata as part of the articulation. So it has to be placed in the MAKE-OMN parameter list like this: (setf rh-1 (make-omn :length rhy-1 :pitch rh-ab :velocity dyn-1 :articulation ferm)) Here's the resulting first bar of 5/4 in OMN: => ((q b4a4 f bb4a4 mp b4g4 mf b4a4 f bb4gs4 ff fermata2) (q bb4gs4 mf bb4b4 f gs4 mp bb4a4 p gs4g4 pp fermata2) (q bb4g4 p b4a4 mp c5a4 mf gs4b4 mp gs4a4 mf fermata2) (q a4gs4 f a4g4 ff bb4g4 f c5gs4 mf gs4b4 mp fermata2) (q gs4b4 mf bb4b4 p c5gs4 mp bb4g4 p gs4 pp fermata2)) Score (init-seed 2) ;; Change the random seed value to create ;; different 'chorale' voicings (setf row-1 '(12 11 10 9 8) row-2 '(7 8 9 10 11) row-3 '(6 7 6 7 6) row-4 '(1 2 3 4 5)) (setf r-1 (rnd-pick (list row-1 row-1 row-1 row-2 row-3)) r-2 (rnd-pick (list row-2 row-3 row-3 row-4 row-4)) r-3 (rnd-pick (list row-1 row-1 row-2 row-2 row-3)) r-4 (rnd-pick (list row-2 row-3 row-4 row-4 row-4))) (setq rh-a (rnd-sample 25 r-1) rh-b (rnd-sample 25 r-2)) (setf lh-a (rnd-sample 25 r-3) lh-b (rnd-sample 25 r-4)) (setf rh-ab (pitch-mix (list (integer-to-pitch rh-a) (integer-to-pitch rh-b)))) (setf lh-ab (pitch-mix (list (integer-to-pitch lh-a) (integer-to-pitch lh-b)))) (setf lh-abt (pitch-transpose -12 lh-ab)) (setf rhy-1 (gen-repeat 5 (list '(q q q q q)))) (setf ferm (gen-repeat 5 (list '(- - - - fermata2)))) (setq dyn-1 '((f mp mf f ff) (mf f mp p pp) (p mp mf mp mf) (f ff f mf mp) (mf p mp p pp))) (setf rh-1 (make-omn :length rhy-1 :pitch rh-ab :velocity dyn-1 :articulation ferm)) (setf lh-1 (make-omn :length rhy-1 :pitch lh-abt :velocity dyn-1 :articulation ferm)) (setf timesigs (get-time-signature rh-1)) (def-score lesson-18 (:key-signature 'chromatic :time-signature timesigs :tempo '(q 70) :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-1 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn lh-1) ) ;; Setting random back to NIL (init-seed nil) Notation Next page Lesson 19. Randomization and Variation Go back to Reference page.
24. ## Lesson 17. Working with Integers

Contents Annotation Score Notation Annotation As a starting point integers rather than pitches can be used to make new pieces. With Opusmodus Audition you can actually listen to a string of integers. Highlight the first expression in the score and press ⌘4 to audition. Using RND-SAMPLE to generate extra integers is like improvising with a set of notes on an instrument, only you can save the improvisation by setting the :seed. The function RND-SUM is a valuable way of creating lists of different lengths, and thus bars of different length. We're keeping the metre base in 1/8th so here the function is creating bars of 3, 4, 5 and 7/8. After some experimentation a grouping was found that favoured the 7/8 bar, so this became a structural feature of the piece. (setf div (rnd-sum 50 '(3 4 5 7) :seed 451)) => (7 7 4 7 7 5 3 7 3) We can now use GEN-DIVIDE to divide the improvisation i-compass up into a sequence of lists organised as above 5/8 3/8 2/4 . . . and so on: => ((0 7 7 12 6 12 1) (0 1 12 7 6 1 1) (7 1 12 1) (6 12 7 12 6 6 12) (12 7 0 0 1 6 1) (12 1 12 7 0) (7 12 12) (0 7 0 7 7 1 1) (1 0 12)) AMBITUS was featured in Lesson 16 and is used here as a way of modifying the range of i-compass to create another part. Likewise AMBITUS-INVERT does the same thing. By this point there's plenty of material available to start assembling a piece. But once we move into chordal textures on a single part integers can't be used. Notice the use of PITCH-MIX to create chordal material in one hand. See how GEN-PAUSE structures the 'play' of right and left hand parts? The next key function is ASSEMBLE-MAP. This is worth spending serious time understanding, particularly when writing for piano. (setf m-pitch (assemble-map '(0 1 1 0 0 1 0 1 1) (gen-integer 0 8) (list ce-pitch c-pitch))) Of the two variables ce-pitch and c-pitch one has a chordal texture created with PITCH-MIX and the other is melodic. ASSEMBLE-MAP let's us create a third variable that replaces some of the melody material with chordal material. This is all done by using a binary template and a list of sections from 0 to 8: '(0 1 1 0 0 1 0 1 1) (0 1 2 3 4 5 6 7 8) ;(gen-integer 0 8) Notice that the dynamics and articulation use ASSEMBLE-MAP to coincide these parameters. Finally, the MAKE-OMN section allows the materials to be collated: (setf lh-1 (make-omn :length rhy-1 :pitch i-pitch :velocity dyn-1 :swallow t)) => ((-h..) (-h..) (e f2 pp b2 c2 b2) (-h..) (-h..) (e c2 pp b2 c2 f2 c3) (e f2 f c2 c2) (-h..) (e b2 pp c3 c2)) The swallow option is a brilliant way to line up all the parameters and avoid 'skipping' lists that contain rest-lengths as the one above does. Here's the dynamics variable dyn-1: => ((f) (pp) (pp) (f) (f) (pp) (f) (pp) (pp)) Now check this against the OMN list. Finally, see how the GET-TIME-SIGNATURE deals with grouping for 5/8 and 7/8 bars like this: (setf timesigs (get-time-signature AB-rh :group '((5) (2 3 2)))) => (((2 3 2) 8 2) (2 4 1) ((2 3 2) 8 2) ((5) 8 1) (3 8 1) ((2 3 2) 8 1) (3 8 1) ((2 3 2) 8 2) (2 4 1) ((2 3 2) 8 2) ((5) 8 1) (3 8 1) ((2 3 2) 8 1) (3 8 1)) Score (setf integers '(0 1 6 7 12)) (setf i-compass (rnd-sample 50 integers :seed 4)) (setf div (rnd-sum 50 '(3 4 5 7) :seed 451)) (setf 7-dl (position-item 7 div)) (setf a-dl '(0 3 4 6)) (setf d-compass (gen-divide div i-compass)) (setf c-extend (gen-divide div (ambitus-integer '(-6 0) i-compass))) (setf c-invert (gen-divide div (integer-invert i-compass))) (setf rhythm (span d-compass '(e))) (setf rhy-1 (gen-pause rhythm :section 7-dl)) (setf rhy-2 (gen-pause rhythm :section a-dl)) (setf c-pitch (integer-to-pitch d-compass)) (setf e-pitch (integer-to-pitch c-extend)) (setf i-pitch (pitch-transpose -12 (integer-to-pitch c-invert))) (setf ce-pitch (gen-divide div (pitch-mix (list (flatten c-pitch) (flatten e-pitch))))) (setf m-pitch (assemble-map '(0 1 1 0 0 1 0 1 1) (gen-integer 0 8) (list ce-pitch c-pitch))) (setf mi-pitch (assemble-map (binary-invert '(0 1 1 0 0 1 0 1 1)) (gen-integer 0 8) (list ce-pitch c-pitch))) (setf dyn-lis (list (gen-repeat 9 '((f))) (gen-repeat 9 '((pp))))) (setf dyn-1 (assemble-map '(0 1 1 0 0 1 0 1 1) (gen-integer 0 8) dyn-lis)) (setf dyn-2 (assemble-map (binary-invert '(0 1 1 0 0 1 0 1 1)) (gen-integer 0 8) dyn-lis)) (setf artic-lis (list (gen-repeat 9 '((stacc))) (gen-repeat 9 '((-))))) (setf artic-1 (assemble-map (binary-invert '(0 1 1 0 0 1 0 1 1)) (gen-integer 0 8) artic-lis)) (setf artic-2 (assemble-map '(0 1 1 0 0 1 0 1 1) (gen-integer 0 8) artic-lis)) (setf rh-1 (make-omn :length rhythm :pitch mi-pitch :velocity dyn-1 :articulation artic-1 :swallow t)) (setf lh-1 (make-omn :length rhy-1 :pitch i-pitch :velocity dyn-1 :swallow t)) (setf rh-2 (make-omn :length rhythm :pitch m-pitch :velocity dyn-2 :articulation artic-2 :swallow t)) (setf lh-2 (make-omn :length rhy-2 :pitch i-pitch :velocity dyn-2 :swallow t)) (setq AB-rh (assemble-seq rh-1 rh-2)) (setq AB-lh (assemble-seq lh-1 lh-2)) (setf timesigs (get-time-signature AB-rh :group '((5) (2 3 2)))) (def-score lesson-17 (:key-signature 'chromatic :time-signature timesigs :tempo '(q 110) :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn AB-rh :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn AB-lh) ) Notation Next page Lesson 18. A Chorale with Integers Go back to Reference page.
25. ## Lesson 16. Ambitus

Contents Annotation Score Notation Annotation In an earlier piece we transposed the pitch row sequentially by its own intervals. Now we're doing the same but making a retrograde structure. To do this we have to use the keyword :flatten. Look at the difference without :flatten: (gen-retrograde p-transp) => ((c5 g4 fs4 cs4 c4) (cs5 gs4 g4 d4 cs4) (fs5 cs5 c5 g4 fs4) (g5 d5 cs5 gs4 g4) (c6 g5 fs5 cs5 c5)) . . . and with :flatten (setf r-transp (gen-retrograde p-transp :flatten t)) => ((c6 g5 fs5 cs5 c5) (g5 d5 cs5 gs4 g4) (fs5 cs5 c5 g4 fs4) (cs5 gs4 g4 d4 cs4) (c5 g4 fs4 cs4 c4)) Without :flatten, the contents of each sub-list are retrograded, but the sub-lists themselves maintain their original position. With :flatten set to t (true), the positions of all sublists have also been reversed. Now we'll use two different forms of the AMBITUS function. The Latin word ambitus means range. We're going to scale down the range of the p-transp lists to a lower octave. Look carefully at the difference in output with and without the keyword :flat-invert set: => ((c3 cs3 fs3 g3 c4) (cs3 d3 g3 gs3 ds3) . . .)) => ((c3 cs2 fs2 g2 c3) (cs2 d2 g2 gs2 cs2) . . .)) Next follows a striking interlude in 1/16ths made from the AMBITUS-SERIES function. Each of the 5/16 bars has a different range assigned to it. Notice how the note-lengths and dynamics are handled. Also, see how the interlude is assigned to the right hand (although in practise a pianist would use left and right). The left hand part needs to be paused. This is how it's done using the function GEN-PAUSE: (setf p-lh2 (gen-pause p-rh2 :section '(0 1 2 3 4))) What GEN-PAUSE does in this instance is to replace each of the five sub-lists (numbered 0 to 4) in p-rh2 with (nil). The dynamics are organised to create crescendos and diminuendos over 5 bar phrases. By using the function MCLIST we only need to write a flat list of dynamics, which will be bundled into lists associated with the five bars in each section: (setf dynamics (mclist '(p mp mf f ff))) => ((p) (mp) (mf) (f) (ff)) Score (setf pitches '(c4 cs4 fs4 g4 c5)) (setf p-transp (pitch-transpose (pitch-to-integer pitches) (gen-repeat 5 (list pitches)))) (setf r-transp (gen-retrograde p-transp :flatten t)) (setf c-ambitus (ambitus '(c2 c3) p-transp)) (setf p-ambitus (ambitus '(c2 c3) p-transp :type :flat-invert)) (setf s-ambitus (ambitus '((c2 c3) (b2 f3) (g3 cs4) (fs4 g5) (c4 c5)) p-transp)) (setf lengths (span p-transp '(1/8))) (setf interlude (span s-ambitus '(1/16))) (setf dynamics (mclist '(p mp mf f ff))) (setq r-dynamics (mclist '(ff f mf mp p))) (setf p-rh1 (make-omn :length lengths :pitch p-transp :velocity dynamics)) (setf p-lh1 (make-omn :length lengths :pitch c-ambitus :velocity dynamics)) (setf p-rh2 (make-omn :length interlude :pitch s-ambitus :velocity r-dynamics)) (setf p-lh2 (gen-pause p-rh2 :section '(0 1 2 3 4))) (setf p-rh3 (make-omn :length lengths :pitch r-transp :velocity dynamics)) (setf p-lh3 (make-omn :length lengths :pitch p-ambitus :velocity dynamics)) (setf rh-1 (assemble-seq p-rh1 p-rh2 p-rh3)) (setf lh-1 (assemble-seq p-lh1 p-lh2 p-lh3)) (setf timesigs (get-time-signature rh-1 :group '((5)))) (def-score lesson-16 (:key-signature 'chromatic :time-signature timesigs :flexible-clef t :tempo 80 :layout (piano-layout 'piano-rh 'piano-lh)) (piano-rh :omn rh-1 :channel 1 :sound 'gm :program 'acoustic-grand-piano) (piano-lh :omn lh-1) ) Notation Next page Lesson 17. Working with Integers Go back to Reference page.
×