From d599bfbe4e3632bbe15ba6dcc20a9398178be361 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Fri, 10 Nov 2006 08:07:56 +0000 Subject: [PATCH] Added MMA --- Tools/mmaWrapper | 4 + mma/MMA/__init__.py | 0 mma/MMA/alloc.py | 103 + mma/MMA/auto.py | 255 ++ mma/MMA/chords.py | 502 +++ mma/MMA/chordtable.py | 321 ++ mma/MMA/common.py | 173 ++ mma/MMA/docs.py | 219 ++ mma/MMA/file.py | 312 ++ mma/MMA/gbl.py | 169 ++ mma/MMA/harmony.py | 138 + mma/MMA/lyric.py | 350 +++ mma/MMA/macro.py | 674 +++++ mma/MMA/main.py | 332 ++ mma/MMA/mdefine.py | 88 + mma/MMA/midi.py | 562 ++++ mma/MMA/midiC.py | 224 ++ mma/MMA/midiIn.py | 519 ++++ mma/MMA/midiM.py | 57 + mma/MMA/notelen.py | 130 + mma/MMA/options.py | 225 ++ mma/MMA/parse.py | 2360 +++++++++++++++ mma/MMA/pat.py | 2114 +++++++++++++ mma/MMA/patArpeggio.py | 161 + mma/MMA/patBass.py | 134 + mma/MMA/patChord.py | 268 ++ mma/MMA/patDrum.py | 103 + mma/MMA/patScale.py | 215 ++ mma/MMA/patSolo.py | 621 ++++ mma/MMA/patWalk.py | 164 + mma/MMA/translate.py | 253 ++ mma/MMA/volume.py | 206 ++ mma/cp-install | 115 + mma/docs/html/README | 11 + mma/docs/html/lib/index.html | 156 + mma/docs/html/lib/kara/K50s_rock.html | 314 ++ mma/docs/html/lib/kara/Kfunk1.html | 207 ++ mma/docs/html/lib/kara/twi.html | 181 ++ mma/docs/html/lib/stdlib/50srock.html | 136 + mma/docs/html/lib/stdlib/60srock.html | 107 + mma/docs/html/lib/stdlib/8beat.html | 113 + mma/docs/html/lib/stdlib/ballad.html | 214 ++ mma/docs/html/lib/stdlib/basicrock.html | 114 + mma/docs/html/lib/stdlib/beguine.html | 175 ++ mma/docs/html/lib/stdlib/bigband.html | 295 ++ mma/docs/html/lib/stdlib/bluegrass.html | 128 + mma/docs/html/lib/stdlib/blues.html | 165 + mma/docs/html/lib/stdlib/boggiewoggie.html | 84 + mma/docs/html/lib/stdlib/bolero.html | 258 ++ mma/docs/html/lib/stdlib/bossanova.html | 232 ++ mma/docs/html/lib/stdlib/broadway.html | 139 + mma/docs/html/lib/stdlib/calypso.html | 101 + mma/docs/html/lib/stdlib/chacha.html | 157 + mma/docs/html/lib/stdlib/countryblues.html | 269 ++ mma/docs/html/lib/stdlib/countryswing.html | 158 + mma/docs/html/lib/stdlib/countrywaltz.html | 257 ++ mma/docs/html/lib/stdlib/desert.html | 86 + mma/docs/html/lib/stdlib/dixie.html | 130 + mma/docs/html/lib/stdlib/dixiemarch.html | 121 + mma/docs/html/lib/stdlib/easyswing.html | 427 +++ mma/docs/html/lib/stdlib/fastblues.html | 160 + mma/docs/html/lib/stdlib/folk.html | 91 + mma/docs/html/lib/stdlib/foxtrot.html | 227 ++ mma/docs/html/lib/stdlib/frenchwaltz.html | 119 + mma/docs/html/lib/stdlib/guitarballad.html | 127 + mma/docs/html/lib/stdlib/hillcountry.html | 132 + mma/docs/html/lib/stdlib/jazz-54.html | 61 + mma/docs/html/lib/stdlib/jazzwaltz.html | 191 ++ mma/docs/html/lib/stdlib/jive.html | 290 ++ mma/docs/html/lib/stdlib/lfusion.html | 176 ++ mma/docs/html/lib/stdlib/lighttango.html | 140 + mma/docs/html/lib/stdlib/mambo.html | 236 ++ mma/docs/html/lib/stdlib/march.html | 176 ++ mma/docs/html/lib/stdlib/merengue.html | 182 ++ mma/docs/html/lib/stdlib/metronome.html | 54 + mma/docs/html/lib/stdlib/metronome3.html | 24 + mma/docs/html/lib/stdlib/modernjazz.html | 141 + mma/docs/html/lib/stdlib/pianoballad.html | 127 + mma/docs/html/lib/stdlib/polka.html | 225 ++ mma/docs/html/lib/stdlib/popballad.html | 98 + mma/docs/html/lib/stdlib/quickstep.html | 168 ++ mma/docs/html/lib/stdlib/rb.html | 99 + mma/docs/html/lib/stdlib/rhumba.html | 407 +++ mma/docs/html/lib/stdlib/rock-128.html | 83 + mma/docs/html/lib/stdlib/rockballad.html | 106 + mma/docs/html/lib/stdlib/samba.html | 190 ++ mma/docs/html/lib/stdlib/ska.html | 152 + mma/docs/html/lib/stdlib/slowblues.html | 237 ++ mma/docs/html/lib/stdlib/slowbolero.html | 102 + mma/docs/html/lib/stdlib/slowcountry.html | 160 + mma/docs/html/lib/stdlib/slowjazz.html | 292 ++ mma/docs/html/lib/stdlib/softrock.html | 144 + mma/docs/html/lib/stdlib/softshoe.html | 125 + mma/docs/html/lib/stdlib/son.html | 106 + mma/docs/html/lib/stdlib/swing.html | 647 ++++ mma/docs/html/lib/stdlib/tango.html | 74 + mma/docs/html/lib/stdlib/vienesewaltz.html | 103 + mma/docs/html/lib/stdlib/waltz.html | 237 ++ mma/docs/html/lib/stdlib/zydeco.html | 133 + mma/docs/html/logo.png | Bin 0 -> 14420 bytes mma/docs/html/mma.html | 57 + mma/docs/html/ref/crossref.png | Bin 0 -> 147 bytes mma/docs/html/ref/img1.png | Bin 0 -> 231 bytes mma/docs/html/ref/img10.png | Bin 0 -> 155 bytes mma/docs/html/ref/img11.png | Bin 0 -> 273 bytes mma/docs/html/ref/img12.png | Bin 0 -> 232 bytes mma/docs/html/ref/img13.png | Bin 0 -> 448 bytes mma/docs/html/ref/img14.png | Bin 0 -> 231 bytes mma/docs/html/ref/img15.png | Bin 0 -> 226 bytes mma/docs/html/ref/img16.png | Bin 0 -> 248 bytes mma/docs/html/ref/img17.png | Bin 0 -> 297 bytes mma/docs/html/ref/img18.png | Bin 0 -> 290 bytes mma/docs/html/ref/img19.png | Bin 0 -> 277 bytes mma/docs/html/ref/img2.png | Bin 0 -> 302 bytes mma/docs/html/ref/img20.png | Bin 0 -> 295 bytes mma/docs/html/ref/img21.png | Bin 0 -> 233 bytes mma/docs/html/ref/img22.png | Bin 0 -> 237 bytes mma/docs/html/ref/img23.png | Bin 0 -> 252 bytes mma/docs/html/ref/img24.png | Bin 0 -> 238 bytes mma/docs/html/ref/img25.png | Bin 0 -> 287 bytes mma/docs/html/ref/img3.png | Bin 0 -> 241 bytes mma/docs/html/ref/img4.png | Bin 0 -> 207 bytes mma/docs/html/ref/img5.png | Bin 0 -> 234 bytes mma/docs/html/ref/img6.png | Bin 0 -> 213 bytes mma/docs/html/ref/img7.png | Bin 0 -> 270 bytes mma/docs/html/ref/img8.png | Bin 0 -> 176 bytes mma/docs/html/ref/img9.png | Bin 0 -> 224 bytes mma/docs/html/ref/index.html | 633 ++++ mma/docs/html/ref/mma.css | 30 + mma/docs/html/ref/mma.html | 633 ++++ mma/docs/html/ref/mupex/arp4s.png | Bin 0 -> 2763 bytes mma/docs/html/ref/mupex/bassb8.png | Bin 0 -> 3643 bytes mma/docs/html/ref/mupex/chord43.png | Bin 0 -> 3770 bytes mma/docs/html/ref/mupex/cmajor.png | Bin 0 -> 4179 bytes mma/docs/html/ref/mupex/fermata.png | Bin 0 -> 3367 bytes mma/docs/html/ref/mupex/fermata2.png | Bin 0 -> 5883 bytes mma/docs/html/ref/mupex/repeat.png | Bin 0 -> 3723 bytes mma/docs/html/ref/mupex/soloeg.png | Bin 0 -> 5357 bytes mma/docs/html/ref/mupex/swingconv.png | Bin 0 -> 9094 bytes mma/docs/html/ref/mupex/swingdrum8-3.png | Bin 0 -> 2466 bytes mma/docs/html/ref/mupex/swingdrum8.png | Bin 0 -> 1773 bytes mma/docs/html/ref/mupex/tilde.png | Bin 0 -> 4588 bytes mma/docs/html/ref/mupex/tilde2.png | Bin 0 -> 5031 bytes mma/docs/html/ref/mupex/trip1.png | Bin 0 -> 3880 bytes mma/docs/html/ref/mupex/trip3.png | Bin 0 -> 4032 bytes mma/docs/html/ref/next.png | Bin 0 -> 245 bytes mma/docs/html/ref/next_g.png | Bin 0 -> 272 bytes mma/docs/html/ref/node1.html | 765 +++++ mma/docs/html/ref/node10.html | 816 +++++ mma/docs/html/ref/node11.html | 1306 ++++++++ mma/docs/html/ref/node12.html | 344 +++ mma/docs/html/ref/node13.html | 882 ++++++ mma/docs/html/ref/node14.html | 307 ++ mma/docs/html/ref/node15.html | 872 ++++++ mma/docs/html/ref/node16.html | 283 ++ mma/docs/html/ref/node17.html | 1418 +++++++++ mma/docs/html/ref/node18.html | 1610 ++++++++++ mma/docs/html/ref/node19.html | 539 ++++ mma/docs/html/ref/node2.html | 452 +++ mma/docs/html/ref/node20.html | 1486 +++++++++ mma/docs/html/ref/node21.html | 210 ++ mma/docs/html/ref/node22.html | 178 ++ mma/docs/html/ref/node23.html | 1101 +++++++ mma/docs/html/ref/node24.html | 216 ++ mma/docs/html/ref/node25.html | 271 ++ mma/docs/html/ref/node26.html | 3180 ++++++++++++++++++++ mma/docs/html/ref/node27.html | 140 + mma/docs/html/ref/node28.html | 434 +++ mma/docs/html/ref/node29.html | 73 + mma/docs/html/ref/node3.html | 488 +++ mma/docs/html/ref/node4.html | 1284 ++++++++ mma/docs/html/ref/node5.html | 875 ++++++ mma/docs/html/ref/node6.html | 573 ++++ mma/docs/html/ref/node7.html | 335 +++ mma/docs/html/ref/node8.html | 475 +++ mma/docs/html/ref/node9.html | 655 ++++ mma/docs/html/ref/prev.png | Bin 0 -> 279 bytes mma/docs/html/ref/prev_g.png | Bin 0 -> 327 bytes mma/docs/html/ref/up.png | Bin 0 -> 211 bytes mma/docs/html/tut/crossref.png | Bin 0 -> 147 bytes mma/docs/html/tut/index.html | 125 + mma/docs/html/tut/mma-tutorial.css | 30 + mma/docs/html/tut/mma-tutorial.html | 125 + mma/docs/html/tut/mup/bass.png | Bin 0 -> 2134 bytes mma/docs/html/tut/mup/deep.png | Bin 0 -> 24804 bytes mma/docs/html/tut/mup/drums.png | Bin 0 -> 2315 bytes mma/docs/html/tut/mup/fella.png | Bin 0 -> 19244 bytes mma/docs/html/tut/mup/piano.png | Bin 0 -> 3317 bytes mma/docs/html/tut/next.png | Bin 0 -> 245 bytes mma/docs/html/tut/next_g.png | Bin 0 -> 272 bytes mma/docs/html/tut/node1.html | 148 + mma/docs/html/tut/node2.html | 65 + mma/docs/html/tut/node3.html | 476 +++ mma/docs/html/tut/node4.html | 444 +++ mma/docs/html/tut/node5.html | 736 +++++ mma/docs/html/tut/node6.html | 73 + mma/docs/html/tut/prev.png | Bin 0 -> 279 bytes mma/docs/html/tut/prev_g.png | Bin 0 -> 327 bytes mma/docs/html/tut/up.png | Bin 0 -> 211 bytes mma/egs/README | 31 + mma/egs/harmony/harmony.mid | Bin 0 -> 3307 bytes mma/egs/harmony/harmony.mma | 55 + mma/egs/lyrics/twinkle.mid | Bin 0 -> 5632 bytes mma/egs/lyrics/twinkle.mma | 37 + mma/egs/lyrics/twinkle1.mid | Bin 0 -> 5724 bytes mma/egs/lyrics/twinkle1.mma | 74 + mma/egs/lyrics/twinkle2.mid | Bin 0 -> 5689 bytes mma/egs/lyrics/twinkle2.mma | 107 + mma/egs/lyrics/twinkle3.mid | Bin 0 -> 3533 bytes mma/egs/lyrics/twinkle3.mma | 36 + mma/egs/midi-inc/README | 57 + mma/egs/midi-inc/drum.mid | Bin 0 -> 156 bytes mma/egs/midi-inc/frankie.mid | Bin 0 -> 7899 bytes mma/egs/midi-inc/frankie.mma | 80 + mma/egs/midi-inc/rec1.mid | Bin 0 -> 596 bytes mma/egs/midi-inc/rec2.mid | Bin 0 -> 825 bytes mma/egs/misc/cascade.mid | Bin 0 -> 669 bytes mma/egs/misc/cascade.mma | 54 + mma/egs/misc/extended-voice.mid | Bin 0 -> 397 bytes mma/egs/misc/extended-voice.mma | 64 + mma/egs/misc/grooves.mid | Bin 0 -> 13516 bytes mma/egs/misc/grooves.mma | 73 + mma/egs/misc/macros-all.mma | 81 + mma/egs/misc/macros.mid | Bin 0 -> 978 bytes mma/egs/misc/macros.mma | 101 + mma/egs/misc/repeats.mma | 94 + mma/egs/misc/volumes.mid | Bin 0 -> 3732 bytes mma/egs/misc/volumes.mma | 105 + mma/egs/mkall | 22 + mma/egs/riffs/riffs.mid | Bin 0 -> 2084 bytes mma/egs/riffs/riffs.mma | 76 + mma/egs/rndset/rndchords.mid | Bin 0 -> 4416 bytes mma/egs/rndset/rndchords.mma | 20 + mma/egs/rndset/tempo.mid | Bin 0 -> 5428 bytes mma/egs/rndset/tempo.mma | 61 + mma/egs/scales/scales.mid | Bin 0 -> 3437 bytes mma/egs/scales/scales.mma | 79 + mma/egs/simple/bill-bailey.mid | Bin 0 -> 19140 bytes mma/egs/simple/bill-bailey.mma | 46 + mma/egs/simple/marine-hymn.mid | Bin 0 -> 4483 bytes mma/egs/simple/marine-hymn.mma | 59 + mma/includes/README | 28 + mma/includes/init.mma | 29 + mma/includes/reset.mma | 15 + mma/includes/stdpats.mma | 135 + mma/includes/stdpats34.mma | 80 + mma/includes/stdpats54.mma | 42 + mma/lib/README | 66 + mma/lib/kara/K50s_rock.mma | 1192 ++++++++ mma/lib/kara/README | 15 + mma/lib/kara/twi.mma | 736 +++++ mma/lib/stdlib/.mmaDB | Bin 0 -> 9613 bytes mma/lib/stdlib/50srock.mma | 212 ++ mma/lib/stdlib/60srock.mma | 159 + mma/lib/stdlib/8beat.mma | 199 ++ mma/lib/stdlib/README | 9 + mma/lib/stdlib/ballad.mma | 262 ++ mma/lib/stdlib/basicrock.mma | 158 + mma/lib/stdlib/beguine.mma | 248 ++ mma/lib/stdlib/bigband.mma | 355 +++ mma/lib/stdlib/bluegrass.mma | 175 ++ mma/lib/stdlib/blues.mma | 165 + mma/lib/stdlib/boggiewoggie.mma | 101 + mma/lib/stdlib/bolero.mma | 313 ++ mma/lib/stdlib/bossanova.mma | 296 ++ mma/lib/stdlib/broadway.mma | 166 + mma/lib/stdlib/calypso.mma | 144 + mma/lib/stdlib/chacha.mma | 202 ++ mma/lib/stdlib/countryblues.mma | 213 ++ mma/lib/stdlib/countryswing.mma | 186 ++ mma/lib/stdlib/countrywaltz.mma | 212 ++ mma/lib/stdlib/desert.mma | 158 + mma/lib/stdlib/dixie.mma | 208 ++ mma/lib/stdlib/dixiemarch.mma | 154 + mma/lib/stdlib/easyswing.mma | 282 ++ mma/lib/stdlib/fastblues.mma | 218 ++ mma/lib/stdlib/folk.mma | 155 + mma/lib/stdlib/foxtrot.mma | 267 ++ mma/lib/stdlib/frenchwaltz.mma | 164 + mma/lib/stdlib/guitarballad.mma | 156 + mma/lib/stdlib/hillcountry.mma | 138 + mma/lib/stdlib/jazz-54.mma | 104 + mma/lib/stdlib/jazzwaltz.mma | 242 ++ mma/lib/stdlib/jive.mma | 208 ++ mma/lib/stdlib/lfusion.mma | 247 ++ mma/lib/stdlib/lighttango.mma | 195 ++ mma/lib/stdlib/mambo.mma | 219 ++ mma/lib/stdlib/march.mma | 266 ++ mma/lib/stdlib/merengue.mma | 176 ++ mma/lib/stdlib/metronome.mma | 86 + mma/lib/stdlib/metronome3.mma | 44 + mma/lib/stdlib/modernjazz.mma | 225 ++ mma/lib/stdlib/pianoballad.mma | 149 + mma/lib/stdlib/polka.mma | 210 ++ mma/lib/stdlib/popballad.mma | 202 ++ mma/lib/stdlib/quickstep.mma | 182 ++ mma/lib/stdlib/rb.mma | 190 ++ mma/lib/stdlib/rhumba.mma | 367 +++ mma/lib/stdlib/rock-128.mma | 127 + mma/lib/stdlib/rockballad.mma | 154 + mma/lib/stdlib/samba.mma | 222 ++ mma/lib/stdlib/ska.mma | 195 ++ mma/lib/stdlib/slowblues.mma | 236 ++ mma/lib/stdlib/slowbolero.mma | 170 ++ mma/lib/stdlib/slowcountry.mma | 198 ++ mma/lib/stdlib/slowjazz.mma | 315 ++ mma/lib/stdlib/softrock.mma | 173 ++ mma/lib/stdlib/softshoe.mma | 160 + mma/lib/stdlib/son.mma | 180 ++ mma/lib/stdlib/swing.mma | 575 ++++ mma/lib/stdlib/tango.mma | 204 ++ mma/lib/stdlib/vienesewaltz.mma | 145 + mma/lib/stdlib/waltz.mma | 208 ++ mma/lib/stdlib/zydeco.mma | 135 + mma/ln-install | 8 + mma/mma.py | 56 + mma/text/ANNOUNCE | 29 + mma/text/CHANGES-1.0.rc1 | 28 + mma/text/CHANGES-beta | 1223 ++++++++ mma/text/CONTRIB | 35 + mma/text/COPYING | 340 +++ mma/text/FAKEBOOKS | 28 + mma/text/FAQ | 3 + mma/text/INSTALL | 98 + mma/text/README | 22 + mma/text/SLASHCHORDS | 95 + mma/text/SYNTHS | 89 + mma/text/TODO | 8 + mma/util/README.mklibdoc | 64 + mma/util/mklibdoc.py | 228 ++ 330 files changed, 66979 insertions(+) create mode 100755 Tools/mmaWrapper create mode 100644 mma/MMA/__init__.py create mode 100644 mma/MMA/alloc.py create mode 100644 mma/MMA/auto.py create mode 100644 mma/MMA/chords.py create mode 100644 mma/MMA/chordtable.py create mode 100644 mma/MMA/common.py create mode 100644 mma/MMA/docs.py create mode 100644 mma/MMA/file.py create mode 100644 mma/MMA/gbl.py create mode 100644 mma/MMA/harmony.py create mode 100644 mma/MMA/lyric.py create mode 100644 mma/MMA/macro.py create mode 100644 mma/MMA/main.py create mode 100644 mma/MMA/mdefine.py create mode 100644 mma/MMA/midi.py create mode 100644 mma/MMA/midiC.py create mode 100644 mma/MMA/midiIn.py create mode 100644 mma/MMA/midiM.py create mode 100644 mma/MMA/notelen.py create mode 100644 mma/MMA/options.py create mode 100644 mma/MMA/parse.py create mode 100644 mma/MMA/pat.py create mode 100644 mma/MMA/patArpeggio.py create mode 100644 mma/MMA/patBass.py create mode 100644 mma/MMA/patChord.py create mode 100644 mma/MMA/patDrum.py create mode 100644 mma/MMA/patScale.py create mode 100644 mma/MMA/patSolo.py create mode 100644 mma/MMA/patWalk.py create mode 100644 mma/MMA/translate.py create mode 100644 mma/MMA/volume.py create mode 100755 mma/cp-install create mode 100644 mma/docs/html/README create mode 100644 mma/docs/html/lib/index.html create mode 100644 mma/docs/html/lib/kara/K50s_rock.html create mode 100644 mma/docs/html/lib/kara/Kfunk1.html create mode 100644 mma/docs/html/lib/kara/twi.html create mode 100644 mma/docs/html/lib/stdlib/50srock.html create mode 100644 mma/docs/html/lib/stdlib/60srock.html create mode 100644 mma/docs/html/lib/stdlib/8beat.html create mode 100644 mma/docs/html/lib/stdlib/ballad.html create mode 100644 mma/docs/html/lib/stdlib/basicrock.html create mode 100644 mma/docs/html/lib/stdlib/beguine.html create mode 100644 mma/docs/html/lib/stdlib/bigband.html create mode 100644 mma/docs/html/lib/stdlib/bluegrass.html create mode 100644 mma/docs/html/lib/stdlib/blues.html create mode 100644 mma/docs/html/lib/stdlib/boggiewoggie.html create mode 100644 mma/docs/html/lib/stdlib/bolero.html create mode 100644 mma/docs/html/lib/stdlib/bossanova.html create mode 100644 mma/docs/html/lib/stdlib/broadway.html create mode 100644 mma/docs/html/lib/stdlib/calypso.html create mode 100644 mma/docs/html/lib/stdlib/chacha.html create mode 100644 mma/docs/html/lib/stdlib/countryblues.html create mode 100644 mma/docs/html/lib/stdlib/countryswing.html create mode 100644 mma/docs/html/lib/stdlib/countrywaltz.html create mode 100644 mma/docs/html/lib/stdlib/desert.html create mode 100644 mma/docs/html/lib/stdlib/dixie.html create mode 100644 mma/docs/html/lib/stdlib/dixiemarch.html create mode 100644 mma/docs/html/lib/stdlib/easyswing.html create mode 100644 mma/docs/html/lib/stdlib/fastblues.html create mode 100644 mma/docs/html/lib/stdlib/folk.html create mode 100644 mma/docs/html/lib/stdlib/foxtrot.html create mode 100644 mma/docs/html/lib/stdlib/frenchwaltz.html create mode 100644 mma/docs/html/lib/stdlib/guitarballad.html create mode 100644 mma/docs/html/lib/stdlib/hillcountry.html create mode 100644 mma/docs/html/lib/stdlib/jazz-54.html create mode 100644 mma/docs/html/lib/stdlib/jazzwaltz.html create mode 100644 mma/docs/html/lib/stdlib/jive.html create mode 100644 mma/docs/html/lib/stdlib/lfusion.html create mode 100644 mma/docs/html/lib/stdlib/lighttango.html create mode 100644 mma/docs/html/lib/stdlib/mambo.html create mode 100644 mma/docs/html/lib/stdlib/march.html create mode 100644 mma/docs/html/lib/stdlib/merengue.html create mode 100644 mma/docs/html/lib/stdlib/metronome.html create mode 100644 mma/docs/html/lib/stdlib/metronome3.html create mode 100644 mma/docs/html/lib/stdlib/modernjazz.html create mode 100644 mma/docs/html/lib/stdlib/pianoballad.html create mode 100644 mma/docs/html/lib/stdlib/polka.html create mode 100644 mma/docs/html/lib/stdlib/popballad.html create mode 100644 mma/docs/html/lib/stdlib/quickstep.html create mode 100644 mma/docs/html/lib/stdlib/rb.html create mode 100644 mma/docs/html/lib/stdlib/rhumba.html create mode 100644 mma/docs/html/lib/stdlib/rock-128.html create mode 100644 mma/docs/html/lib/stdlib/rockballad.html create mode 100644 mma/docs/html/lib/stdlib/samba.html create mode 100644 mma/docs/html/lib/stdlib/ska.html create mode 100644 mma/docs/html/lib/stdlib/slowblues.html create mode 100644 mma/docs/html/lib/stdlib/slowbolero.html create mode 100644 mma/docs/html/lib/stdlib/slowcountry.html create mode 100644 mma/docs/html/lib/stdlib/slowjazz.html create mode 100644 mma/docs/html/lib/stdlib/softrock.html create mode 100644 mma/docs/html/lib/stdlib/softshoe.html create mode 100644 mma/docs/html/lib/stdlib/son.html create mode 100644 mma/docs/html/lib/stdlib/swing.html create mode 100644 mma/docs/html/lib/stdlib/tango.html create mode 100644 mma/docs/html/lib/stdlib/vienesewaltz.html create mode 100644 mma/docs/html/lib/stdlib/waltz.html create mode 100644 mma/docs/html/lib/stdlib/zydeco.html create mode 100644 mma/docs/html/logo.png create mode 100644 mma/docs/html/mma.html create mode 100644 mma/docs/html/ref/crossref.png create mode 100644 mma/docs/html/ref/img1.png create mode 100644 mma/docs/html/ref/img10.png create mode 100644 mma/docs/html/ref/img11.png create mode 100644 mma/docs/html/ref/img12.png create mode 100644 mma/docs/html/ref/img13.png create mode 100644 mma/docs/html/ref/img14.png create mode 100644 mma/docs/html/ref/img15.png create mode 100644 mma/docs/html/ref/img16.png create mode 100644 mma/docs/html/ref/img17.png create mode 100644 mma/docs/html/ref/img18.png create mode 100644 mma/docs/html/ref/img19.png create mode 100644 mma/docs/html/ref/img2.png create mode 100644 mma/docs/html/ref/img20.png create mode 100644 mma/docs/html/ref/img21.png create mode 100644 mma/docs/html/ref/img22.png create mode 100644 mma/docs/html/ref/img23.png create mode 100644 mma/docs/html/ref/img24.png create mode 100644 mma/docs/html/ref/img25.png create mode 100644 mma/docs/html/ref/img3.png create mode 100644 mma/docs/html/ref/img4.png create mode 100644 mma/docs/html/ref/img5.png create mode 100644 mma/docs/html/ref/img6.png create mode 100644 mma/docs/html/ref/img7.png create mode 100644 mma/docs/html/ref/img8.png create mode 100644 mma/docs/html/ref/img9.png create mode 100644 mma/docs/html/ref/index.html create mode 100644 mma/docs/html/ref/mma.css create mode 100644 mma/docs/html/ref/mma.html create mode 100644 mma/docs/html/ref/mupex/arp4s.png create mode 100644 mma/docs/html/ref/mupex/bassb8.png create mode 100644 mma/docs/html/ref/mupex/chord43.png create mode 100644 mma/docs/html/ref/mupex/cmajor.png create mode 100644 mma/docs/html/ref/mupex/fermata.png create mode 100644 mma/docs/html/ref/mupex/fermata2.png create mode 100644 mma/docs/html/ref/mupex/repeat.png create mode 100644 mma/docs/html/ref/mupex/soloeg.png create mode 100644 mma/docs/html/ref/mupex/swingconv.png create mode 100644 mma/docs/html/ref/mupex/swingdrum8-3.png create mode 100644 mma/docs/html/ref/mupex/swingdrum8.png create mode 100644 mma/docs/html/ref/mupex/tilde.png create mode 100644 mma/docs/html/ref/mupex/tilde2.png create mode 100644 mma/docs/html/ref/mupex/trip1.png create mode 100644 mma/docs/html/ref/mupex/trip3.png create mode 100644 mma/docs/html/ref/next.png create mode 100644 mma/docs/html/ref/next_g.png create mode 100644 mma/docs/html/ref/node1.html create mode 100644 mma/docs/html/ref/node10.html create mode 100644 mma/docs/html/ref/node11.html create mode 100644 mma/docs/html/ref/node12.html create mode 100644 mma/docs/html/ref/node13.html create mode 100644 mma/docs/html/ref/node14.html create mode 100644 mma/docs/html/ref/node15.html create mode 100644 mma/docs/html/ref/node16.html create mode 100644 mma/docs/html/ref/node17.html create mode 100644 mma/docs/html/ref/node18.html create mode 100644 mma/docs/html/ref/node19.html create mode 100644 mma/docs/html/ref/node2.html create mode 100644 mma/docs/html/ref/node20.html create mode 100644 mma/docs/html/ref/node21.html create mode 100644 mma/docs/html/ref/node22.html create mode 100644 mma/docs/html/ref/node23.html create mode 100644 mma/docs/html/ref/node24.html create mode 100644 mma/docs/html/ref/node25.html create mode 100644 mma/docs/html/ref/node26.html create mode 100644 mma/docs/html/ref/node27.html create mode 100644 mma/docs/html/ref/node28.html create mode 100644 mma/docs/html/ref/node29.html create mode 100644 mma/docs/html/ref/node3.html create mode 100644 mma/docs/html/ref/node4.html create mode 100644 mma/docs/html/ref/node5.html create mode 100644 mma/docs/html/ref/node6.html create mode 100644 mma/docs/html/ref/node7.html create mode 100644 mma/docs/html/ref/node8.html create mode 100644 mma/docs/html/ref/node9.html create mode 100644 mma/docs/html/ref/prev.png create mode 100644 mma/docs/html/ref/prev_g.png create mode 100644 mma/docs/html/ref/up.png create mode 100644 mma/docs/html/tut/crossref.png create mode 100644 mma/docs/html/tut/index.html create mode 100644 mma/docs/html/tut/mma-tutorial.css create mode 100644 mma/docs/html/tut/mma-tutorial.html create mode 100644 mma/docs/html/tut/mup/bass.png create mode 100644 mma/docs/html/tut/mup/deep.png create mode 100644 mma/docs/html/tut/mup/drums.png create mode 100644 mma/docs/html/tut/mup/fella.png create mode 100644 mma/docs/html/tut/mup/piano.png create mode 100644 mma/docs/html/tut/next.png create mode 100644 mma/docs/html/tut/next_g.png create mode 100644 mma/docs/html/tut/node1.html create mode 100644 mma/docs/html/tut/node2.html create mode 100644 mma/docs/html/tut/node3.html create mode 100644 mma/docs/html/tut/node4.html create mode 100644 mma/docs/html/tut/node5.html create mode 100644 mma/docs/html/tut/node6.html create mode 100644 mma/docs/html/tut/prev.png create mode 100644 mma/docs/html/tut/prev_g.png create mode 100644 mma/docs/html/tut/up.png create mode 100644 mma/egs/README create mode 100644 mma/egs/harmony/harmony.mid create mode 100644 mma/egs/harmony/harmony.mma create mode 100644 mma/egs/lyrics/twinkle.mid create mode 100644 mma/egs/lyrics/twinkle.mma create mode 100644 mma/egs/lyrics/twinkle1.mid create mode 100644 mma/egs/lyrics/twinkle1.mma create mode 100644 mma/egs/lyrics/twinkle2.mid create mode 100644 mma/egs/lyrics/twinkle2.mma create mode 100644 mma/egs/lyrics/twinkle3.mid create mode 100644 mma/egs/lyrics/twinkle3.mma create mode 100644 mma/egs/midi-inc/README create mode 100644 mma/egs/midi-inc/drum.mid create mode 100644 mma/egs/midi-inc/frankie.mid create mode 100644 mma/egs/midi-inc/frankie.mma create mode 100644 mma/egs/midi-inc/rec1.mid create mode 100644 mma/egs/midi-inc/rec2.mid create mode 100644 mma/egs/misc/cascade.mid create mode 100644 mma/egs/misc/cascade.mma create mode 100644 mma/egs/misc/extended-voice.mid create mode 100644 mma/egs/misc/extended-voice.mma create mode 100644 mma/egs/misc/grooves.mid create mode 100644 mma/egs/misc/grooves.mma create mode 100644 mma/egs/misc/macros-all.mma create mode 100644 mma/egs/misc/macros.mid create mode 100644 mma/egs/misc/macros.mma create mode 100644 mma/egs/misc/repeats.mma create mode 100644 mma/egs/misc/volumes.mid create mode 100644 mma/egs/misc/volumes.mma create mode 100755 mma/egs/mkall create mode 100644 mma/egs/riffs/riffs.mid create mode 100644 mma/egs/riffs/riffs.mma create mode 100644 mma/egs/rndset/rndchords.mid create mode 100644 mma/egs/rndset/rndchords.mma create mode 100644 mma/egs/rndset/tempo.mid create mode 100644 mma/egs/rndset/tempo.mma create mode 100644 mma/egs/scales/scales.mid create mode 100644 mma/egs/scales/scales.mma create mode 100644 mma/egs/simple/bill-bailey.mid create mode 100644 mma/egs/simple/bill-bailey.mma create mode 100644 mma/egs/simple/marine-hymn.mid create mode 100644 mma/egs/simple/marine-hymn.mma create mode 100644 mma/includes/README create mode 100644 mma/includes/init.mma create mode 100644 mma/includes/reset.mma create mode 100644 mma/includes/stdpats.mma create mode 100644 mma/includes/stdpats34.mma create mode 100644 mma/includes/stdpats54.mma create mode 100644 mma/lib/README create mode 100644 mma/lib/kara/K50s_rock.mma create mode 100644 mma/lib/kara/README create mode 100644 mma/lib/kara/twi.mma create mode 100644 mma/lib/stdlib/.mmaDB create mode 100644 mma/lib/stdlib/50srock.mma create mode 100644 mma/lib/stdlib/60srock.mma create mode 100644 mma/lib/stdlib/8beat.mma create mode 100644 mma/lib/stdlib/README create mode 100644 mma/lib/stdlib/ballad.mma create mode 100644 mma/lib/stdlib/basicrock.mma create mode 100644 mma/lib/stdlib/beguine.mma create mode 100644 mma/lib/stdlib/bigband.mma create mode 100644 mma/lib/stdlib/bluegrass.mma create mode 100644 mma/lib/stdlib/blues.mma create mode 100644 mma/lib/stdlib/boggiewoggie.mma create mode 100644 mma/lib/stdlib/bolero.mma create mode 100644 mma/lib/stdlib/bossanova.mma create mode 100644 mma/lib/stdlib/broadway.mma create mode 100644 mma/lib/stdlib/calypso.mma create mode 100644 mma/lib/stdlib/chacha.mma create mode 100644 mma/lib/stdlib/countryblues.mma create mode 100644 mma/lib/stdlib/countryswing.mma create mode 100644 mma/lib/stdlib/countrywaltz.mma create mode 100644 mma/lib/stdlib/desert.mma create mode 100644 mma/lib/stdlib/dixie.mma create mode 100644 mma/lib/stdlib/dixiemarch.mma create mode 100644 mma/lib/stdlib/easyswing.mma create mode 100644 mma/lib/stdlib/fastblues.mma create mode 100644 mma/lib/stdlib/folk.mma create mode 100644 mma/lib/stdlib/foxtrot.mma create mode 100644 mma/lib/stdlib/frenchwaltz.mma create mode 100644 mma/lib/stdlib/guitarballad.mma create mode 100644 mma/lib/stdlib/hillcountry.mma create mode 100644 mma/lib/stdlib/jazz-54.mma create mode 100644 mma/lib/stdlib/jazzwaltz.mma create mode 100644 mma/lib/stdlib/jive.mma create mode 100644 mma/lib/stdlib/lfusion.mma create mode 100644 mma/lib/stdlib/lighttango.mma create mode 100644 mma/lib/stdlib/mambo.mma create mode 100644 mma/lib/stdlib/march.mma create mode 100644 mma/lib/stdlib/merengue.mma create mode 100644 mma/lib/stdlib/metronome.mma create mode 100644 mma/lib/stdlib/metronome3.mma create mode 100644 mma/lib/stdlib/modernjazz.mma create mode 100644 mma/lib/stdlib/pianoballad.mma create mode 100644 mma/lib/stdlib/polka.mma create mode 100644 mma/lib/stdlib/popballad.mma create mode 100644 mma/lib/stdlib/quickstep.mma create mode 100644 mma/lib/stdlib/rb.mma create mode 100644 mma/lib/stdlib/rhumba.mma create mode 100644 mma/lib/stdlib/rock-128.mma create mode 100644 mma/lib/stdlib/rockballad.mma create mode 100644 mma/lib/stdlib/samba.mma create mode 100644 mma/lib/stdlib/ska.mma create mode 100644 mma/lib/stdlib/slowblues.mma create mode 100644 mma/lib/stdlib/slowbolero.mma create mode 100644 mma/lib/stdlib/slowcountry.mma create mode 100644 mma/lib/stdlib/slowjazz.mma create mode 100644 mma/lib/stdlib/softrock.mma create mode 100644 mma/lib/stdlib/softshoe.mma create mode 100644 mma/lib/stdlib/son.mma create mode 100644 mma/lib/stdlib/swing.mma create mode 100644 mma/lib/stdlib/tango.mma create mode 100644 mma/lib/stdlib/vienesewaltz.mma create mode 100644 mma/lib/stdlib/waltz.mma create mode 100644 mma/lib/stdlib/zydeco.mma create mode 100755 mma/ln-install create mode 100755 mma/mma.py create mode 100644 mma/text/ANNOUNCE create mode 100644 mma/text/CHANGES-1.0.rc1 create mode 100644 mma/text/CHANGES-beta create mode 100644 mma/text/CONTRIB create mode 100644 mma/text/COPYING create mode 100644 mma/text/FAKEBOOKS create mode 100644 mma/text/FAQ create mode 100644 mma/text/INSTALL create mode 100644 mma/text/README create mode 100644 mma/text/SLASHCHORDS create mode 100644 mma/text/SYNTHS create mode 100644 mma/text/TODO create mode 100644 mma/util/README.mklibdoc create mode 100755 mma/util/mklibdoc.py diff --git a/Tools/mmaWrapper b/Tools/mmaWrapper new file mode 100755 index 0000000..f90f041 --- /dev/null +++ b/Tools/mmaWrapper @@ -0,0 +1,4 @@ +#!/bin/sh + +cd ${0%/*/*}/share/mma +exec $0.py $* diff --git a/mma/MMA/__init__.py b/mma/MMA/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mma/MMA/alloc.py b/mma/MMA/alloc.py new file mode 100644 index 0000000..2ec1045 --- /dev/null +++ b/mma/MMA/alloc.py @@ -0,0 +1,103 @@ + +# alloc.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import MMA.patChord +import MMA.patWalk +import MMA.patBass +import MMA.patDrum +import MMA.patScale +import MMA.patArpeggio +import MMA.patSolo +import gbl +from MMA.common import * + + +trkClasses = { + 'BASS' : MMA.patBass.Bass, + 'CHORD' : MMA.patChord.Chord, + 'ARPEGGIO' : MMA.patArpeggio.Arpeggio, + 'SCALE' : MMA.patScale.Scale, + 'DRUM' : MMA.patDrum.Drum, + 'WALK' : MMA.patWalk.Walk, + 'MELODY' : MMA.patSolo.Melody, + 'SOLO' : MMA.patSolo.Solo } + + +def trackAlloc(name, err): + """ Check existence of track and create if possible. + + If 'err' is set, the function will 'error out' if + it's not possible to create the track. Otherwise, + it is content to return without creation taking place. + """ + + # If the track already exists, just return + + if name in gbl.tnames: + return + + # Get the trackname. Can be just a type, or type-name. + + if '-' in name: + base, ext = name.split('-',1) + else: + ext = None + base = name + + + """ See if there is a track class 'base'. If there is, then + 'f' points to the initialization function for the class. + If not, we either error (err==1) or return (err==0). + """ + + if trkClasses.has_key(base): + f = trkClasses[base] + else: + if err: + error("There is no track class '%s' for trackname '%s'" % (base, name) ) + else: + return + + # Now attempt to allocate the track + + gbl.tnames[name] = newtk = f(name) + + # Set the sequence size of new track + + newtk.setSeqSize() + + # Update current grooves to reflect new track. + + for slot in gbl.settingsGroove.keys(): + newtk.saveGroove(slot) + + + if gbl.debug: + print "Creating new track", name + + return + + + diff --git a/mma/MMA/auto.py b/mma/MMA/auto.py new file mode 100644 index 0000000..370049f --- /dev/null +++ b/mma/MMA/auto.py @@ -0,0 +1,255 @@ + +# auto.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + +import os +import sys +import pickle + +import MMA.midi +import gbl +import MMA.parse +from MMA.common import * + +grooveDir = {} +mmadir = ".mmaDB" # constant, name of the lib database file +fileCount = 0 +grooveCount = 0 +gdDate = None +processedFiles = [] +mkGrooveList = [] + +def updateGrooveList(n): + """ Called from parse when new grooves are defined in a -g. """ + + global mkGrooveList + + mkGrooveList.append(n) + + +def libUpdate(): + """ Update the mma library database file(s) with -g or -G option. + + This is called from the main program after the initialization + and other option parsing. No RETURN. + """ + + global fileCount, gdDate, grooveDir, processedfiles + + print "Creating MMA groove directory database(s). Standby..." + + """ gbl.libPath points to one main directory tree which should include + gbl.autoLib (defaults to 'stdlib'). We create a separate .mmaDB + file for each directory found in the main tree. IE. if we have the + directories stdlib and bvstuff we end up with stdlib/.mmaDB and + bvstuff/.mmaDB. + + """ + + for d in os.listdir(gbl.libPath): + libpath = os.path.join(gbl.libPath, d) + + if not os.path.isdir(libpath): # skip files, just process directories + continue + + + """ Attempt to read existing database + There is a flag gbl.makeGrvDefs set to 0, 1, 2 + 0 - there was no -g or -G so we're not here + 1 - -g - read existing database and update + 2 - -G - don't read existing, create new + """ + + grooveDir = {} + gdDate = None + + if gbl.makeGrvDefs == 1: + try: + infile = os.path.join(libpath, mmadir) + f=file(infile, "rb") + f.readline() # Read/discard comment line + grooveDir = pickle.load(f) + f.close() + gdDate = os.path.getmtime(infile) + except: + pass + + dolibupdate(libpath, '') + + # Strip out defs of deleted (not found) files. + + for f in grooveDir.keys(): + if f not in processedFiles: + print " Deleting: %s" % f + del grooveDir[f] + + try: + outpath = file(os.path.join(libpath, mmadir), 'wb') + except: + error("Error creating lib-database file '%s'. CRITICAL!" + % libpath) + + outpath.write("### mmaDB ... AUTOGENERATED BINARY DATA. " + "DO NOT EDIT!!!\n") + pickle.dump(grooveDir, outpath, pickle.HIGHEST_PROTOCOL ) + outpath.close() + + print + print "Database update complete." + print " Files processed: %s" % fileCount + print " Total number of grooves: %s" % grooveCount + + sys.exit(0) + + +def dolibupdate(root, subdir): + """ Recursive function to read groove files in a directory. """ + + global fileCount, grooveCount, gdDate, grooveDir, processedFiles, mkGrooveList + + if subdir == '.': + print "Skipping: '.'" + return + + if subdir: + print " Processing library directory '%s'." % subdir + + + """ Get a list of the files in this directory. If the list + includes a file called 'MMAIGNORE' the entire directory + (and subdirs) is ignored. Otherwise, each file in the + directory ending in 'mma' is parsed for groove defs. + """ + + p = os.path.join(root,subdir) + dirfiles = os.listdir(p) + + if "MMAIGNORE" in dirfiles: + print "Skipping: %s" % p + return + + for fn in sorted(dirfiles): + + # Ignore hidden files and emacs auto-save and dead. + + if fn.startswith('.') or fn.startswith('#'): + continue + + # Create full path name + + f=os.path.join(root, subdir, fn) + + if os.path.isdir(f): + dolibupdate(root, os.path.join(subdir,fn)) # recursive! + + elif f.endswith(gbl.ext): + ename = os.path.join(subdir, fn) + + processedFiles.append(ename) + + if gdDate and grooveDir.has_key(ename) and \ + os.path.getmtime(f) < gdDate: + print " Existing: %s" % f + grooveCount += len(grooveDir[ename]) + continue + + if grooveDir.has_key(ename): + print " Updating: %s" % f + else: + print " Creating: %s" % f + mkGrooveList = [] + gbl.mtrks = {} + for c in gbl.midiAssigns.keys(): + gbl.midiAssigns[c]=[] + for a,v in enumerate(gbl.midiAvail): + gbl.midiAvail[a]=0 + gbl.mtrks[0]=MMA.midi.Mtrk(0) + gbl.tnames = {} + MMA.parse.parseFile(f) # read current file, grab grooves + + fileCount += 1 # just so we can report to user + grooveCount += len(mkGrooveList) + + grooveDir[ename]=mkGrooveList + + else: + if not f.endswith(mmadir): + print " Ignoring: %s" % f + + + +################################################################# + + +def loadGrooveDir(g): + """ Try to auto-load a groove from the library. + + The compliation of all the MMADIR files is stored in the dict + grooveDir{}. + + Check the main libpath directory for the MMADIR file. The + names of the files and corresponding grooves are extracted. + This is stored in a dictionary with the filename as the key + and a list of grooves as the data. + """ + + global grooveDir + + + """ If the global dict grooveDir is empty we first load the MMADIR info. + We're assuming that not much goes wrong here...if we don't find + the database we set grooveDir{} to a BS value to avoid future + load attempts. The entire load is in a try, which means it either + all works, or not ... + """ + + if not grooveDir: + try: + infile = os.path.join(gbl.libPath, gbl.autoLib, mmadir) + f=file(infile, "rb") + f.readline() # Read/discard comment line + grooveDir = pickle.load(f) + f.close() + except: + grooveDir[0]='' + + + """ Search the dict for a match. grooveDir{} is a dictionary + for lists. Each dictionary key is filename (eg: "lib/rhumba.mma") + and the list associated with it is a list of grooves defined + in that file. Just a matter of stepping though the dict. and + returning the proper filename. + + RETURN: Lib-Filename if found + None if not found + """ + + for filename, namelist in grooveDir.items(): + if g in namelist: + return filename + + return None + + diff --git a/mma/MMA/chords.py b/mma/MMA/chords.py new file mode 100644 index 0000000..0cc9426 --- /dev/null +++ b/mma/MMA/chords.py @@ -0,0 +1,502 @@ + +# chords.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import copy + + +from MMA.common import * +from MMA.chordtable import _chords + + + +def defChord(ln): + """ Add a new chord type to the _chords{} dict. """ + + emsg="DefChord needs NAME (NOTES) (SCALE)" + + # At this point ln is a list. The first item should be + # the new chord type name. + + if not len(ln): + error(emsg) + name = ln.pop(0) + if name in _chords.keys(): + warning("Redefining chordtype '%s'." % name) + + if '/' in name: + error("A slash in not permitted in chord type name") + + if '>' in name: + error("A '>' in not permitted in chord type name") + + ln=pextract(''.join(ln), '(', ')') + + if ln[0] or len(ln[1])!=2: + error(emsg) + + notes=ln[1][0].split(',') + if len(notes) < 2 or len(notes)>8: + error("There must be 2..8 notes in a chord, not '%s'." % len(note)) + notes.sort() + for i,v in enumerate(notes): + v=stoi(v, "Note offsets in chord must be integers, not '%s'." % v) + if v<0 or v>24: + error("Note offsets in chord must be 0..24, not '%s'." % v) + notes[i]=v + + scale=ln[1][1].split(',') + if len(scale) != 7: + error("There must be 7 offsets in chord scale, not '%s'" % len(scale)) + scale.sort() + for i,v in enumerate(scale): + v=stoi(v, "Scale offsets in chord must be integers, not '%s'." % v) + if v<0 or v>24: + error("Scale offsets in chord must be 0..24, not '%s'." % v) + scale[i]=v + + + _chords[name] = ( notes, scale, "User Defined") + + if gbl.debug: + print "ChordType '%s', %s" % (name, _chords[name]) + + +def printChord(ln): + """ Display the note/scale/def for chord(s). """ + + for c in ln: + if not _chords.has_key(c): + error("Chord '%s' is unknown" % c) + print c, ':', _chords[c][0], _chords[c][1], _chords[c][2] + + +""" +Table of chord adjustment factors. Since the initial chord is based +on a C scale, we need to shift the chord for different degrees. Note, +that with C as a midpoint we shift left for G/A/B and right for D/E/F. + +Should the shifts take in account the current key signature? +""" + +_chordAdjust = { + 'Gb':-6, + 'G' :-5, + 'G#':-4, 'Ab':-4, + 'A' :-3, + 'A#':-2, 'Bb':-2, + 'B' :-1, 'Cb':-1, + 'B#': 0, 'C' : 0, + 'C#': 1, 'Db': 1, + 'D' : 2, + 'D#': 3, 'Eb': 3, + 'E' : 4, 'Fb': 4, + 'E#': 5, 'F' : 5, + 'F#': 6 } + +def chordAdjust(ln): + """ Adjust the chord point up/down one octave. """ + + if not ln: + error("ChordAdjust: Needs at least one argument.") + + for l in ln: + try: + pitch, octave = l.split('=') + except: + error("Each arg must contain an '=', not '%s'." % l) + + if pitch not in _chordAdjust: + error("ChordAdjust: '%s' is not a valid pitch." % pitch) + + octave = stoi(octave, "ChordAdjust: expecting integer, not '%s'." % octave) + + p=_chordAdjust[pitch] + if octave == 0: + if p < -6: + _chordAdjust[pitch] += 12 + elif p > 6: + _chordAdjust[pitch]-=12 + + elif octave == -1 and p <= 6 and p >= -6: + _chordAdjust[pitch] -= 12 + + elif octave == 1 and p <= 6 and p >= -6: + _chordAdjust[pitch] += 12 + + else: + error("ChordAdjust: '%s' is not a valid octave. Use 1, 0 or -1." % octave) + + + +############################### +# Chord creation/manipulation # +############################### + +class ChordNotes: + """ The Chord class creates and manipulates chords for MMA. The + class is initialized with a call with the chord name. Eg: + + ch = ChordNotes("Am") + + The following methods and variables are defined: + + noteList - the notes in the chord as a list. The "Am" + would be [9, 12, 16]. + + noteListLen - length of noteList. + + tonic - the tonic of the chord ("Am" would be "A"). + + chordType - the type of chord ("Am" would be "m"). + + rootNote - the root note of the chord ("Am" would be a 9). + + bnoteList - the original chord notes, bypassing any + invert(), etc. mangling. + + scaleList - a 7 note list representing a scale similar to + the chord. + + reset() - resets noteList to the original chord notes. + This is useful to restore the original after + chord note mangling by invert(), etc. without having to + create a new chord object. + + + invert(n) - Inverts a chord by 'n'. This is done inplace and + returns None. 'n' can have any integer value, but -1 and 1 + are most common. The order of the notes is not changed. Eg: + + ch=Chord('Am') + ch.noteList == [9, 12, 16] + ch.invert(1) + ch.noteList = [21, 12, 16] + + compress() - Compresses the range of a chord to a single octave. This is + done inplace and return None. Eg: + + ch=Chord("A13") + ch.noteList == [1, 5, 8, 11, 21] + ch.compress() + ch.noteList == [1, 5, 8, 11, 10 ] + + + limit(n) - Limits the range of the chord 'n' notes. Done inplace + and returns None. Eg: + + ch=Chord("CM711") + ch.noteList == [0, 4, 7, 11, 15, 18] + ch.limit(4) + ch.noteList == [0, 4, 7, 11] + + + """ + + + ################# + ### Functions ### + ################# + + def __init__(self, name, line=''): + """ Create a chord object. Pass the chord name as the only arg. + + NOTE: Chord names ARE case-sensitive! + + The chord NAME at this point is something like 'Cm' or 'A#7'. + Split off the tonic and the type. + If the 2nd char is '#' or 'b' we have a 2 char tonic, + otherwise, it's the first char only. + + A chord can start with a single '+' or '-'. This moves + the entire chord and scale up/down an octave. + + Note pythonic trick: By using ranges like [1:2] we + avoid runtime errors on too-short strings. If a 1 char + string, name[1] is an error; name[1:2] just returns None. + + Further note: I have tried to enable caching of the generated + chords, but found no speed difference. So, to make life simpler + I've decided to generate a new object each time. + + """ + + slash = None + octave = 0 + inversion = 0 + + if name == 'z': + self.tonic = self.chordType = None + self.noteListLen = 0 + self.notesList = self.bnoteList = [] + return + + if '/' in name and '>' in name: + error("You cannot use both an inversion and a slash in the same chord.") + + if '>' in name: + name, inversion = name.split('>', 1) + inversion = stoi(inversion, "Expecting interger after '>'.") + if inversion < -5 or inversion > 5: + error("Chord inversions limited to -5 to 5 (more seems silly).") + + if name.startswith('-'): + name = name[1:] + octave = -12 + + if name.startswith('+'): + name = name[1:] + octave = 12 + + name = name.replace('&', 'b') + + # Strip off the slash part of the chord. Use later + # to do proper inversion. + + if name.find('/') > 0: + name, slash = name.split('/') + + if name[1:2] in ( '#b' ): + tonic = name[0:2] + ctype = name[2:] + else: + tonic = name[0:1] + ctype = name[1:] + + if not ctype: # If no type, make it a Major + ctype='M' + + try: + notes = _chords[ctype][0] + adj = _chordAdjust[tonic] + octave + except: + error( "Illegal/Unknown chord name: '%s'." % name ) + + self.noteList = [ x + adj for x in notes ] + self.bnoteList = tuple(self.noteList) + self.scaleList = tuple([ x + adj for x in _chords[ctype][1] ]) + self.chordType = ctype + self.tonic = tonic + self.rootNote = self.noteList[0] + + self.noteListLen = len(self.noteList) + + # Inversion + + if inversion: + self.invert(inversion) + self.bnoteList = tuple(self.noteList) + + # Do inversions if there is a valid slash notation. + + if slash: + if not _chordAdjust.has_key(slash): + error("The note '%s' in the slash chord is unknown." % slash) + + r=_chordAdjust[slash] # r = -6 to 6 + + # If the slash note is in the chord we invert + # the chord so the slash note is in root position. + + c_roted = 0 + s=self.noteList + for octave in [0, 12, 24]: + if r+octave in s: + rot=s.index(r+octave) + for i in range(rot): + s.append(s.pop(0)+12) + if s[0] >= 12: + for i,v in enumerate(s): + s[i] = v-12 + self.noteList = s + self.bnoteList = tuple(s) + self.rootNote = self.noteList[0] + c_roted = 1 + break + + s_roted = 0 + s=list(self.scaleList) + for octave in [0, 12, 24]: + if r+octave in s: + rot=s.index(r+octave) + for i in range(rot): + s.append(s.pop(0)+12) + if s[0] > 12: + for i,v in enumerate(s): + s[i] = v-12 + self.scaleList=tuple(s) + s_roted = 1 + break + + if not c_roted and not s_roted: + warning("The slash chord note '%s' not in " + "chord or scale." % slash) + + elif not c_roted: + warning("The slash chord note '%s' not in " + "chord '%s'" % (slash, name)) + + elif not s_roted: # Probably will never happen :) + warning("The slash chord note '%s' not in " + "scale for the chord '%s'" % (slash, name)) + + + def reset(self): + """ Restores notes array to original, undoes mangling. """ + + self.noteList = list(self.bnoteList[:]) + self.noteListLen = len(self.noteList) + + + def invert(self, n): + """ Apply an inversion to a chord. + + This does not reorder any notes, which means that the root note of + the chord reminds in postion 0. We just find that highest/lowest + notes in the chord and adjust their octave. + + NOTE: Done on the existing list of notes. Returns None. + """ + + if n: + c=self.noteList[:] + + while n>0: # Rotate up by adding 12 to lowest note + n -= 1 + c[c.index(min(c))]+=12 + + while n<0: # Rotate down, subtract 12 from highest note + n += 1 + c[c.index(max(c))]-=12 + + self.noteList = c + + return None + + + + def compress(self): + """ Compress a chord to one ocatve. + + + Get max permitted value. This is the lowest note + plus 12. Note: use the unmodifed value bnoteList! + """ + + mx = self.bnoteList[0] + 12 + c=[] + + for i, n in enumerate(self.noteList): + if n > mx: + n -= 12 + c.append(n) + + self.noteList = c + + return None + + + + def limit(self, n): + """ Limit the number of notes in a chord. """ + + if n < self.noteListLen: + self.noteList = self.noteList[:n] + self.noteListLen = len(self.noteList) + + return None + + + def center1(self, lastChord): + """ Descriptive comment needed here!!!! """ + + def minDistToLast(x, lastChord): + dist=99 + for j in range(len(lastChord)): + if abs(x-lastChord[j])0): + return 1 + elif (x<0): + return -1 + else: + return 0 + + # Only change what needs to be changed compared to the last chord + # (leave notes where they are if they are in the new chord as well). + + if lastChord: + ch=self.noteList + + for i in range(len(ch)): + + # minimize distance to last chord + + oldDist = minDistToLast(ch[i], lastChord) + while abs(minDistToLast(ch[i] - sign(oldDist)*12, + lastChord)) < abs(oldDist): + ch[i] -= 12* sign(oldDist) + oldDist = minDistToLast(ch[i], lastChord) + + return None + + def center2(self, centerNote, noteRange): + """ Need COMMENT """ + + ch=self.noteList + for i,v in enumerate(ch): + + dist = v - centerNote + if dist < -noteRange: + ch[i] = v + 12 * ( abs(dist) / 12+1 ) + if dist > noteRange: + ch[i] = v - 12 * ( abs(dist) / 12+1 ) + + + return None + + +######## End of Chord class ##### + + + +def docs(): + """ Print out a list of chord names and docs in LaTex. """ + + import copy + + # Just in case someone else wants to use _chords, work on a copy + + chords=copy.copy(_chords) + + for n in sorted(chords.keys()): + nm=n.replace("#", '$\\sharp$') + nm=nm.replace('b', '$\\flat$') + print "\\insline{%s}{%s}" % (nm, chords[n][2]) + + + diff --git a/mma/MMA/chordtable.py b/mma/MMA/chordtable.py new file mode 100644 index 0000000..9bfe5c1 --- /dev/null +++ b/mma/MMA/chordtable.py @@ -0,0 +1,321 @@ + +# chordtable.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + + + +Table of chords. All are based on a C scale. +Generating chords is easy in MIDI since we just need to +add/subtract constants, based on yet another table. + +CAUTION, if you add to this table make sure there are at least +3 notes in each chord! Don't make any chord longer than 8 notes +(The pattern define sets volumes for only 8). + +There is a corresponding scale set for each chord. These are +used by bass and scale patterns. + +Each chord needs an English doc string. This is extracted by the +-Dn option to print a table of chordnames for inclusion in the +reference manual. + +""" + +C = 0 +Cs = Db = 1 +D = 2 +Ds = Eb = 3 +E = Fb = 4 +Es = F = 5 +Fs = Gb = 6 +G = 7 +Gs = Ab = 8 +A = Bbb= 9 +As = Bb = 10 +B = Cb = 11 + +_chords = { + 'M': ((C, E, G ), + (C, D, E, F, G, A, B), + "Major triad. This is the default and is used in " + "the absense of any other chord type specification."), + + 'm': ((C, Eb, G ), + (C, D, Eb, F, G, Ab, Bb), + "Minor triad."), + + 'mb5': ((C, Eb, Gb ), + (C, D, Eb, F, Gb, Ab, Bb), + "Minor triad with flat 5th."), + + 'm#5': ((C, Eb, Gs ), + (C, D, Eb, F, Gs, Ab, Bb), + "Major triad with augmented 5th."), + + 'm6': ((C, Eb, G, A ), + (C, D, Eb, F, G, A, Bb), + "Minor 6th."), + + 'm6(add9)': ((C, Eb, G, D+12, A+12), + (C, D, Eb, F, G, A, B), + "Minor 6th with added 9th. This is sometimes notated as a slash chord " + "in the form ``m6/9''." ), + + 'm7': ((C, Eb, G, Bb ), + (C, D, Eb, F, G, Ab, Bb), + "Minor 7th."), + + 'mM7': ((C, Eb, G, B ), + (C, D, Eb, F, G, Ab, B), + "Minor Triad plus Major 7th. You will also see this printed " + "as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' " + "(which \mma\ accepts); as well as the \mma\ \emph{invalid} " + "forms: ``-($\Delta$7)'', and ``min$\\natural$7''."), + + 'm7b5': ((C, Eb, Gb, Bb ), + (C, D, Eb, F, Gb, Ab, Bb), + "Minor 7th, flat 5 (aka 1/2 diminished). "), + + 'm7b9': ((C, Eb, G, Bb, Db+12 ), + (C, Db, Eb, F, G, Ab, Bb), + "Minor 7th with added flat 9th."), + + '7': ((C, E, G, Bb ), + (C, D, E, F, G, A, Bb), + "Dominant 7th."), + + '7#5': ((C, E, Gs, Bb ), + (C, D, E, F, Gs, A, Bb), + "7th, sharp 5."), + + '7b5': ((C, E, Gb, Bb ), + (C, D, E, F, Gb, A, Bb), + "7th, flat 5."), + + 'dim7': ((C, Eb, Gb, Bbb ), + (C, D, Eb, F, Gb, Ab, Bbb ), # missing 8th note + "Diminished seventh."), + + 'aug': ((C, E, Gs ), + (C, D, E, F, Gs, A, B ), + "Augmented triad."), + + '6': ((C, E, G, A ), + (C, D, E, F, G, A, B), + "Major tiad with added 6th."), + + '6(add9)': ((C, E, G, D+12, A+12), + (C, D, E, F, G, A, B), + "6th with added 9th. This is sometimes notated as a slash chord " + "in the form ``6/9''."), + + 'M7': ((C, E, G, B), + (C, D, E, F, G, A, B), + "Major 7th."), + + 'M7#5': ((C, E, Gs, B), + (C, D, E, F, Gs, A, B), + "Major 7th with sharp 5th."), + + 'M7b5': ((C, E, Gb, B ), + (C, D, E, F, Gb, A, B ), + "Major 7th with a flat 5th."), + + '9': ((C, E, G, Bb, D+12 ), + (C, D, E, F, G, A, Bb), + "Dominant 7th plus 9th."), + + 'sus9': ((C, E, G, D+12), + (C, D, E, F, G, A, D+12), + "Dominant 7th plus 9th, omit 7th."), + + '9b5': ((C, E, Gb, Bb, D+12 ), + (C, D, E, F, Gb, A, Bb), + "Dominant 7th plus 9th with flat 5th."), + + 'm9': ((C, Eb, G, Bb, D+12 ), + (C, D, Eb, F, G, Ab, Bb), + "Minor triad plus 7th and 9th."), + + 'm9b5': ((C, Eb, Gb, Bb, D+12 ), + (C, D, Eb, F, Gb, Ab, Bb), + "Minor triad, flat 5, plus 7th and 9th."), + + 'm(sus9)':((C, Eb, G, D+12 ), + (C, D, Eb, F, G, Ab, D+12), + "Minor triad plus 9th (no 7th)."), + + 'M9': ((C, E, G, B, D+12 ), + (C, D, E, F, G, A, B), + "Major 7th plus 9th."), + + '7b9': ((C, E, G, Bb, Db+12 ), + (C, Db, E, F, G, A, Bb), + "Dominant 7th with flat 9th."), + + '7#9': ((C, E, G, Bb, Ds+12 ), + (C, Ds, E, F, G, A, Bb), + "Dominant 7th with sharp 9th."), + + '7b5b9':((C, E, Gb, Bb, Db+12 ), + (C, Db, E, F, Gb, A, Bb), + "Dominant 7th with flat 5th and flat 9th."), + + '7b5#9':((C, E, Gb, Bb, Ds+12 ), + (C, Ds, E, F, Gb, A, Bb), + "Dominant 7th with flat 5th and sharp 9th."), + + '7#5#9':((C, E, Gs, Bb, Ds+12 ), + (C, Ds, E, F, Gs, A, Bb), + "Dominant 7th with sharp 5th and sharp 9th."), + + '7#5b9':((C, E, Gs, Bb, Db+12 ), + (C, Db, E, F, Gs, A, Bb), + "Dominant 7th with sharp 5th and flat 9th."), + + 'aug7': ((C, E, Gs, Bb ), + (C, D, E, F, Gs, A, Bb), + "An augmented chord (raised 5th) with a dominant 7th."), + + 'aug7b9':((C, E, Gs, Bb, Db+12 ), + (C, Db, E, F, Gs, A, Bb), + "Augmented 7th with flat 5th and sharp 9th."), + + '11': ((C, E, G, Bb, D+12, F+12 ), + (C, D, E, F, G, A, Bb), + "9th chord plus 11th."), + + 'm11': ((C, Eb, G, Bb, D+12, F+12 ), + (C, D, Eb, F, G, Ab, Bb), + "9th with minor 3rd, plus 11th."), + + '11b9': ((C, E, G, Bb, Db+12, F+12 ), + (C, Db, E, F, G, A, Bb), + "9th chord plus flat 11th."), + + '9#5': ((C, E, Gs, Bb, D+12 ), + (C, D, E, F, Gs, A, Bb), + "Dominant 7th plus 9th with sharp 5th."), + + '9#11': ((C, E, G, Bb, D+12, Fs+12 ), + (C, D, E, Fs, G, A, Bb), + "Dominant 7th plus 9th and sharp 11th."), + + '7#9#11':((C, E, G, Bb, Ds+12, Fs+12 ), + (C, Ds, E, Fs, G, A, Bb), + "Dominant 7th plus sharp 9th and sharp 11th."), + + + 'M7#11':((C, E, G, B, D+12, Fs+12 ), + (C, D, E, Fs, G, A, B), + "Major 7th plus 9th and sharp 11th."), + + # Sus chords. Not sure what to do with the associated scales. For + # now just duplicating the 2nd or 3rd in the scale seems to make sense. + + 'sus4': ((C, F, G ), + (C, D, F, F, G, A, B), + "Suspended 4th, major triad with 3rd raised half tone."), + + '7sus': ((C, F, G, Bb ), + (C, D, F, F, G, A, Bb), + "7th with suspended 4th, dominant 7th with 3rd " + "raised half tone."), + + 'sus2': ((C, D, G ), + (C, D, D, F, G, A, B), + "Suspended 2nd, major triad with major 2nd above " + "root substituted for 3rd."), + + '7sus2':((C, D, G, Bb ), + (C, D, D, F, G, A, Bb), + "A sus2 with dominant 7th added."), + + # these two chords should probably NOT have the 5th included, + # but since a number of voicings depend on the 5th being + # the third note of the chord, they're here. + + '13': ((C, E, G, Bb, A+12), + (C, D, E, F, G, A, Bb), + "Dominant 7th (including 5th) plus 13th."), + + 'M13': ((C, E, G, B, A+12), + (C, D, E, F, G, A, B), + "Major 7th (including 5th) plus 13th."), + + # Because some patterns assume that the 3rd note in a chord is a 5th, + # or a varient, we duplicate the root into the position of the 3rd ... and + # to make the sound even we duplicate the 5th into the 4th position as well. + + '5': ((C, C, G, G ), + (C, D, E, F, G, A, B), + "Altered Fifth or Power Chord; root and 5th only."), +} + + +""" Extend our table with common synomyns. These are real copies, +not pointers. This is done so that a user redefine only affects +the original. +""" + +aliases = ( + ('aug9', '9#5' , ''), + ('69', '6(add9)', ''), + ('m69', 'm6(add9)', ''), + ('9+5', '9#5' , ''), + ('m+5', 'm#5' , ''), + ('M6', '6' , ''), + ('m7-5', 'm7b5' , ''), + ('+', 'aug' , ''), + ('+7', 'aug7' , ''), + ('#5', 'aug' , ''), + ('7-9', '7b9' , ''), + ('7+9', '7#9' , ''), + ('maj7', 'M7' , ''), + ('M7-5', 'M7b5' , ''), + ('M7+5', 'M7#5' , ''), + ('7alt', '7b5b9', ''), + ('7sus4', '7sus' , ''), + ('7#11', '9#11' , ''), + ('7+', 'aug7' , ''), + ('7+5', '7#5' , ''), + ('7-5', '7b5' , ''), + ('sus', 'sus4' , ''), + ('m(maj7)', 'mM7' , ''), + ('m+7', 'mM7' , ''), + ('min(maj7)','mM7' , ''), + ('min#7', 'mM7' , ''), + ('m#7', 'mM7' , ''), + ('dim', 'dim7' , 'A dim7, not a triad!'), + ('9sus', 'sus9' , ''), + ('9-5', '9b5' , ''), + ('dim3', 'mb5' , 'Diminished triad (non-standard notation).') + ) + +for a,b,d in aliases: + n=_chords[b][0] + s=_chords[b][1] + if not d: + d=_chords[b][2] + + _chords[a] = (n, s, d) + diff --git a/mma/MMA/common.py b/mma/MMA/common.py new file mode 100644 index 0000000..54e8c2f --- /dev/null +++ b/mma/MMA/common.py @@ -0,0 +1,173 @@ + +# common.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + + +These are a collection of miscellaneous routines used in various +parts of MMA. It is safe to load the whole works with: + + from MMA.common import * + +without side effects (yeah, right). + +""" + +from random import randrange +import sys + +import gbl + + +class struct: + pass + +def error(msg): + """ Print an error message and exit. + + If the global line number is >=0 then print the line number + as well. + """ + + ln = "" + if gbl.lineno >= 0: + ln += "" % gbl.lineno + + if gbl.inpath: + ln += "" % gbl.inpath.fname + + if ln: + ln += '\n' + + print "ERROR:%s %s" % (ln, msg) + + sys.exit(1) + + +def warning(msg): + """ Print warning message and return. """ + + + if gbl.noWarn: + return + + ln = "" + + if gbl.lineno >= 0: + ln = "" % gbl.lineno + + if gbl.inpath: + ln += "" % gbl.inpath.fname + + print "Warning:%s\n %s" % (ln, msg) + + + +def getOffset(ticks, ran=None): + """ Calculate a midi offset into a song. + + ticks == offset into the current bar. + ran == random adjustment from RTIME + + When calculating the random factor the test ensures + that a note never starts before the start of the bar. + This is important ... voice changes, etc. will be + buggered if we put the voice change after the first + note-on event. + """ + + p = gbl.tickOffset + int(ticks) # int() cast is important! + + if ran: + r = randrange( -ran, ran+1 ) + if ticks == 0 and r < 0: + r=0 + p+=r + + return p + + + +def stoi(s, errmsg=None): + """ string to integer. """ + + try: + return int(s, 0) + except: + if errmsg: + error(errmsg) + else: + error("Expecting integer value, not %s" % s) + + +def stof(s, errmsg=None): + """ String to floating point. """ + + try: + return float(s) + except: + if errmsg: + error(errmsg) + else: + error("Expecting a value, not %s" % s) + + + + +def printList(l): + """ Print each item in a list. Works for numeric and string.""" + + for a in l: + print a, + print + + + +def pextract(s, open, close, onlyone=None): + """ Extract a parenthesized set of substrings. + + s - original string + open - substring start tag \ can be multiple character + close - substring end tag / strings (ie. "<<" or "-->") + onlyone - optional, if set only the first set is extracted + + returns ( original sans subs, [subs, ...] ) + + eg: pextract( "x{123}{666}y", '{', '}' ) + Returns: ( 'xy', [ '123', '666' ] ) + + """ + + subs =[] + while 1: + lstart = s.find(open) + lend = s.find(close) + + if lstart>-1 and lstart < lend: + subs.append( s[lstart+len(open):lend].strip() ) + s = s[:lstart] + s[lend+len(close):] + if onlyone: + break + else: + break + + return s.strip(), subs + diff --git a/mma/MMA/docs.py b/mma/MMA/docs.py new file mode 100644 index 0000000..42f73e5 --- /dev/null +++ b/mma/MMA/docs.py @@ -0,0 +1,219 @@ + +# docs.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import os +import time + +import gbl +from MMA.common import * +import MMA.midiC + + +def docDrumNames(order): + """ Print LaTex table of drum names. """ + + notenames = ['E\\flat', 'E', 'F', 'G\\flat', 'G', 'A\\flat', + 'A', 'B\\flat', 'B', 'C', 'D\\flat', 'D'] * 5 + + n=zip( MMA.midiC.drumNames, range(27,len(MMA.midiC.drumNames)+27), notenames ) + + if order == "a": + for a,v,m in sorted(n): + print "\\insline{%s} {%s$^{%s}$}" % (a, v, m ) + + else: + for a,v,m in n: + print "\\insline{%s} {%s$^{%s}$}" % (v, a, m) + +def docCtrlNames(order): + """ Print LaTex table of MIDI controller names. """ + + n=zip( MMA.midiC.ctrlNames, range(len(MMA.midiC.ctrlNames)) ) + + if order == "a": + for a,v in sorted(n): + print "\\insline{%s} {%02x}" % (a, v) + + else: + for a,v in n: + print "\\insline{%02x} {%s}" % (v, a) + +def docInstNames(order): + """ Print LaTex table of instrument names. """ + + n=zip( MMA.midiC.voiceNames, range(len(MMA.midiC.voiceNames)) ) + if order == "a": + for a,v in sorted(n): + a=a.replace('&', '\&') + print "\\insline{%s} {%s}" % (a, v) + + else: + for a,v in n: + a=a.replace('&', '\&') + print "\\insline{%s} {%s}" % (v, a) + + +""" Whenever MMA encounters a DOC command, or if it defines +a groove with DEFGROOVE it calls the docAdd() function. + +The saved docs are printed to stdout with the docDump() command. +This is called whenever parse() encounters an EOF. + +Both routines are ignored if the -Dx command line option has +not been set. + +Storage is done is in the following arrays. +""" + +fname = '' +author="" +notes="" +defs=[] + +def docAuthor(ln): + global author + + author = ' '.join(ln) + + +def docNote(ln): + """ Add a doc line. """ + + global fname, notes + + if not gbl.docs or not ln: + return + + # Grab the arg and data, save it + + fname = os.path.basename(gbl.inpath.fname) + if notes: + notes += ' ' + notes += ' '.join(ln) + + +def docDefine(ln): + """ Save a DEFGROOVE comment string. + + Entries are stored as a list. Each item in the list is + complete groove def looking like: + defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...] + + """ + + global defs + + l = [ ln[0], gbl.seqSize, ' '.join(ln[1:]) ] + for a in sorted(gbl.tnames.keys()): + c=gbl.tnames[a] + if c.sequence and len(c.sequence) != c.sequence.count(None): + if c.vtype=='DRUM': + v=MMA.midiC.valueToDrum(c.toneList[0]) + else: + v=MMA.midiC.valueToInst(c.voice[0]) + l.append( [c.name, v ] ) + + defs.append(l) + +def docDump(): + """ Print the LaTex docs. """ + + global fname, author, notes, defs + + if gbl.docs == 1: # latex docs + if notes: + if fname.endswith(gbl.ext): + fname='.'.join(fname.split('.')[:-1]) + print "\\filehead{%s}{%s}" % (totex(fname), totex(notes)) + print + + if defs: + for l in defs: + print " \\instable{%s}{%s}{%s}{" % \ + (totex(l[0]), totex(l[2]), l[1] ) + for c,v in l[3:]: + print " \\insline{%s}{%s}" % (c.title(), totex(v)) + print " }" + + if gbl.docs == 2: # html docs + if notes: + print '' % time.ctime() + print '' + print '' + if fname.endswith(gbl.ext): + fname='.'.join(fname.split('.')[:-1]) + print "

%s

" % fname.title() + print "

%s" % notes + if defs: + print "

    " + for l in defs: + print "
  • %s" % (l[0], l[0]) + print "
" + for l in defs: + print '' % l[0] + print '

' + print '' + print ' ' + print ' ' + print '
' + print '

%s

' % l[0] + print ' %s (%s) ' % ( l[2], l[1] ) + print '
' + print ' ' + for c,v in l[3:]: + print " " % (c.title(), v) + print '
%s %s
' + print '
' + print + print '' + defs = [] + notes = "" + author = "" + + + +def totex(s): + """ Parse a string and quote tex stuff. + + Also handles proper quotation style. + """ + + s = s.replace("$", "\\$") + s = s.replace("*", "$*$") + s = s.replace("\\", "\\\\") + s = s.replace("#", "\\#") + s = s.replace("&", "\\&") + + q="``" + while s.count('"'): + i=s.find('"') + s=s[:i] + q + s[i+1:] + if q=="``": + q="''" + else: + a="``" + + + return s diff --git a/mma/MMA/file.py b/mma/MMA/file.py new file mode 100644 index 0000000..bac7967 --- /dev/null +++ b/mma/MMA/file.py @@ -0,0 +1,312 @@ + +# file.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + +import sys +import os + +import gbl +from MMA.common import * + +def locFile(name, lib): + """ Locate a filename. + + This checks, in order: + lib/name + .mma + lib/name + name + .mma + name + """ + + ext=gbl.ext + exists = os.path.exists + + name=os.path.expanduser(name) # for ~ expansion only + + if lib: + if not name.endswith(ext): + t=os.path.join(lib, name + ext) + if exists(t): + return t + t=os.path.join(lib, name) + if exists(t): + return t + + if not name.endswith(ext): + t = name + ext + if exists(t): + return t + + if exists(name): + return name + + return None + + +########################### +# File read class +########################### + + +class ReadFile: + + class FileData: + """ After reading the file in bulk it is parsed and stored in this + data structure. Blanks lines and comments are removed. + """ + + def __init__(self, lnum, data, label): + self.lnum=lnum + self.data=data + self.label=label + + + def __init__(self, fname): + + self.fdata=fdata=[] + self.lastline = None + self.lineptr = None + self.fname = None + + self.que = [] # que for pushed lines (mainly for REPEAT) + self.qnums = [] + + + dataStore = self.FileData # shortcut to avoid '.'s + + try: + inpath = file(fname, 'r') + + except: + error("Unable to open '%s' for input" % fname) + + if gbl.debug or gbl.showFilenames: + print "Opening file '%s'." % fname + + self.fname = fname + + """ Read entire file, line by line: + + - strip off blanks, comments + - join continuation lines + - parse out LABELS + - create line numbers + """ + + lcount=0 + label='' + labs=[] # track label defs, error if duplicate in same file + nlabs=[] # track linenumber label defs + + while 1: + l = inpath.readline() + + if not l: # EOF + break + + l= l.strip() + lcount += 1 + + if not l: + continue + + while l[-1] == '\\': + l = l[0:-1] + ' ' + inpath.readline().strip() + lcount +=1 + + + """ This next line splits the line at the first found + comment '//', drops the comment, and splits the + remaining line into tokens using whitespace delimiters. + Note that split() will strip off trailing and leading + spaces, so a strip() is not needed here. + """ + + l = l.split('//',1)[0].split() + + if not l: + continue + + + """ Parse out label lines. There are 2 different kinds of labels: + - LABEL XXX + and + - NNN + + The first kind is treated as an exclusive. If a NNN label or previous + XXX duplicates, and error is generated. + + The LINE NUMBER type is not exclusive. If a duplicate NNN is found, the + last one is used. + + XXX NNN types can not duplicate each other. + + Also note that XXX lines are stripped from input as well as NNN lines + with only a NNN. + """ + + + if l[0].upper()=='LABEL': + if len(l) !=2: + gbl.lineno = lcount + error("Usage: LABEL ") + label=l[1].upper() + if label[0]=='$': + gbl.lineno = lcount + error("Variables are not permitted as labels") + if label in labs: + gbl.lineno = lcount + error("Duplicate label specified in line %s." % lcount) + elif label in nlabs: + gbl.lineno = lcount + error("Label '%s' duplicates line number label" % label) + labs.append(label) + + elif l[0].isdigit(): + label=l[0] + + if label in labs: + gbl.lineno = lcount + error("Line number '%s' duplicates LABEL." % label) + + if not label in nlabs: + nlabs.append(label) + else: + for i, a in enumerate(fdata): + if a.label == label: + fdata[i].label='' + + else: + label = None + + # Save the line, linenumber and (maybe) the label. + + fdata.append( dataStore(lcount, l, label)) + + + inpath.close() + + self.lineptr = 0 + self.lastline = len(fdata) + + + def toEof(self): + """ Move pointer to End of File. """ + + self.lineptr=self.lastline+1 + self.que = [] + self.qnums = [] + + + def goto(self, l): + """ Do a goto jump. + + This isn't perfect, but is probably the way most GOTOs work. If + inside a repeat/if then nothing more is processed. The jump is + immediate. Of course, you'll run into problems with missing + repeat/repeatend if you try it. Since all repeats are stacked + back into the que, we just delete the que. Then we look for a + matching label in the file line array. + + Label search is linear. Not too efficient, but the lists + will probably never be that long either. + + """ + + if not l: + error("No label specified") + + if self.que: + self.que=[] + + for i,a in enumerate(self.fdata): + if a.label == l: + self.lineptr=i + return + + error("Label '%s' has not be set." % l) + + + def push(self, q, nums): + """ Push a list of lines back into the input stream. + + Note: This is a list of semi-processed lines, no comments, etc. + + It's quicker to extend a list than to insert, so add to the end. + Note: we reverse the original, extend() then reverse again, just + in case the caller cares. + + nums is a list of linenumbers. Needed to report error lines. + """ + + if not self.que: + self.que = [''] + self.qnums=[gbl.lineno] + + + q.reverse() + self.que.extend(q) + q.reverse() + + nums.reverse() + self.qnums.extend(nums) + nums.reverse() + + def read(self): + """ Return a line. + + This will return either a queued line or a line from the + file (which was stored/processed earlier). + """ + + while 1: + + # Return a queued line if possible. + + if self.que: + ln = self.que.pop(-1) + + gbl.lineno = self.qnums.pop() + + if not ln: + continue + + return ln + + + # Return the next line in the file. + + + if self.lineptr>=self.lastline: + return None #### EOF + + + ln=self.fdata[self.lineptr].data + gbl.lineno = self.fdata[self.lineptr].lnum + self.lineptr +=1 + + return ln + + diff --git a/mma/MMA/gbl.py b/mma/MMA/gbl.py new file mode 100644 index 0000000..53faa4d --- /dev/null +++ b/mma/MMA/gbl.py @@ -0,0 +1,169 @@ +# globals.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import os + +version = "1.0-rc2" # Version -- Oct 15/2006 + +""" mtrks is storage for the MIDI data as it is created. + It is a dict of class Mtrk() instances. Keys are the + midi channel numbers. Ie, mtrks[2] is for channel 2, + etc. mtrks[0] is for the meta stuff. +""" + +mtrks = {} + +""" tnames is a dict of assigned track names. The keys are + the track names; each entry is a pattern class instance. + We have tnames['BASS-FOO'], etc. +""" + +tnames = {} + +""" midiAssigns keeps track of channel/track assignments. The keys + are midi channels (1..16), the data is a list of tracks assigned + to each channel. The tracks are only added, not deleted. Right + now this is only used in -c reporting. +""" + +midiAssigns={} +for c in range(0,17): + midiAssigns[c]=[] + +""" midiAvail is a list with each entry representing a MIDI channel. + As channels are allocated/deallocated the appropriated slot + is inc/decremented. +""" + +midiAvail=[ 0 ] * 17 # slots 0..16, slot 0 is not used. + +deletedTracks = [] # list of deleted tracks for -c report + +""" This is a user constructed list of names/channels. The keys + are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9 +""" + +midiChPrefs={} + + + +""" Groove storage. Each entry in settingsGroove{} has a keyname + of a saved groove. + + lastGroove and currentGroove are used by macros +""" + +settingsGroove = {} +lastGroove = '' +currentGroove = '' + + +""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x): + 0 - not set + 1 - set + 2 - set for specific tracks, track list starts at position [1] +""" + +seqRnd = [0] # set if SEQRND has been set + + +############# String constants #################### + + +ext = ".mma" # extension for song/lib files. + + +############## Tempo, and other midi positioning. ############# + + +BperQ = 192 # midi ticks per quarter note +QperBar = 4 # Beats/bar, set with TIME +tickOffset = 0 # offset of current bar in ticks +tempo = 120 # current tempo +seqSize = 1 # variation sequence table size +seqCount = 0 # running count of variation + +transpose = 0 # Transpose is global (ignored by drum tracks) + +lineno = -1 # used for error reporting + +swingMode = 0 # defaults to 0, set to 1 for swing mode +swingSkew = None # this is just for $_SwingMode macro + +barNum = 0 # Current line number + +############# Path and search variables. ############# + + +libPath = '' +for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"): + if os.path.isdir(p): + libPath=p + break + +incPath = '' +for p in ( "c:\\mma\\includes", "/usr/local/share/mma/includes", + "/usr/share/mma/includes", "./includes"): + if os.path.isdir(p): + incPath=p + break + +autoLib = 'stdlib' + +outPath = '' # Directory for MIDI file +mmaStart = [] # list of START files +mmaEnd = [] # list of END files +mmaRC = None # user specified RC file, overrides defaults +inpath = None # input file + +midiFileType = 1 # type 1 file, SMF command can change to 0 +runningStatus = 1 # running status enabled + + +############# Options. ############# + + +""" These variables are all set from the command line in MMA.opts.py. + It's a bit of an easy-way-out to have them all here, but I don't think + it hurts too much. +""" + +debug = Ldebug = 0 +pshow = Lpshow = 0 +seqshow = Lseqshow = 0 +showrun = Lshowrun = 0 +noWarn = LnoWarn = 0 +noOutput = LnoOutput = 0 +showExpand = LshowExpand = 0 +showFilenames = LshowFilenames = 0 +chshow = Lchshow = 0 + +outfile = None +infile = None +docs = 0 +maxBars = 500 +makeGrvDefs = 0 +cmdSMF = None + + diff --git a/mma/MMA/harmony.py b/mma/MMA/harmony.py new file mode 100644 index 0000000..90aa450 --- /dev/null +++ b/mma/MMA/harmony.py @@ -0,0 +1,138 @@ + +# harmony.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + + +from MMA.common import * + + +def harmonize(hmode, note, chord): + """ Get harmony note(s) for given chord. """ + + hnotes = [] + + for tp in hmode.split('+'): + + if tp in ('2', '2BELOW'): + hnotes.append( gethnote(note, chord) ) + + elif tp == '2ABOVE': + hnotes.append( gethnote(note, chord)+12 ) + + elif tp in ( '3', '3BELOW'): + a = gethnote(note, chord) + b = gethnote(a, chord) + hnotes.extend( [a, b] ) + + elif tp == '3ABOVE': + a = gethnote(note, chord) + b = gethnote(a, chord) + hnotes.extend( [a+12, b+12] ) + + elif tp in ('OPEN', "OPENBELOW"): + a=gethnote(note, chord) + hnotes.append( gethnote(a, chord)) + + elif tp == 'OPENABOVE': + a=gethnote(note, chord) + hnotes.append( gethnote(a, chord) + 12 ) + + elif tp in ('8', '8BELOW'): + hnotes.append( note - 12 ) + + elif tp == '8ABOVE': + hnotes.append( note + 12 ) + + elif tp in ('16', '16BELOW'): + hnotes.append( note - (2 * 12) ) + + elif tp == '16ABOVE': + hnotes.append( note + (2 * 12) ) + + elif tp in ('24', '24BELOW'): + hnotes.append( note - (3 * 12) ) + + elif tp == '24ABOVE': + hnotes.append( note + (3 * 12) ) + else: + error("Unknown harmony type '%s'." % tp) + + """ Strip out duplicate notes from harmony list. Cute trick here, + we use the note values as keys for a new dictionary, assign + a null value, and return the list of keys. + """ + + return dict([(i, None) for i in hnotes]).keys() + + +def gethnote(note, chord): + """ Determine harmony notes for a note based on the chord. + + note - midi value of the note + + chord - list of midi values for the chord + + + This routine works by creating a chord list with all + its notes having a value less than the note (remember, this + is all MIDI values). We then grab notes from the end of + the chord until one is found which is less than the original + note. + """ + + wm="No harmony note found since no chord, using note " + \ + "0 which will sound bad." + + + if not chord: # should never happen! + warning(wm) + return 0 + + ch = list(chord) # copy chord and sort + ch.sort() + + # ensure that the note is in the chord + + while ch[-1] < note: + for i,n in enumerate(ch): + ch[i]+=12 + + while ch[0] >= note: + for i,v in enumerate(ch): + ch[i]-=12 + + # get one lower than the note + + while 1: + if not ch: # this probably can't happen + warning(wm) + return 0 + + h=ch.pop() + if h + +""" + +import gbl +from MMA.common import * + + +class Lyric: + + textev = None # set if TEXT EVENTS (not recommended) + barsplit = None # set if lyrics NOT split into sep. events for bar + versenum = 1 # current verse number of lyric + dupchords = 0 # set if we want chords as lyric events + transpose = 0 # tranpose chord names (for dupchords only) + + pushedLyrics = [] + + transNames = ( ('C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'), + ('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B')) + + transKey = 0 # 0==flat, 1=sharp + + chordnames={ + 'B#': 0, 'C' : 0, 'C#': 1, 'Db': 1, + 'D' : 2, 'D#': 3, 'Eb': 3, 'E' : 4, + 'Fb': 4, 'E#': 5, 'F' : 5, 'F#': 6, + 'Gb': 6, 'G' : 7, 'G#': 8, 'Ab': 8, + 'A' : 9, 'A#': 10,'Bb': 10,'B' : 11, + 'Cb':11 } + + + def __init__(self): + pass + + + def setting(self): + """ Called from macro. """ + + a="Event=" + + if self.textev: a+="Text" + else: a+="Lyric" + + a+=" Split=" + if self.barsplit: a+="Bar" + else: a+="Normal" + + a += " Verse=%s" % self.versenum + + a += " Chords=" + if self.dupchords: a+="On" + else: a+="Off" + + a += " Transpose=%s" % self.transpose + + a += " CNames=" + if self.transKey: a+="Sharp" + else: a+="Flat" + + return a + + + def option(self, ln): + """ Set a lyric option. """ + + for i, l in enumerate(ln): + l=l.upper() + + # Single word options + + if l.upper()=="SET": + + if i>=len(ln): + s='' + else: + s=' '.join(ln[i+1:]).strip() + + if not s.startswith('['): + s = '[' + s + ']' + + self.pushedLyrics.append(s) + + break + + + # All the rest are OPT=VALUE pairs + + try: + a,v = l.split('=') + except: + error("Lyric options must be in CMD=VALUE pairs.") + + + if a == 'EVENT': + if v == 'TEXT': + self.textev = 1 + warning ("Lyric: Placing lyrics as TEXT EVENTS is not recommended.") + + elif v == 'LYRIC': + self.textev = None + if gbl.debug: + print "Lyric: lyrics set as LYRIC events." + + else: + error("Valid options for Lyric Event are TEXT or LYRIC.") + + + elif a == 'SPLIT': + if v == 'BAR': + self.barsplit = 1 + if gbl.debug: + print "Lyric: lyrics distributed thoughout bar." + + elif v == 'NORMAL': + self.barsplit = None + if gbl.debug: + print "Lyric: lyrics appear as one per bar." + + else: + error("Valid options for Lyric Split are BAR or NORMAL.") + + + elif a == 'VERSE': + if v.isdigit(): + self.versenum = int(v) + + elif v == 'INC': + self.versenum += 1 + + elif v == 'DEC': + self.versenum -= 1 + + else: + error("Valid options of Lyric Verse are or INC or DEC.") + + if self.versenum < 1: + error("Attempt to set Lyric Verse to %s. Values " + "must be > 0." % self.versenum) + + if gbl.debug: + print "Lyric: verse number set to %s" % self.versenum + + + elif a == 'CHORDS': + if v in ('1', 'ON'): + self.dupchords = 1 + if gbl.debug: + print "Lyric: chords are duplicated as lyrics." + + elif v in ('0', 'OFF'): + self.dupchords = 0 + if gbl.debug: + print "Lyric: chords are NOT duplicated as lyrics." + + else: + error ("Expecting 'ON' or 'OFF' in Lyric directive, not 'CHORDS=%s'" % v) + + elif a == 'TRANSPOSE': + + v = stoi(v, "Lyric Tranpose expecting value, not %s" % v) + + if v < -12 or v > 12: + error("Lyric Tranpose %s out-of-range; must be -12..12." % v) + + self.transpose = v + + elif a == 'CNAMES': + + if v in ('#', 'SHARP'): + self.transKey = 1 + elif v in ('B', '&', 'FLAT'): + self.transKey = 0 + + else: + error("Lyric CNames expecting 'Sharp' or 'Flat', not '%s'" % v ) + + else: + error("Usage: Lyric expecting EVENT, SPLIT, VERSE, CHORDS, TRANSPOSE, CNAMES or SET, " + "not '%s'" % a ) + + + + + + def leftovers(self): + """ Just report leftovers on stack.""" + + if self.pushedLyrics: + warning("Lyrics remaining on stack.") + + + def extract(self, ln, rpt): + """ Extract lyric info from a chord line and place in META track. + + Returns line and lyric as 2 strings. + + The lyric is returned for debugging purposes, but it has been + processed and inserted into the MIDI track. + """ + + a=ln.count('[') + b=ln.count(']') + + if a != b: + error("Mismatched []s for lyrics found in chord line.") + + if self.pushedLyrics: + if a or b: + error("Lyrics not permitted inline and as LYRIC SET") + + + ln = ln + self.pushedLyrics.pop(0) + a=b=1 # flag that we have lyrics, count really doesn't matter + + + if rpt > 1: + if self.dupchords: + error("Chord to lyrics not supported with bar repeat.") + elif a or b: + error("Bars with both repeat count and lyrics are not permitted.") + + + ln, lyrics = pextract(ln, '[', ']') + + + """ If the CHORDS=ON option is set, make a copy of the chords and + insert as lyric. This permits illegal chord lines, but they will + be caught by the parser. + """ + + if self.dupchords: + ly = [] + + for v in ln.split(): + v = v.replace('&', 'b') + if v == 'z': + v = 'N.C.' + if 'z' in v: + v = v.split('z')[0] + while v.startswith('-'): + v=v[1:] + while v.startswith('+'): + v=v[1:] + + if self.transpose: + tr=0 # Needed in case line is invalid! + cn=v[0:2] + if self.chordnames.has_key(cn): + tr=self.chordnames[cn] + self.transpose + + else: + cn=v[0:1] + if self.chordnames.has_key(cn): + tr=self.chordnames[cn] + self.transpose + + while tr>=12: tr-=12 + while tr<=-12: tr+=12 + + if tr: + v = self.transNames[self.transKey][tr] + v[len(cn):] + + + ly.append(v) + + i=gbl.QperBar - len(ly) + if i>0: + ly.extend( ['/'] * i ) + lyrics.insert(0, ' '.join(ly) + '\\r') + + + v=self.versenum + + if len(lyrics) == 1: + v=1 + + if v > len(lyrics): + lyrics = '' + else: + lyrics=lyrics[v-1] + + if not len(lyrics): + return (ln, []) + + lyrics=lyrics.replace('\\r', ' \\r ') + lyrics=lyrics.replace('\\n', ' \\n ') + lyrics=lyrics.replace(' ', ' ') + + if self.barsplit: + lyrics = [lyrics] + else: + lyrics = lyrics.split() + + beat = 0 + bstep = gbl.QperBar / float(len(lyrics)) + + + for t, a in enumerate(lyrics): + a,b = pextract(a, '<', '>', 1) + + if b and b[0]: + beat = stof(b[0], "Expecting value in <%s> in lyric." % b) + if beat < 1 or beat > gbl.QperBar+1: + error("Offset in lyric <> must be 1 to %s." % gbl.QperBar) + beat -= 1 + bstep = (gbl.QperBar-beat)/float((len(lyrics)-t)) + + a = a.replace('\\r', '\r') + a = a.replace('\\n', '\n') + + if a and a != ' ': + if not a.endswith('-'): + a += ' ' + + p=getOffset(beat * gbl.BperQ) + if self.textev: + gbl.mtrks[0].addText(p, a) + else: + gbl.mtrks[0].addLyric(p, a) + + beat += bstep + + return (ln, lyrics) + + +# Create a single instance of the Lyric Class. + +lyric = Lyric() + diff --git a/mma/MMA/macro.py b/mma/MMA/macro.py new file mode 100644 index 0000000..9978c26 --- /dev/null +++ b/mma/MMA/macro.py @@ -0,0 +1,674 @@ + +# macros.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +The macros are stored, set and parsed in this single-instance +class. At the top of MMAparse an instance in created with +something like: macros=MMMmacros.Macros(). +""" + +import gbl +from MMA.common import * +from MMA.notelen import getNoteLen +import MMA.midiC +import MMA.lyric +import MMA.translate +import MMA.patSolo +import MMA.volume +import MMA.notelen + +import random + + +class Macros: + + vars={} # storage + expandMode = 1 # flag for variable expansion + pushstack = [] + + def __init__(self): + + self.vars={} + + def stackValue(self, s): + self.pushstack.append(' '.join(s)) + + + def sysvar(self, s): + """ Create an internal macro. """ + + # Simple/global system values + + if s == 'KEYSIG': + a=MMA.patSolo.keySig.kSig + if a >= 0: + f='#' + else: + f='b' + return "%s%s" % (abs(a), f) + + elif s == 'TIME': + return str(gbl.QperBar) + + elif s == 'TEMPO': + return str(gbl.tempo) + + elif s == 'VOLUME': + return str(int(MMA.volume.volume * 100)) # INT() is important + + elif s == 'VOLUMERATIO': + return str((MMA.volume.vTRatio * 100)) + + elif s == 'LASTVOLUME': + return str(int(MMA.volume.lastVolume * 100)) + + elif s == 'GROOVE': + return gbl.currentGroove + + elif s == 'LASTGROOVE': + return gbl.lastGroove + + elif s == 'SEQRND': + if gbl.seqRnd[0] == 0: return "Off" + if gbl.seqRnd[0] == 1: return "On" + return ' '.join(gbl.seqRnd[1:]) + + elif s == 'SEQSIZE': + return str(gbl.seqSize) + + elif s == 'SWINGMODE': + if gbl.swingMode: + a = "On" + else: + a = "Off" + return "%s Skew=%s" % (a, gbl.swingSkew) + + elif s == 'TRANSPOSE': + return str(gbl.transpose) + + elif s == 'STACKVALUE': + if not self.pushstack: + error( "Empty push/pull variable stack.") + return self.pushstack.pop() + + elif s == 'DEBUG': + return "Debug=%s Filenames=%s Patterns=%s " \ + "Sequence=%s Runtime=%s Warnings=%s Expand=%s" % \ + (gbl.debug, gbl.showFilenames, gbl.pshow, gbl.seqshow, \ + gbl.showrun, int(not gbl.noWarn), gbl.showExpand) + + + elif s == 'LASTDEBUG': + return "Debug=%s Filenames=%s Patterns=%s " \ + "Sequence=%s Runtime=%s Warnings=%s Expand=%s" % \ + (gbl.Ldebug, gbl.LshowFilenames, gbl.Lpshow, gbl.Lseqshow, \ + gbl.Lshowrun, int(not gbl.LnoWarn), gbl.LshowExpand) + + elif s == 'VEXPAND': + if self.expandMode: + return "On" + else: + return "Off" + + elif s == "MIDISPLIT": + return ' '.join([str(x) for x in MMA.midi.splitChannels]) + + elif s == 'SEQRNDWEIGHT': + return ' '.join([str(x) for x in MMA.parse.seqRndWeight]) + + elif s == 'AUTOLIBPATH': + return gbl.autoLib + + elif s == 'LIBPATH': + return gbl.libPath + + elif s == 'INCPATH': + return gbl.incPath + + elif s == 'VOICETR': + return MMA.translate.vtable.retlist() + + elif s == 'TONETR': + return MMA.translate.dtable.retlist() + + elif s == 'OUTPATH': + return gbl.outPath + + elif s == 'BARNUM': + return str(gbl.barNum + 1) + + elif s == 'LINENUM': + return str(gbl.lineno) + + elif s == 'LYRIC': + return MMA.lyric.lyric.setting() + + # Track vars ... these are in format TRACKNAME_VAR + + a=s.rfind('_') + if a==-1: + error("Unknown system variable $_%s" % s) + + tname = s[:a] + func = s[a+1:] + + if gbl.tnames.has_key(tname): + t=gbl.tnames[tname] + else: + error("System variable $_%s refers to nonexistent track." % s) + + + if func == 'ACCENT': + r=[] + for s in t.accent: + r.append("{") + for b,v in s: + r.append(str((b/gbl.BperQ)+1)) + r.append(str(int(v * 100))) + r.append("}") + return ' '.join(r) + + elif func == 'ARTICULATE': + return ' '.join([str(x) for x in t.artic]) + + elif func == 'CHANNEL': + return str(t.channel) + + elif func == 'COMPRESS': + return ' '.join([str(x) for x in t.compress]) + + elif func == 'DIRECTION': + return ' '.join([str(x) for x in t.direction]) + + elif func == 'DUPROOT': + if t.vtype != "CHORD": + error("Only CHORD tracks have DUPROOT") + return ' '.join([str(x) for x in t.dupRoot]) + + elif func == 'HARMONY': + return ' '.join([str(x) for x in t.harmony]) + + elif func == 'HARMONYVOLUME': + return ' '.join([str(int(a * 100)) for a in t.harmonyVolume]) + + elif func == 'INVERT': + return ' '.join([str(x) for x in t.invert]) + + elif func == 'LIMIT': + return str( t.chordLimit ) + + elif func == 'MALLET': + if t.vtype not in ("SOLO", "MELODY"): + error("Mallet only valid in SOLO and MELODY tracks.") + return "Mallet Rate=%i Decay=%i" % (t.mallet, t.malletDecay*100) + + elif func == 'OCTAVE': + return ' '.join([str(a/12) for a in t.octave]) + + elif func == 'RANGE': + return ' '.join([str(x) for x in t.chordRange]) + + elif func == 'RSKIP': + return ' '.join([str(int(a * 100)) for a in t.rSkip]) + + elif func == 'RTIME': + return ' '.join([str(x) for x in t.rTime]) + + elif func == 'RVOLUME': + return ' '.join([str(int(a * 100)) for a in t.rVolume]) + + elif func == 'SEQRND': + if t.seqRnd: return 'On' + else: return 'Off' + + elif func == 'SEQRNDWEIGHT': + return ' '.join([str(x) for x in t.seqRndWeight]) + + elif func == 'SPAN': + return "%s %s" % (t.spanStart, t.spanEnd) + + elif func == 'STRUM': + if t.vtype != "CHORD": + error("Only CHORD tracks have STRUM") + return ' '.join([str(x) for x in t.strum]) + + elif func == 'TONE': + if t.vtype != "DRUM": + error("Only DRUM tracks have TONE") + return ' '.join([MMA.midiC.valueToDrum(a) for a in t.toneList]) + + elif func == 'UNIFY': + return ' '.join([str(x) for x in t.unify]) + + elif func == 'VOICE': + return ' '.join([MMA.midiC.voiceNames[a] for a in t.voice]) + + elif func == 'VOICING': + if t.vtype != 'CHORD': + error("Only CHORD tracks have VOICING") + t=t.voicing + return "Mode=%s Range=%s Center=%s RMove=%s Move=%s Dir=%s" % \ + (t.mode, t.range, t.center, t.random, t.bcount, t.dir) + + elif func == 'VOLUME': + return ' '.join([str(int(a * 100)) for a in t.volume]) + + else: + error("Unknown system track variable %s." % s) + + + + def expand(self, l): + """ Loop though input line and make variable subsitutions. + MMA variables are pretty simple ... any word starting + with a "$xxx" is a variable. + + l - list + + RETURNS: new list with all subs done. + """ + + if not self.expandMode: + return l + + while 1: # Loop until no more subsitutions have been done + sub=0 + for i,s in enumerate(l): + if s[:2] == '$$': + continue + + if s[0]=='$': + s=s[1:].upper() + + if s.startswith('_'): + ex=self.sysvar(s[1:]) + + elif not s in self.vars: + error("User variable '%s' has not been defined." % s ) + + else: + ex=self.vars[s] + + if type(ex) == type([]): # MSET variable + if len(ex): + gbl.inpath.push( ex[1:], [gbl.lineno] * len(ex[1:])) + if len(ex): + ex=ex[0] + else: + ex=[] + else: # regular SET variable + ex=ex.split() + + l=l[:i] + ex + l[i+1:] # ex might be a list, so this is needed + sub=1 + break + + if not sub: + break + + return l + + + def showvars(self, ln): + """ Display all currently defined variables. """ + + if len(ln): + for a in ln: + a=a.upper() + if a in self.vars: + print "$%s: %s" % (a, self.vars[a]) + else: + print "$%s - not defined" % a + + else: + + print "User variables defined:" + kys = self.vars.keys() + kys.sort() + + mx = 0 + + for a in kys: # get longest name + if len(a) > mx: + mx = len(a) + + mx = mx + 2 + + for a in kys: + print " %-*s %s" % (mx, '$'+a, self.vars[a]) + + def getvname(self, v): + """ Helper routine to validate variable name. """ + + if v[0] in ('$', '_'): + error("Variable names cannot start with a '$' or '_'.") + return v.upper() + + def rndvar(self, ln): + """ Set a variable randomly from a list. """ + + if len(ln) < 2: + error("Use: RndSet Variable_Name ") + + v = self.getvname(ln[0]) + + self.vars[v] = random.choice(ln[1:]) + + if gbl.debug: + print "Variable $%s randomly set to '%s'" % (v, self.vars[v]) + + def setvar(self, ln): + """ Set a variable. Not the difference between the next 2 lines: + Set Bar BAR + Set Foo AAA BBB $bar + $Foo == "AAA BBB BAR" + Set Foo AAA + BBB + $bar + $Foo == "AAABBBBAR" + + The "+"s just strip out interveing spaces. + """ + + if len(ln) < 1: + error("Use: SET VARIABLE_NAME [Value] [[+] [Value]]") + + v=self.getvname(ln.pop(0)) + + t='' + addSpace = 0 + for i,a in enumerate(ln): + if a == '+': + addSpace = 0 + continue + else: + if addSpace: + t += ' ' + t += a + addSpace = 1 + + + self.vars[v]=t + + if gbl.debug: + print "Variable $%s == '%s'" % (v, self.vars[v]) + + + def msetvar(self, ln): + """ Set a variable to a number of lines. """ + + if len(ln) !=1: + error("Use: MSET VARIABLE_NAME MsetEnd") + + v=self.getvname(ln[0]) + + lm=[] + + while 1: + l=gbl.inpath.read() + if not l: + error("Reached EOF while looking for MSetEnd") + cmd=l[0].upper() + if cmd in ("MSETEND", 'ENDMSET'): + if len(l) > 1: + error("No arguments permitted for MSetEnd/EndMSet") + else: + break + lm.append(l) + + self.vars[v]=lm + + + def unsetvar(self, ln): + """ Delete a variable reference. """ + + + if len(ln) != 1: + error("Use: UNSET Variable") + v=ln[0].upper() + if v[0] == '_': + error("Internal variables cannot be deleted or modified.") + + if v in self.vars: + del(macros.vars[v]) + + if gbl.debug: + print "Variable '%s' UNSET" % v + else: + warning("Attempt to UNSET nonexistent variable '%s'." % v) + + + def vexpand(self, ln): + + if len(ln) == 1: + cmd = ln[0].upper() + else: + cmd='' + + if cmd == 'ON': + self.expandMode=1 + if gbl.debug: + print "Variable expansion ON" + + elif cmd == 'OFF': + self.expandMode=0 + if gbl.debug: + print "Variable expansion OFF" + + else: + error("Use: Vexpand ON/Off.") + + + def varinc(self, ln): + """ Increment a variable. """ + + if len(ln) == 1: + inc=1 + + elif len(ln) == 2: + inc = stof(ln[1], "Expecting a value (not %s) for Inc." % ln[1]) + + else: + error("Usage: INC Variable [value]") + + v=ln[0].upper() + + if v[0] == '_': + error("Internal variables cannot be modified.") + + if not v in self.vars: + error("Variable '%s' not defined" % v) + + vl=stoi(self.vars[v], "Variable must be a value to increment.") + inc + + if vl == int(vl): + vl = int(vl) + self.vars[v]=str(vl) + + if gbl.debug: + print "Variable '%s' INC to %s" % (v, self.vars[v]) + + + def vardec(self, ln): + """ Decrement a varaiable. """ + + if len(ln) == 1: + dec = 1 + + elif len(ln) == 2: + dec = stof(ln[1], "Expecting a value (not %s) for Inc." % ln[1]) + + else: + error("Usage: DEC Variable [value]") + + v=ln[0].upper() + if v[0] == '_': + error("Internal variables cannot be modified.") + + if not v in self.vars: + error("Variable '%s' not defined" % v) + + vl=stoi(self.vars[v], "Variable must be a value to decrement.") - dec + + if vl == int(vl): + vl = int(vl) + + self.vars[v]=str(vl) + + if gbl.debug: + print "Variable '%s' DEC to %s" % (v, self.vars[v]) + + + def varIF(self, ln): + """ Conditional variable if/then. """ + + def expandV(l): + """ Private func. """ + + l=l.upper() + + if l[:2] == '$$': + l=l[2:] + if not l in self.vars: + error("String Variable '%s' does not exist." % l) + l=self.vars[l] + + try: + v=float(l) + except: + v=None + + return ( l, v ) + + + def readblk(): + """ Private, reads a block until ENDIF, IFEND or ELSE. + Return (Terminator, lines[], linenumbers[] ) + """ + + q=[] + qnum=[] + nesting=0 + + while 1: + l=gbl.inpath.read() + if not l: + error("EOF reached while looking for EndIf") + + cmd=l[0].upper() + if cmd == 'IF': + nesting+=1 + if cmd in ("IFEND", 'ENDIF', 'ELSE'): + if len(l) > 1: + error("No arguments permitted for IfEnd/EndIf/Else") + if not nesting: + break + if cmd != 'ELSE': + nesting -= 1 + + q.append(l) + qnum.append(gbl.lineno) + + return (cmd, q, qnum) + + + if len(ln)<2: + error("Usage: IF ") + + action = ln[0].upper() + + # 1. do the unary options: DEF, NDEF + + if action in ('DEF', 'NDEF'): + if len(ln) != 2: + error("Usage: IF %s VariableName" % action) + + v=ln[1].upper() + retpoint = 2 + + if action == 'DEF': + compare = self.vars.has_key(v) + elif action == 'NDEF': + compare = ( not self.vars.has_key(v)) + else: + error("Unreachable unary conditional") + + + # 2. Binary ops: EQ, NE, etc. + + elif action in ('LT', 'LE', 'EQ', 'GE', 'GT', 'NE'): + if len(ln) != 3: + error("Usage: VARS %s Value1 Value2" % action) + + + s1,v1 = expandV(ln[1]) + s2,v2 = expandV(ln[2]) + + if type(v1) == type(1.0) and type(v2) == type(1.0): + s1=v1 + s2=v2 + + + retpoint = 3 + + if action == 'LT': + compare = (v1 < v2) + elif action == 'LE': + compare = (v1 <= v2) + elif action == 'EQ': + compare = (v1 == v2) + elif action == 'GE': + compare = (v1 >= v2) + elif action == 'GT': + compare = (v1 > v2) + elif action == 'NE': + compare = (v1 != v2) + else: + error("Unreachable binary conditional") + + else: + error("Usage: IF ...") + + + """ Go read until end of if block. + We shove the block back if the compare was true. + Unless, the block is terminated by an ELSE ... then we need + to read another block and push back one of the two. + """ + + cmd, q, qnum = readblk() + + + if cmd == 'ELSE': + cmd, q1, qnum1 = readblk() + + if cmd == 'ELSE': + error("Only one ELSE is permitted in IF construct.") + + if not compare: + compare = 1 + q = q1 + qnum = qnum1 + + if compare: + gbl.inpath.push( q, qnum ) + + +macros = Macros() diff --git a/mma/MMA/main.py b/mma/MMA/main.py new file mode 100644 index 0000000..e18cdb6 --- /dev/null +++ b/mma/MMA/main.py @@ -0,0 +1,332 @@ + +# main.py + +""" +The program "MMA - Musical Midi Accompaniment" and the associated +modules distributed with it are protected by copyright. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import os +import gbl +from MMA.common import * +import MMA.midi +import MMA.docs +import MMA.parse +from MMA.file import locFile +from MMA.lyric import lyric +import MMA.options + +######################################## +######################################## + +# This is the program mainline. It is called/executed +# exactly once from a call in the stub program mma.py. + +########################### + + +# Get our command line stuff + +MMA.options.opts() + +""" + LibPath and IncPath are set in MMA.globals. Debug setting isn't set + when the default is done. +""" + +if gbl.debug: + print "Initialization has set LibPath set to", gbl.libPath + print "Initialization has set IncPath set to", gbl.incPath + + +####################################### +# Set up initial meta track stuff. Track 0 == meta + +m = gbl.mtrks[0] = MMA.midi.Mtrk(0) + +m.addText(0, "Created by MMA.") +m.addTrkName(0, 'MetaTrack') +m.addTempo(0, gbl.tempo) +MMA.parse.setTimeSig(['4','4']) # most stdlib files will override this + + +##################################### +# Read an RC file. All found files are processed. + +docOption = gbl.docs # Disable doc printing for RC file +gbl.docs = 0 + +rcread=0 + +rcfiles = ('mmarc', 'c:\\mma\\mmarc', '~/.mmarc', '/usr/local/etc/mmarc', '/etc/mmarc' ) +if gbl.mmaRC: + rcfiles = [ gbl.mmaRC ] + +for i in rcfiles: + f = locFile(i, None) + if f: + if gbl.showrun: + print "Reading RC file '%s'" % f + MMA.parse.parseFile(f) + rcread+=1 + break + else: + if gbl.mmaRC: + error("Specified init file '%s' not found." % gbl.mmaRC) + +if not rcread: + gbl.lineno = -1 + warning("No RC file was found or processed") + + +gbl.docs = docOption # Restore doc options + + +################################################ +# Update the library database file(s) (-g option) +# Note: This needs to be here, after reading of RC files + +if gbl.makeGrvDefs: + if gbl.infile: + error("No filename is permitted with the -g option") + from MMA.auto import libUpdate + libUpdate() # update and EXIT + + +################################ +# We need an input file for anything after this point. + +if not gbl.infile: + MMA.options.usage("No input filename specified.") + +# Add filename to meta track. + +gbl.mtrks[0].addText(0, "Input filename: %s" % gbl.infile) + +################################ +# Just extract docs (-Dx) to stdout. + +if docOption: + f=locFile(gbl.infile, None) + if not f: + error("File '%s' not found." % gbl.infile) + MMA.parse.parseFile(f) + sys.exit(0) + + +######################################################### +# These cmdline options override settings in RC files + +if gbl.cmdSMF: + gbl.lineno = -1 + MMA.parse.setMidiFileType(['SMF=%s' % gbl.cmdSMF]) + + +########################################## +# Create the output filename. +# If outfile was specified on cmd line then leave it alone. +# Otherwise ... +# 1. strip off the extension if it is .mma, +# 2. append .mid + +if gbl.outfile: + outfile = gbl.outfile +else: + outfile, ext = os.path.splitext(gbl.infile) + if ext != gbl.ext: + outfile=gbl.infile + outfile += '.mid' + + +outfile=os.path.expanduser(outfile) + + +################################################ +# Read/process files.... + +# First the mmastart files + +for f in gbl.mmaStart: + fn = locFile(f, gbl.incPath) + if not fn: + warning("MmaStart file '%s' not found/processed." % fn) + MMA.parse.parseFile(fn) + gbl.lineno = -1 + +# The song file specified on the command line + +f = locFile(gbl.infile, None) + +if not f: + gbl.lineno = -1 + error("Input file '%s' not found." % gbl.infile) + +MMA.parse.parseFile(f) + +# Finally, the mmaend files + +for f in gbl.mmaEnd: + fn = locFile(f, None) + if not fn: + warning("MmaEnd file '%s' not found/processed." % f) + MMA.parse.parseFile(fn) + + +################################################# +# Just display the channel assignments (-c) and exit... + +if gbl.chshow: + print "\nFile '%s' parsed, but no MIDI file produced!" % gbl.infile + print + print "Tracks allocated:" + k=gbl.tnames.keys() + k.sort() + max=0 + for a in k + gbl.deletedTracks: + if len(a)>max: + max = len(a) + max+=1 + wrap=0 + for a in k: + wrap += max + if wrap>60: + wrap = max + print + print " %-*s" %( max, a), + print + print + if gbl.deletedTracks: + print "Deleted Tracks:" + wrap=0 + for a in gbl.deletedTracks: + wrap += max + if wrap>60: + wrap=max + print + print " %-*s" %( max,a), + print + print + print "Channel assignments:" + for c, n in sorted(gbl.midiAssigns.items()): + if n: + wrap = 3 + print " %2s" % c, + for nn in n: + wrap += max + if wrap>63: + print "\n ", + wrap=max+3 + print "%-*s" % (max,nn), + + print + print + sys.exit(0) + + +#################################### +# Dry run, no output + +if gbl.noOutput: + warning( "Input file parsed successfully. No midi file generated.") + sys.exit(0) + + +############################## +# Create the output (MIDI) file + +gbl.lineno=-1 # disable line nums for error/warning + +""" We fix the outPath now. This lets you set outpath in the song file. + + The filename "outfile" was created above. It is either the input filename + with '.mma' changed to '.mid' OR if -f was used then it's just . + + If any of the following is true we skip inserting the outputpath into the + filename: + + - if outfile starts with a '/' + - if outPath was not set + - if -f was used + + Next, the outPath is inserted into the filename. If outPath starts with + a ".", "/" or "\ " then it is inserted at the start of the path; + otherwise it is inserted before the filename portion. +""" + +if (not outfile.startswith('/')) and gbl.outPath and (not gbl.outfile): + if gbl.outPath[0] in '.\\/': + outfile = "%s/%s" % (gbl.outPath, outfile) + else: + head, tail = os.path.split(outfile) + outfile = "%s/%s/%s" % (head, gbl.outPath, tail) + +fileExist = os.path.exists(outfile) + +""" Check if any pending midi events are still around. Mostly + this will be a DRUM event which was assigned to the 'DRUM' + track, but no DRUM track was used, just DRUM-xx tracks used. +""" + +for n in gbl.tnames.values(): + if n.channel: + n.doMidiClear() + n.clearPending() + if n.riff: + warning("%s has pending Riff(s)" % n.name) + +""" Check all the tracks and find total number used. When + initializing each track (class) we made an initial entry + in the track at offset 0 for the track name, etc. So, if the + track only has one entry we can safely skip the entire track. +""" + +trackCount=1 # account for meta track + +for n in sorted(gbl.mtrks.keys())[1:]: # check all but 0 (meta) + if len(gbl.mtrks[n].miditrk) > 1: + trackCount += 1 + +if trackCount == 1: # only meta track + if fileExist: + print + print "No data created. Did you remember to set a groove/sequence?" + if fileExist: + print "Existing file '%s' has not been modified." % outfile + sys.exit(1) + +lyric.leftovers() + +if fileExist: + print "Overwriting existing", +else: + print "Creating new", +print "midi file (%s bars): '%s'" % (gbl.barNum, outfile) + +try: + out = file(outfile, 'wb') +except: + error("Can't open file '%s' for writing." % outfile) + +MMA.midi.writeTracks(out) +out.close() + +if gbl.debug: + print "Completed processing file '%s'." % outfile + diff --git a/mma/MMA/mdefine.py b/mma/MMA/mdefine.py new file mode 100644 index 0000000..4772ac6 --- /dev/null +++ b/mma/MMA/mdefine.py @@ -0,0 +1,88 @@ + +# mdefine.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +This class is used to parse lines of MDEFINE and stores +the sequences for later recall. + +""" + +import gbl +from MMA.common import * +import MMA.midiC +class Mdefine: + + def __init__(self): + self.defs = {} + + def get(self, name): + """ Return a predefine MIDI pattern.""" + + try: + return self.defs[name] + except: + error("The MDEFINE pattern %s has not been defined." % name) + + + def set(self, name, ln): + """ Parse a MDEFINE line. + + The line must be in the form: + + NAME [; ...] + + """ + + name = name.upper() + + ln=ln.rstrip('; ') # dump trailing ';' and whitespace + ln = ln.split(';') + evs = [] + for l in ln: + l=l.split() + + if len(l) == 1: + evs.extend( self.get(l[0].upper() )) + continue + + if len(l) != 3: + error("MDEFINE sequence must have 3 values: Beat, Ctrl, Datum") + + off=stof(l[0], "Value for offset must be integer/float") + + c=MMA.midiC.ctrlToValue(l[1]) + if c < 0: + c=stoi(l[1]) + if c < 0 or c > 0x7f: + error("Controller values must be 0x00 to 0x7f.") + + d=stoi(l[2]) + if d < 0 or d > 0x7f: + error("MIDI Control Datum value must be 0x00 to 0x7f.") + + + evs.append( [off, chr(c) + chr(d)]) + + self.defs[name]=evs + +mdef = Mdefine() + diff --git a/mma/MMA/midi.py b/mma/MMA/midi.py new file mode 100644 index 0000000..5027f83 --- /dev/null +++ b/mma/MMA/midi.py @@ -0,0 +1,562 @@ +# midi.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel +""" + + + + +import gbl +from MMA.common import * +from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber +import MMA.midiC + +splitChannels = [] + +def setSplitChannels(ln): + """ Parser routine, sets up list of track to split. Overwrites existing. """ + + global splitChannels + + splitChannels = [] + + for a in ln: + c = stoi(a) + if c < 1 or c >16: + error("SplitChannels: Expecting value 1 to 16, not %s." % c) + splitChannels.append(c) + + if gbl.debug: + print "SplitChannels: ", + printList(splitChannels) + + +#################### + +def writeTracks(out): + """ Write the accumulated MIDI tracks to file. """ + + keys=gbl.mtrks.keys() + keys.sort() + + """ For type 0 MIDI files all data is contained in 1 track. + We take all our tracks and copy them to track 0, then + set up keys[] so that only track 0 remains. + """ + + if gbl.midiFileType == 0: + trk0=gbl.mtrks[0].miditrk + for n in keys[1:]: + trk=gbl.mtrks[n].miditrk + for k,v in trk.items(): + if k in trk0: + trk0[k].extend(v) + else: + trk0[k]=v + keys=[0] + + # Write header + + tcount = len(keys) + out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) ) + + # Write data chunks for each track + + for n in keys: + + if len(gbl.mtrks[n].miditrk): + + if gbl.debug: + print "Writing <%s> ch=%s;" % \ + (gbl.mtrks[n].trackname, n), + + if n in splitChannels and gbl.midiFileType: + tcount += writeSplitTrack(n, out) + else: + gbl.mtrks[n].writeMidiTrack(out) + + """ We have increased the track count! So, we need to + fix the file header. This is offset 10/11 which contains + the number of tracks. The counter tcount has been + tracking this, so just seek, replace and seek back. + """ + + if tcount != len(keys): + out.seek(0) + out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) ) + out.seek(0, 2) # return to eof + + +def writeSplitTrack(channel, out): + """ Split a drum track into a separate track for the non-note + stuff and then a track for each note. + """ + + tr = gbl.mtrks[channel].miditrk # track to split + + """ A dict to store the split midi tracks. We'll end out with + a track for each pitch which appears in the track and + a track (labeled -1) to store every other than note on data. + """ + + notes={} + + onEvent = 0x90 + (channel-1) + offEvent = 0x80 + (channel-1) + + for offset in tr.keys(): + for x in range(len(tr[offset])-1, -1, -1): + ev = tr[offset][x] + if len(ev) == 3 and ( ord(ev[0]) in (onEvent, offEvent)): + n = ord(ev[1]) + else: + n = -1 # special value for non-note on events + + if not notes.has_key(n): # create a new mtrk if needed + notes[n]=Mtrk(10) + + if offset in notes[n].miditrk: # copy event to new track + notes[n].miditrk[offset].append(ev) + else: + notes[n].miditrk[offset]=[ev] + + if gbl.debug: + print " Data has been split into %s tracks." % len(notes) + + # Insert a channel name in all the new tracks. + + for a in notes.keys(): + if a == -1: + continue + if channel == 10: + m = "%s" % MMA.midiC.valueToDrum(a) + else: + m= "%s-%s" % (gbl.mtrks[channel].trackname, a) + + notes[a].addTrkName(0, m) + + for a in sorted(notes.keys()): + notes[a].writeMidiTrack(out) + + """ The split tracks have been written. Return the number of additional tracks + so that the caller can properly update the midi file header. Note that + len(notes)-1 IS CORRECT ... we've already figured on writing 1 track. + """ + + return len(notes)-1 + + +def mkHeader(count, tempo, Mtype): + + return "MThd" + intToLong(6) + intToWord(Mtype) + \ + intToWord(count) + intToWord(tempo) + + +""" Midi track class. All the midi creation is done here. + We create a class instance for each track. mtrks{}. +""" + +class Mtrk: + + def __init__(self, channel): + self.miditrk={} + self.channel = channel-1 + self.trackname = '' + self.lastEvent = [None] * 129 + + + def delDup(self, offset, cmd): + """Delete a duplicate event. Used by timesig, etc. """ + + tr=self.miditrk + lg=len(cmd) + if tr.has_key(offset): + for i,a in enumerate(tr[offset]): + if a[0:lg] == cmd: + del tr[offset][i] + + + def addTimeSig(self, offset, nn, dd, cc, bb): + """ Create a midi time signature. + + delta - midi delta offset + nn = sig numerator, beats per measure + dd - sig denominator, 2=quarter note, 3=eighth, + cc - midi clocks/tick + bb - # of 32nd notes in quarter (normally 8) + + This is only called by timeSig.set(). Don't + call this directly since the timeSig.set() checks for + duplicate settings. + """ + + cmd = chr(0xff) + chr(0x58) + self.delDup(offset, cmd) # NEEDED??? + self.addToTrack(offset, cmd + chr(0x04) + \ + chr(nn) + chr(dd) + chr(cc) + chr(bb) ) + + + def addKeySig(self, offset, n, mi): + """ Set the midi key signature. """ + + cmd = chr(0xff) + chr(0x59) + self.delDup(offset, cmd) + self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) ) + + def addMarker(self, offset, msg): + """ Create a midi MARKER event.""" + + self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg ) + + def addText(self, offset, msg): + """ Create a midi TextEvent.""" + + self.addToTrack( offset, chr(0xff) + chr(0x01) + intToVarNumber(len(msg)) + msg ) + + + def addLyric(self, offset, msg): + """ Create a midi lyric event. """ + + self.addToTrack( offset, + chr(0xff) + chr(0x05) + intToVarNumber(len(msg)) + msg ) + + + def addTrkName(self, offset, msg): + """ Creates a midi track name event. """ + + offset = 0 # ignore user offset, always put this at 0 + + self.trackname = msg + + cmd = chr(0xff) + chr(0x03) + self.delDup(offset, cmd) + self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg ) + + + def addProgChange( self, offset, program): + """ Create a midi program change. + + program - midi program + + Returns - packed string + """ + + self.addToTrack(offset, + chr(0xc0 | self.channel) + chr(program) ) + + + def addGlis(self, offset, v): + """ Set the portamento. LowLevel MIDI. + + This does 2 things: + 1. turns portamento on/off, + 2. sets the LSN rate. + """ + + if v == 0: + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) ) + + else: + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) ) + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x05) + chr(v) ) + + + + def addPan(self, offset, v): + """ Set the lsb of the pan setting.""" + + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x0a) + chr(v) ) + + + def addCtl(self, offset, l): + """ Add arbitary control sequence to track.""" + + self.addToTrack(offset, chr(0xb0 | self.channel) + l) + + + def addNoteOff(self, offset): + """ Insert a "All Note Off" into the midi stream. + + Called from the cutTrack() function. + """ + + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x7b) + chr(0) ) + + + def addChannelVol(self, offset, v): + """ Set the midi channel volume.""" + + self.addToTrack(offset, + chr(0xb0 | self.channel) + chr(0x07) + chr(v) ) + + + def addTempo(self, offset, beats): + """ Create a midi tempo meta event. + + beats - beats per second + + Return - packed midi string + """ + + cmd = chr(0xff) + chr(0x51) + self.delDup(offset, cmd) + self.addToTrack( offset, cmd + chr(0x03) + intTo3Byte(60000000/beats) ) + + + def writeMidiTrack(self, out): + """ Create/write the MIDI track. + + We convert timing offsets to midi-deltas. + """ + + tr=self.miditrk + + if gbl.debug: + ttl = 0 + lg=1 + for t in tr: + a=len(tr[t]) + if a > lg: + lg = a + ttl += a + print "Unique ts: %s; Ttl events %s; Average ev/ts %.2f" % \ + (len(tr), ttl, float(ttl)/len(tr) ) + + last = 0 + + # Convert all events to MIDI deltas and store in + # the track array/list + + tdata=[] # empty track container + lastSts=None # Running status tracker + + for a in sorted(tr.keys()): + delta = a-last + for d in tr[a]: + + """ Running status check. For each packet compare + the first byte with the first byte of the previous + packet. If it is can be converted to running status + we strip out byte 0. Note that valid running status + byte are 0x80..0xef. 0xfx are system messages + and are note suitable for running status. + """ + + if len(d) > 1: + if d[0] == lastSts: + d=d[1:] + else: + lastSts = d[0] + s=ord(lastSts) + if s < 0x80 or s > 0xef or not gbl.runningStatus: + lastSts = None + + tdata.extend( [ intToVarNumber(delta) , d ] ) + delta = 0 + last = a + + # Add an EOF to the track (included in total track size) + + tdata.append( intToVarNumber(0)) + tdata.append( chr(0xff) + chr(0x2f) + chr(0x00) ) + + tdata = ''.join(tdata) + totsize = len(tdata) + + out.write("MTrk") + out.write(intToLong(totsize)) + out.write( tdata ) + + + def addPairToTrack(self, boffset, startRnd, duration, note, v, unify): + """ Add a note on/off pair to a track. + + boffset - offset into current bar + startRnd - rand val start adjustment + duration - note len + note - midi value of note + v - midi velocity + unify - if set attempt to unify/compress on/offs + + This function tries its best to handle overlapping events. + Easy to show effect with a table of note ON/OFF pairs. Both + events are for the same note pitch. + + Offsets | 200 | 300 | 320 | 420 + ---------|--------|--------|-------|-------- + Pair1 | on | | off | + Pair2 | | on | | off + + The logic here will delete the OFF event at 320 and + insert a new OFF at 300. Result is that when playing + Pair1 will turn off at 300 followed by the same note + in Pair2 beginning sounded right after. Why the on/off? + Remember: Velocities may be different! + + However, if the unify flag is set we should end up with: + + Offsets | 200 | 300 | 320 | 420 + ---------|--------|--------|-------|-------- + Pair1 | on | | | + Pair2 | | | | off + + + """ + + # Start/end offsets + + onOffset = getOffset( boffset, startRnd) + offOffset = onOffset + duration + + # ON/OFF events + + onEvent = chr(0x90 | self.channel) + chr(note) + chr(v) + offEvent = onEvent[:-1] + chr(0) + + """ Check for overlap on last event set for this track and + do some ugly trickry. + + - The noOnFlag is set if we don't want to have the main + routine add in the ON event. This is set when UNIFY is + set and we have an overlap. + + - We set F to the stored event time for this note and, + if it's in the same event range as the current event + we loop though the saved events for this track. We are + looking for a NOTE OFF event. + + - If we get a matching event we then delete it from the + track. This requires 2 statements: one for an event + list with only 1 event, a 2nd for multiple events. + + - If UNIFY is NOT set we insert a NOTE OFF at the current + on time. This replaces the OFF we just deleted. + + - If UNIFY is SET we skip the above step, and we set the + noOnFlag so that the ON event isn't set. + + """ + + noOnFlag = None + + f=self.lastEvent[note] + if f >= onOffset and f <= offOffset: + tr=self.miditrk + for i in range(len(tr[f])): + if tr[f][i] == offEvent: + if len(tr[f]) == 1: + del(tr[f]) + else: + del(tr[f][i]) + if not unify: + self.addToTrack(onOffset, offEvent) + else: + noOnFlag=1 + break + + if not noOnFlag: + self.addToTrack(onOffset, onEvent ) + self.addToTrack(offOffset, offEvent ) + + # Save the NOTE OFF time for the next loop. + + self.lastEvent[note] = offOffset + + + def zapRangeTrack(self, start, end): + """ Clear NoteOn events from track in range: start ... end. + + This is called from the fermata function. + + We delete the entire event list (3 bytes) from the buffer. This + can result in empty directory enteries, but that isn't a problem. + """ + + trk=self.miditrk + for a in trk: + if a>=start and a<=end: + for i in range(len(trk[a])-1, -1, -1): + e = trk[a][i] + if len(e)==3 and ord(e[0]) & 0xF0 == 0x90 and ord(e[2]): + del trk[a][i] + + + def addToTrack(self, offset, event): + """ Add an event to a track. + + MIDI data is saved as created in track structures. + Each track has a miditrk dictionary entry which used + the time offsets and keys and has the various events + as data. Each event is packed string of bytes and + the events are stored as a list in the order they are + created. Our storage looks like: + + miditrk[123] = [event1, event2, ...] + """ + + if offset<0: + offset=0 + + tr=self.miditrk + + if offset in tr: + tr[offset].append(event) + else: + tr[offset]=[event] + + + + +class TimeSig: + """ Track and set the current time signature. + + Timesigs are completely optional and are inserted into + the MIDI file by addTimeSig(). MMA routines ignore timesig + settings. + """ + + def __init__(self): + """ Initialze to null value, user will never set to this.""" + + self.lastsig = (None,None) + + def set(self, nn, dd): + """ Set timesig. If no change from last value, ignore. """ + + if self.lastsig != (nn, dd): + gbl.mtrks[0].addTimeSig(gbl.tickOffset, nn, dd, 48, 8) + self.lastsig = (nn, dd) + + def get(self): + """ Return existing timesig. """ + + return self.lastsig + + +timeSig = TimeSig() + + + diff --git a/mma/MMA/midiC.py b/mma/MMA/midiC.py new file mode 100644 index 0000000..16b9aca --- /dev/null +++ b/mma/MMA/midiC.py @@ -0,0 +1,224 @@ +# midiC.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +This module contains the constant names for the various +MIDI controllers, and conversion routines. +""" + +from MMA.common import * + +""" English names for midi instruments and drums. + + These tables are used by the pattern classes to + convert inst/drum names to midi values and by the + doc routines to print tables. +""" + +# The drum names are valid for tones 27 to 87 + +drumNames=[ + 'HighQ', 'Slap', 'ScratchPush', 'ScratchPull', + 'Sticks', 'SquareClick', 'MetronomeClick', + 'MetronomeBell', 'KickDrum2', 'KickDrum1', + 'SideKick', 'SnareDrum1', 'HandClap', + 'SnareDrum2', 'LowTom2', 'ClosedHiHat', + 'LowTom1', 'PedalHiHat', 'MidTom2', 'OpenHiHat', + 'MidTom1', 'HighTom2', 'CrashCymbal1', + 'HighTom1', 'RideCymbal1', 'ChineseCymbal', + 'RideBell', 'Tambourine', 'SplashCymbal', + 'CowBell', 'CrashCymbal2', 'VibraSlap', + 'RideCymbal2', 'HighBongo', 'LowBongo', + 'MuteHighConga', 'OpenHighConga', 'LowConga', + 'HighTimbale', 'LowTimbale', 'HighAgogo', + 'LowAgogo', 'Cabasa', 'Maracas', + 'ShortHiWhistle', 'LongLowWhistle', 'ShortGuiro', + 'LongGuiro', 'Claves', 'HighWoodBlock', + 'LowWoodBlock', 'MuteCuica', 'OpenCuica', + 'MuteTriangle', 'OpenTriangle', 'Shaker', + 'JingleBell', 'Castanets', 'MuteSudro', + 'OpenSudro' ] + +upperDrumNames = [name.upper() for name in drumNames] + + +voiceNames=[ + 'Piano1', 'Piano2','Piano3', + 'Honky-TonkPiano', 'RhodesPiano', 'EPiano', + 'HarpsiChord', 'Clavinet', 'Celesta', + 'Glockenspiel', 'MusicBox', 'Vibraphone', + 'Marimba', 'Xylophone', 'TubularBells', 'Santur', + 'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan', + 'ReedOrgan', 'Accordion', 'Harmonica', + 'Bandoneon', 'NylonGuitar', 'SteelGuitar', + 'JazzGuitar', 'CleanGuitar', 'MutedGuitar', + 'OverDriveGuitar', 'DistortonGuitar', + 'GuitarHarmonics', 'AcousticBass', + 'FingeredBass', 'PickedBass', 'FretlessBass', + 'SlapBass1', 'SlapBass2', 'SynthBass1', + 'SynthBass2', 'Violin', 'Viola', 'Cello', + 'ContraBass', 'TremoloStrings', + 'PizzicatoString', 'OrchestralHarp', 'Timpani', + 'Strings', 'SlowStrings', 'SynthStrings1', + 'SynthStrings2', 'ChoirAahs', 'VoiceOohs', + 'SynthVox', 'OrchestraHit', 'Trumpet', + 'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn', + 'BrassSection', 'SynthBrass1', 'SynthBrass2', + 'SopranoSax', 'AltoSax', 'TenorSax', + 'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon', + 'Clarinet', 'Piccolo', 'Flute', 'Recorder', + 'PanFlute', 'BottleBlow', 'Shakuhachi', + 'Whistle', 'Ocarina', 'SquareWave', 'SawWave', + 'SynCalliope', 'ChifferLead', 'Charang', + 'SoloVoice', '5thSawWave', 'Bass&Lead', + 'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice', + 'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad', + 'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere', + 'Brightness', 'Goblins', 'EchoDrops', + 'StarTheme', 'Sitar', 'Banjo', 'Shamisen', + 'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai', + 'TinkleBell', 'AgogoBells', 'SteelDrums', + 'WoodBlock', 'TaikoDrum', 'MelodicTom1', + 'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise', + 'BreathNoise', 'SeaShore', 'BirdTweet', + 'TelephoneRing', 'HelicopterBlade', + 'Applause/Noise', 'GunShot' ] + + +upperVoiceNames = [name.upper() for name in voiceNames] + +ctrlNames = [ + ### also see: http://www.midi.org/about-midi/table3.shtml + + ### 0-31 Double Precise Controllers + ### MSB (14-bits, 16,384 values) + + 'Bank', 'Modulation', 'Breath', 'Ctrl3', + 'Foot', 'Portamento', 'Data', 'Volume', + 'Balance', 'Ctrl9', 'Pan', 'Expression', + 'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15', + 'General1','General2','General3','General4', + 'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23', + 'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27', + 'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31', + ### 32-63 Double Precise Controllers + ### LSB (14-bits, 16,384 values) + 'BankLSB', 'ModulationLSB', 'BreathLSB', + 'Ctrl35', 'FootLSB', 'PortamentoLSB', + 'DataLSB','VolumeLSB','BalanceLSB', + 'Ctrl41','PanLSB','ExpressionLSB', + 'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47', + 'General1LSB','General2LSB', 'General3LSB', + 'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54', + 'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58', + 'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62', + 'Ctrl63', + + ### 64-119 Single Precise Controllers + ### (7-bits, 128 values) + + 'Sustain', 'Portamento', 'Sostenuto', + 'SoftPedal', 'Legato', 'Hold2', 'Variation', + 'Resonance', 'ReleaseTime','AttackTime', 'Brightness', + 'DecayTime','VibratoRate','VibratoDepth', 'VibratoDelay', + 'Ctrl79','General5','General6','General7', + 'General8','PortamentoCtrl','Ctrl85','Ctrl86', + 'Ctrl87', 'Ctrl88', 'Ctrl89', 'Ctrl90', + 'Reverb', 'Tremolo', 'Chorus','Detune', + 'Phaser', 'DataInc','DataDec', + 'NonRegLSB', 'NonRegMSB', + 'RegParLSB', 'RegParMSB', + 'Ctrl102','Ctrl103','Ctrl104','Ctrl105', + 'Ctrl106','Ctrl107','Ctrl108','Ctrl109', + 'Ctrl110','Ctrl111','Ctrl112','Ctrl113', + 'Ctrl114','Ctrl115','Ctrl116','Ctrl117', + 'Ctrl118','Ctrl119', + + ### 120-127 Channel Mode Messages + + 'AllSoundsOff','ResetAll', + 'LocalCtrl','AllNotesOff', + 'OmniOff','OmniOn', 'PolyOff','PolyOn' ] + +upperCtrlNames = [name.upper() for name in ctrlNames] + + +def drumToValue(name): + """ Get the value of the drum tone (-1==error). """ + + try: + v=int(name, 0) + except: + try: + v = upperDrumNames.index(name.upper()) + 27 + except ValueError: + error("Expecting a valid drum name or value for drum tone, not '%s'" % name) + + if v <0 or v > 127: + error("Note in Drum Tone list must be 0..127, not %s" % v) + + return v + + +def instToValue(name): + """ Get the value of the instrument name (-1==error). """ + + try: + return upperVoiceNames.index(name.upper()) + except ValueError: + return -1 + +def ctrlToValue(name): + """ Get the value of the controler name (-1==error). """ + + try: + return upperCtrlNames.index(name.upper()) + except ValueError: + return -1 + +def valueToInst(val): + """ Get the name of the inst. (or 'ERR'). """ + + try: + return voiceNames[val] + except IndexError: + return "ERROR" + + +def valueToDrum(val): + """ Get the name of the drum tone. + + We return the NAME of the tone, or the original value if there is + no name associated with the value (only value 27 to 86 have names). + """ + + if val<27 or val>86: + return str(val) + else: + return drumNames[val-27] + +def valueToCtrl(val): + """ Get the name of the controller (or 'ERR'). """ + + try: + return ctrlNames[val] + except IndexError: + return "ERROR" diff --git a/mma/MMA/midiIn.py b/mma/MMA/midiIn.py new file mode 100644 index 0000000..83a68dd --- /dev/null +++ b/mma/MMA/midiIn.py @@ -0,0 +1,519 @@ + +# midiIn.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import MMA.midiM +from MMA.alloc import trackAlloc +import gbl +from MMA.common import * +import os + +# The following 2 variables are global. A bit ugly :) + +midifile = '' # The imported MIDI file (data) as a long string +offset = 0 # Current pointer into the MIDI file + + +""" Helper functions + + It might be better to have these + functions setup in midiM.py ... but it's easier just + now to have it here. The main problem is that we are + reading from a buffer and don't know how many bytes to + pass back and forth. +""" + + +def mvarlen(): + """ Convert variable length midi value to int. """ + + global offset + + x=0L + for i in range(4): + + try: + byte=ord(midifile[offset]) + offset += 1 + except: + error("Invalid MIDI file include (varlen->int).") + + if byte < 0x80: + x = ( x << 7 ) + byte + break + else: + x = ( x << 7 ) + ( byte & 0x7f ) + + return int(x) + + +def chars(count): + """ Return 'count' chars from file (updates global pointer). """ + + global offset + + bytes=midifile[offset:offset+count] + offset+=count + return bytes + + +def m1i(): + """ Get 1 byte (updates global pointer). """ + + global offset + + try: + byte = midifile[offset] + offset += 1 + except: + error("Invalid MIDI file include (byte, offset=%s)." % offset) + + return ord(byte) + + +def m32i(): + """ Convert 4 bytes to integer. """ + + global offset + + x = 0L + for i in range(4): + try: + byte = midifile[offset] + offset += 1 + except: + error("Invalid MIDI file include (i32->int, offset=%s)." % offset) + x = (x << 8) + ord(byte) + + return int(x) + + +def m16i(): + """ Convert 2 bytes to integer. """ + + global offset + + x = 0L + for i in range(2): + try: + byte = midifile[offset] + offset += 1 + except: + error("Invalid MIDI file include (i16->int, offset=%s)." % offset) + x = (x << 8) + ord(byte) + + return int(x) + + +###################################################### +## Main function, called from parser. + +def midiinc(ln): + """ Include a MIDI file into MMA generated files. """ + + global midifile, offset + + filename = '' + doLyric = 0 + doText = 0 + volAdjust = 100 + octAdjust = 0 + transpose = None + channels = [] + + # These are the start/end points for the included file. They are in + # beats, but are adjusted after the file is opened to ticks. + + istart=0 + iend = 0xffffff + + for a in ln: + cmd, opt = a.split('=') + + cmd=cmd.upper() + + if cmd == 'FILE': + filename = os.path.expanduser(opt) + + elif cmd == 'VOLUME': + volAdjust = stoi(opt) + + elif cmd == 'OCTAVE': + octAdjust = stoi(opt) + if octAdjust < -4 or octAdjust > 4: + error("Octave adjustment must be -4 to 4, not %s." % opt) + octAdjust *= 12 + + elif cmd == 'TRANSPOSE': + transpose = stoi(opt) + if transpose < -24 or transpose > 24: + error("Tranpose must be -24 to 24, not %s." % opt) + + elif cmd == 'START': + istart = stof(opt) + + elif cmd == 'END': + iend = stof(opt) + + elif cmd == 'TEXT': + opt=opt.upper() + if opt in ("ON", 1): + doText=1 + elif opt in ("OFF", 0): + doText=0 + else: + error("MidiInc Text= expecting 'ON' or 'OFF'") + + + elif cmd == 'LYRIC' and opt != '0': + opt=opt.upper() + if opt in ("ON", 1): + doLyric=1 + elif opt in ("OFF", 0): + doLyric=0 + else: + error("MidiInc Lyric= expecting 'ON' or 'OFF'") + + # make sure this is last option ... it has to be a TRACKNAME=CHANNEL-NUMBER + + else: + trackAlloc(cmd, 0) + if not cmd in gbl.tnames: + error("%s is not a valid MMA track." % cmd) + + ch = stoi(opt) + if ch < 1 or ch > 16: + error("MIDI channel for import must be 1..16, not %s." % ch) + + channels.append( (cmd, ch-1)) + + + if not channels: + if doLyric or doText: + warning("MidiInc: no import channels specified, only text or lyrics imported.") + else: + error("MidiInc: A channel to import and a destination track must be specified.") + + if (istart >= iend) or (istart < 0) or (iend < 0): + error("MidiInc range invalid: start=%s, end=%s" % (istart, iend)) + + if gbl.debug: + print "MidiInc: file=%s, Volume=%s, Octave=%s, Transpose=%s, Lyric=%s, Text=%s, Range=%s..%s"\ + % (filename, volAdjust, octAdjust, transpose, doLyric, doText, istart, iend) + for t, ch in channels: + print "MidiInc: Channel %s --> Track %s" % (ch+1, t) + + # If transpose was NOT set, use the global transpose value + + if transpose == None: + transpose = gbl.transpose + + octAdjust += transpose # this takes care of octave and transpose + + try: + inpath = file(filename, "rb") + except: + error("Unable to open MIDI file %s for reading" % filename) + + midifile=inpath.read() + inpath.close() + + # Create our storage: + # A dic with the channels 0-15 as keys for the midi note events + # 2 lists for lyrics and text events. These have tuples for (time, text) + + events={} + for c in range(0,16): + events[c]=[] + + textEvs=[] + lyricEvs=[] + + # Ensure this is valid header + + hd=midifile[0:4] + if hd != 'MThd': + error("Expecting 'HThd', %s not a standard midi file." % filename) + + offset = 4 + a = m32i() + + if a != 6: + error("Expecting a 32 bit value of 6 in header") + + format=m16i() + + if format not in (0,1): + error("MIDI file format %s not recognized" % format) + + ntracks=m16i() + beatDivision=m16i() + + if beatDivision != gbl.BperQ: + warning("MIDI file '%s' tick/beat of %s differs from MMA's " + "%s. Will try to compensate." % + (filename, beatDivision, gbl.BperQ)) + + # Adjust start/end to the file's tick + + istart *= beatDivision + iend *= beatDivision + + midievents={} + firstNote = 0xffffff + + for tr in range(ntracks): + tm=0 + + hdr = midifile[offset:offset+4] + offset+=4 + + if hdr != 'MTrk': + error("Malformed MIDI file in track header") + trlen = m32i() # track length, not used? + + lastevent = None + + """ Parse the midi file. We have to parse off each event, even + though many will just be thrown away. You can't just skip around + in a midi file :) In the future we might decide to include meta + stuff, etc. Or, we may not :) For now, we keep: + - note on + - note off + - key pressure + - control change + - program change + - channel pressure + - pitch blend + - text event + - lyric event + """ + + while 1: + tm += mvarlen() # adjust total offset by delta + + ev=m1i() + + if ev < 0x80: + if not lastevent: + error("Illegal running status in %s at %s" \ + % (midifile, offset)) + offset -= 1 + ev=lastevent + + + sValue = ev>>4 # Shift MSBs to get a 4 bit value + channel = ev & 0x0f + + if sValue == 0x8: # note off event + + note=m1i() + vel=m1i() + + if octAdjust and channel != 10: + note += octAdjust + if note < 0 or note > 127: + continue + + + events[channel].append([tm, ev & 0xf0, chr(note)+chr(vel)]) + + elif sValue == 0x9: # note on event + if tm < firstNote: + firstNote = tm + + note=m1i() + vel=m1i() + + if octAdjust and channel != 10: + note += octAdjust + if note < 0 or note > 127: + continue + + if volAdjust != 100: + vel = int( (vel*volAdjust)/100) + if vel<0: vel=1 + if vel>127: vel=127 + + events[ev & 0xf].append([tm, ev & 0xf0, chr(note)+chr(vel)]) + + elif sValue == 0xa: # key pressure + events[ev & 0xf].append([tm, ev & 0xf0, chars(2)]) + + elif sValue == 0xb: # control change + events[ev & 0xf].append([tm, ev & 0xf0, chars(2)]) + + elif sValue == 0xc: # program change + events[ev & 0xf].append([tm, ev & 0xf0, chars(1)]) + + elif sValue == 0xd: # channel pressure + events[ev & 0xf].append([tm, ev & 0xf0, chars(1)]) + + elif sValue == 0xe: # pitch blend + events[ev & 0xf].append([tm, ev & 0xf0, chars(2)]) + + elif sValue == 0xf: # system, mostly ignored + if ev == 0xff: # meta events + a=m1i() + + if a == 0x00: # sequence number + l=mvarlen() + offset += l + + elif a == 0x01: # text (could be lyrics) + textEvs.append((tm, chars(mvarlen()))) + + elif a == 0x02: # copyright + l=mvarlen() + offset += l + + elif a == 0x03: # seq/track name + l=mvarlen() + offset += l + + elif a == 0x04: # instrument name + l=mvarlen() + offset += l + + elif a == 0x05: # lyric + lyricEvs.append((tm, chars(mvarlen()))) + + elif a == 0x06: # marker + l=mvarlen() + offset += l + + elif a == 0x07: # cue point + l=mvarlen() + offset += l + + elif a == 0x21: # midi port + l=mvarlen() + offset += l + + elif a == 0x2f: # end of track + l=mvarlen() + offset += l + break + + elif a == 0x51: #tempo + l=mvarlen() + offset += l + + elif a == 0x54: # SMPTE offset + l=mvarlen() + offset += l + + elif a == 0x58: # time sig + l=mvarlen() + offset += l + + elif a == 0x59: # key sig + l=mvarlen() + offset += l + + else: # probably 0x7f, proprietary event + l=mvarlen() + offset += l + + + elif ev == 0xf0: # system exclusive + l=mvarlen() + offset += l + + elif ev == 0xf2: # song position pointer, 2 bytes + offset += 2 + + elif ev == 0xf3: # song select, 1 byte + offset += 1 + + else: # all others are single byte commands + pass + + if ev >= 0x80 and ev <= 0xef: + lastevent = ev + + + # Midi file parsed, add selected events to mma data + + beatad = gbl.BperQ / float(beatDivision) + + if doText: + inst=0 + disc=0 + for tm,tx in textEvs: + delta = tm-firstNote + if delta >= istart and delta <= iend: + gbl.mtrks[0].addText(gbl.tickOffset + int(delta * beatad), tx) + inst+=1 + else: + disc+=1 + if gbl.debug: + print"MidiInc text events: %s inserted, %s out of range." % (inst, disc) + + if doLyric: + inst=0 + disc=0 + for tm, tx in lyricEvs: + delta = tm-firstNote + if delta >= istart and delta <= iend: + gbl.mtrks[0].addLyric(gbl.tickOffset + int(delta * beatad), tx) + inst+=1 + else: + disc+=1 + if gbl.debug: + print"MidiInc lyric events: %s inserted, %s out of range." % (inst, disc) + + + for n,c in channels: + if not len(events[c]): + warning("No data to assign from imported channel %s to track %s." % (c+1, n)) + + inst=0 + disc=0 + for tr, ch in channels: + t=gbl.tnames[tr] + if not t.channel: + t.setChannel() + + t.clearPending() + if t.voice[0] != t.ssvoice: + gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0]) + + channel = t.channel + track = gbl.mtrks[channel] + + for ev in events[ch]: + delta = ev[0]-firstNote + if delta >= istart and delta <= iend: + track.addToTrack( gbl.tickOffset + int(delta * beatad), + chr(ev[1] | channel-1) + ev[2] ) + inst+=1 + else: + disc+=1 + + if gbl.debug: + print"MidiInc events: %s inserted, %s out of range." % (inst, disc) + + + diff --git a/mma/MMA/midiM.py b/mma/MMA/midiM.py new file mode 100644 index 0000000..25e0672 --- /dev/null +++ b/mma/MMA/midiM.py @@ -0,0 +1,57 @@ +# midiM.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +This module contains the MIDI number (un)packing routines. + +These are necessary to create the MSB/LSB stuff that +MIDI expects. + +""" + + +def intToWord(x): + """ Convert INT to a 2 byte MSB LSB value. """ + + return chr(x>>8 & 0xff) + chr(x & 0xff) + +def intTo3Byte(x): + """ Convert INT to a 3 byte MSB...LSB value. """ + + return intToLong(x)[1:] + +def intToLong(x): + """ Convert INT to a 4 byte MSB...LSB value. """ + + return intToWord(x>>16) + intToWord(x) + + +def intToVarNumber(x): + """ Convert INT to a variable length MIDI value. """ + + lst = chr(x & 0x7f) + while 1: + x = x >> 7 + if x: + lst = chr((x & 0x7f) | 0x80) + lst + else: + return lst + diff --git a/mma/MMA/notelen.py b/mma/MMA/notelen.py new file mode 100644 index 0000000..6ce394e --- /dev/null +++ b/mma/MMA/notelen.py @@ -0,0 +1,130 @@ + +# notelen.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + + +""" +import gbl +from MMA.common import * + + +noteLenTable = { + '0' : 1, # special 0==1 midi tick + '1' : gbl.BperQ * 4, # whole note + '2' : gbl.BperQ * 2, # 1/2 + '23' : gbl.BperQ * 4 / 3, # 1/2 triplet + '4' : gbl.BperQ, # 1/4 + '43' : gbl.BperQ * 2 / 3, # 1/4 triplet + '8' : gbl.BperQ / 2, # 1/8 + '81' : None, # short 1/8 swing note + '82' : None, # long 1/8 swing note + '16' : gbl.BperQ / 4, # 1/16 + '32' : gbl.BperQ / 8, # 1/32 + '64' : gbl.BperQ / 16, # 1/64 + '6' : gbl.BperQ / 6, # 1/16 note triplet + '3' : gbl.BperQ / 3, # 1/8 note triplet + '5' : gbl.BperQ / 5 } # 1/8 note quintuplet + + +def swingMode(ln): + """ Enable/Disable Swing timing mode. """ + + + emsg = "Use: SwingMode [ On, Off, 0, 1 Skew=xx ]." + + if not ln: + error(emsg) + + + for v in ln: + + a = v.upper() + + if a in ("ON", "1"): + gbl.swingMode = 1 + continue + + if a in ("OFF", "0"): + gbl.swingMode = 0 + continue + + if a.find('=')>1: + a,b = a.split('=') + + if a == 'SKEW': + gbl.swingSkew = b + v = int( stoi(b) * gbl.BperQ / 100) + noteLenTable['81'] = v + noteLenTable['82'] = gbl.BperQ - v + continue + + error(emsg) + + if gbl.debug: + print "SwingMode: Status=%s, Skew Note lengths: %s and %s ticks." % \ + (gbl.swingMode, noteLenTable['81'], noteLenTable['82']) + + +swingMode(['Skew=66']) # Set the default swingskew values. + + + +def getNoteLen(n): + """ Convert a Note to a midi tick length. + + Notes are 1==Whole, 4==Quarter, etc. + Notes can be dotted or double dotted. + Notes can be combined: 1+4 == 5 beats, 4. or 4+8 == dotted 1/4 + 1-4 == 3 beats, 1-0 == 4 beats less a midi tick + """ + + length = 0 + + n=n.replace('-', '+-') # change "2-4" to "2+-4" for easier parsing + n=n.replace('++-', '+-') # and in case we already used "+-", take out 2nd "+" + + for a in str(n).split('+'): + if a.endswith('..'): + dot = 2 + a=a[:-2] + elif a.endswith('.'): + dot = 1 + a=a[:-1] + else: + dot = 0 + + try: + if a.startswith('-'): + i = noteLenTable[a[1:]] * -1 + else: + i = noteLenTable[a] + + except: + error("Unknown note duration %s" % n ) + + if dot == 2: + i += i/2 + i/4 + elif dot == 1: + i += i/2 + length += i + + return length diff --git a/mma/MMA/options.py b/mma/MMA/options.py new file mode 100644 index 0000000..f6eba05 --- /dev/null +++ b/mma/MMA/options.py @@ -0,0 +1,225 @@ +# opts.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + + + +import getopt +import sys + +import gbl +from MMA.common import * +import MMA.docs +import MMA.parse +import MMA.alloc +import MMA.chords +from MMA.macro import macros + + +def opts(): + """ Option parser. """ + + try: + opts, args = getopt.gnu_getopt(sys.argv[1:], + "dpsS:ri:wneom:f:M:cgGvD:", [] ) + + + except getopt.GetoptError: + usage() + + for o,a in opts: + if o == '-d': + gbl.debug = gbl.Ldebug = 1 + + elif o == '-o': + gbl.showFilenames = gbl.LshowFilenames = 1 + + elif o == '-p': + gbl.pshow = gbl.Lpshow = 1 + + elif o == '-s': + gbl.seqshow = gbl.Lseqshow = 1 + + elif o == '-S': + ln = a.split('=', 1) + macros.setvar(ln) + + elif o == '-r': + gbl.showrun = gbl.Lshowrun = 1 + + elif o == '-w': + gbl.noWarn = gbl.LnoWarn = 1 + + elif o == '-n': + gbl.noOutput = gbl.LnoOutput = 1 + + elif o == '-e': + gbl.showExpand = gbl.LshowExpand = 1 + + elif o == '-c': + gbl.chshow = gbl.Lchshow = 1 + + elif o == '-f': + gbl.outfile = a + + elif o == '-i': + gbl.mmaRC = a + + elif o == '-g': + gbl.makeGrvDefs = 1 + + elif o == '-G': + gbl.makeGrvDefs = 2 + + elif o == '-m': + try: + a=int(a) + except: + error("Expecting -m arg to be a integer") + gbl.maxBars = a + + elif o == '-v': + print "%s" % gbl.version + sys.exit(0) + + elif o == '-M': + if a in ['0', '1']: + gbl.cmdSMF = a + else: + error("Only a '0' or '1' is permitted for the -M arg.") + + elif o == '-D': + if a == 'xl': + gbl.docs = 1 + + elif a == 'xh': + gbl.docs = 2 + + elif a == 'k': + + def pl(msg, lst): + print msg, + for i in sorted(lst.keys()): + print i, + print "\n" + + pl("Base track names:", MMA.alloc.trkClasses ) + pl("Commands:", MMA.parse.simpleFuncs) + pl("TrackCommands:", MMA.parse.trackFuncs) + print "Not complete ... subcommands, comments, chords..." + sys.exit(0) + + + elif a == 'n': + MMA.chords.docs() + sys.exit(0) + + elif a == 'da': + MMA.docs.docDrumNames("a") + sys.exit(0) + + elif a == 'dm': + MMA.docs.docDrumNames("m") + sys.exit(0) + + elif a == 'ia': + MMA.docs.docInstNames("a") + sys.exit(0) + + elif a == 'im': + MMA.docs.docInstNames("m") + sys.exit(0) + + elif a == 'ca': + MMA.docs.docCtrlNames("a") + sys.exit(0) + + elif a == 'cm': + MMA.docs.docCtrlNames("m") + sys.exit(0) + + else: + print "Unknown -D option." + usage() + + + else: + usage() # unreachable?? + + if args: + if gbl.infile: + usage("Only one input filename is permitted.") + gbl.infile = args.pop(0) + + +def usage(msg=''): + """ Usage message. """ + + txt=[ + "MMA - Musical Midi Accompaniment", + " Copyright 2003-5, Bob van der Poel. Version %s" % gbl.version , + " Distributed under the terms of the GNU Public License.", + " Usage: mma [opts ...] INFILE [opts ...]", + "", + "Options:", + " -c display default Channel assignments", + " -d enable lots of Debugging messages", + " -Dk print list of MMA keywords", + " -Dxl eXtract Latex doc blocks from file", + " -Dxh eXtract HTML doc blocks from file", + " -Dn print Note/chord table", + " -Ddm print Midi drum names (by MIDI value)", + " -Dda print Midi drum names (alphabetical)", + " -Dim print Inst. names (by MIDI value)", + " -Dia print Inst. names (alphabetical)", + " -Dcm print Controller names (by value)", + " -Dca print Controller names (alphabetical)", + " -e show parsed/Expanded lines", + " -f set output Filename", + " -g update Groove dependency database", + " -G create Groove dependency database", + " -i specify init (mmarc) file", + " -m set Maxbars (default == 500)", + " -M set SMF to 0 or 1", + " -n No generation of midi output", + " -o show complete filenames when Opened", + " -p display Patterns as they are defined", + " -r display Running progress", + " -s display Sequence info during run", + " -S Set macro 'var' to 'data'", + " -v display Version number", + " -w disable Warning messages" ] + + + for a in txt: + print a + + if msg: + print + print msg + + print + sys.exit(1) + + diff --git a/mma/MMA/parse.py b/mma/MMA/parse.py new file mode 100644 index 0000000..a188ac3 --- /dev/null +++ b/mma/MMA/parse.py @@ -0,0 +1,2360 @@ + +# parse.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + + +This module does all file parsing. Most commands +are passed to the track classes; however, things +like TIME, SEQRND, etc. which just set global flags +are completely handled here. + +""" + +import os +import random +import copy + +import gbl +import MMA.notelen +import MMA.chords +import MMA.file +import MMA.docs +import MMA.midi +import MMA.midiIn +import MMA.auto +from MMA.alloc import trackAlloc +from MMA.common import * +import MMA.translate +from MMA.lyric import lyric +import MMA.patSolo +from MMA.macro import macros +import MMA.mdefine +import MMA.volume +from MMA.pat import seqBump + +lastChord = None # tracks last chord for "/ /" data lines. + +beginData = [] # Current data set by a BEGIN statement +beginPoints = [] # since BEGINs can be nested, we need ptrs for backing out of BEGINs + +seqRndWeight = [1] + +groovesList = None +groovesCount = 0 + +""" This table is passed to the track classes. It has + an instance for each chord in the current bar. +""" + +class CTable: + chord = None # A pointer to the chordNotes structures + chordZ = None # set if chord is tacet + arpeggioZ = None # set if arpeggio is tacet + walkZ = None # set if walking bass is tacet + drumZ = None # set if drums are tacet + bassZ = None # set if bass is tacet + scaleZ = None # set if scale track is tacet + + def __init__(self, offset): + self.offset=offset + + + +######################################## +# File processing. Mostly jumps to pats +######################################## + + +def parseFile(n): + """ Open and process a file. Errors exit. """ + + fp=gbl.inpath + + f=MMA.file.ReadFile(n) + + parse(f) + gbl.inpath=fp + + if gbl.debug: + print "File '%s' closed." % n + + +def parse(inpath): + """ Process a mma input file. """ + + global beginData, lastChord + global groovesList, groovesCount + + gbl.inpath = inpath + + curline = None + + while 1: + curline = inpath.read() + + if curline == None: + MMA.docs.docDump() + break + + l = macros.expand(curline) + + """ Handle BEGIN and END here. This is outside of the Repeat/End + and variable expand loops so SHOULD be pretty bullet proof. + Note that the beginData stuff is global to this module ... the + Include/Use directives check to make sure we're not doing that + inside a Begin/End. + + beginData[] is a list which we append to as more Begins are + encountered. + + The placement here is pretty deliberate. Variable expand comes + later so you can't macorize BEGIN ... I think this makes sense. + """ + + key=l[0].upper() + if key == 'BEGIN': + if not l: + error("Use: BEGIN STUFF.") + beginPoints.append(len(beginData)) + beginData.extend(l[1:]) + continue + + if key == 'END': + if len(l) > 1: + error("No arguments permitted for End") + if not beginData: + error("No 'Begin' for 'End'") + beginData=beginData[:beginPoints.pop(-1)] + continue + + if beginData: + l = beginData + l + + action = l[0].upper() + + if gbl.showExpand and action !='REPEAT': + print l + + # If the command is in the simple function table, jump & loop. + + if action in simpleFuncs: + simpleFuncs[action](l[1:]) + continue + + + """ We have several possibilities ... + 1. The command is a valid assigned track name, + 2. The command is a valid track name, but needs to be + dynamically allocated, + 3. It's really a chord action + """ + + if not action in gbl.tnames: + trackAlloc(action, 0) # ensure that track is allocated + + if action in gbl.tnames: # BASS/DRUM/APEGGIO/CHORD + + name = action + if len(l) < 2: + error("Expecting argument after '%s'" % name) + action = l[1].upper() + + if action in trackFuncs: + trackFuncs[action](name, l[2:]) + else: + error ("Don't know '%s'" % curline) + + continue + + ### Gotta be a chord data line! + + + """ A data line can have an optional bar number at the start + of the line. Makes debugging input easier. The next + block strips leading integers off the line. Note that + a line number on a line by itself it okay. + """ + + if l[0].isdigit(): + l = l[1:] + if not l: # ignore empty lines + continue + + """ A bar can have an optional repeat count. This must + be at the end of bar in the form '* xx'. + """ + + if len(l)>1 and l[-2]=='*': + rptcount = stoi(l[-1], "Expecting integer after '*'") + l=l[:-2] + else: + rptcount = 1 + + + """ Extract solo(s) from line ... this is anything in {}s. + The solo data is pushed into RIFFs and discarded from + the current line. + """ + + l = ' '.join(l) + l = MMA.patSolo.extractSolo(l, rptcount) + + """ Set lyrics from [stuff] in the current line or + stuff previously stored with LYRICS SET. + """ + + l, lyrics = lyric.extract(l, rptcount) + + """ At this point we have only chord info. A number + of sanity checks are made: + 1. Make sure there is some chord data, + 2. Ensure the correct number of chords. + """ + + l = l.split() + + if not l: + error("Expecting music (chord) data. Even lines with\n" + " lyrics or solos still need a chord.") + + i = gbl.QperBar - len(l) + if i<0: + error("Too many chords in line. Max is %s, not %s." % + (gbl.QperBar, len(l) ) ) + if i: + l.extend( ['/'] * i ) + + + """ We now have a valid line. It'll look something like: + + ['Cm', '/', 'z', 'F#'] + + For each bar we create a ctable structure. This is just + a list of CTables, one for each beat division. + Each entry has the offset (in midi ticks), chordname, etc. + + Special processing in needed for 'z' options in chords. A 'z' can + be of the form 'CHORDzX', 'z!' or just 'z'. + """ + + beat = 0 + ctable = [] + + for c in l: + if c == '/': + if not lastChord: + error("A chord has to be set before you can use a '/'.") + c = lastChord + else: + lastChord = c + + ctable.append(parseZs(c, beat)) + beat += 1 + + # Create MIDI data for the bar + + for rpt in range(rptcount): + if MMA.volume.futureVol: + MMA.volume.volume = MMA.volume.futureVol.pop(0) + + tmp = [] + for x, i in enumerate(seqRndWeight): + tmp.extend([x] * i) + if not len(tmp): + error("SeqRndWeight has generated an empty list.") + randomSeq = random.choice(tmp) + + if gbl.seqRnd[0] == 1: + gbl.seqCount = randomSeq + + """ Process each track. It is important that the track classes + are written so that the ctable passed to them IS NOT MODIFIED. + This applies especially to chords. If the track class changes + the chord, then restore it before returning!!! + """ + + for a in gbl.tnames.values(): + seqSave = gbl.seqCount + if a.name in gbl.seqRnd: + gbl.seqCount = randomSeq + + a.bar(ctable) ## process entire bar! + + gbl.seqCount = seqSave + + # Adjust counters + + gbl.barNum += 1 + + if gbl.barNum > gbl.maxBars: + error("Capacity exceeded. Maxbar setting is %s. Use -m option." + % gbl.maxBars) + + gbl.tickOffset += (gbl.QperBar * gbl.BperQ) + + gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize + + """ Handle groove lists. If there is more than 1 entry + in the groove list, advance (circle). We don't have + to qualify grooves since they were verified when + this list was created. groovesList==None if there + is only one groove (or none). + """ + + if groovesList: + groovesCount += 1 + if groovesCount > len(groovesList)-1: + groovesCount = 0 + slot = groovesList[groovesCount] + + if slot != gbl.currentGroove: + grooveDo(slot) + + gbl.lastGroove = gbl.currentGroove + gbl.currentGroove = slot + + if gbl.debug: + print "Groove (list) setting restored from '%s'." % slot + + # Enabled with the -r command line option + + if gbl.showrun: + print "%3d:" % gbl.barNum, + for c in l: + print c, + if lyrics: + print lyrics, + print + + +def parseZs(c, beat): + """ Parse a chord in a barline, create Ctable and strips 'z's. + + This is called only from the main parser, but it's + complicated (ugly) enough to have its own function. + """ + + ctab = CTable(beat * gbl.BperQ) + + if 'z' in c: + c, r = c.split('z', 1) # chord name/track mute + + if not c: + if r=='!': # mute all for 'z!' + r='DCAWBS' + c='z' # dummy chord name + elif not r: # mute all tracks except Drum 'z' + r='CBAWS' + c='z' + + else: + error("To mute individual tracks you must " + "use a chord/z combination not '%s'." % l) + + else: # illegal construct -- 'Cz!' + if r=='!': + error("'%sz!' is illegal. 'z!' mutes all tracks " + "so you can't include the chord." % c) + + elif not r: + error("'%sz' is illegal. You must specify tracks " + "if you use a chord." % c ) + + for v in r: + if v == 'C': + ctab.chordZ = 1 + elif v == 'B': + ctab.bassZ = 1 + elif v == 'A': + ctab.arpeggioZ = 1 + elif v == 'W': + ctab.walkZ = 1 + elif v == 'D': + ctab.drumZ = 1 + elif v == 'S': + ctab.scaleZ = 1 + + else: + error("Unknown voice '%s' for rest in '%s'." % (v,r)) + + ctab.chord = MMA.chords.ChordNotes(c) + + return ctab + +################################################################## + +def allTracks(ln): + """ Apply track to all tracks. """ + + allTypes = ('BASS', 'CHORD', 'ARPEGGIO', 'SCALE', 'DRUM', 'WALK', 'MELODY', 'SOLO') + ttypes = [] + + if len(ln) < 1: + error("AllTracks: argument required.") + + i = 0 + while i < len(ln) and ln[i].upper() in allTypes: + ttypes.append(ln[i].upper()) + i += 1 + + if ttypes == []: + ttypes = allTypes + + if i>=len(ln): + error("AllTracks: Additional argument required.") + + cmd = ln[i].upper() + args = i+1 + + if not cmd in trackFuncs: + error("AllTracks: command '%s' doen't exist." % cmd) + + for n in gbl.tnames: + if not gbl.tnames[n].vtype in ttypes: + continue + + trackFuncs[cmd](n, ln[args:]) + + +####################################### +# Do-nothing functions + +def comment(ln): + pass + +def repeatend(ln): + error("Repeatend/EndRepeat without Repeat.") + +def repeatending(ln): + error("Repeatending without Repeat.") + +def endmset(ln): + error("EndMset/MSetEnd without If.") + +def ifend(ln): + error("ENDIF without IF.") + +def ifelse(ln): + error("ELSE without IF.") + + + +####################################### +# Repeat/jumps + + +def repeat(ln): + """ Repeat/RepeatEnd/RepeatEnding. + + Read input until a RepeatEnd is found. The entire + chunk is pushed back into the input stream the + correct number of times. This accounts for endings and + nested repeats. + """ + + + def repeatChunk(): + q=[] + qnum=[] + nesting = 0 + + while 1: + l=gbl.inpath.read() + + if not l: + error("EOF encountered processing Repeat.") + + act=l[0].upper() + + if act=='REPEAT': + nesting += 1 + + elif act in ('REPEATEND', 'ENDREPEAT') and nesting: + nesting -= 1 + + elif act == 'REPEATENDING' and nesting: + pass + + elif act in ('REPEATEND', 'ENDREPEAT', 'REPEATENDING'): + return (q, qnum, act, l[1:]) + + q.append(l) + qnum.append(gbl.lineno) + + stack=[] + stacknum=[] + main=[] + mainnum=[] + ending = 0 + + if ln: + error("REPEAT takes no arguments.") + + main, mainnum, act, l = repeatChunk() + + while 1: + if act in ('REPEATEND', 'ENDREPEAT'): + if l: + l=macros.expand(l) + if len(l) == 2 and l[0].upper() == 'NOWARN': + l=l[1:] + warn=0 + else: + warn=1 + + if len(l) != 1: + error("%s: Use [NoWarn] Count." % act) + + count=stoi(l[0], "%s takes an integer arg." % act) + + if count == 2 and warn: + warning("%s count of 2 duplicates default. Did you mean 3 or more?" % act) + + elif count == 1 and warn: + warning("%s count of 1 means NO REPEAT." % act) + + elif count == 0 and warn: + warning("%s count of 0, Skipping entire repeated section." % act) + + elif count < 0: + error("%s count must be 0 or greater." % act) + + elif count > 10 and warn: + warning("%s is a large value for %s." % (count, act) ) + + else: + count=2 + + if not ending: + count += 1 + for c in range(count-1): + stack.extend(main) + stacknum.extend(mainnum) + gbl.inpath.push(stack, stacknum) + break + + elif act == 'REPEATENDING': + ending = 1 + + if l: + l=macros.expand(l) + if len(l) == 2 and l[0].upper() == 'NOWARN': + warn=0 + l=l[1:] + else: + warn=1 + + if len(l) != 1: + error("REPEATENDING: Use [NoWarn] Count.") + + count=stoi(l[0], "RepeatEnding takes an integer arg.") + + if count < 0: + error("RepeatEnding count must be postive, not %s" % count) + + elif count == 0 and warn: + warning("RepeatEnding count of 0, skipping section.") + + elif count == 1 and warn: + warning("RepeatEnding count of 1 duplicates default.") + + elif count > 10 and warn: + warning("%s is a large value for RepeatEnding." % count) + else: + count = 1 + + rpt, rptnum, act, l = repeatChunk() + + for c in range(count): + stack.extend(main) + stacknum.extend(mainnum) + stack.extend(rpt) + stacknum.extend(rptnum) + + + else: + error("Unexpected line in REPEAT") + +def goto(ln): + if len(ln) != 1: + error("Usage: GOTO Label") + gbl.inpath.goto(ln[0].upper()) + +def eof(ln): + gbl.inpath.toEof() + + +####################################### +# Tempo/timing + + +def setTime(ln): + """ Set the 'time sig'. + + We do restrict the time setting to the range of 1..12. + No particular reason, but we do need some limit? Certainly + it has to be greater than 0. + """ + + if len(ln) != 1: + error("Use: Time N.") + + n = stoi(ln[0], "Argument for time must be integer.") + + if n < 1 or n > 12: + error("Time (beats/bar) must be 1..12.") + + # If no change, just ignore this. + + if gbl.QperBar != n: + gbl.QperBar = int(n) + + # Time changes zap all predfined sequences + + for a in gbl.tnames.values(): + a.clearSequence() + + +def tempo(ln): + """ Set tempo. """ + + if not ln or len(ln) >2: + error("Use: Tempo [*,+,-]BperM [BARS].") + + # Get new value. + + a = ln[0][0] + if a in "+-*": + v = stof(ln[0][1:], "Tempo expecting value for rate adjustment, not '%s'." % ln[0]) + if a == '-': + v = gbl.tempo - v + elif a == '+': + v += gbl.tempo + elif a == '*': + v *= gbl.tempo + + else: + v = stof(ln[0], "Tempo expecting rate, not '%s'." % ln[0]) + + + # is this immediate or over time? + + if len(ln) == 1: + gbl.tempo = int(v) + gbl.mtrks[0].addTempo(gbl.tickOffset, gbl.tempo) + if gbl.debug: + print "Set Tempo to %s" % gbl.tempo + + + else: # Do a tempo change over bar count + bars = ln[1] + + bars = stof(bars, "Expecting value, not %s" % bars ) + numbeats = int(bars * gbl.QperBar) + + if numbeats < 1: + error("Beat count must be greater than 1.") + + # Vary the rate in the meta track + + tincr = (v - gbl.tempo) / float(numbeats) # incr per beat + bstart = gbl.tickOffset # start + boff = 0 + tempo = gbl.tempo + + for n in range(numbeats): + tempo += tincr + if tempo: + gbl.mtrks[0].addTempo(bstart + boff, int(tempo)) + boff += gbl.BperQ + + if tempo != v: + gbl.mtrks[0].addTempo(bstart + boff, int(v) ) + + gbl.tempo = int(v) + + if gbl.debug: + print "Set future Tempo to %s over %s beats" % \ + ( int(tempo), numbeats) + + +def beatAdjust(ln): + """ Delete or insert some beats into the sequence. + + This just adjusts the current song position. Nothing is + lost or added to the actual file. + """ + + + if len(ln) != 1: + error("Use: BeatAdjust NN") + + adj = stof(ln[0], "Expecting a value (not %s) for BeatAdjust." % ln[0]) + + gbl.tickOffset += int(adj * gbl.BperQ) + + if gbl.debug: + print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1) + + +def cut(ln): + """ Insert a all-note-off into all tracks. """ + + if not len(ln): + ln=['0'] + + if len(ln) != 1: + error("Use: Cut Offset") + + """ Loop though all the tracks. Note that trackCut() checks + to make sure that there is a need to insert in specified track. + In this loop we create a list of channels as we loop though + all the tracks, skipping over any duplicate channels or + tracks with no channel assigned. + """ + + l=[] + for t in sorted(gbl.tnames.keys()): + c = gbl.tnames[t].channel + if not c or c in l: + continue + l.append(c) + trackCut(t, ln) + + +def fermata(ln): + """ Apply a fermata timing to the specified beat. """ + + if len(ln) != 3: + error("Use: Fermata 'offset' 'duration' 'adjustment'") + + offset = stof(ln[0], "Expecting a value (not '%s') " + "for Fermata Offset." % ln[0] ) + + if offset < -gbl.QperBar or offset > gbl.QperBar: + warning("Fermata: %s is a large beat offset." % offset) + + dur = stof(ln[1], "Expecting a value (not '%s') for Fermata " + "Duration." % ln[1]) + + if dur <= 0: + error("Fermata duration must be greater than 0.") + + if dur > gbl.QperBar: + warning("Fermata: %s is a large duration.") + + adj = stof(ln[2], "Expecting a value (not '%s') for Fermata " + "Adjustment." % ln[2]) + + if adj< 100: + warning("Fermata: Adjustment less than 100 is shortening beat value.") + + if adj == 100: + error("Fermata: using value of 100 makes no difference, " + "must be an error.") + + moff=int(gbl.tickOffset + (gbl.BperQ * offset)) + + if moff < 0: + error("Fermata offset comes before track start.") + + gbl.mtrks[0].addTempo(moff, int(gbl.tempo / (adj/100)) ) + + tickDur = int(gbl.BperQ * dur) + + gbl.mtrks[0].addTempo(moff + tickDur, gbl.tempo) + + # Clear out NoteOn events in all tracks + + if offset < 0: + start = moff + int(.05 * gbl.BperQ) + end = moff + tickDur - int(.05 * gbl.BperQ) + + for n, tr in gbl.mtrks.items(): + if n <= 0: continue # skip meta track + tr.zapRangeTrack(start, end ) + + if gbl.debug: + print "Fermata: Beat %s, Duration %s, Change %s, Bar %s" % \ + (offset, dur, adj, gbl.barNum + 1) + if offset < 0: + print "\tNoteOn Events removed in tick range %s to %s" \ + % (start, end) + + +####################################### +# Groove stuff + + +def grooveDefine(ln): + """ Define a groove. + + Current settings are assigned to a groove name. + """ + + if not len(ln): + error("Use: DefGroove Name") + + slot=ln[0].upper() + + # Slot names can't contain a '/' (reserved) or be an integer (used in groove select). + + if '/' in slot: + error("The '/' is not permitted in a groove name.") + + if slot.isdigit(): + error("Invalid slot name '%s'. Cannot be only digits." % slot) + + grooveDefineDo(slot) + + if gbl.debug: + print "Groove settings saved to '%s'." % slot + + if gbl.makeGrvDefs: + MMA.auto.updateGrooveList(slot) + + if len(ln) > 1: + MMA.docs.docDefine(ln) + + +def grooveDefineDo(slot): + + for n in gbl.tnames.values(): + n.saveGroove(slot) + + gbl.settingsGroove[slot] = { + 'SEQSIZE': gbl.seqSize, + 'SEQRNDWT': seqRndWeight[:], + 'QPERBAR': gbl.QperBar, + 'SEQRND': gbl.seqRnd[:], + 'TIMESIG': MMA.midi.timeSig.get(), + '81': MMA.notelen.noteLenTable['81'], + '82': MMA.notelen.noteLenTable['82'], + 'SWINGMODE': gbl.swingMode , + 'SWINGSKEW': gbl.swingSkew, + 'VRATIO': (MMA.volume.vTRatio, MMA.volume.vMRatio)} + + +def groove(ln): + """ Select a previously defined groove. """ + + global groovesList, groovesCount + + if not ln: + error("Groove: needs agrument(s)") + + tmpList =[] + + if ln[0].isdigit(): + wh=stoi(ln[0]) + if wh<1: + error("Groove selection must be > 0, not '%s'." % wh) + ln=ln[1:] + else: + wh = None + + for slot in ln: + slot = slot.upper() + if slot == "/": + if len(tmpList): + slot=tmpList[-1] + else: + error("A previous groove name is needed before a '/'.") + + if not slot in gbl.settingsGroove: + + if gbl.debug: + print "Groove '%s' not defined. Trying auto-load from libraries" \ + % slot + + l=MMA.auto.loadGrooveDir(slot) # name of the lib file with groove + + if l: + if gbl.debug: + print "Attempting to load groove '%s' from '%s'." \ + % (slot, l) + + usefile([os.path.join(gbl.autoLib, l)]) + + if not slot in gbl.settingsGroove: + error("Groove '%s' not found. Have libraries changed " + "since last 'mma -g' run?" % slot) + + else: + error("Groove '%s' could not be found in memory or library files" % slot ) + + tmpList.append(slot) + + if not len(tmpList): + error("Use: Groove [selection] Name [...]") + + """ If the first arg to list was an int() (ie: 3 groove1 groove2 grooveFoo) + we select from the list. After the selection, we reset the list to be + just the selected entry. This was, if there are multiple groove names without + a leading int() we process the list as groove list changing with each bar. + """ + + if wh: + wh = (wh-1) % len(tmpList) + tmpList=tmpList[wh:wh+1] + + slot=tmpList[0] + grooveDo(slot) + + groovesCount = 0 + if len(tmpList)==1: + groovesList=None + else: + groovesList=tmpList + + gbl.lastGroove = gbl.currentGroove + gbl.currentGroove = slot + if gbl.lastGroove == '': + gbl.lastGroove = slot + + if gbl.debug: + print "Groove settings restored from '%s'." % slot + +def grooveDo(slot): + """ This is separate from groove() so we can call it from + usefile() with a qualified name. """ + + global seqRndWeight + + oldSeqSize = gbl.seqSize + + g=gbl.settingsGroove[slot] + + gbl.seqSize = g['SEQSIZE'] + seqRndWeight = g['SEQRNDWT'] + gbl.QperBar = g['QPERBAR'] + gbl.seqRnd = g['SEQRND'] + MMA.midi.timeSig.set( *g['TIMESIG']) # passing tuple as 2 args. + MMA.notelen.noteLenTable['81'] = g['81'] + MMA.notelen.noteLenTable['82'] = g['82'] + gbl.swingMode = g['SWINGMODE'] + gbl.swingSkew = g['SWINGSKEW'] + MMA.volume.vTRatio, MMA.volume.vMRatio = g['VRATIO'] + + for n in gbl.tnames.values(): + n.restoreGroove(slot) + + """ This is important! Tracks NOT overwritten by saved grooves way + have the wrong sequence length. I don't see any easy way to hit + just the unchanged/unrestored tracks so we do them all. + Only done if a change in seqsize ... doesn't take long to be safe. + """ + + if oldSeqSize != gbl.seqSize: + for a in gbl.tnames.values(): + a.setSeqSize() + + seqRndWeight = MMA.pat.seqBump(seqRndWeight) + + gbl.seqCount = 0 + +####################################### +# File and I/O + +def include(ln): + """ Include a file. """ + + global beginData + + if beginData: + error("INCLUDE not permitted in Begin/End block") + + if len(ln) != 1: + error("Use: Include FILE" ) + + fn = MMA.file.locFile(ln[0], gbl.incPath) + if not fn: + error("Could not find include file '%s'." % ln) + + else: + parseFile(fn) + + +def usefile(ln): + """ Include a library file. """ + + global beginData + + if beginData: + error("USE not permitted in Begin/End block") + + if len(ln) != 1: + error("Use: Use FILE" ) + + ln = ln[0] + fn = MMA.file.locFile(ln, gbl.libPath) + + if not fn: + error("Unable to locate library file '%s'." % ln) + + """ USE saves current state, just like defining a groove. + Here we use a magic number which can't be created with + a defgroove ('cause it's an integer). Save, read, restore. + """ + + slot = 9988 + grooveDefineDo(slot) + parseFile(fn) + grooveDo(slot) + + +def mmastart(ln): + if not ln: + error ("Use: MMAstart FILE [file...]") + + gbl.mmaStart.extend(ln) + + if gbl.debug: + print "MMAstart set to:", + printList(ln) + +def mmaend(ln): + if not ln: + error ("Use: MMAend FILE [file...]") + + gbl.mmaEnd.extend(ln) + + if gbl.debug: + print "MMAend set to:", + printList(ln) + + +def setLibPath(ln): + """ Set the LibPath variable. """ + + if len(ln) > 1: + error("Only one path can be entered for LibPath.") + + f = os.path.expanduser(ln[0]) + + if gbl.debug: + print "LibPath set to", f + + gbl.libPath = f + + +def setAutoPath(ln): + """ Set the autoPath variable. """ + + if len(ln) > 1: + error("Only one path can be entered for AutoLibPath.") + + f = os.path.expanduser(ln[0]) + + MMA.auto.grooveDir = {} + + # To avoid conflicts, delete all existing grooves (current seq not effected) + + gbl.settingsGroove = {} + gbl.lastGroove = '' + gbl.currentGroove = '' + + if gbl.debug: + print "AutoLibPath set to", f + + gbl.autoLib = f + + +def setIncPath(ln): + """ Set the IncPath variable. """ + + if len(ln)>1: + error("Only one path is permitted in SetIncPath.") + + f = os.path.expanduser(ln[0]) + + if gbl.debug: + print "IncPath set to", f + + gbl.incPath=f + + +def setOutPath(ln): + """ Set the Outpath variable. """ + + if not ln: + gbl.outPath = "" + + elif len(ln) > 1: + error ("Use: SetOutPath PATH.") + + else: + gbl.outPath = os.path.expanduser(ln[0]) + + + +####################################### +# Sequence + +def seqsize(ln): + """ Set the length of sequences. """ + + global seqRndWeight + + if len(ln) !=1: + error("Usage 'SeqSize N'.") + + n = stoi(ln[0], "Argument for SeqSize must be integer.") + + # Setting the sequence size always resets the seq point + + gbl.seqCount = 0 + + """ Now set the sequence size for each track. The class call + will expand/contract existing patterns to match the new + size. + """ + + if n != gbl.seqSize: + gbl.seqSize = n + for a in gbl.tnames.values(): + a.setSeqSize() + + seqRndWeight = seqBump(seqRndWeight) + + if gbl.debug: + print "Set SeqSize to ", n + + +def seq(ln): + """ Set the sequence point. """ + + if len(ln) == 0: + s = 0 + elif len(ln)==1: + s = stoi(ln[0], "Expecting integer value after SEQ") + else: + error("Use: SEQ or SEQ NN to reset seq point.") + + + if s > gbl.seqSize: + error("Sequence size is '%d', you can't set to '%d'." % + (gbl.seqSize, s)) + + if s==0: + s=1 + + if s<0: + error("Seq parm must be greater than 0, not %s", s) + + gbl.seqCount = s-1 + + if gbl.seqRnd[0] == 1: + warning("SeqRnd has been disabled by a Seq command.") + seqRnd = [0] + + +def seqClear(ln): + """ Clear all sequences (except SOLO tracks). """ + + if ln: + error ("Use: 'SeqClear' with no args") + + for n in gbl.tnames.values(): + if n.vtype != "SOLO": + n.clearSequence() + MMA.volume.futureVol = [] + + setSeqRndWeight(['1']) + + +def setSeqRnd(ln): + """ Set random order for all tracks. """ + + emsg = "use [ON, OFF | TrackList ]." + if not ln: + error("SeqRnd:" + emsg) + + a=ln[0].upper() + + if a in ("ON", "1") and len(ln) == 1: + gbl.seqRnd = [1] + + elif a in ("OFF", "0") and len(ln) == 1: + gbl.seqRnd = [0] + + else: + gbl.seqRnd=[2] + for a in ln: + a = a.upper() + if not a in gbl.tnames: + error("SeqRnd: Track '%s' does not exist, %s." % (a, emsg)) + if a in gbl.seqRnd: + error("SeqRnd: Duplicate track '%s' specified, %s" % (a, emsg)) + gbl.seqRnd.append(a) + + if gbl.debug: + print "SeqRnd:", + if gbl.seqRnd[0] == 2: + for a in gbl.seqRnd[1:]: + print a, + print + else: + if gbl.seqRnd[0] == 1: + print "On" + else: + print "Off" + + +def setSeqRndWeight(ln): + """ Set global rnd weight. """ + + global seqRndWeight + + if not ln: + error("Use: RndWeight .") + + tmp = [] + for n in ln: + n = stoi(n) + if n < 0: error("RndWeight: Values must be 0 or greater.") + tmp.append(n) + + seqRndWeight = seqBump(tmp) + + if gbl.debug: + print "RndWeight: ", + printList(seqRndWeight) + + +def restart(ln): + """ Restart all tracks to almost-default condidions. """ + + if ln: + error ("Use: 'Restart' with no args") + + for n in gbl.tnames.values(): + n.restart() + + +####################################### +# Midi + +def midiMarker(ln): + """ Parse off midi marker. """ + + if len(ln) == 2: + offset = stof(ln[0]) + msg = ln[1] + elif len(ln) == 1: + offset = 0 + msg = ln[0] + else: + error("Usage: MidiMark [offset] Label.") + + offset = int(gbl.tickOffset + (gbl.BperQ * offset)) + if offset < 0: + error("MidiMark offset points before start of file.") + + gbl.mtrks[0].addMarker(offset, msg) + + +def rawMidi(ln): + """ Send hex bytes as raw midi stream. """ + + mb='' + for a in ln: + a=stoi(a) + + if a<0 or a >0xff: + error("All values must be in the range " + "0 to 0xff, not '%s'" % a) + + mb += chr(a) + + gbl.mtrks[0].addToTrack(gbl.tickOffset, mb) + + if gbl.debug: + print "Inserted raw midi in metatrack: ", + for b in mb: + print '%02x' % ord(b), + print + + +def mdefine(ln): + """ Set a midi seq pattern. """ + + if not ln: + error("MDefine needs arguments.") + + name = ln[0] + if name.startswith('_'): + error("Names with a leading underscore are reserved.") + + if name.upper() == 'Z': + error("The name 'Z' is reserved.") + + MMA.mdefine.mdef.set(name, ' '.join(ln[1:])) + + +def setMidiFileType(ln): + """ Set some MIDI file generation flags. """ + + if not ln: + error("USE: MidiFile [SMF=0/1] [RUNNING=0/1]") + + for l in ln: + try: + mode, val = l.upper().split('=') + except: + error("Each arg must contain an '=', not '%s'." % l) + + if mode == 'SMF': + if val == '0': + gbl.midiFileType = 0 + elif val == '1': + gbl.midiFileType = 1 + else: + error("Use: MIDIFile SMF=0/1") + + if gbl.debug: + print "Midi Filetype set to", gbl.midiFileType + + + elif mode == 'RUNNING': + if val == '0': + gbl.runningStatus = 0 + elif val == '1': + gbl.runningStatus = 1 + else: + error("Use: MIDIFile RUNNING=0/1") + + if gbl.debug: + print "Midi Running Status Generation set to", + if gbl.runningStatus: + print 'ON (Default)' + else: + print 'OFF' + + + else: + error("Use: MIDIFile [SMF=0/1] [RUNNING=0/1]") + + +def setChPref(ln): + """ Set MIDI Channel Preference. """ + + if not ln: + error("Use: ChannelPref TRACKNAME=CHANNEL [...]") + + for i in ln: + if '=' not in i: + error("Each item in ChannelPref must have an '='.") + + n,c = i.split('=') + + c = stoi(c, "Expecting an integer for ChannelPref, not '%s'." % c) + + if c<1 or c>16: + error("Channel for ChannelPref must be 1..16, not %s." % c) + + gbl.midiChPrefs[n.upper()]=c + + if gbl.debug: + print "ChannelPref:", + for n,c in gbl.midiChPrefs.items(): + print "%s=%s" % (n,c), + print + + +def setTimeSig(ln): + """ Set the midi time signature. """ + + if len(ln) == 1: + a=ln[0].upper() + if a == 'COMMON': + ln=('4','4') + elif a == 'CUT': + ln=('2','2') + + if len(ln) != 2: + error("TimeSig: Usage (num dem) or ('cut' or 'common').") + + nn = stoi(ln[0]) + + if nn<1 or nn>126: + error("Timesig NN must be 1..126") + + dd = stoi(ln[1]) + if dd == 1: dd = 0 + elif dd == 2: dd = 1 + elif dd == 4: dd = 2 + elif dd == 8: dd = 3 + elif dd == 16: dd = 4 + elif dd == 32: dd = 5 + elif dd == 64: dd = 6 + else: + error("Unknown value for timesig denominator") + + MMA.midi.timeSig.set(nn,dd) + + + + +####################################### +# Misc + + +def rndseed(ln): + """ Reseed the random number generator. """ + + if not ln: + random.seed() + + elif len(ln)>1: + error("RNDSEED: requires 0 or 1 arguments.") + else: + random.seed(stof(ln[0])) + +def transpose(ln): + """ Set transpose value. """ + + + if len(ln) != 1: + error("Use: Transpose N.") + + t = stoi(ln[0], "Argument for Tranpose must be an integer, not '%s'" % ln[0]) + if t < -12 or t > 12: + error("Tranpose %s out-of-range; must be -12..12." % t) + + gbl.transpose = t + + if gbl.debug: + print "Set Transpose to %s" % t + + +def lnPrint(ln): + """ Print stuff in a "print" command. """ + + print " ".join(ln) + + +def printActive(ln): + """ Print a list of the active tracks. """ + + print "Active tracks, groove:", gbl.currentGroove, ' '.join(ln) + + for a in sorted(gbl.tnames.keys()): + f=gbl.tnames[a] + if f.sequence: + print " ",a + print + + +def setDebug(ln): + """ Set debugging options dynamically. """ + + msg=( "Use: Debug MODE=On/Off where MODE is one or more of " + "DEBUG, FILENAMES, PATTERNS, SEQUENCE, " + "RUNTIME, WARNINGS or EXPAND." ) + + + if not len(ln): + error(msg) + + # save current flags + + gbl.Ldebug = gbl.debug + gbl.LshowFilenames = gbl.showFilenames + gbl.Lpshow = gbl.pshow + gbl.Lseqshow = gbl.seqshow + gbl.Lshowrun = gbl.showrun + gbl.LnoWarn = gbl.noWarn + gbl.LnoOutput = gbl.noOutput + gbl.LshowExpand = gbl.showExpand + gbl.Lchshow = gbl.chshow + + + for l in ln: + try: + mode, val = l.upper().split('=') + except: + error("Each debug option must contain a '=', not '%s'" % l) + + if val == 'ON' or val == '1': + setting = 1 + elif val == 'OFF' or val == '0': + setting = 0 + else: + error(msg) + + if mode == 'DEBUG': + gbl.debug = setting + if gbl.debug: + print "Debug=%s." % val + + elif mode == 'FILENAMES': + gbl.showFilenames = setting + if gbl.debug: + print "ShowFilenames=%s." % val + + elif mode == 'PATTERNS': + gbl.pshow = setting + if gbl.debug: + print "Pattern display=%s." % val + + elif mode == 'SEQUENCE': + gbl.seqshow = setting + if gbl.debug: + print "Sequence display=%s." % val + + elif mode == 'RUNTIME': + gbl.showrun = setting + if gbl.debug: + print "Runtime display=%s." % val + + elif mode == 'WARNINGS': + gbl.noWarn = not(setting) + if gbl.debug: + print "Warning display=%s." % val + + elif mode == 'EXPAND': + gbl.showExpand = setting + if gbl.debug: + print "Expand display=%s." % val + + else: + error(msg) + + + +########################################################### +########################################################### +## Track specific commands + + +####################################### +# Pattern/Groove + +def trackDefPattern(name, ln): + """ Define a pattern for a track. + + Use the type-name for all defines.... check the track + names and if it has a '-' in it, we use only the + part BEFORE the '-'. So DRUM-Snare becomes DRUM. + """ + + ln=ln[:] + + name=name.split('-')[0] + + trackAlloc(name, 1) + + if ln: + pattern = ln.pop(0).upper() + else: + error("Define is expecting a pattern name.") + + if pattern in ('z', 'Z', '-'): + error("Pattern name '%s' is reserved." % pattern) + + if pattern.startswith('_'): + error("Names with a leading underscore are reserved.") + + if not ln: + error("No pattern list given for '%s %s'." % (name, pattern) ) + + ln=' '.join(ln) + gbl.tnames[name].definePattern(pattern, ln) + + +def trackSequence(name, ln): + """ Define a sequence for a track. + + The format for a sequence: + TrackName Seq1 [Seq2 ... ] + + Note, that SeqX can be a predefined seq or { seqdef } + The {} is dynamically interpreted into a def. + """ + + if not ln: + error ("Use: %s Sequence NAME [...]" % name) + + ln = ' '.join(ln) + + """ Extract out any {} definitions and assign them to new + define variables (__1, __99, etc) and melt them + back into the string. + """ + + ids=1 + while 1: + sp = ln.find("{") + + if sp<0: + break + + ln, s = pextract(ln, "{", "}", 1) + if not s: + error("Did not find matching '}' for '{'") + + pn = "_%s" % ids + ids+=1 + + trk=name.split('-')[0] + trackAlloc(trk, 1) + + gbl.tnames[trk].definePattern(pn, s[0]) + ln = ln[:sp] + ' ' + pn + ' ' + ln[sp:] + + ln=ln.split() + + gbl.tnames[name].setSequence(ln) + + +def trackSeqClear(name, ln): + """ Clear sequence for specified tracks. + + Note: "Drum SeqClear" clears all Drum tracks, + "Drum-3 SeqClear" clears track Drum-3. + """ + + if ln: + error("No args permitted. Use %s SEQCLEAR" % name) + + for n in gbl.tnames: + if n.find(name) == 0: + if gbl.debug: + print "SeqClear: Track %s cleared." % n + gbl.tnames[n].clearSequence() + + +def trackSeqRnd(name, ln): + """ Set random order for specified track. """ + + if len(ln) != 1: + error("Use: %s SeqRnd [On, Off]." % name) + + gbl.tnames[name].setRnd(ln[0].upper()) + +def trackSeqRndWeight(name, ln): + """ Set rnd weight for track. """ + + if not ln: + error("Use: %s RndWeight ." % name) + + gbl.tnames[name].setRndWeight(ln) + + +def trackRestart(name, ln): + """ Restart track to almost-default condidions. """ + + if ln: + error ("Use: '%s Resart' with no args", name) + + gbl.tnames[name].restart() + + + +def trackGroove(name, ln): + """ Select a previously defined groove for a single track. """ + + if len(ln) != 1: + error("Use: %s Groove Name" % name) + + + slot = ln[0].upper() + + if not slot in gbl.settingsGroove: + error("Groove '%s' not defined" % slot) + + g=gbl.tnames[name] + g.restoreGroove(slot) + + if g.sequence == [None] * len(g.sequence): + warning("'%s' Track Groove has no sequence. Track name error?" % name) + + g.setSeqSize() + + if gbl.debug: + print "%s Groove settings restored from '%s'." % (name, slot) + + +def trackRiff(name, ln): + """ Set a riff for a track. """ + + gbl.tnames[name].setRiff(' '.join(ln)) + + + +def deleteTrks(ln): + """ Delete a track and free the MIDI track. """ + + if not len(ln): + error("Use Delete Track [...]") + + for name in ln: + name=name.upper() + if name in gbl.tnames: + tr = gbl.tnames[name] + else: + error("Track '%s' does not exist" % name) + + if tr.channel: + tr.doMidiClear() + tr.clearPending() + + if tr.riff: + warning("%s has pending RIFF(s)" % name) + gbl.midiAvail[tr.channel] -= 1 + + # NOTE: Don't try deleting 'tr' since it's just a copy!! + + del gbl.tnames[name] + + if not name in gbl.deletedTracks: + gbl.deletedTracks.append(name) + + if gbl.debug: + print "Track '%s' deleted" % name + + + +####################################### +# Volume + +def trackRvolume(name, ln): + """ Set random volume for specific track. """ + + if not ln: + error ("Use: %s RVolume N [...]." % name) + + gbl.tnames[name].setRVolume(ln) + + +def trackCresc(name, ln): + gbl.tnames[name].setCresc(1, ln) + #error("(De)Crescendo only supported in master context.") + +def trackDeCresc(name, ln): + gbl.tnames[name].setCresc(-1, ln) + +def trackVolume(name, ln): + """ Set volume for specific track. """ + + if not ln: + error ("Use: %s Volume DYN [...]." % name) + + gbl.tnames[name].setVolume(ln) + + +def trackChannelVol(name, ln): + """ Set the channel volume for a track.""" + + if len(ln) != 1: + error("Use: %s ChannelVolume." % name) + + v=stoi(ln[0], "Expecting integer arg, not %s." % ln[0]) + + if v<0 or v>127: + error("ChannelVolume must be 0..127") + + gbl.tnames[name].setChannelVolume(v) + + +def trackAccent(name, ln): + """ Set emphasis beats for track.""" + + gbl.tnames[name].setAccent(ln) + + +####################################### +# Timing + +def trackCut(name, ln): + """ Insert a ALL NOTES OFF at the given offset. """ + + + if not len(ln): + ln=['0'] + + if len(ln) != 1: + error("Use: %s Cut Offset" % name) + + + offset = stof(ln[0], "Cut offset expecting value, (not '%s')." % ln[0]) + + if offset < -gbl.QperBar or offset > gbl.QperBar: + warning("Cut: %s is a large beat offset." % offset) + + + + moff = int(gbl.tickOffset + (gbl.BperQ * offset)) + + if moff < 0: + error("Calculated offset for Cut comes before start of track.") + + """ Insert allnoteoff directly in track. This skips the normal + queueing in pats because it would never take if at the end + of a track. + """ + + m = gbl.tnames[name].channel + if m and len(gbl.mtrks[m].miditrk) > 1: + gbl.mtrks[m].addNoteOff(moff) + + + if gbl.debug: + print "%s Cut: Beat %s, Bar %s" % (name, offset, gbl.barNum + 1) + + +def trackMallet(name, ln): + """ Set repeating-mallet options for solo/melody track. """ + + if not ln: + error("Use: %s Mallet [...]." % name) + + gbl.tnames[name].setMallet(ln) + + +def trackRtime(name, ln): + """ Set random timing for specific track. """ + + if not ln: + error ("Use: %s RTime N [...]." % name) + + + gbl.tnames[name].setRTime(ln) + + +def trackRskip(name, ln): + """ Set random skip for specific track. """ + + if not ln: + error ("Use: %s RSkip N [...]." % name) + + + gbl.tnames[name].setRSkip(ln) + + +def trackArtic(name, ln): + """ Set articulation. """ + + if not ln: + error("Use: %s Articulation N [...]." % name) + + + gbl.tnames[name].setArtic(ln) + + +####################################### +# Chord stuff + + +def trackCompress(name, ln): + """ Set (unset) compress for track. """ + + if not ln: + error("Use: %s Compress " % name) + + gbl.tnames[name].setCompress(ln) + + +def trackVoicing(name, ln): + """ Set Voicing options. Only valid for chord tracks at this time.""" + + if not ln: + error("Use: %s Voicing [...]" % name) + + + gbl.tnames[name].setVoicing(ln) + + + +def trackDupRoot(name, ln): + """ Set (unset) the root note duplication. Only applies to chord tracks. """ + + if not ln: + error("Use: %s DupRoot ..." % name) + + gbl.tnames[name].setDupRoot(ln) + + +def trackChordLimit(name, ln): + """ Set (unset) ChordLimit for track. """ + + if len(ln) != 1: + error("Use: %s ChordLimit " % name) + + gbl.tnames[name].setChordLimit(ln[0]) + +def trackRange(name, ln): + """ Set (unset) Range for track. Only effects arp and scale. """ + + if not ln: + error("Use: %s Range ... " % name) + + + gbl.tnames[name].setRange(ln) + + +def trackInvert(name, ln): + """ Set invert for track.""" + + if not ln: + error("Use: %s Invert N [...]." % name) + + gbl.tnames[name].setInvert(ln) + + +def trackSpan(name, ln): + """ Set midi note span for track. """ + + if len(ln) != 2: + error("Use: %s Start End" % name) + + start = stoi(ln[0], "Expecting integer for SPAN 1st arg.") + if start <0 or start >127: + error("Start arg for Span must be 0..127, not %s." % start) + + end = stoi(ln[1], "Expecting integer for SPAN 2nd arg.") + if end <0 or end >127: + error("End arg for Span must be 0..127, not %s." % end) + + if end <= start: + error("End arg for Span must be greater than start.") + + if end-start < 11: + error("Span range must be at least 12.") + + gbl.tnames[name].setSpan(start, end) + + + +def trackOctave(name, ln): + """ Set octave for specific track. """ + + if not ln: + error ("Use: %s Octave N [...], (n=0..10)" % name) + + + gbl.tnames[name].setOctave( ln ) + + +def trackStrum(name, ln): + """ Set all specified track strum. """ + + if not ln: + error ("Use: %s Strum N [...]" % name) + + + gbl.tnames[name].setStrum( ln ) + + +def trackHarmony(name, ln): + """ Set harmony value. """ + + if not ln: + error("Use: %s Harmony N [...]" % name) + + gbl.tnames[name].setHarmony(ln) + + +def trackHarmonyOnly(name, ln): + """ Set harmony only for track. """ + + if not ln: + error("Use: %s HarmonyOnly N [...]" % name) + + gbl.tnames[name].setHarmonyOnly(ln) + +def trackHarmonyVolume(name, ln): + """ Set harmony volume for track.""" + + if not ln: + error("Use: %s HarmonyVolume N [...]" % name) + + gbl.tnames[name].setHarmonyVolume(ln) + + +####################################### +# MIDI setting + + +def trackChannel(name, ln): + """ Set the midi channel for a track.""" + + if not ln: + error("Use: %s Channel" % name) + + gbl.tnames[name].setChannel(ln[0]) + + +def trackMdefine(name, ln): + """ Set a midi seq pattern. Ignore track name.""" + + mdefine(ln) + + +def trackMidiExt(ln): + """ Helper for trackMidiSeq() and trackMidiVoice().""" + + ids=1 + while 1: + sp = ln.find("{") + + if sp<0: + break + + ln, s = pextract(ln, "{", "}", 1) + if not s: + error("Did not find matching '}' for '{'") + + pn = "_%s" % ids + ids+=1 + + MMA.mdefine.mdef.set(pn, s[0]) + ln = ln[:sp] + ' ' + pn + ' ' + ln[sp:] + + return ln.split() + + +def trackMidiClear(name, ln): + """ Set MIDI command to send at end of groove. """ + + if not ln: + error("Use %s MIDIClear Controller Data" % name) + + + if len(ln) == 1 and ln[0] == '-': + gbl.tnames[name].setMidiClear( '-' ) + else: + ln=' '.join(ln) + if '{' in ln or '}' in ln: + error("{}s are not permitted in %s MIDIClear command." % name) + gbl.tnames[name].setMidiClear( trackMidiExt( '{' + ln + '}' )) + + +def trackMidiSeq(name, ln): + """ Set reoccurring MIDI command for track. """ + + if not ln: + error("Use %s MidiSeq Controller Data " % name) + + if len(ln) == 1 and ln[0]== '-': + gbl.tnames[name].setMidiSeq('-') + else: + gbl.tnames[name].setMidiSeq( trackMidiExt(' '.join(ln) )) + + +def trackMidiVoice(name, ln): + """ Set single shot MIDI command for track. """ + + if not ln: + error("Use %s MidiVoice Controller Data" % name) + + if len(ln) == 1 and ln[0] == '-': + gbl.tnames[name].setMidiVoice( '-' ) + else: + gbl.tnames[name].setMidiVoice( trackMidiExt(' '.join(ln) )) + + +def trackChShare(name, ln): + """ Set MIDI channel sharing.""" + + if len(ln) !=1: + error("Use: %s ChShare TrackName" % name) + + gbl.tnames[name].setChShare(ln[0]) + + +def trackVoice(name, ln): + """ Set voice for specific track. """ + + if not ln: + error ("Use: %s Voice NN [...]" % name) + + + gbl.tnames[name].setVoice(ln) + + +def trackPan(name, ln): + """ Set the Midi Pan value for a track.""" + + if len(ln) != 1: + error("Use: %s PAN NN" % name) + + gbl.tnames[name].setPan(ln[0]) + + +def trackOff(name, ln): + """ Turn a track off """ + + if ln: + error("Use: %s OFF with no paramater." % name) + + gbl.tnames[name].setOff() + + +def trackOn(name, ln): + """ Turn a track on """ + + if ln: + error("Use: %s ON with no paramater." % name) + + gbl.tnames[name].setOn() + + +def trackMidiName(name,ln): + """ Set channel track name.""" + + if not ln: + error("Use: %s TrackName." % name) + + gbl.tnames[name].setTname(ln[0]) + + +def trackTone(name, ln): + """ Set the tone (note). Only valid in drum tracks.""" + + if not ln: + error("Use: %s Tone N [...]." % name) + + gbl.tnames[name].setTone(ln) + + +def trackGlis(name, ln): + """ Enable/disable portamento. """ + + if len(ln) != 1: + error("Use: %s Portamento NN, off=0, 1..127==on." % name) + + gbl.tnames[name].setGlis(ln[0]) + +def trackForceOut(name, ln): + """ Force output of voice settings. """ + + if len(ln): + error("Use %s ForceOut (no options)." % name) + + gbl.tnames[name].setForceOut() + + +####################################### +# Misc + +def trackDrumType(name, ln): + """ Set a melody or solo track to be a drum solo track.""" + + tr = gbl.tnames[name] + if tr.vtype not in ('SOLO', 'MELODY'): + error ("Only Solo and Melody tracks can be to DrumType, not '%s'." + % name) + if ln: + error("No parmeters permitted for DrumType command.") + + tr.setDrumType() + + +def trackDirection(name, ln): + """ Set scale/arp direction. """ + + if not ln: + error("Use: %s Direction OPT" % name) + + + gbl.tnames[name].setDirection(ln) + + +def trackScaletype(name, ln): + """ Set the scale type. """ + + if not ln: + error("Use: %s ScaleType OPT" % name) + + gbl.tnames[name].setScaletype(ln) + + +def trackCopy(name, ln): + """ Copy setting in 'ln' to 'name'. """ + + if len(ln) != 1: + error("Use: %s Copy ExistingTrack" % name) + + gbl.tnames[name].copySettings(ln[0].upper()) + + +def trackUnify(name, ln): + """ Set UNIFY for track.""" + + if not len(ln): + error("Use %s UNIFY 1 [...]" % name) + + gbl.tnames[name].setUnify(ln) + + + +""" ================================================================= + + Command jump tables. These need to be at the end of this module + to avoid undefined name errors. The tables are only used in + the parse() function. + + The first table is for the simple commands ... those which DO NOT + have a leading trackname. The second table is for commands which + require a leading track name. + + The alphabetic order is NOT needed, just convenient. + +""" + +simpleFuncs={ + 'ADJUSTVOLUME': MMA.volume.adjvolume, + 'ALLTRACKS': allTracks, + 'AUTHOR': MMA.docs.docAuthor, + 'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo, + 'BEATADJUST': beatAdjust, + 'CHANNELPREF': setChPref, + 'COMMENT': comment, + 'CRESC': MMA.volume.setCresc, + 'CUT': cut, + 'DEBUG': setDebug, + 'DEC': macros.vardec, + 'DECRESC': MMA.volume.setDecresc, + 'DEFCHORD': MMA.chords.defChord, + 'DEFGROOVE': grooveDefine, + 'DELETE': deleteTrks, + 'DOC': MMA.docs.docNote, + 'DRUMVOLTR': MMA.translate.drumVolTable.set, + 'ELSE': ifelse, + 'ENDIF': ifend, + 'ENDMSET': endmset, + 'ENDREPEAT': repeatend, + 'EOF': eof, + 'FERMATA': fermata, + 'GOTO': goto, + 'GROOVE': groove, + 'IF': macros.varIF, + 'IFEND': ifend, + 'INC': macros.varinc, + 'INCLUDE': include, + 'KEYSIG': MMA.patSolo.keySig.set, + 'LABEL': comment, + 'LYRIC': lyric.option, + 'MIDIDEF': mdefine, + 'MIDI': rawMidi, + 'MIDIFILE': setMidiFileType, + 'MIDIINC': MMA.midiIn.midiinc, + 'MIDIMARK': midiMarker, + 'MIDISPLIT': MMA.midi.setSplitChannels, + 'MMAEND': mmaend, + 'MMASTART': mmastart, + 'MSET': macros.msetvar, + 'MSETEND': endmset, + 'CHORDADJUST': MMA.chords.chordAdjust, + 'PRINT': lnPrint, + 'PRINTACTIVE': printActive, + 'PRINTCHORD': MMA.chords.printChord, + 'REPEAT': repeat, + 'REPEATEND': repeatend, + 'REPEATENDING': repeatending, + 'RESTART': restart, + 'RNDSEED': rndseed, + 'RNDSET': macros.rndvar, + 'SEQ': seq, + 'SEQCLEAR': seqClear, + 'SEQRND': setSeqRnd, + 'SEQRNDWEIGHT': setSeqRndWeight, + 'SEQSIZE': seqsize, + 'SET': macros.setvar, + 'SETAUTOLIBPATH': setAutoPath, + 'SETINCPATH': setIncPath, + 'SETLIBPATH': setLibPath, + 'SETOUTPATH': setOutPath, + 'SHOWVARS': macros.showvars, + 'STACKVALUE': macros.stackValue, + 'SWINGMODE': MMA.notelen.swingMode, + 'TEMPO': tempo, + 'TIME': setTime, + 'TIMESIG': setTimeSig, + 'TONETR': MMA.translate.dtable.set, + 'UNSET': macros.unsetvar, + 'USE': usefile, + 'VEXPAND': macros.vexpand, + 'VOICEVOLTR': MMA.translate.voiceVolTable.set, + 'VOICETR': MMA.translate.vtable.set, + 'VOLUME': MMA.volume.setVolume, + 'TRANSPOSE': transpose +} + + +trackFuncs={ + 'ACCENT': trackAccent, + 'ARTICULATE': trackArtic, + 'CHANNEL': trackChannel, + 'MIDIVOLUME': trackChannelVol, + 'CHSHARE': trackChShare, + 'COMPRESS': trackCompress, + 'COPY': trackCopy, + 'CRESC': trackCresc, + 'CUT': trackCut, + 'DECRESC': trackDeCresc, + 'DIRECTION': trackDirection, + 'DRUMTYPE': trackDrumType, + 'DUPROOT': trackDupRoot, + 'FORCEOUT': trackForceOut, + 'GROOVE': trackGroove, + 'HARMONY': trackHarmony, + 'HARMONYONLY': trackHarmonyOnly, + 'HARMONYVOLUME': trackHarmonyVolume, + 'INVERT': trackInvert, + 'LIMIT': trackChordLimit, + 'MALLET': trackMallet, + 'MIDIDEF': trackMdefine, + 'MIDIGLIS': trackGlis, + 'MIDICLEAR': trackMidiClear, + 'MIDIPAN': trackPan, + 'MIDIGLIS': trackGlis, + 'MIDISEQ': trackMidiSeq, + 'MIDITNAME': trackMidiName, + 'MIDIVOICE': trackMidiVoice, + 'OCTAVE': trackOctave, + 'OFF': trackOff, + 'ON': trackOn, + 'RANGE': trackRange, + 'RESTART': trackRestart, + 'RIFF': trackRiff, + 'RSKIP': trackRskip, + 'RTIME': trackRtime, + 'RVOLUME': trackRvolume, + 'SCALETYPE': trackScaletype, + 'SEQCLEAR': trackSeqClear, + 'SEQRND': trackSeqRnd, + 'SEQUENCE': trackSequence, + 'SEQRNDWEIGHT': trackSeqRndWeight, + 'NOTESPAN': trackSpan, + 'STRUM': trackStrum, + 'TONE': trackTone, + 'UNIFY': trackUnify, + 'VOICE': trackVoice, + 'VOICING': trackVoicing, + 'VOLUME': trackVolume, + 'DEFINE': trackDefPattern +} + + diff --git a/mma/MMA/pat.py b/mma/MMA/pat.py new file mode 100644 index 0000000..b3f7577 --- /dev/null +++ b/mma/MMA/pat.py @@ -0,0 +1,2114 @@ + +# pat.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + +import copy +import random +import math + +import gbl +from MMA.common import * +from MMA.notelen import getNoteLen +import MMA.translate +import MMA.midi +import MMA.midiC +import MMA.alloc +import MMA.mdefine +import MMA.volume + +class Voicing: + def __init__(self): + self.mode = None + self.range = 12 + self.center = 4 + self.random = 0 + self.percent = 0 + self.bcount = 0 + self.dir = 0 + + +def seqBump(l): + """ Expand/contract an existing sequence list to the current seqSize.""" + + while len(l) < gbl.seqSize: + l += l + return l[:gbl.seqSize] + +pats = {} # Storage for all pattern defines + + +class PC: + """ Pattern class. + + Define classes for processing drum, chord, arp, and chord track. + These are mostly the same, so we create a base class and derive + the others from it. + + We have a class for each track type. They are all derived + from the base 'Pats' class. These classes do special processing + like parsing a pattern tuple and creating a chord. + + No functions ever link to the code in this module, it is + only included into the real track class modules. + + """ + + def __init__(self, nm): + + self.inited = 0 + self.name = nm + self.channel = 0 + self.grooves = {} + self.saveVols = {} + self.ssvoice = -1 # Track the voice set for the track + self.smidiVoice = () # Track MIDIVoice cmds to avoid dups + self.midiSent = 0 # if set, MIDICLEAR invoked. + + + """ Midi commands like Pan, Glis, etc. are stacked until musical + data is actually written to the track. Each item in + the midiPending list is a name (PAN, GLIS, etc), timeoffset, value. + """ + + self.midiPending = [] + + self.riff = [] + + self.disable = 0 + + if self.vtype == 'DRUM': + self.setChannel('10') + if not gbl.mtrks[self.channel].trackname: + gbl.mtrks[self.channel].addTrkName(0, 'Drum') + + self.clearSequence() + + + self.inited = 1 + + ########################################## + ## These are called from process() to set options + + def setCompress(self, ln): + """ set/unset the compress flag. """ + + ln=self.lnExpand(ln, 'Compress') + + tmp = [] + + for n in ln: + + n = stoi(n, "Argument for %s Compress must be a value." \ + % self.name) + + if n < 0 or n > 5: + error("Compress %s out-of-range; must be 0 to 5." % n) + + if n and self.vtype=='CHORD' and self.voicing.mode: + vwarn = 1 + + tmp.append(n) + + self.compress = seqBump(tmp) + + if self.vtype not in ("CHORD", "ARPEGGIO"): + warning ("Compress is ignored in %s tracks." % self.vtype) + + if gbl.debug: + print "Set %s Compress to " % self.name, + printList(ln) + + + def setRange(self, ln): + """ set range. """ + + ln=self.lnExpand(ln, 'Range') + + tmp = [] + + for n in ln: + + n = stof(n) + if n == 0: + n=1 + if n <= 0 or n >= 6: + error("Range %s out-of-range; must be between 0..6, not %s." % (self.name, n)) + + tmp.append(n) + + self.chordRange = seqBump(tmp) + + if self.vtype not in ("SCALE", "ARPEGGIO"): + warning ("Range has no effect in '%s' tracks." % self.vtype) + + if gbl.debug: + print "Set %s Range to " % self.name, + printList(ln) + + + def setVoicing(self, ln): + """ set the Voicing Mode options. """ + + + if self.vtype != "CHORD": + error("Voicing is not supported for %s tracks." % self.vtype) + + for l in ln: + try: + mode, val = l.upper().split('=') + except: + error("Each Voicing option must contain a '=', not '%s'" % l) + + + if mode == 'MODE': + valid= ("-", "OPTIMAL", "NONE", "ROOT", "COMPRESSED", "INVERT") + + if not val in valid: + error("Valid Voicing Modes are: %s" % " ".join(valid)) + + if val in ('-', 'NONE',"ROOT"): + val = None + + + if val and (max(self.invert) + max(self.compress)): + warning("Setting both VoicingMode and Invert/Compress " + "is not a good idea") + + """ When we set voicing mode we always reset this. This forces + the voicingmode code to restart its rotations. + """ + + self.lastChord = [] + + self.voicing.mode = val + + + elif mode == 'RANGE': + val = stoi(val, "Argument for %s Voicing Range " + "must be a value." % self.name) + + if val < 1 or val > 30: + error("Voicing Range '%s' out-of-range; " + "must be 1 to 30." % val) + + self.voicing.range = val + + + elif mode == 'CENTER': + val = stoi(val, "Argument for %s Voicing Center " + "must be a value." % self.name) + + if val < 1 or val > 12: + error("Voicing Center %s out-of-range; " + "must be 1 to 12." % val) + + self.voicing.center = val + + elif mode == 'RMOVE': + val = stoi(val, "Argument for %s Voicing Random " + "must be a value." % self.name) + + if val < 0 or val > 100: + error("Voicing Random value must be 0 to 100 " + "not %s" % val) + + self.voicing.random = val + self.voicing.bcount = 0 + + elif mode == 'MOVE': + val = stoi(val, "Argument for %s Voicing Move " + "must be a value." % self.name) + + if val < 0 : + error("Voicing Move (bar count) must >= 0, not %s" % val) + if val > 20: + warning("Voicing Move (bar count) %s is quite large" % val) + + self.voicing.bcount = val + self.voicing.random = 0 + + elif mode == 'DIR': + val = stoi(val, "Argument for %s Voicing Dir (move direction) " + "must be a value." % self.name) + + if not val in (1,0,-1): + error("Voicing Move Dir -1, 0 or 1, not %s" % val) + + self.voicing.dir = val + + + if gbl.debug: + v=self.voicing + print "Set %s Voicing MODE=%s" % (self.name, v.mode), + print "RANGE=%s CENTER=%s" % (v.range, v.center), + print "RMOVE=%s MOVE=%s DIR=%s" % (v.random, v.bcount, v.dir) + + + def setForceOut(self): + """ Set the force output flag. This does 2 things: assigns + a midi channel and sends the voicing setting to the track. + """ + + if not self.channel: + self.setChannel() + self.clearPending() + + self.insertVoice() + + + def setDupRoot(self, ln): + """ set/unset root duplication. """ + + if self.vtype != 'CHORD': + error("RootDup can only be applied to CHORD tracks.") + + ln=self.lnExpand(ln, 'DupRoot') + tmp = [] + + for n in ln: + n = stoi(n, "Argument for %s DupRoot must be a value." % self.name) + + if n < -9 or n > 9: + error("DupRoot %s out-of-range; must be -9 to 9." % n) + + tmp.append( n * 12 ) + + self.dupRoot = seqBump(tmp) + + if gbl.debug: + print "Set %s DupRoot to " % self.name, + printList(ln) + + + def setChordLimit(self, ln): + """ set/unset the chordLimit flag. """ + + n = stoi(ln, "Argument for %s ChordLimit must be a value." % self.name) + + if n < 0 or n > 8: + error("ChordLimit %s out-of-range; must be 0 to 8." % n) + + self.chordLimit = n + + if self.vtype not in ("CHORD", "ARPEGGIO"): + warning ("Limit is ignored in %s tracks." % self.vtype) + + + if gbl.debug: + print "Set %s ChordLimit to %s" % (self.name, n) + + + def setChannel(self, ln=None): + """ Set the midi-channel number for a track. + + - Checks for channel duplication + - Auto assigns channel number if ln=='' + + + If no track number was passed, then we try to + auto-alloc a track. First, we see if a preference + was set via MidiChPref. If these is no preference, + or if the preferred channel is already allocated + we go though the list, top to bottom, to find + an available channel. + """ + + if not ln: + try: + c=gbl.midiChPrefs[self.name] + except: + c=0 + + if not c or gbl.midiAvail[c]: + c=-1 + for a in range(16, 0, -1): + if a!=10 and not gbl.midiAvail[a]: + c=a + break + + if c < 0: + error("No MIDI channel is available for %s.\n" + "Try CHShare or Delete unused tracks." % self.name) + + else: + c = stoi(ln, "%s Channel assignment expecting Value, not %s" % + (self.name, ln)) + + if c<0 or c>16: + error("%s Channel must be 0..16, not %s" % (self.name, ln)) + + if c == 10: + if self.vtype == 'DRUM': + pass + elif self.vtype in ('SOLO', 'MELODY') and self.drumType: + pass + else: + error("Channel 10 is reserved for DRUM, not %s." % self.name) + + if self.vtype == 'DRUM' and c != 10: + error("DRUM tracks must be assigned to channel 10.") + + # Disable the channel. + + if c == 0: + if gbl.midiAvail[self.channel]: + gbl.midiAvail[self.channel] -= 1 + s="%s channel disabled." % self.name + if gbl.midiAvail[self.channel]: + s+=" Other tracks are still using channel %s." % self.channel + else: + s+=" Channel %s available." % self.channel + warning(s) + self.channel = 0 + self.disable = 1 + return + + + if c != 10: + for a, tr in gbl.tnames.items(): + if a == self.name: # okay to reassign same number + continue + + if tr.channel == c: + error("Channel %s is assigned to %s." % (c, tr.name ) ) + + self.channel = c + if not self.name in gbl.midiAssigns[c]: + gbl.midiAssigns[c].append(self.name) + + gbl.midiAvail[c]+=1 + + if not c in gbl.mtrks: + gbl.mtrks[c]=MMA.midi.Mtrk(c) + offset=0 + if gbl.debug: + print "MIDI channel %s buffer created." % c + else: + offset = gbl.tickOffset + + if c != 10: + f=0 + for a, i in enumerate(self.midiPending): + if i[0]=='TNAME': + f=1 + if not f: + self.midiPending.append(('TNAME', 0, self.name.title() )) + + if gbl.debug: + print "MIDI Channel %s assigned to %s." % (self.channel, self.name) + + + def setChShare(self, ln): + """ Share midi-channel setting. """ + + if self.channel: # If channel already assigned, ignore + warning("Channel for %s has previously been assigned " + "(can't ChShare)." % self.name) + return + + """ Get name of track to share with and make sure it exists. + If not, trackAlloc() will create the track. Do some + sanity checks and ensure that the shared track has + a channel assigned. + """ + + sc = ln.upper() + + MMA.alloc.trackAlloc(sc, 1) + + if not sc in gbl.tnames: + error("Channel '%s' does not exist. No such name." % sc) + + if sc == self.name: + error("%s can't share MIDI channel with itself." % sc) + + + if not gbl.tnames[sc].channel: + gbl.tnames[sc].setChannel() + + schannel = gbl.tnames[sc].channel + + if not schannel: + error("CHShare attempted to assign MIDI channel for %s, but " + "none avaiable." % self.name) + + + """ Actually do the assignment. Also copy voice/octave from + base track to this one ... it's going to use that voice anyway? + """ + + self.channel = schannel + + self.voice = gbl.tnames[sc].voice[:] + self.octave = gbl.tnames[sc].octave[:] + + + # Update the avail. lists + + gbl.midiAssigns[self.channel].append(self.name) + gbl.midiAvail[self.channel]+=1 + + + def setChannelVolume(self, v): + """ LowLevel MIDI command. Set Channel Voice. """ + + self.midiPending.append(( "CVOLUME", gbl.tickOffset, v) ) + + if gbl.debug: + print "Set %s MIDIChannelVolume to %s" % (self.name, v) + + def setTname(self, n): + """ Set the track name. + + This is stacked and only gets output if track generates MIDI. + It is a handy way to override MMA's track naming. + """ + + self.midiPending.append(('TNAME', 0, n )) + if gbl.debug: + print "Set %s track name for MIDI to %s" % (self.name, n) + + def setPan(self, ln): + """ Set MIDI Pan for this track. """ + + v = stoi(ln[0], "Expecting integer value 0..127") + + if v<0 or v>127: + error("PAN value must be 0..127") + + self.midiPending.append( ("PAN", gbl.tickOffset, v)) + + if gbl.debug: + print "Set %s MIDIPan to %s" % (self.name, v) + + + + def setGlis(self, ln): + """ Set MIDI Glis for this track. """ + + v = stoi(ln, "Expecting integer for Portamento") + + if v<0 or v>127: + error("Value for Portamento must be 0..127") + + self.midiPending.append( ("GLIS", gbl.tickOffset, v)) + + if gbl.debug: + print "Set %s MIDIPortamento to %s" % (self.name, v) + + + + def setStrum(self, ln): + """ Set Strum time. """ + + # Strum is only valid for CHORD tracks. + + if self.vtype != "CHORD": + error( "Strum is only valid in Chord tracks, you tried to " + "set it in a %s track." % self.name) + + ln=self.lnExpand(ln, 'Strum') + tmp = [] + + for n in ln: + n = stoi(n, "Argument for %s Strum must be an integer" % self.name) + + if n < 0 or n > 100: + error("Strum %s out-of-range; must be 0..100." % n) + + tmp.append(n) + + self.strum = seqBump(tmp) + + if gbl.debug: + print "Set %s Strum to %s" % (self.name, self.strum) + + + def setTone(self, ln): + """ Set Tone. Error trap, only drum tracks have tone. """ + + error("Tone command not supported for %s track." % self.name) + + + def setOn(self): + """ Turn ON track. """ + + self.disable = 0 + self.ssvoice = -1 + + if gbl.debug: + print "%s Enabled" % self.name + + + def setOff(self): + """ Turn OFF track. """ + + self.disable = 1 + + if gbl.debug: + print "%s Disabled" % self.name + + + + def setRVolume(self, ln): + """ Set the volume randomizer for a track. """ + + ln = self.lnExpand(ln, 'RVolume') + tmp = [] + + for n in ln: + + n = stoi(n, "Argument for %s RVolume must be a value." % self.name) + + if n < 0 or n > 100: + error("RVolume %s out-of-range; must be 0..100." % n) + + if n > 30: + warning("%s is a large RVolume value!" % n) + + tmp.append( n/100. ) + + self.rVolume = seqBump(tmp) + + if gbl.debug: + print "Set %s Rvolume to " % self.name, + for n in self.rVolume: + print int(n * 100), + print + + + def setRSkip(self, ln): + """ Set the note random skip factor for a track. """ + + ln = self.lnExpand(ln, 'RSkip') + tmp = [] + + for n in ln: + n = stoi(n, "Expecting integer after in RSkip") + + if n < 0 or n > 99: + error("RSkip arg must be 0..99") + + tmp.append(n/100.) + + self.rSkip = seqBump(tmp) + + if gbl.debug: + print "Set %s RSkip to " % self.name, + for n in self.rSkip: + print int(n * 100), + print + + + def setRTime(self, ln): + """ Set the timing randomizer for a track. """ + + ln=self.lnExpand(ln, 'RTime') + tmp = [] + + for n in ln: + n=stoi(n, "Expecting an integer for Rtime") + if n < 0 or n > 100: + error("RTime %s out-of-range; must be 0..100." % n) + + tmp.append(n) + + self.rTime = seqBump(tmp) + + if gbl.debug: + print "Set %s RTime to " % self.name, + printList(ln) + + + def setRnd(self, arg): + """ Enable random pattern selection from sequence.""" + + if arg in ("ON", "1"): + self.seqRnd = 1 + + elif arg in ("OFF", "0"): + self.seqRnd = 0 + + else: + error("SeqRnd: '%s' is not a valid option." % arg) + + if gbl.debug: + if self.seqRnd: + a="On" + else: + a="Off" + print "%s SeqRnd: %s" % (self.name, a) + + + def setRndWeight(self, ln): + """ Set weighting factors for seqrnd. """ + + ln = self.lnExpand(ln, "SeqRndWeight") + tmp = [] + + for n in ln: + n = stoi(n) + if n < 0: error("SeqRndWeight: Values must be 0 or greater.") + tmp.append(n) + + self.seqRndWeight = seqBump(tmp) + + if gbl.debug: + print "%s SeqRndWeight: " % self.name, + printList(self.seqRndWeight) + + + def setDirection(self, ln): + """ Set scale direction. """ + + ln = self.lnExpand(ln, "Direction") + tmp = [] + + for n in ln: + n = n.upper() + if not n in ('UP', 'DOWN', 'BOTH', 'RANDOM'): + error("Unknown %s Direction '%s'." % (self.name, n) ) + tmp.append(n) + + self.direction = seqBump(tmp) + + if self.vtype == 'SCALE': + self.lastChord = None + self.lastNote = -1 + + + if gbl.debug: + print "Set %s Direction to " % self.name, + printList(ln) + + + def setScaletype(self, ln): + """ Set scale type. """ + + if self.vtype != 'SCALE': + error("ScaleType only valid in Scale tracks.") + + ln = self.lnExpand(ln, "ScaleType") + tmp = [] + + for n in ln: + n = n.upper() + if not n in ( 'CHROMATIC', 'AUTO'): + error("Unknown %s ScaleType. Only Chromatic and Auto are valid." % self.name) + tmp.append(n) + + self.scaleType = seqBump(tmp) + + if gbl.debug: + print "Set %s ScaleType to " % self.name, + printList(ln) + + + + def setInvert(self, ln): + """ Set inversion for track. + + This can be applied to any track, + but has no effect in drum tracks. It inverts the chord + by one rotation for each value. + """ + + ln=self.lnExpand(ln, "Invert") + vwarn = 0 + tmp = [] + + for n in ln: + n = stoi(n, "Argument for %s Invert must be an integer" % self.name) + + if n and self.vtype=='CHORD' and self.voicing.mode: + vwarn = 1 + + tmp.append(n) + + self.invert = seqBump(tmp) + + if self.vtype not in ("CHORD", "ARPEGGIO"): + warning ("Invert is ignored in %s tracks." % self.vtype) + + if vwarn: + warning("Setting both Voicing Mode and Invert is not a good idea") + + if gbl.debug: + print "Set %s Invert to " % self.name, + printList(ln) + + + def setOctave(self, ln): + """ Set the octave for a track. """ + + ln=self.lnExpand(ln, 'Octave') + tmp = [] + + for n in ln: + n = stoi(n, "Argument for %s Octave must be an integer" % self.name) + if n < 0 or n > 10: + error("Octave %s out-of-range; must be 0..10." % n) + + tmp.append( n * 12 ) + + self.octave = seqBump(tmp) + + if gbl.debug: + print "Set %s Octave to" % self.name, + for i in self.octave: + print i/12, + print + + def setSpan(self, start, end): + """ Set span. + + Note: The start/end parm has been verified in parser. + + """ + + if self.vtype == "DRUM": + error("Span not supported in Drum tracks.") + + self.spanStart = start + self.spanEnd = end + + if gbl.debug: + print "Set %s Span to %s...%s." % (self.name, self.spanStart, self.spanEnd) + + + def setHarmony(self, ln): + """ Set the harmony. """ + + + ln=self.lnExpand(ln, 'Harmony') + tmp = [] + + for n in ln: + n = n.upper() + if n in ( '-', '-0', 'NONE'): + n = None + + tmp.append(n) + + self.harmony = seqBump(tmp) + + if self.vtype in ( 'CHORD', 'DRUM' ): + warning("Harmony setting for %s track ignored" % self.vtype) + + if gbl.debug: + print "Set %s Harmony to" % self.name, + printList(self.harmony) + + + def setHarmonyOnly(self, ln): + """ Set the harmony only. """ + + + ln=self.lnExpand(ln, 'HarmonyOnly') + tmp = [] + + for n in ln: + n = n.upper() + if n in ('-', '0'): + n = None + + tmp.append(n) + + self.harmony = seqBump(tmp) + self.harmonyOnly = seqBump(tmp) + + if self.vtype in ( 'CHORD', 'DRUM'): + warning("HarmonyOnly setting for %s track ignored" % self.vtype) + + if gbl.debug: + print "Set %s HarmonyOnly to" % self.name, + printList(self.harmonyOnly) + + + def setHarmonyVolume(self, ln): + """ Set harmony volume adjustment. """ + + ln=self.lnExpand(ln, 'HarmonyOnly') + tmp = [] + + for n in ln: + v=stoi(n) + + if v<0: + error("HarmonyVolume adjustment must be positive integer") + tmp.append(v/100.) + + self.harmonyVolume = seqBump(tmp) + + if self.vtype in ( 'CHORD', 'DRUM' ): + warning("HarmonyVolume adjustment for %s track ignored" % self.vtype) + + if gbl.debug: + print "Set %s HarmonyVolume to" % self.name, + printList(self.harmonyVolume) + + + def setSeqSize(self): + """ Expand existing pattern list. """ + + self.sequence = seqBump(self.sequence) + if self.midiVoice: + self.midiVoice = seqBump(self.midiVoice) + if self.midiSeq: + self.midiSeq = seqBump(self.midiSeq) + self.invert = seqBump(self.invert) + self.artic = seqBump(self.artic) + self.volume = seqBump(self.volume) + self.voice = seqBump(self.voice) + self.rVolume = seqBump(self.rVolume) + self.rSkip = seqBump(self.rSkip) + self.rTime = seqBump(self.rTime) + self.seqRndWeight = seqBump(self.seqRndWeight) + self.strum = seqBump(self.strum) + self.octave = seqBump(self.octave) + self.harmony = seqBump(self.harmony) + self.harmonyOnly = seqBump(self.harmonyOnly) + self.harmonyVolume = seqBump(self.harmonyVolume) + self.direction = seqBump(self.direction) + self.scaleType = seqBump(self.scaleType) + self.compress = seqBump(self.compress) + self.chordRange = seqBump(self.chordRange) + self.dupRoot = seqBump(self.dupRoot) + self.unify = seqBump(self.unify) + self.accent = seqBump(self.accent) + + if self.vtype == "DRUM": + self.toneList = seqBump(self.toneList) + + + def setVoice(self, ln): + """ Set the voice for a track. + + Note, this just sets flags, the voice is set in bar(). + ln[] is not nesc. set to the correct length. + """ + + ln=self.lnExpand(ln, 'Voice') + tmp = [] + + for n in ln: + n = MMA.translate.vtable.get(n) + a=MMA.midiC.instToValue(n) + + if a < 0: + a=stoi(n, "Expecting a valid voice name or value, " + "not '%s'" % n) + if a <0 or a > 127: + error("Voice must be 0..127.") + tmp.append( a ) + + self.voice = seqBump(tmp) + + if self.channel and len(gbl.midiAssigns[self.channel])>1: + + a='' + for n in gbl.midiAssigns[self.channel]: + if n != self.name: + a += ' %s' % n + warning("Track %s is shared with %s.\n" + " Changing voice may create conflict." % (a,self.name)) + + + if gbl.debug: + print "Set %s Voice to: " % self.name, + for a in self.voice: + print MMA.midiC.valueToInst(a), + print + + + def setMidiClear(self, ln): + """ Set MIDIclear sequences. """ + + + if ln[0] in 'zZ-': + self.midiClear = None + else: + self.midiClear = MMA.mdefine.mdef.get(ln[0]) + + if gbl.debug: + print "%s MIDIClear: %s" % (self.name, self.midiSeqFmt(self.midiClear)) + + + def doMidiClear(self): + """ Reset MIDI settings. """ + + if self.midiSent: + if not self.midiClear: + warning("%s: Midi data has been inserted with MIDIVoice/Seq " + "but no MIDIClear data is present." % self.name) + + else: + for i in self.midiClear: + gbl.mtrks[self.channel].addCtl(gbl.tickOffset, i[1]) + + self.midiSent = 0 + + + def setMidiSeq(self, ln): + """ Set a midi sequence for a track. + + This is sent for every bar. Syntax is: + hh .. ; ... + + or a single '-' to disable. + """ + + """ lnExpand() works here! The midi data has been converted to + pseudo-macros already in the parser. """ + + ln=self.lnExpand(ln, "MidiSeq") + + seq = [] + for a in ln: + if a in 'zZ-': + seq.append(None) + else: + seq.append(MMA.mdefine.mdef.get(a.upper())) + + if seq.count(None) == len(seq): + self.midiSeq = [] + else: + self.midiSeq = seqBump( seq ) + + if gbl.debug: + print "%s MIDISeq:" % self.name, + for l in seq: + print '{ %s }' % self.midiSeqFmt(l), + + + + def setMidiVoice(self, ln): + """ Set a MIDI sequence for a track. + + This is sent whenever we send a VOICE. Syntax is: + hh .. ; ... + + or a single '-' to disable. + """ + + """ lnExpand() works here! The midi data has been converted to + pseudo-macros already in the parser. """ + + ln = self.lnExpand(ln, 'MIDIVoice') + + seq = [] + for a in ln: + if a in 'zZ': + seq.append(None) + else: + seq.append(MMA.mdefine.mdef.get(a.upper())) + + if seq.count(None) == len(seq): + self.midiVoice = [] + else: + self.midiVoice = seqBump( seq ) + + + if gbl.debug: + print "%s MIDIVoice:" % self.name, + for l in seq: + print '{ %s }' % self.midiSeqFmt(l), + print + + + def midiSeqFmt(self, lst): + """ Used by setMidiVoice/Clear/Seq for debugging format. """ + + if lst == None: + return '' + ret='' + for i in lst: + ret += "%s %s 0x%02x ; " % (i[0], + MMA.midiC.valueToCtrl(ord(i[1][0])), + ord(i[1][1])) + return ret.rstrip("; ") + + + def setVolume(self, ln): + """ Set the volume for a pattern. + ln - list of volume names (pp, mf, etc) + ln[] not nesc. correct length + """ + + ln=self.lnExpand(ln, 'Volume') + tmp = [None] * len(ln) + + for i,n in enumerate(ln): + a = MMA.volume.calcVolume(n, self.volume[i]) + + if self.vtype == 'DRUM': + a=MMA.translate.drumVolTable.get(self.toneList[i], a) + else: + a=MMA.translate.voiceVolTable.get(self.voice[i], a) + tmp[i] = a + + self.volume = seqBump(tmp) + + if gbl.debug: + print "Set %s Volume to " % self.name, + for a in self.volume: + print int(a * 100), + print + + + def setCresc(self, dir, ln): + """ Set Crescendo for a track. """ + + if len(ln) == 3: + self.setVolume([ln[0]]) + ln=ln[1:] + + vol = self.volume[0] + + if self.volume.count(vol) != len(self.volume): + warning("(De)Crescendo being used with track with variable sequence volumes.") + + self.futureVols = MMA.volume.fvolume(dir, vol, ln) + + + + + def setMallet(self, ln): + """ Mallet (repeat) settngs. """ + + for l in ln: + try: + mode, val = l.upper().split('=') + except: + error("Each Mallet option must contain a '=', not '%s'" % l) + + if mode == 'RATE': + self.mallet = getNoteLen(val) + + elif mode == 'DECAY': + val = stof(val, "Mallet Decay must be a value, not '%s'." % val) + + if val < -50 or val > 50: + error("Mallet Decay rate must be -50..+50") + + self.malletDecay = val/100 + + if gbl.debug: + print "%s Mallet Rate:%s Decay:%s " % \ + (self.name, self.mallet, self.malletDecay) + + + def setAccent(self, ln): + """ Set the accent values. This is a list of lists, a list for each seq. """ + + tmp = [] + + + """ We can do "Track Accent 1 20 3 -10" or "Track Accent {1 20 3 -10}" + or even something like "Track Accent {1 20} / {/} {3 20}" + Note that the "/" can or not have {}s. + """ + + ln = ' '.join(ln) + if not ln.startswith('{'): + ln='{' + ln +"}" + + # Convert string to list. One entry per seq. + + l=[] + while ln: + if not ln.startswith("{"): + if ln[0]=='/': + l.append('/') + ln=ln[1:].strip() + else: + error("Unknown value in %s Accent: %s" % (self.name, ln[0])) + else: + a,b = pextract(ln, "{", "}", 1) + ln=a.strip() + if len(b)==1 and b[0]=='/': + l.append('/') + else: + l.append(b[0].split()) + + + ln=self.lnExpand(l, 'Accent') + + + for l in ln: + tt=[] + if len(l)/2*2 != len(l): + error("Use: %s Accent Beat Percentage [...]" % self.name) + + for b, v in zip(l[::2], l[1::2]): + b=self.setBarOffset( b ) + v=stoi(v, "Bbeat offset must be a value, not '%s'." % v) + if v < -100 or v > 100: + error("Velocity adjustment (as percentage) must " + "be -100..100, not '%s'." % v) + + tt.append( (b, v/100. ) ) + tmp.append(tt) + + self.accent = seqBump( tmp ) + + if gbl.debug: + print "%s Accent: " % self.name, + for s in self.accent: + print "{", + for b,v in s: + print '%s %s' % (1+(b/float(gbl.BperQ)), int(v*100)), + print "}", + print + + + def setArtic(self, ln): + """ Set the note articuation value. """ + + ln=self.lnExpand(ln, 'Articulate') + tmp = [] + + for n in ln: + a = stoi(n, "Expecting value in articulation setting.") + if a < 1 or a > 200: + error("Articulation setting must be 1..200, not %s." % a) + + if a>150: + warning("Large Articulate value: %s" % a) + + tmp.append(a) + + self.artic = seqBump(tmp) + + if gbl.debug: + print "Set %s Articulation to " % self.name, + printList(ln) + + + def setUnify(self, ln): + """ Set unify. """ + + ln = self.lnExpand(ln, "Unify") + tmp = [] + + for n in ln: + n=n.upper() + if n in ( 'ON', '1'): + tmp.append(1) + elif n in( 'OFF', '0'): + tmp.append(0) + else: + error("Unify accepts ON | OFF | 0 | 1") + + self.unify = seqBump(tmp) + + if gbl.debug: + print "Set %s Unify to " % self.name, + printList(self.unify) + + + + def lnExpand(self, ln, cmd): + """ Validate and expand a list passed to a set command. """ + + if len(ln) > gbl.seqSize: + warning("%s list truncated to %s patterns." % (self.name, gbl.seqSize) ) + ln = ln[:gbl.seqSize] + + last = None + + for i,n in enumerate(ln): + if n == '/': + if not last: + error ("You cannot use a '/' as the first item " + "in a %s list." % cmd) + else: + ln[i] = last + else: + last = n + + return ln + + + def copySettings(self, cp): + """ Copy the voicing from a 2nd voice to the current one. """ + + if not cp in gbl.tnames: + error("CopySettings does not know track '%s'." % cp) + + cp=gbl.tnames[cp] + + if cp.vtype != self.vtype: + error("Tracks must be of same type for copy ... " + "%s and %s aren't." % (self.name, cp.name)) + + self.volume = cp.volume[:] + self.rVolume = cp.rVolume[:] + self.accent = cp.accent[:] + self.rSkip = cp.rSkip[:] + self.rTime = cp.rTime[:] + self.strum = cp.strum[:] + self.octave = cp.octave[:] + self.harmony = cp.harmony[:] + self.harmonyOnly = cp.harmonyOnly[:] + self.harmonyVolume = cp.harmonyVolume[:] + self.direction = cp.direction[:] + self.scaleType = cp.scaleType[:] + self.voice = cp.voice[:] + self.invert = cp.invert[:] + self.artic = cp.artic[:] + self.compress = cp.compress[:] + + self.riff = cp.riff[:] + + if self.vtype == 'DRUM': + self.toneList = cp.toneList[:] + + + if gbl.debug: + print "Settings from %s copied to %s." % (cp.name, self.name) + + + + ################################################## + ## Save/restore grooves + + def saveGroove(self, gname): + """ Define a groove. + + Called by the 'DefGroove Name'. This is called for + each track. + + If 'gname' is already defined it is overwritten. + + Note aux. function which may be defined for each track type. + """ + + self.grooves[gname] = { + 'ACCENT': self.accent[:], + 'ARTIC': self.artic[:], + 'COMPRESS': self.compress[:], + 'DIR': self.direction[:], + 'DUPROOT': self.dupRoot[:], + 'HARMONY': self.harmony[:], + 'HARMONYO': self.harmonyOnly[:], + 'HARMONYV': self.harmonyVolume[:], + 'INVERT': self.invert[:], + 'LIMIT': self.chordLimit, + 'RANGE': self.chordRange[:], + 'OCTAVE': self.octave[:], + 'RSKIP': self.rSkip[:], + 'RTIME': self.rTime[:], + 'RVOLUME': self.rVolume[:], + 'SCALE': self.scaleType[:], + 'SEQ': self.sequence[:], + 'SEQRND': self.seqRnd, + 'SEQRNDWT': self.seqRndWeight[:], + 'STRUM': self.strum[:], + 'VOICE': self.voice[:], + 'VOLUME': self.volume[:], + 'UNIFY': self.unify[:], + 'MIDISEQ': self.midiSeq[:], + 'MIDIVOICE':self.midiVoice[:], + 'MIDICLEAR':self.midiClear[:], + 'SPAN': (self.spanStart, self.spanEnd), + 'MALLET': (self.mallet, self.malletDecay) } + + + if self.vtype == 'CHORD': + self.grooves[gname]['VMODE'] = copy.deepcopy(self.voicing) + + if self.vtype == 'DRUM': + self.grooves[gname]['TONES'] = self.toneList[:] + + + def restoreGroove(self, gname): + """ Restore a defined groove. """ + + self.doMidiClear() + + g = self.grooves[gname] + + self.sequence = g['SEQ'] + self.volume = g['VOLUME'] + self.accent = g['ACCENT'] + self.rTime = g['RTIME'] + self.rVolume = g['RVOLUME'] + self.rSkip = g['RSKIP'] + self.strum = g['STRUM'] + self.octave = g['OCTAVE'] + self.voice = g['VOICE'] + self.harmonyOnly= g['HARMONYO'] + self.harmony = g['HARMONY'] + self.harmonyVolume = g['HARMONYV'] + self.direction = g['DIR'] + self.scaleType = g['SCALE'] + self.invert = g['INVERT'] + self.artic = g['ARTIC'] + self.seqRnd = g['SEQRND' ] + self.seqRndWeight = g['SEQRNDWT'] + self.compress = g['COMPRESS'] + self.chordRange = g['RANGE'] + self.dupRoot = g['DUPROOT'] + self.chordLimit = g['LIMIT'] + self.unify = g['UNIFY'] + self.midiClear = g['MIDICLEAR'] + self.midiSeq = g['MIDISEQ'] + self.midiVoice = g['MIDIVOICE'] + self.spanStart, self.spanEnd = g['SPAN'] + self.mallet, self.malletDecay = g['MALLET'] + + if self.vtype == 'CHORD': + self.voicing = g['VMODE'] + + if self.vtype == 'DRUM': + self.toneList = g['TONES'] + + + """ It's quite possible that the track was created after + the groove was saved. This means that the data restored + was just the default stuff inserted when the track + was created ... which is fine, but the sequence size + isn't necs. right. We can probably test any list, and octave[] + is as good as any. + """ + + if len(self.octave) != gbl.seqSize: + self.setSeqSize() + + #################################### + ## Sequence functions + + def setSequence(self, ln): + """ Set the sequence for a track. + + The ln passed from the parser should be a list of existing + patterns, plus the special 'patterns' Z, z, -, and *. Remember + that the parser has already converted {} patterns to a special + pattern line _1. + + First we expand ln to the proper length. lnExpand() also + duplicates '/' to the previous pattern. + + Then we step though ln: + + - convert 'z', 'Z' and '-' to empty patterns. + + - duplicate the existing pattern for '*' + + - copy the defined pattern for everything else. + There's a bit of Python reference trickery here. + Eg, if we have the line: + + Bass Sequence B1 B2 + + the sequence is set with pointers to the existing + patterns defined for B1 and B2. Now, if we later change + the definitions for B1 or B2, the stored pointer DOEN'T + change. So, changing pattern definitions has NO EFFECT. + + """ + + ln=self.lnExpand(ln, 'Sequence') + tmp = [None] * len(ln) + + for i, n in enumerate(ln): + n=n.upper() + + if n in ('Z', '-'): + tmp[i] = None + + elif n == '*': + tmp[i] = self.sequence[i] + + else: + p= (self.vtype, n) + if not p in pats: + error("Track %s does not have pattern '%s'." % p ) + tmp[i] = pats[p] + + self.sequence = seqBump(tmp) + + if gbl.seqshow: + print "%s sequence set:" % self.name, + for a in ln: + if a in "Zz-": print "-", + else: print a, + print + + + def clearSequence(self): + """ Clear sequence for track. + + This is also called from __init__() to set the initial defaults for each track. + + """ + + if self.vtype != 'SOLO' or not self.inited: + self.artic = [90] + self.sequence = [None] + self.seqRnd = 0 + self.seqRndWeight = [1] + self.scaleType = ['AUTO'] + self.rVolume = [0] + self.rSkip = [0] + self.rTime = [0] + self.octave = [4 * 12] + self.voice = [0] + self.chordRange = [1] + self.harmony = [None] + self.harmonyOnly = [None] + self.harmonyVolume = [.8] + self.strum = [0] + self.volume = [MMA.volume.vols['M'] ] + self.compress = [0] + self.dupRoot = [0] + self.chordLimit = 0 + self.invert = [0] + self.lastChord = [] + self.accent = [ [] ] + self.unify = [0] + self.midiClear = [] + self.midiSeq = [] + self.midiVoice = [] + self.spanStart = 0 + self.spanEnd = 127 + self.mallet = 0 + self.malletDecay = 0 + self.futureVols = [] + + + if self.riff: + if len(self.riff) > 1: + warning("%s sequence clear deleting %s riffs." % (self.name, len(self.riff))) + else: + warning("%s sequence clear deleting unused riff" % self.name ) + + self.riff = [] + + if self.vtype == 'CHORD': + self.voicing = Voicing() + self.direction = ['UP'] + else: + self.direction = ['BOTH'] + + self.setSeqSize() + + + ############################ + ### Pattern functions + ############################ + + + def definePattern(self, name, ln): + """ Define a Pattern. + + All patterns are stored in pats{}. The keys for this + are tuples -- (track type, pattern name). + + """ + + name = name.upper() + slot = (self.vtype,name) + + # This is just for the debug code + + if name.startswith('_'): + redef = "dynamic define" + elif slot in pats: + redef = name + ' redefined' + else: + redef = name + ' created' + + ln = ln.rstrip('; ') # Delete optional trailing ';' & WS + pats[slot] = self.defPatRiff(ln) + + if gbl.pshow: + print "%s pattern %s:" % (self.name.title(), redef ) + self.printPattern(pats[slot]) + + + def setRiff(self, ln): + """ Define and set a Riff. """ + + solo = self.vtype in ("MELODY", "SOLO") + + if solo: + self.riff.append(ln) + else: + ln = ln.rstrip('; ') + if len(ln) == 1 and (ln[0] in ('Z','z','-')): + self.riff.append([]) + else: + self.riff.append(self.defPatRiff(ln)) + + if gbl.pshow: + print "%s Riff:" % self.name, + if solo: + print self.riff[-1] + else: + self.printPattern(self.riff[-1]) + + + def defPatRiff(self, ln): + """ Worker function to define pattern. Shared by definePattern() + and setRiff(). + """ + + def mulPatRiff(oldpat, fact): + """ Multiply a pattern. """ + + fact = stoi(fact, "The multiplier arg must be an integer not '%s'." % fact) + + if fact<1 or fact >100: + error("The multiplier arg must be in the range 2 to 100.") + + + """ Make N copies of pattern, adjusted so that the new copy has + all note lengths and start times adjusted. + eg: [[1, 2, 66], [3, 2, 88]] * 2 + becomes [[1,4,66], [2,4,88], [3,4,66], [4,4,88]]. + """ + + new = [] + add = 0 + step = (gbl.BperQ * gbl.QperBar)/fact + + for n in range(fact): + orig = copy.deepcopy(oldpat) + for z in orig: + z.offset = (z.offset / fact) + add + z.duration /= fact + if z.duration < 1: + z.duration = 1 + + new.append(z) + add += step + + return tuple( new ) + + + def shiftPatRiff(oldpat, fact): + + fact = stof(fact, "The shift arg must be a value, not '%s'." % fact) + + # Adjust all the beat offsets + + new = copy.deepcopy(oldpat) + max = gbl.BperQ * (gbl.QperBar) + for n in new: + n.offset += fact * gbl.BperQ + if n.offset < 0 or n.offset > max: + error("Pattern shift with factor %f has resulted in an " + "illegal offset." % fact ) + + return tuple( new ) + + def patsort(c1, c2): + """ Sort a pattern tuple. """ + + if c1.offset < c2.offset: return -1 + if c1.offset == c2.offset: return 0 + else: return 1 + + + ### Start of main function... + + # Convert the string to list... + # "1 2 3; 4 5 6" ---> [ [1,2,3], [4,5,6] ] + + p = [] + ln = ln.upper().split(';') + for l in ln: + p.append(l.split()) + + plist=[] + + + for ev in p: + more=[] + for i,e in enumerate(ev): + if e.upper() in ('SHIFT', '*'): + if i == 0: + error("Pattern definition can't start with" + "SHIFT or *") + more = ev[i:] + ev=ev[:i] + break + + if len(ev) == 1: + nm = (self.vtype, ev[0]) + + if nm in pats: + if nm[0].startswith('_'): + error("You can't use a pattern name beginning" + " with an underscore.") + pt = pats[nm] + + else: + error("%s is not an existing %s pattern." % (nm[1], nm[0].title()) ) + + else: + pt = [self.getPgroup(ev)] + + while more: + cmd = more.pop(0) + if cmd not in ('SHIFT', '*'): + error("Expecting SHIFT or *, not '%s'." % cmd) + + if not more: + error("Expecting factor after %s" % cmd) + if cmd == 'SHIFT': + pt = shiftPatRiff(pt, more.pop(0)) + elif cmd == '*': + pt = mulPatRiff(pt, more.pop(0)) + + plist.extend(pt) + + + plist.sort(patsort) + + if gbl.swingMode: + len8 = getNoteLen('8') + len81 = getNoteLen('81') + len82 = getNoteLen('82') + + onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)] + offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)] + + for p in plist: + if p.duration == len8 or self.vtype=="DRUM" and p.duration==1: + if p.offset in onBeats: + if p.duration == len8: + p.duration = len81 + elif p.offset in offBeats: + if p.duration == len8: + p.duration = len82 + i=offBeats.index(p.offset) + p.offset = onBeats[i] + len81 + + return plist + + + def printPattern(self, pat): + """ Print a pattern. Used by debugging code.""" + + s=[] + for p in pat: + s.append(" %2.2f %2.0f" % (1+(p.offset/float(gbl.BperQ)), + p.duration)) + + if self.vtype == 'CHORD': + for a in p.vol: + s.append( " %2.0f" % a) + + elif self.vtype == 'BASS': + f=str(p.noteoffset+1) + + if p.accidental == 1: + f+="#" + elif p.accidental == -1: + f+="b" + + if p.addoctave > 0: + f+="+" * (p.addoctave/12) + elif p.addoctave < 0: + f+="-" * (p.addoctave/-12) + + s.append( " %s %2.0f" % (f, p.vol ) ) + + elif self.vtype == 'ARPEGGIO': + s.append( " %2.0f " % p.vol ) + + elif self.vtype == 'DRUM': + s.append(" %2.0f" % p.vol) + + elif self.vtype == 'WALK': + s.append(" %2.0f" % p.vol ) + + s.append(' ;') + s.append('\n') + s[-2]=' ' + print "".join(s) + + + def insertVoice(self): + """ Called from bar() and setForceOut(). Adds voice stuff to track.""" + + sc = gbl.seqCount + + """ 1st pass for MIDIVOICE. There's a separate slot for + each bar in the sequence, plus the data can be sent + before or after 'voice' commands. This first loop + sends MIDIVOICE data with an offset of 0. Note, we + don't set the value for 'self.smidiVoice' until we + do this again, later. All this is needed since some + MIDIVOICE commands NEED to be sent BEFORE voice selection, + and others AFTER. + """ + + if self.midiVoice: + v = self.midiVoice[sc] + if v and v != self.smidiVoice: + for i in v: + if not i[0]: + gbl.mtrks[self.channel].addCtl(gbl.tickOffset, i[1]) + + # Set the voice in the midi track if not previously done. + + v=self.voice[sc] + if v != self.ssvoice: + gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, v) + self.ssvoice = v + + # Mark ssvoice also in shared tracks + + for a in gbl.midiAssigns[self.channel]: + if gbl.tnames.has_key(a): + gbl.tnames[a].ssvoice = v + + if gbl.debug: + print "Track %s Voice %s inserted." \ + % (self.name, MMA.midiC.valueToInst(v) ) + + """ Our 2nd stab at MIDIVOICE. This time any sequences + with offsets >0 are sent. AND the smidiVoice and midiSent + variables are set. + """ + + if self.midiVoice: + v = self.midiVoice[sc] + if v and v != self.smidiVoice: + for i in v: + if i[0]: + gbl.mtrks[self.channel].addCtl(gbl.tickOffset, i[1]) + self.smidiVoice = v + self.midiSent = 1 # used by MIDICLEAR + + + ######################### + ## Music processing + ######################### + + + def bar(self, ctable): + """ Process a bar of music for this track. """ + + + # Future vol == de(cresc). Done if track is on or off! + + if self.futureVols: + self.volume = seqBump([self.futureVols.pop(0)]) + + # If track is off don't do anything else. + + if self.disable: + if self.riff: + self.riff.pop(0) + return + + + """ Decide which seq to use. This is either the current + seqCount, or if SeqRnd has been set for the track + it is a random pattern in the sequence. + + The class variable self.seq is set to the sequence to use. + """ + + if self.seqRnd: + tmp = [] + for x, i in enumerate(self.seqRndWeight): + tmp.extend([x] * i) + if not len(tmp): + error("SeqRndWeight has generated an empty list.") + self.seq = random.choice(tmp) + else: + self.seq = gbl.seqCount + + sc = self.seq + #print self.name, sc + """ Get pattern for this sequence. Either a Riff or a Pattern. """ + + if self.riff: + pattern = self.riff.pop(0) + + else: + pattern = self.sequence[sc] + + if not pattern: + return + + """ MIDI Channel assignment. If no channel is assigned try + to find an unused number and assign that. + """ + + if not self.channel: + self.setChannel() + + # We are ready to create musical data. 1st do pending midi commands. + + self.clearPending() + + self.insertVoice() + + # Do MIDISeq for this voice + + if self.midiSeq: + l = self.midiSeq[sc] + if l: + for i in l: + gbl.mtrks[self.channel].addCtl( getOffset(i[0]), i[1] ) + self.midiSent = 1 + + self.trackBar(pattern, ctable) + + + + def clearPending(self): + + while self.midiPending: + c, off, v = self.midiPending.pop(0) + if c == 'TNAME': + gbl.mtrks[self.channel].addTrkName(off, v) + if gbl.debug: + print "%s Track name inserted at offset %s." % \ + (self.name, off) + + elif c == 'GLIS': + gbl.mtrks[self.channel].addGlis(off, v) + if gbl.debug: + print "%s Glis at offset %s set to %s." % \ + (self.name, off, ord(chr(v))) + + elif c == 'PAN': + gbl.mtrks[self.channel].addPan(off, v) + if gbl.debug: + print "%s Pan at offset %s set to %s." % \ + (self.name, off, v) + + elif c == 'CVOLUME': + gbl.mtrks[self.channel].addChannelVol(off, v) + if gbl.debug: + print "%s ChannelVolume at offset %s set to %s" % \ + (self.name, off, v) + + else: + error("Unknown midi command pending. Call Bob.") + + + + def getChordInPos( self, offset, ctable): + """ Compare an offset to a list of ctables and return + the table entry active for the given beat. + + We assume that the first offset in 'ctable' is 0! + We assme that 'offset' is >= 0! + + Returns a ctable. + """ + + for i in range(len(ctable)-1, -1, -1): # reverse order + if offset >= ctable[i].offset: + break + return ctable[i] + + + + def adjustVolume(self, v, beat): + """ Adjust a note volume based on the track and global volume + setting. + """ + + if not v: + return 0 + + sc = self.seq + + if self.rSkip[sc] and random.random() < self.rSkip[sc]: + return 0 + + a1 = self.volume[sc] + if not a1: + return 0 + a1 *= MMA.volume.vTRatio + + a2 = MMA.volume.volume + if not a2: + return 0 + a2 *= MMA.volume.vMRatio + + v *= ( a1 + a2 ) + + for b,a in self.accent[sc]: + if b==beat: + v += (v * a) + + # take .rVolume % of current volume, add/sub result to current + + if self.rVolume[sc]: + a = int(v * self.rVolume[sc]) + if a: + v += random.randrange(-a, a) + + if v > 127: + v = 127 + elif v < 1: + v = 1 + + return int(v) + + + def adjustNote(self, n): + """ Adjust a note for a given octave/transposition. + Ensure that the note is in range. + """ + + n += self.octave[self.seq] + gbl.transpose + + while n < 0: + n += 12 + while n > 127: + n -= 12 + + while n < self.spanStart: + n += 12 + while n > self.spanEnd: + n -= 12 + + return n + + + def setBarOffset(self, v): + """ Convert a string into a valid bar offset in midi ticks. """ + + m=v.find('-') + p=v.find('+') + + if m>-1 and p>-1: + if m>p: + sp = p + sign = 1 + else: + sp = m + sign = -1 + + elif m >- 1: + sp = m + sign = -1 + + elif p >- 1: + sp = p + sign = 1 + + else: + sp = None + + if sp: + note = v[sp+1:] + v = v[:sp] + else: + note = None + + + v=stof(v, "Value for %s bar offset must be integer/float" % self.name) + v = (v-1) * gbl.BperQ + + if note: + v += getNoteLen(note) * sign + + if v < 0: + if v<-gbl.BperQ: + error("Defining %s Pattern, bar offset must be 0 or greater." % + self.name) + else: + warning("Offset in '%s' is '%s ticks' before bar start!" % (self.name, -v)) + + if v >= gbl.QperBar * gbl.BperQ: + error("Defining %s Pattern, bar offset must be less than %s." % + (self.name, gbl.QperBar + 1)) + + + return int(v) + + + def getDur(self, d): + """ Return the adjusted duration for a note. + + The adjustment makes notes more staccato. Valid + adjustments are 1 to 100. 100 is not recommended. + """ + + d = (d * self.artic[self.seq]) / 100 + if not d: + d = 1 + + return d + + + def sendNote( self, offset, duration, note, velocity): + """ Send a note to the MIDI machine. This is called from all + track classes and handles niceties like mallet-repeat. + """ + + if not velocity: + return + + sc = self.seq + + rptr = self.mallet + + if rptr and duration > rptr: + ll = self.getDur(rptr) + offs = 0 + vel = velocity + count =0 + + for q in range(duration/rptr): + gbl.mtrks[self.channel].addPairToTrack( + offset + offs, + self.rTime[sc], + ll, + note, + vel, + None ) + + offs += rptr + if self.malletDecay: + vel = int( vel + (vel * self.malletDecay) ) + if vel < 1: + vel = 1 + if vel > 255: + vel=255 + count+=1 + + else: + gbl.mtrks[self.channel].addPairToTrack( + offset, + self.rTime[sc], + duration, + note, + velocity, + self.unify[sc] ) + diff --git a/mma/MMA/patArpeggio.py b/mma/MMA/patArpeggio.py new file mode 100644 index 0000000..97c023f --- /dev/null +++ b/mma/MMA/patArpeggio.py @@ -0,0 +1,161 @@ + +# patArpeggio.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import random + +import gbl +from MMA.notelen import getNoteLen +from MMA.common import * +from MMA.harmony import harmonize +from MMA.pat import PC + + + +class Arpeggio(PC): + """ Pattern class for an arpeggio track. """ + + vtype = 'ARPEGGIO' + arpOffset = -1 + arpDirection = 1 + + def getPgroup(self, ev): + """ Get group for apreggio pattern. + + Fields - start, length, volume + """ + + a = struct() + if len(ev) != 3: + error("There must be exactly 3 items in each group " + "for apreggio define, not <%s>." % ' '.join(ev) ) + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen(ev[1]) + a.vol = stoi(ev[2], "Type error in Arpeggio definition.") + + return a + + + def restart(self): + self.ssvoice = -1 + self.arpOffset=-1 + self.arpDirection=1 + + def trackBar(self, pattern, ctable): + """ Do a arpeggio bar. + + Called from self.bar() + + """ + + sc = self.seq + direct = self.direction[sc] + + for p in pattern: + tb = self.getChordInPos(p.offset, ctable) + + if tb.arpeggioZ: + continue + + if direct == 'DOWN': + self.arpDirection = -1 + + if self.chordLimit: + tb.chord.limit(self.chordLimit) + + if self.compress[sc]: + tb.chord.compress() + + if self.invert[sc]: + tb.chord.invert(self.invert[sc]) + + # This should be optimized, it recreates the chord for every pattern. + # Problem is that one would need to check all the LIMIT, COMPRESS, etc + # settings each for each bar as well, so it's probably just as easy to + # leave it as is. Besides, this works. + + ln = self.chordRange[sc] + o = 0 + ourChord = [] + while ln >= 1: + for a in tb.chord.noteList: + ourChord.append(a+o) + ln -= 1 + o += 12 + + if ln > 0 and ln < 1: # for fractional lengths + ln = int(tb.chord.noteListLen * ln) + if ln < 2: # important, min of 2 notes in arp. + ln=2 + for a in tb.chord.noteList[:ln]: + ourChord.append(a+o) + + if direct == 'BOTH': + if self.arpOffset < 0: + self.arpOffset = 1 + self.arpDirection = 1 + elif self.arpOffset >= len(ourChord): + self.arpOffset = len(ourChord)-2 + self.arpDirection = -1 + + elif direct == 'UP': + if self.arpOffset >= len(ourChord) or self.arpOffset < 0: + self.arpOffset = 0 + self.arpDirection = 1 + + elif direct == 'DOWN': + if self.arpOffset < 0 or self.arpOffset >= len(ourChord): + self.arpOffset = len(ourChord)-1 + self.arpDirection = -1 + + if direct == 'RANDOM': + note = random.choice(ourChord) + else: + note = ourChord[self.arpOffset] + + self.arpOffset += self.arpDirection + + + if not self.harmonyOnly[sc]: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(note), + self.adjustVolume(p.vol, p.offset) ) + + + if self.harmony[sc]: + h = harmonize(self.harmony[sc], note, ourChord) + for n in h: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(n), + self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) ) + + + tb.chord.reset() # important, other tracks chord object + + diff --git a/mma/MMA/patBass.py b/mma/MMA/patBass.py new file mode 100644 index 0000000..bf95c02 --- /dev/null +++ b/mma/MMA/patBass.py @@ -0,0 +1,134 @@ + +# patBass.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + + +import gbl +from MMA.notelen import getNoteLen +from MMA.common import * +from MMA.harmony import harmonize +from MMA.pat import PC + + +class Bass(PC): + """ Pattern class for a bass track. """ + + vtype = 'BASS' + + def getPgroup(self, ev): + """ Get group for bass pattern. + + Fields - start, length, note, volume + + """ + + if len(ev) != 4: + error("There must be n groups of 4 in a pattern definition, " + "not <%s>." % ' '.join(ev) ) + + a = struct() + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen( ev[1] ) + + offset = ev[2] + n=offset[0] + if n in "1234567": + a.noteoffset = int(n)-1 + else: + error("Note offset in Bass must be '1'...'7', not '%s'" % n ) + + n = offset[1:2] + if n == "#": + a.accidental = 1 + ptr = 2 + elif n == 'b' or n == 'b' or n == '&': + a.accidental = -1 + ptr = 2 + else: + a.accidental = 0 + ptr = 1 + + a.addoctave = 0 + + for n in ev[2][ptr:]: + if n == '+': + a.addoctave += 12 + elif n == '-': + a.addoctave -= 12 + + else: + error("Only '- + # b &' are permitted after a noteoffset, not '%s'" % n) + + a.vol = stoi(ev[3], "Note volume in Bass definition not int.") + + return a + + def restart(self): + self.ssvoice = -1 + + + def trackBar(self, pattern, ctable): + """ Do the bass bar. + + Called from self.bar() + + """ + + sc = self.seq + unify = self.unify[sc] + + for p in pattern: + ct = self.getChordInPos(p.offset, ctable) + + if ct.bassZ: + continue + + + note = ct.chord.scaleList[p.noteoffset] + p.addoctave + p.accidental + + + if not self.harmonyOnly[sc]: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(note), + self.adjustVolume(p.vol, p.offset)) + + + if self.harmony[sc]: + h = harmonize(self.harmony[sc], note, ct.chord.noteList) + for n in h: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(n), + self.adjustVolume(p.vol * self.harmonyVolume[sc], -1)) + + + + + + diff --git a/mma/MMA/patChord.py b/mma/MMA/patChord.py new file mode 100644 index 0000000..fab7c0f --- /dev/null +++ b/mma/MMA/patChord.py @@ -0,0 +1,268 @@ + +# patChord.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + +import random + +import gbl +from MMA.notelen import getNoteLen +from MMA.common import * +from MMA.pat import PC + + +class Chord(PC): + """ Pattern class for a chord track. """ + + vtype = 'CHORD' + + + def getPgroup(self, ev): + """ Get group for chord pattern. + + Tuples: [start, length, volume (,volume ...) ] + """ + + if len(ev) < 3: + error("There must be at least 3 items in each group " + "of a chord pattern definition, not <%s>." % ' '.join(ev)) + + a = struct() + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen(ev[1]) + + vv = ev[2:] + if len(vv)>8: + error("Only 8 volumes are permitted in Chord definition, not %s." % len(vv)) + + a.vol = [0] * 8 + for i,v in enumerate(vv): + v=stoi(v, "Expecting integer in volume list for Chord definition.") + a.vol[i]=v + + for i in range(i+1,8): # force remaining volumes + a.vol[i]=v + + return a + + def restart(self): + self.ssvoice = -1 + self.lastChord = None + + + def chordVoicing(self, chord, vMove): + """ Voicing algorithm by Alain Brenzikofer. """ + + + sc = self.seq + vmode=self.voicing.mode + + if vmode == "OPTIMAL": + + # Initialize with a voicing around centerNote + + chord.center1(self.lastChord) + + # Adjust range and center + + if not (self.voicing.bcount or self.voicing.random): + chord.center2(self.voicing.center, self.voicing.range/2) + + + # Move voicing + + elif self.lastChord: + if (self.lastChord != chord.noteList ) and vMove: + chord.center2(self.voicing.center,self.voicing.range/2) + vMove = 0 + + # Update voicingCenter + + sum=0 + for n in chord.noteList: + sum += n + c=sum/chord.noteListLen + + """ If using random voicing move it it's possible to + get way off the selected octave. This check ensures + that the centerpoint stays in a tight range. + Note that if using voicingMove manually (not random) + it is quite possible to move the chord centers to very + low or high keyboard positions! + """ + + if self.voicing.random: + if c < -4: c=0 + elif c >4: c=4 + self.voicing.center=c + + + elif vmode == "COMPRESSED": + chord.compress() + + elif vmode == "INVERT": + if chord.rootNote < -2: + chord.invert(1) + + elif chord.rootNote > 2: + chord.invert(-1) + chord.compress() + + self.lastChord = chord.noteList[:] + + return vMove + + + def trackBar(self, pattern, ctable): + """ Do a chord bar. Called from self.bar() """ + + sc = self.seq + unify = self.unify[sc] + + """ Set voicing move ONCE at the top of each bar. + The voicing code resets vmove to 0 the first + time it's used. That way only one movement is + done in a bar. + """ + + vmove = 0 + + if self.voicing.random: + if random.randrange(100) <= self.voicing.random: + vmove = random.choice((-1,1)) + elif self.voicing.bcount and self.voicing.dir: + vmove = self.voicing.dir + + + for p in pattern: + tb = self.getChordInPos(p.offset, ctable) + + if tb.chordZ: + continue + + self.crDupRoot = self.dupRoot[sc] + + vmode = self.voicing.mode + vols = p.vol[0:tb.chord.noteListLen] + + # Limit the chord notes. This works even if THERE IS A VOICINGMODE! + + if self.chordLimit: + tb.chord.limit(self.chordLimit) + + """ Compress chord into single octave if 'compress' is set + We do it here, before octave, transpose and invert! + Ignored if we have a VOICINGMODE. + """ + + if self.compress[sc] and not vmode: + tb.chord.compress() + + # Do the voicing stuff. + + if vmode: + vmove=self.chordVoicing(tb.chord, vmove) + + # Invert. + + if self.invert[sc]: + tb.chord.invert(self.invert[sc]) + + # Set STRUM flags + + strumAdjust = self.strum[sc] + strumOffset = 0 + sd = self.direction[sc] + if sd=='BOTH': + sd = 'BOTHDOWN' + if sd == 'BOTHDOWN': + sd = 'BOTHUP' + elif sd == 'BOTHUP': + sd = 'BOTHDOWN' + + if strumAdjust and sd in ('DOWN', 'BOTHDOWN'): + strumOffset += strumAdjust * tb.chord.noteListLen + strumAdjust = -strumAdjust + + + """ Voicing adjustment for 'jazz' or altered chords. If a chord (most + likely something like a M7 or flat-9 ends up with any 2 adjacent + notes separated by a single tone an unconfortable dissonance results. + This little check compares all notes in the chord and will cut the + volume of one note to reduce the disonance. Usually this will be + the root note volume being decreased. + """ + + nl=tb.chord.noteList + l=len(nl) + for j in range(l-1): + r = nl[j] + for i in range(j+1, l): + if nl[i] in (r-1, r+1, r-13, r+13) and vols[i] >= vols[0]: + vols[j] = vols[i]/2 + break + + loo = zip(nl, vols) # this is a note/volume array of tuples + + + """ Duplicate the root. This can be set from a DupRoot command + or by chordVoicing(). Notes: + - The volume for the added root will be the average of the chord + notes (ignoring OFF notes) divided by 2. + - If the new note (after transpose and octave adjustments + is out of MIDI range it will be ignored. + """ + + if self.crDupRoot: + root = tb.chord.rootNote + self.crDupRoot + t = root + self.octave[sc] + gbl.transpose + if t >=0 and t < 128: + v=0 + c=0 + for vv in vols: + if vv: + v += vv + c += 2 + v /= c + loo.append( (tb.chord.rootNote + self.crDupRoot, v)) + + for note, v in sorted(loo): # sorting low-to-high notes. Mainly for STRUM. + self.sendNote( + p.offset+strumOffset, + self.getDur(p.duration), + self.adjustNote(note), + self.adjustVolume( v, p.offset) ) + + strumOffset += strumAdjust + + tb.chord.reset() # important, other tracks chord object + + # Adjust the voicingMove counter at the end of the bar + + if self.voicing.bcount: + self.voicing.bcount -= 1 + + + diff --git a/mma/MMA/patDrum.py b/mma/MMA/patDrum.py new file mode 100644 index 0000000..20f293f --- /dev/null +++ b/mma/MMA/patDrum.py @@ -0,0 +1,103 @@ + +# patDrum.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import gbl +from MMA.common import * +from MMA.notelen import getNoteLen +import MMA.translate +from MMA.pat import PC, seqBump + + +class Drum(PC): + """ Pattern class for a drum track. """ + + vtype = 'DRUM' + toneList = [38] + + def setTone(self, ln): + """ Set a tone list. Only valid for DRUMs. + ln[] is not nesc. the right length. + """ + + ln=self.lnExpand(ln, 'Tone') + tmp = [] + + for n in ln: + tmp.append(MMA.translate.dtable.get(n)) + + self.toneList = seqBump( tmp ) + + def restart(self): + self.ssvoice = -1 + + + def getPgroup(self, ev): + """ Get group for a drum pattern. + + Fields - start, length, volume + """ + + if len(ev) != 3: + error("There must be at exactly 3 items in each " + "group of a drum define, not <%s>." % ' '.join(ev) ) + + a = struct() + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen(ev[1]) + a.vol = stoi(ev[2], "Type error in Drum volume.") + + return a + + + + def trackBar(self, pattern, ctable): + """ Do a drum bar. + + Called from self.bar() + + """ + + sc = self.seq + + for p in pattern: + tb = self.getChordInPos(p.offset, ctable) + + if tb.drumZ: + continue + + self.sendNote( + p.offset, + self.getDur(p.duration), + self.toneList[sc], + self.adjustVolume(p.vol, p.offset) ) + + + + + + + + diff --git a/mma/MMA/patScale.py b/mma/MMA/patScale.py new file mode 100644 index 0000000..dd76b50 --- /dev/null +++ b/mma/MMA/patScale.py @@ -0,0 +1,215 @@ + +# patScale.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + + + +import random + +from MMA.harmony import harmonize +from MMA.notelen import getNoteLen +import gbl +from MMA.common import * +from MMA.pat import PC + + +class Scale(PC): + """ Pattern class for a Scale track. """ + + vtype = 'SCALE' + + lastNote = -1 + lastChord = None + lastStype = None + lastDirect = 1 + lastRange = 0 + sOffset = 0 + notes = None + dirfact = 1 + + def getPgroup(self, ev): + """ Get group for scale patterns. + + Fields - start, length, volume + """ + + + if len(ev) != 3: + error("There must be at exactly 3 items in each group " + "in a Scale definition, not <%s>." % ' '.join(ev)) + + a = struct() + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen(ev[1]) + a.vol = stoi(ev[2], "Type error in Scale definition") + + + return a + + def restart(self): + self.ssvoice = -1 + self.lastNote = -1 + self.lastChord = None + self.lastStype = None + self.lastDirect = 1 + self.lastRange = 0 + self.sOffset = 0 + self.notes = None + self.dirfact = 1 + + def trackBar(self, pattern, ctable): + """ Do a scale bar. + + Called from self.bar() + """ + + sc = self.seq + direct = self.direction[sc] + unify = self.unify[sc] + + # If the range or direction has changed, we just start + # with a new scale. + + + t = self.chordRange[sc] + if t != self.lastRange: + self.lastRange = t + self.lastChord = None + + if self.lastDirect != direct: + self.lastDirect = direct + self.lastChord = None + + for p in pattern: + + tb = self.getChordInPos(p.offset, ctable) + + if tb.scaleZ: + continue + + + thisChord = tb.chord.tonic + tb.chord.chordType + stype = self.scaleType[sc] + + if thisChord != self.lastChord or stype != self.lastStype: + self.lastChord = thisChord + self.lastStype = stype + + if stype == 'CHROMATIC': + notelist = [ tb.chord.rootNote + x for x in range(0,12)] + + else: + notelist = list(tb.chord.scaleList) + + """ Get the current scale and append enuf copies + together for RANGE setting. If Range happens + to be 0 or 1 we end up with a single copy. + """ + + ln=self.chordRange[sc] # RANGE 1...x (def. == 1) + + o=0 + self.notes = [] + + while ln >= 1: + for a in notelist: + self.notes.append(a+o) + o+=12 + ln-=1 + + if ln>0 and ln<1: # for fractional scale lengths + ln = int(len(notelist) * ln) + if ln < 2: # important, must be at least 2 notes in a scale + ln=2 + for a in notelist[:ln]: + self.notes.append(a+o) + + if direct == 'DOWN': + self.dirfact = -1 + if self.lastNote == -1: + self.sOffset = len(self.notes)-1 + else: + self.sOffset = 0 + + if self.lastNote > -1: + if self.lastNote in self.notes: + self.sOffset = self.notes.index(self.lastNote) + + else: + self.sOffset=len(self.notes)-1 + for i, a in enumerate(self.notes): + if a>self.lastNote: + self.sOffset = i + break + + + # Keep offset into note list in range + + # only > end of list if BOTH or UP + + if self.sOffset >= len(self.notes): + if direct == 'BOTH': + self.dirfact = -1 + self.sOffset = len(self.notes)-2 + else: ## UP + self.sOffset = 0 + + # only < start of list if DOWN or BOTH + + elif self.sOffset < 0: + if direct == 'BOTH': + self.dirfact = 1 + self.sOffset = 1 + else: ## DOWN + self.sOffset = len(self.notes)-1 + + if direct == 'RANDOM': + note = random.choice(self.notes) + else: + note = self.notes[self.sOffset] + self.sOffset += self.dirfact + + self.lastNote = note + + if not self.harmonyOnly[sc]: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(note), + self.adjustVolume(p.vol, p.offset)) + + + if self.harmony[sc]: + ch = self.getChordInPos(p.offset, ctable).chord.noteList + h = harmonize(self.harmony[sc], note, ch) + for n in h: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(n), + self.adjustVolume(self.harmonyVolume[sc] * p.vol, -1) ) + + diff --git a/mma/MMA/patSolo.py b/mma/MMA/patSolo.py new file mode 100644 index 0000000..4c49996 --- /dev/null +++ b/mma/MMA/patSolo.py @@ -0,0 +1,621 @@ + +# patSolo.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import gbl +from MMA.common import * +from MMA.notelen import getNoteLen +import MMA.translate +from MMA.harmony import harmonize +from MMA.pat import PC +import MMA.alloc +import MMA.volume + + +class NoteList: + def __init__(self, length): + self.dur = length + self.velocity = [] + self.nl = [] + + +############################## + +class Melody(PC): + """ The melody and solo tracks are identical, expect that + the solo tracks DO NOT get saved in grooves and are only + initialized once. + """ + + vtype = 'MELODY' + drumType = None + + endTilde = [] + drumTone = 38 + + def setDrumType(self): + """ Set this track to be a drum track. """ + + if self.channel: + error("You cannot change a track to DRUM once it has been used.") + + self.drumType = 1 + self.setChannel('10') + + + def definePattern(self, name, ln): + error("Melody/solo patterns cannot be defined.") + + + def restart(self): + self.ssvoice = -1 + + def setTone(self, ln): + """ A solo track can have a tone, if it is DRUMTYPE.""" + + if not self.drumType: + error("You must set a Solo track to DrumType before setting Tone.") + + if len(ln) > 1: + error("Only 1 value permitted for Drum Tone in Solo tracks.") + + self.drumTone = MMA.translate.dtable.get(ln[0]) + + + + def getLine(self, pat, ctable): + """ Extract a melodyline for solo/melody tracks. + + This is only called from trackbar(), but it's nicer + to isolate it here. + """ + + sc = self.seq + barEnd = gbl.BperQ*gbl.QperBar + + acc=keySig.getAcc() + + # list of notename to midivalues + + midiNotes = {'c':0, 'd':2, 'e':4, 'f':5, 'g':7, 'a':9, 'b':11, 'r':None } + + """ The initial string is in the format "1ab;4c;;4r;". The trailing + ';' is important and needed. If we don't have this requirement + we can't tell if the last note is a repeat of the previous. For + example, if we have coded "2a;2a;" as "2a;;" and we didn't + have the 'must end with ;' rule, we end up with "2a;" and + then we make this into 2 notes...or do we? Easiest just to + insist that all bars end with a ";". + """ + + if not pat.endswith(';'): + error("All Solo strings must end with a ';'") + + """ Take our list of note/value pairs and decode into + a list of midi values. Quite ugly. + """ + + if gbl.swingMode: + len8 = getNoteLen('8') + len81 = getNoteLen('81') + len82 = getNoteLen('82') + onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)] + offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)] + + + length = getNoteLen('4') # default note length + lastc = '' # last parsed note + velocity = 90 # intial/default velocity for solo notes + harmony = self.harmony[sc] + harmOnly = self.harmonyOnly[sc] + + notes={} # A dict of NoteList, keys == offset + + if self.drumType: + isdrum = 1 + lastc = str(self.drumTone) + else: + isdrum = None + + pat = pat.replace(' ', '').split(';')[:-1] + + # set initial offset into bar + + if pat[0].startswith("~"): + pat[0]=pat[0][1:] + if not self.endTilde or self.endTilde[1] != gbl.tickOffset: + error("Previous line did not end with '~'.") + else: + offset = self.endTilde[0] + else: + offset = 0 + lastOffset = None + + # Strip off trailing ~ + + if pat[-1].endswith("~"): + self.endTilde = [1, gbl.tickOffset + (gbl.BperQ * gbl.QperBar) ] + pat[-1]=pat[-1][:-1] + else: + self.endTilde = [] + + + # Begin parse loop + + for a in pat: + if a == '<>': + continue + + if offset >= barEnd: + error("Attempt to start Solo note '%s' after end of bar." % a) + + # strip out all '' setting and adjust velocity + + a, vls = pextract(a, "<", ">") + if vls: + if len(vls) > 1: + error("Only 1 volume string is permitted per note-set") + + vls = vls[0].upper().strip() + if not vls in MMA.volume.vols: + error("%s string Expecting a valid volume, not '%s'" % \ + (self.name, vls)) + velocity *= MMA.volume.vols[vls] + + + """ Split the chord chunk into a note length and notes. Each + part of this is optional and defaults to the previously + parsed value. + """ + + i = 0 + while i < len(a): + if not a[i] in '1234568.+': + break + else: + i+=1 + + if i: + l=getNoteLen(a[0:i]) + c=a[i:] + else: + l=length + c=a + + if not c: + c=lastc + if not c: + error("You must specify the first note in a solo line") + + length = l # set defaults for next loop + lastc = c + + + """ Convert the note part into a series of midi values + Notes can be a single note, or a series of notes. And + each note can be a letter a-g (or r), a '#,&,n' plus + a series of '+'s or '-'s. Drum solos must have each + note separated by ','s: "Snare1,Kick1,44". + """ + + if isdrum: + c=c.split(',') + else: + c=list(c) + + while c: + + # Parse off note name or 'r' for a rest + + name = c.pop(0) + + if name == 'r' and (offset in notes or c): + error("You cannot combine a rest with a note in " + "a chord for solos.") + + + if not isdrum: + if not name in midiNotes: + error("%s encountered illegal note name '%s'." + % (self.name, name)) + + v = midiNotes[ name ] + + # Parse out a "#', '&' or 'n' accidental. + + if c and c[0]=='#': + c.pop(0) + acc[name] = 1 + + elif c and c[0]=='&': + c.pop(0) + acc[name] = -1 + + elif c and c[0]=='n': + c.pop(0) + acc[name] = 0 + + if v != None: + v += acc[name] + + # Parse out +/- (or series) for octave + + if c and c[0] == '+': + while c and c[0] == '+': + c.pop(0) + v += 12 + elif c and c[0] == '-': + while c and c[0] == '-': + c.pop(0) + v -= 12 + + else: + if not name: # just for leading '.'s + continue + if name == 'r': + v = midiNotes[ name ] + elif name == '*': + v = self.drumTone + else: + v = MMA.translate.dtable.get(name) + + + """ Swingmode -- This tests for successive 8ths on/off beat + If found, the first is converted to 'long' 8th, the 2nd to a 'short' + and the offset for the 2nd is adjusted to comp. for the 'long'. + """ + + if gbl.swingMode and l==len8 and \ + offset in offBeats and \ + lastOffset in onBeats and \ + lastOffset in notes: + if notes[lastOffset].dur == len8: + offset = lastOffset + len81 + notes[lastOffset].dur = len81 + l=len82 + + + # create a new note[] entry for this offset + + if not offset in notes: + notes[offset] = NoteList(l) + + # add note event to note[] array + + notes[offset].nl.append(v) + notes[offset].velocity.append(self.adjustVolume(velocity, offset)) + + """ Do harmony. This is done for each chord as they are + parsed out. So, after parsing out the "16g" from the solo + string "4a;16g;4c;" we add the harmony notes to the 'g' note. + + The chord is not processed if this is a "drum-type", if there is + more than one note in the chord (we assume user harmony), + if the chord for the current beat is a 'z', or if the note + is a 'rest' (note==None). + """ + + if harmony and offset in notes and not isdrum: + nn=notes[offset] + + if len(nn.nl) == 1 and nn.nl[0] != None: + tb = self.getChordInPos(offset, ctable) + + if not tb.chordZ: + h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList) + + + """ If harmonyonly set then drop note, substitute harmony, + else append harmony notes to chord. + """ + + for i in range(len(h)): + nn.velocity.append(self.adjustVolume(velocity * + self.harmonyVolume[sc], offset)) + + if harmOnly: + nn.nl = h + else: + nn.nl.extend(h) + + lastOffset = offset + offset += l + + + if offset <= barEnd: + if self.endTilde: + error("Tilde at end of bar has no effect.") + + else: + if self.endTilde: + self.endTilde[0]=offset-barEnd + else: + warning("%s, end of last note overlaps end of bar by %2.3f " + "beat(s)." % (self.name, (offset-barEnd)/float(gbl.BperQ))) + + return notes + + + def trackBar(self, pat, ctable): + """ Do the solo/melody line. Called from self.bar() """ + + notes = self.getLine(pat, ctable) + + """ The notes structure is a dictionary. Each key represents an offset + in MIDI ticks in the current bar. The data for each entry is an array + of notes, a duration and velocity: + + notes[offset].dur - duration in ticks + notes[offset].velocity[] - velocity for notes + notes[offset].nl[] - list of notes (if the only note value is None + this is a rest placeholder) + + """ + + sc=self.seq + unify = self.unify[sc] + + rptr = self.mallet + + for offset in sorted(notes.keys()): + nn=notes[offset] + + for n,v in zip(nn.nl, nn.velocity): + if n == None: # skip rests + continue + + if not self.drumType: # octave, transpose + n = self.adjustNote(n) + + self.sendNote( offset, self.getDur(nn.dur), n, v) + + + +class Solo(Melody): + """ Pattern class for a solo track. """ + + vtype = 'SOLO' + + + # Grooves are not saved/restored for solo tracks. + + def restoreGroove(self, gname): + self.setSeqSize() + + def saveGroove(self, gname): + pass + + +################################## + +""" Keysignature. This is only used in the solo/melody tracks so it + probably makes sense to have the parse routine here as well. To + contain everything in one location we make a single instance class + of the whole mess. +""" + +class KeySig: + + def __init__(self): + self.kSig = 0 + + majKy = { "C" : 0, "G" : 1, "D" : 2, + "A" : 3, "E" : 4, "B" : 5, + "F#": 6, "C#": 7, "F" : -1, + "Bb": -2, "Eb": -3, "Ab": -4, + "Db": -5, "Gb": -6, "Cb": -7 } + + minKy = { "A" : 0, "E" : 1, "B" : 2, + "F#": 3, "C#": 4, "G#": 5, + "D#": 6, "A#": 7, "D" : -1, + "G" : -2, "C" : -3, "F" : -4, + "Bb": -5, "Eb": -6, "Ab": -7 } + + def set(self,ln): + """ Set the keysignature. Used by solo tracks.""" + + mi = 0 + + if len(ln) < 1 or len(ln) > 2: + error("KeySig only takes 1 or 2 arguments.") + + if len(ln) == 2: + l=ln[1][0:3].upper() + if l == 'MIN': + mi=1 + elif l == 'MAJ': + mi=0 + else: + error("KeySig 2nd arg must be 'Major' or 'Minor', not '%s'" % ln[1]) + + l=ln[0] + + t=l[0].upper() + l[1:] + + if mi and t in self.minKy: + self.kSig = self.minKy[t] + elif not mi and t in self.majKy: + self.kSig = self.majKy[t] + elif l[0] in "ABCDEFG": + error("There is no key signature name: '%s'" % l) + + else: + c=l[0] + f=l[1].upper() + + if not f in ("B", "&", "#"): + error("2nd char in KeySig must be 'b' or '#', not '%s'" % f) + + if not c in "01234567": + error("1st char in KeySig must be digit 0..7, not '%s'" % c) + + self.kSig = int(c) + + if f in ('B', '&'): + self.kSig = -self.kSig + + + if not c in "01234567": + error("1st char in KeySig must be digit 0..7, not '%s'" % c) + + + # Set the midi meta track with the keysig. This doen't do anything + # in the playback, but other programs may use it. + + n = self.kSig + if n < 0: + n = 256 + n + + gbl.mtrks[0].addKeySig(gbl.tickOffset, n, mi) + + if gbl.debug: + n = self.kSig + if n >= 0: + f = "Sharps" + else: + f = "Flats" + + print "KeySig set to %s %s" % (abs(n), f) + + + def getAcc(self): + """ The solo parser needs to know which notes are accidentals. + This is simple with a keysig table. There is an entry for each note, + either -1,0,1 corresponding to flat,natural,sharp. We populate + the table for each bar from the keysig value. As we process + the bar data we update the table. There is one flaw here---in + real music an accidental for a note in a give octave does not + effect the following same-named notes in different octaves. + In this routine IT DOES. + + NOTE: This is recreated for each bar of music for each solo/melody track. + """ + + acc = {'a':0, 'b':0, 'c':0, 'd':0, 'e':0, 'f':0, 'g':0 } + ks=self.kSig + + if ks < 0: + for a in range( abs(ks) ): + acc[ ['b','e','a','d','g','c','f'][a] ] = -1 + + else: + for a in range(ks): + acc[ ['f','c','g','d','a','e','b'][a] ] = 1 + + return acc + + +keySig=KeySig() # single instance + +####################### + +""" When solos are included in a chord/data line they are + assigned to the tracks listed in this list. Users can + change the tracks with the setAutoSolo command. +""" + +autoSoloTracks = [ 'SOLO', 'SOLO-1', 'SOLO-2', 'SOLO-3' ] + + +def setAutoSolo(ln): + """ Set the order and names of tracks to use when assigning + automatic solos (specified on chord lines in {}s). + """ + + global autoSoloTracks + + if not len(ln): + error("You must specify at least one track for autosolos.") + + autoSoloTracks = [] + for n in ln: + n=n.upper() + MMA.alloc.trackAlloc(n, 1) + if gbl.tnames[n].vtype not in ('MELODY', 'SOLO'): + error("All autotracks must be Melody or Solo tracks, " + "not %s." % gbl.tnames[n].vtype) + + autoSoloTracks.append(n) + + if gbl.debug: + print "AutoSolo track names:", + for a in autoSoloTracks: + print a, + print + + + +############### + +def extractSolo(ln, rptcount): + """ Parser calls this to extract solo strings. """ + + a = ln.count('{') + b = ln.count('}') + + if a != b: + error("Mismatched {}s for solo found in chord line.") + + if a: + if rptcount > 1: + error("Bars with both repeat count and solos are not permitted.") + + ln, solo = pextract(ln, '{', '}') + + if len(solo) > len(autoSoloTracks): + error("Too many melody/solo riffs in chord line. %s used, " + "only %s defined." % (len(solo), len(autoSoloTracks)) ) + + + firstSolo = solo[0][:] # save for autoharmony tracks + + """ We have the solo information. Now we loop though each "solo" and: + 1. Ensure or Create a MMA track for the solo + 2. Push the solo data into a Riff for the given track. + """ + + for s, trk in zip(solo, autoSoloTracks): + MMA.alloc.trackAlloc(trk, 1) + gbl.tnames[trk].setRiff( s.strip() ) + + + """ After all the solo data is interpreted and sent to the + correct track, we check any leftover tracks. If any of these + tracks are empty of data AND are harmonyonly the note + data from the first track is interpeted again for that + track. Tricky: the max() is needed since harmonyonly can + have different setting for each bar...this way + the copy is done if ANY bar in the seq has harmonyonly set. + """ + + for t in autoSoloTracks[1:]: + if gbl.tnames.has_key(t) and gbl.tnames[t].riff == [] \ + and max(gbl.tnames[t].harmonyOnly): + gbl.tnames[t].setRiff( firstSolo[:] ) + + if gbl.debug: + print "%s duplicated to %s for HarmonyOnly." % (trk, t) + + return ln + diff --git a/mma/MMA/patWalk.py b/mma/MMA/patWalk.py new file mode 100644 index 0000000..d026930 --- /dev/null +++ b/mma/MMA/patWalk.py @@ -0,0 +1,164 @@ + +# patWalk.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + + +import random + +from MMA.harmony import harmonize +from MMA.notelen import getNoteLen +import gbl +from MMA.common import * +from MMA.pat import PC + + +class Walk(PC): + """ Pattern class for a walking bass track. """ + + vtype = 'WALK' + walkChoice = 0 + + def getPgroup(self, ev): + """ Get group for walking bass pattern. + + Fields - start, length, volume + """ + + if len(ev) != 3: + error("There must be at exactly 3 items in each group in " + "a Walking Bass definition, not <%s>." % ' '.join(ev)) + + a = struct() + + a.offset = self.setBarOffset(ev[0]) + a.duration = getNoteLen(ev[1]) + a.vol = stoi(ev[2], "Type error in Walking Bass definition") + + return a + + + def restart(self): + self.ssvoice = -1 + self.walkChoice = 0 + + + def trackBar(self, pattern, ctable): + """ Do a waling bass bar. + + Called from self.bar() + + """ + + sc=self.seq + dir = self.direction[sc] + unify = self.unify[sc] + + for p in pattern: + + tb = self.getChordInPos(p.offset, ctable) + + if tb.walkZ: + continue + + root = tb.chord.rootNote # root note of chord + + """ Create a note list from the current scale. We do + this for each beat, but it's pretty fast. The note + list is simply notes 0..6 of the scale PLUS notes + 1..5 reversed. So, a Cmajor chord would result in + the note list (0,2,4,5,7,9,7,5,4,2). + + Note that we deliberately skip the 7th. Too often + the chord is a Major but the melody note will be + the dom. 7th and the M7 will sound off. So, just + err on the side of caution. + + If DIR is UP or DOWN we don't append the 2nd half + of the scale. + + If DIR is DOWN we reverse the order as well. + """ + + wNotes = list(tb.chord.scaleList[0:6]) + if dir not in ('UP', 'DOWN'): + b = list(tb.chord.scaleList[1:5]) + b.reverse() + wNotes += b + + if dir == 'DOWN': + wNotes.reverse() + + + # Ensure that the offset is in range. + + if self.walkChoice >= len(wNotes) or self.walkChoice < 0: + self.walkChoice = 0 + + """ Even with a walking bass it's nice to have the chord root on + beat 1 ... not all the time, but most. This bit of code ensures + that more that 50% of beat ones will have the root. + """ + + + if p.offset == 0 and random.choice((0,1)): + self.walkChoice=0 + + note = wNotes[self.walkChoice] + + """ Adjust offset for NEXT TIME. If the direction is + up/down we just increment the pointer. If we have + direction set to RANDOM then we select either -1, + 0 or 1 with equal change for moving up, down or + not-at-all. With BOTH we have a preference to move up. + """ + + + if dir in ('UP', 'DOWN'): + self.walkChoice += 1 + elif dir == 'RANDOM': + self.walkChoice += random.choice((0,1,-1)) + else: # BOTH + self.walkChoice += random.choice( (-1,0,0,2,2,1,1,1,1,1,1,1)) + + + if not self.harmonyOnly[sc]: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(note), + self.adjustVolume(p.vol, p.offset) ) + + + if self.harmony[sc]: + ch = self.getChordInPos(p.offset, ctable).chord.noteList + h = harmonize(self.harmony[sc], note, ch) + for n in h: + self.sendNote( + p.offset, + self.getDur(p.duration), + self.adjustNote(n), + self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) ) + + + diff --git a/mma/MMA/translate.py b/mma/MMA/translate.py new file mode 100644 index 0000000..e1d3ffc --- /dev/null +++ b/mma/MMA/translate.py @@ -0,0 +1,253 @@ + +# translate.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + + +This module handles voice name translations. + +""" + +import gbl +import MMA.midiC +from MMA.common import * + + +""" Translation table for VOICE. This is ONLY used when a voice is set +from the VOICE command. If a translation exists the translation is +substituted. """ + + +class Vtable: + + def __init__(self): + self.table = {} + + def retlist(self): + + l=[] + for n in sorted(self.table.keys()): + l.append("%s=%s" % (n.title(), self.table[n])) + + return ' '.join(l) + + + def set(self, ln): + """ Set a name/alias for voice translation, called from parser. """ + + if not ln: + self.table = {} + if gbl.debug: + print "Voice Translaion table reset." + + return + + for l in ln: + l=l.upper() + if l.count('=') != 1: + error("Each translation pair must be in the format Voice=Alias") + v,a = l.split('=') + self.table[v] = a + + if gbl.debug: + print "Voice Translations: ", + for l in ln: + print l, + print + + def get(self, name): + """ Return a translation or original. """ + + name=name.upper() + if self.table.has_key(name): + return self.table[name] + + else: + return name + +vtable=Vtable() # Create single class instance. + + +""" This is just like the Vtable, but it is used for DRUM TONES. We use +this translation when a TONE is set for a drum in setTone() and when a +tone is selected in a Solo/Melody DRUM track. """ + +class Dtable: + + def __init__(self): + self.table = {} + + def retlist(self): + + l=[] + for n in sorted(self.table.keys()): + l.append("%s=%s" % ( MMA.midiC.valueToDrum(n), + MMA.midiC.valueToDrum(self.table[n]))) + + return ' '.join(l) + + + def set(self, ln): + """ Set a name/alias for drum tone translation, called from parser. """ + + if not ln: + self.table = {} + if gbl.debug: + print "DrumTone Translaion table reset." + + return + + for l in ln: + l=l.upper() + if l.count('=') != 1: + error("Each translation pair must be in the format Voice=Alias") + v,a = l.split('=') + + v=MMA.midiC.drumToValue(v) + a=MMA.midiC.drumToValue(a) + + self.table[v] = a + if gbl.debug: + print "DrumTone Translation: %s=%s" % \ + (MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a)) + + + def get(self, name): + """ Return a translation or original. """ + + v=MMA.midiC.drumToValue(name) + + if self.table.has_key(v): + return self.table[v] + + else: + return v + + + +dtable=Dtable() + + +""" Volume adjustment. Again, similar to voice/tone translations, +but this is for the volume. The table creates a percentage adjustment +for tones/voices specified. When a TRACK VOLUME is set in +MMApat.setVolume() the routine checks here for an adjustment. """ + +class VoiceVolTable: + + def __init__(self): + self.table = {} + + def retlist(self): + l=[] + for n in sorted(self.table.keys()): + l.append("%s=%s" % ( MMA.midiC.valueToInst(n), self.table[n])) + + return ' '.join(l) + + + def set(self, ln): + """ Set a name/alias for voice volume adjustment, called from parser. """ + + if not ln: + self.table = {} + if gbl.debug: + print "Voice Volume Adjustment table reset." + + return + + for l in ln: + l=l.upper() + if l.count('=') != 1: + error("Each translation pair must be in the format Voice=Ajustment") + v,a = l.split('=') + + v=MMA.midiC.instToValue(v) + a=stoi(a) + if a<1 or a>200: + error("Voice volume adjustments must be in range 1 to 200, not %." % a) + self.table[v] = a/100. + if gbl.debug: + print "Voice Volume Adjustment: %s=%s" % (MMA.midiC.valueToInst(v), a) + + + def get(self, v, vol): + """ Return an adjusted value or original. """ + + if self.table.has_key(v): + vol = int(vol * self.table[v]) + + return vol + + +voiceVolTable=VoiceVolTable() + +class DrumVolTable: + + def __init__(self): + self.table = {} + + def retlist(self): + + l=[] + for n in sorted(self.table.keys()): + l.append("%s=%s" % ( MMA.midiC.valueToDrum(n), self.table[n])) + + return ' '.join(l) + + + def set(self, ln): + """ Set a name/alias for voice volume adjustment, called from parser. """ + + if not ln: + self.table = {} + if gbl.debug: + print "Drum Volume Adjustment table reset." + + return + + for l in ln: + l=l.upper() + if l.count('=') != 1: + error("Each translation pair must be in the format Drum=Ajustment") + v,a = l.split('=') + + v=MMA.midiC.instToValue(v) + a=stoi(a) + if a<1 or a>200: + error("Drum volume adjustments must be in range 1 to 200, not %." % a) + self.table[v] = a/100. + if gbl.debug: + print "Drum Volume Adjustment: %s=%s" % (MMA.midiC.valueToDrum(v), a) + + + def get(self, v, vol): + """ Return an adjusted value or original. """ + + if self.table.has_key(v): + vol = int(vol * self.table[v]) + + return vol + + +drumVolTable=DrumVolTable() + + diff --git a/mma/MMA/volume.py b/mma/MMA/volume.py new file mode 100644 index 0000000..7a90c8b --- /dev/null +++ b/mma/MMA/volume.py @@ -0,0 +1,206 @@ + +# volume.py + +""" +This module is an integeral part of the program +MMA - Musical Midi Accompaniment. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +from MMA.common import * + + +""" Volumes are specified in musical terms, but converted to + midi velocities. This table has a list of percentage changes + to apply to the current volume. Used in both track and global + situations. Note that the volume for 'ffff' is 200%--this will + most likely generate velocities outside the midi range of 0..127. + But that's fine since mma will adjust volumes into the valid + range. Using very high percentages will ensure that 'ffff' notes + are (most likely) sounded with a maximum velocity. +""" + +vols={ 'OFF': 0.00, 'PPPP': 0.05, 'PPP': 0.10, + 'PP': 0.25, 'P': 0.40, 'MP': 0.70, + 'M': 1.00, 'MF': 1.10, 'F': 1.30, + 'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 } + +volume = vols['M'] # default global volume +lastVolume = volume +futureVol = [] +vTRatio = .6 +vMRatio = 1-vTRatio + + +def adjvolume(ln): + """ Adjust the ratio used in the volume table and track/global ratio. """ + + global vols, vTRatio, vMRatio + + if not ln: + error("Use: AdjustVolume DYN=RATIO [..].") + + for l in ln: + + try: + v,r = l.split('=') + except: + error("AdjustVolume expecting DYN=RATIO pair, not '%s'." % l) + + v=v.upper() + + if v == 'RATIO': + + r=stof(r) + + if r<0 or r>100: + error("VolumeRatio must be value 0 to 100.") + + vTRatio = r/100 + vMRatio = 1-vTRatio + + elif v in vols: + vols[v] = calcVolume(r, vols[v]) + + else: + error("Dynamic '%s' for AdjustVolume is unknown." % v ) + + + + if gbl.debug: + print "Volume Ratio: %s%% Track / %s%% Master" % ( vTRatio * 100, vMRatio * 100) + print "Volume table:", + for a in vols: + print "%s=%s" % (a, int(vols[a] * 100)), + print + + + +def calcVolume(new, old): + """ Calculate a new volume "new" possibly adjusting from "old". """ + + if new[0] == '-' or new[0] == '+': + a = stoi(new, "Volume expecting value for %% adjustment, not %s." % new) + v = old + (old * a/100.) + + elif new[0] in "0123456789": + v = stoi(new, "Volume expecting value, not '%s'" % new) / 100. + + else: + new = new.upper() + + adj = None + + if '+' in new: + new,adj = new.split('+') + elif '-' in new: + new,adj = new.split('-') + adj = '-' + adj + + if not new in vols: + error("Unknown volume '%s'." % new) + + v=vols[new] + + if adj: + a = stoi(adj, "Volume expecting adjustment value, not %s." % adj) + v += (v * (a/100.)) + + return v + + +def setVolume(ln): + """ Set master volume. """ + + global volume, lastVolume + + lastVolume = volume + + if len(ln) != 1: + error ("Use: Volume DYNAMIC.") + + volume = calcVolume(ln[0], volume) + + if gbl.debug: + print "Volume: %s%%" % volume + + +# The next 2 are called from the parser. + +def setCresc(ln): + setCrescendo(1, ln) + +def setDecresc(ln): + setCrescendo(-1, ln) + + +def setCrescendo(dir, ln): + """ Combined (de)cresc() """ + + global futureVol, volume, lastVolume + + lastVolume = volume + + if len(ln) == 3: + setVolume([ln[0]]) + ln=ln[1:] + + + futureVol = fvolume(dir, volume, ln) + + +# Used by both the 2 funcs above and from TRACK.setCresc() + +def fvolume(dir, startvol, ln): + """ Create a list of future vols. Called by (De)Cresc. """ + + # Get destination volume + + destvol = calcVolume(ln[0], startvol) + + bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'." % ln[1] ) + + if bcount <= 0: + error("Bar count for (De)Cresc must be postive.") + + if dir > 0 and destvol < startvol: + warning("Cresc volume less than current setting. " ) + + elif dir < 0 and destvol > startvol: + warning("Decresc volume greater than current setting. " ) + + elif destvol == startvol: + warning("(De)Cresc volume equal to current setting. " ) + + bcount -= 1 + step = ( destvol-startvol ) / bcount + + volList=[startvol] + + for a in range(bcount-1): + startvol += step + volList.append( startvol) + + volList.append(destvol) + + return volList + + + + diff --git a/mma/cp-install b/mma/cp-install new file mode 100755 index 0000000..00dac7c --- /dev/null +++ b/mma/cp-install @@ -0,0 +1,115 @@ +#!/usr/bin/env python + +import shutil, os, sys + +def okay(msg): + print msg + a=raw_input(" Press to continue (anything else will terminate): ") + + if a: + sys.exit(1) + + return + + +# Simple python script to install mma from tarball +# This should be fixed to be more versatile. Volunteers? + +########################################### +####### Banner, get destination + +print """ +This script will install mma, the standard library and the +python modules. + +YOU WILL NEED TO BE LOGGED IN AS ROOT TO CONTINUE! + +We recommend that you install the package with this script +in the default locations. This script will create a +directory 'mma' in /usr/local/share. If this isn't +what you want, then stop this script and edit this +script's directory locations. But, please note that ONLY +/usr/local/share and /usr/share are supported as default +locations. + +The main executable script will be installed in /usr/local/bin. + +If you ever decide to get rid of MMA, just delete the executable +in /usr/local/mma and the directory tree in /usr/local/share/mma. + +""" + +okay("") + +########################################### +######## Copy the executable. + +bin='/usr/local/bin/mma' + +if os.path.exists(bin): + okay("Existing mma executable '%s' is being overwritten." % bin) + +print "Copying mma to", bin + +shutil.copy( 'mma.py', bin) + +########################################### +######## Copy the library + +dest = '/usr/local/share/mma' + +if os.path.exists(dest): + bu=dest.rsplit('/', 1)[0] + '/mma-old' + if os.path.exists(bu): + print "This script was going to move the existing MMA tree to" + print "a backup directory called '%s'. But that already exists." % bu + print "So, please delete the backup (and current) directories by hand." + print "Yes, the script could do this, but it's probably safer for you to do it!" + sys.exit(1) + + okay("Existing mma tree '%s' is being moved to '%s'." % (dest, bu)) + os.rename( dest, bu ) + +print "Copying library to", dest +os.makedirs(dest) +shutil.copytree( "lib", dest+"/lib") + + +########################################### +######## Copy the includes + +print "Copying includes to", dest +shutil.copytree( "includes", dest+"/includes") + +########################################### +######## Copy the modules + +print "Copying python modules to", dest + +shutil.copytree( "MMA", dest+"/MMA") + +########################################### +######## Copy the html docs + +print "Copying HTML documentation to", dest + +shutil.copytree( "docs", dest+"/docs") + +########################################### +######## Set permissions/udate database + +print +print "Updating database file. This uses mma with the -G option." +print "If this fails, something was not installed properly" +print "and you should contact Bob and we'll figure it out." + +okay("") + +os.system("%s -G" % bin) + +print "Setting permissions on MMADIR database file for user update." +os.system("chmod a+w " + dest+"/lib/stdlib/.mmaDB") + + + + diff --git a/mma/docs/html/README b/mma/docs/html/README new file mode 100644 index 0000000..6ad2651 --- /dev/null +++ b/mma/docs/html/README @@ -0,0 +1,11 @@ + +The HTML docs have been produced from LaTeX source via latex2html. +The library files were created with mklibdoc.py (distributed with the +MMA binaries). + +The file mma.html in this directory was handcrafted. + +NOTE: The library index may contain more files than contained in the distribution. +Missing files are probably available at www.kara-moon.com. + + diff --git a/mma/docs/html/lib/index.html b/mma/docs/html/lib/index.html new file mode 100644 index 0000000..c62d1fe --- /dev/null +++ b/mma/docs/html/lib/index.html @@ -0,0 +1,156 @@ + + +

The MMA Library

+ +

+This document is provided as a supplement to the MMA Reference +Manual which lists all of the commands in the program and helpful +information which can be used to create your own "style" files. If you are a +newcomer to MMA, you +should also have a look at the MMA Tutorial for some "getting +started" information. + +

+The information on these HTML pages has been generated directly +from the library files in your MMA library. Each +entry uses the filename as a header and then lists the various +defined grooves. + +

+You should be able to use any of the grooves listed in the "STDLIB" +section in your files without +using other directives. However, if you have files in other +locations you will need to need to +explicitly load the library file(s) with a Use directive. + +

+The filenames are in all lowercase. These are the actual filenames +used in the library. If you are loading files with the Use +directive you must use the same case (please note that +typographic case applies only to the filename---this is operating system +dependant). Groove commands are case-insensitive. + +

+Following each groove description is a boxed number in the form +(4). This indicates the sequence size of the groove. Next, is +a list of tracks and instrument names. This shows the first voice or +drum note defined for each track---it is quite possible that the track +uses other voices. This data is included so that you can see what +tracks are active. + +

+The library files supplied with MMA contain embedded documentation. +The -Dxh and -Dxl MMA command line options extract the following +information from the each library file: + +

    +
  • The filename from the "Doc File" directive. + +
  • The file description from the "Doc Note" directive. + +
  • Each groove description: This is the optional text following a + DefGroove directive. + +
      +
    • The sequence size. This is extracted from the current groove + information and was set with the SeqSize directive. It is + displayed in a small box after the groove description. + +
    • A "summary" of the voices used in the groove. Note that a + different voice or MIDI note is possible for each bar in the + sequence size; however, this listing only lists the selection for + the first bar. + +
    +
+ +

If you find that you don't have some of the grooves listed below in your distribution + you need to run the program mklibdoc.py to update these docs. Not all style files are + distributed in the default MMA distribution. + +


+

Index

+ +

These grooves can be used from a program just by using their name.

+ +

Stdlib

+ +

Use the following grooves with a "use" directive.

+ +

Kara

+ +
+
+

This document and the files linked were created by mkdoclib.py. + +

It is a part of the MMA distribution +and is protected by the same copyrights as MMA (the GNU General Public License). + +

Created: Sun Oct 15 11:26:36 2006 \ No newline at end of file diff --git a/mma/docs/html/lib/kara/K50s_rock.html b/mma/docs/html/lib/kara/K50s_rock.html new file mode 100644 index 0000000..f650e68 --- /dev/null +++ b/mma/docs/html/lib/kara/K50s_rock.html @@ -0,0 +1,314 @@ + + + +

K50S_Rock

+

A 50's rock style Highly reconizable rock from the 50's, Buddy Holly amongst, others, used this style. +

+ +

+ + + +
+

50sMain-A

+ 'Main A' 50s rock, length is 4 bars. (4) +
+ + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sFill-In-AA

+ 'One bar Fill In Main A substyle' 50s rock (1) +
+ + + + + + + +
Bass-11 AcousticBass
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sIntro-A

+ One bar 'Intro A' 50s rock (1) +
+ + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sEnding-A

+ Two bars 'Ending A' 50s rock (2) +
+ + + + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Hightom2 HighTom2
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sMain-B

+ B sub-style 50s rock. Length is 4 bars (4) +
+ + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sFill-In-BB

+ One Bar Fill In for B substyle' 50s rock (1) +
+ + + + + + + + +
Bass-11 AcousticBass
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sFill-In-BA

+ One bar Fill In used to return from B substyle to A substyle. 50s rock (1) +
+ + + + + + + + +
Bass-11 AcousticBass
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sIntro-B

+ Two bar 'Intro B substyle ' 50s rock. (2) +
+ + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sEnding-B

+ Tree bars 'Ending B substyle' 50s rock (3) +
+ + + + + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Hightom2 HighTom2
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sMain-C

+ Four bar 'Main C substyle' 50s rock (4) +
+ + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Midtom2 MidTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sFill-In-CC

+ One bar Fill In for C substyle' 50s rock (1) +
+ + + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sIntro-C

+ Four bar Intro for C substyle 50srock. (4) +
+ + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sEnding-C

+ Five bar Ending for C substyle 50s rock (5) +
+ + + + + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Hightom2 HighTom2
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sMain-D

+ Four bar Main D substyle 50s rock. (4) +
+ + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Ridecymbal1 RideCymbal1
Drum-Snaredrum1 SnareDrum1
+
+ +

+ + + +
+

50sFill-In-DD

+ One bar Fill In for D substyle 50s rock (1) +
+ + + + + + + + + +
Bass-11 AcousticBass
Bass-12 Piano1
Bass-13 SteelGuitar
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Snaredrum1 SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/kara/Kfunk1.html b/mma/docs/html/lib/kara/Kfunk1.html new file mode 100644 index 0000000..7901c9f --- /dev/null +++ b/mma/docs/html/lib/kara/Kfunk1.html @@ -0,0 +1,207 @@ + + + +

Kfunk1

+

Kfunk1.sty Clean funky style, tempo 100 - 125 The Grooves Main-A & Main C are a couple where C adds some brass So it's a good to use C only in the bars whare you need the brass. Note : I'm not a brass player, so the riffs are a bit dull, if somebody makes those riffs better, mplease upload the new style to www.kara-moon.com +

+ +

+ + + +
+

Main-A

+ A nice funk quartet, nothing to heavy (4) +
+ + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum2 KickDrum2
Drum-Openhihat OpenHiHat
Drum-Pedalhihat PedalHiHat
Drum-Snaredrum2 SnareDrum2
+
+ +

+ + + +
+

Fill-In-AA

+ Fill In AA (1) +
+ + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Drum-Closedhihat ClosedHiHat
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum2 KickDrum2
Drum-Openhihat OpenHiHat
Drum-Pedalhihat PedalHiHat
Drum-Snaredrum2 SnareDrum2
+
+ +

+ + + +
+

Fill-In-AB

+ Fill In AB, we prepare the B substyle, we add some brass (1) +
+ + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-5 Organ3
Bass-7 Trombone
Bass-8 BaritoneSax
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum1 KickDrum1
Drum-Kickdrum2 KickDrum2
Drum-Lowtom2 LowTom2
Drum-Openhihat OpenHiHat
Drum-Pedalhihat PedalHiHat
Drum-Snaredrum2 SnareDrum2
+
+ +

+ + + +
+

Main-B

+ Main B more busy & with brass (4) +
+ + + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Bass-7 Trombone
Bass-8 BaritoneSax
Drum-Closedhihat ClosedHiHat
Drum-Kickdrum2 KickDrum2
Drum-Openhihat OpenHiHat
Drum-Ridebell RideBell
Drum-Snaredrum2 SnareDrum2
Drum-Tambourine Tambourine
+
+ +

+ + + +
+

Fill-In-BA

+ Fill In BA, go back to A-substyle (1) +
+ + + + + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-5 Organ3
Bass-7 Trombone
Bass-8 BaritoneSax
Drum-Closedhihat ClosedHiHat
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum2 KickDrum2
Drum-Lowtom1 LowTom1
Drum-Lowtom2 LowTom2
Drum-Midtom1 MidTom1
Drum-Midtom2 MidTom2
Drum-Openhihat OpenHiHat
Drum-Snaredrum2 SnareDrum2
+
+ +

+ + + +
+

Fill-In-BB

+ Fill In BB (1) +
+ + + + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Bass-7 Trombone
Bass-8 BaritoneSax
Drum-Closedhihat ClosedHiHat
Drum-Crashcymbal2 CrashCymbal2
Drum-Kickdrum2 KickDrum2
Drum-Openhihat OpenHiHat
Drum-Ridebell RideBell
Drum-Snaredrum2 SnareDrum2
Drum-Tambourine Tambourine
+
+ +

+ + + +
+

Intro-A

+ Intro A,drum starts others follow from second bar (5) +
+ + + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Drum-Closedhihat ClosedHiHat
Drum-Crashcymbal2 CrashCymbal2
Drum-Kickdrum1 KickDrum1
Drum-Kickdrum2 KickDrum2
Drum-Openhihat OpenHiHat
Drum-Pedalhihat PedalHiHat
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Ending-A

+ Ending A (2) +
+ + + + + + + + + + + + + + +
Bass-11 FingeredBass
Bass-3 CleanGuitar
Bass-4 Organ3
Bass-5 Organ3
Drum-Crashcymbal1 CrashCymbal1
Drum-Crashcymbal2 CrashCymbal2
Drum-Kickdrum2 KickDrum2
Drum-Lowtom1 LowTom1
Drum-Lowtom2 LowTom2
Drum-Midtom2 MidTom2
Drum-Openhihat OpenHiHat
Drum-Pedalhihat PedalHiHat
Drum-Snaredrum2 SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/kara/twi.html b/mma/docs/html/lib/kara/twi.html new file mode 100644 index 0000000..12a0ee3 --- /dev/null +++ b/mma/docs/html/lib/kara/twi.html @@ -0,0 +1,181 @@ + + + +

Twi

+

Style : twi.mma A nice twist style +

+ +

+ + + +
+

Main-A

+ Bass, Steel Guitar, Tenor Sax & Drums (2) +
+ + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Drum-Kickdrum1 KickDrum1
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Fill-In-AA

+ Fill for Main A style (1) +
+ + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum1 KickDrum1
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Fill-In-AB

+ Fill In AB, add the piano to prepare the B substyle (1) +
+ + + + + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Bass-7 Piano1
Bass-8 Piano1
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Main-B

+ Here it realy grooves and we have a piano (2) +
+ + + + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Bass-7 Piano1
Bass-8 Piano1
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Fill-In-BA

+ Fill In BA, we go back to Main A so piano only on the first messure (1) +
+ + + + + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Bass-7 Piano1
Bass-8 Piano1
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Fill-In-BB

+ Fill In BB, pause the piano (1) +
+ + + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Intro-B

+ Our Intro-B , drums, guitar & bass (4) +
+ + + + + + + + +
Bass-11 PickedBass
Bass-2 SteelGuitar
Drum-Crashcymbal1 CrashCymbal1
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ +

+ + + +
+

Ending-B

+ The ending, all instruments involved (3) +
+ + + + + + + + + + + + +
Bass-11 PickedBass
Bass-15 TenorSax
Bass-2 SteelGuitar
Bass-7 Piano1
Bass-8 Piano1
Drum-Crashcymbal1 CrashCymbal1
Drum-Crashcymbal2 CrashCymbal2
Drum-Kickdrum1 KickDrum1
Drum-Metronomebell MetronomeBell
Drum-Snaredrum2 SnareDrum2
Drum-Sticks Sticks
+
+ + diff --git a/mma/docs/html/lib/stdlib/50srock.html b/mma/docs/html/lib/stdlib/50srock.html new file mode 100644 index 0000000..2ec6157 --- /dev/null +++ b/mma/docs/html/lib/stdlib/50srock.html @@ -0,0 +1,136 @@ + + + +

50Srock

+

Most older rock tunes accept these. Try it with songs like "There's a Kind Of Hush". +

+ +

+ + + +
+

50sRock

+ Your basic rock beat from the 50s. (2) +
+ + + + + + + + + +
Bass-Sax TenorSax
Chord-Piano Piano3
Chord-Sax TenorSax
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

50sRockSus

+ Sustained strings added. (2) +
+ + + + + + + + + + +
Bass-Sax TenorSax
Chord-Piano Piano3
Chord-Sax TenorSax
Chord-Sus TremoloStrings
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

50sRock1

+ Cut out most of the shuffle. Good for short contrast sections. (2) +
+ + + + + + + + + +
Bass-Sax TenorSax
Chord-Piano Piano3
Chord-Sax TenorSax
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

50sRock1Sus

+ Unshuffled 50s with sustained strings. (2) +
+ + + + + + + + + + +
Bass-Sax TenorSax
Chord-Piano Piano3
Chord-Sax TenorSax
Chord-Sus TremoloStrings
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

50sRockIntro

+ A 4 bar introduction. (4) +
+ + + + + + + + + +
Bass-Sax TenorSax
Chord-Piano Piano3
Chord-Sax TenorSax
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

50sRockEnd

+ Simple, single bar ending. (2) +
+ + + + + + + + +
Bass AcousticBass
Chord-Piano Piano3
Chord-Sax TenorSax
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/60srock.html b/mma/docs/html/lib/stdlib/60srock.html new file mode 100644 index 0000000..8f6733e --- /dev/null +++ b/mma/docs/html/lib/stdlib/60srock.html @@ -0,0 +1,107 @@ + + + +

60Srock

+

Straight ahead rock beat in 4. Written for "Pretty Woman". +

+ +

+ + + +
+

60sRock

+ A loud, steady rock beat. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord CleanGuitar
Chord-Straight CleanGuitar
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum2
Walk FretlessBass
+
+ +

+ + + +
+

60sRock1

+ Bridge version of 60sRock. (4) +
+ + + + + + + +
Bass FretlessBass
Chord CleanGuitar
Chord-Straight CleanGuitar
Drum-Hbongo OpenHighConga
Drum-Kick KickDrum1
Drum-Lbongo LowConga
+
+ +

+ + + +
+

60sRockSus

+ 60s Rock with strings. (4) +
+ + + + + + + + + +
Bass FretlessBass
Chord CleanGuitar
Chord-Straight CleanGuitar
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum2
Walk FretlessBass
+
+ +

+ + + +
+

60sRock1Sus

+ Alternate 60s Rock with strings. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord CleanGuitar
Chord-Straight CleanGuitar
Chord-Sus Strings
Drum-Hbongo OpenHighConga
Drum-Kick KickDrum1
Drum-Lbongo LowConga
+
+ +

+ + + +
+

60sRockEnd

+ Simple ending with 4 on first bar and 2 on 2nd. (2) +
+ + + + + + +
Bass FretlessBass
Chord CleanGuitar
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/8beat.html b/mma/docs/html/lib/stdlib/8beat.html new file mode 100644 index 0000000..177c010 --- /dev/null +++ b/mma/docs/html/lib/stdlib/8beat.html @@ -0,0 +1,113 @@ + + + +

8Beat

+

Most older rock tunes accept these. Try it with songs like "There's a Kind Of Hush". +

+ +

+ + + +
+

8Beat

+ Good for oldish rock stuff. (4) +
+ + + + + + + + +
Bass FingeredBass
Chord Honky-TonkPiano
Chord-Guitar CleanGuitar
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

8BeatSus

+ Adds sustained string to 8Beat. (4) +
+ + + + + + + + + +
Bass FingeredBass
Chord Honky-TonkPiano
Chord-Guitar CleanGuitar
Chord-Sus SlowStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

8Beat1

+ Adds interest to bass line with alternate walking bars. (4) +
+ + + + + + + + + +
Bass FingeredBass
Chord Honky-TonkPiano
Chord-Guitar CleanGuitar
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Walk FingeredBass
+
+ +

+ + + +
+

8Beat1Sus

+ Adds sustained string to 8Beat1. (4) +
+ + + + + + + + + + +
Bass FingeredBass
Chord Honky-TonkPiano
Chord-Guitar CleanGuitar
Chord-Sus SlowStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Walk FingeredBass
+
+ +

+ + + +
+

8BeatEnd

+ Simple ending. (2) +
+ + + + + + + + +
Bass FingeredBass
Chord Honky-TonkPiano
Chord-Guitar CleanGuitar
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/ballad.html b/mma/docs/html/lib/stdlib/ballad.html new file mode 100644 index 0000000..632def5 --- /dev/null +++ b/mma/docs/html/lib/stdlib/ballad.html @@ -0,0 +1,214 @@ + + + +

Ballad

+

A rock ballad in 4. +

+ +

+ + + +
+

Ballad

+ Simple Rock ballad in 4. (4) +
+ + + + + + + + + + + + + + + +
Arpeggio OrchestralHarp
Bass FretlessBass
Chord Atmosphere
Drum-Bongo LowBongo
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hh PedalHiHat
Drum-Hiconga MuteHighConga
Drum-Kick KickDrum1
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
Drum-Tamb Tambourine
+
+ +

+ + + +
+

BalladSus

+ Our simple ballad with sustained strings. (4) +
+ + + + + + + + + + + + + + + + +
Arpeggio OrchestralHarp
Bass FretlessBass
Chord Atmosphere
Chord-Sus TremoloStrings
Drum-Bongo LowBongo
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hh PedalHiHat
Drum-Hiconga MuteHighConga
Drum-Kick KickDrum1
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
Drum-Tamb Tambourine
+
+ +

+ + + +
+

Ballad1

+ Arpeggios replaced with block chords. (4) +
+ + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Atmosphere
Chord-Harp OrchestralHarp
Drum-Bongo LowBongo
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hh PedalHiHat
Drum-Hiconga MuteHighConga
Drum-Kick KickDrum1
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
Drum-Tamb Tambourine
+
+ +

+ + + +
+

Ballad1Sus

+ Add sustained strings to Ballad1. (4) +
+ + + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Atmosphere
Chord-Harp OrchestralHarp
Chord-Sus TremoloStrings
Drum-Bongo LowBongo
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hh PedalHiHat
Drum-Hiconga MuteHighConga
Drum-Kick KickDrum1
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
Drum-Tamb Tambourine
+
+ +

+ + + +
+

BalladIntro

+ 4 bar introduction. (4) +
+ + + + + + + + + + + +
Arpeggio OrchestralHarp
Bass FretlessBass
Chord Atmosphere
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hiconga MuteHighConga
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
+
+ +

+ + + +
+

BalladIntro1

+ Intro without arpeggios and straight chords. (4) +
+ + + + + + + + + + +
Bass FretlessBass
Chord Atmosphere
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hiconga MuteHighConga
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
+
+ +

+ + + +
+

BalladIntro2

+ Add in some sustained strings to BalladIntro1. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Atmosphere
Chord-Sus TremoloStrings
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hiconga MuteHighConga
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
+
+ +

+ + + +
+

BalladEnd

+ A 4 bar ending with a scale played on a harp. The scale goes from 16ths, 8ths, quarters and half notes on bars 1 to 4. (4) +
+ + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Atmosphere
Drum-Bongo LowBongo
Drum-Cabasa Cabasa
Drum-Cym RideCymbal1
Drum-Hh PedalHiHat
Drum-Hiconga MuteHighConga
Drum-Kick KickDrum1
Drum-Loconga LowConga
Drum-Mutetri MuteTriangle
Drum-Opentri OpenTriangle
Drum-Shake Shaker
Drum-Tamb Tambourine
Scale OrchestralHarp
+
+ + diff --git a/mma/docs/html/lib/stdlib/basicrock.html b/mma/docs/html/lib/stdlib/basicrock.html new file mode 100644 index 0000000..a3bd670 --- /dev/null +++ b/mma/docs/html/lib/stdlib/basicrock.html @@ -0,0 +1,114 @@ + + + +

Basicrock

+

Basic Rock beat for things a bit to hard for softrock and ballad beats. I wrote this for "Love Potion No. 9". +

+ +

+ + + +
+

BasicRock

+ A very basic rock beat in 4. (2) +
+ + + + + + + + + +
Bass FingeredBass
Chord-Clean CleanGuitar
Chord-Clean2 CleanGuitar
Chord-Dist DistortonGuitar
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

BasicRockSus

+ Even rockers like strings! (2) +
+ + + + + + + + + + +
Bass FingeredBass
Chord-Clean CleanGuitar
Chord-Clean2 CleanGuitar
Chord-Dist DistortonGuitar
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

BasicRock4

+ Same rock with more of a 4/4 emphasis. Good for alternate sections. (2) +
+ + + + + + + + +
Bass FingeredBass
Chord-Clean CleanGuitar
Chord-Dist DistortonGuitar
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

BasicRock4Sus

+ Our 4/4 version with strings. (2) +
+ + + + + + + + + +
Bass FingeredBass
Chord-Clean CleanGuitar
Chord-Dist DistortonGuitar
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

BasicRockEnd

+ A 2 bar ending. (2) +
+ + + + + + + + + +
Bass FingeredBass
Chord-Clean CleanGuitar
Chord-Dist DistortonGuitar
Drum-Kick KickDrum1
Drum-Kickb SnareDrum1
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ + diff --git a/mma/docs/html/lib/stdlib/beguine.html b/mma/docs/html/lib/stdlib/beguine.html new file mode 100644 index 0000000..a73bb9e --- /dev/null +++ b/mma/docs/html/lib/stdlib/beguine.html @@ -0,0 +1,175 @@ + + + +

Beguine

+

This started life as a copy of the rumba patterns. I've changed the drum sounds from snares to toms, and deleted hits on final 8th beat. I really don't know the difference between a rhumba and a beguine, so help would be welcome! +

+ +

+ + + +
+

Beguine

+ Nice, smooth easy listening. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Walk FretlessBass
+
+ +

+ + + +
+

BeguineSus

+ Adds in a sustained string. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus TremoloStrings
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Walk FretlessBass
+
+ +

+ + + +
+

Beguine1

+ Adds a pizzicato string to standard Beguine. (4) +
+ + + + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord Piano2
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Walk FretlessBass
+
+ +

+ + + +
+

Beguine1Sus

+ This has the pizzicatos strings and a sustained string. (4) +
+ + + + + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord Piano2
Chord-Sus TremoloStrings
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Walk FretlessBass
+
+ +

+ + + +
+

BeguineFill

+ Single bar fill, good for endings. (1) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Drum-Wis ShortHiWhistle
+
+ +

+ + + +
+

BeguineIntro

+ Simple enough 4 bar introduction. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Walk FretlessBass
+
+ +

+ + + +
+

BeguineEnd

+ Ending with string scales. Uses 8ths on 1st bar 4th on 2nd, halves 3rd and a fullish chord on the 4th. Use a CUT if the final chord sounds too long. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum Claves
Drum-Hconga MuteHighConga
Drum-Hh ClosedHiHat
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Toms1 MidTom1
Drum-Toms2 MidTom2
Scale SlowStrings
Walk FretlessBass
+
+ + diff --git a/mma/docs/html/lib/stdlib/bigband.html b/mma/docs/html/lib/stdlib/bigband.html new file mode 100644 index 0000000..f909e35 --- /dev/null +++ b/mma/docs/html/lib/stdlib/bigband.html @@ -0,0 +1,295 @@ + + + +

Bigband

+

For a standard tune which doesn't fit the Swing grooves. +

+ +

+ + + +
+

BigBand

+ Basic big band beat. (4) +
+ + + + + + + + +
Chord Trombone
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBandSus

+ Tremolo strings added to BigBand. (4) +
+ + + + + + + + +
Chord Trombone
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBandPlus

+ Additional piano notes. (4) +
+ + + + + + + + + +
Arpeggio Piano1
Chord Trombone
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBandSusPlus

+ Sustained strings and piano. (4) +
+ + + + + + + + + +
Arpeggio Piano1
Chord Trombone
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBand1

+ Basic big band with 1,3 bass, no walking. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Hits1 MutedTrumpet
Chord-Hits2 SynthVox
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

BigBand1Sus

+ Bigband1 with sustained strings. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Hits1 MutedTrumpet
Chord-Hits2 SynthVox
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

BigBand8

+ BigBand with 8 bar variation. (8) +
+ + + + + + + + + +
Bass AcousticBass
Chord Trombone
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBand8Sus

+ BigBand8 with sustained strings. (8) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Trombone
Chord-Hits1 MutedTrumpet
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BigBandFill

+ Simple fill bar, good in an ending. (1) +
+ + + + + + +
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Walk AcousticBass
+
+ +

+ + + +
+

BigBandIntro

+ 4 bar introduction. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Trombone
Chord-Hits1 Trumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

BigBandEnd

+ Straight ending for BigBand. (2) +
+ + + + + + + +
Bass Piano1
Chord Trombone
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
+
+ +

+ + + +
+

BigBand1End

+ Ending for BigBand1. (2) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Hits1 MutedTrumpet
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
+
+ +

+ + + +
+

BigBand2End

+ Straight, 4 bar ending for BigBand. (4) +
+ + + + + + + + +
Bass Piano1
Chord Trombone
Chord-Hits1 MutedTrumpet
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

BigBand4End

+ A 4 bar ending. Good ending for BigBand8. (4) +
+ + + + + + + + + +
Bass Piano1
Chord Trombone
Chord-Hits1 MutedTrumpet
Chord-Hits2 Piano1
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/bluegrass.html b/mma/docs/html/lib/stdlib/bluegrass.html new file mode 100644 index 0000000..4c9a2fd --- /dev/null +++ b/mma/docs/html/lib/stdlib/bluegrass.html @@ -0,0 +1,128 @@ + + + +

Bluegrass

+

Completely out of my league and knowledge base here! But, what the hell, we might as well give the old banjo a go. +

+ +

+ + + +
+

BlueGrass

+ A simple BlueGrass sound with a banjo and guitar doing the strumming with a doghouse bass and drum holding the beat. (4) +
+ + + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BlueGrassClap

+ Bluegrass with added handclaps. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BlueGrassBottle

+ Adds in a blow-bottle which no blue grass group seems to be without. (4) +
+ + + + + + + + + +
Arpeggio BottleBlow
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BlueGrassBottleClap

+ Bottles and handclaps...where will it stop! (4) +
+ + + + + + + + + +
Arpeggio BottleBlow
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BlueGrassSus

+ Add sustained accordion. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Chord-Sus Accordion
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

BlueGrassEnd

+ One bar ending. (1) +
+ + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Banjo Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/blues.html b/mma/docs/html/lib/stdlib/blues.html new file mode 100644 index 0000000..9e2021a --- /dev/null +++ b/mma/docs/html/lib/stdlib/blues.html @@ -0,0 +1,165 @@ + + + +

Blues

+

If you don't understand the Blues, don't use these grooves ... they will make you way too sad. +

+ +

+ + + +
+

Blues

+ Straight-ahead blues. (4) +
+ + + + + + + +
Bass AcousticBass
Chord Piano1
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

BluesTriple

+ Change the piano chords to triplets. Nice for a transition bar. (4) +
+ + + + + + + +
Bass AcousticBass
Chord Piano1
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

BluesSus

+ Add a sustained harmonica. Annoying. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sus Harmonica
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

BluesTripleSus

+ Sustained 'arp and chord triplets. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sus Harmonica
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

Blues1

+ Add honky-piano. (4) +
+ + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Chord Piano1
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

Blues1Sus

+ The honky-piano meets the mouth-arp. (4) +
+ + + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Chord Piano1
Chord-Sus Harmonica
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

BluesIntro

+ Simple, 4 bar, introduction. (4) +
+ + + + + + + +
Bass AcousticBass
Chord Piano1
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Walk AcousticBass
+
+ +

+ + + +
+

BluesEnd

+ A 4 bar ending. First 2 bars have 4 "hits", the last 2 have 2. (4) +
+ + + + + + +
Bass AcousticBass
Chord Piano1
Drum SnareDrum1
Drum-Clap HandClap
Drum-Hh ClosedHiHat
+
+ + diff --git a/mma/docs/html/lib/stdlib/boggiewoggie.html b/mma/docs/html/lib/stdlib/boggiewoggie.html new file mode 100644 index 0000000..92235fe --- /dev/null +++ b/mma/docs/html/lib/stdlib/boggiewoggie.html @@ -0,0 +1,84 @@ + + + +

Boggiewoggie

+

A standard boogie-woogie blues beat. Great if you like this style; I find it gets old on my ears fairly fast. NOTE: This style uses dominate 7ths in the bass patterns. It'll probably not sound good in songs with Major 7th or Diminished chords. +

+ +

+ + + +
+

BoggieWoggie

+ Basic BG with four-to-the-bar bass line. (4) +
+ + + +
Bass Piano2
Chord Piano2
+
+ +

+ + + +
+

BoggieWoggie1

+ Basic BG with stronger chord line. (2) +
+ + + +
Bass Piano2
Chord Piano2
+
+ +

+ + + +
+

BoggieWoggie2

+ BG with 8/16s bass line. (4) +
+ + + +
Bass Piano2
Chord Piano2
+
+ +

+ + + +
+

BoggieWoggie3

+ BG with 8/16s bass line and strong chords. (2) +
+ + + +
Bass Piano2
Chord Piano2
+
+ +

+ + + +
+

BoggieWoggieEnd

+ Same bass line but bar 1 has chords on 1/3 and bar 2 has 1/2/3. Use a ``z!'' to turn off the bass on the last beat(s). (2) +
+ + + +
Bass Piano2
Chord Piano2
+
+ + diff --git a/mma/docs/html/lib/stdlib/bolero.html b/mma/docs/html/lib/stdlib/bolero.html new file mode 100644 index 0000000..cc7cdee --- /dev/null +++ b/mma/docs/html/lib/stdlib/bolero.html @@ -0,0 +1,258 @@ + + + +

Bolero

+

A try at a Bolero. Written for "Tonight". +

+ +

+ + + +
+

Bolero

+ Latin-style Bolero rhythm. (4) +
+ + + + + + + + + +
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
+
+ +

+ + + +
+

BoleroFill

+ Add arpeggiating flute. (4) +
+ + + + + + + + + + +
Arpeggio Flute
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
+
+ +

+ + + +
+

BoleroSus

+ Bolero with sustained strings. (4) +
+ + + + + + + + + + +
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Chord-Sus Strings
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
+
+ +

+ + + +
+

BoleroSusFill

+ Sustained Bolero with flute fill. (4) +
+ + + + + + + + + + + +
Arpeggio Flute
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Chord-Sus Strings
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
+
+ +

+ + + +
+

BoleroIntro

+ 4 bar intro. (4) +
+ + + + + + + + + +
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
+
+ +

+ + + +
+

BoleroEnd

+ Ending with string scales. Uses 8ths on 1st bar 4th on 2nd, halves 3rd and a whole note on 4th. (4) +
+ + + + + + + + + + +
Bass FingeredBass
Bass-Guitar NylonGuitar
Chord SteelGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Kick KickDrum1
Drum-Lbongo LowBongo
Drum-Maraca Maracas
Scale Strings
+
+ +

+ + + +
+

Bolero1

+ Spanish-style Bolero rhythm. (4) +
+ + + + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Bolero1Fill

+ Add guitar arpeggios to Bolero1. (4) +
+ + + + + + + + +
Arpeggio NylonGuitar
Bass FingeredBass
Chord NylonGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Bolero1Sus

+ Spanish Bolero with sustained strings. (4) +
+ + + + + + + + +
Bass FingeredBass
Chord NylonGuitar
Chord-Sus Strings
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Bolero1SusFill

+ Sustained Bolero1 with guitar fill. (4) +
+ + + + + + + + + +
Arpeggio NylonGuitar
Bass FingeredBass
Chord NylonGuitar
Chord-Sus Strings
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Bolero1Intro

+ 4 bar intro. (4) +
+ + + + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Bolero1End

+ Single bar ending for Bolero1. (1) +
+ + + + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Claves Claves
Drum-Hbongo HighBongo
Drum-Lbongo LowBongo
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/bossanova.html b/mma/docs/html/lib/stdlib/bossanova.html new file mode 100644 index 0000000..6011cb8 --- /dev/null +++ b/mma/docs/html/lib/stdlib/bossanova.html @@ -0,0 +1,232 @@ + + + +

Bossanova

+

This is a great latin rhythm for pieces like "Girl From Ipanema". There's a real tendency for me to get these latin rhythms way too complicated, so if you want to take some stuff out, feel free to do so. +

+ +

+ + + +
+

BossaNova

+ Standard bossanova beat. (4) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ +

+ + + +
+

BossaNovaSus

+ Adds sustained choir voices. (8) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ +

+ + + +
+

BossaNova1Sus

+ Adds sustained strings. (4) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Chord-Sus Strings
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ +

+ + + +
+

BossaNovaFill

+ Adds a bell to the BossaNova groove and forces the chord to a straight pattern. This Good for the occasional bar in an ending, etc. (4) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Sidekick SideKick
Drum-Snare SnareDrum1
Drum-Snare1 SnareDrum2
Drum-Triangle OpenTriangle
+
+ +

+ + + +
+

BossaNovaIntro

+ Dull introduction. (4) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ +

+ + + +
+

BossaNovaIntro8

+ Another dull intro, but this is for 8 bars. (8) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ +

+ + + +
+

BossaNovaEnd

+ The strings do a scale. First bar is eights, second is quarters, third is halves, and the last is a held whole note. (4) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
Scale Strings
+
+ +

+ + + +
+

BossaNova1End

+ Same ending, but with sustained strings added. (4) +
+ + + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
Scale Strings
+
+ +

+ + + +
+

BossaNova2End

+ Ending with sustained strings, but no scale. (4) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum Cabasa
Drum-Chh ClosedHiHat
Drum-Clave Claves
Drum-Kick KickDrum2
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Drum-Muteconga MuteHighConga
Drum-Openhiconga OpenHighConga
Drum-Sidekick SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/broadway.html b/mma/docs/html/lib/stdlib/broadway.html new file mode 100644 index 0000000..86581f2 --- /dev/null +++ b/mma/docs/html/lib/stdlib/broadway.html @@ -0,0 +1,139 @@ + + + +

Broadway

+

A real ripoff of the Casio rhythm. Note that this is really a 2/4 pattern, so you'll probably want to double the tempo. I'm using this in "Everything's Coming Up Roses" at a tempo of 280. +

+ +

+ + + +
+

Broadway

+ A very corny Broadway tune rhythm. (8) +
+ + + + + + + + + +
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

Broadway1

+ Add in arpegiating flute. (8) +
+ + + + + + + + + + +
Arpeggio Piccolo
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

BroadwaySus

+ Add sustained strings. (8) +
+ + + + + + + + + + +
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Chord-Sus Strings
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

Broadway1Sus

+ Sustained strings and apregiating flute. (8) +
+ + + + + + + + + + + +
Arpeggio Piccolo
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Chord-Sus Strings
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

BroadwayIntro

+ Simple 4 bar intro. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

BroadWayEnd

+ A 2 bar ending reminiscent of a cha-cha. (2) +
+ + + + + + + + + +
Bass AcousticBass
Chord-Gloc Glockenspiel
Chord-Piz PizzicatoString
Drum-Hih1 ClosedHiHat
Drum-Hih2 ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ + diff --git a/mma/docs/html/lib/stdlib/calypso.html b/mma/docs/html/lib/stdlib/calypso.html new file mode 100644 index 0000000..f5bc691 --- /dev/null +++ b/mma/docs/html/lib/stdlib/calypso.html @@ -0,0 +1,101 @@ + + + +

Calypso

+

Again, I'm no expert! I did this one to play with the Sonny Rollins song "St. Thomas". +

+ +

+ + + +
+

Calypso

+ A nice, simple Calypos beat with lots of tom-drums. (4) +
+ + + + + + +
Chord JazzGuitar
Drum-Cym CrashCymbal1
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Walk AcousticBass
+
+ +

+ + + +
+

CalypsoSus

+ A synth voice sustained under the beat. (4) +
+ + + + + + + +
Chord JazzGuitar
Chord-Sus SynthVox
Drum-Cym CrashCymbal1
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Walk AcousticBass
+
+ +

+ + + +
+

Calypso1

+ Walking Bass changed to 4-in-a-bar. (4) +
+ + + + + + +
Chord JazzGuitar
Drum-Cym CrashCymbal1
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Walk AcousticBass
+
+ +

+ + + +
+

Calypso1Sus

+ 4-in-a-bar bass with sustained, artifical voices. (4) +
+ + + + + + + +
Chord JazzGuitar
Chord-Sus SynthVox
Drum-Cym CrashCymbal1
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Walk AcousticBass
+
+ +

+ + + +
+

CalypsoEnd

+ A very simple, finalized ending. All the same instruments as Calypso, but all are on beats 1,2,3 and 4. (1) +
+ + + + + + +
Chord JazzGuitar
Drum-Cym CrashCymbal1
Drum-Lowbongo LowBongo
Drum-Lowconga LowConga
Walk AcousticBass
+
+ + diff --git a/mma/docs/html/lib/stdlib/chacha.html b/mma/docs/html/lib/stdlib/chacha.html new file mode 100644 index 0000000..1b256d1 --- /dev/null +++ b/mma/docs/html/lib/stdlib/chacha.html @@ -0,0 +1,157 @@ + + + +

Chacha

+

A popular, albeit somewhat dated and make trite by Americanized versions, The Cha-Cha-Cha remains a popular rhythm with broad audience appeal. I've used ``Rico Vacilon'' as a demo. This file was mostly developed from the patterns in``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. +

+ +

+ + + +
+

ChaCha

+ Our basic, non-American, pattern. (2) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ChaCha1

+ Adds in flute arpeggios. (2) +
+ + + + + + + + + + + + + +
Arpeggio Flute
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ChaChaSus

+ Adds sustained string arpeggios. (2) +
+ + + + + + + + + + + + + +
Arpeggio-Sus Bandoneon
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ChaCha1Sus

+ Combines the flute and string arpeggios. (2) +
+ + + + + + + + + + + + + + +
Arpeggio Flute
Arpeggio-Sus Bandoneon
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ChaChaIntro

+ A plain 4 bar introduction. (4) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ChaChaEnd

+ The End. (2) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano1
Drum-Clave Claves
Drum-Hconga MuteHighConga
Drum-Hh RideCymbal1
Drum-Htom HighTom2
Drum-Lconga LowConga
Drum-Lguiro LongGuiro
Drum-Mtom MidTom2
Drum-Sguiro ShortGuiro
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/countryblues.html b/mma/docs/html/lib/stdlib/countryblues.html new file mode 100644 index 0000000..67858fe --- /dev/null +++ b/mma/docs/html/lib/stdlib/countryblues.html @@ -0,0 +1,269 @@ + + + +

Countryblues

+

I use this on some country tunes like "I Fall To Pieces". +

+ +

+ + + +
+

CountryBlues

+ Somewhat lamentive blues. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesSus

+ Adds sustained strings. (4) +
+ + + + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Chord-Sus SlowStrings
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesWalk

+ Walking bass version. (4) +
+ + + + + + + +
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesWalkSus

+ Walking bass and sustained strings. (4) +
+ + + + + + + + +
Chord Piano3
Chord-1 Piano3
Chord-Sus SlowStrings
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1

+ Add piano triplets every 4 bars. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1Sus

+ Sustained version. (4) +
+ + + + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Chord-Sus SlowStrings
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1Walk

+ Triplet version with walking bass. (4) +
+ + + + + + + +
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1WalkSus

+ Triplet version with walking bass and strings. (4) +
+ + + + + + + + +
Chord Piano3
Chord-1 Piano3
Chord-Sus SlowStrings
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesFill

+ Adds a bad fiddler (use sparingly!). (4) +
+ + + + + + + + + +
Arpeggio Violin
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesWalkFill

+ Walking bass with fiddler. (4) +
+ + + + + + + + +
Arpeggio Violin
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1Fill

+ Piano triplets and fiddle. (4) +
+ + + + + + + + + +
Arpeggio Violin
Bass FretlessBass
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBlues1WalkFill

+ Piano triplets, walking bass and fiddle. (4) +
+ + + + + + + + +
Arpeggio Violin
Chord Piano3
Chord-1 Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

CountryBluesEnd

+ Simple ending. (4) +
+ + + + + + +
Bass FretlessBass
Chord Piano3
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/countryswing.html b/mma/docs/html/lib/stdlib/countryswing.html new file mode 100644 index 0000000..fef5ee6 --- /dev/null +++ b/mma/docs/html/lib/stdlib/countryswing.html @@ -0,0 +1,158 @@ + + + +

Countryswing

+

Quite simple rhythm. I'm not big on country, but this does seem to fit with "Singing The Blues". +

+ +

+ + + +
+

CountrySwing

+ Marty Robbins might like this. (4) +
+ + + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwingSus

+ Adds a sustained fiddle to the hoedown. (4) +
+ + + + + + + +
Bass FingeredBass
Chord NylonGuitar
Chord-Sus Fiddle
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwing1

+ Adds an annoying fiddle. (4) +
+ + + + + + + +
Arpeggio Violin
Bass FingeredBass
Chord NylonGuitar
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwing1Sus

+ Now we have 2 fiddlers, one off in wonderland and a second playing long notes. (4) +
+ + + + + + + + +
Arpeggio Violin
Bass FingeredBass
Chord NylonGuitar
Chord-Sus Fiddle
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwing2

+ Same fiddle, but a more sane pattern. (4) +
+ + + + + + + +
Arpeggio Violin
Bass FingeredBass
Chord NylonGuitar
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwing2Sus

+ A sustained and a random fiddler. Great dance! (4) +
+ + + + + + + + +
Arpeggio Violin
Bass FingeredBass
Chord NylonGuitar
Chord-Sus Fiddle
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

CountrySwingIntro

+ Simple 4 bar introduction. (4) +
+ + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

CountrySwingEnd

+ Simple ending. Hits on each beat on bar 1, beats 1 and 3 on bar 2. (2) +
+ + + + + +
Bass FingeredBass
Chord NylonGuitar
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/countrywaltz.html b/mma/docs/html/lib/stdlib/countrywaltz.html new file mode 100644 index 0000000..8d80761 --- /dev/null +++ b/mma/docs/html/lib/stdlib/countrywaltz.html @@ -0,0 +1,257 @@ + + + +

Countrywaltz

+

These waltzes are good for "old-time" things like "Que Sera Sera" and "Tammy". +

+ +

+ + + +
+

CountryWaltz

+ Doris Day would like this! A string bass on beat 1 with a strummed guitar on 2 and 3, and a light-feeling drum. (4) +
+ + + + + + +
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltzSus

+ The CountryWaltz with a sustained string. (4) +
+ + + + + + + +
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltz1

+ Same old waltz with an arpeggiating flute. Nice. (4) +
+ + + + + + + +
Arpeggio Flute
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltz1Sus

+ Arpeggiating flute and sustained strings. (4) +
+ + + + + + + + +
Arpeggio Flute
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltz2

+ Guitar arpeggios. (4) +
+ + + + + + + +
Arpeggio NylonGuitar
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltz2Sus

+ Guitar arpeggios and sustained strings. (4) +
+ + + + + + + + +
Arpeggio NylonGuitar
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

CountryWaltzWalk

+ Countrywaltz with walking bass. (4) +
+ + + + + + +
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

CountryWaltzWalkSus

+ CountryWaltz with sustained string and walking bass. (4) +
+ + + + + + + +
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

CountryWaltz1Walk

+ Walking bass and arpeggiating flute. (4) +
+ + + + + + + +
Arpeggio Flute
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

Countrywaltz2Walk

+ Walking bass and apreggiating guitar. (4) +
+ + + + + + + +
Arpeggio NylonGuitar
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

CountryWaltz1SusWalk

+ Arpeggiating flute, sustained string and walking bass (4) +
+ + + + + + + + +
Arpeggio Flute
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

CountryWaltz2SusWalk

+ Apregginating guitar, sustained string and walking bass. (4) +
+ + + + + + + + +
Arpeggio NylonGuitar
Bass-Chord NylonGuitar
Chord NylonGuitar
Chord-Sus TremoloStrings
Drum ClosedHiHat
Drum-Kick KickDrum1
Walk AcousticBass
+
+ +

+ + + +
+

CountryWaltzEnd

+ A good ending with a cymbal roll. The 4th bar just hits on the first beat. (4) +
+ + + + + + +
Bass AcousticBass
Bass-Chord NylonGuitar
Chord NylonGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/desert.html b/mma/docs/html/lib/stdlib/desert.html new file mode 100644 index 0000000..f2228c3 --- /dev/null +++ b/mma/docs/html/lib/stdlib/desert.html @@ -0,0 +1,86 @@ + + + +

Desert

+

This is somewhat ``mysterious'' and mildly ``Eastern'' sounding. Written for the Duke Ellington hit ``Caravan''. +

+ +

+ + + +
+

Desert

+ Pretty funky beat for the desert. (4) +
+ + + + + + + +
Bass AcousticBass
Chord Piano2
Chord-String Sitar
Drum LowTom2
Drum-T OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

DesertSus

+ Add sustained strings. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano2
Chord-String Sitar
Chord-Sus TremoloStrings
Drum LowTom2
Drum-T OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

DesertFill

+ A bit of a drum torrent over the basic beat. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano2
Chord-String Sitar
Drum LowTom2
Drum-Fill LowTom2
Drum-T OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

DesertEnd

+ Desert Ending. (4) +
+ + + + + + +
Bass AcousticBass
Chord Piano2
Chord-String Sitar
Drum LowTom2
Drum-T OpenTriangle
+
+ + diff --git a/mma/docs/html/lib/stdlib/dixie.html b/mma/docs/html/lib/stdlib/dixie.html new file mode 100644 index 0000000..42a4416 --- /dev/null +++ b/mma/docs/html/lib/stdlib/dixie.html @@ -0,0 +1,130 @@ + + + +

Dixie

+

These Dixieland grooves are great for songs like "Bill Bailey". The Time is set to 4, so if you have a 2/4 piece double the tempo. This rhythm works best with tempos around 200. This might be a bit busy, if so you're free to make changes! +

+ +

+ + + +
+

Dixie

+ Complete with arpeggiating banjo. (4) +
+ + + + + + + + +
Arpeggio Banjo
Bass Tuba
Chord Honky-TonkPiano
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Dixie1

+ Bass/walk variation. (4) +
+ + + + + + + + +
Arpeggio Banjo
Bass Tuba
Chord Honky-TonkPiano
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Dixie2

+ The arpeggio has been slowed down and a stumming banjo has been added. Use this for repeat endings, etc. (4) +
+ + + + + + + + + +
Arpeggio Banjo
Bass Tuba
Chord Honky-TonkPiano
Chord-Banjo Banjo
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Dixie3

+ A more gentle attempt. (4) +
+ + + + + + + + + +
Arpeggio Banjo
Bass Tuba
Chord Honky-TonkPiano
Chord-Guitar JazzGuitar
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieStrum

+ Strumming banjo and piano. No apreggiating. (4) +
+ + + + + + + + +
Bass Tuba
Chord Honky-TonkPiano
Chord-Banjo Banjo
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieEnd

+ Straight ending. (4) +
+ + + + + + + +
Arpeggio Banjo
Bass Tuba
Chord Honky-TonkPiano
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/dixiemarch.html b/mma/docs/html/lib/stdlib/dixiemarch.html new file mode 100644 index 0000000..03117a1 --- /dev/null +++ b/mma/docs/html/lib/stdlib/dixiemarch.html @@ -0,0 +1,121 @@ + + + +

Dixiemarch

+

A Dixieland March done for "Muskrat Ramble". Uses traditional instrumentation ... a single snare drum, tuba and banjo. +

+ +

+ + + +
+

DixieMarch

+ A basic Dixieland March. (4) +
+ + + + + + +
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieMarchPlus

+ Add in a wild clarinet. (4) +
+ + + + + + + +
Arpeggio Clarinet
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieMarchSus

+ A little change with the arpeggios gone. (4) +
+ + + + + + + +
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Chord-Sus Clarinet
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieMarchSusPlus

+ Apreggios and sustain. (4) +
+ + + + + + + + +
Arpeggio Clarinet
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Chord-Sus Clarinet
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieMarchIntro

+ A 4 bar introduction. (4) +
+ + + + + + +
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

DixieMarchEnd

+ Finis! (2) +
+ + + + + + +
Bass Tuba
Chord Piano1
Chord-Banjo Banjo
Drum-Snare SnareDrum1
Walk Tuba
+
+ + diff --git a/mma/docs/html/lib/stdlib/easyswing.html b/mma/docs/html/lib/stdlib/easyswing.html new file mode 100644 index 0000000..67133c2 --- /dev/null +++ b/mma/docs/html/lib/stdlib/easyswing.html @@ -0,0 +1,427 @@ + + + +

Easyswing

+

Soft guitar strumming. Great of tunes like "Beyond The Sea" and "Summertime". +

+ +

+ + + +
+

EasySwing

+ Nice/simple jazz guitar in 4. (4) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingSus

+ Adds a sustained strings (2 part) to EasySwing. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingFill

+ Adds guitar apreggio. Quarters on bar 1,2,3 and eights on bar 4. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingWalk

+ The EasySwing Groove with a full walking bass line. The bass volume has been increased as well. (4) +
+ + + + + +
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingWalkSus

+ The EasySwing with a walking bass line and a sustained string. (4) +
+ + + + + + +
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingWalkFill

+ Walking bass fill. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing1

+ One strum per bar. Okay if the tempo is quite fast, or as an introduction. (4) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing1Sus

+ Adds sustained strings to EasySwing1. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing1Fill

+ Add apreggios to single chord swing. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing2

+ Same EasySwing, but with 2 strums per bar. (4) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing2Sus

+ Adds ChoirAahs to EasySwing2. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing2Fill

+ Add apreggios to two chord swing. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42

+ For faster rhythms, a bar of 4 followed by a bar of 2. (4) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42Sus

+ Add sustained strings to the 4-2 pattern. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42Fill

+ Add arpeggios to 4-2 pattern. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42Walk

+ A 4-2 pattern with a walking bass. (4) +
+ + + + + +
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42WalkSus

+ The 4-2 pattern with walking bass and sustained strings. (4) +
+ + + + + + +
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwing42WalkFill

+ Add arpeggios and walking bass with 4-2 pattern. (4) +
+ + + + + + +
Arpeggio JazzGuitar
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ +

+ + + +
+

EasySwingIntro

+ 4 bar intro (4) +
+ + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
+
+ +

+ + + +
+

EasySwingIntro1

+ 4 bar intro with 1 long chord per bar. (4) +
+ + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
+
+ +

+ + + +
+

EasySwingIntro2

+ 4 bar intro with cymbals and 2 strum chords. (4) +
+ + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh RideCymbal1
Drum-Phh PedalHiHat
+
+ +

+ + + +
+

EasySwingIntro3

+ 4 bar intro with triplet bass pattern. (4) +
+ + + + + + +
Arpeggio AcousticBass
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
+
+ +

+ + + +
+

EasySwingEnd

+ Simple ending. (2) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Hh OpenHiHat
Drum-Phh PedalHiHat
Walk AcousticBass
+
+ + diff --git a/mma/docs/html/lib/stdlib/fastblues.html b/mma/docs/html/lib/stdlib/fastblues.html new file mode 100644 index 0000000..71f38c0 --- /dev/null +++ b/mma/docs/html/lib/stdlib/fastblues.html @@ -0,0 +1,160 @@ + + + +

Fastblues

+

I use this in "Mad About Him...Blues". +

+ +

+ + + +
+

FastBlues

+ Fast blues with a bit of R&B. (4) +
+ + + + + + + + + +
Bass FingeredBass
Chord-Guitar CleanGuitar
Chord-Piano Piano2
Chord-Sax TenorSax
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
+
+ +

+ + + +
+

FastBluesSus

+ Adds sustained strings to FastBlues (4) +
+ + + + + + + + + + +
Bass FingeredBass
Chord-Guitar CleanGuitar
Chord-Piano Piano2
Chord-Sax TenorSax
Chord-Sus Strings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
+
+ +

+ + + +
+

FastBluesWalk

+ Change bass line from 1/5 to walking. (4) +
+ + + + + + + + + +
Chord-Guitar CleanGuitar
Chord-Piano Piano2
Chord-Sax TenorSax
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

FastBluesWalkSus

+ Walking bass version with sustained strings. (4) +
+ + + + + + + + + + +
Chord-Guitar CleanGuitar
Chord-Piano Piano2
Chord-Sax TenorSax
Chord-Sus Strings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

FastBlues1

+ A more rowdy version, with alternating bars of a distorted guitar riff. (4) +
+ + + + + + + + + + +
Arpeggio DistortonGuitar
Bass CleanGuitar
Chord-Guitar DistortonGuitar
Chord-Piano Piano3
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

FastBlues1Sus

+ Who invited the violin guys to the blues party? (4) +
+ + + + + + + + + + + +
Arpeggio DistortonGuitar
Bass CleanGuitar
Chord-Guitar DistortonGuitar
Chord-Piano Piano3
Chord-Sus Strings
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
Walk FingeredBass
+
+ +

+ + + +
+

FastBluesEnd

+ Simple ending. (4) +
+ + + + + + + + +
Bass FingeredBass
Chord-Guitar CleanGuitar
Chord-Piano Piano2
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Snare2 SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/folk.html b/mma/docs/html/lib/stdlib/folk.html new file mode 100644 index 0000000..522dc2a --- /dev/null +++ b/mma/docs/html/lib/stdlib/folk.html @@ -0,0 +1,91 @@ + + + +

Folk

+

Generally folk music doesn't have complicated rhythms. You can use other libaries like "EasySwing", but if you are into finger picking guitar, give this a try. +

+ +

+ + + +
+

Folk

+ A very simple pattern to set against old songs. Uses a random Tambourine to liven things up a bit. Wear something tie-dyed when you use this. (8) +
+ + + + +
Bass AcousticBass
Chord NylonGuitar
Drum-Tamb Tambourine
+
+ +

+ + + +
+

FolkWalk

+ Plain folk rhythm with walking bass. (8) +
+ + + + +
Chord NylonGuitar
Drum-Tamb Tambourine
Walk AcousticBass
+
+ +

+ + + +
+

FolkArticulated

+ Fingered picked guitar and a bit of bass. (8) +
+ + + + + + +
Arpeggio NylonGuitar
Bass AcousticBass
Chord NylonGuitar
Drum-Tamb Tambourine
Walk AcousticBass
+
+ +

+ + + +
+

FolkIntro

+ Pretty boring 4 bar intro. (4) +
+ + + + +
Bass AcousticBass
Chord NylonGuitar
Drum-Tamb Tambourine
+
+ +

+ + + +
+

FolkEnd

+ Easy, 2 bar ending. First bar has 4 strums, second bar has 2 strums. (2) +
+ + + + +
Bass AcousticBass
Chord NylonGuitar
Drum-Tamb Tambourine
+
+ + diff --git a/mma/docs/html/lib/stdlib/foxtrot.html b/mma/docs/html/lib/stdlib/foxtrot.html new file mode 100644 index 0000000..865b122 --- /dev/null +++ b/mma/docs/html/lib/stdlib/foxtrot.html @@ -0,0 +1,227 @@ + + + +

Foxtrot

+

Just about any old-fashioned dance piece can be set to a foxtrot. +

+ +

+ + + +
+

Foxtrot

+ Basic Foxtrot. (4) +
+ + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

FoxtrotSus

+ Adds sustained strings to Foxtrot. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Chord-Sus TremoloStrings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

FoxTrotPlus

+ A jazzy piano addition to the basic beat. (4) +
+ + + + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

FoxTrotSusPlus

+ Sustained strings and piano 8ths. (4) +
+ + + + + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Chord-Sus TremoloStrings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

Foxtrot1

+ FoxTrot with sax section and walking bass. (4) +
+ + + + + + + + + + + +
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Chord-Sax TenorSax
Drum-Crash CrashCymbal1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk FretlessBass
+
+ +

+ + + +
+

FoxTrot1Sus

+ TremoloStrings added to FoxTrot1. (4) +
+ + + + + + + + + + + + +
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Chord-Sax TenorSax
Chord-Sus TremoloStrings
Drum-Crash CrashCymbal1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk FretlessBass
+
+ +

+ + + +
+

FoxTrotIntro

+ Walking bass intro. (4) +
+ + + + + + + + + +
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

FoxtrotFill

+ A 2 bar fill with a rather heavy walking bass. (2) +
+ + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord NylonGuitar
Chord-Piano Piano1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

FoxTrotEnd

+ Simple ending, 4 beats on first bar and 2 on second. (2) +
+ + + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Piano Piano1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
+
+ +

+ + + +
+

FoxTrot1End

+ Ending based on Foxtrot1. (2) +
+ + + + + + + + + + +
Bass AcousticBass
Chord NylonGuitar
Chord-Piano Piano1
Chord-Sax TenorSax
Drum-Crash CrashCymbal1
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/frenchwaltz.html b/mma/docs/html/lib/stdlib/frenchwaltz.html new file mode 100644 index 0000000..3769a40 --- /dev/null +++ b/mma/docs/html/lib/stdlib/frenchwaltz.html @@ -0,0 +1,119 @@ + + + +

Frenchwaltz

+

These try to do the "French Cafe" sound. +

+ +

+ + + +
+

FrenchWaltz

+ Accordion umm-paa. Ya either love it or hate it! (8) +
+ + + + + + +
Bass Accordion
Chord Accordion
Chord-Guitar NylonGuitar
Drum-Tam Tambourine
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

FrenchWaltzSus

+ Add sustained strings to basic pattern. (8) +
+ + + + + + + +
Bass Accordion
Chord Accordion
Chord-Guitar NylonGuitar
Chord-Sus Strings
Drum-Tam Tambourine
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

FrenchWaltz1

+ FrenchWaltz with with accordion apreggios. (8) +
+ + + + + + +
Arpeggio Accordion
Bass Accordion
Chord Accordion
Drum-Tam Tambourine
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

FrenchWaltz1Sus

+ Arpeggios and sustained strings. (8) +
+ + + + + + + +
Arpeggio Accordion
Bass Accordion
Chord Accordion
Chord-Sus Strings
Drum-Tam Tambourine
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

FrenchWaltzEnd

+ A scale with the strings to end the FrenchWaltz. The scales run from 16, 8, 4 and whole notes. (4) +
+ + + + + + +
Bass Accordion
Chord Accordion
Drum-Tam Tambourine
Drum-Tri OpenTriangle
Scale Strings
+
+ +

+ + + +
+

FrenchWaltz1End

+ Same ending as FrenchWaltzEnd but with an accordion instead of strings. (4) +
+ + + + + + +
Bass Accordion
Chord Accordion
Drum-Tam Tambourine
Drum-Tri OpenTriangle
Scale Accordion
+
+ + diff --git a/mma/docs/html/lib/stdlib/guitarballad.html b/mma/docs/html/lib/stdlib/guitarballad.html new file mode 100644 index 0000000..3cc092f --- /dev/null +++ b/mma/docs/html/lib/stdlib/guitarballad.html @@ -0,0 +1,127 @@ + + + +

Guitarballad

+

Guitar based ballad with a bit of a rock feel. Written for Beatles classic "Yesterday". This is a conversion of the pianoballad groove. +

+ +

+ + + +
+

GuitarBallad

+ Simple ballad with drums and guitar. (4) +
+ + + + + + + +
Arpeggio-4 NylonGuitar
Arpeggio-8 CleanGuitar
Bass FingeredBass
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

GuitarBallad1

+ Add additional guitar chords. (4) +
+ + + + + + + + +
Arpeggio-4 NylonGuitar
Arpeggio-8 CleanGuitar
Bass FingeredBass
Chord JazzGuitar
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

GuitarBalladSus

+ Guitar arpeggios with a bit of strings. (4) +
+ + + + + + + + +
Arpeggio-4 NylonGuitar
Arpeggio-8 CleanGuitar
Bass FingeredBass
Chord-Sus SynthStrings1
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

GuitarBallad1Sus

+ Guitar arpeggios with chords and strings. (4) +
+ + + + + + + + + +
Arpeggio-4 NylonGuitar
Arpeggio-8 CleanGuitar
Bass FingeredBass
Chord JazzGuitar
Chord-Sus SynthStrings1
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

GuitarBalladIntro

+ A 4 bar introduction. (4) +
+ + + + + + + +
Arpeggio-4 NylonGuitar
Arpeggio-8 CleanGuitar
Bass FingeredBass
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

GuitarBalladEnd

+ A 2 bar ending. (2) +
+ + + + + + + +
Arpeggio-4 NylonGuitar
Bass FingeredBass
Chord Piano1
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/hillcountry.html b/mma/docs/html/lib/stdlib/hillcountry.html new file mode 100644 index 0000000..475dc92 --- /dev/null +++ b/mma/docs/html/lib/stdlib/hillcountry.html @@ -0,0 +1,132 @@ + + + +

Hillcountry

+

A HillBilly country beat. Seems to work with ''Flowers on the Wall.'' +

+ +

+ + + +
+

HillCountry

+ Our basic hillbilly beat. Pretty boring. (4) +
+ + + + + +
Bass FingeredBass
Chord Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountryPlus

+ Adds in another banjo. (4) +
+ + + + + + +
Arpeggio Banjo
Bass FingeredBass
Chord Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountrySus

+ Why not strings in the hills? (4) +
+ + + + + + +
Bass FingeredBass
Chord Banjo
Chord-Sus Strings
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountrySusPlus

+ Strings and banjos! (4) +
+ + + + + + + +
Arpeggio Banjo
Bass FingeredBass
Chord Banjo
Chord-Sus Strings
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountryFill

+ Single bar fill with walking bass, good for repeats. (4) +
+ + + + + +
Bass FingeredBass
Chord Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountryIntro

+ A basic 4 bar intro. (4) +
+ + + + + +
Bass FingeredBass
Chord Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

HillCountryEnd

+ An abrupt 2 bar ending. (2) +
+ + + + + +
Bass FingeredBass
Chord Banjo
Drum-Hh OpenHiHat
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/jazz-54.html b/mma/docs/html/lib/stdlib/jazz-54.html new file mode 100644 index 0000000..9fc1b1e --- /dev/null +++ b/mma/docs/html/lib/stdlib/jazz-54.html @@ -0,0 +1,61 @@ + + + +

Jazz-54

+

A 5/4 jazz beat, written for "Take Five". +

+ +

+ + + +
+

Jazz54

+ Basic 5/4 jazz rhythm. (4) +
+ + + + + + +
Bass AcousticBass
Chord Piano1
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tom LowTom1
+
+ +

+ + + +
+

Jazz54Walk

+ This replaces the straight bass pattern with a five-to-the-bar walking bass. (4) +
+ + + + + + +
Chord Piano1
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tom LowTom1
Walk AcousticBass
+
+ +

+ + + +
+

Jazz54Intro

+ Single bar intro for 5/4 jazz. Can be used as ending? (1) +
+ + + + +
Drum-Hh OpenHiHat
Drum-Snare SnareDrum1
Drum-Tom LowTom1
+
+ + diff --git a/mma/docs/html/lib/stdlib/jazzwaltz.html b/mma/docs/html/lib/stdlib/jazzwaltz.html new file mode 100644 index 0000000..e6a9c21 --- /dev/null +++ b/mma/docs/html/lib/stdlib/jazzwaltz.html @@ -0,0 +1,191 @@ + + + +

Jazzwaltz

+

3/4 time for jazz pieces like "Bluesette". +

+ +

+ + + +
+

JazzWaltz

+ Basic jazz waltz. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltzSus

+ Strings added to our waltz. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltz1

+ Add arpeggio runs. (4) +
+ + + + + + + + + +
Arpeggio Celesta
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltz1Sus

+ Sustained strings and arpeggios. (4) +
+ + + + + + + + + + +
Arpeggio Celesta
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltzIntro

+ 4 bar intro. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltzIntro8

+ 8 bar intro. (8) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

JazzWaltzFill

+ Single bar fill, can be used in endings. (1) +
+ + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JazzWaltzEnd

+ Simple ending. (2) +
+ + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JazzWaltz1End

+ Ending with arpeggio eights and quarters. (2) +
+ + + + + + + + +
Arpeggio Celesta
Bass AcousticBass
Chord Piano1
Chord-Guitar JazzGuitar
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/jive.html b/mma/docs/html/lib/stdlib/jive.html new file mode 100644 index 0000000..d9504bb --- /dev/null +++ b/mma/docs/html/lib/stdlib/jive.html @@ -0,0 +1,290 @@ + + + +

Jive

+

Thinking of a sock-hop? I wrote this for "Bye Bye Love". +

+ +

+ + + +
+

Jive

+ A simple jive-dance beat. (4) +
+ + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveClap

+ Adds a handclap to the Jive beat, mostly on 2 and 4. (4) +
+ + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveSus

+ Harmonic strings added. (4) +
+ + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveClapSus

+ Sustained strings with handclaps. (4) +
+ + + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JivePlus

+ Add some additional apreggios. (4) +
+ + + + + + + + +
Arpeggio TenorSax
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveSusPlus

+ Apreggios plus strings. (4) +
+ + + + + + + + + +
Arpeggio TenorSax
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1

+ Our jive-dance with less shuffle. (4) +
+ + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1Clap

+ Handclap added to Jive1 beat. (4) +
+ + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1Sus

+ Harmonic strings added. (4) +
+ + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1ClapSus

+ Sustained strings with handclaps. (4) +
+ + + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Clap HandClap
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1Plus

+ The un-push version with arpeggios. (4) +
+ + + + + + + + +
Arpeggio TenorSax
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Jive1SusPlus

+ No push with strings and arpeggios. (4) +
+ + + + + + + + + +
Arpeggio TenorSax
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Chord-Sus Strings
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveIntro

+ 4 bar intro. (4) +
+ + + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Clap SnareDrum1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

JiveEnd

+ This 2 bar ending has 4 beats/hits on the first bar and hits on 1 and 3 on the second. (2) +
+ + + + + + + +
Bass AcousticBass
Bass-Sax AltoSax
Chord Piano2
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/lfusion.html b/mma/docs/html/lib/stdlib/lfusion.html new file mode 100644 index 0000000..7bc3c2c --- /dev/null +++ b/mma/docs/html/lib/stdlib/lfusion.html @@ -0,0 +1,176 @@ + + + +

Lfusion

+

Latin Fusion ... whatever that might mean to you. I figure it's a combination of swing, jazz and latin. I created this for the Hank Williams tune "Jambalaya" which I've heard done in too many genres to list here. +

+ +

+ + + +
+

LFusion

+ Basic Latin Fusion. (4) +
+ + + + + + + + + + + + + + + + + + +
Arpeggio Atmosphere
Bass FretlessBass
Chord Piano2
Drum-Block HighWoodBlock
Drum-Bongo HighBongo
Drum-Cabasa Cabasa
Drum-Claves Claves
Drum-Cuica MuteCuica
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Otir OpenTriangle
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
Walk FretlessBass
+
+ +

+ + + +
+

LFusionSus

+ Add sustained atmosphere. (4) +
+ + + + + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Block HighWoodBlock
Drum-Bongo HighBongo
Drum-Cabasa Cabasa
Drum-Claves Claves
Drum-Cuica MuteCuica
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Otir OpenTriangle
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
Walk FretlessBass
+
+ +

+ + + +
+

LFusion1

+ Same rhythm but with an accordion for that zydeco feeling. (4) +
+ + + + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Bandoneon
Drum-Block HighWoodBlock
Drum-Bongo HighBongo
Drum-Cabasa Cabasa
Drum-Claves Claves
Drum-Cuica MuteCuica
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Otir OpenTriangle
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
Walk FretlessBass
+
+ +

+ + + +
+

LFusion1Sus

+ The zydeco with strings. (4) +
+ + + + + + + + + + + + + + + + + + +
Bass FretlessBass
Chord Bandoneon
Chord-Sus Strings
Drum-Block HighWoodBlock
Drum-Bongo HighBongo
Drum-Cabasa Cabasa
Drum-Claves Claves
Drum-Cuica MuteCuica
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Otir OpenTriangle
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
Walk FretlessBass
+
+ +

+ + + +
+

LFusionEnd

+ A one bar ending. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Block HighWoodBlock
Drum-Claves Claves
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
+
+ +

+ + + +
+

Lfusion1End

+ Same as LFusionEnd, but uses accordion instead of piano. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Bandoneon
Drum-Block HighWoodBlock
Drum-Claves Claves
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Mconga MuteHighConga
Drum-Mtri MuteTriangle
Drum-Oconga OpenHighConga
Drum-Rcym RideCymbal1
Drum-Shaker Shaker
+
+ + diff --git a/mma/docs/html/lib/stdlib/lighttango.html b/mma/docs/html/lib/stdlib/lighttango.html new file mode 100644 index 0000000..d14b43a --- /dev/null +++ b/mma/docs/html/lib/stdlib/lighttango.html @@ -0,0 +1,140 @@ + + + +

Lighttango

+

A light version of our tango. +

+ +

+ + + +
+

LightTango

+ A light Tango, more Spanish. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord-Accordion Accordion
Chord-Guitar NylonGuitar
Drum-Clave Claves
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

LightTangoSus

+ Add a sustained tone to the tango. (4) +
+ + + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord-Accordion Accordion
Chord-Guitar NylonGuitar
Chord-Sus TremoloStrings
Drum-Clave Claves
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

LightTango1

+ Change out the accordion for a piano. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord-Guitar NylonGuitar
Chord-Piano Piano1
Drum-Clave Claves
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

LightTango1Sus

+ Add a sustained tone to the piano variant. (4) +
+ + + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord-Guitar NylonGuitar
Chord-Piano Piano1
Chord-Sus TremoloStrings
Drum-Clave Claves
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

LightTangoIntro

+ Simple introduction. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Bass-Piano Piano1
Chord-Accordion Accordion
Chord-Guitar NylonGuitar
Drum-Clave Claves
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
Drum-Tam Tambourine
+
+ +

+ + + +
+

LightTangoEnd

+ A fast single bar ending. (1) +
+ + + + + + + +
Bass AcousticBass
Chord-Accordion Accordion
Chord-Guitar NylonGuitar
Drum-Kick KickDrum1
Drum-Phh PedalHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/mambo.html b/mma/docs/html/lib/stdlib/mambo.html new file mode 100644 index 0000000..fb0d4d0 --- /dev/null +++ b/mma/docs/html/lib/stdlib/mambo.html @@ -0,0 +1,236 @@ + + + +

Mambo

+

The Mambo was popularized by the great Cuban bandleader Perez Prado. The sample song ``Patricia, It's Patricia'' is a decent demo. This file was mostly developed from the patterns in``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. The variations in this file are mostly borrowed from the Rhumba library. +

+ +

+ + + +
+

Mambo

+ Basic rhythm. (2) +
+ + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo1

+ Adds pizzicato arpeggios. (4) +
+ + + + + + + + + + +
Arpeggio PizzicatoString
Bass JazzGuitar
Chord Piano2
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo2

+ Add articulated Marimbas. (2) +
+ + + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Chord-Mallet Marimba
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo3

+ Add jazz guitar chords. (4) +
+ + + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

MamboSus

+ Sustained version. (2) +
+ + + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Chord-Sus Strings
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo1Sus

+ Sustain and pizzicato arpeggios. (4) +
+ + + + + + + + + + + +
Arpeggio PizzicatoString
Bass JazzGuitar
Chord Piano2
Chord-Sus Strings
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo2Sus

+ Sustain and articulated Marimbas. (2) +
+ + + + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Chord-Mallet Marimba
Chord-Sus Strings
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Mambo3Sus

+ Sustain and guitar chords. (4) +
+ + + + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus Strings
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

MamboIntro

+ 4 bar intro with a bit of a cha-cha on 4. (4) +
+ + + + + + + + + + +
Arpeggio Piano2
Bass JazzGuitar
Chord Piano2
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

MamboEnd

+ That's the end! (2) +
+ + + + + + + + + +
Bass JazzGuitar
Chord Piano2
Drum-Bell RideBell
Drum-Clave Claves
Drum-Cow CowBell
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/march.html b/mma/docs/html/lib/stdlib/march.html new file mode 100644 index 0000000..f9dbb61 --- /dev/null +++ b/mma/docs/html/lib/stdlib/march.html @@ -0,0 +1,176 @@ + + + +

March

+

Sousa would love this file. These all need a bit of work---they tend too sound a bit to ponderous and/or heavy. The sequences assume 4 chords per bar, but most marches are in 2/4 time. So, double the tempo for "proper" results. +

+ +

+ + + +
+

MilIntro4

+ A 4 bar military-style intro. Easy to use if you include a line like "z * 4" at the start of the piece. (4) +
+ + + +
Drum-Snare SnareDrum1
Drum-Tom LowTom1
+
+ +

+ + + +
+

MilIntro2

+ A 2 bar military-style intro. This is identical to the MilIntro4, but only uses the first 2 bars of the sequence. (2) +
+ + + +
Drum-Snare SnareDrum1
Drum-Tom LowTom1
+
+ +

+ + + +
+

March

+ Standard march pattern. Boring, but it works. (4) +
+ + + + + + + +
Bass Tuba
Chord Trumpet
Chord-Tbone Trombone
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

March1

+ Adds alterating bars of walking bass to the standard march. Also, changes the trombones to a piano. (4) +
+ + + + + + + + +
Bass Tuba
Chord Trumpet
Chord-Piano Piano1
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
Walk Tuba
+
+ +

+ + + +
+

March1Slow

+ This is just March1 with the walking bass set to beats 1 and 3 instead of 1,2,3 and 4. (4) +
+ + + + + + + +
Chord Trumpet
Chord-Piano Piano1
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
Walk Tuba
+
+ +

+ + + +
+

March2

+ Adds sustained strings to March1. The strings replace the trumpets. A major sound difference. (4) +
+ + + + + + + +
Bass Tuba
Chord TremoloStrings
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
Walk Tuba
+
+ +

+ + + +
+

March3

+ Adds an apreggiating piccolo to March1. Great for trios. (4) +
+ + + + + + + + + +
Arpeggio Flute
Bass Tuba
Chord Trumpet
Chord-Piano Piano1
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
Walk Tuba
+
+ +

+ + + +
+

March4

+ Add sustained strings and apreggiating piccolo to March2. (4) +
+ + + + + + + + +
Arpeggio Flute
Bass Tuba
Chord TremoloStrings
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
Walk Tuba
+
+ +

+ + + +
+

MarchEnd

+ Four bar ending. (4) +
+ + + + + + + +
Bass Tuba
Chord Trumpet
Chord-Tbone Trombone
Drum SnareDrum1
Drum-Tom LowTom1
Drum-Tri OpenTriangle
+
+ + diff --git a/mma/docs/html/lib/stdlib/merengue.html b/mma/docs/html/lib/stdlib/merengue.html new file mode 100644 index 0000000..cb6529c --- /dev/null +++ b/mma/docs/html/lib/stdlib/merengue.html @@ -0,0 +1,182 @@ + + + +

Merengue

+

This is a very fast dance rhythm native to the Dominican Republic. The demo song for this ``Compadre Pedro Juan''. Note that you'll have to double up on the tempo for this to sound right. Patterns are from ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. +

+ +

+ + + +
+

Merengue

+ Driving dance rhythm. (2) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

Merengue1

+ Substitute bandoneon for first piano. (2) +
+ + + + + + + + + +
Bass AcousticBass
Chord Bandoneon
Chord-2 Piano1
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

Merengue2

+ Add brass hits every 4 bars. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Chord-Brass BrassSection
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

MerengueSus

+ Basic version with sustained bandoneon. (2) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Chord-Sus Bandoneon
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

Merengue1Sus

+ Bandoneon rhythm and sustain. (2) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Bandoneon
Chord-2 Piano1
Chord-Sus Bandoneon
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

Merengue2Sus

+ Bandoneon rhythm with 4 bar brass hits. (4) +
+ + + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Chord-Brass BrassSection
Chord-Sus Bandoneon
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

MerengueIntro

+ 8 bar introduction. (8) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ +

+ + + +
+

MerengueEnd

+ 4 bar ending. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-2 Piano1
Drum-Claves Claves
Drum-Cowbell CowBell
Drum-Hhat OpenHiHat
Drum-Snare SnareDrum2
Drum-Tom LowTom2
+
+ + diff --git a/mma/docs/html/lib/stdlib/metronome.html b/mma/docs/html/lib/stdlib/metronome.html new file mode 100644 index 0000000..0dbcf0e --- /dev/null +++ b/mma/docs/html/lib/stdlib/metronome.html @@ -0,0 +1,54 @@ + + + +

Metronome

+

Simple beats to put at the start of a piece. This file has only 4/4 times. +

+ +

+ + + +
+

Metronome2

+ Single bar sequence with hits on beats 1 and 3. (1) +
+ + + +
Drum-Hi HighWoodBlock
Drum-Low LowWoodBlock
+
+ +

+ + + +
+

Metronome4

+ Single bar sequence with hits on beats 1, 2, 3 and 4. (1) +
+ + + +
Drum-Hi HighWoodBlock
Drum-Low LowWoodBlock
+
+ +

+ + + +
+

Metronome2-4

+ A very useful introduction. On bar one we have hits on beats 1 and 3; on bar two hits on beats 1, 2, 3 and 4. (2) +
+ + + +
Drum-Hi HighWoodBlock
Drum-Low LowWoodBlock
+
+ + diff --git a/mma/docs/html/lib/stdlib/metronome3.html b/mma/docs/html/lib/stdlib/metronome3.html new file mode 100644 index 0000000..1cf8fbe --- /dev/null +++ b/mma/docs/html/lib/stdlib/metronome3.html @@ -0,0 +1,24 @@ + + + +

Metronome3

+

Simple beats to put at the start of a piece. This file has only 3/4 times. +

+ +

+ + + +
+

Metronome3

+ A single bar waltz introduction. (1) +
+ + + +
Drum-Hi HighWoodBlock
Drum-Low LowWoodBlock
+
+ + diff --git a/mma/docs/html/lib/stdlib/modernjazz.html b/mma/docs/html/lib/stdlib/modernjazz.html new file mode 100644 index 0000000..2f3f1f9 --- /dev/null +++ b/mma/docs/html/lib/stdlib/modernjazz.html @@ -0,0 +1,141 @@ + + + +

Modernjazz

+

A jazz style which has a bit of raunch and swing. Works well with Peggy Lee's "Fever". +

+ +

+ + + +
+

ModernJazz

+ ModernJazz with just a piano and guitar. (4) +
+ + + + + + + + + +
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Side SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

ModernJazz1

+ Adds a muted trumpet on alternate bars. (4) +
+ + + + + + + + + + + +
Arpeggio MutedTrumpet
Bass-Trp MutedTrumpet
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Side SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

ModernJazzSus

+ ModernJazz with added sustained violins. (4) +
+ + + + + + + + + + +
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Chord-Sus VoiceOohs
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Side SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

ModernJazz1Sus

+ The full-meal-deal. (4) +
+ + + + + + + + + + + + +
Arpeggio MutedTrumpet
Bass-Trp MutedTrumpet
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Chord-Sus VoiceOohs
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Side SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

ModernJazzIntro

+ 4 bar introduction. (4) +
+ + + + + + + + + +
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Chord-Trp MutedTrumpet
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

ModernJazzEnd

+ Nice, 2 bar, ending. First bar is full, second has hits on 1 and 3. (2) +
+ + + + + + + + + +
Bass-Trp MutedTrumpet
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Walk AcousticBass
+
+ + diff --git a/mma/docs/html/lib/stdlib/pianoballad.html b/mma/docs/html/lib/stdlib/pianoballad.html new file mode 100644 index 0000000..28b58a9 --- /dev/null +++ b/mma/docs/html/lib/stdlib/pianoballad.html @@ -0,0 +1,127 @@ + + + +

Pianoballad

+

Piano arpeggios with a bit of drum and bass. I wrote this for "Nature Boy". +

+ +

+ + + +
+

PianoBallad

+ Simple ballad with drums and piano. (4) +
+ + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

PianoBallad1

+ Add additional piano chords. (4) +
+ + + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Chord-Piano Piano1
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

PianoBalladSus

+ Piano arpeggios with a bit of strings. (4) +
+ + + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Chord-Sus Strings
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

PianoBallad1Sus

+ Piano arpeggios with chords and strings. (4) +
+ + + + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Chord-Piano Piano1
Chord-Sus Strings
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

PianoBalladIntro

+ A 4 bar introduction. (4) +
+ + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ +

+ + + +
+

PianoBalladEnd

+ A 2 bar ending. (2) +
+ + + + + + + +
Arpeggio-High Piano1
Arpeggio-Low Piano1
Bass FingeredBass
Drum-Chihat ClosedHiHat
Drum-Kick KickDrum1
Drum-Side SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/polka.html b/mma/docs/html/lib/stdlib/polka.html new file mode 100644 index 0000000..862cf69 --- /dev/null +++ b/mma/docs/html/lib/stdlib/polka.html @@ -0,0 +1,225 @@ + + + +

Polka

+

This is good for, gosh, polkas. They are all set as 4/4 time, and as you know a polka is usually in 2/4. So, double up on the tempo and all should work just fine. +

+ +

+ + + +
+

Polka

+ Simple, Barvarian-style polka. (4) +
+ + + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

PolkaSus

+ Same as Polka, but we add in singing frauleins. (4) +
+ + + + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Chord-Sus ChoirAahs
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

PolkaArp

+ Polka with a imported accordion player for arpeggios. (4) +
+ + + + + + + + + + +
Arpeggio Accordion
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

PolkaSusArp

+ Polka with frauleins and accordion player. Wow! (4) +
+ + + + + + + + + + + +
Arpeggio Accordion
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Chord-Sus ChoirAahs
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Polka1

+ Similar to Polka, but with a snazzier bass. (4) +
+ + + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Polka1Sus

+ Polka1 with sustained voices. (4) +
+ + + + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Chord-Sus ChoirAahs
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Polka1Arp

+ Polka1 with Accordion arpeggios. (4) +
+ + + + + + + + + + +
Arpeggio Accordion
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

Polka1SusArp

+ Polka1 with voices and arpeggios. (4) +
+ + + + + + + + + + + +
Arpeggio Accordion
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Chord-Sus ChoirAahs
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Walk Tuba
+
+ +

+ + + +
+

PolkaIntro

+ A nice little 4 bar intro. (4) +
+ + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

PolkaEnd

+ A repeatable, single bar ending. (1) +
+ + + + + + + + +
Bass Tuba
Chord Accordion
Chord-Guitar JazzGuitar
Drum Slap
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/popballad.html b/mma/docs/html/lib/stdlib/popballad.html new file mode 100644 index 0000000..1565c4c --- /dev/null +++ b/mma/docs/html/lib/stdlib/popballad.html @@ -0,0 +1,98 @@ + + + +

Popballad

+

A rock ballad in 4. +

+ +

+ + + +
+

PopBallad

+ Plain old Pop Ballad. (4) +
+ + + + + + + + + + +
Arpeggio Atmosphere
Bass AcousticBass
Chord Piano2
Drum-Cabasa Cabasa
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Shake Shaker
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

PopBallad1

+ The PopBallad with a bit more drum beat and some sustained strings. (4) +
+ + + + + + + + + + + + + +
Bass AcousticBass
Chord Piano2
Chord-Sus SynthStrings1
Drum-Cabasa Cabasa
Drum-Conga MuteHighConga
Drum-Cym CrashCymbal1
Drum-Kick KickDrum1
Drum-Lconga LowConga
Drum-Oconga OpenHighConga
Drum-Ride RideCymbal1
Drum-Shake Shaker
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

PopBallad2

+ A straighter version of the ballad. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano2
Drum-Cabasa Cabasa
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Shake Shaker
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

PopBalladEnd

+ This is a finalizing, 1 bar ending. (1) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano2
Drum-Cabasa Cabasa
Drum-Cym CrashCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Shake Shaker
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/quickstep.html b/mma/docs/html/lib/stdlib/quickstep.html new file mode 100644 index 0000000..d27ccbb --- /dev/null +++ b/mma/docs/html/lib/stdlib/quickstep.html @@ -0,0 +1,168 @@ + + + +

Quickstep

+

A quickstep beat. You might want to double up on the tempo when using this. Written for ``Hooray For Hollywood''. +

+ +

+ + + +
+

QuickStep

+ Snappy quickstep, good for showtunes. (2) +
+ + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepHit

+ Brass hits on 1, 4 and 4.5. (2) +
+ + + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Hit BrassSection
Chord-Piano Piano2
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepSus

+ Sustained version with strings. (2) +
+ + + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Chord-Sus TremoloStrings
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepHitSus

+ Sustains with hits. (2) +
+ + + + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Hit BrassSection
Chord-Piano Piano2
Chord-Sus TremoloStrings
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepDuh

+ Some vocalization over the basic beat. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord-Duh VoiceOohs
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepDuhSus

+ Sustains with vocalization. (2) +
+ + + + + + + + + +
Bass AcousticBass
Chord-Duh VoiceOohs
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Chord-Sus TremoloStrings
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepIntro

+ Four bar intro. (4) +
+ + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ +

+ + + +
+

QuickStepEnd

+ Two bar ending. (2) +
+ + + + + + + +
Bass AcousticBass
Chord-Guitar JazzGuitar
Chord-Piano Piano2
Drum-Closedhh ClosedHiHat
Drum-Kick KickDrum1
Drum-Openhh OpenHiHat
+
+ + diff --git a/mma/docs/html/lib/stdlib/rb.html b/mma/docs/html/lib/stdlib/rb.html new file mode 100644 index 0000000..e9f2942 --- /dev/null +++ b/mma/docs/html/lib/stdlib/rb.html @@ -0,0 +1,99 @@ + + + +

Rb

+

Rythmn and Blues. I did a different version of "My Blue Heaven" using this groove. +

+ +

+ + + +
+

R&B

+ Basic Rythmn and Blues. (2) +
+ + + + + + + + + + + +
Bass FingeredBass
Bass-Guitar CleanGuitar
Chord Piano2
Chord-Organ Organ1
Drum-Clap HandClap
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum2
Drum-Tam Tambourine
Walk FingeredBass
+
+ +

+ + + +
+

R&BSus

+ Change rhythmic organ to sustained chords. (2) +
+ + + + + + + + + + + +
Bass FingeredBass
Bass-Guitar CleanGuitar
Chord Piano2
Chord-Organ Organ1
Drum-Clap HandClap
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum2
Drum-Tam Tambourine
Walk FingeredBass
+
+ +

+ + + +
+

R&BIntro

+ A bit laid-back, 4 bar intro. (4) +
+ + + + + + + + + + +
Bass FingeredBass
Chord Piano2
Chord-Organ Organ1
Drum-Clap HandClap
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum2
Drum-Snare2 SnareDrum2
Drum-Tam Tambourine
+
+ +

+ + + +
+

R&BEnd

+ Ending for R&B. (2) +
+ + + + + + + + + + +
Bass FingeredBass
Bass-Guitar CleanGuitar
Chord Piano2
Chord-Organ Organ1
Drum-Clap HandClap
Drum-Kick KickDrum1
Drum-Ride RideCymbal1
Drum-Snare SnareDrum2
Drum-Tam Tambourine
+
+ + diff --git a/mma/docs/html/lib/stdlib/rhumba.html b/mma/docs/html/lib/stdlib/rhumba.html new file mode 100644 index 0000000..a63e50e --- /dev/null +++ b/mma/docs/html/lib/stdlib/rhumba.html @@ -0,0 +1,407 @@ + + + +

Rhumba

+

I created this for the Cole Porter tune "I've Got You Under My Skin.". Traditional Latin rhythms generally have a full percussion with lots of off-beats, but don't overdo it. +

+ +

+ + + +
+

Rhumba

+ Nice, smooth easy listening. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

RhumbaSus

+ Sustained strings make it smoother. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

RhumbaTriple

+ Rhumba with quarter note triplet chords. Good for emphasizing a single bar in a piece. Not great for more than one bar in a row. (1) +
+ + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaTripleSus

+ Triplets and sustained strings. (1) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaTriple12

+ Variation of RhumbaTriple with triplets on beats 1/2 and quarters on 3/4. (1) +
+ + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaTriple12Sus

+ Triplet on 1/2 and strings. (1) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaTriple34

+ Variation of RhumbaTriple with triplets on beats 3/4 and quarters on 1/2. (1) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaTriple34Sus

+ Triplet on 3/4 and strings. (1) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

Rhumba1

+ Adds pizzicato arpeggios. (4) +
+ + + + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

Rhumba1Sus

+ Apreggios and sustained strings. (4) +
+ + + + + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord Piano2
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

Rhumba2

+ Add articulated Marimbas. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Mallet Marimba
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

Rhumba2Sus

+ Marimbas and sustained strings. (4) +
+ + + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Mallet Marimba
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

Rhumba3

+ Add jazz guitar chords. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

Rhumba3Sus

+ Guitar chords and sustained strings. (4) +
+ + + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus Strings
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Walk FretlessBass
+
+ +

+ + + +
+

RhumbaIntro

+ 4 bar intro to go with standard Rhumba. (4) +
+ + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ +

+ + + +
+

RhumbaEnd

+ Ending with string scales. The scales use 8th, quarter, half and finally a whole note. Setting the seq to different values for each bar of the ending will create proper effects. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
Scale SlowStrings
Walk FretlessBass
+
+ +

+ + + +
+

RhumbaEnd1

+ Simpler, 2 bar, ending. (2) +
+ + + + + + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Bongo LowBongo
Drum-Chh ClosedHiHat
Drum-Claves Claves
Drum-Hh OpenHighConga
Drum-Loconga LowConga
Drum-Maraca Maracas
Drum-Muteconga MuteHighConga
+
+ + diff --git a/mma/docs/html/lib/stdlib/rock-128.html b/mma/docs/html/lib/stdlib/rock-128.html new file mode 100644 index 0000000..9931e6b --- /dev/null +++ b/mma/docs/html/lib/stdlib/rock-128.html @@ -0,0 +1,83 @@ + + + +

Rock-128

+

Doo-Wop rock from the 50s. These songs are mostly written in 12/8 time, but this file assumes 4/4. So, when figuring tempo use a dotted quarter for the beat count. We use this for the song "Sea Of Love". +

+ +

+ + + +
+

Rock128

+ Basic 12/8 beat with the piano doing most of the work. (4) +
+ + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

Rock128Sus

+ Add in sustained strings and voices. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord Piano2
Chord-Sus TremoloStrings
Chord-Susharmony ChoirAahs
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

Rock128Intro

+ A 4 bar introduction. (4) +
+ + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

Rock128End

+ Simple ending. (2) +
+ + + + + + +
Bass FretlessBass
Chord Piano2
Drum-Clap HandClap
Drum-Hh OpenHiHat
Drum-Kick KickDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/rockballad.html b/mma/docs/html/lib/stdlib/rockballad.html new file mode 100644 index 0000000..6fa657c --- /dev/null +++ b/mma/docs/html/lib/stdlib/rockballad.html @@ -0,0 +1,106 @@ + + + +

Rockballad

+

Written for slowish/doo-wop things like "You Belong To Me". +

+ +

+ + + +
+

RockBallad

+ Basic beat with triplet Hi-Hats. (4) +
+ + + + + + + +
Bass FretlessBass
Chord JazzGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

RockBalladFill

+ Add guitar arpeggios. (4) +
+ + + + + + + + +
Arpeggio JazzGuitar
Bass FretlessBass
Chord JazzGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

RockBalladVoice

+ Adds some cheese with choir voices. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

RockBalladIntro

+ 4 bar intro. (4) +
+ + + + + + + +
Bass FretlessBass
Chord JazzGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Walk FretlessBass
+
+ +

+ + + +
+

RockBalladEnd

+ Ending with a scaling tenor sax. Use Seq 1 to 4 for 16ths, 8th, 4th or 1/2 note runs. (4) +
+ + + + + + + +
Bass FretlessBass
Chord JazzGuitar
Drum ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Scale TenorSax
+
+ + diff --git a/mma/docs/html/lib/stdlib/samba.html b/mma/docs/html/lib/stdlib/samba.html new file mode 100644 index 0000000..f8f39e6 --- /dev/null +++ b/mma/docs/html/lib/stdlib/samba.html @@ -0,0 +1,190 @@ + + + +

Samba

+

First try at a samba. Note: This is really in 2/2 time but we notate with 4 chords/bar ... so double the tempo! +

+ +

+ + + +
+

Samba

+ Our basic dance beat. (4) +
+ + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
+
+ +

+ + + +
+

SambaFill

+ Adds a whistle to the sandard beat. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
Drum-Whistle ShortHiWhistle
+
+ +

+ + + +
+

SambaPlus

+ Adds pizzicato strings (4) +
+ + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord-Piano Piano1
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
+
+ +

+ + + +
+

SambaSus

+ Add sustained bandoneon. (4) +
+ + + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Chord-Sus Bandoneon
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
+
+ +

+ + + +
+

SambaSusFill

+ Sustained bandoneon and whistle. (4) +
+ + + + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Chord-Sus Bandoneon
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
Drum-Whistle ShortHiWhistle
+
+ +

+ + + +
+

SambaSusPlus

+ Sustained bandoneon and arpeggios. (4) +
+ + + + + + + + + + + +
Arpeggio PizzicatoString
Bass FretlessBass
Chord-Piano Piano1
Chord-Sus Bandoneon
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
+
+ +

+ + + +
+

SambaIntro

+ 4 bar introduction. (4) +
+ + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Drum-Kick KickDrum2
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
+
+ +

+ + + +
+

SambaEnd

+ 4 bar ending. (4) +
+ + + + + + + + + + +
Bass FretlessBass
Chord-Guitar JazzGuitar
Chord-Piano Piano1
Drum-Kick KickDrum2
Drum-Phh PedalHiHat
Drum-Ride RideCymbal1
Drum-Shaker Shaker
Drum-Side SideKick
Drum-Whistle ShortHiWhistle
+
+ + diff --git a/mma/docs/html/lib/stdlib/ska.html b/mma/docs/html/lib/stdlib/ska.html new file mode 100644 index 0000000..5fbe6dd --- /dev/null +++ b/mma/docs/html/lib/stdlib/ska.html @@ -0,0 +1,152 @@ + + + +

Ska

+

This was written for the Beatle's song "Ob-La-Di, Ob-La-Da". You will probably want double the tempo when using this. +

+ +

+ + + +
+

Ska

+ Good if you're from Trinidad. (2) +
+ + + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sax AltoSax
Drum-Cabasa Cabasa
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Ska1

+ Change Piano to SteelDrums and add in some eight note Claves. (2) +
+ + + + + + + + + + + + +
Bass AcousticBass
Chord SteelDrums
Chord-Sax AltoSax
Drum-Cabasa Cabasa
Drum-Clave Claves
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

SkaSus

+ Adds sustained voices to Ska. (2) +
+ + + + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sax AltoSax
Chord-Sus SynthVox
Drum-Cabasa Cabasa
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

Ska1Sus

+ Adds sustained voices to Ska1. (2) +
+ + + + + + + + + + + + + +
Bass AcousticBass
Chord SteelDrums
Chord-Sax AltoSax
Chord-Sus SynthVox
Drum-Cabasa Cabasa
Drum-Clave Claves
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

SkaClap

+ Adds a rather loud handclap to the basic beat. Good for repeatendings, etc. (2) +
+ + + + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sax AltoSax
Drum-Cabasa Cabasa
Drum-Clap HandClap
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ +

+ + + +
+

SkaEnd

+ A funky ending. Really does need some work. (2) +
+ + + + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sax AltoSax
Drum-Cabasa Cabasa
Drum-Cym ChineseCymbal
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Drum-Maraca Maracas
Drum-Shake Shaker
Drum-Snare SnareDrum2
+
+ + diff --git a/mma/docs/html/lib/stdlib/slowblues.html b/mma/docs/html/lib/stdlib/slowblues.html new file mode 100644 index 0000000..6a7312f --- /dev/null +++ b/mma/docs/html/lib/stdlib/slowblues.html @@ -0,0 +1,237 @@ + + + +

Slowblues

+

A variation of "blues.mma" for slower tempos. +

+ +

+ + + +
+

SlowBlues

+ Simple guitar chords. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesFill

+ Full chord plus argeggio for fills. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SlowBluesFill1

+ Same as fill1 but with straight 8ths. (4) +
+ + + + + + + +
Arpeggio JazzGuitar
Bass AcousticBass
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SlowBluesFill2

+ Full chord plus scale for fills. (4) +
+ + + + + + + +
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Scale JazzGuitar
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesFill3

+ Same as fill2 but with straight 8ths. (4) +
+ + + + + + + +
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Scale JazzGuitar
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesSus

+ Our simple blues with the choir added. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesWalk4

+ Same as SlowBlues but with a strong quarter note walking bass. (4) +
+ + + + + + +
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesWalk4Sus

+ Choir added to Walk4. (4) +
+ + + + + + + +
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesWalk8

+ Same as SlowBlues but with a strong eight note walking bass. This works nicely with SlowBluesWalk4 in an A-A-B-A selection with the B section using this groove and the A using SlowBLuesWalk4. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesWalk8Sus

+ Choir added to Walk8. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SlowBluesIntro

+ Standard 4 bar introduction with walking bass on 4th bar. (4) +
+ + + + + + +
Bass AcousticBass
Chord JazzGuitar
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SlowBluesEnd

+ Quite a dull ending. The High Hats play 16 notes on the first bar, 8 on the second, 4 on the third and 2 on the fourth. Set the SEQ point appropiately for your ending. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Sus ChoirAahs
Drum-Ohh ClosedHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/slowbolero.html b/mma/docs/html/lib/stdlib/slowbolero.html new file mode 100644 index 0000000..afcad6d --- /dev/null +++ b/mma/docs/html/lib/stdlib/slowbolero.html @@ -0,0 +1,102 @@ + + + +

Slowbolero

+

This bolero is different from the Ravel-ish sounds of ``bolero.mma''. Sounds nice with slower songs. For an example see the exemplar ``Abrazame Asi''. This file is largely based on ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. +

+ +

+ + + +
+

SlowBolero

+ Easy going Bolero for ballads. (4) +
+ + + + + + + + + + + +
Bass FingeredBass
Chord Piano1
Chord-Guitar SteelGuitar
Drum-Claves Claves
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Sq SquareClick
+
+ +

+ + + +
+

SlowBoleroSus

+ Add sustained voices. (4) +
+ + + + + + + + + + + + +
Bass FingeredBass
Chord Piano1
Chord-Guitar SteelGuitar
Chord-Sus VoiceOohs
Drum-Claves Claves
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Sq SquareClick
+
+ +

+ + + +
+

SlowBoleroIntro

+ A simple introduction. (4) +
+ + + + + + + + + + + +
Bass FingeredBass
Chord Piano1
Chord-Guitar SteelGuitar
Drum-Claves Claves
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Sq SquareClick
+
+ +

+ + + +
+

SlowBoleroEnd

+ 2 bar ending. (2) +
+ + + + + + + + + + + +
Bass FingeredBass
Chord Piano1
Chord-Guitar SteelGuitar
Drum-Claves Claves
Drum-Hconga OpenHighConga
Drum-Lconga LowConga
Drum-Maraca Maracas
Drum-Ohh OpenHiHat
Drum-Snare SnareDrum1
Drum-Sq SquareClick
+
+ + diff --git a/mma/docs/html/lib/stdlib/slowcountry.html b/mma/docs/html/lib/stdlib/slowcountry.html new file mode 100644 index 0000000..da757ee --- /dev/null +++ b/mma/docs/html/lib/stdlib/slowcountry.html @@ -0,0 +1,160 @@ + + + +

Slowcountry

+

For slow, mellow country tunes. I use this for the Patsy Cline hit ``Crazy''. +

+ +

+ + + +
+

SlowCountry

+ Simple nylon guitar in 2. (4) +
+ + + + + + + +
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountrySus

+ Adds a sustained strings (2 part) to SlowCountry. (4) +
+ + + + + + + + +
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountryFill

+ Adds guitar apreggio. Quarters on bar 1,2,3 and eights on bar 4. (4) +
+ + + + + + + + +
Arpeggio Piano2
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountryWalk

+ The SlowCountry Groove with a full walking bass line. The bass volume has been increased as well. (4) +
+ + + + + +
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountryWalkSus

+ SlowCountry with a walking bass line and a sustained string. (4) +
+ + + + + + +
Chord JazzGuitar
Chord-Sus TremoloStrings
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountryWalkFill

+ Walking bass fill. (4) +
+ + + + + + + + +
Arpeggio Piano2
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ +

+ + + +
+

SlowCountryIntro

+ 4 bar intro (4) +
+ + + + + + +
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
+
+ +

+ + + +
+

SlowCountryEnd

+ Simple ending. (2) +
+ + + + + + + +
Bass FingeredBass
Bass-Fill JazzGuitar
Chord JazzGuitar
Drum-Phh PedalHiHat
Drum-Tom LowTom1
Walk FingeredBass
+
+ + diff --git a/mma/docs/html/lib/stdlib/slowjazz.html b/mma/docs/html/lib/stdlib/slowjazz.html new file mode 100644 index 0000000..c673b50 --- /dev/null +++ b/mma/docs/html/lib/stdlib/slowjazz.html @@ -0,0 +1,292 @@ + + + +

Slowjazz

+

An easy going jazz rhythm in 4. Mostly piano chords, sort of what you'd expect from a piano-bass-drum trio. I use this for "As Time Goes By". The SlowJazz2 variations bring in a nice organ. +

+ +

+ + + +
+

SlowJazz

+ Slow, basic jazz backup track. (4) +
+ + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazzSus

+ Bring in the orchestra. (4) +
+ + + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Chord-Sus TremoloStrings
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazzWalk

+ Change bass to walk on 1/2/3/4. (4) +
+ + + + + + +
Arpeggio Piano2
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazzWalkSus

+ Sustained version with full walk. (4) +
+ + + + + + + +
Arpeggio Piano2
Chord Piano2
Chord-Sus TremoloStrings
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz1

+ Slow jazz piano with a straight rhythm. (4) +
+ + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz1Sus

+ Add sustained strings to straight slow jazz. (4) +
+ + + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Chord-Sus TremoloStrings
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz1Walk

+ Slow, straight piano jazz with walking bass. (4) +
+ + + + + + +
Arpeggio Piano2
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz1WalkSus

+ Slow, straight walking with strings. (4) +
+ + + + + + + +
Arpeggio Piano2
Chord Piano2
Chord-Sus TremoloStrings
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz2

+ A pretty straight, guitar strum for slow tunes. (4) +
+ + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Fill JazzGuitar
Drum-Shake Shaker
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz2Sus

+ Straight guitar with sustained Hammond-like organ. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord JazzGuitar
Chord-Fill JazzGuitar
Chord-Organ Organ3
Drum-Shake Shaker
Drum-Snare SnareDrum2
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazzIntro

+ A 4 bar introduction. (4) +
+ + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz1Intro

+ 4 bar intro without push chords. (4) +
+ + + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazz2Intro

+ A 4 bar intro with organ (4) +
+ + + + + + +
Bass AcousticBass
Chord-Organ Organ3
Drum-Hh RideCymbal2
Drum-Shake Shaker
Walk AcousticBass
+
+ +

+ + + +
+

SlowJazzEnd

+ An easy, 2 bar ending. (2) +
+ + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Piano2
Drum-Hh RideCymbal2
Drum-Shake Shaker
+
+ +

+ + + +
+

SlowJazz2End

+ Substitute organ for Piano. (2) +
+ + + + + + +
Arpeggio Piano2
Bass AcousticBass
Chord Organ3
Drum-Hh RideCymbal2
Drum-Shake Shaker
+
+ + diff --git a/mma/docs/html/lib/stdlib/softrock.html b/mma/docs/html/lib/stdlib/softrock.html new file mode 100644 index 0000000..6aa4d33 --- /dev/null +++ b/mma/docs/html/lib/stdlib/softrock.html @@ -0,0 +1,144 @@ + + + +

Softrock

+

Seems to work nicely for relatively fast (ie. not "slow dance"), older rock tunes. I use the SoftRock1 for "Blame It On The Bossa Nova". +

+ +

+ + + +
+

SoftRock

+ Basic Soft-rock for 60's tunes. (4) +
+ + + + + + + +
Bass FretlessBass
Chord Piano3
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk FretlessBass
+
+ +

+ + + +
+

SoftRockSus

+ Strings with the rock. (4) +
+ + + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-Sus TremoloStrings
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk FretlessBass
+
+ +

+ + + +
+

SoftRock1

+ Adds a latin-pop touch by using flute arpeggios. (4) +
+ + + + + + + + +
Arpeggio Flute
Bass FretlessBass
Chord Piano3
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk FretlessBass
+
+ +

+ + + +
+

SoftRock1Sus

+ Latin-pop with sustained strings. (4) +
+ + + + + + + + + +
Arpeggio Flute
Bass FretlessBass
Chord Piano3
Chord-Sus TremoloStrings
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk FretlessBass
+
+ +

+ + + +
+

SoftRockIntro

+ Basic introduction. (4) +
+ + + + + + +
Bass FretlessBass
Chord Piano3
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

SoftRockSusIntro

+ Basic introduction with added strings. (4) +
+ + + + + + + +
Bass FretlessBass
Chord Piano3
Chord-Sus TremoloStrings
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ +

+ + + +
+

SoftRockEnd

+ Simple 4 beats to the bar ending. (4) +
+ + + + + + +
Bass FretlessBass
Chord Piano3
Drum-Hh ClosedHiHat
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
+
+ + diff --git a/mma/docs/html/lib/stdlib/softshoe.html b/mma/docs/html/lib/stdlib/softshoe.html new file mode 100644 index 0000000..adebdf8 --- /dev/null +++ b/mma/docs/html/lib/stdlib/softshoe.html @@ -0,0 +1,125 @@ + + + +

Softshoe

+

Syncopated ditty for the old dancers. Written for "Me and My Shadow". +

+ +

+ + + +
+

Softshoe

+ Nice little dance beat with ``shuffles'' on bar 3 and 4. (4) +
+ + + + + + + +
Bass AcousticBass
Chord Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SoftShoePlus

+ Add a cool clarinet. (4) +
+ + + + + + + + +
Arpeggio Clarinet
Bass AcousticBass
Chord Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SoftShoeSus

+ Add sustained strings. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano2
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SoftShoeSusPlus

+ Add the cool clarinet and strings. (4) +
+ + + + + + + + + +
Arpeggio Clarinet
Bass AcousticBass
Chord Piano2
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SoftShoeIntro

+ A 4 bar introduction. (4) +
+ + + + + + +
Bass AcousticBass
Chord Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SoftShoeEnd

+ 2 bar ending with nice walk on first bar. (2) +
+ + + + + + +
Bass AcousticBass
Chord Piano2
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Side SideKick
+
+ + diff --git a/mma/docs/html/lib/stdlib/son.html b/mma/docs/html/lib/stdlib/son.html new file mode 100644 index 0000000..7b188a4 --- /dev/null +++ b/mma/docs/html/lib/stdlib/son.html @@ -0,0 +1,106 @@ + + + +

Son

+

The Son or Son Montuno is a traditional Cuban rhythm. The song ``Alma De Mujer'' in the sample songs uses this. For the most part I've developed the patterns right from ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. +

+ +

+ + + +
+

Son

+ Our basic Son rhythm. (2) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano2
Drum-Claves Claves
Drum-Cymbal RideCymbal1
Drum-Hbongo HighBongo
Drum-Hconga OpenHighConga
Drum-Lbongo LowBongo
Drum-Lconga LowConga
Drum-Lowtom LowTom1
Drum-Maraca Maracas
Drum-Sguiro ShortGuiro
+
+ +

+ + + +
+

SonSus

+ Son with sustained strings. (2) +
+ + + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano2
Chord-Sus Strings
Drum-Claves Claves
Drum-Cymbal RideCymbal1
Drum-Hbongo HighBongo
Drum-Hconga OpenHighConga
Drum-Lbongo LowBongo
Drum-Lconga LowConga
Drum-Lowtom LowTom1
Drum-Maraca Maracas
Drum-Sguiro ShortGuiro
+
+ +

+ + + +
+

SonIntro

+ Boring, four bar introduction. (4) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano2
Drum-Claves Claves
Drum-Cymbal RideCymbal1
Drum-Hbongo HighBongo
Drum-Hconga OpenHighConga
Drum-Lbongo LowBongo
Drum-Lconga LowConga
Drum-Lowtom LowTom1
Drum-Maraca Maracas
Drum-Sguiro ShortGuiro
+
+ +

+ + + +
+

SonEnd

+ Simple ending. (2) +
+ + + + + + + + + + + + +
Bass JazzGuitar
Chord Piano2
Drum-Claves Claves
Drum-Cymbal RideCymbal1
Drum-Hbongo HighBongo
Drum-Hconga OpenHighConga
Drum-Lbongo LowBongo
Drum-Lconga LowConga
Drum-Lowtom LowTom1
Drum-Maraca Maracas
Drum-Sguiro ShortGuiro
+
+ + diff --git a/mma/docs/html/lib/stdlib/swing.html b/mma/docs/html/lib/stdlib/swing.html new file mode 100644 index 0000000..9a88ccd --- /dev/null +++ b/mma/docs/html/lib/stdlib/swing.html @@ -0,0 +1,647 @@ + + + +

Swing

+

Some pretty good swing stuff. Works well for standards like "C'est Si Bon". The "Triple" and "Plus" versions are built on their basics, so it it sounds fine to toggle between, for example, Swing, SwingPlus and SwingTriple. +

+ +

+ + + +
+

Swing

+ Basic swing beat. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingWalk

+ Change the 1/3 syncapated bass to the same pattern, but with a walking style. (4) +
+ + + + + + + + + + +
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SwingTriple

+ Modified Swing with quarter note triplets. Good for occasional fill bars. (1) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingPlus

+ Adds clarinet arpeggios to Swing. (4) +
+ + + + + + + + + + + +
Arpeggio Clarinet
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingWalkPlus

+ Swing with walking bass and arpeggios. (4) +
+ + + + + + + + + + + +
Arpeggio Clarinet
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SwingSus

+ Add sustained strings to Swing. (4) +
+ + + + + + + + + + + +
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingPlusSus

+ Add sustained strings to SwingPlus. This is getting a bit thick sounding. (4) +
+ + + + + + + + + + + + +
Arpeggio Clarinet
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingWalkSus

+ Swing with walking bass and sustained strings. (4) +
+ + + + + + + + + + + +
Chord Organ3
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

SwingWalkPlusSus

+ Swing with walking bass, arpeggio and sustained Strings. (4) +
+ + + + + + + + + + + + +
Arpeggio Clarinet
Chord Organ3
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk AcousticBass
+
+ +

+ + + +
+

Swing1

+ A more syncopated version of Swing. This sounds a bit "twangy" with the piano voice selected. (4) +
+ + + + + + + + + + +
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing1Walk

+ Walking bass version of Swing1. (4) +
+ + + + + + + + + + +
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing1Triple

+ Modified Swing1 with quarter note triplets. (1) +
+ + + + + + + + + +
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing1Sus

+ Swing1 with sustained strings. (4) +
+ + + + + + + + + + + +
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing1WalkSus

+ Swing1Walk with sustained strings. (4) +
+ + + + + + + + + + + +
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing1Plus

+ Swing1 with arpeggiating clarinets. (4) +
+ + + + + + + + + + + +
Arpeggio Clarinet
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing1PlusSus

+ Swing1 with clarinet and sustained strings. (4) +
+ + + + + + + + + + + + +
Arpeggio Clarinet
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing1WalkPlus

+ Swing1Walk with the clarinet. (4) +
+ + + + + + + + + + + +
Arpeggio Clarinet
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing1WalkPlusSus

+ Swing1Walk with clarinet and sustained strings. (4) +
+ + + + + + + + + + + + +
Arpeggio Clarinet
Chord Piano2
Chord-Guitar JazzGuitar
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing2

+ This version is much better with slower tempos (no walking bass versions since it's already marching). (4) +
+ + + + + + + + + + + +
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing2Triple

+ Modified Swing2 with quarter note triplets. (1) +
+ + + + + + + + + +
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

Swing2Plus

+ Swing2 with clarinet (4) +
+ + + + + + + + + + + + +
Arpeggio Clarinet
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing2Sus

+ Swing2 with sustained strings. (4) +
+ + + + + + + + + + + + +
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

Swing2PlusSus

+ Swing2 with clarinet. (4) +
+ + + + + + + + + + + + + +
Arpeggio Clarinet
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Chord-Sus TremoloStrings
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Walk SlapBass1
+
+ +

+ + + +
+

SwingIntro

+ Simple, 4 bar introduction. (4) +
+ + + + + + + + + + +
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingIntro2

+ Same intro, but Swing2 voices. (4) +
+ + + + + + + + + + +
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
+
+ +

+ + + +
+

SwingEnd

+ Basic ending based on Swing. 4 beats on first bar; beats on 1 and 3 on the second. (2) +
+ + + + + + + + +
Bass AcousticBass
Chord Organ3
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

Swing1End

+ Ending for Swing1. (2) +
+ + + + + + + + + + +
Bass SlapBass1
Chord Piano2
Chord-Guitar JazzGuitar
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Ridec RideCymbal1
Drum-Side SideKick
+
+ +

+ + + +
+

Swing2End

+ Swing2 ending with alto sax run. Use ``seq'' so that you end on bar 4. The sax plays 1 bar of chords, then 16th, 8th, half note runs on bar 2, 3 and 4. If don't like the sax run, use ''Scale Off'' to disable. (4) +
+ + + + + + + + + + + + +
Bass SlapBass1
Chord Organ3
Chord-Sax AltoSax
Drum-Hiconga OpenHighConga
Drum-Kick KickDrum2
Drum-Lowconga LowConga
Drum-Ohh OpenHiHat
Drum-Phh PedalHiHat
Drum-Side SideKick
Scale AltoSax
Walk SlapBass1
+
+ + diff --git a/mma/docs/html/lib/stdlib/tango.html b/mma/docs/html/lib/stdlib/tango.html new file mode 100644 index 0000000..39cca89 --- /dev/null +++ b/mma/docs/html/lib/stdlib/tango.html @@ -0,0 +1,74 @@ + + + +

Tango

+

This is a stronger, heavy version of Tango. You might also want to look at the "LightTango" for an alternative. +

+ +

+ + + +
+

Tango

+ Basic tango. (8) +
+ + + + + + + + + + +
Arpeggio Bandoneon
Bass-Violin Violin
Chord Bandoneon
Drum SnareDrum1
Drum-Hh PedalHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Rolls SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

Tango1

+ Our basic Tango with a March feel. (8) +
+ + + + + + + + + + +
Arpeggio Bandoneon
Bass-Violin Violin
Chord Piano1
Drum SnareDrum1
Drum-Hh PedalHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Rolls SnareDrum1
Walk AcousticBass
+
+ +

+ + + +
+

TangoEnd

+ A nice ending for our dance. (2) +
+ + + + + + + + + +
Bass AcousticBass
Bass-Violin Violin
Chord Bandoneon
Drum SnareDrum1
Drum-Hh PedalHiHat
Drum-Kick KickDrum1
Drum-Ohh OpenHiHat
Drum-Rolls SnareDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/vienesewaltz.html b/mma/docs/html/lib/stdlib/vienesewaltz.html new file mode 100644 index 0000000..d392024 --- /dev/null +++ b/mma/docs/html/lib/stdlib/vienesewaltz.html @@ -0,0 +1,103 @@ + + + +

Vienesewaltz

+

Strauss waltz pattern. +

+ +

+ + + +
+

VieneseWaltz

+ Basic waltz, piano only. (4) +
+ + + + + + +
Bass Piano2
Chord-Piano Piano2
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

VieneseWaltzSus

+ Basic waltz with strings and piano. (4) +
+ + + + + + + +
Bass Piano2
Chord-Piano Piano2
Chord-Sus Strings
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
+
+ +

+ + + +
+

VieneseWaltz1

+ Our VieneseWaltz with light, eight note arpeggios. (4) +
+ + + + + + + +
Arpeggio MusicBox
Bass Piano2
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Scale MusicBox
+
+ +

+ + + +
+

VieneseWaltz1Sus

+ Waltz with arpeggios and strings. (4) +
+ + + + + + + + +
Arpeggio MusicBox
Bass Piano2
Chord-Sus Strings
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
Scale MusicBox
+
+ +

+ + + +
+

VieneseWaltzEnd

+ A 4 bar ending. Set SEQ so that the final bar is the 4th bar of the pattern. A CUT after the last bar will help. (4) +
+ + + + + + +
Bass Piano2
Chord-Piano Piano2
Drum-Cym RideCymbal1
Drum-Hh ClosedHiHat
Drum-Kick KickDrum1
+
+ + diff --git a/mma/docs/html/lib/stdlib/waltz.html b/mma/docs/html/lib/stdlib/waltz.html new file mode 100644 index 0000000..47e6894 --- /dev/null +++ b/mma/docs/html/lib/stdlib/waltz.html @@ -0,0 +1,237 @@ + + + +

Waltz

+

A pretty basic 3/4 waltz. +

+ +

+ + + +
+

Waltz

+ A very boring waltz with piano chords. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

WaltzSus

+ Adds strings to Waltz. (4) +
+ + + + + + + + + +
Bass AcousticBass
Chord Piano1
Chord-Sus TremoloStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

Waltz1

+ Add piano apreggios to the basic waltz. (4) +
+ + + + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Scale Piano1
Walk AcousticBass
+
+ +

+ + + +
+

Waltz1Sus

+ Waltz with arpeggios and sustained strings. (4) +
+ + + + + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Chord Piano1
Chord-Sus TremoloStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Scale Piano1
Walk AcousticBass
+
+ +

+ + + +
+

WaltzWalk

+ Walking bass version of Waltz. (4) +
+ + + + + + + +
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

WaltzWalkSus

+ Walking bass and sustained strings. (4) +
+ + + + + + + + +
Chord Piano1
Chord-Sus TremoloStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

Waltz1Walk

+ Walking bass and arpeggios. (4) +
+ + + + + + + + + +
Arpeggio Piano1
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Scale Piano1
Walk AcousticBass
+
+ +

+ + + +
+

Waltz1WalkSus

+ Walking bass, arpeggios and sustained strings. (4) +
+ + + + + + + + + + +
Arpeggio Piano1
Chord Piano1
Chord-Sus TremoloStrings
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Scale Piano1
Walk AcousticBass
+
+ +

+ + + +
+

WaltzIntro

+ Waltz intro with piano chords. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

Waltz1Intro

+ Waltz intro with piano arpeggios. (4) +
+ + + + + + + + +
Arpeggio Piano1
Bass AcousticBass
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Walk AcousticBass
+
+ +

+ + + +
+

WaltzEnd

+ Simple ending based on Waltz with piano scales. Scales are 16ths on bar 1, 8ths on 2, quarters on 3 and a single note on 4. Adjust your SEQ accordingly, and use a CUT to finish the last bar. (4) +
+ + + + + + + + +
Bass AcousticBass
Chord Piano1
Drum-Chh ClosedHiHat
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
Drum-Tri OpenTriangle
Scale Piano1
+
+ + diff --git a/mma/docs/html/lib/stdlib/zydeco.html b/mma/docs/html/lib/stdlib/zydeco.html new file mode 100644 index 0000000..a9bdaf1 --- /dev/null +++ b/mma/docs/html/lib/stdlib/zydeco.html @@ -0,0 +1,133 @@ + + + +

Zydeco

+

After listening to way too much Buckwheat I came up with this. I use it for "Jambalaya". +

+ +

+ + + +
+

Zydeco

+ Our basic cajan beat. (4) +
+ + + + + +
Bass FretlessBass
Chord JazzGuitar
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoPlus

+ Adds a rhythmic accordion (4) +
+ + + + + + +
Bass FretlessBass
Chord JazzGuitar
Chord-Acc Accordion
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoSus

+ The orchestra in New Orleans? (4) +
+ + + + + + +
Bass FretlessBass
Chord JazzGuitar
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoSusPlus

+ String and accordion? Too cool! (4) +
+ + + + + + + +
Bass FretlessBass
Chord JazzGuitar
Chord-Acc Accordion
Chord-Sus Strings
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoIntro

+ A simple, 4 bar, introduction with accordion. (4) +
+ + + + + +
Bass FretlessBass
Chord-Acc Accordion
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoEnd

+ 2 bar ending with guitar. (2) +
+ + + + + +
Bass FretlessBass
Chord JazzGuitar
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ +

+ + + +
+

ZydecoPlusEnd

+ 2 bar ending with accordion. (2) +
+ + + + + + +
Bass FretlessBass
Chord JazzGuitar
Chord-Acc Accordion
Drum-Kick KickDrum1
Drum-Snare SnareDrum1
+
+ + diff --git a/mma/docs/html/logo.png b/mma/docs/html/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1b5c7ebb06b72fcad84828cc9628ddfa269409 GIT binary patch literal 14420 zcmXwg1yq#Z^YybO_R&OG&46?jjAVpwc4J@IHQj z|MxtHIM43AbMMT2X6DY!jn&pvCcve^1%W^WswxV)AkZUc;QuomEa10x4(GRqi66uVj?~`m^$hm2xO`1O;2EUad)h7cDLVofA3>V@`0^;=;jRw z=ydCgqV>Ld4j_HWgE~yO(^f@%u~2v!m9C@ zwxzg=D#i^E=<|P{d~|UX&5ub^F78P_^UGkH+vBKl0f9p9S`SX!ZjVr13i`uTu4@1)Ml zK_Fi0f6VYK8Ll*I+Wb_`31Z|Uat4LHX{r5kn@(2l`z1i5#azAy4Kxp<0>0>7b93gd za;N%K&p?5JVGI`&RDum701=UMoiCQ1T*ZzYfk4#%_7wxey4cIQdumMpV#GFD27wL^ zd`B>=BA4QR+|mE{5}*sB)sP>wV|j6NM&TfZ33`tMDF%Tk^oeZaU>Y=sOwcwpgjNzHT9r= zhZe>!LK|#L1A5}3K6t!oHAIubrH==QAJq0TgELEElU6;BV3E*A6+OSD)+0R1Nx%U4 zKUsm+&?!Vt$e^m!_De4t_%dg$6UQ)a(LrH`IZ?}~3C86<`6Oj8F^f*wn+>D&`5^B1 zadmhCh;b4Guo-g^S}%TA5n=a@cp~R5{;vGk*Ij;MgX3`C8dJ#a*t!hn_eyAw=U43m2}?O*$fKC%&8G? zT%0MV$VqKbn6&fj%s@Iq1s@IhF+;zKL5i5Nq9VtHSx3{awgTh71IdOj>bsK0N^6Ns zu6V--w@>?pqi3{=s|IKu$)X2qp+7ZJs&NsSdFZmjk$6qyTmS&JJdN0X1`^$&o1tJ~ zvHV$VL6|)&1HFa;^kx=50^9JhOOTS+Ye){c*)M+9>w9|SU{z&Q{ZIYd71FE}SAMdt z!YJ@2Uv4ZLDe-HMqlXC_C2Mnrhm!|n(hejnN+YB@%&;o)CrX8`=6y4TxTzo&E{}#24;IPOoDj>bH8{$M zZ>{UCW=ufs#)QOmdeH0V`djfxUk+HAvA`@@ijM=h)s4R~eYwMI6K+Q#Vzvk|8Cg$o z*X>}o2~*u;#Jx%_?)?a#kr&;IO>|7M%u3R9gr5N_Mo3VW)+VhydPI(7JI1QD&9Z3x zJO0Gp(6h?MX8o0nsLfu~t(k>ILj&5g==JHL*Zn-KX~|Ct4iLlO&|`5La|nmE`D zs)Y(~)z!XflMyk1-d~ov;27}zhzPLNTO&Ue2J0<|pe9>Qb;Nvq15ufeWr+I4V}IhZ zT_fFyji_{R|vN#1kIw45K`yIK; zR%OzlN(SBA`Iz?eMskR7N8nr2>af7JAQoT?!&_E9Dx�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 + + + + + + + MMA Reference Manual + + +

+
+

+ Musical MIDI Accompaniment
+ MMA
+
+

+

+ +
+

Reference Index Page


+
+ +
+
  • + The Main Reference Manual + -- the definitive source for all your questions. +
  • + + +
  • + The Standard Library Reference + -- overview of the grooves supplied with MMA +
  • + +
  • + The MMA Tutorial + -- a gentle introduction for those new to MMA. +
  • +
    + + +

    The Main Reference and Tutorial are maintained in Latex files +converted to PDF. These are additionally translated by Latex2HTML +and may not completely reflect all the details in the originals. + +

    The library documentation is extracted directly from the library files. The HTML +version is created with mklibdoc.py, supplied with the binary distribution. + +

    This page and all the other MMA materials are the responsibility of + Bob van der Poel . + + + + + + diff --git a/mma/docs/html/ref/crossref.png b/mma/docs/html/ref/crossref.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd2dddf5ac24cb1297a9d565c41057cb7090e02 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp@Aj|@a!R<*>X0K7&N_)1@@}28%Z6=9 t-O~MHw|5t0`TuI#<-T9Me##YR_J!+(UN4n;@(5@ygQu&X%Q~loCIFb&G|K=0 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img1.png b/mma/docs/html/ref/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cea8765647a9d387cf4e7918c66b7ec4d66d1c GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eU!py+H_`Ow05Xeyp@Ck9fd-ra6dHK6{?~IL& z&zw0UC@8pU)vAt;jkDr17tCl1o;IsI6S+N2IR1pc>21sZ{(2| zx3+eXC=LV)#d*3ohH%Wx?b*oNV8Fw&KUF%)?F7der^6g>Tnqd~FD|I?%9+EJ__L($ zv{46-Q-I+jj#FG~7gW5z#D0H5La|hYQW=Jp=;m>7ChHvO&tcT3k<@wv^fy*_T= bzoCku;I41?TBR@%piK;(u6{1-oD!M+|9?S2K_HL$-?!C3 zim@cfFPOpM*^M+HhrPtp*Oh%EkG#0GwTnb?AW%rx)5S4_V`g$fLO=pTBP-7ehi*pp xh^<_)n#|1Cy>ebj6-Y8NN3Oo`Wi3;aC<9Y2S8=8G#wS3H44$rjF6*2UngAp>DCz(J literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img11.png b/mma/docs/html/ref/img11.png new file mode 100644 index 0000000000000000000000000000000000000000..cfb6a9af78a930d5e6199fec56fa390104dc911a GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy_!py+HIN7jhACRLJ;1l9{_wL=9GiR2UmxqRi zzI*phP*8Bys#P5w9cgK4|NsAYad81ER8msfy?eK2t3)l3!&nmJ7tG-B>_!@p!(QU) z>&m{7M_%08+C`!`5Gd5->Eal|G1Ihrqu?O}9@ndvFQl>bJ9sm{oZKWS(Wu&@&#JG& z>KyRo1e1(#K_r`}+P=@1KVRRzV3C%Ge#-2ex3}(O?m2#MGtV&-$@O=7MSZ3TRNjnh zI-YW-BDm7!^6&VzRbQ_AU)cI}RlD!!>v}IY>+NcP8e($LqW#{Uy1LzUadl~RpI^jO UaP%_T0$s!4>FVdQ&MBb@0Pz-Tod5s; literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img12.png b/mma/docs/html/ref/img12.png new file mode 100644 index 0000000000000000000000000000000000000000..9bca1ba237e40871e70c474f82a97d19c6aa49ee GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^JV30>!py+HsJiUfLLf&yz$e7@?%lgHXU;4yFAoh3 zefRF&nKNeu1qD~FTGi3fk(QSB|NnoWLM0_7quqZ`09lMBL4Lsu4$p3+0Xgg?p1!W^ z8+qi#t*u=oiUWZ{F`h1tAsjQ4BaUv6;s|Ga$kfK`u!DgkocSVKTd2bphOTLiCy#Oq zC@E~=T9GTx@xJN7idX@|nhGO~X0003iNkl4FU|icR$ZNX z-o1fg%e;;A8=&mnFaT%n2Qu%%zy*W?7;E)LhHdN)*LH94-ct<}i$;|Nvf!E#VyL!k z!w_4)ok?=vHtyNGeph$y4%+nbdIQ6@eOux;eFQo!`*p(3-Q2TZyFtwRjnElQsr&9?fD2gEVF6TAwdXfT)u!4B z&$Ab9sEsY$J?~C>=~bY>>>ba;%45Tx?q%-j!wnV?znpzw_wMlSeYP)lhf5>e q_4gJQC+)wxn!0`@UKM71U;zL*x=K#9`pdik00001Qkn@(X5gcy=QV$YC$>^mS$5 z$RjUqZS5ja90(MO_H=O!;h32`4aFLu0*-qX10rbF2G9EFcn+I*!3Os8&?Jv%d#IYDsk-Fvqbj!oNL vzWHF#?y&ru`n)M`_E&#@=Nl5cLxQ2LsysUC<-+ek>li#;{an^LB{Ts5s7GVh literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img17.png b/mma/docs/html/ref/img17.png new file mode 100644 index 0000000000000000000000000000000000000000..99b68e53399c959d494a5853afff5bff3e1e70e1 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^qChOp!py+HnD|Z80?084@Ck9fd-v|lnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!#3rKSD<|KG*M1*lv}Non`)-K}D&vOo@FNswPKgTu2M zX+REpiKnkC`$islacgTAiQ+(@&=gM>#}J9B$v5^kCgw9SPjFdayj$|yy?bXjRGV|; zC)_9&TcIM}@jjQ~vtot$j9Xh=#a-Us(!Jd)&=OGY_<*T}UAg#N!F#rqY#VFy^LGPv zZT+8@+4i?QKks($DxppmX_iFg+Z(FC=W6`^{Z3cSpzO%Dn|I3f8gE*!Du4HF-(LPR s_pa~VUHV-#vn4L2_`|06hYqqb6moBCT>08#2GD&Bp00i_>zopr00kv^0ssI2 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img18.png b/mma/docs/html/ref/img18.png new file mode 100644 index 0000000000000000000000000000000000000000..d91c99e5d2f230d5840f2339bf2c3b644a03e416 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^qChOp!py+HnD|Z80?5${@Ck9fd-v|lnKR4F%iq0w zXKZYI=FAyELBUn4R&{iAq@|_(|Nq~`#RaHVNl9tje)n}i7Gp_}UoeBivm0qZ4tt5G zuPggT9(i$VYZr;)K%mfMPZ!4!iK)pETN@IuGO`KmY`$o0gOd=Q!NC5lIBahNRYq!{gf zX3v?N+rt*Fa#1?S=6K_T*_tTkRQ<0#kM=O9W;4By7Que^TkJr(FY22WQ%mvv4FO#l$WY8wCm literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img19.png b/mma/docs/html/ref/img19.png new file mode 100644 index 0000000000000000000000000000000000000000..932f4e726f88e530cdfaa4a5975dbbdeee48d428 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^qChOp!py+HnD|Z80?5${@Ck9fd-v|lnKR4F%R@s$ z-@SWx=FAyELBUn4R;8t-{r~^p#l;1vP)SK?_wL=6!VM>Z9LAC$zhDN3XE)M-9QG1V zUsv{xJo4h!)-Dpofk2@)PZ!4!iK)pmEE^M_v9Sqox*Mk(otbAU>~o&wqqVw$&rPew z#CO*?1?*gSTZEW{FQ=cK;v&QnyxTE>xrJRl|6R-E;N^L&lcrAIc0Ogsmg27`XJ%*# zs@zcEkiOYAbMwQT^-~MJg-n~fIXv6x#zopr0Cxyz6951J literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img2.png b/mma/docs/html/ref/img2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e46384ec7598d9e8566d6e537b428f89df6edc0 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^iXhCw%)r2S>FoPcK#o>`Pl)T?yLZdW%R@s$-@SWh zY-}tjD7b3Xs*aA1w6wJU|NpzVxXhe6Q%Ol__wL={DK)Ap4~_Ta@b2e zeO=i%^2m!@Tf0aU2LgrWd%8G=XiVJN=g4))K)^NqcB$qJ=N%gY5)V{YvXxKeJ7FGP z@N${@2cCP!Jkv9xR*8rx8t>WTQ|IL1ZIPWArJ~Tna@Z&{`P{v|tsGqr>jM`@ZP(^fxi3Y y&}eIaJxR^ab7!BIskEDX=b7c{pWp2N8|cSJIxcO_cBlk8mBG{1&t;ucLK6V6KXpd{ literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img20.png b/mma/docs/html/ref/img20.png new file mode 100644 index 0000000000000000000000000000000000000000..80f2d562cc287451ec04e820bdb4848d09e00524 GIT binary patch literal 295 zcmV+?0oeYDP)O~X0001zNkl5bJFK^C5UQnA*9U7esB^{k9t+2%+wRzy&nH-G8rx zsm;4zgRR{C>^6|n-tR39wEgarZM)G;!EGi4z}UB;Y+mmTK`^%E?%jLuTmrLqMDO0c t==MG^d*AO3>e*MM5qgo$!OOmj008n4z^2$Y9Fzb6002ovPDHLkV1grDen$WR literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img21.png b/mma/docs/html/ref/img21.png new file mode 100644 index 0000000000000000000000000000000000000000..442957c4e3426d963fe365383c5b87687c9e51e1 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRv!py+HcuL&49LUiM@Ck9fd-v|lnKR4F%iq0w zXKZYI=FAyELBUn4R&{iAq@|_(|Nq~`#RaHVNl9tje)n}i7Gp_}UoeBivm0qZ4tt5G zuPggT9(i$VYZr;)K%h{Rr;B3<$IRr2qYRD99aD4;uL=#=($bxHRgbP0l+XkK6=zn5 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img23.png b/mma/docs/html/ref/img23.png new file mode 100644 index 0000000000000000000000000000000000000000..27b49bc8d4567b0a3c44a6f03033113523187e3c GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^f?THSv?`ukaGrOcKQ2zYOIE5BVYjSMSd#k_8CC-@2ak_95!z=d+<5q=F$v}%4JYD@<);T3K0RXqhSG52D literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img24.png b/mma/docs/html/ref/img24.png new file mode 100644 index 0000000000000000000000000000000000000000..4120bfa5e8bb33ef205986311edd77fc1acff7d2 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRv!py+HcuL&49LUiP@Ck9fd-v|lnKR4F%R@s$ z-@SWhY;1hy%o#yJ!BwkPb#!$6|Nq~`#RaHVNl9tgeeB|Np;>iwjV#l9JNy-Mc+IU1tJ0j3q&S!3+-1ZlnP@ z>?NMQuIw9mn3tYs zDC8A5AItE}`Gc0h)}m0}j;JjuzT!>-PIDO>nKPPJ-rp@7ZqOR_KbtTH6I``V91)=Us j1ga*UJ$Tx#nSr4|f0KXaeVaQ#hcS4%`njxgN@xNAIlOE@ literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img3.png b/mma/docs/html/ref/img3.png new file mode 100644 index 0000000000000000000000000000000000000000..f518af28c62f2fadd037632b5134f8c94d775e33 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IZ!py+HxbO7d^FWSzfKQ0)-Me?o%gaMUL*Ko7 zXKZXNC@8pU)vAt;jP(70oVqRTZ7XWPIhK22v%F1oDt7BYCc`njxgN@xNA8H!l+ literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img4.png b/mma/docs/html/ref/img4.png new file mode 100644 index 0000000000000000000000000000000000000000..1e711fd102353e966a9cf8a882cdf8b825d7b90c GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^!a%IZ!py+HxbO7d^FWShfKQ0)yLa!(%gblZoM~)q z{Qv)d7Z(>LC8e$f8n>Vfp9~q?ZxF(jhA=A#?HQK?#nAO$nEdx(d2zIo+`EWDhZ7IAqq) zA)(;0p@XrlO3724$tRUjB~XBUodS=uh^y|`nGDW1!c`2IE}R2ez~JfX=d#Wzp$Pz! CO+JnQ literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img5.png b/mma/docs/html/ref/img5.png new file mode 100644 index 0000000000000000000000000000000000000000..6a406ee6adb430f98161c58d406562c71d0bb3c6 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^JV30>!py+HsJiUfLLf&yz$e7@?%lgHXU;4yFAoh3 zefRF&nKNfrty`sf zMjm-_Yik#Y;y|E~r>Bc!2*=Fi7YP{&42c3cHxFF6$l!FAm&cYjpv>K!T_D_`;M1& literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img7.png b/mma/docs/html/ref/img7.png new file mode 100644 index 0000000000000000000000000000000000000000..12468cea5e185e29e0c3a4bfa9e687358d7328b9 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv_!py+HsHpIx1jtbd@Ck9fd-ra6dHK6{?~IL& z&zw0UC@8pU)vAt;jkDr17tCl1o;IsI6S+N2IR1pc>21sZ{(2| zx3+eXC=LV)wR*ZZhH%WR?X%`%GURbtez(uLfJLfrgDvm#1x|As^fK%XoP{s0nH2o! zNXquZLG$LjZ4@?0;4u*5=9@6{9iyfDh9zaowtu~Nw^-Z2GC1+cnQ51w&$(4`dF8HC zW_x=!TP54C`Cc6NeLL$)pZ}MiR$lq~$@~1HC%;}CiM{IY|MvF$9kwCbb&Q@@YEu`4 SJX#NQ5QC?ypUXO@geCwzq-?SP literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img8.png b/mma/docs/html/ref/img8.png new file mode 100644 index 0000000000000000000000000000000000000000..6481bb040a4c6a2e9f06ed470f57219b8046347a GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^?!py+HX#GoB2*^e#(U^vIc U{pEZ1WsoigPgg&ebxsLQ04-iO{Qv*} literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/img9.png b/mma/docs/html/ref/img9.png new file mode 100644 index 0000000000000000000000000000000000000000..c254496ae270d2d1c318b76b40727aba44641241 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^d_XMB!py+HsH!Pw2;`^)_=LFLy?b}&%$eoo<)NXW z#>U2H&YbD!=txUT`~UwxP>GU~((c{6x!X>y0CE^hg8YIR9G=}s19I3)Jbhi+H}c4f zTU)zG6bAx@!aZFaLpWw8zes3s;1#%e@WO`Xg^L+mq{J9l54_ + + + + +Reference Manual + + + + + + + + + + + + + + + + +next + +up +previous +
    + Next: Overview and Introduction + Up: Main MMA Reference +
    +
    + + +

    + +

    + +

    + +

    + +

    +

    LOST LOGO + +

    +Reference Manual

    +
    + +

    Bob van der Poel

    +

    Wynndel, BC, Canada

    +

    October 15, 2006

    +
    + +

    + +

    +


    + + + + + +

    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/mma.css b/mma/docs/html/ref/mma.css new file mode 100644 index 0000000..d1824af --- /dev/null +++ b/mma/docs/html/ref/mma.css @@ -0,0 +1,30 @@ +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.MATH { font-family: "Century Schoolbook", serif; } +.MATH I { font-family: "Century Schoolbook", serif; font-style: italic } +.BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold } + +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { font-size : xx-small } +SMALL.TINY { font-size : x-small } +SMALL.SCRIPTSIZE { font-size : smaller } +SMALL.FOOTNOTESIZE { font-size : small } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { font-size : large } +BIG.XXLARGE { font-size : x-large } +BIG.HUGE { font-size : larger } +BIG.XHUGE { font-size : xx-large } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ diff --git a/mma/docs/html/ref/mma.html b/mma/docs/html/ref/mma.html new file mode 100644 index 0000000..03c8c96 --- /dev/null +++ b/mma/docs/html/ref/mma.html @@ -0,0 +1,633 @@ + + + + + +Reference Manual + + + + + + + + + + + + + + + + +next + +up +previous +
    + Next: Overview and Introduction + Up: Main MMA Reference +
    +
    + + +

    + +

    + +

    + +

    + +

    +

    LOST LOGO + +

    +Reference Manual

    +
    + +

    Bob van der Poel

    +

    Wynndel, BC, Canada

    +

    October 15, 2006

    +
    + +

    + +

    +


    + + + + + +

    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/mupex/arp4s.png b/mma/docs/html/ref/mupex/arp4s.png new file mode 100644 index 0000000000000000000000000000000000000000..e28181e08b074b4481ee75c015f2e496ce95703d GIT binary patch literal 2763 zcmV;+3N-bJP)~Q2+^$0P)cO@f`cMUM-1IHBbNwg9-qY@sH9^ z0Kn%W00Af_djPUJ>Y#&;YU%9(croOS3ZvT9Pe!Jp^a}=1kE|`A*YG1^Wuz4Z;7i5; zv<*KZB39^#0a#?~f>|9s*C^dE03wpD1>_GuLN^S+L#_a{`FRo@CNa+I0DP(}T`>RH z*W5Ci#Lx``kfQ};cZS~0V1zahfLV?JwEDMu<_`e~fJlZe*gE~}4nKo35(YpdLkno# zy7A9@W+V(i@&L5X|4gM{8-U8C4nSZ3GK_QqIFL98^n5sfmS?^VSs(yOTR_ju&R+M+ zlzzMjduWqy0ryll?)Jor{p;x zJ)D9#BL@WF#um^z|HE7%ls9PRje&9Kwg5!;3&7TW0qEr?T0j7j2B5v5vfZYc)$#yt zY5{G#U$lP!h~y|rukV*^w`nE-0T9X11>2^YUEzlg7yyy90mvCv-p9UZ{{WadCPFYb z0>C|PFUJ7@i=@q+d9Zyc$T6y``^92a)PhaI%NjIs3uql&M(51u9QmJ72W3({(4s6G z6YAg#Kk3^)&rvr1mLU!;pt6#;fR+}{=vnubGyDK(PnIOKC;VjiO@tqyWr+ijzm1b) z`XL2gfwm?8|7d*LTT_9xpL0^mN00+2uakbDNv90PH~iSI)(=I^fc9MuK>l=a`YzHE>{wF|^x#msq$;AKM$bO>`!PNKv3|_$Gf4N_IDE&SD*COPcUrWsPfcrQM^yA= z3&_9IdyaX}B%gskoeDt5%Px%gssf!s_yPKKE&zEh-?n~il63Ym(#FhZpf@K1kgpEU zdUBw9m((+!GoP7y2=wNs*gIHn_*r+5%pi#e^G7*)#Nn%@L{|-HLv#zso&9lt>8V%< zU{7QKa?gBrgD0FFcjARE2g*Y(Oh)1aPX8{(GBYwLjh&_RDNyBu(c3qa0G-Cy|H z!T^B!LZthw5}^)gP2faCSN`Xyi)B~;efe3X}!d_mkF+SE{WQfiHvO3WP^N)V*r=ESTg&=$CcLJzE zz$n;uevLl>`9gs?xQ!L7Cr89|JaabyRR{?{FF*MQ&)svSAN34Z_pxf~eE=vaIsk=sz@|s5$G1PmG)z194skBy1fU-A0m#z< zdu_pl?2lnyLQrflA^D6jR+rU?%aL8a+5ESvDAo+|CR!1FWn{%`> z(tWQ)WB>|F6>s*(*n7NHE-0o&L-@gwCHQ!*Wyw($0s>I%_>^({><=zy)~@r{3rFlu z@IgI70#Ia#I2*7+KQ2r1nTm_>8R?=oBEvAeJ7D=+Epct2=T51B8v_*W2ns+kZH@Qa z9tW84$G2atA2w=+8v_(Ai3~tC;5Ke4{w6ISEjC|VZnDlI;) zC;T8Krm~h7kpl`nUDkWwbK?_Bz~keBlqT9g6^IEy!xBb(Eg63cW&c#$oqIoLKJ#(G zvCuzLbie8lH43(b2>(peIoIQ?{v*B?(A>f~`rwQ*= z5|P93%L=S*1&6v-2i?^nRIt6FY}O^nEVSbn>y*&to}C&uZ`;t<3{6-m4~UXQs)dudl0;JT zA7^JiF24zJCv^Uw>ygfF&rASHf0%Lb}p=jH^cN8^NQQ#WZtbnWbS;W3qS1jbRL^L)~x5V6R&2cGCW^LW8_p@_32jpX%>v4=&5gE0$w+RboZPl#3vvYG7j5$ATql!+= zT0A?q=YaNC%cExPHSj-4n`eh4^v4VT*tXZeZ(r|c=k@?Jzo8A+FX_+}a2q4qd>x%O z^?i0|0l_n1@N$bLoA-U_`|K15Ky5Y^kF{Ks1zqt8-o%d0C?|(Eb5t1p?5# zA>k+atXB(!yFCDXLW25Li*@RNdz=nH=G1k|;B}wtTHNo&=e$-R)`h*{&s;Z$pZ2>X zz1OJ&?s1_DHbq{(48Zr%Cg{6P9dM5e0mwMZB>Cp|SY4Jb^wB2hyG|W&kINeqzOIN; zPw=r{GlyH7fVjuK8cu}Z1B6MkGwN#)+O`bVJEZpawd}J_9dM6iTQhIJh+Br?XaF0D z_l94F*=Z91IF>j70YEs`f&nOo00f|zzX2tujcWso@h$)W06cU>Sad^gZEa<4bO0bp zZDD6+AZKN6WpZJ3Wn>^?c_2koP#{NWZ*z2WV{&P5bRZ~XWp-&}Wj%0iZE|6EDGHU- RRJ8yA002ovPDHLkV1g#;7Lxz~ literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/bassb8.png b/mma/docs/html/ref/mupex/bassb8.png new file mode 100644 index 0000000000000000000000000000000000000000..ee83a5295aa27d0bff45bda8d6cd81339b9bad6d GIT binary patch literal 3643 zcmbuC^;^^7*T+BG$Vm$#lNhDq2t_2MMmb99b_`*Z^ynBHN{SLnDW!mv45UjyL_iuz zNs*9lq~qE5`Tp?y0nZQjIrr;2*ZscExqmwEDBVXWdMFGE006y)x~e_^fRW^T91R6I zYKn8#lM~ol3#AHNM8tMCk%`t_-OQ7m)&KWA=x|aXKTXz9RWkG&Ur$$zS!iQ!iw+ls zU){?2Mpeba@mVUFwYv>Buty(6Q38(8^a`U)yM)bpWzVt+68@U%KyNeC^98yFk#?Zu zWVlc$OI<5mDLy#6x~9j*C)LGA`@J11`>kb=aY?j*ZJZUNem5Pq}X>)ED@zIk=-#m;>XzBX4XqcGIv{C zrmS%&6umJUlqnBKeygCm9t)y<>`gC1iN5`Wi5lGQfL~u1TqOcgo)3>UkoO-C!_=Ga zQ-gDel@BPe?%2NP;ee18i5aBf{3=J8X!v#|fYCMgZ{>fW8e7xfKFD z%egi@R-3%1MS_P2h|+t|#mQ;QfSu}TgS&{gLB;M3cB563#bX0Liyeb@NB32{-F@d# zJ@eVSubNJicmGb(uuZsokE>0(H2@-Af|*WqZ+JQazBIaEh;<|B2A^b{TnyQr{Tz$3 z!-Fa-Z;cu~9M(?a8sgi<;4*FI3hg9X6*56b;}J2%R(yi$s8C?o=7?64=61taqk6g=X+jNssrCDya*t&SbNjUd+?$|L=3)>-U^N?@h;g zRU|?v!Ib%%L0lT)5}3jIjc?VBJBf;Oy!2e(S*{AGpA=5;eR*K@Mi&%tdJt(+s*U*k za&T|fqfO=3x+JVqP0H2CycVQIL92W5QtlWQSL-Y?x;OI1Emrrzp1tO8`Qe70!*YyD z#yhzVe57E;Z4e(HpD!Qt{+Ev2n4pB4imEELORXU>X&f?K-W@V^99jv$N9?Vui!o?d z)|P@3&sDLbC~)8Qf7tER==@7FwoCV2^CQ%~~<=zkD|5W!_mev*)yn~c* z7U)p@`1jLA*CWaxt>93_G2uKP&5tCG_iR4up3rbVYT5gN%j`mPs(01KFvEZ7F#IZf zKDaF1`yJC8bM`V1l`G83g(EbM-CV#eb5~W}x6;@FaW#4LD*Wryj_r*h0)Vl zawW%Ul}hN(>r5ZLOp7FMALOx`V@@XXsI_S=lG0RQHM-%6F(cr9)sQ=I-z`~&2X8s( zjoXu^&NSsZEZU7+hJt)u5Lj^wt&!F^yIA`QlRWe*8qef+moTBSVUBfHE#AUSshj;i zcOuq<*qzTMUz1o~Ach-6O-4^#P~OA8-zUYsWypP=b=qq#dopzF9c_-`G3~vEJ7>)hEn(Y!ONt#6Fk!ce_6vZG zufLeJ)Rx9)8%0TIZxnw_NMS5 zt_hSJt=%dWE;%Q;ET`VWG-f3jFWLHNquDDpNzYKtf4s+8}Rd#}``L=)%DQAa+40!XL6J`LE&&(98KQhKl|$ksz6^q1z`jeuU; zcE_-^3w|_v8sw%~1tMc+Bxr&s)Q$Uqi)Sl+GpDiQfKlT8Hn_mxn?%TK5c0BxmSUQp?yjGBjT=3vbBA@j=%S-ZXnTN^(}LRUMUdj*Hfw!!PLLT zGi7|n#9p%&3-&pYo>K(9g))haR=HZ1>o&5YX{MEQ-WFf-t}uayDVeS8E$QQmvi12p zpL&)kkj6`oN<>MZsO|BSBQ&ns~Wc3NLj(*ivg>@Fz!(VUr>AD`$^V-kh&I!#g#-k&PtPTzDsF}eFUJXlRt^&*QfD7NhD zY~OGr>)P>JzuSctA#a^!Me}fJTaZ*U=6p#?=U;p^8&?xsjqxM$lxmM003r;5{#qbn|1?aFkiOM|a6`<{s@?{J%9+*PcASdUw^cef0C}zxjHdWvTAbj1eebmLiSi z-B^+4k)2*~Q;Y0w`RWgfdEKzXwg^)HZwq=tkgWZu`KNvl5!fnL<0X4H^(R{SmEB59 zwh~c_HP>seKPFHHRR0JIq+&YQ_9rbp&^&s+M;`HsLb7%}pCzM1kJQY_`k%DZzW5YQ z38|MH=w4G;5_5dLa4jj$kPkIgHU@#1{t4q3W1&3U64{Iw zd_3cw5MhE$at>n^DykusEsaKx&^)KEV1>9I#cwjTW{TmZ!Y35{1E{avw=%H~dm&PQ zI!N{;9G2ISHj@RD4UWwPzw-EPE0SLftN3R#%`1y#;Y>xjzn$76^=Oaoc z%mQnrDiZts8?PWLoHfYba1Qejgl{!_`dW=Z`XgEz543O!sR+0$CvRbMJ8|ZTlS0}hl`a8yUpsG z3AiX}8UsY}JcF`FgYm()5`bMU{Dog*NydJUt--DB)p|4KkrD=OR0J>mQVOU3vo?zl znWk4l2ZzTxI(`qD_2HUl&dczXlcRI=|2mIq4#cjU%s)SNEc#WrUF`k-;k=58{f&`l zJ&?ZB=Nt0)B1@l*zDnJU(@+a4+}vm2;R34c=Llu@nGi>Gb-~9EI15fzIH`ElZ{@@A zVufguEtkl3MF!e_=c-7nH(VktNE_>B>)K9%BuZ4|6?j82`_G$dszd|%)3AlS0CVRD z!^L+@424vo{X+*o1I@!F3LI}Ruh|&oi-=sQd=Ls$HgZi3;cP6C&{T03A+r?uXO#Kr z!usC_zjI5T@f3V7o4FbSmhfu8KJWE>H&tKf?F{Z zo!z1)m#OM7f*=sM4S85A07rgh-6C{?!4%q{i#%a6GHnqw$-aV)j1pv|BUj1T4P4~O z{U4H7k^gv_{{{|b@>22@0tWKQs{g;ReU}f`-N3Oliy(V7IWIL+FBLZz7h6{^0IuQk z#NHNeZ|iD{d*Wq_g)eLmuC+aFUSW@M?cMa_`1M|K%Y6B#nbZlaK(v1A((S(+GGV`MA)zEp(97V`C# zeM^(d@)_t}wFnqz zW;Mr8cJXu`Dfu0;ZG+2?AsjH^LS68RRW~H{S=Ojwmp)$eUn!q?orlMn=c(Q5U$Fz- zJLCxsywD^>`YL%&2TEh*5I62&SqK+aY1|oVzdLyN=p;r%tfb_f`fc;qD@%sQDcq-? z*hlb@xk({{Wn^f#SfZ}N88Zs?s~AB^Uu0}|6&`r%-DL{3Uf>Rk`{`rDF>(NbNgsM4YwN2B-6b<9tA-=xQPhu5kTixF8QU#d6GY{ zBB$1?42OC;Xv;>WGT?J z0HLvF>vZ7$eE0#uA;G+yz_U*4~LSQWIC@=)-QbGsj~n#ckE**!8rx^eE|{zr=jUkl%Y*ULhI zoH)Ig8YG>pyE?3SGL3v<&rJPgWZ=QqS1Y`h?^C!api$f3vZkoj=9S2jvW;tj|0+S| zT!EyS*8MD)-JdRSnTVL(UsG|}PRO2{xRw7FVv(>5-m21GyQck}82seTnudKjQlsNU z=T6>qlX{J#kq~W9A4fWW4K?!$Q+ar9o3ygb*bT`rrw^KV^WDp4{Nr=gW#=95-jB<^ zmI;=73pKOgoVV1o#MXUTl+42W?AfRR;-{XV=hWd& zZ2sH?KHL-*yL;1as9>x(MLTxWz67+De8#}>JPstKk7cC!Uca zxLMYuXdt^k&cVEo|M&;sdcw{0pxlNwl;db!e3iq7%w9YU-8)h~ic1hgY+LLteD-P8 zt#Y`@xN~o!CiDJU^@HtpMLB^V#|W)I7q@U^d}Z-ogJ8N%hvi(2d!uLihbD(YPQZ8T zExvNn@o0|PGp5w-Zde*y1bCc;I>N>ptg0MTe8eO(Y%?lw>xFw#6xWR~=Vt~Nqn(}^ zpkl|~nON9-(PIvt?Fefa&B9mmZJUfQk!%jCNZ683e&%n!PIXQdEuT_yHW@!DPLm9x zpWZzDEW-%tzK|lv@j#a5cN;c`KVBB>;nH6JS%m=)w>rv%&RH0c%x?gH|^sG`nBX zB#>$9X;&)znjgJua$uS&A~Gj}2D4l@_>I_sgnt^#Ja4BcW%w~3P3ZTnda1H;K}g8m zAoRi)`reSh@8V}RxX4t`0QKY(Utlu<9O0uQ%N%dUQa%RU0{DG+zf5bXtXaVd!YIe1kKp>HS8-!}2hY;bmWA?fe8vJqAe@7Y3nRtzojpH* zmDaYy{uV0)I=%;$c_$+2?8>eXRm$1=S{bzCODOJsE+@bR*TE$CF7R zko2#4fec6xw+%>n<>?#8S^zO%+#V)-cF6I{yO6?A%bk}z9antpIP6R4wt@C$R|EJJVaQm?8=xc9k?`8L>k-()dGE1$H9iFR%sxw#>h1 zWqk=LQaP?DnallLls*$HrI2_LOR&A{NHkj!D*tKu^NtMaGEHP#DeC@Si6Cqqx9;IN ziYqa=BnXAqI0=`DAaKLro)0v=kmo?z1e4)f_sl-&It+aMEk<)GkX#+V8@?$}{!T$o z;7j>p4o$@32xXSs^mxKL>%m&6^))m4x%UC~?}O_0`>PR~GWeP|*b6kLwqDQU>}jo~ zXY?Ml^jgXP@dOXX%Dv0_DK|f7>#O_efomH%&MD}c%UJZVxss}1xp4C z8rnD59%Oc*`AChVITb$AOmku!x8=|2vZVP&$8~kuqZRZndAUQ_Jj9y6bva zh~J0)ebz_oyMgAU@0HUt{jgf0o$&#V>3LZ28g;lYbCbyty0Rm_AN6Lf!Hn6TI=Q%= zno%FU*Q?XzHuLZBaz*T3aW||3FRviJ#k-n*cgm(_x;5+4TZgHGL*I$Ah$@H6skgHs z8<(&5y>%!qPmF|b$UJ{Dp5eS!{2Obg%%8ytaHJQgU-#?GF=n3Q<<4a|3PB02U6UXE z7MCuKd@h@M1t}~K54!OIFORji@aVAtov?;7R_9B7k? zh>y2qVZN+Ix4U3>f%0Kp@-Wg531S27QCYkuB4Z@3ocdEjihOZ>5n!8m=#<~n^qL12 zI(iq55%Z`BQy5T?29v0YlxjMk$$WsO^-t2F2rYnMbA9u);KS`#lR_BxQ<%CfV`G;j z_SEj+k|68L9u@kpx0j`H#EH}^;_fwcWjXwnBsgd!izKidCpdMWf8Tw3iIP3xRlUq3 zJKPjnuvKWBa@nC0P}EG&Ce?ZvYh)yqTFD^`o^ z#d?1hvn~f@P*UCNY!CML_*cy>hLhF1z zX+nRZG<3e*?V{Ceg;UH+Y~$9mcs`SrfZP7-llT7i-A5AV` zx$3doCGQoxmf{9NMF=;1ak&jl8zq|3+Yn$^dE%g_;^&Fqg$jCrBJo0v^ft8)*{-F4 zuRMv|W_tAKR~kPQ`;$-ca*M>Q{p#feMmHDES+#=cx;(I`?#XfOOQmEs)3B`sAt@v} zIcoSY5cNGq0hn9V^OqlNU~0CmSm;nnb6@0Gji7-gVh>lI@FAfO+rxO!Q8*VC9(34M zU_;B!3PctY0H9O{lmB7l@fC#`h$RkQNZMc<`3(4GvLa+InzC{+B;!T8CCOke)6z$7 zqJvGLe?ugaL>DCJXyHqW^I9-jGcSN#bh0$)9|J~L#z)c34uWR@x+_`uyRda{*B`S@ z;U|1$s=!Nid+e&m)efJ+L0fAm8m9SgZjWds z+$FR98gN}_=;r(e*ZBx7sG)64wI2%4G>qWB`wLTa2U1WUgg|mW@Y|nEY=G$9(WoR< zFes>ZZdUI4Fh6iIVT+~`*TFiEM^XsCu>aBlT?_|UUR!}#h#+$KNAyWDG>XdB0QtsU z0wViL4iEXbCoYuX3I!%!v-LqU}~qJmrAlo6f*GE3$Y zamsND-~XZL|0?tU$9QxCqsgUJa&Lv}H$m#Vc=`JI5=gGzen<%?XMb0Mv!=JF2kFiONoWe)q6UZqGSD;Dtw1}3 F{Re|N|Kk7v literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/cmajor.png b/mma/docs/html/ref/mupex/cmajor.png new file mode 100644 index 0000000000000000000000000000000000000000..38e8f8253d5080c22ad5590db73952cc5aa7212c GIT binary patch literal 4179 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 E4+11^CjbBd literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/fermata2.png b/mma/docs/html/ref/mupex/fermata2.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e5ab117a986aa845228f2aa678e0c34a1da007 GIT binary patch literal 5883 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 IT)h?ZKZLO~r2qf` literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/soloeg.png b/mma/docs/html/ref/mupex/soloeg.png new file mode 100644 index 0000000000000000000000000000000000000000..6350fa215522e3593d0053557cd49488bd67ccfd GIT binary patch literal 5357 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 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/swingdrum8-3.png b/mma/docs/html/ref/mupex/swingdrum8-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ec241e78813e599068188687b51f95a6c279e596 GIT binary patch literal 2466 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 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/swingdrum8.png b/mma/docs/html/ref/mupex/swingdrum8.png new file mode 100644 index 0000000000000000000000000000000000000000..405df9eeab86e0bf084d95f7e8bd3885c3438022 GIT binary patch literal 1773 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 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/trip1.png b/mma/docs/html/ref/mupex/trip1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7de3996499d897f92de793f6b038326f1af8c80 GIT binary patch literal 3880 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 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/mupex/trip3.png b/mma/docs/html/ref/mupex/trip3.png new file mode 100644 index 0000000000000000000000000000000000000000..f667ea3a0647edecc662f329bb89393e4ae75876 GIT binary patch literal 4032 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 literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/next.png b/mma/docs/html/ref/next.png new file mode 100644 index 0000000000000000000000000000000000000000..1628652aac7cff4b24228abd9908c320c6026a7c GIT binary patch literal 245 zcmVQ2aP`rsfsL)H8>rF50IrEKQ7U2mrM!9=R9*Dw1X+@W9RTx^a-#5T6$bi^4|h!q3s vo9V3RdqZP$JTTh9!JZ)`voZLAB<&|;0_>J~#QNZkD16SAR=O4@7anKqmC5&ngT;#rH1+qK z20S~FlZynq-MY=T{~%>KNs884sExd44P^%bf!zNDPxW#x21^f><@$FgzM-=J5cLN5 WGDyh~oC>l40000 + + + + +Overview and Introduction + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Running + Up: Reference Manual + Previous: Reference Manual +
    +
    + + +Subsections + + + +
    + +

    +Overview and Introduction +

    + +

    +Musical MIDI Accompaniment, +MMA ,1.1 generates standard +MIDI1.2 files which can be used as a backup track for a soloist. +It was written especially for me--I am an aspiring saxophonist and +wanted a program to ``play'' the piano and drums so I could practice +my jazz solos. With +MMA I can create a track based on the chords in +a song, transpose it to the correct key for my instrument, and play my +very bad improvisations until they get a bit better. + +

    +I also lead a small combo group which is always missing at least one +player. With +MMA generated tracks the group can practice and perform even +if a rhythm player is missing. This all works much better than I +expected when I started to write the program ...so much better +that I have used +MMA generated tracks for live performances with great +success. + +

    +Around the world musicians are using +MMA for practice, performance +and in their studios. Much more than ever imagined when this project was started! + +

    + +

    +License, Version and Legalities +

    + +

    +The program +MMA was written by and is copyright Robert van der Poel, +2002--2006. + +

    +This program, the accompanying documentation, and library files can be +freely distributed according to the terms of the GNU General Public +License (see the distributed file ``COPYING''). + +

    +If you enjoy the program, make enhancements, find bugs, etc. send a +note to me at + + Bob van der Poel ; or a postcard (or even money) to PO Box 57, +Wynndel, BC, Canada V0B 2N0. + +

    +The current version of this package is maintained at: http://www.mellowood.ca/mma/. + +

    +This document reflects version 1.0-rc2 + of +MMA . +

    + + +
    +
    +
    Warning: This program + is currently in a beta state. The commands used in the + input files, the output, the overall logic and anything else you + can think of might change in the future. + +

    +

    +
    +
    +
    +

    +

    This manual most likely has lots of errors. Spelling, grammar, and +probably a number of the examples need fixing. Please give me a hand +and report anything...it'll make it much easier for me to +generate a really good product for all of us to enjoy. + +
    + +
    +

    +

    +
    +
    +
    +

    +

    + +

    + +

    +About this Manual +

    + +

    +This manual was written by the program author--and this is always a +very bad idea. But, having no volunteers, the choice is no manual at +all or my bad perspectives.1.3 +

    + +MMA is a large and complex program. It really does need a manual; +and users really need to refer to the manual to get the most out of +the program. Even the author refers to the manual. Really. + +

    +I have tried to present the various commands in a logical and useful +order. The table of contents should point you quickly to the relevant +sections. + +

    + +

    +Typographic Conventions +

    + +

    + +

      +
    • The name of the program is always set in the special logo type: + +MMA . + +

      +

    • +
    • +MMA commands and directives are set in small caps: + DIRECTIVE. + +

      +

    • +
    • Important stuff is emphasized: important. + +

      +

    • +
    • Websites look like this: http://users.xplornet.com/~bvdp +

      +

    • +
    • Filenames are set in bold typewriter font: filename.mma + +

      +

    • +
    • Lines extracted from a +MMA input file are set on individual + lines: + +

      + + +
      + +
      A command from a file
      + +
      + +

      +

    • +
    • Commands you should type from a shell prompt (or other operating + system interface) have a leading $ (to indicate a shell + prompt) and are shown on separate lines: + +

      + + +
      + +
      $ enter this
      + +
      + +

      +

    • +
    + +

    + +

    +LATEX and HTML +

    + +

    +The manual has been prepared with the LATEX typesetting system. +Currently, there are two versions available: the primary version is a +PDF file intended for printing or on-screen display (generated with +dvipdf); the secondary version is in HTML (transformed with +LATEX2HTML) for electronic viewing. If other formats are needed +...please offer to volunteer. + +

    + +

    +Other Documentation +

    + +

    +In addition to this document the following other items are recommended +reading: + +

    + +

      +
    • The standard library documentation supplied with this document + in PDF and HTML formats. + +

      +

    • +
    • The +MMA tutorial supplied with this document in pdf and html + formats. + +

      +

    • +
    • Various README files in the distribution. + +

      +

    • +
    • The Python source files. + +

      +

    • +
    + +

    + +

    +Music Notation +

    + +

    +The various snippets of standard music notation in this manual have +been prepared with the MUP program. I highly recommend this program +and use it for most of my notation tasks. MUP is available from Arkkra +Enterprises, http://www.Arkkra.com/. + +

    + +

    +Installing +MMA +

    + +

    + +MMA is a Python program developed with version 2.4 of Python. At the +very least you will need this version (or later) of Python! + +

    +To play the MIDI files you'll need a MIDI player. Pmidi, tse3play, and +many others are available for Linux systems. For Windows and Mac +systems I'm sure there are many, many choices. + +

    +You'll need a text editor like vi, emacs, etc. to create +input files. Don't use a word processor! + +

    + +MMA consists of a variety of bits and pieces: + +

    + +

      +
    • The executable Python script, mma1.4, must somewhere in your + path. For users running Windows or Mac, please check +MMA website + for details on how to install on these systems. + +

      +

    • +
    • A number of Python modules. These should all be installed under + the directory /usr/local/share/mma/MMA. See the enclosed file + INSTALL for some additional commentary. + +

      +

    • +
    • A number of library files defining standard rhythms. These + should all be installed under the directory + /usr/local/share/mma/lib/stdlib. + +

      +

    • +
    + +

    +The script install will install +MMA properly on most Linux +systems. It assumes that main script is to be installed in +/usr/local/bin and the support files in +/usr/local/share/mma. If you want an alternate location, you +can edit the paths in the script. The only supported alternate to use +is /usr/share/mma. + +

    +In addition, you can run +MMA from the directory created by +the untar. This is not recommended, but will show some of +MMA 's +stuff. In this case you'll have to execute the program file +mma.py. + +

    +You should be ``root'' (or at least, you need write permissions in +/usr/local/) to run the install script. + +

    +If you want to install +MMA on a platform other than Linux, please get the +latest updates from our website at www.mellowood.ca/mma. + +

    + +

    +Running +MMA +

    + +

    +For details on the command line operations in +MMA +see the "running" section. + +

    +To create a MIDI file you need to: + +

    + +

      +
    1. Create a text file (also referred to as the ``input file'') with + instructions which +MMA understands. This includes the chord + structure of the song, the rhythm to use, the tempo, etc. The file + can be created with any suitable text editor. + +

      +

    2. +
    3. Process the input file. From a command line the instruction: + +

      + + +
      + +
      $ mma myfile <ENTER>
      + +
      + +

      +will invoke +MMA and, assuming no errors are found, create a MIDI + file myfile.mid. + +

      +

    4. +
    5. Play the MIDI file with any suitable MIDI player. + +

      +

    6. +
    7. Edit the input file again and again until you get the perfect + track. + +

      +

    8. +
    9. Share any patterns, sequences and grooves with the author so + they can be included in future releases! +
    10. +
    + +

    +An input file consists of the following information: + +

    + +

      +
    1. +MMA directives. These include TEMPO, TIME, + VOLUME, etc. Directives. + +

      +

    2. +
    3. PATTERN, SEQUENCE and GROOVE detailed in + Patterns, + Sequences, and + Grooves. + +

      +

    4. +
    5. Music information. See Musical + Data. + +

      +

    6. +
    7. Comment lines and blank lines. See below. + +

      +

    8. +
    + +

    +Items 1 to 3 are detailed later in this manual. Please read them +before you get too involved in this program. + +

    + +

    +Comments +

    + +

    +Proper indentation, white space and comments are a +good thing--and you really should use them. But, in most cases + +MMA really doesn't care: + +

    + +

      +
    • Any leading space or tab characters are ignored, + +

      +

    • +
    • Multiple tabs and other white space are treated as single + characters, + +

      +

    • +
    • Any blank lines in the input file are ignored. + +

      +

    • +
    + +

    +Each line is initially parsed for comments. A comment is anything +following a ``//'' (2 forward slashes).1.5 +

    +Comments are stripped from the input stream. Lines starting with the +COMMENT directive are also ignored. See the +comment discussion for details. + +

    + +

    +Theory Of Operation +

    + +

    +To understand how +MMA works it's easiest to look at the initial +development concept. Initially, a program was wanted which would take +a file which looked something like: + +

    + + +
    + +
    Tempo 120 +
    +Fm +
    +C7 +
    ...
    + +
    + +

    +and end up with a MIDI file which played the specified chords over a +drum track. + +

    +Of course, after starting this ``simple'' project a lot of +complexities developed. + +

    +First, the chord/bar specifications. Just having a single chord per +bar doesn't work--many songs have more than one chord per bar. +Second, what is the rhythm of the chords? What about bass line? Oh, +and where is the drummer? + +

    +Well, things got more complex after that. At a bare minimum, the +program or interface should have the ability to: + +

    + +

      +
    • Specify multiple chords per bar, + +

      +

    • +
    • Define different patterns for chords, bass lines and + drum tracks, + +

      +

    • +
    • Have easy to create and debug input files, + +

      +

    • +
    • Provide a reusable library that a user could simply plug in, or + modify. + +

      +

    • +
    + +

    +From these simple needs +MMA was created. + +

    +The basic building blocks of +MMA are PATTERNs. A pattern is a +specification which tells +MMA what notes of a chord to play, the +start point in a bar for the chord/notes, and the duration and the +volume of the notes. + +

    + +MMA patterns are combined into SEQUENCEs. This lets you +create multi-bar rhythms. + +

    +A collection of patterns can be saved and recalled as GROOVEs. +This makes it easy to pre-define complex rhythms in library files and +incorporate them into your song with a simple two word command. + +

    + +MMA is bar or measure based (we use the words interchangeably in +this document). This means that +MMA processes your song one bar at a +time. The music specification lines all assume that you are specifying +a single bar of music. The number of beats per bar can be adjusted; +however, all chord changes must fall on a beat division (the playing +of the chord or drum note can occur anywhere in the bar). + +

    +To make the input files look more musical, +MMA supports +REPEATs and REPEATENDINGs. However, complexities like +D.S. and Coda are not internally supported (but can be +created by using the GOTO command). + +

    + +

    +Case Sensitivity +

    + +

    +Just about everything in a +MMA file is case insensitive. + +

    +This means that the command: + +

    + + +
    + +
    Tempo 120
    + +
    + +

    +could be entered in your file as: + +

    + + +
    + +
    TEMPO 120
    + +
    + +

    +or even + +

    + + +
    + +
    TeMpO 120
    + +
    + +

    +for the exact same results. + +

    +Names for patterns, and grooves are also case insensitive. + +

    +The only exceptions are the names for chords, notes in SOLOs, +and filenames. In keeping with standard chord notation, chord names +are in mixed case; this is detailed in Musical + Data. Filenames are covered in +Paths and Filenames. + +

    +


    Footnotes

    +
    +
    ...,1.1
    +
    Musical MIDI + Accompaniment and the short form +MMA in the distinctive script are + names for a program written by Bob van der Poel. The ``MIDI + Manufacturers Association, Inc.'' uses the acronym MMA, but there is + no association between the two. + +
    +
    ... +MIDI1.2
    +
    MIDI is an acronym for Musical Instrument Digital + Interface. + +
    +
    ... perspectives.1.3
    +
    The problem, all humor aside, is +that the viewpoints of a program's author and user are quite +different. The two ``see'' problems and solutions differently, and for +a user manual the programmer's view is not the best. + +
    +
    ...mma1.4
    +
    In the + distribution this is mma.py. It is renamed to save a few + keystrokes when entering the command. + +
    +
    ... slashes).1.5
    +
    The first choice for + a comment character was a single ``#'', but that sign is used for + ``sharps'' in chord notation. + +
    +

    + + +next + +up + +previous +
    + Next: Running + Up: Reference Manual + Previous: Reference Manual + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node10.html b/mma/docs/html/ref/node10.html new file mode 100644 index 0000000..01cceff --- /dev/null +++ b/mma/docs/html/ref/node10.html @@ -0,0 +1,816 @@ + + + + + +Solo and Melody Tracks + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Chord Voicing + Up: Reference Manual + Previous: Lyrics +
    +
    + + +Subsections + + + +
    + +

    + +
    +Solo and Melody Tracks +

    + +

    +So far the creation of accompaniment tracks using drum and chord +patterns has been discussed. However, there are times when chording +(and chord variations such as arpeggios) are not sufficient. +Sometimes you might want a real melody line! + +

    + +MMA has two internal track types reserved for melodic lines. They +are the SOLO and MELODY tracks. These two track types +are identical with two major exceptions: + +

    + +

      +
    • SOLO tracks are only initialized once, at start up. + Commands like SEQCLEAR are ignored by SOLO tracks. + +

      +

    • +
    • No settings in SOLO tracks are saved or restored with + GROOVE commands. + +

      +

    • +
    + +

    +These differences mean that you can set parameters for a SOLO +track in a preamble in your music file and have those settings valid +for the entire song. For example, you may want to set an instrument at +the top of a song: + +

    + + +
    + +
    Solo Voice TenorSax
    + +
    + +

    +On the other hand, MELODY tracks save and restore grooves just +like all the other available tracks. If you have the following sequence +in a song file: + +

    + + +
    + +
    Melody Voice TenorSax +
    +Groove Blues +
    ... musical data
    + +
    + +

    +no one will be surprised to find that the MELODY track +playing with the default voice (Piano). + +

    +As a general rule, MELODY tracks have been designed as a +``voice'' to accompany a predefined form defined in a +GROOVE--it is a good idea to define MELODY parameters +as part of a GROOVE. SOLO tracks are thought to be +specific to a certain song file, with their parameters defined in the +song file. + +

    +Apart from the exceptions noted above, SOLO and MELODY +tracks are identical. + +

    +Unlike the other available tracks, you do not define a sequence or +pattern for a SOLO or MELODY track. Instead, you specify +a series of notes as a RIFF pattern. For example, consider the +first two bars of ``Bill Bailey'' (the details of melody notation will +be covered later in this chapter): + +

    + + +
    + +
    Solo Riff 4c;2d;4f; +
    +F +
    +Solo Riff 4.a;8g#;4a;4c+; +
    +F
    + +
    + +

    +In this example the melody has been added to the song file. + +

    +Specifying a RIFF for each bar of your song can get tedious, so +there is a shortcut ...any data surrounded by curly brackets ``{ +}'' is interpreted as a RIFF for a SOLO or +MELODY track. This means that the above example could be +rewritten as: + +

    + + +
    + +
    F {4c;2d;4f;} +
    +F {4.a;8g#;4a;4c+;}
    + +
    + +

    +By default the note data is inserted into the SOLO track. If +more than one set of note data is present, it will be inserted into +the next track set by the AUTOSOLOTRACKS command +(here). + +

    + +

    +Note Data Format +

    + +

    +The notes in a SOLO or MELODY track are specified as a +series of ``chords''. Each chord can be a single note, or several +notes (all with the same duration). Each chord in the bar is delimited +with a single semicolon.10.1 +

    +Each chord can have several parts. All missing parts will default to +the value in the previous chord. The various parts of a chord must be +specified in the order given in the following table. + +

    +

    +
    Duration
    +
    The duration of the note. This is specified in the + same manner as chord patterns; see + here for details on how to + specify a note duration. + +

    +

    +
    Pitch
    +
    The note in standard musical notation. The lowercase + letters ``a'' to ``g'' are recognized as well as ``r'' to specify a + rest (please note the exception for Drum Solo Tracks, + here). + +

    +

    +
    Accidental
    +
    A pitch modifier consisting of a single ``#'' + (sharp), ``&'' (flat) or ``n'' (natural). Please note that an + accidental will override the current KEYSIG for the current + bar (just like in real musical notation). Unlike standard musical + notation the accidental will apply to similarly named notes + in different octaves. + +

    +Please note that when you specify a chord in +MMA you can use + either a ``b'' or a ``&'' to represent a flat sign; however, when + specifying notes for a SOLO you can only use the ``&'' + character. + +

    +

    +
    Octave
    +
    Without an octave modifier, the current octave specified + by the OCTAVE directive is used for the pitch(es). Any number + of ``-'' or ``+'' signs can be appended to a note. Each ``-'' drops + the note by an octave and each ``+'' will increase it. The base + octave begins with ``c'' below the treble clef staff. + +

    +

    +
    Volume
    +
    A volume can be specified. The volume is a string like + ``ff'' surrounded by ``$< >$'' brackets. For example, to set the + volume of a chord to ``very loud'', you could use the string + $<$ffff$>$ in the chord specification + (here) Of course, it is + probably easier to set accented beats with the ACCENT + directive (here). + +

    +

    +
    Tilde
    +
    The tilde character, ~, can appear as the + first or last item in a note sequence. As the last character it + signals that the final note duration extend past the end of the bar; + as the first character it signals to use the duration extending past + the end of the previous bar as an initial offset. For details, see + below. + +

    +

    +
    Null
    +
    You can set a ``ignore'' or ``do nothing'' chord with the + simple notation ``$< >$''. If this is the only item in the chord + then that chord will be ignored This means that no tones will be + generated, and the offset into the bar will not be changed. The use + of the notation is mainly for tilde notation with notes held over + multiple bars. + +

    +

    +
    + +

    +To make your note data more readable, you can include any number of +space and tab characters (which are ignored by +MMA ). + +

    + +
    + +
    + Solo Notation +
    + + Lost Image + +

    +
    +
    + +

    + + +
    + +
    KeySig 1b +
    +F { 4ca-; 2da-; 4fd; } +
    +F { 4.af; 8g#f; 4af; c+f; } +
    +F { 4ca-; 2da-; 4fc; } +
    +F { 1af; }
    + +
    + +

    + + +

    + +

    + +

    +This example shows a few bars of +``Bill Bailey'' with the +MMA equivalent. + +

    + +

    +Long Notes +

    + +

    +Notes tied across bar lines can be easily handled in +MMA scores. +Consider the following: + +

    +

    + Lost Image + +
    + +

    +It can be handled in three different ways in your score: + +

    + +

      +
    • + +
      + +
      F {4c;d;e;4+2f;} +
      +F {2r;2c;}
      + +
      + +

      +In this case you +MMA will generate a warning message since the + last note of the first bar ends past the end of that bar. The rest + in the second bar is used to position the half note correctly. + +

      +

    • +
    • + +
      + +
      F {4c;d;e;4+2f~}; +
      +F {2r;2c;}
      + +
      + +

      +This time a ~ character has been added to the end of + the first line. In this case it just signals that you ``know'' that + the note is too long, so no warning is printed. + +

      +

    • +
    • + +
      + +
      F {4c;d;e;4+2f~;} +
      +F {~2c;}
      + +
      + +

      +The cleanest method is shown here. The ~forces the + insertion of the extra 2 beats from the previous bar into the start + of the bar. + +

      +

    • +
    + +

    +If you have a very long note, as in this example: + +

    +

    + Lost Image + +
    + +

    +you can have both leading and ending tildes in the same chord; +however, to force +MMA to ignore the chord you need to include an +empty chord marker: + +

    + + +
    + +
    C {4c;d;e;4+2f~;} +
    +C {~<>~;} +
    +C {~2c;}
    + +
    + +

    + +MMA has some built-in error detection which will signal problems if +you use a tilde at the end of a line which doesn't have a note held +past the end of the current bar or if you use a tilde to start a bar +which doesn't have one at the end of the previous bar. + +

    + +

    +Using Defaults +

    +The use of default values can be a great time-saver, and lead to +confusion! For example, the following all generate four quarter note +``f''s: + +

    + + +
    + +
    Solo Riff 4f; 4f; 4f; 4f; +
    +Solo Riff 4f; f; f; f; +
    +Solo Riff 4f; 4; 4; 4; +
    +Solo Riff 4f; ; ; ;
    + +
    + +

    + +

    +Other Commands +

    + +

    +Most of the timing and volume commands available in other tracks also +apply to SOLO and MELODY tracks. Important commands to +consider include ARTICULATE, VOICE and OCTAVE. +Also note that TRANSPOSE is applied to your note data. + +

    + +

    +
    +KeySig +

    + +

    +If you are including SOLO or MELODY tracks you should +set the key signature for the song: + +

    + + +
    + +
    KeySig 2b
    + +
    + +

    +The argument consists of a single digit ``0'' to ``7'' followed by a +``b'' or ``&'' for flat keys or a ``#'' for sharp keys. + +

    +As an alternate, you can use a musical name like ``F'' or ``G#''. + +

    +The optional keywords ``Major'' or ``Minor'' (these can be abreviated +to ``Maj'' or ``Min'' ... and case doesn't count) can be added to this +command. This will accomplish two things: + +

    + +

      +
    1. The MIDI track Key Signature event will be set to reflect minor + or major. + +

      +

    2. +
    3. If you are using a musical name the proper key will be used. + +

      +

    4. +
    + +

    +Setting the key signature effects the notes used in SOLO or +MELODY tracks and sets a MIDI Key Signature event.10.2 +

    +To summarize, the following are all valid KEYSIG directives: + +

    + + +
    + +
    KeySig 2# Major +
    +KeySig 1b +
    +KeySig 0b Min +
    +KeySig F Min +
    +KeySig A Major
    + +
    + +

    + +

    +
    +AutoSoloTracks +

    + +

    +When a ``{ }'' expression is found in a chord line, it is assumed to +be note data and is treated as a RIFF. You can have any number +of ``{ }'' expressions in a chord line. They will be assigned to the +tracks specified in the AUTOSOLOTRACKS directive. + +

    +By default, four tracks are assigned: Solo, Solo-1, +Solo-2, and Solo-3. This order can be changed: + +

    + + +
    + +
    AutoSoloTracks Melody-Oboe Melody-Trumpet Melody-Horn
    + +
    + +

    +Any number of tracks can be specified in this command, but they must +all be SOLO or MELODY tracks. You can reissue this +command at any time to change the assignments. + +

    +The list set in this command is also used to ``fill out'' melody lines +for tracks set as HARMONYONLY. Again, an example: + +

    + + +
    + +
    AutoSoloTracks Solo-1 Solo-2 Solo-3 Solo-4 +
    +Solo-2 HarmonyOnly 3Above +
    +Solo-3 HarmonyOnly 8Above
    + +
    + +

    +Of course, some voicing is also set ...and a chord line: + +

    + + +
    + +
    C {4a;b;c;d;}
    + +
    + +

    +The note data {4a;b;c;d;} will be set to the Solo-1 +track. But, if you've not set any other note data by way of +RIFF commands to Solo-2 and Solo-3, the note data +will also be copied to these two tracks. Note that the track +Solo-4 is unaffected since it is not a +HARMONYONLY track. This feature can be very useful in creating +harmony lines with the harmonies going to different instruments. The +supplied file egs/harmony.mma shows an example. + +

    + +

    +
    +Drum Solo Tracks +

    + +

    +A solo or melody track can also be used to create drum solos. The +first thing to do is to set a track as a drum solo type: + +

    + + +
    + +
    Solo-MyDrums DrumType
    + +
    + +

    +This will create a new SOLO track with the name +Solo-MyDrums and set its ``Drum'' flag. If the track already +exists and has data in it, the command will fail. The MIDI channel 10 +is automatically assigned to all tracks created in this manner. You +cannot change a ``drum'' track back to a normal track. + +

    +These is no limit to the number of SOLO or MELODY tracks +you can create ...and it probably makes sense to have several +different tracks if you are creating anything beyond a simple drum +pattern. + +

    +Tracks with the ``drum'' setting ignore TRANSPOSE and +HARMONY settings. + +

    +The specification for pitches is different in these tracks. Instead of +standard notation pitches, you must specify a series of drum tone +names or MIDI values. If you want more than one tone to be sounded +simultaneously, create a list of tones separated by commas. + +

    +Some examples: + +

    + + +
    + +
    Solo-MyDrums Riff 4 SnareDrum1; ; r ; SnareDrum1;
    + +
    + +

    +would create a snare hit on beats 1, 2 and 4 of a bar. Note how the +second hit uses the default tone set in the first beat. + +

    + + +
    + +
    Solo-MyDrums Riff 8,38;;;;
    + +
    + +

    +creates 4 hits, starting on beat 1. Instead of ``names'' +MIDI values have been used (``38'' and ``SnareDrum1'' are identical). Note +how ``,'' is used to separate the initial length from the first tone. + +

    + + +
    + +
    Solo-MyDrums Riff 4 SnareDrum1,53,81; r; 4 SideKick ;
    + +
    + +

    +creates a ``chord'' of 3 tones on beat 1, a rest on beat 2, and a +``SideKick'' on beat 3. + +

    +Using MIDI values instead of names lets you use the full range of note +values from 0 to 127. Not all will produce valid tones on all synths. + +

    +To make the use of solo drum tracks a bit easier, you can use the the +TONE command to set the default drum tone to use (by default +this is a SnareDrum. If you do not specify a tone to use in a solo the +default will be used. + +

    +You can access the default tone by using the special Tone ``*''. In +the following example: + +

    + + +
    + +
    Begin Solo-Block +
      DrumType +
      Tone LowWoodBlock +
    +End +
       ... +
    +Solo-Block Riff 4r; SnareDrum; * ; ; +
       ... +
    +Solo-Block Riff 4;;;;
    + +
    + +

    +The first solo created will have a rest on beat 1, a SnareDrum on beat +2 and LowWoodBlock on beats 3 and 4. The second will have LowWoodBlock +on each beat. + +

    + +

    +


    Footnotes

    +
    +
    ... semicolon.10.1
    +
    I have borrowed heavily from the + notation program MUP for the syntax used here. For notation I highly + recommend MUP and use it for most of my notation tasks, including + the creation of the score snippets in this manual. MUP is available + from Arkkra Enterprises, http://www.Arkkra.com/. + +
    +
    ... event.10.2
    +
    For + the most part, MIDI Key Signature events are ignored by playback + programs. However, they may be used in other MIDI programs + which handle notation. + +
    +

    + + +next + +up + +previous +
    + Next: Chord Voicing + Up: Reference Manual + Previous: Lyrics + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node11.html b/mma/docs/html/ref/node11.html new file mode 100644 index 0000000..acb5951 --- /dev/null +++ b/mma/docs/html/ref/node11.html @@ -0,0 +1,1306 @@ + + + + + +Chord Voicing + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Harmony + Up: Reference Manual + Previous: Solo and Melody Tracks +
    +
    + + +Subsections + + + +
    + +

    + +
    +Chord Voicing +

    + +

    +In music, a chord is simply defined as two more notes played +simultaneously. Now, this doesn't mean that you can play just any two +or three notes and get a chord which sounds nice--but whatever you do +get will be a chord of some type. And, to further confuse the unwary, +different arrangements of the same notes sound better (or worse) in +different musical situations. + +

    +As a simple example, consider a C major chord. Built on the first, +third and fifth notes of a C major scale it can be manipulated into a +variety of sounds: + +

    +

    + Lost Image + +
    + +

    +These are all C major chords ...but they all have a different +sound or color. The different forms a chord can take are called +``voicings''. Again, this manual is not intended to be a primer on +musical theory--that's a subject for which lots of lessons with your +favorite music teacher is recommended. You'll need a bit of +basic music theory if you want to understand how and why +MMA creates its tracks. + +

    +The different options in this chapter effect not only the way chords +are constructed, but also the way bass lines and other tracks are +formed. + +

    +There are generally two ways in +MMA to take care of voicings. + +

    + +

      +
    1. use +MMA 's extensive VOICING options, most likely with + the ''Optimal'' voicing algorithm, + +

      +

    2. +
    3. do everything by yourself with the commands INVERT and + COMPRESS. + +

      +

    4. +
    + +

    +The commands LIMIT and DUPROOT may be used independently +for both variants. + +

    + +

    +Voicing +

    + +

    +The VOICING command is used to set the voicing mode and several +other options relating to the selected mode. The command needs to have +a CHORD track specified and a series of Option=Value pairs. For +example: + +

    + + +
    + +
    Chord-Piano Voicing Mode=Optimal Rmove=10 Range=9
    + +
    + +

    +In the following sections all the options available will be covered. + +

    + +

    +Voicing Mode +

    + +

    +The easiest way to deal with chord voicings is via the +VOICING MODE=XX option. + +

    +When choosing the inversion of a chord to play an accompanist will +take into consideration the style of the piece and the chord +sequences. In a general sense, this is referred to as ``voicing''. + +

    +A large number of the library files have been written to take +advantage of the following voicing commands. However, not all styles +of music take well to the concept. And, don't forget about the other +commands since they are useful in manipulating bass lines, as well as +other chord tracks (e.g., sustained strings). + +

    + +MMA has a variety of sophisticated, intelligent +algorithms11.1 to deal with voicing. + +

    +As a general rule you should not use the INVERT and +COMPRESS commands in conjunction with the VOICING +command. If you do, you may create beautiful sounds. But, the results +are more likely to be less-than-pleasing. Use of voicing and other +combinations will display various warning messages. + +

    +The main command to enable voicings is: + +

    + + +
    + +
    Chord Voicing Mode=Type
    + +
    + +

    +As mentioned above, this command can only be applied to CHORD +tracks. Also note that this effects all bars in the sequence ... +you cannot have different voicings for different bars in the sequence +(attempting to do this would make no sense). + +

    +The following MODE types are available: + +

    +

    +
    Optimal
    +
    A basic algorithm which automatically chooses the best + sounding voicing depending on the voicing played before. Always try + this option before anything else. It might work just fine without + further work. + +

    +The idea behind this algorithm is to keep voicings in a sequence + close together. A pianist leaves his or her fingers where they are, + if they still fit the next chord. Then, the notes closest to the + fingers are selected for the next chord. This way characteristic + notes are emphasized. + +

    +

    +
    Root
    +
    This Option may for example be used to turn off + VOICING within a song. VOICING MODE=ROOT means nothing + else than doing nothing, leaving all chords in root position. + +

    +

    +
    None
    +
    This is the same as the ROOT option. + +

    +

    +
    Invert
    +
    Rather than basing the inversion selection on an + analysis of past chords, this method quite stupidly tries to keep + chords around the base point of ``C'' by inverting ``G'' and ``A'' + chords upward and ``D'', ``E'' and ``F'' downward. The chords are + also compressed. Certainly not an ideal algorithm, but it can be + used to add variety in a piece. + +

    +

    +
    Compressed
    +
    Does the same as the stand-alone COMPRESS + command. Like ROOT, it is only added to be used in some parts + of a song where VOICING MODE=OPTIMAL is used. + +

    +

    +
    + +

    + +

    +Voicing Range +

    + +

    +To get wider or closer voicings, you may define a range for the +voicings. This can be adjusted with the RANGE option: + +

    + + +
    + +
    Chord-Guitar Voicing Mode=Optimal Range=12
    + +
    + +

    +In most cases the default value of 12 should work just fine. But, you +may want to fine tune ...it's all up to you. This command only +effects chords created with MODE=OPTIMAL. + +

    + +

    +Voicing Center +

    + +

    +Just minimizing the Euclidean distance between chords doesn't do the +trick as there could be runaway progressions that let the voicings +drift up or down infinitely. + +

    +When a chord is ``voiced'' or moved to a new position, a ``center +point'' must be used as a base. By default, the fourth degree of the +scale corresponding to the chord is a reasonable choice. However, you +can change this with: + +

    + + +
    + +
    Chord-1 Voicing Center=<value>
    + +
    + +

    +The value in this command can be any number in the range 0 to +12. Try different values. The color of your whole song might change. + +

    +Note that the value is the note in the scale, not a chord-note position. + +

    +This command only effects chords created with MODE=OPTIMAL. + +

    + +

    +Voicing Move +

    + +

    +To intensify a chord progression you may want to have ascending or +descending movement of voicings. This option, in conjunction with the +DIR optional (see below) sets the number of bars over which a +movement is done. + +

    +For the MOVE option to have any effect you must also set the +direction to either -1 or 1. Be careful that you don't force the chord +too high or low on the scale. Use of this command in a REPEAT +section can cause unexpected results. For this reason you should +include a SEQ command at the beginning of repeated sections of +your songs. + +

    +In most cases the use of this command is limited to a section of a +song, its use is not recommended in groove files. You might want to do +something like this in a song: + +

    + + +
    + +
    ..select groove with voicing +
    +chords.. +
    +Chord-Piano Voicing Move=5 Dir=1 +
    +more chords.. +
    +Chord-Piano Voicing Move=5 Dir=-1 +
    +more chords..
    + +
    + +

    + +

    +Voicing Dir +

    + +

    +This option is used in conjunction with the MOVE option to set +the direction (-1 or 1) of the movement. + +

    + +

    +Voicing Rmove +

    + +

    +As an alternate to movement in a specified direction, random movement +can add some color and variety to your songs. The command option is +quite useful (and safe to use) in groove files. The argument for this +option is a percentage value specifying the frequency to apply a move +in a random direction. + +

    +For example: + +

    + + +
    + +
    Chord-3 Voicing Mode=Optimal Rmove=20
    + +
    + +

    +would cause a movement (randomly up or down) in 20% of the bars. As +noted earlier, using explicit movement instructions can move the chord +into an undesirable range or even ``off the keyboard''; however, the +algorithm used in RMOVE has a sanity check to ensure that the chord +center position remains, approximately, in a two octave range. + +

    + +

    +
    +ChordAdjust +

    + +

    +The actual notes used in a chord are derived from a table which +contains the notes for each variation of a ``C'' chord--this data is +converted to the desired chord by adding or subtracting a constant +value according to the following table: + +

    +

    + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    G$\flat$-6
    G-5
    G$\sharp$-4
    A$\flat$-4
    A-3
    A$\sharp$-2
    B$\flat$-2
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    B-1
    C$\flat$-1
    B$\sharp$0
    C0
    C$\sharp$1
    D$\flat$1
    D2
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + +
    D$\sharp$3
    E$\flat$3
    E4
    F$\flat$4
    E$\sharp$5
    F5
    F$\sharp$6
    +
    + + +
    + +
    + +

    +This means that when +MMA encounters an ``Am'' chord it adjusts the +notes in the chord table down by 3 MIDI values; an ``F'' chord is +adjusted 5 MIDI values up. This also means that ``A'' chords will +sound lower than ``F'' chords. + +

    +In most cases this works just fine; but, there are times when the +``F'' chord might sound better lower than the ``A''. You can +force a single chord by prefacing it with a single ``-'' or ``+'' +, details here. But, if the +entire song needs adjustment you can use CHORDADJUST +command to raise or lower selected chord pitches: + +

    + + +
    + +
    ChordAdjust E=-1 F=-1 Bb=1
    + +
    + +

    +Each item in the command consists of a pitch (``B$\flat$'', ``C'', +etc.) an ``='' and an octave specifier (-1, 0 or 1). The pitch values +are case sensitive and must be in upper case; there must not be +a space on either side of the ``=''. + +

    +To a large extent the need for octave adjustments depends on the chord +range of a song. For example, the supplied song ``A Day In The Life Of +A Fool'' needs all ``E'' and ``F'' chords to be adjusted down an +octave. + +

    +The value ``0'' will reset the adjustment to the original value; +setting a value a second time has no effect. + +

    + +

    +
    +Compress +

    + +

    +When +MMA grabs the notes for a chord, the notes are spread out from +the root position. This means that if you specify a ``C13'' you will +have an ``A'' nearly 2 octaves above the root note as part of the +chord. Depending on your instrumentation, pattern, and the chord +structure of your piece, notes outside of the ``normal'' single octave +range for a chord may sound strange. + +

    + + +
    + +
    Chord Compress 1
    + +
    + +

    +Forces +MMA to put all chord notes in a single octave range. + +

    +This command is only effective in CHORD and ARPEGGIO +tracks. A warning message is printed if it is used in other contexts. + +

    +Notes: COMPRESS takes any value between 1 and 5 as arguments +(however, some values will have no effect as detailed above). You can +specify a different COMPRESS for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Compress 1 / 0 /
    + +
    + +

    +To restore to its default (off) setting, use a ``0'' as the argument. + +

    +For a similar command, with different results, see the LIMIT +command (here). + +

    + +

    +
    +DupRoot +

    + +

    +To add a bit of fullness to chords, it is quite common of keyboard +players to duplicate the root tone of a chord into a lower (or higher) +octave. This is accomplished in +MMA with the command: + +

    + + +
    + +
    DupRoot -1 1 -1 1
    + +
    + +

    +The command determines whether or not the root tone of a chord is +duplicated in another octave. By default notes are not added. A value +of -1 will add a note one octave lower than the root note, -2 will add +the tone 2 octaves lower, etc. Similarly, the value of 1 will add a +note one octave higher than the root tone, etc. + +

    +Only the values -9 to 9 are permitted. + +

    +The volume used for the generated note is an adjusted average of the +notes in the chord. This volume is always less than the chord +notes--which is probably what you want. If you want a loud bass note, +create a second track (probably a BASS track) with the +appropriate pattern. + +

    +Different values can be used in each bar of the sequence. + +

    +The option is reset to 0 after all SEQUENCE or SEQCLEAR +commands. + +

    +The DUPROOT command is only valid in CHORD tracks. + +

    + +

    +
    +Invert +

    + +

    +By default +MMA uses chords in the root position. By example, the +notes of a C major chord are C, E and G. Chords can be inverted +(something musicians do all the time). Sticking with the C major +chord, the first inversion shifts the root note up an octave and the +chord becomes E, G and C. The second inversion is G, C and E. + +

    + +MMA extends the concept of inversion a bit by permitting the shift +to be to the left or right, and the number of shifts is not limited. +So, you could shift a chord up several octaves by using large invert +values.11.2 +

    +Inversions apply to each bar of a sequence. So, the following is a good example: + +

    + + +
    + +
    SeqSize 4 +
    +Chord-1 Sequence STR1 +
    +Chord-1 Invert 0 1 0 1
    + +
    + +

    +Here the sequence pattern size is set to 4 bars and the pattern +for each bar in the Chord-1 track is set to ``STR1''. Without the next line, +this would result in a rather boring, repeating pattern. But, the +Invert command forces the chord to be in the root position for the +first bar, the first inversion for the second, etc. + +

    +You can use a negative Invert value: + +

    + + +
    + +
    Chord-1 Invert -1
    + +
    + +

    +In this case the C major chord becomes G, C and E. + +

    +Note that using fewer Invert arguments than the current sequence size +is permitted. +MMA simply expands the number of arguments to the +current sequence size. You may use a ``/'' for a repeated value. + +

    +A SEQUENCE or CLEARSEQ command resets INVERT to 0. + +

    +This command on has an effect in CHORD and ARPEGGIO +tracks. And, frankly, ARPEGGIOs sound a bit odd with +inversions. + +

    +If you use a large value for INVERT you can force the notes out +of the normal MIDI range. In this case the lowest or highest possible +MIDI note value will be used. + +

    + +

    +
    +Limit +

    + +

    +If you use ``jazz'' chords in your piece, some people might not like +the results. To some folks, chords like 11th, 13th, and variations +have a dissonant sound. And, sometimes they are in a chart, but don't +really make sense. The LIMIT command can be used to set the +number of notes of a chord used. + +

    +For example: + +

    + + +
    + +
    Chord Limit 4
    + +
    + +

    +will limit any chords used in the CHORD track to the first 4 +notes of a chord. So, if you have a C11 chord which is C, E, G, +B$\flat$, D, and F, the chord will be truncated to C, E, G and +B$\flat$. + +

    +This command only applies to CHORD and ARPEGGIO tracks. +It can be set for other tracks, but the setting will have no effect. + +

    +Notes: LIMIT takes any value between 0 and 8 as an argument. +The ``0'' argument will disable the command. This command applies to +all chords in the sequence--only one value can be given in the +command. + +

    +To restore to its default (off) setting, use a ``0'' as the argument. + +

    +For a similar command, with different results, see the COMPRESS +command (here). + +

    + +

    +
    +NoteSpan +

    + +

    +Many instruments have a limited range. For example, the bass section +of an accordion is limited to a single octave11.3To emulate these sounds it is a simple matter of limiting +MMA 's +output to match the instrument. For example, in the ``frenchwaltz'' +file you will find the directive: + +

    + + +
    + +
    Chord NoteSpan 48 59
    + +
    + +

    +which forces all CHORD tones to the single octave represented +by the MIDI values 48 though 59. + +

    +This command is applied over other voicing commands like OCTAVE +and RANGE and even TRANSPOSE. Notes will still be +calculated with respect to these settings, but then they'll be forced +into the limited NOTESPAN. + +

    +NOTESPAN expects two arguments: The first is the range start, the +second the range end (first and last notes to use). The values are +MIDI tones and must be in the range 0 to 127. The first value must be +less than the second, and the range must represent at least one full +octave (12 notes). It can be applied to all tracks except DRUM. + +

    + +

    +
    +Range +

    + +

    +For ARPEGGIO and SCALE tracks you can specify the number +of octaves used. The effects of the RANGE command is slightly +different between the two. + +

    +SCALE: Scale tracks, by default, create three octave scales. +The RANGE value will modify this to the number of octaves +specified. For example: + +

    + + +
    + +
    Scale Range 1
    + +
    + +

    +will force the scales to one octave. A value of 4 would create 4 +octave scales, etc. + +

    +You can use fractional values when specifying RANGE. For example: + +

    + + +
    + +
    Scale Range .3
    + +
    + +

    +will create a scale of 2 notes.11.4 And, + +

    + + +
    + +
    Scale Range 1.5
    + +
    + +

    +will create a scale of 10 notes. Now, this gets a bit more confusing for you if +you have set SCALETYPE CHROMATIC. In this case a RANGE 1 would +generate 12 notes, and RANGE 1.5 18. + +

    +Partial scales are useful in generating special effects. + +

    +ARPEGGIO: Normally, arpeggios use a single octave.11.5The RANGE command specifies the number of octaves11.6 to use. A fractional value can be used; the exact result +depends on the number of notes in the current chord. + +

    +In all cases the values of ``0'' and ''1'' have the same effect. + +

    +For both SCALE and ARPEGGIO there will always be a minimum of +two notes in the sequence. + +

    + +

    +
    +DefChord +

    + +

    + +MMA comes with a large number of chord types already defined. In +most cases, the supplied set (see this list) is sufficient for all the ``modern'' or +``pop'' charts normally encountered. However, there are those times +when you want to do something else, or something different. + +

    +You can define additional chord types at any time, or redefine +existing chord types. The DEFCHORD command makes no distinction +between a new chord type or a redefinition, with the exception that a +warning message is printed for the later. + +

    +The syntax of the command is quite strict: + +

    + + +
    + +
    DefChord NAME (NoteList) (ScaleList)
    + +
    + +

    +where: + +

    + +

      +
    • Name can be any string, but cannot contain a ``/'', ``>'' or + space. It is case sensitive. Examples of valid names include + ``dim'', ``NO3'' and ``foo-12-xx''. + +

      +

    • +
    • NoteList is a comma separated list of note offsets + (actually MIDI note values), all of which are enclosed in a set of + ``()''s. There must be at least 2 note offsets and no more than 8 + and all values must be in the range 0 to 24. Using an existing chord + type, a ``7'' chord would be defined with (0, 4, 7, 10). In the case + of a C7 chord, this translates to the notes (c, e, g, b$\flat$). + +

      +

    • +
    • ScaleList is a list of note offsets (again, MIDI note + values), all of which are enclosed in a set of ``()''s. There must + be exactly 7 values in the list and all values must be in the range + 0 to 24. Following on the C7 example above, the scale list would be + (0, 2, 4, 5, 7, 9, 10) or the notes (c, d, e, f, g, a, b$\flat$). + +

      +

    • +
    + +

    +Some examples might clarify. First, assume that you have a section of +your piece which has a major chord, but you only want the root and +fifth to sound for the chords and you want the arpeggios and bass +notes to only use the root. You could create new patterns, but +it's just as easy to create a new chord type. + +

    + + +
    + +
    DefChord 15 (0,4) (0, 0, 0, 0, 0, 0, 0) +
    +15 C / G / +
    +16 C15 / G15
    + +
    + +

    +In this case a normal Major chords will be used in line 15. In line 16 +the new ``15'' will be used. Note the trick in the scale: by setting +all the offsets to ``0'' only the root note is available to the +WALK and BASS tracks. + +

    +Sometimes you'll see a new chord type that +MMA doesn't know. You +could write the author and ask him to add this new type, but if it is +something quite odd or rare, it might be easier to define it in your +song. Let's pretend that you've encountered a ``Cmaj12'' A reasonable +guess is that this is a major 7 with an added 12th (just the 5th up an +octave). You could change the ``maj12'' part of the chord to a ``M7'' +or ``maj7'' and it should sound fine. But: + +

    + + +
    + +
    DefChord maj12 (0, 4, 7, 11, 19) (0, 2, 4, 5, 7, 9, 11)
    + +
    + +

    +is much more fun. Note a few details: + +

    + +

      +
    • The name ``maj12'' can be used with any chord. You can have + ``Cmaj12'' or G$\flat$maj12''. + +

      +

    • +
    • ``maj12'' a case sensitive name. The name ``Maj12'' is quite + different (and unknown). + +

      +

    • +
    • A better name might be ``maj(add12)''. + +

      +

    • +
    • The note and scale offsets are MIDI values. They are easy to + figure if you think of the chord as a ``C''. Just count off notes + from ``C'' on a keyboard (C is note 0). + +

      +

    • +
    • Do Not include a chord name (ie: C or B$\flat$) in the + definition. Just the type. + +

      +

    • +
    + +

    +The final example handles a minor problem in +MMA and ``diminished'' +chords. In most of the music the author of +MMA encounters, the +marking ``dim'' on a chord usually means a ``diminished 7th''. So, +when +MMA initializes it creates a copy of the ``dim7'' and calls it +``dim''. But, some people think that ``dim'' should reference a +``diminished triad''. It's pretty easy to change this by creating a +new definition for ``dim'': + +

    + + +
    + +
    DefChord dim (0, 3, 6) (0, 2, 3, 5, 6, 8, 9 )
    + +
    + +

    +In this example the scale notes use the same notes as those in a +``dim7''. You might want to change the B$\flat{}\flat$ (9) to B$\flat$ +(10) or B (11). If you really disagree with the choice to make a dim7 +the default you could even put this in a mmarc file. + +

    +It is even easier to use the non-standard notation ``dim3'' to specify +a diminished triad. + +

    + +

    +PrintChord +

    + +

    +This command can be used to make the create of custom chords a bit +simpler. Simply pass one or more chord types after the command and +they will be displayed on your terminal. Example: + +

    + + +
    + +
    PrintChord m M7 dim
    + +
    + +

    +in a file should display: + +

    + + +
    + +
    m : (0, 3, 7) (0, 2, 3, 5, 7, 9, 11) Minor triad. +
    +M7 : (0, 4, 7, 11) (0, 2, 4, 5, 7, 9, 11) Major 7th. +
    +dim : (0, 3, 6, 9) (0, 2, 3, 5, 6, 8, 9) Diminished. +MMA assumes a + diminished 7th.
    + +
    + +

    +From this you can cut and paste, change the chord or scale and insert +the data into a DEFCHORD command. + +

    + +

    +Notes +

    + +

    + +MMA makes other adjustments on-the-fly to your chords. This is done +to make the resulting sounds ``more musical'' ...to keep life +interesting, the definition of ``more musical'' is quite elusive. The +following notes will try to list some of the more common adjustments +made ``behind your back''. + +

    + +

      +
    • Just before the notes (MIDI events) for a chord are generated + the first and last notes in the chord are compared. If they are a + separated by a half-step (or 1 MIDI value) or an octave plus + half-step, the volume of the first note is halved. This happens in + chords such as a Major-7th or Flat-9th. If the adjustment is + not done the dissonance between the two tones overwhelms the ear. + +

      +

    • +
    +

    Footnotes

    +
    +
    ... +algorithms11.1
    +
    Great thanks are due to Alain Brenzikofer who not + only pressured me into including the VOICING options, but + wrote a great deal of the actual code. + +
    +
    ... +values.11.2
    +
    The term ``shift'' is used here, but that's not + quite what +MMA does. The order of the notes in the internal buffer + stays the same, just the octave for the notes is changed. So, if the + chord notes are ``C E G'' with the MIDI values ``0, 4, 7'' an invert + of 1 would change the notes to ``C$^{2}$ E G'' and the MIDI values + to ``12, 4, 7''. + +
    +
    ... octave11.3
    +
    Some accordions + have ``freebass'' switches which overcomes this, but that is the + exception. + +
    +
    ... notes.11.4
    +
    Simple math here: take the number of notes in a scale (7) and +multiply by .3. Take the integer result as the number of notes. + +
    +
    ... octave.11.5
    +
    Not quite true: they +use whatever notes are in the chord, which might exceed an octave span. + +
    +
    ... octaves11.6
    +
    Again, not quite true: the +command just duplicates the arpeggio notes the number of times specified in the +RANGE setting. + +
    +

    + + +next + +up + +previous +
    + Next: Harmony + Up: Reference Manual + Previous: Solo and Melody Tracks + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node12.html b/mma/docs/html/ref/node12.html new file mode 100644 index 0000000..a2ea753 --- /dev/null +++ b/mma/docs/html/ref/node12.html @@ -0,0 +1,344 @@ + + + + + +Harmony + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Tempo and Timing + Up: Reference Manual + Previous: Chord Voicing +
    +
    + + +Subsections + + + +
    + +

    + +
    +Harmony +

    + +

    + +MMA can generate harmony notes for you ...just like hitting two +or more keys on the piano! And you don't have to take lessons. + +

    +Automatic harmonies are available for the following track types: Bass, +Walk, Arpeggio, Scale, Solo and Melody. + +

    +Just in case you are thinking that +MMA is a wonderful musical +creator when it comes to harmonies, don't be fooled. +MMA 's ideas of +harmony are quite facile. It determines harmony notes by finding a +note lower or higher than the current note being sounded within the +current chord. And its notion of ``open'' is certainly not that of +traditional music theory. But, the sound isn't too bad. + +

    + +

    +
    +Harmony +

    + +

    +To enable harmony notes, use a command like: + +

    + + +
    + +
    Solo Harmony 2
    + +
    + +

    +You can set a different harmony method for each bar in your sequence. + +

    +The following are valid harmony methods: + +

    +
    2 or 2Below
    +
    Two part harmony. The harmony note + selected is lower (on the scale). + +

    +

    +
    2Above
    +
    The same as ``2'', but the harmony note is raised an + octave. + +

    +

    +
    3 or 3Below
    +
    Three part harmony. The harmony notes + selected are lower. + +

    +

    +
    3Above
    +
    The same as ``3'', but both notes are raised an + octave. + +

    +

    +
    Open or OpenBelow
    +
    Two part harmony, however the gap + between the two notes is larger than in ``2''. + +

    +

    +
    OpenAbove
    +
    Same as ``Open'', but the added note is above the + original. + +

    +

    +
    8 or 8Below
    +
    A note 1 octave lower is added. + +

    +

    +
    8Above
    +
    A note 2 octave higher is added. + +

    +

    +
    16 or 16Below
    +
    A single note two octaves below is + added. + +

    +

    +
    16Above
    +
    A single note two octaves above are added. + +

    +

    +
    24 or 24Below
    +
    A single note three octaves below is + added. + +

    +

    +
    24Above
    +
    A single note three octaves above is added. + +

    +

    +
    + +

    +You can combine any of the above harmony modes by using a ``+''. For +example: + +

    +
    OPEN+8Below
    +
    will produce harmony notes with an ``Open'' + harmony and a note an octave below the current note. + +

    +

    +
    3Above+16
    +
    will generate 2 harmony notes above the current + note plus a note 2 octaves below. + +

    +

    +
    8Below+8Above+16Below
    +
    will generate 3 notes: one 2 octaves + below the current, one an octave below, and one an octave above. + +

    +

    +
    + +

    +There is no limit to the number of modes you can concatenate. Any +duplicate notes generated will be ignored. + +

    +All harmonies are created using the current chord. + +

    +To disable harmony use a ``0'', ``-'' or ``None''. + +

    +Be careful in using harmonies. They can make your song sound heavy, +especially with BASS notes (applying a different volume may +help). + +

    +The command has no effect in DRUM or CHORD tracks. + +

    + +

    +
    +HarmonyOnly +

    + +

    +As a added feature to the automatic harmony generation discussed in +the previous section, it is possible to set a track so that it +only plays the harmony notes. For example, you might want to +set up two arpeggio tracks with one playing quarter notes on a piano +and a harmony track playing half notes on a violin. The following +snippet is extracted from the song file ``Cry Me A River'' and sets up +2 different choir voices: + +

    + + +
    + +
    Begin Arpeggio +
        Sequence A4 +
        Voice ChoirAahs +
        Invert 0 1 2 3 +
        SeqRnd +
        Octave 5 +
        RSkip 40 +
        Volume p +
        Articulate 99 +
    +End +
                 +
    +Begin Arpeggio-2 +
        Sequence A4 +
        Voice VoiceOohs +
        Octave 5 +
        RSkip 40 +
        Volume p +
        Articulate 99 +
        HarmonyOnly Open +
    +End
    + +
    + +

    +Just like the HARMONY command, above, you can have different +settings for each bar in your sequence. Setting a bar (or the entire +sequence) to '`-'' or ``0'' disables both the HARMONY and +HARMONYONLY settings. + +

    +The command has no effect in DRUM or CHORD tracks. + +

    +If you want to use this feature with SOLO or MELODY +tracks you can duplicate the notes in your RIFF or in-line +notation or with the AUTOHARMONYTRACKS + COMMAND. + +

    + +

    +
    +HarmonyVolume +

    + +

    +By default, +MMA will use a volume (velocity) of 80% of that used by +the original note for all harmony notes it generates. You can change +this with the the HARMONYVOLUME command. For example: + +

    + + +
    + +
    Begin Solo +
      Voice JazzGuitar +
      Harmony Open +
      HarmonyVolume 80 +
    +End
    + +
    + +

    +You can specify different values for each bar in the sequence. The +values are percentages and must be greater than 0 (large values works +just fine if you want the harmony louder than the original). The +command has no effect in DRUM or CHORD tracks. +


    + + +next + +up + +previous +
    + Next: Tempo and Timing + Up: Reference Manual + Previous: Chord Voicing + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node13.html b/mma/docs/html/ref/node13.html new file mode 100644 index 0000000..300c4b4 --- /dev/null +++ b/mma/docs/html/ref/node13.html @@ -0,0 +1,882 @@ + + + + + +Tempo and Timing + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Swing + Up: Reference Manual + Previous: Harmony +
    +
    + + +Subsections + + + +
    + +

    + +
    +Tempo and Timing +

    + +

    + +MMA has a rich set of commands to adjust and vary the timing of your +song. + +

    + +

    +Tempo +

    + +

    +The tempo of a piece is set in Beats per Minute with the ``Tempo'' +directive. + +

    + + +
    + +
    Tempo 120
    + +
    + +

    +sets the tempo to 120 beats/minute. You can also use the tempo command +to increase or decrease the current rate by including a leading ``+'', +``-'' or ``*'' in the rate. For example (assuming the current rate is +120): + +

    + + +
    + +
    Tempo +10
    + +
    + +

    +will increase the current rate to 130 beats/minute. + +

    +The tempo can be changed series of beats, much like a rit. or acc. in +real music. Assuming that a time signature of 4/4, the current tempo +is 120, and there are 4 beats in a bar, the command: + +

    + + +
    + +
    Tempo 100 1
    + +
    + +

    +will cause 4 tempo entries to be placed in the current bar (in the +MIDI meta track). The start of the bar will be 115, the 2nd beat will +be at 110, the 3rd at 105 and the last at 100. + +

    +You can also vary an existing rate using a ``+'', ``-'' or ``*'' in +the rate. + +

    +You can vary the tempo over more than one bar. For example: + +

    + + +
    + +
    Tempo +20 5.5
    + +
    + +

    +tells +MMA to increase the tempo by 20 beats per minute and to step +the increase over the next five and a half bars. Assuming a start +tempo of 100 and 4 beats/bar, the meta track will have a tempo +settings of 101, 102, 103 ...120. This will occur over 22 beats +(5.5 bars * 4 beats) of music. + +

    +Using the multiplier is handy if you are switching to ``double time'': + +

    + + +
    + +
    Tempo *2
    + +
    + +

    +and to return: + +

    + + +
    + +
    Temp *.5
    + +
    + +

    +Note that the ``+'', ``-'' or ``*'' sign must not be separated +from the tempo value by any spaces. The value for TEMPO can be +any value, but will be converted to integer for the final setting. + +

    + +

    +
    +Time +

    + +

    + +MMA doesn't really understand time signatures. It just cares about +the number of beats in a bar. So, if you have a piece in +4/4 time you would use: + +

    + + +
    + +
    Time 4
    + +
    + +

    +For 3/4 use: + +

    + + +
    + +
    Time 3
    + +
    + +

    +For 6/8 you'd probably want either ``2'' or ``6''. + +

    +Changing the time also cancels all existing sequences. So, after a +time directive you'll need to set up your sequences or load a new +groove.13.1 +

    + +

    +TimeSig +

    + +

    +Even though +MMA doesn't really use Time Signatures, some MIDI +programs do recognize and use them. So, here's a command which will +let you insert a Time Signature in your MIDI output: + +

    + + +
    + +
    TimeSig NN DD
    + +
    + +

    +The NN parameter is the time signature numerator (the number of beats +per bar). In 3/4 you would set this to ``3''. + +

    +The DD parameter is the time signature denominator (the length of the +note getting a single beat). In 3/4 you would set this to +``4''. + +

    +The NN value must be an integer in the range of 1 to 126. The DD value +must be one of 1, 2, 4, 8, 16, 32 or 64. + +

    + +MMA assumes that all songs are in 4/4 and places that +MIDI event at offset 0 in the Meta track. + +

    +The TIMESIG value is remembered by GROOVEs and is +properly set when grooves are switched. You should probably have a +time signature in any groove library files you create (the supplied +files all do). + +

    +The common time signatures ``common'' and ``cut'' are supported. They +are translated by +MMA to 4/4 and 2/2. + +

    + +

    +
    +BeatAdjust +

    + +

    +Internally, +MMA tracks its position in a song according to beats. +For example, in a 4/4 piece the beat position is +incremented by 4 after each bar is processed. For the most part, this +works fine; however, there are some conditions when it would be nice +to manually adjust the beat position: + +

    + +

      +
    • You may want to insert some extra (silent) beats at the end of + bar to simulate a pause, + +

      +

    • +
    • You may want to delete some beats to handle a ``short'' bar. + +

      +

    • +
    + +

    +Both instances will be dealt with in turn. In this + example a pause is simulated at the end of bar +10. One problem with this logic is that the inserted beat will be +silent, but certain notes (percussive things like piano) often will +continue to sound (this is related to the decay of the note, not that + +MMA has not turned off the note). Frankly, this really doesn't +work too well ...which is why the FERMATA +(details here) was added. + +

    + +
    + +
    + Adding Extra Beats +
    + + + +
    + +
    Time 4 +
    +1 Cm / / / +
    ... +
    +10 Am / C / +
    +BeatAdjust 1 +
    ...
    + +
    + + +
    + +

    + +

    +In this example the problem of +the ``short bar'' is handled. In this example, the sheet music has the +majority of the song in 4/4 time, but bar 4 is in +2/4. This could be handled by setting the TIME +setting to 2 and creating some different patterns. Forcing silence on +the last 2 beats and backing up the counter is a bit easier. + +

    + +
    + +
    + Short Bar Adjustment +
    + + + +
    + +
    1 Cm / / / +
    ... +
    +4 Am / z! / +
    +BeatAdjust -2 +
    ...
    + +
    + + +
    + +

    + +

    +Note that the adjustment factor can be a partial beat. For example: + +

    + + +
    + +
    BeatAdjust .5
    + +
    + +

    +will insert half of a beat between the current bars. + +

    + +

    +
    +Fermata +

    + +

    +A ``fermata'' or ``pause'' in written music tells the musician to hold +a note for a longer period than the notation would otherwise indicate. +In standard music notation it is represented by a +`` +\rotatebox{270}{\textbf{(\raisebox{.5ex}{.}}}'' +above a note. + +

    +To indicate all this +MMA uses a command like: + +

    + + +
    + +
    Fermata 1 1 200
    + +
    + +

    +Note that there are three parts to the command: + +

    + +

      +
    1. The beat offset from the current point in the score to apply the + ``pause''. The offset can be positive or negative and is calculated + from the current bar. Positive numbers will apply to the next bar; + negative to the previous. For offsets into the next bar you use + offsets starting at ``0''; for offsets into the previous bar an + offset of ``-1'' represents the last beat in that bar. + +

      +For example, if you were in 4/4 time and wanted the + quarter note at the end of the next bar to be paused, you would use + an offset of 3. The same effect can be achieved by putting the + FERMATA command after the bar and using an offset of -1. + +

      +

    2. +
    3. The duration of the pause in beats. For example, if you have a + quarter note to pause your duration would be 1, a half note (or 2 + quarter notes) would be 2. + +

      +

    4. +
    5. The adjustment. This represented as a percentage of the current + value. For example, to force a note to be held for twice the normal + time you would use 200 (two-hundred percent). You can use a value + smaller than 100 to force a shorter note, but this is seldom done. + +

      +

    6. +
    + +

    +This example shows how you can +place a FERMATA before or after the effected bar. + +

    + +
    + +
    + Fermata +
    + + Lost Image + +

    + + +
    + +
    +MMA Equivalent +
    +
    +Fermata 3 1 200 +
    +C +
    +Gm7
    + +
    + +
    +

    + + +
    + +
    Alternate +
    +
    +C +
    +Fermata -1 1 200 +
    +Gm7
    + +
    + + +

    + +

    + +

    +Here the second example shows +the first four bars of a popular torch song. The problem with the +piece is that the first beat of bar four needs to be paused, and the +accompaniment style has to switch in the middle of the bar. The +example shows how to split the fourth bar with the first beat on one +line and the balance on a second. The ``z!''s are used to ``fill in'' +the 4 beats skipped by the BEATADJUST. + +

    + +
    + +
    + Fermata with Cut +
    + +

    + Lost Image + +

    + + +
    + +
    C C#dim +
    +G7 +
    +C / C#dim +
    +G7 z! +
    +Fermata -4 1 200 +
    +Cut -3 +
    +BeatAdjust -3.5 +
    +Groove EasySwing +
    +z! G7 C7
    + +
    + +

    + + +

    + +

    + +

    +The following conditions will generate warning messages: + +

    + +

      +
    • A beat offset greater than one bar, + +

      +

    • +
    • A duration greater than one bar, + +

      +

    • +
    • An adjustment value less than 100. + +

      +

    • +
    + +

    +This command works by adjusting the global tempo in the MIDI meta +track at the point of the fermata. In most cases you can put more than +one FERMATA command in the same bar, but they should be in beat +order (no checks are done). If the FERMATA command has a +negative position argument, special code is invoked to remove any +note-on events in the duration specified, after the start of the +beat.13.2 This means that extra rhythm notes will +not be sounded--probably what you expect a held note to sound like. + +

    + +

    +
    +Cut +

    + +

    +This command was born of the need to simulate a ``cut'' or, more +correctly, a ``caesura''. This is indicated in music by two parallel +lines put at the top of a staff indicating the end of a musical +thought. The symbol is also referred to as ``railroad tracks''. + +

    +The idea is to stop the music on all tracks, pause briefly, and +resume.13.3 +

    + +MMA provides the CUT command to help deal with this +situation. But, before the command is described in detail, a +diversion: just how is a note or chord sustained in a MIDI file? + +

    +Assume that a +MMA input file (and the associated library) +files dictates that some notes are to be played from beat 2 to beat 4 +in an arbitrary bar. What +MMA does is: + +

    + +

      +
    • determine the position in the piece as a midi offset to the + current bar, + +

      +

    • +
    • calculate the start and end times for the notes, + +

      +

    • +
    • adjust the times (if necessary) based on adjustable features + such as STRUM, ARTICULATE, RTIME, etc., + +

      +

    • +
    • insert the required MIDI ``note on'' and ``note off'' commands + at the appropriate point in the track. + +

      +

    • +
    + +

    +You may think that a given note starts on beat 2 and ends (using +ARTICULATE 100) right on beat 3--but you would most likely be +wrong. So, if you want the note or chord to be ``cut'', what point do +you use to instruct +MMA correctly? Unfortunately, the simple answer +is ``it depends''. Again, the answers will consist of some examples. + +

    +In this first case you wish to stop the track in the middle of the last +bar. The simplest answer is: + +

    + + +
    + +
    1 C +
    ... +
    +36 C / z! / +
    + +
    + +

    +Unfortunately, this will ``almost'' work. But, any chords which are +longer than one or two beats may continue to sound. This, often, gives +a ``dirty'' sound to the end of the piece. The simple solution is to +add to the end of the piece: + +

    + + +
    + +
    Cut -2
    + +
    + +

    +Depending on the rhythm you might have to fiddle a bit with the cut +value. But, the example here puts a ``all notes off'' message in all +the active tracks at the start of beat 3. The exact same result can be +achieved by placing: + +

    + + +
    + +
    Cut 3
    + +
    + +

    +before the final bar. + +

    +In this second example a tiny bit of silence is desired between bars 4 and +5 (this might be the end of a musical introduction). The following bit should +work: + +

    + + +
    + +
    1 C +
    +2 G +
    +3 G +
    +4 C +
    +Cut +
    +BeatAdjust .2 +
    +5 G +
    ...
    + +
    + +

    +In this case the ``all notes off'' is placed at the end of bar 4 and +two-tenths of a beat is inserted at the same location. Bar 5 continues +the track. + +

    +The final example show how you might combine CUT with +FERMATA. In this case the sheet music shows a caesura after the +first quarter note and fermatas over the quarter notes on beats 2, 3 +and 4. + +

    + + +
    + +
    1 C C#dim +
    +2 G7 +
    +3 C / C#dim +
    +Fermata 1 3 120 +
    +Cut 1.9 +
    +Cut 2.9 +
    +Cut 3.9 +
    +4 G7 / C7 / +
    +5 F6
    + +
    + +

    +A few tutorial notes on the above: + +

    + +

      +
    • The command + +

      + + +
      + +
      Fermata 1 3 120
      + +
      + +

      +applies a slow-down in tempo to the second beat for the following + bar (an offset of 1), for 3 beats. These 3 beats will be played 20% + slower than the set tempo. + +

      +

    • +
    • The three CUT commands insert MIDI ``all notes off'' in + all the active tracks just before beats 2, 3 and 4. + +

      +

    • +
    + +

    +Finally, the proper syntax for the command: + +

    + + +
    + +
    [Voice] Cut [Offset]
    + +
    + +

    +If the voice is omitted, MIDI ``all notes off'' will be inserted into +each active track. + +

    +If the offset is omitted, the current bar position will be used. This +the same as using an offset value of 0. +


    Footnotes

    +
    +
    ... +groove.13.1
    +
    The time value is saved/restored with grooves so + setting a time is redundant in this case. + +
    +
    ... +beat.13.2
    +
    Technically speaking, +MMA determines an interval + starting 5% of a beat after the start of the fermata to a point 5% + of a beat before the end. Any MIDI Note-On events in this range (in + all tracks) are deleted. + +
    +
    ... +resume.13.3
    +
    The answer to the music theory question of whether + the ``pause'' takes time from the current beat or is treated + as a ``fermata'' is not clear--but as far as +MMA is concerned the + command has no effect on timing. + +
    +

    + + +next + +up + +previous +
    + Next: Swing + Up: Reference Manual + Previous: Harmony + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node14.html b/mma/docs/html/ref/node14.html new file mode 100644 index 0000000..8c59e8e --- /dev/null +++ b/mma/docs/html/ref/node14.html @@ -0,0 +1,307 @@ + + + + + +Swing + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Volume and Dynamics + Up: Reference Manual + Previous: Tempo and Timing +
    +
    + + +

    +
    +Swing +

    + +

    +In jazz and swing music there is a convention to apply special timing +to eighth notes. Normally, the first of a pair of eights is lengthened +and the second is shortened. In the sheet music this can is sometimes +notated as sequences of a dotted eighth followed by a sixteenth. But, +if you were to foolish enough to play the song with this timing you'd +get a funny look from a jazz musician who will tell you to ``swing'' +the notes. + +

    +The easiest way to think about swing eighths is to mentally convert +them to a triplet consisting of a quarter note and and eighth. + +

    +

    + Lost Image + +
    + +

    +In the above music the first and second bar are both played as +in the third. + +

    + +MMA can handle this musical style in a number of ways, the control +is though the SWINGMODE command and options. + +

    +In default mode +MMA assumes that you don't want your song to swing. + +

    +To enable automatic conversions, simply set SWINGMODE to ``on'': + +

    + + +
    + +
    SwingMode On
    + +
    + +

    +This directive accepts the value ``On'' and ``Off'' or ``1'' and +``0''. + +

    +With SWINGMODE enabled +MMA takes some extra steps when creating +patterns and processing of SOLO and MELODY parts. + +

    + +

      +
    • Any eighth note in a pattern ``on the beat'' (1, 2, etc.) is converted to a + ``81'' note. + +

      +

    • +
    • Any eighth note is a pattern ``off the beat'' (1.5, 2.5, etc.) + is converted to ``82'' note, and the offset is adjusted to the prior + beat plus the value of an ``81'' note. + +

      +

    • +
    • Drum notes with a value of a single MIDI tick are handled in the + same way, but only the offset adjustment is needed. + +

      +

    • +
    • In SOLO and MELODY tracks any successive pairs of + eighth notes (or rests) are adjusted. + +

      +

    • +
    + +

    +Important: when defining patterns and sequences remember that +the adjustment is made when the pattern is compiled. With a +DEFINE command the arguments are compiled (and swing +will be applied). But a SEQUENCE command with an +already defined pattern will use the existing pattern values (the +swing adjustment may or may not have been done at define +time). Finally, if you have a dynamic define in the sequence the +adjustment will take place if needed. + +

    +SWINGMODE has an additional option, SKEW. This factor +is used to create the ``81'' and ``82'' +note lengths (see here). By +default the value ``66'' is used. This simply means that the note +length ``81'' is assigned 66% of the value of an eight note, and +``82'' is assigned 34%. + +

    +You can change this setting at any point in your song or style +files. It will take effect immediately on all future patterns and solo +lines. + +

    +The setting: + +

    + + +
    + +
    SwingMode Skew=60
    + +
    + +

    +will set a 60/40 setting. + +

    +If you want to experiment, find a GROOVE with note lengths of +``81'' and ``82'' (``swing'' is as good a choice as any). Now, put a +SWINGMODE SKEW=VALUE directive at the top of your song file (before +selecting any GROOVEs). Compile and play the song with different values +to hear the effects. + +

    +If you want to play with different effects you could do something like +this: + +

    + + +
    + +
    SwingMode On Skew=40 +
    ... Set CHORD pattern/groove +
    +SwingMode Skew=30 +
    ... Set Drum-1 pattern/groove +
    +SwingMode Skew=whatever +
    ... Set Drum-2
    + +
    + +

    +This will give different rates for different tracks. I'll probably not +enjoy your results, but I play polkas on the accordion for fun. + +

    +The complete SWINGMODE setting is saved in the current GROOVE and can be accessed +via the $_SwingMode built-in macro. + +

    +The easy (and ugly and unintuitive) way to handle swing is to +hard-code the value right into your patterns. For example, you could +set a swing chord pattern with: + +

    + + +
    + +
    Chord Define Swing8 1 3+3 80; 1.33 3 80; 2 3+3 80; 2.33 3 80 ...
    + +
    + +

    +We really don't recommend this for the simple reason that the swing +rate is frozen as quarter/eighth triplets. + +

    +If you refer to the table of note lengths +(here) you will find the cryptic +values of ``81'' and ``82''. These notes are adjusted depending of the +SWINGSKEW value. So: + +

    + + +
    + +
    Chord Define Swing8 1 81 80; 1+81 82 80; 2 81 80; 2+81 82 80 ...
    + +
    + +

    +is a bit better. In this case we have set a chord on beat 1 as the +first of an eighth note, and a chord on the off-beat as the +second. Note how we specify the off-beats as ``1+81'', etc. + +

    +In this example the feel of the swing will vary with the +SWINGSKEW setting. + +

    +But, aren't computers supposed to make life simple? Well, here is our +recommended method: + +

    + + +
    + +
    SwingMode On +
    +Chord Define Swing8 1 8 80; 1.5 8 80; 2 8 80; 2.5 8 80 ...
    + +
    + +

    +Now, +MMA will convert the values for you. Magic, well ...almost. + +

    +There are times when you will need to be more explicit, especially in +SOLO and MELODY tracks: + +

    + +

      +
    • If a bar has both swing and straight eighths. + +

      +

    • +
    • If the note following an eighth is not an eight. + +

      +

    • +
    +
    + + +next + +up + +previous +
    + Next: Volume and Dynamics + Up: Reference Manual + Previous: Tempo and Timing + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node15.html b/mma/docs/html/ref/node15.html new file mode 100644 index 0000000..018d835 --- /dev/null +++ b/mma/docs/html/ref/node15.html @@ -0,0 +1,872 @@ + + + + + +Volume and Dynamics + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Repeats + Up: Reference Manual + Previous: Swing +
    +
    + + +Subsections + + + +
    + +

    + +
    +Volume and Dynamics +

    + +

    + +MMA is very versatile when it comes to the volumes or dynamics used in your song. +15.1 +

    +Each generated note goes though several adjustments: + +

    + +

      +
    1. The initial velocity is set in the pattern definition, see + patterns,15.2 +

      +

    2. +
    3. the velocity is then adjusted by the master and + track volume settings (see here + for the discussion of ADJUSTVOLUME RATIO), + +

      +

    4. +
    5. if certain notes are to be accented, yet another adjustment is made, + +

      +

    6. +
    7. and, finally, if the random volume is set, more adjustment. + +

      +

    8. +
    + +

    +For the most part +MMA uses conventional musical score notation for +volumes. Internally, the dynamic name is converted to a percentage +value. The note volume is adjusted by the percentage. + +

    +The following table shows the available volume settings and the adjustment values. + +

    +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Symbolic NameRatio (Percentage) Adjustment
    off0
    pppp5
    ppp10
    pp25
    p40
    mp70
    m100
    mf110
    f130
    ff160
    fff180
    ffff200
    + + +
    + +
    + +

    +The setting OFF is useful for generating fades at the end of a +piece. For example: + +

    + + +
    + +
    Volume ff +
    +Decresc Off 5 +
    +G / Gm / * 5
    + +
    + +

    +will cause the last 5 bars of your music to fade from a FF to +silence. + +

    +The initial velocity of a note is set in the pattern definition (see +patterns). The following +commands set the master volume, track volume and random volume +adjustments. + +

    +In addition to the note velocities generated by +MMA your MIDI +device can also change the mix between channels. See the discussion +for MIDIVOLUME (here). + +

    + +

    +
    +Accent +

    + +

    +``Real musicians''15.3, in an almost +automatic manner, emphasize notes on certain beats. In popular Western +music written in 4/4 time this is usually beats one and +three. This emphasis sets the pulse or beat in a piece. + +

    +In +MMA you can set the velocities in a pattern so that this emphasis is +automatically adjusted. For example, when setting a walking bass line +pattern you could use a pattern definition like: + +

    + + +
    + +
    Define Walk W1234 1 4 100; 2 4 70; 3 4 80; 4 4 70
    + +
    + +

    +However, it is much easier to use a definition which has all the +velocities the same: + +

    + + +
    + +
    Define Walk W1234 1 1 90 * 4
    + +
    + +

    +and use the ACCENT command to increase or decrease the volume +of notes on certain beats: + +

    + + +
    + +
    Walk Accent 1 20 2 -10 4 -10
    + +
    + +

    +The above command will increase the volume for walking bass notes on +beat 1 by 20%, and decrease the volumes of notes on beats 2 and 4 by +10%. + +

    +You can use this command in all tracks. + +

    +When specifying the accents, you must have matching pairs of data. The +first item in the pair is the beat (which can be fractional), the +second is the volume adjustment. This is a percentage of the current +note volume that is added (or subtracted) to the volume. Adjustment +factors must be integers in the range -100 to 100. + +

    +The ACCENTs can apply to all bars in a track; as well, you can set +different accents for different bars. Just use a ``{}'' pair to delimit +each bar. For example: + +

    + + +
    + +
    Bass Accent {1 20} / / {1 30 3 30}
    + +
    + +

    +The above line will set an accent on beat 1 of bars 1, 2 and 3; in +bar 4 beats 1 and 3 will be accented. + +

    +You can use a ``/'' to repeat a setting. The ``/'' can be enclosed in +a ``{}'' delimiter if you want. + +

    + +

    +AdjustVolume +

    + +

    + +

    +Mnemonic Volume Ratios +

    + +

    +The ratios used to adjust the volume can be changed from the table at +the start of this chapter. For example, to change the percentage used +for the MF setting: + +

    + + +
    + +
    AdjustVolume MF=95 f=120
    + +
    + +

    +Note that you can have multiple setting on the same line. + +

    +The values used have the same format as those used for the +VOLUME command, below. For now, a few examples: + +

    + + +
    + +
    AdjustVolume Mf=mp+200
    + +
    + +

    +will set the adjustment factor for ``mf'' to that of ``mp'' plus +200%. + +

    +And, + +

    + + +
    + +
    AdjustVolume mf=+20
    + +
    + +

    +will increase the current ``mf'' setting by 20%. + +

    +You might want to do these adjustment in your MMArc file(s). + +

    + +

    + +
    +Master Volume Ratio +

    + +

    + +MMA uses both the master and track volumes +to determine the final velocity of a note. By default, the track volume +setting accounts for 60% of the adjustment and the master volume for +the remaining 40%. The simple-minded logic behind this is that if the +user goes to the effort of setting a volume for a track, then that is +probably more important than a volume set for the entire piece. + +

    +You can change the ratio used at anytime with the ADJUSTVOLUME RATIO=VALUE +directive. $<$Value$>$ is the percentage to use for the Track volume. A few examples: + +

    + + +
    + +
    AdjustVolume Ratio=60
    + +
    + +

    +This duplicates the default setting. + +

    + + +
    + +
    AdjustVolume Ratio=40
    + +
    + +

    +Volume adjustments use 40% of the track volume and 60% of the master +volume. + +

    + + +
    + +
    AdjustVolume Ratio=100
    + +
    + +

    +Volume adjustments use only the track volume (and ignore the master +volume completely). + +

    + + +
    + +
    AdjustVolume Ratio=0
    + +
    + +

    +Volume adjustments use only the master volume (and ignore the track +volumes completely). + +

    +Any value in the range 0 to 100 can be used as an argument for this +command. This setting is saved in GROOVEs. + +

    +Feel free to experiment with different ratios. + +

    + +

    +
    +Volume +

    + +

    +The volume for a track and the master volume, is set with the VOLUME +command. Volumes can be specified much like standard sheet music with +the conventional dynamic names. These volumes can be applied to a +track or to the entire song. For example: + +

    + + +
    + +
    Arpeggio-Piano Volume p
    + +
    + +

    +sets the volume for the Arpeggio-Piano track to something approximating +piano. + +

    + + +
    + +
    Volume f
    + +
    + +

    +sets the master volume to forte. + +

    +In most cases the volume for a specific track will be set within the GROOVE +definition; the master volume is used in the music file to adjust the +overall feel of the piece. + +

    +When using VOLUME for a specific track, you can use a different +value for each bar in a sequence: + +

    + + +
    + +
    Drum Volume mp ff / ppp
    + +
    + +

    +A ``/'' can be used to repeat values. + +

    +In addition to the ``musical symbols'' like FF and MP you can +also use numeric values to indicate a percentage. In this case you can +use intermediate values to those specified in the table above. For +example, to set the volume between MF and F, you could do +something like: + +

    + + +
    + +
    Volume 87
    + +
    + +

    +But, we don't recommend that you use this! + +

    +A better option is to increment or decrement an existing volume by a +percentage. A numeric value prefaced by a ``+'' or ``-'' is +interpreted as a change. So: + +

    + + +
    + +
    Drum-Snare Volume -20
    + +
    + +

    +would decrement the existing volume of the DRUM-SNARE track by +20%. + +

    +And, finally, for fine tuning you can adjust a ``musical symbol'' +volume by a percentage. The volume ``mf-10'' will generate a volume +10% less than the value of ``mf''; ``f+20'' will generate a volume +20% greater than ``f''. + +

    + +

    +Cresc and Decresc +

    + +

    +If you wish to adjust over a series of bars use the CRESC or +DECRESC commands. These commands work in both the master +context and individual tracks. + +

    +For all practical purposes, the two commands are equivalent, expect +for a possible warning message. If the new volume in less than the +current volume in a CRESC a warning will be displayed; the +converse applies to a DECRESC. In addition, a warning will +be displayed if the effect of either command results in no volume change. + +

    +The command requires two or three arguments. The first argument is an +optional initial volume followed by the new (destination) volume and +the number of bars the adjustment will take. + +

    +For example: + +

    + + +
    + +
    Cresc fff 5
    + +
    + +

    +will gradually vary the master volume from its current setting to a +``triple forte'' over the next 5 bars. Note that the very next bar +will be played at the current volume and the fifth bar at fff +with the other three bars at increasing volumes. + +

    +Similarly: + +

    + + +
    + +
    Drum-Snare Decresc mp 2
    + +
    + +

    +will decrease the ``drum-snare'' volume to ``mezzo piano'' over the next 2 bars. + +

    +Finally, consider: + +

    + + +
    + +
    Cresc pp mf 4
    + +
    + +

    +which will set the current volume to PP and then increase it to +MF over the next 4 bars. Again, note that the very next bar +will be played at pp and the fourth at mf. + +

    +You can use numeric values (not recommended!) in these directives: + +

    + + +
    + +
    Cresc 20 100 4
    + +
    + +

    +As well as increment/decrement: + +

    + + +
    + +
    Volume ff +
    ... +
    +Decresc -10 -40 4
    + +
    + +

    +The above example will first set the volume to 10% less than the +current FF setting. Then it will decrease the volume over the next +4 bars to a volume 40% less than the new setting for the first bar. + +

    +A SEQCLEAR command will reset all track volumes to the default +M. + +

    +When applying CRESC or DECRESC on a specific track the +volume for all the sequences will be the same. For this reason, a +warning is displayed if the volumes for each bar in the current +sequence are not the same. + +

    + +

    +
    +RVolume +

    + +

    +Not even the best musician can play each note at the same volume. Nor +would he or she want to--the result would be quite unmusical ... +so +MMA tries to be a bit human by randomly adjusting note volume +with the RVOLUME command. + +

    +The command can be applied to any specific track. Examples: + +

    + + +
    + +
    Chord RVolume 10 +
    +Drum-Snare RVolume 5
    + +
    + +

    +The RVOLUME argument is a percentage value by which a volume is +adjusted. A setting of 0 disables the adjustment for a track (this is +the default). + +

    +When set, the note velocity (after the track and master volume +adjustments) is randomized up or down by the value. Again, using the +above example, let us assume that a note in the current pattern gets a +MIDI velocity of 88. The random factor of 10 will adjust this by 10% +up or down--the new value can be from 78 to 98. + +

    +The idea behind this is to give the track a more human sounding +effect. You can use large values, but it's not recommended. Usually, +values in the 5 to 10 range work well. You might want slightly larger +values for drum tracks. Using a value greater than 30 will generate a +warning message. + +

    +Notes: + +

    + +

      +
    • No generated value will be out of the valid MIDI velocity range + of 1 to 127. + +

      +

    • +
    • A different value can be used for each bar in a sequence: + +

      + + +
      + +
      Scale RVolume 10 0 / 20
      + +
      + +

      +

    • +
    • A ``/'' can be used to repeat values. + +

      +

    • +
    + +

    + +

    +Saving and Restoring Volumes +

    + +

    +Dynamics can get quite complicated, especially when you are adjusting +the volumes of a track inside a repeat or other complicated sections +of music. In this section attempts to give some general +guidelines and hints. + +

    +For the most part, the supplied groove files will have balanced +volumes between the different instruments. If you find that some +instruments or drum tones are consistently too loud or soft, spend some +time with the chapter on Fine Tuning. + +

    +Remember that GROOVEs save all the current volume settings. +This includes the master setting as well as individual track settings. +So, if you are using the mythical groove ``Wonderful'' and think that +the Chord-Piano volume should be louder in a particular song +it's easy to do something like: + +

    + + +
    + +
    Groove Wonderful +
    +Chord-Piano Volume ff +
    +DefGroove Wonderful
    + +
    + +

    +Now, when you call this groove the new volume will be used. Note that +you'll have to do this for each variation of the groove that you use +in the song. + +

    +In most songs you will not need to do major changes. But, it is nice +to use the same volume each time though a section. In most cases +you'll want to do a explicit setting at the start of a section. For +example: + +

    + + +
    + +
    Repeat +
    +Volume mf +
    .... +
    +Cresc ff 5 +
    ... +
    +EndRepeat
    + +
    + +

    +Another useful technique is the use of the $_LASTVOLUME +macro. For example: + +

    + + +
    + +
    Volume pp +
    ... +
    +Cresc f 5 +
    ... +
    $_LastVolume // restores to pp
    + +
    + +

    +


    Footnotes

    +
    +
    ... song.15.1
    +
    We'll try to be consistent and refer to a MIDI + ``volume'' as a ``velocity'' and internal +MMA adjustments to velocity as volumes. + +
    +
    ...sec-pats,15.2
    +
    Solo and + Melody track notes use an initial velocity of 90. + +
    +
    ... musicians''15.3
    +
    as opposed to mechanical. + +
    +

    + + +next + +up + +previous +
    + Next: Repeats + Up: Reference Manual + Previous: Swing + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node16.html b/mma/docs/html/ref/node16.html new file mode 100644 index 0000000..7fd9221 --- /dev/null +++ b/mma/docs/html/ref/node16.html @@ -0,0 +1,283 @@ + + + + + +Repeats + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Variables, Conditionals and Jumps + Up: Reference Manual + Previous: Volume and Dynamics +
    +
    + + +

    +
    +Repeats +

    + +

    + +MMA attempts to be as comfortable to use as standard sheet music. +This includes repeats and endings. + +

    +More complex structures like D.S., Coda, etc. are +not directly supported. But, they are easily simulated with by +using some simple variables, conditionals and GOTOs. See +Variables for details. +Often as not, it may be easier to use your editor to cut, paste and +duplicate. Another, alternate, method of handling complicated repeats +is to set sections of code in MSET (more + here) variables and simply expand those. + +

    +A section of music to be repeated is indicated with a REPEAT +and REPEATEND or ENDREPEAT16.1 In addition, you can have REPEATENDINGS. + +

    + +
    + +
    + Repeats +
    + +

    + Lost Image +
    +
    +
    +
    +

    + + +
    + +
    Repeat +
    +1 Am +
    +2 C +
    +RepeatEnding 2 +
    +3 D7 +
    +RepeatEnding +
    +4 D7 / Dm +
    +RepeatEnd +
    +5 G7 +
    +6 A
    + +
    + + +

    + +

    + +

    +In this example +MMA produces +music with bars: + +

    +

    +1, 2, 3, +
    +1, 2, 3, +
    +1, 2, 4, +
    +1, 2, 5, 6 + +
    + +

    +This works just like standard sheet music. Note that both +REPEATENDING and REPEATEND can take an optional argument +indicating the number of times to use the ending or to repeat the +block. The effect of an optional count for REPEATENDING is +illustrated in the example, above. The following simple example: + +

    + + +
    + +
    Repeat +
    +1  Am +
    +2  Cm +
    +RepeatEnd 3
    + +
    + +

    +Will expand to: +

    +1, 2, +
    +1, 2, +
    +1, 2 + +
    + +

    +Note that the optional argument ``3'' produces a total of three +copies. The default argument for REPEAT is ``2''. Using ``1'' +cancels the REPEAT and ``0'' deletes the entire section. Using +``1'' and ``0'' are useful in setting up Coda sections where you want +a different count the second time the section is played. Note that the +count argument can be a macro. Have a look at the sample file +repeats.mma for lots of examples. + +

    +Combining optional counts with both REPEATENDING and +REPEATEND is permitted. Another example: + +

    + + +
    + +
    Repeat +
    +1 Am +
    +2 C +
    +RepeatEnding 2 +
    +3 D7 +
    +RepeatEnd 2
    + +
    + +

    +Produces: +

    +1, 2, 3, +
    +1, 2, 3, +
    +1, 2, +
    +1, 2 + +
    + +

    + +MMA processes repeats by reading the input file and creating +duplicates of the repeated material. This means that a directive in +the repeated material would be processed multiple times. Unless you +know what you are doing, directives should not be inserted in repeat +sections. Be especially careful if you define a pattern inside a +repeat. Using TEMPO with a ``+'' or ``-'' will be problematic +as well. + +

    +Repeats can be nested to any level. + +

    +Some count values for REPEATEND or ENDREPEAT and +REPEATENDING will generate a warning message. Using the +optional text NoWarn as the first argument will supress the +message: + +

    + + +
    + +
    Repeat +
    ... +
    +RepeatEnd Nowarn 1
    + +
    + +

    +There must be one REPEATEND or ENDREPEAT for every +REPEAT. Any number of REPEATENDINGs can be included +before the REPEATEND. +


    Footnotes

    +
    +
    ...ENDREPEAT16.1
    +
    The reason for both + ENDREPEAT and REPEATEND is to match IFEND and + ENDIF. + +
    +

    + + +next + +up + +previous +
    + Next: Variables, Conditionals and Jumps + Up: Reference Manual + Previous: Volume and Dynamics + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node17.html b/mma/docs/html/ref/node17.html new file mode 100644 index 0000000..fef618c --- /dev/null +++ b/mma/docs/html/ref/node17.html @@ -0,0 +1,1418 @@ + + + + + +Variables, Conditionals and Jumps + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Low Level MIDI Commands + Up: Reference Manual + Previous: Repeats +
    +
    + + +Subsections + + + +
    + +

    + +
    +Variables, Conditionals and Jumps +

    + +

    +To make the processing of your music easier, +MMA supports a very +primitive set for variable manipulations along with some conditional +testing and the oft-frowned-upon GOTO command. + +

    + +

    +Variables +

    + +

    + +MMA lets you set a variable, much like in other programming +languages and to do some basic manipulations on them. Variables are +most likely to be used for two reasons: + +

    + +

      +
    • For use in setting up conditional segments of your file, + +

      +

    • +
    • As a shortcut to entering complex chord sequences. + +

      +

    • +
    + +

    +To begin, the following list shows the available commands to set and manipulate variables: + +

    + + +
    + +
    Set VariableName
    String
    +
    +Mset VariableName ... MsetEnd +
    +UnSet VariableName +
    +ShowVars +
    +Inc Variablename [value] +
    +Dec Variablename [value] +
    +Vexpand ON/Off
    + +
    + +

    +All variable names are case-insensitive. Any characters can be used in +a variable name. The only exceptions are that a variable name cannot +start with a ``$'' or a ``_'' (an underscore--this is reserved for +internal variables, see below). + +

    +Variables are set and manipulated by using their names. Variables are +expanded when their name is prefaced by a space followed by single +``$'' sign. For example: + +

    + + +
    + +
    Set Silly Am / Bm / +
    +1 $Silly
    + +
    + +

    +The first line creates the variable ``Silly''; the second creates a +bar of music with the chords ``Am / Bm /''. + +

    +Note that the ``$'' must be the first item on a line or follow a +space character. For example, the following will NOT work: + +

    + + +
    + +
    Set Silly 4a;b;c;d; +
    +1 Am {$Silly}
    + +
    + +

    +However: + +

    + + +
    + +
    1 Am { $Silly}
    + +
    + +

    +will work fine. + +

    +Following are details on all the available variable commands: + +

    + +

    +Set [string] +

    + +

    +Set or create a variable. You can skip the String if you do +want to assign an empty string to the variable. A valid example is: + +

    + + +
    + +
    Set PassCount 1
    + +
    + +

    +You can concatenate variables or constants by using a single ``+''. +For example: + +

    + + +
    + +
    Groove Rhumba +
    +Repeat +
    ... +
    +Set a $_Groove + Sus +
    +Groove $a +
    ... +
    +Groove Rhumba1 +
    +Repeatend
    + +
    + +

    +This can be useful in calling GROOVE variations. + +

    + +

    +
    +Mset [lines] MsetEnd/EndMset +

    + +

    +This command is quite similar to SET, but MSET expects +multiple lines. An example: + +

    + + +
    + +
    MSet LongVar +
    +1 Cm +
    +2 Gm +
    +3 G7 +
    +MsetEnd
    + +
    + +

    +It is quite possible to set a variable to hold an entire section of +music (perhaps a chorus) and insert this via macro expansion at +various places in your file. + +

    +Each MSET must be terminated by a ENDMSET or +MSETEND command (on its own separate line). + +

    +Be careful if you use an MSET variable in a PRINT +statement ...you'll probably get an error. The PRINT +command will print the first line of the variable and the +remainder will be reinserted into the input stream for interpretation. + +

    +Special code in +MMA will maintain the block settings from +BEGIN/END. So, you can do something like: + +

    + + +
    + +
    Mset Spam +
      Line one +
      Line 2 +
      333 +
    +EndMset +
    +Begin Print +
      $Spam +
    +End
    + +
    + +

    + +

    +RndSet +

    + +

    +There are times when you may want a random value to use in selecting a GROOVE or +for other more creative purposes. The RNDSET command sets a variable from +a value in a list. The list can be anything; just remember that each whitespace +forms the start of a new item. So, + +

    + + +
    + +
    RndSet Var 1 2 3 4 5
    + +
    + +

    +will set $VAR to one of the values 1, 2, 3, 4 or 5. + +

    +You could use this to randomly select a GROOVE: + +

    + + +
    + +
    Groove $var Groove1 Groove2 Groove3
    + +
    + +

    +Alternately, + +

    + + +
    + +
    RndSet Grv Groove1 Groove2 Groove3
    + +
    + +

    +will set $GRV to one of ``Groove1'', ``Groove2'' or ``Groove3''. + +

    +Then you can do the same as in the earlier example with: + +

    + + +
    + +
    Groove $Grv
    + +
    + +

    +You can also have fun using random values for timing, transposition, etc. + +

    + +

    +UnSet VariableName +

    + +

    +Removes the variable. This can be useful if you have conditional tests +which simply rely on a certain variable being ``defined''. + +

    + +

    +ShowVars +

    + +

    +Mainly used for debugging, this command displays the names of the +defined variables and their contents. The display will preface each +variable name with a ``$''. Note that internal +MMA variables are not +displayed with this command. + +

    +You can call SHOWVARS with an argument list. In this case the +values of the variables names in the list will be printed. Variables +which do not exist will not cause an error. Eg: + +

    + + +
    + +
    ShowVars xXx Count foo +
       $XXX - not defined +
       $COUNT: 11 +
       $FOO: This is Foo
    + +
    + +

    + +

    +Inc and Dec +

    + +

    +These commands increment or decrement a variable. If no argument is +given, a value of 1 is used; otherwise, the value specified is used. +The value can be an integer or a floating point number. + +

    +A short example: + +

    + + +
    + +
    Set PassCount 1 +
    +Set Foobar 4 +
    +Showvars +
    +Inc FooBar 4 +
    +Inc PassCount +
    +ShowVars
    + +
    + +

    +This command is quite useful for creating conditional tests for proper +handling of codas or groove changes in repeats. + +

    + +

    +VExpand On or Off +

    + +

    +Normally variable expansion is enabled. These two options will turn +expansion on or off. Why would you want to do this? Well, here's a +simple example: + +

    + + +
    + +
    Set LeftC Am Em +
    +Set RightC G / +
    +VExpand Off +
    +Set Full $LeftC $RightC +
    +VExpand On
    + +
    + +

    +In this case the actual contents of the variable ``Full'' is ``$LeftC +$RightC''. If the OFF/ON option lines had not been used, the +contents would be ``Am Em G /''. You can easily verify this with the +SHOWVARS option. + +

    +When +MMA processes a file it expands variables in a recursive +manner. This means that, in the above example, the line: + +

    + + +
    + +
    1 $Full
    + +
    + +

    +will be changed to: + +

    + + +
    + +
    1 Am Em G /
    + +
    + +

    +However, if later in the file, you change the definition of one of the +variables ...for example: + +

    + + +
    + +
    Set LeftC Am /
    + +
    + +

    +the same line will now be ``1 Am / G /''. + +

    +Most of +MMA 's internal commands can be redefined with +variables. However, you really shouldn't use this feature. +It's been left for two reasons: it might be useful, and, it's hard to +disable. + +

    +However, not all commands can be redefined. The following is short +list of things which will work (but, again, not all suggestions should +be used!): + +

    + + +
    + +
    Set Rate Tempo 120 +
    $Rate +
    +Set R Repeat +
    $R
    + +
    + +

    +But, the following will not work: + +

    + + +
    + +
    Set B Begin +
    +Set E End +
    $B Arpeggio Define +
    .... +
    $E
    + +
    + +

    +This fails since the Begin/End constructs are expanded before variable +expansion. However: + +

    + + +
    + +
    Set A Define Arpeggio +
    +Begin $a ... End
    + +
    + +

    +is quite alright. + +

    +Even though you can use a variable to substitute for the REPEAT +or IF directives, using one for REPEATEND, ENDREPEAT, +REPEATENDING, LABEL, IFEND or ENDIF will fail. + +

    +Variable expansion should usually not be a concern. In most normal +files, +MMA will expand variables as they are encountered. However, +when reading the data in a REPEAT, IF or MSET +section the expansion function is skipped--but, when the lines are +processed, after being stored in an internal queue, variables are +expanded. + +

    + +

    +StackValue +

    + +

    +Sometimes you just want to save a value for a few lines of code. The +STACKVALUE command will save its arguments. You can later +retrive them via the $_StackValue macro. For example (taken from the +stdpats.mma file): + +

    + + +
    + +
    StackValue $_SwingMode +
    +SwingMode On +
    +Begin Drum Define +
      Swing8 1 0 90 * 8 +
    +End +
      ... +
    +SwingMode $_StackValue
    + +
    + +

    +Note that the $_StackValue macro removes the last value from the +stack. If you invoke the macro when there is nothing saved an error +will occur. + +

    + +

    +Predefined Variables +

    + +

    +For your convenience +MMA tracks a number of internal settings and +you can access these values with special macros.17.1 All of these ``system'' variables are +prefaced with a single underscore. For example, the current tempo is +displayed with the variable $_TEMPO. + +

    +There are two categories of system variables. The first are the simple +values for global settings: + +

    +

    +
      $_AutoLibPath
    +
    Current AUTOLIBPATH setting. + +

    +

    +
      $_BarNum
    +
    Current bar number of song. + +

    +

    +
      $_Debug
    +
    Current debug settings. + +

    +

    +
      $_Groove
    +
    Name of the currently selected groove. May be + empty if no groove has been selected. + +

    +

    +
      $_KeySig
    +
    Key signature as defined in song file. If no + keysignature is set the somewhat cryptic 0# will be returned. + +

    +

    +
      $_LineNum
    +
    Line number in current file. + +

    +

    +
      $_IncPath
    +
    Current INCPATH setting. + +

    +

    +
      $_LastDebug
    +
    Debug settings prior to last DEBUG + command. This setting can be used to restore settings, IE: + +

    + + +
    + +
    Debug Warnings=off +
    ... stuff generating annoying warnings +
    +Debug $_LastDebug
    + +
    + +

    +

    +
      $_LastGroove
    +
    Name of the groove selected before the + currently selected groove. + +

    +

    +
      $_LastVolume
    +
    Previously set global volume setting. + +

    +

    +
      $_LibPath
    +
    Current LIBPATH setting. + +

    +

    +
      $_Lyric
    +
    Current LYRIC settings. + +

    +

    +
      $_MIDISplit
    +
    List of SPLITCHANNELS. + +

    +

    +
      $_OutPath
    +
    Current OUTPATH setting. + +

    +

    +
      $_SeqRnd
    +
    Global SEQRND setting (on, off or track list). + +

    +

    +
      $_SeqRndWeight
    +
    Global SEQRNDWEIGHT settings. + +

    +

    +
      $_SeqSize
    +
    Current SEQSIZE setting. + +

    +

    +
      $_SwingMode
    +
    Current SWINGMODE setting (On or Off) + and the Skew value. + +

    +

    +
      $_StackValue
    +
    The last value stored on the STACKVALUE + stack. + +

    +

    +
      $_Tempo
    +
    Current TEMPO. Note that if you have used + the optional bar count in setting the tempo this will be the + target tempo. + +

    +

    +
      $_Time
    +
    The current TIME (beats per bar) setting. + +

    +

    +
      $_ToneTr
    +
    List of all TONETR settings. + +

    +

    +
      $_Transpose
    +
    Current TRANSPOSE setting. + +

    +

    +
      $_VExpand
    +
    VExpand value (On/Off). Not very useful since you + can't enable VEXPAND back with a macro. + +

    +

    +
      $_VoiceTr
    +
    List of all VOICETR settings. + +

    +

    +
      $_Volume
    +
    Current global volume setting. + +

    +

    +
      $_VolumeRatio
    +
    Global volume ratio (track vrs. master) from + ADJUSTVOLUME Ratio setting. + +

    +

    +
    + +

    +The second type of system variable is for settings in a certain track. +Each of these variables is in the form $_TRACKNAME_VALUE. For +example, the current voice setting for the ``Bass-Sus'' track can be +accessed with the variable $_Bass-Sus_Voice. + +

    +If the associated command permits a value for each sequence in your +pattern, the macro will more than one value. For example (assuming a +SEQSIZE of 4): + +

    + + +
    + +
    Bass Octave 3 4 2 4 +
    +Print $_Bass_Octave +
    ... +
    +3 4 2 4
    + +
    + +

    +The following are the available ``TrackName'' macros: + +

    +

    +
      $_TRACKNAME_Accent
    +
    +
    +
      $_TRACKNAME_Articulate
    +
    +
    +
      $_TRACKNAME_Channel
    +
    Assigned MIDI channel 1-16, 0 if not assigned. +
    +
      $_TRACKNAME_Compress
    +
    +
    +
      $_TRACKNAME_Direction
    +
    +
    +
      $_TRACKNAME_DupRoot
    +
    (only permitted in Chord Tracks) +
    +
      $_TRACKNAME_Harmony
    +
    +
    +
      $_TRACKNAME_HarmonyVolume
    +
    +
    +
      $_TRACKNAME_Invert
    +
    +
    +
      $_TRACKNAME_Limit
    +
    +
    +
      $_TRACKNAME_Mallet
    +
    Rate and delay values (only valid in + Solo and Melody tracks) +
    +
      $_TRACKNAME_NoteSpan
    +
    +
    +
      $_TRACKNAME_Octave
    +
    +
    +
      $_TRACKNAME_Range
    +
    +
    +
      $_TRACKNAME_Rskip
    +
    +
    +
      $_TRACKNAME_Rtime
    +
    +
    +
      $_TRACKNAME_Rvolume
    +
    +
    +
      $_TRACKNAME_SeqRnd
    +
    +
    +
      $_TRACKNAME_SeqRndWeight
    +
    +
    +
      $_TRACKNAME_Strum
    +
    (only permitted in Chord tracks) +
    +
      $_TRACKNAME_Tone
    +
    (only permitted in Drum tracks) +
    +
      $_TRACKNAME_Unify
    +
    +
    +
      $_TRACKNAME_Voice
    +
    +
    +
      $_TRACKNAME_Voicing
    +
    (only permitted in Chord tracks) +
    +
      $_TRACKNAME_Volume
    +

    +

    +
    + +

    +The ``TrackName'' macros are useful in copying values between +non-similar tracks and CHSHARE tracks. For example: + +

    + + +
    + +
    Begin Bass +
      Voice AcousticBass +
      Octave 3 +
      ... +
    +End +
    +Begin Walk +
      ChShare Bass +
      Voice $_Bass_Voice +
      Octave $_Bass_Octave +
      ... +
    +End
    + +
    + +

    + +

    +Conditionals +

    + +

    +The most important reason to have variables in +MMA is to use them +available in conditionals. In +MMA a conditional consists of a line +starting with an IF directive, a test, a series of lines to +process (depending upon the result of the test), and a closing +ENDIF or IFEND17.2 directive. An optional ELSE statement may be included. + +

    +The first set of tests are unary (they take no arguments): + +

    +

    +
    Def VariableName
    +
    Returns true if the variable has been defined. + +

    +

    +
    Ndef VariableName
    +
    Returns true if the variable has not been + defined. + +

    +

    +
    + +

    +In the above tests you must supply the name of a variable--don't make +the mistake of including a ``$'' which will invoke expansion and +result in something you were not expecting. + +

    +A simple example: + +

    + + +
    + +
    If Def InCoda +
      5 Cm +
      6 / +
    +Endif
    + +
    + +

    +The other tests are binary (they take two arguments): + +

    +

    +
    LT Str1 Str2
    +
    Returns true if Str1 is less than + Str2. (Please see the discussion below on how the tests are + done.) + +

    +

    +
    LE Str1 Str2
    +
    Returns true if str1 is less than or equal + to Str2. + +

    +

    +
    EQ Str1 Str2
    +
    Returns true if str1 is equal to + Str2. + +

    +

    +
    NE Str1 Str2
    +
    Returns true if str1 is not equal to + Str2. + +

    +

    +
    GT Str1 Str2
    +
    Returns true if str1 is greater than + Str2. + +

    +

    +
    GE Str1 Str2
    +
    Returns true if str1 is greater than or + equal to Str2. + +

    +

    +
    + +

    +In the above tests you have several choices in specifying Str1 +and Str2. At some point, when +MMA does the actual comparison, +two strings or numeric values are expected. So, you really could do: + +

    + + +
    + +
    If EQ abc ABC
    + +
    + +

    +and get a ``true'' result. The reason that ``abc'' equals ``ABC'' is +that all the comparisons in +MMA are case-insensitive. + +

    +You can also compare a variable to a string: + +

    + + +
    + +
    If GT $foo abc
    + +
    + +

    +will evaluate to ``true'' if the contents of the variable +``foo'' evaluates to something ``greater than'' ``abc''. But, there is +a bit of a ``gotcha' here. If you have set ``foo'' to a two word +string, then +MMA will choke on the command. In the following +example: + +

    + + +
    + +
    Set Foo A B +
    +If GT $Foo abc
    + +
    + +

    +the comparison is passed the line: + +

    + + +
    + +
    If GT A B abc
    + +
    + +

    +and +MMA seeing three arguments generates an error. If you want the +comparison done on a variable which might be more than one word, use +the ``$$'' syntax. This delays the expansion of the variable until +the IF directive is entered. So: + +

    + + +
    + +
    If $$foo abc
    + +
    + +

    +would generate a comparison between ``A B'' and ``ABC''. + +

    +Delayed expansion can be applied to either variable. It only works in +an IF directive. + +

    +Strings and numeric values can be confusing in comparisons. For +example, if you have the strings ``22'' and ''3'' and compare them as +strings, ``3'' is greater than ``22''; however, if you compare them as +values then 3 is less than 22. + +

    +The rule in +MMA is quite simple: If either string in a comparison is +a numeric value, both strings are converted to values. Otherwise they +are compared as strings.17.3 +

    +This lets you do consistent comparisons in situations like: + +

    + + +
    + +
    Set Count 1 +
    +If LE $$Count 4 +
      .... +
    +IfEnd
    + +
    + +

    +Note that the above example could have used ``$Count'', but you +should probably always use the ``$$'' in tests. + +

    +Much like other programming languages, an optional ELSE +condition may be used: + +

    + + +
    + +
    If Def Coda +
      Groove Rhumba1 +
    +Else +
      Groove Rhumba +
    +Endif
    + +
    + +

    +The ELSE statement(s) are processed only if the test for the +IF test is false. + +

    +Nesting of IFs is permitted: + +

    + + +
    + +
    If ndef Foo +
      Print Foo has been defined. +
    +Else +
      If def bar +
        Print bar has been defined. Cool. +
      Else +
        Print no bar...go thirsty. +
      Endif +
    +Endif
    + +
    + +

    +works just fine. Indentation has been used in these examples to clearly +show the nesting and conditions. You should do the same. + +

    + +

    +Goto +

    + +

    +The GOTO command redirects the execution order of your script to +the point at which a LABEL or line number has been defined. There are really +two parts to this: + +

    + +

      +
    1. A command defining a label, and, + +

      +

    2. +
    3. The GOTO command. + +

      +

    4. +
    + +

    + +

    +A label is set with the LABEL directive: + +

    + + +
    + +
    Label Point1
    + +
    + +

    +The string defining the label can be any sequence of characters. +Labels are case-insensitive. + +

    +To make this look a lot more line those old BASIC progams, any lines +starting with a line number are considered to be label lines as +well. + +

    +A few considerations on labels and linenumbers: + +

    + +

      +
    • A duplicate label generated with a LABEL command will + generate an error. + +

      +

    • +
    • A line number label duplicating a LABEL is an error. + +

      +

    • +
    • A LABEL duplicating a line number is an error. + +

      +

    • +
    • Duplicate line numbers are permitted. The last one encountered + will be the one used. + +

      +

    • +
    • All label points are generated when the file is opened, not as it is + parsed. + +

      +

    • +
    • Line numbers (really, just comments) do not need to be in any + order. + +

      +

    • +
    + +

    + +

    +The command: + +

    + + +
    + +
    Goto Point1
    + +
    + +

    +causes an immediate jump to a new point in the file. If you are +currently in repeat or conditional segment of the file, the remaining +lines in that segment will be ignored. + +

    + +MMA does not check to see if you are jumping into a repeat or +conditional section of code--but doing so will usually cause an +error. Jumping out of these sections is usually safe. + +

    +The following example shows the use of both types of label. In this +example only lines 2, 3, 5 and 6 will be processed. + +

    + + +
    + +
    Goto Foo +
    +1 Cm +
    +Label Foo +
    +2 Dm +
    +3 / +
    +Goto 5 +
    +4 Am +
    +5 Cm +
    +6 Dm
    + +
    + +

    +For an example of how to use some simple labels to simulate a ``DS al +Coda'' examine the file ``lullaby-of-Broadway'' in the sample songs +directory. +


    Footnotes

    +
    +
    ... macros.17.1
    +
    The values + are dynamically created and reflect the current settings, and may + not be exactly the same as the value you originally set due to + internal roundings, etc. + +
    +
    ...IFEND17.2
    +
    +MMA 's author probably suffers + from mild dyslexia and can't remember if the command is IFEND or + ENDIF, so both are permitted. Use whichever is more comfortable for + you. + +
    +
    ... strings.17.3
    +
    An attempt is made to convert each + string to a float. If conversion of both strings is successful, the + comparison is made between two floats, otherwise two strings are + used. + +
    +

    + + +next + +up + +previous +
    + Next: Low Level MIDI Commands + Up: Reference Manual + Previous: Repeats + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node18.html b/mma/docs/html/ref/node18.html new file mode 100644 index 0000000..b4b8bd3 --- /dev/null +++ b/mma/docs/html/ref/node18.html @@ -0,0 +1,1610 @@ + + + + + +Low Level MIDI Commands + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Fine Tuning (Translations) + Up: Reference Manual + Previous: Variables, Conditionals and Jumps +
    +
    + + +Subsections + + + +
    + +

    + +
    +Low Level MIDI Commands +

    + +

    +The commands discussed in this chapter directly effect your MIDI +output devices. + +

    +Not all MIDI devices are equal. Many of the effects in this chapter +may be ignored by your devices. Sorry, but that's just the way MIDI +is. + +

    + +

    +
    +Channel +

    + +

    +As noted in Tracks and Channels +MMA assigns MIDI channels +dynamically as it creates tracks. In most cases this works fine; +however, you can if you wish force the assignment of a specific MIDI +channel to a track with the CHANNEL command. + +

    +You cannot assign a channel number to a track if it already defined +(well, see the section CHSHARE, below, for the inevitable +exception), nor can you change the channel assignments for any of the +DRUM tracks. + +

    +Let us assume that you want the Bass track assigned to MIDI +channel 8. Simply use: + +

    + + +
    + +
    Bass Channel 8
    + +
    + +

    +Caution: If the selected channel is already in use an error will be +generated. Due to the way +MMA allocates tracks, if you really need +to manually assign track it is recommended that you do this in a +MMARC file. + +

    + +

    +You can disable a channel at any time by using a channel number of 0: + +

    + + +
    + +
    Arpeggio-1 Channel 0
    + +
    + +

    +will disable the Arpeggio-1 channel, freeing it for use by other +tracks. A warning message is generated. Disabling a track without a +valid channel is fine. When you set a channel to 0 the track is also +disabled. You can restart the track with the ON command +(here). + +

    +You don't need to have a valid MIDI channel assigned to a track to do +things like: MIDIPAN, MIDIGLIS, MIDIVOLUME or +even the assignment of any music to a track. MIDI data is created in +tracks and then sent out to the MIDI buffers. Channel assignment is +checked and allocated at this point, and an error will be generated if +no channels are available. + +

    +It's quite acceptable to do channel reassignments in the middle of a +song. Just assign channel 0 to the unneeded track first. + +

    +MIDI channel settings are not saved in GROOVEs. + +

    + +MMA inserts a MIDI ``track name'' meta event when the channel +buffers are first assigned at a MIDI offset of 0. If the MIDI channel +is reassigned, a new ``track name'' is inserted at the current song +offset. + +

    +A more general method is to use CHANNELPREF detailed below. + +

    +You can access the currently assigned channel with the $_TRACK_CHANNEL macro. + +

    + +

    +ChannelPref +

    + +

    +If you prefer to have certain tracks assigned to certain channels you +can use the CHANNELPREF command to create a custom set of +preferences. By default, +MMA assigns channels starting at 16 and +working down to 1 (with the expectation of drum tracks which are all +assigned channel 10). If, for example, you would like the Bass +track to be on channel 9, sustained bass on channel 3, and +Arpeggio on channel 5, you can have a command like: + +

    + + +
    + +
    ChannelPref Bass=9 Arpeggio=5 Bass-Sus=3
    + +
    + +

    +Most likely this will be in your MMARC file. + +

    +You can use multiple command lines, or have multiple assignments on a +single line. Just make sure that each item consists of a trackname, an +``='' and a channel number in the range 1 to 16. + +

    + +

    +
    +ChShare +

    + +

    + +MMA is fairly conservative in its use of MIDI tracks. ``Out of the +box'' it demands a separate MIDI channel for each of its tracks, but +only as they are actually used. In most cases, this works just fine. + +

    +However, there are times when you might need more tracks than the +available MIDI channels or you may want to free up some channels for +other programs. + +

    +If you have different tracks with the same voicing, it's quite simple. +For example, you might have an arpeggio and scale track: + +

    + + +
    + +
    Arpeggio Sequence A16 z +
    +Arpeggio Voice Piano1 +
    +Scale Sequence z S8 +
    +Scale Voice Piano1
    + +
    + +

    +In this example, +MMA will use different MIDI channels for the +Arpeggio and the Scale. Now, if you force channel +sharing: + +

    + + +
    + +
    Scale ChShare Arpeggio
    + +
    + +

    +both tracks will use the same MIDI channel. + +

    +This is really foolproof in the above example, especially since the +same voice is being used for both. Now, what if you wanted to use a +different voice for the tracks? + +

    + + +
    + +
    Arpeggio Sequence A16 z +
    +Arpeggio Voice Piano1 Strings +
    +Scale Sequence z S8 +
    +Scale ChShare Arpeggio
    + +
    + +

    +You might think that this would work, but it doesn't. +MMA ignores +voice changes for bars which don't have a sequence, so it will set +``Piano1'' for the first bar, then ``Strings'' for the second (so far, +so good). But, when it does the third bar (an ARPEGGIO) it will +not know that the voice has been changed to ``Strings'' by the +Scale track. + +

    +So, the general rule for track channel sharing is to use only one voice. + +

    +One more example which doesn't work: + +

    + + +
    + +
    Arpeggio Sequence A8 +
    +Scale Sequence S4 +
    +Arpeggio Voice Piano1 +
    +Scale Voice Piano1 +
    +Scale ChShare Arpeggio
    + +
    + +

    +This example has an active scale and arpeggio sequence in each +bar. Since both use the same voice, you may think that it will work +just fine ...but it may not. The problem here is that +MMA will +generate MIDI on and off events which may overlap each other. One or +the other will be truncated. If you are using a different octave, it +will work much better. It may sound okay, but you should probably find +a better way to do this. + +

    +When a CHSHARE directive is parsed the ``shared'' channel is +first checked to ensure that it has been assigned. If not currently +assigned, the assignment is first done. What this means is that you +are subverting +MMA 's normal dynamic channel allocation scheme. This +may cause is a depletion of available channels. + +

    +Please note that that the use of the CHSHARE command is +probably never really needed, so it might have more problems than outlined +here. + +

    +This command will always display a warning message. + +

    +For another, simpler, way of reassigning MIDI tracks and letting +MMA do most of the work for you, refer to the +DELETE command. + +

    + +

    +ForceOut +

    + +

    +Under normal conditions +MMA only generates the MIDI tracks it thinks are valid or relevant. So, if you create a track but insert no note data into that track it will not be generated. An easy way to verify this is by creating file and running +MMA with the -c command line option. Lets start off by creating a file you might think will set the keyboard channel on your synth to a TenorSax voice: + +

    + + +
    + +
    Begin Solo-Keyboard +
      Channel 1 +
      Voice TenorSax +
      MIDIVolume 100 +
    +End
    + +
    + +

    +If you compile this you should get: + +

    + + +
    + +
    $ mma test -c +
       +
    +File 'test' parsed, but no MIDI file produced! +
      +
    +Tracks allocated: +
     SOLO-KEYBOARD +
      +
    +Channel assignments: +
    +1 SOLO-KEYBOARD +
    + +
    + +

    +So, a +MMA track was created, but if you compile this file and examine the resulting MIDI file you will find that the voice has not been set. + +

    +To oversome this, insert the FORCEOUT command at the end of the track setup. For example, here is a more complete file which will set the keyboard track to TenorSax with a volume of 100, play a bar of accompaniment, set a Trumpet voice with a louder volume, play another bar, and finally reset the keyboard to the default Piano voice. + +

    + + +
    + +
    Groove BossaNova +
      +
    +Begin Solo +
      Channel 1 +
      Voice TenorSax +
      MIDIVolume 100 +
      ForceOut +
    +End +
      +
    +1 C +
      +
    +Begin Solo +
      Voice Trumpet +
      MIDIVolume 120 +
      ForceOut +
    +End +
      +
    +2 G +
      +
    +Begin Solo +
      Voice Piano1 +
      MIDIVolume 127 +
      ForceOut +
    +End +
    + +
    + +

    +Note: The same or similar results could be accomplished with the MIDI command; however, it's a bit harder to use and the commands would be in the Meta track. + +

    + +

    +MIDI +

    + +

    +The complete set of MIDI commands is not limitless--but from this end +it seems that adding commands to suit every possible configuration is +never-ending. So, in an attempt to satisfy everyone, a command which +will place any arbitrary MIDI stream in your tracks has been +implemented. In most cases this will be a MIDI ``Sysex'' or ``Meta'' +event. + +

    +For example, you might want to start a song off with a MIDI reset: + +

    + + +
    + +
    MIDI 0xF0 0x05 0x7e 0x7f 0x09 0x01 0xf7
    + +
    + +

    +The values passed to the MIDI command are normal integers; however, +they must all be in the range of 0x00 to 0xff. In most cases it is +easiest to use hexadecimal numbers by using the ``0x'' prefix. But, +you can use plain decimal integers if you prefer. + +

    +In the above example: + +

    +

    +
      0xF0
    +
    Designates a SYSEX message + +

    +

    +
      0x05
    +
    The length of the message + +

    +

    +
      0x7e
    +
    ...The actual message + +

    +

    +
    + +

    +Another example places the key signature of F major (1 flat) in the +meta track:18.1 +

    + + +
    + +
    MIDI 0xff 0x59 0x02 0xff 0x00
    + +
    + +

    +Some cautions: + +

      +
    • +MMA makes no attempt to verify the validity of the data! + +

      +

    • +
    • The ``Length'' field must be manually calculated. + +

      +

    • +
    • Malformed sequences can create unplayable MIDI files. In extreme + situations, these might even damage your synth. You are on your own + with this command ...be careful. + +

      +

    • +
    • The MIDI directive always places data in the Meta + track at the current time offset into the file. This should not be a + problem. + +

      +

    • +
    + +

    +Cautions aside, includes/init.mma has been included in this +distribution. I use this without apparent problems; to use it add the +command line: + +

    + + +
    + +
    MMAstart init
    + +
    + +

    +in your MMARC file. The file is pretty well commented and it +sets a synth up to something reasonably sane. + +

    +If you need a brief delay after a raw MIDI command, it is possible to +insert a silent beat with the BEATADJUST + command. See +the file includes/reset.mma for an example. + +

    + +

    +
    +MIDIClear +

    + +

    +As noted earlier in this manual you should be very careful in +programming MIDI sequences into your song and/or library files. Doing +damage to a synthesizer is probably a remote possibility ...but +leaving it in a unexpected mode is likely. For this reason the +MIDICLEAR command has been added as a companion to the +MIDIVOICE and MIDISEQ commands. + +

    +Each time a MIDI track (not necessary the same as a +MMA track) is +ended or a new GROOVE is started, a check is done to see if any +MIDI data has been inserted in the track with a MIDIVOICE or +MIDISEQ command. If it has, a further check is done to see if +there is an ``undo'' sequence defined via a MIDICLEAR command. +That data is then sent; or, if data has not be defined for the track, +a warning message is displayed. + +

    +The MIDICLEAR command uses the same syntax as MIDIVOICE +and MIDISEQ; however, you can not specify different sequence +for different bars in the sequence: + +

    + + +
    + +
    Bass-Funky MIDIClear 1 Modulation 0; 1 ReleaseTime 0
    + +
    + +

    +As in MIDIVOICE and MIDISEQ you can include sequences +defined in a MIDIDEF. The <beat>offsets +are required, but ignored. + +

    + +

    +
    +MIDIFile +

    + +

    +This option controls some fine points of the generated MIDI file. The +command is issued with a series of parameters in the form +``MODE=VALUE''. You can have multiple settings in a single +MIDIFILE command. + +

    + +MMA can generate two types of SMF (Standard MIDI Files): +

    +
    0.
    +
    This file contains only one track into which the data for + all the different channel tracks has been merged. A number of synths + which accept SMF (Casio, Yamaha and others) only accept type 0 + files. + +

    +

    +
    1.
    +
    This file has the data for each MIDI channel in its own + track. This is the default file generated by +MMA . + +

    +

    +
    + +

    +You can set the filetype in an RC file (or, for that matter, in any +file processed by +MMA ) with the command: + +

    + + +
    + +
    MidiFile SMF=0
    + +
    + +

    +or + +

    + + +
    + +
    MidiFile SMF=1
    + +
    + +

    +You can also set it on the command line with the -M option. Using the +command line option will override the MIDISMF command if it is +in a RC file. + +

    +By default +MMA uses ``running status'' when generating MIDI files. +This can be disabled with the command: + +

    + + +
    + +
    MidiFile Running=0
    + +
    + +

    +or enabled (but this is the default) with: + +

    + + +
    + +
    MidiFile Running=1
    + +
    + +

    +Files generated without running status will be about 20 to 30% larger +than their compressed counterparts. They may be useful for use with +brain-dead sequencers and in debugging generated code. There is no +command line equivalent for this option. + +

    + +

    +MIDIGlis +

    + +

    +This sets the MIDI portamento18.2 (in case you're new to all this, +portamento is like glissando between notes--wonderful, if you like +trombones! To enable portamento: + +

    + + +
    + +
    Arpeggio MIDIGlis 30
    + +
    + +

    +The parameter can be any value between 1 and 127. To turn the sliding +off: + +

    + + +
    + +
    Arpeggio MIDIGlis 0
    + +
    + +

    +This command will work with any track (including drum tracks). +However, the results may be somewhat ``interesting'' or +``disappointing'', and many MIDI devices don't support portamento at +all. So, be cautious. The data generated is not sent into the MIDI +stream until musical data is created for the relevant MIDI channel. + +

    + +

    +MIDIInc +

    + +

    + +MMA has the ability to include a user supplied MIDI file at any +point of its generated files. These included files can be used to play +a melodic solo over a +MMA pattern or to fill a section of a song +with something like a drum solo. + +

    +When the MIDIINC command is encountered the current line is +parsed for options, the file is inserted into the stored MIDI stream, +and processing continues. The include has no effect on any song +pointers, etc. + +

    +MIDIINC has a number of options, all set in the form +OPTION=VALUE. Following are the recognized options: + +

    +

    +
    FILENAME
    +
    The filename of the file to be included. This must be + a complete filename. The filename will be expanded by the Python + os.path.expanduser() function for tilde expansion. No prefixes or + extensions are added by +MMA . Examples: FILENAME=/home/bob/midi/myfile.mid. + or FILENAME= /sounds/myfile.mid. + +

    +

    +
    VOLUME
    +
    An adjustment for the volume of all the note on events + in the included MIDI file. The adjustment is specified as a + percentage with values under 100 decreasing the volume and over 100 + increasing it. If the resultant volume (velocity) is less than 1 a + velocity of 1 will be used; if it is over 127, 127 will be + used. Example: VOLUME=80. + +

    +

    +
    OCTAVE
    +
    Octave adjustment for all notes in the file. Values in + the range -4 to 4 are permitted. Notes in drum tracks (channel 10) + will not be effected. Example: OCTAVE=2. + +

    +

    +
    TRANSPOSE
    +
    Transposition adjustment settings in the range -24 to + 24 are permitted. If you do not set a value for this the global + transpose setting will be applied (expecting channel 10, drum, + notes). Example: TRANSPOSE=-2. + +

    +

    +
    LYRIC
    +
    This option will copy any Lyric events to the + +MMA meta track. The valid settings are ``On'' or ``Off''. By + default this is set to ``Off''. Example LYRIC=On. + +

    +

    +
    TEXT
    +
    This option will copy any Text events to the + +MMA meta track. The valid settings are ``On'' or ``Off''. By + default this is set to ``Off''. Example TEXT=On. + +

    +

    +
    START
    +
    Specifies the start point of the file to be included in + beats. For example, ``Start=22'' would start the include process 22 beats + into the file. The data will be inserted at the current song position in + your MMA file. The value used must greater or equal to 0 and may be + a fractional beat value (18.456 if fine). + +

    +

    +
    END
    +
    Specifies the end point of the file to be included in + beats. For example, ``End=100'' would disard all data after 100 beats + in the file. The value used must be greater that the Start position + and can be fractional. + +

    +

    +
    TRACK
    +
    A trackname must be be set into which notes are + inserted. You can set more than one track/channel if you wish. For + example, if you had the option DRUM=10 any notes in the MIDI + file with a channel 10 setting would be inserted into the +MMA Drum track. Similarity, Solo-Tenor=1 will copy notes + from channel 1 into the Solo-Tenor track. If the track + doesn't exist, it will be created. Note: this means that the channel + assignment in your included file and the new +MMA generated file + will most likely be different. Example: SOLO=1 + +

    +

    +
    + +

    +A complete example of usage is shown in the files in the directory +egs/frankie in the distribution. A short example: + +

    + + +
    + +
    MIDIinc File=test.mid Solo-Piano=1 Drum=10 Volume=70
    + +
    + +

    +will include the MIDI file ``test.mid'' at the current position and +assign all notes in channel 1 to the Solo-Piano track and the +notes from channel 10 to the Drum track. The volumes for all +the notes will be adjusted to 70% of that in the original. + +

    +A few notes: + +

    + +

      +
    • MIDI files to be included do not have to have the same tempo. + MIDI adjusts this automatically on playback. However, the internal + setting for beat division should be the same. +MMA assumes a beat + division of 192 (this is set in bytes 12 and 13 of the MIDI file). + If the included file differs a warning is printed and +MMA will + attempt to adjust the timings. + +

      +

    • +
    • All files are parsed to find the offset of the first note-on + event; notes to be included are set with their offsets compensated + by that time. This means that any silence at the start of the + included file is skipped (this may surprise you if you have used the + optional Start setting). If you want the included file to start + somewhere besides the start of the current bar you can use a + BEATADJUST before the MIDIINC--use another to move + the pointer back right after the include to keep the song pointer + correct. + +

      +

    • +
    • Not all events in the included files are transferred: notably + all system and meta events (other than text and lyric, see above) are ignored. + +

      +

    • +
    • If you want to apply different VOLUME or other options to + different tracks, just do multiple includes of the same file (with + each include using a different track and options). + +

      +

    • +
    + +

    + +

    +MIDIMark +

    + +

    +You can insert a MIDI Marker event into the Meta track with this command. The mark can be useful +in debugging your MIDI output with a sequencer or editor which supports Mark events (most do). + +

    + + +
    + +
    MidiMark Label
    + +
    + +

    +will insert the text ``Label'' at the current position. You can add an optional negative +or positive offset in beats: + +

    + + +
    + +
    MidiMark 2 Label4
    + +
    + +

    +will insert ``Label4'' 2 beats into the next bar. + +

    + +

    +MIDIPan +

    + +

    +In MIDI-speak ``pan'' is the same as ``balance'' on a stereo. By +adjusting the MIDIPAN for a track you can direct the output to the +left, right or both speakers. Example: + +

    + + +
    + +
    Bass MIDIPan 4
    + +
    + +

    +This command is only available in track mode. The data generated is +not sent into the MIDI stream until musical data is created for the +relevant MIDI channel. + +

    +The value specified must be in the range 0 to 127, and must be an integer. + +

    +MIDIPAN is not saved or restored by GROOVE commands, nor is +it effected by SEQCLEAR. A MIDIPAN is inserted directly into +the MIDI track at the point at which it is encountered in the music +file. This means that the effect of MIDIPAN will be in use until +another MIDIPAN is encountered. + +

    +MIDIPAN can be used in MIDI compositions to emulate the sound of an +orchestra. By assigning different values to different groups of +instruments, you can get the feeling of strings, horns, etc. all +placed in the ``correct'' position on the stage. + +

    +MIDIPAN can be used for much cruder purposes. When creating accompaniment +tracks for a mythical jazz group, you might set all the bass tracks (Bass, Walk, +Bass-1, etc) set to aMIDIPAN 0. Now, when practicing at home you have a +``full band''; and the bass player can practice without the generated +bass lines simply by turning off the left speaker. + +

    +Because most MIDI keyboard do not reset between +tunes, there should be a MIDIPAN to undo the effects at the end of +the file. Example:18.3 +

    + + +
    + +
    Include swing +
    +Groove Swing +
    +Bass MIDIPan 0 +
    +Walk MIDIPan 0 +
    +1 C +
    +2 C +
    ... +
    +123 C +
    +Bass MIDIPan 64 +
    +Walk MIDIPan 64
    + +
    + +

    + +

    +MIDISeq +

    + +

    +It is possible to associate a set of MIDI controller messages with +certain beats in a sequence. For example, you might want to have the +Modulation Wheel set for the first beats in a bar, but not for the +third. The following example shows how: + +

    + + +
    + +
    Seqsize 4 +
    +Begin Bass-2 +
    +Voice NylonGuitar +
    +Octave 4 +
    +Sequence { 1 4 1 90; 2 4 3 90; 3 4 5 90; 4 4 1+ 90} +
    +MIDIDef WheelStuff 1 1 0x7f ; 2 1 0x50; 3 1 0 +
    +MidiSeq WheelStuff +
    +Articulate 90 +
    +End +
    +
    +C $*$ 4
    + +
    + +

    +The MIDISEQ command is specific to a track and is saved as part +of the GROOVE definition. This lets style file writers use +enhanced MIDI features to dress up their sounds. + +

    +The command has the following syntax: + +

    + + +
    + +
    TrackName MidiSeq <Beat> <Controller> <Datum> [ ; ...]
    + +
    + +

    +where: +

    +
    Beat
    +
    is the Beat in the bar. This can be an integer (1,2, etc.) + or a floating point value (1.2, 2.25, etc.). It must be 1 or greater + and less than the end of bar (in 4/4 it must be less than + 5). + +

    +

    +
    Controller
    +
    A valid MIDI controller. This can be a value in the + range 0x00 to 0x7f or a symbolic name. See the appendix + , here, for a list of + defined names. + +

    +

    +
    Datum
    +
    All controller messages use a single byte ``parameter'' + in the range 0x00 to 0x7f. + +

    +

    +
    + +

    +You can enter the values in either standard decimal notation or in +hexadecimal with the prefixed ``0x''. In most cases, your code will be +clearer if you use values like ``0x7f'' rather than the equivalent +``127''. + +

    +The MIDI sequences specified can take several forms: + +

    + +

      +
    1. A simple series like: + +

      + + +
      + +
      MIDISeq 1 ReleaseTime 50; 3 ReleaseTime 0
      + +
      + +

      +in this case the commands are applied to beats 1 and 3 in each bar + of the sequence. + +

      +

    2. +
    +

    . + +

    + +

    +As a set of names predefined in an MIDIDEF command: + +

    + + +
    + +
    MIDIdef Rel1 1 ReleaseTime 50; 3 ReleaseTime 0 +
    +MIDIdef Rel2 2 ReleaseTime 50; 4 ReleaseTime 0 +
    +MIDISeq Rel1 Rel2
    + +
    + +

    +Here, the commands defined in ``Rel1'' are applied to the first bar + in the sequence, ``Rel2'' to the second. And, if there are more bars + in the sequence than definitions in the line, the series will be + repeated for each bar. + +

    +A set of series enclosed in { } braces. Each braced series is + applied to a different bar in the sequence. The example above could + have been does as: + +

    + + +
    + +
    MIDISeq { 1 ReleaseTime 50; 3 ReleaseTime 0 } \ +
    { 2 ReleaseTime 50; 4 ReleaseTime 0 }
    + +
    + +

    +Finally, you can combine the above into different combinations. + For example: + +

    + + +
    + +
    MIDIDef Rel1 1 ReleaseTime 50 +
    +MIDIDef Rel2 2 ReleaseTime 50 +
    +MIDISeq { Rel1; 3 ReleaseTime 0 } { Rel2; 4 ReleaseTime 0 }
    + +
    + +

    + +

    +You can have specify different messages for different beats (or +different messages/controllers for the same beat) by listing them on +the same MIDISEQ line separated by ``;''s. + +

    +If you need to repeat a sequence for a measure in a sequence you can +use the special notation ``/'' to force the use of the previous line. +The special symbol ``z'' or ''-'' can be used to disable a bar (or +number of bars). For example: + +

    + + +
    + +
    Bass-Dumb MIDISeq 1 ReleaseTime 20 z / FOOBAR
    + +
    + +

    +would set the ``ReleaseTime'' sequence for the first bar of the +sequence, no MIDISeq events for the second and third, and the contents +of ``FOOBAR'' for the fourth. + +

    +To disable the sending of messages just use a single ``-'': + +

    + + +
    + +
    Bass-2 MidiSeq - // disable controllers
    + +
    + +

    + +

    +MIDISplit +

    + +

    +For certain post-processing effects it is convenient to have each different drum tone +in a separate MIDI track. This makes it easier to apply an effect to, for example, the +snare drum. Just to make this a bit more fun you can split any track +created by +MMA . + +

    +To use this feature: + +

    + + +
    + +
    MIDISplit <list of channels>
    + +
    + +

    +So, to split out just the drum channel18.4 you would have the command: + +

    + + +
    + +
    MIDISplit 10
    + +
    + +

    +somewhere in your song file. + +

    +When processing +MMA creates an internal list of MIDI note-on events for each tone or pitch +in the track. It then creates a separate MIDI track for each list. Any other events are +written to another track. + +

    + +

    +MIDITname +

    + +

    +When creating a MIDI track, +MMA inserts a MIDI Track Name event at the start of the track. +By default, this name is the same as the associated +MMA track name. You can change +this by issuing the MIDITNAME command. For example, to change the CHORD +track name you might do something like: + +

    + + +
    + +
    Chord MidiTname Piano
    + +
    + +

    +Please note that this only effects the tracks in the generated MIDI file. +You still refer to the track in your file as CHORD. + +

    + +

    +MIDIVoice +

    + +

    +Similar to the MIDISEQ command discussed in the previous +section, the MIDIVOICE command is used to insert MIDI +controller messages into your files. Instead of sending the data for +each bar as MIDISEQ does, this command just sends the listed +control events at the start of a track and then, if needed, at the +start of each bar. + +

    +Again, a short example. Let us assume that you want to use the +``Release Time'' controller to sustain notes in a bass line: + +

    + + +
    + +
    Seqsize 4 +
    +Begin Bass-2 +
    +Voice NylonGuitar +
    +MidiVoice 1 ReleaseTime 50 +
    +Octave 4 +
    +Sequence { 1 4 1 90; 2 4 3 90; 3 4 5 90; 4 4 1+ 90} +
    +Articulate 60 +
    +End +
    +
    +C $*$ 4
    + +
    + +

    +should give an interesting effect. + +

    +The syntax for the command is: + +

    + + +
    + +
    Track MIDIVoice <beat> <controller> <Datum> [; ...]
    + +
    + +

    +This syntax is identical to that discussed in the section for +MIDISEQ, above. The <beat>value is +required for the command--it determines if the data is sent before or +after the VOICE command is sent. Some controllers are reset by +a voice, others not. My experiments show that BANK should be +sent before, most others after. Using a ``beat'' of ``0'' forces the +MidiVoice data to be sent before the Voice control; any other ``beat'' +value causes the data to be sent after the Voice control. In this +silly example: + +

    + + +
    + +
    Voice Piano1 +
    +MidiVoice {0 Bank 5; 1 ReleaseTime 100}
    + +
    + +

    +the MIDI data is created in an order like: + +

    +

    +

    0 Param Ch=xx Con=00 val=05 +
    +0 ProgCh Ch=xx Prog=00 +
    +0 Param Ch=xx Con=72 val=80 + +
    + +

    +All the MIDI events occur at the same offset, but the order is (may +be) important. + +

    +By default +MMA assumes that the MIDIVoice data is to be used only +for the first bar in the sequence. But, it's possible to have a +different sequence for each bar in the sequence (just like you can +have a different VOICE for each bar). In this case, group the +different data groups with {} brackets: + +

    + + +
    + +
    Bass-1 MIDIVoice {1 ReleaseTime 50} {1 ReleaseTime 20}
    + +
    + +

    +This list is stored with other GROOVE data, so is ideal for +inclusion in a style file. + +

    +If you want to disable this command after it has been issued you can +use the form: + +

    + + +
    + +
    Track MIDIVoice - // disable
    + +
    + +

    +Some technical notes: + +

    + +

      +
    • +MMA tracks the events sent for each bar and will not duplicate + sequences. + +

      +

    • +
    • Be cautious in using this command to switch voice banks. If you + don't switch the voice bank back to a sane value you'll be playing + the wrong instruments! + +

      +

    • +
    • Do use the MIDICLEAR command ((details)) to ``undo'' anything + you've done via a MIDIVOICE command. + +

      +

    • +
    + +

    + +

    +
    +MIDIVolume +

    + +

    +MIDI devices equipped with mixer settings can make use of the +``Channel'' or ``Master'' volume settings.18.5 +

    + +MMA doesn't set any channel volumes without your knowledge. If you +want to use a set of reasonable defaults, look at the file +includes/init.mma which sets all channels other than ``1'' to +``100''. Channel ``1'' is assumed to be a solo/keyboard track and is +set to the maximum volume of ``127''. + +

    +You can set selected MIDIVOLUMEs: + +

    + + +
    + +
    Chord MIDIVolume 55
    + +
    + +

    +will set the Chord track channel. For most users, the use of this +command is not recommended since it will upset the balance of +the library grooves. If you need a track softer or louder you should +use the volume setting for the track. + +

    +The data generated is not sent into the MIDI stream until musical data +is created for the relevant MIDI channel. + +

    +Caution: If you use the command with ALLTRACKS you should note +that only existing +MMA tracks will be effected. + +

    +


    Footnotes

    +
    +
    ... track:18.1
    +
    This is much easier to do + with the KeySig command, here + +
    +
    ... portamento18.2
    +
    The name ``Glis'' is used because +``MIDIPortamento'' gets to be a bit long to type and ``MIDIPort'' might +be interpreted as something to do with ``ports''. + +
    +
    ... Example:18.3
    +
    This is much easier to do with the + MMAStart and MMAEnd options (details). + +
    +
    ... channel18.4
    +
    In +MMA this will always be +channel 10. + +
    +
    ... settings.18.5
    +
    I discovered this + on my keyboard after many frustrating hours attempting to balance + the volumes in the library. Other programs would change the keyboard + settings, and not being aware of the changes, I'd end up scratching + my head. + +
    +

    + + +next + +up + +previous +
    + Next: Fine Tuning (Translations) + Up: Reference Manual + Previous: Variables, Conditionals and Jumps + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node19.html b/mma/docs/html/ref/node19.html new file mode 100644 index 0000000..e80af14 --- /dev/null +++ b/mma/docs/html/ref/node19.html @@ -0,0 +1,539 @@ + + + + + +Fine Tuning (Translations) + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Other Commands and Directives + Up: Reference Manual + Previous: Low Level MIDI Commands +
    +
    + + +Subsections + + + +
    + +

    + +
    +Fine Tuning (Translations) +

    + +

    +A program such as +MMA which is intended to be run of various +computers and synthesizers (both hardware keyboards and software +versions) suffers from a minor deficency of the MIDI standards: mainly +that the standard says nothing about what a certain instrument should +sound like, or the relative volumes between instruments. The GM +extension helps a bit, but only a bit, by saying that certain +instruments should be assigned certain program change values. This +means that all GM synths will play a "Piano" if instrument 000 is +selected. + +

    +But, if one plays a GM file on a Casio keyboard, then on PC +soft-synth, and then on a Yahama keyboard you will get three quite +different sounds. The files supplied in this distribution have been +created to sound good on the author's setup: A Casio WK-3000 keyboard. + +

    +But, what if your hardware is different? Well, there are solutions! +Later in this chapter commands are shown which will change the +preselected voice and tone commands and the default volumes. At this +time there are no example files supplied with +MMA , but your +contributions are welcome. + +

    +The general suggestion is that: + +

    + +

      +
    1. You create a file with the various translations you need. For + example, the file might be called yamaha.mma and contain + lines like: + +

      + + +
      + +
      VoiceTR Piano1=Piano2 +
      +ToneTr SnareDrum2=SnareDrum1 +
      +VoiceVolTr Piano2=120 BottleBlow=80 +
      +DrumVolTr RideBell=90 Tambourine=120
      + +
      + +

      +Place this file in the directory /usr/local/share/mma/includes. + +

      +

    2. +
    3. Include this file in your ~/.mmarc file. Following the + above example, you would have a line: + +

      + + +
      + +
      Include yamaha
      + +
      + +

      +

    4. +
    + +

    +That's it! Now, whenever you compile a +MMA file the translations +will be done. + +

    +All of the following translation settings follow a similar logic as to ``when'' +they take effect, and that is at the time the VOICE, +VOLUME, etc. command is issued. This may confuse the unwary if +GROOVES are being used. But, the following sequence: + +

    + + +
    + +
      +
    1. You set a voice with the VOICE command, +
    2. +
    3. You save that voice into a GROOVE with DEFGROOVE, +
    4. +
    5. You create a voice translation with VOICETR, +
    6. +
    7. You activate the previously defined GROOVE. +
    8. +
    + + + +
    Wrong!
    + +

    +does not have the desired effect. In the above sequence the +VOICETR will have no effect. For the desired +translations to work the VOICE (or whatever) command must come +after the translation command. + +

    + +

    +
    +VoiceTr +

    + +

    +In previous section you saw how to set a voice for a track by using its +standard MIDI name. The VOICETR command sets up a translation +table that can be used in two different situations: + +

    + +

      +
    • It permits creation of your own names for voices (perhaps for a + foreign language), + +

      +

    • +
    • It lets you override or change voices used in standard library + files. + +

      +

    • +
    + +

    +VOICETR works by setting up a simple translation table of +``name'' and ``alias'' pairs. Whenever +MMA encounters a voice name +in a track command it first attempts to translate this name though the +alias table. + +

    +To set a translation (or series of translations): + +

    + + +
    + +
    VoiceTr Piano1=Clavinet Hmmm=18
    + +
    + +

    +Note that you additional VOICETR commands will add entries to +the existing table. To clear the table use the command with no +arguments: + +

    + + +
    + +
    VoiceTr // Empty table
    + +
    + +

    +Assuming the first command, the following will occur: + +

    + + +
    + +
    Chord-Main Voice Hmmm
    + +
    + +

    +The VOICE for the Chord-Main track will be set to ``18'' +or ``Organ3''. + +

    + + +
    + +
    Chord-2 Voice Piano1
    + +
    + +

    +The VOICE for the Chord-2 track will be set to +``Clavinet''. + +

    +If your synth does not follow standard GM-MIDI voice naming +conventions you can create a translation table which can be included +in all your +MMA song files via an RC file. But, do note that the +resulting files will not play properly on a synth conforming to the +GM-MIDI specification. + +

    +Following is an abbreviated and untested example for using an obsolete and unnamed synth: + +

    + + +
    + +
    VoiceTr Piano1=3 \ +
    +Piano2=4 \ +
    +Piano3=5 \ +
    ... \ +
    +Strings=55 \ +
    ...
    + +
    + +

    +Notes: the translation is only done one time and no verification is +done when the table is created. + +

    +For translating drum tone values, see +DRUMTR. + +

    + +

    +
    +DrumTr +

    + +

    +It is possible to create a translation table which will substitute one +Drum Tone for another. This can be useful in a variety of +situations, but consider: + +

    + +

      +
    • Your syth lacks certain drum tones--in this case you may want + to set certain DRUMTR commands in a MMARC file. + +

      +

    • +
    • You are using an existing GROOVE in a song, but don't + like one or more of the Drum Tones selected. Rather than + editing the library file you can set a translation right in the + song. Note, do this before any GROOVE commands. +
    • +
    + +

    +To set a translation (or set of translations) just use a list of +drumtone values or symbolic names with each pair separated by +white space. For example: + +

    + + +
    + +
    ToneTR SnareDrum2=SnareDrum1 HandClap=44
    + +
    + +

    +will use a ``SnareDrum1'' instead of a ``SnareDrum2'' and the value +``44'' (actually a ``PedalHiHat'') instead of a ``HandClap''. + +

    +You can turn off all drum tone translations with an empty line: + +

    + + +
    + +
    ToneTR
    + +
    + +

    +The syntax and usage of DRUMTR is quite similar to +VOICETR. + +

    + +

    +
    +VoiceVolTr +

    + +

    +If you find that a particular voice, i.e., Piano2, is too loud or soft +you can create an entry in the ``Voice Volume Translation Table''. The +concept is quite simple: +MMA checks the table whenever a +track-specific VOLUME command is processed. The table is +created in a similar manner to the VOICETR command: + +

    + + +
    + +
    VoiceVolTr Piano2=120 105=75
    + +
    + +

    +Each voice pair must contain a valid MIDI voice (or numeric value), +an ``='' and a volume adjustment factor. The factor is a percentage +value which is applied to the normal volume. In the above example two +adjustments are created: + +

    + +

      +
    1. Piano2 will be played at %120 of the normal value, + +

      +

    2. +
    3. Banjo (voice 105) will be played at %75 of the normal value. +
    4. +
    + +

    +The adjustments are made when a track VOLUME command is +encountered. For example, if the above translation has be set and + +MMA encounters the following commands: + +

    + + +
    + +
    Begin Chord +
       Voice Piano2 +
       Volume mp +
       Sequence 1 4 90 +
    +End
    + +
    + +

    +the following adjustments are made: + +

    + +

      +
    1. A lookup is done in the global volume table. The volume ``mf'' + is determined to be %85 for the set MIDI velocity, + +

      +

    2. +
    3. the adjusment of %120 is applied to the %85, changing that to %102. + +

      +

    4. +
    5. Assuming that no other volume adjustments are being made + (probably there will be a global volume and, perhaps, a + RVOLUME) the MIDI velocity in the sequence will be changed + from 90 to 91. Without the translation the 90 would have been changed to 76. + +

      +

    6. +
    + +

    +To disable all volume translations: + +

    + + +
    + +
    VoiceVolTr // Empty table
    + +
    + +

    + +

    +
    +DrumVolTr +

    + +

    +You can change the volumes of indvidual drum tones with the +DRUMVOLTR translation. This command works just like the +VOICEVOLTR command desribed above. It just uses drum tones +instead of instrument voices. + +

    +For example, if you wish to make the drum tones ``SnareDrum1'' and +``HandClap'' a bit louder: + +

    + + +
    + +
    DrumVolTr SnareDrum1=120 HandClap=110
    + +
    + +

    +The drum tone names can be symbolic constants, or MIDI values as in +the next example: + +

    + + +
    + +
    DrumVolTr 44=90 31=55
    + +
    + +

    +All drum tone translations can be disabled with: + +

    + + +
    + +
    DrumVolTr // Empty table
    + +
    + + +

    +


    + + +next + +up + +previous +
    + Next: Other Commands and Directives + Up: Reference Manual + Previous: Low Level MIDI Commands + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node2.html b/mma/docs/html/ref/node2.html new file mode 100644 index 0000000..4bf8398 --- /dev/null +++ b/mma/docs/html/ref/node2.html @@ -0,0 +1,452 @@ + + + + + +Running + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Tracks and Channels + Up: Reference Manual + Previous: Overview and Introduction +
    +
    + + +Subsections + + + +
    + +

    + +
    +Running +MMA +

    + +

    + +MMA is a command line program. To run it, simply type the program +name followed by the required options. For example, + +

    + + +
    + +
    $ mma test
    + +
    + +

    +processes the file test2.1 and creates +the MIDI file test.mid. + +

    + +

    +Command Line Options +

    + +

    +The following command line options are available: + +

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    + +
    + Debugging and other + aids to figuring out what's going on. + +
    +
    -vShow program's version number and exit.
    -dEnable LOTS of debugging messages. This option is mainly + designed for program development and may not be useful to users.2.2
    -oA debug subset. This option forces the display of complete + filenames/paths as they are opened for reading. This can be + quite helpful in determining which library files are being used.
    -pDisplay patterns as they are defined. The result of + this output is not exactly a duplicate of your original + definitions. Most notable are that the note duration is + listed in MIDI ticks, and symbolic drum note names are + listed with their numeric equivalents.
    -sDisplay sequence info during run. This shows the + expanded lists used in sequences. Useful if you have used + sequences shorter (or longer) than the current sequence + length.
    -rDisplay running progress. The bar numbers are displayed as they + are created complete with the original input line. Don't be confused + by multiple listing of ``*'' lines. For example the line + +
    +
    +33 Cm + * 2 +
    + +
    + would be displayed as: + +

    + + +
    +
    +88: 33 Cm *2 +
    +89: 33 Cm *2 +
    + +
    + +

    +This makes perfect sense if you remember that the same line + was used to create both bars 88 and 89.

    -eShow parsed/expanded lines. Since +MMA does some + internal fiddling with input lines, you may find this option + useful in finding mismatched BEGIN blocks, etc.
    -cDisplay the tracks allocated and the MIDI channel + assignments after processing the input file. No output is + generated.
    + +
    + Commands which modify + +MMA 's behaviour. + +
    +
    -SSet a macro. If a value is needed, join the value to the name + with a '='. For example: + +

    + + +
    +
    +$ mma myfile -S tempo=120 +
    + +
    + +

    +will process the file myfile.mma with the variable $Tempo + set with the value ``120''. You need not specify a value: + +

    + + +
    +
    +$ mma myfile -S test +
    + +
    + +

    +just sets the variable $test with no value.

    -nDisable generation of MIDI output. This is useful + for doing a test run or to check for syntax errors in your script.
    -mBARSSet the maximum number of bars which can be generated. + The default setting is 500 bars (a long song!2.3). This setting is + needed since you can create infinite loops by improper use of the + GOTO command. If your song really is longer than 500 bars + use this option to increase the permitted size.
    -MxGenerate type 0 or 1 MIDI files. The parameter ``x'' must be + set to the single digit ``0'' or ''1''. For more details, see the + MIDISMF section here.
    + +
    + Maintaining +MMA 's database. + +
    +
    +

    +-g

    Update the library database for the files in the + LIBPATH. You should run this command after installing new + library files or adding a new groove to an existing library file. If + the database (stored in the files in each library under the name + .mmaDB) is not updated, +MMA will not be able to auto-load + an unknown groove. Please refer to the detailed discussion + here for details. + +

    +
    + +

    +The current installation of +MMA does not set directory + permissions. It simply copies whatever is in the distribution. If + you have trouble using this option, you will probably have to reset + the permissions on the lib directory. + +

    +
    + +

    + +MMA will update the groove database with all files in the + current LIBPATH. All files must have a ``.mma'' + extension. Any directory containing a file named MMAIGNORE + will be ignored. Note, that MMAIGNORE consists of all + uppercase letters and is usually an empty file.

    -GSame as the ``-g'' option (above), but the uppercase version + forces the creation of a new database file--an update from scratch + just in case something really goes wrong.
    + +
    + File commands. + +
    +
    +

    +-i

    Specify the RC file to use. See +details here.
    +

    +-fFILE

    Set output to FILE. Normally the output is sent to a file + with the name of the input file with the extension ``.mid'' appended + to it. This option lets you set the output MIDI file to any filename.
    + +
    + The following commands + are used to create the documentation. As a user you should + probably never have a need for any of them. + +
    +
    -DkPrint list of +MMA keywords. For editor extension writers.
    -DxlExpand and print DOC commands used to generate the + standard library reference for Latex processing. No MIDI output is + generated when this command is given. Doc strings in RC files are not + processed. Files included in other files are processed.
    -DxhSame as -Dxl, but generates HTML output. Used by the mklibdoc.py tool.
    -DnCreate a table of the available chord types.
    -DdaCreate a table of the MIDI drum note names, arranged alphabetically.
    -DdmCreate a table of the MIDI drum note names, arranged by MIDI value.
    -DiaCreate a table of the MIDI instrument names, arranged alphabetically.
    -DimCreate a table of the MIDI instrument names, arranged by MIDI value.
    + +

    + +

    +Lines and Spaces +

    + +

    +When +MMA reads a file it processes the lines in various places. The +first reading strips out blank lines and comments of the ``//'' type. + +

    +On the initial pass though the file any continuation lines are joined. +A continuation line is any line ending with a single +`` \''--simply, the next line is concatenated to the current +line to create a longer line. + +

    +Unless otherwise noted in this manual, the various parts of a line are +delimited from each other by runs of whitespace. Whitespace can be tab +characters or spaces. Other characters may work, but that is not +recommended, and is really determined by Python's definitions. + +

    + +

    +Programming Comments +

    + +

    + +MMA is designed to read and write files; it is not a +filter.2.4 +

    +As noted earlier in this manual, +MMA has been written entirely in +Python.There were some initial concerns about the speed of a +``scripting language'' when the project was started, but Python's +speed appears to be entirely acceptable. On an AMD Athlon 1900+ system +running Mandrake Linux 10.1, most of songs compile to MIDI in well +under one second. If you need faster results, you're welcome to recode +this program into C or C++, but it would be cheaper to buy a faster +system, or spend a bit of time tweaking some of the more time +intensive Python loops. + +

    +I've done a bit of testing with Psyco http://psyco.sourceforge.net/ and have found speed increases in the order of 15% to 20%. Output seems fine, so use it if speed is important to you. + +

    +


    Footnotes

    +
    +
    ...test2.1
    +
    Actually, the file test + or test.mma is processed. Please read section + file extensions. + +
    +
    ... users.2.2
    +
    + A number of the debugging commands can also be set dynamically in a + song. See the debug section here + for details. + +
    +
    ... song!2.3
    +
    500 bars with + 4 beats per bar at 200 BPM is about 10 minutes. + +
    +
    ... +filter.2.4
    +
    A filter mode could be added to +MMA , but I'm not + sure why this would be needed). + +
    +

    + + +next + +up + +previous +
    + Next: Tracks and Channels + Up: Reference Manual + Previous: Overview and Introduction + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node20.html b/mma/docs/html/ref/node20.html new file mode 100644 index 0000000..49c1cc2 --- /dev/null +++ b/mma/docs/html/ref/node20.html @@ -0,0 +1,1486 @@ + + + + + +Other Commands and Directives + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Begin/End Blocks + Up: Reference Manual + Previous: Fine Tuning (Translations) +
    +
    + + +Subsections + + + +
    + +

    + +
    +Other Commands and Directives +

    + +

    +In addition to the ``Pattern'', ``Sequence'', ``Groove'' and +``Repeat'' and other directives discussed earlier, and chord data, + +MMA supports a number of directives which affect the flavor of your +music. + +

    +The subjects presented in this chapter are ordered alphabetically. + +

    + +

    +
    +AllTracks +

    + +

    +Sometimes you want to apply the same command to all the currently +defined tracks; for example, you might want to ensure that no +tracks have SEQRND set. Yes, you could go though each track +(and hope you don't miss any) and explicitly issue the command: + +

    + + +
    + +
    Bass SeqRnd Off + .... +
    +Chord SeqRnd Off
    + +
    + +

    +But, + +

    + + +
    + +
    AllTracks SeqRnd Off
    + +
    + +

    +is much simpler. Similarly, you can set the articulation for all +tracks with: + +

    + + +
    + +
    AllTracks Articulate 80
    + +
    + +

    +You can even combine this with a BEGIN/END like: + +

    + + +
    + +
    Begin AllTracks +
      Articulate 80 +
      SeqRnd Off +
      Rskip 0 +
    +End
    + +
    + +

    +This command is handy when you are changing an existing GROOVE. + +

    +Note that only currently defined tracks are effected by this command. + +

    +A further option is to limit ALLTRACKS to specific tracks +type. For example, you might want to set all the DRUM track +volumes to ``FF'': + +

    + + +
    + +
    AllTracks Drum Volume ff
    + +
    + +

    +Or to set the articulation on BASS and WALK tracks: + +

    + + +
    + +
    AllTracks Bass Walk Articulate 55
    + +
    + +

    +It is assumed that all the arguments following the initial command +which are valid track types (Bass, Chord, Arpeggio, Scale, Drum, Walk, +Melody, or Solo) are track type limiters. + +

    + +

    +
    +Articulate +

    + +

    +When +MMA processes a music file, all the note lengths specified in a +pattern are converted to MIDI lengths. + +

    +For example in: + +

    + + +
    + +
    Bass Define BB 1 4 1 100; 2 4 5 90; 3 4 1 80; 4 4 5 90
    + +
    + +

    +bass notes on beats 1, 2, 3 and 4 are define. All are quarter notes. + +MMA , being quite literal about things, will make each note exactly +192 MIDI ticks long--which means that the note on beat 2 will start +at the same time as the note on beat 1 ends. + +

    + +MMA has an articulate setting for each voice. This value is applied +to shorten or lengthen the note length. By default, the setting is 90. +Each generated note duration is taken to be a percentage of this +setting, So, a quarter note with a MIDI tick duration of 192 will +become 172 ticks long. + +

    +If articulate is applied to a short note, you are guaranteed that the +note will never be less than 1 MIDI tick in length. + +

    +To set the value, use a line like: + +

    + + +
    + +
    Chord-1 Articulate 96
    + +
    + +

    +Articulate values must be greater than 0 and less than or +equal to 200. Values over 100 will lengthen the note. Settings +greater than 120 will generate a warning. + +

    +You can specify a different ARTICULATE for each bar in a +sequence. Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Articulate 50 60 / 30
    + +
    + +

    +Notes: The full values for the notes are saved with the +pattern definition. The articulation adjustment is applied at +run time. The ARTICULATE setting is saved with a +GROOVE. + +

    + +

    +
    +Copy +

    + +

    +Sometimes it is useful to duplicate the settings from one voice to +another. The COPY command does just that: + +

    + + +
    + +
    Bass-1 Copy Bass
    + +
    + +

    +will copy the settings from the Bass track to the Bass-1 track. + +

    +The COPY command only works between tracks of the same type. + +

    +The following settings are copied: + +

    + +

    + +

    + +

    +
    +Comment +

    + +

    +As previously discussed, a comment in +MMA is anything following a +``//'' in a line. A second way of marking a comment is with the +COMMENT directive. This is quite useful in combination the +BEGIN and END directives. For example: + +

    + + +
    + +
    Begin Comment +
        This is a description spanning +
            several lines which will be +
            ignored by MMA. +
    +End
    + +
    + +

    +You could achieve the same with: + +

    + + +
    + +
    // This is a description spanning +
    // several lines which will be +
    // ignored by MMA.
    + +
    + +

    +or even: + +

    + + +
    + +
    Comment This is a description spanning +
    +Comment several lines which will be +
    +Comment ignored by MMA.
    + +
    + +

    +One minor difference between // and +COMMENT is that the first is discarded when the +input stream is read; the more verbose version is +discarded during line processing. + +

    +Quite often it is handy to delete large sections of a song with a +BEGIN COMMENT/END on a temporary basis. + +

    + +

    +
    +Debug +

    + +

    +To enable you to find problems in your song files (and, perhaps, even +find problems with +MMA itself) various debugging messages can be +displayed. These are normally set from the command line +command line. + +

    +However, it is possible to enable various debugging messages +dynamically in a song file using the DEBUG directive. In a +debug statement you can enable or disable any of a variety of +messages. A typical directive is: + +

    + + +
    + +
    Debug Debug=On Expand=Off Patterns=On
    + +
    + +

    +Each section of the debug directive consists of a mode +and the command word ON or OFF. The two parts +must be joined by a single ``$=$''. You may use the +values ``0'' for ``Off'' and ``1'' for ``On'' if desired. + +

    +The available modes with the equivalent command line switches are: + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ModeCommand Line Equivalent
    Debug-ddebugging messages
    Filenames-odisplay filenames
    Patterns-ppattern creation
    Sequence-ssequence creation
    Runtime-rrunning progress
    Warnings-wwarning messages
    Expand-edisplay expanded lines
    +
    + +

    +The modes and command are case-insensitive (although the command line switches are not). + +

    +The current state of the debug flags is saved in the variable +$_Debug and the state prior to a change is saved in $_LastDebug. + +

    + +

    +
    +Delete +

    + +

    +If you are using a track in only one part of your song, especially if +it is at the start, it may be wise to free that track's resources when +you are done with it. The DELETE command does just that: + +

    + + +
    + +
    Solo Delete
    + +
    + +

    +If a MIDI channel has been assigned to that track, it is +marked as ``available'' and the track is deleted. Any data +already saved in the MIDI track will be written when +MMA is +finished processing the song file. + +

    + +

    +
    +Direction +

    + +

    +In tracks using chords or scales you can change the direction in which +they are applied: + +

    + + +
    + +
    Scale Direction UP
    + +
    + +

    +The effects differ in different track types. For SCALE and ARPEGGIO tracks: + +

    +

    + + + + + + + + + + + + + +
    UPPlays in upward direction only
    DOWNPlays in downward direction only
    BOTHPlays upward and downward (default)
    RANDOMPlays notes from the chord or scale randomly
    +
    +

    +

    When this command is encountered in a SCALE track the start +point of the scale is reset. +
    +

    + +

    +A WALK track recognizes the following option settings: + +

    +

    + + + + + + + + + + + + + +
    BOTHThe default. The bass pattern + will go up and down a partial scale. Some notes may be repeated.
    UPNotes will be chosen sequentially from an ascending, partial scale.
    DOWNNotes will be chosen sequentially from a descending, partial scale.
    RANDOMNotes will be chosen in a random direction from a partial scale.
    +
    +

    +

    All four patterns are useful and create quite different effects. + +
    + +

    +The CHORD tracks DIRECTION only has an effect when the +STRUM setting has a non-zero value. In this case the following +applies: + +

    +

    + + + + + + + + + + + + + +
    UPThe default. Notes are sounded from the lowest tone to the highest.
    DOWNNotes are sounded from the highest to the lowest.
    BOTHThe UP and DOWN values are alternated.
    RANDOMIgnored (uses UP).
    +
    + +

    +You can specify a different DIRECTION for each bar in a +sequence. Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Arpeggio Direction Up Down / Both
    + +
    + +

    +The setting is ignored by BASS, DRUM and SOLO tracks. + +

    + +

    +Mallet +

    + +

    +Some instruments (Steel-drums, banjos, marimbas, etc.) are normally +played with rapidly repeating notes. Instead of painfully inserting +long lists of these notes, you can use the MALLET directive. +The MALLET directive accepts a number of options, each an +OPTION=VALUE pair. For example: + +

    + + +
    + +
    Solo-Marimba Mallet Rate=16 Decay=-5
    + +
    + +

    +This command is also useful in creating drum rolls. For example: + +

    + + +
    + +
    Begin Drum-Snare2 +
      Tone SnareDrum1 +
      Volume F +
      Mallet Rate=32 Decay=-3 +
      Rvolume 3 +
      Sequence z z z 1 1 100 +
    +End
    + +
    + +

    +The following options are supported: + +

    + +

    +Rate +

    + +

    +The RATE must be a valid note length (i.e., 8, 16, or even +16.+8). + +

    +For example: + +

    + + +
    + +
    Solo-Marimba Mallet Rate=16
    + +
    + +

    +will set all the notes in the ``Solo-Marimba'' track to be sounded a +series of 16th notes. + +

    + +

      +
    • Note duration modifiers such as articulate are applied to each + resultant note, + +

      +

    • +
    • It is guaranteed that the note will sound at least once, + +

      +

    • +
    • The use of note lengths assures a consistent sound independent + of the song tempo. + +

      +

    • +
    + +

    +To disable this setting use a value of ``0''. + +

    + +

    +Decay +

    + +

    +You can adjust the volume (velocity) of the notes being repeated when +MALLET is enabled: + +

    + + +
    + +
    Drum-Snare Mallet Decay=-15
    + +
    + +

    +The argument is a percentage of the current value to add to the note +each time it is struck. In this example, assuming that the note length +calls for 4 ``strikes'' and the initial velocity is 100, the note will +be struck with a velocity of 100, 85, 73 and 63. + +

    +Important: a positive value will cause the notes to get louder, +negative values cause the notes to get softer. + +

    +Note velocities will never go below 1 or above 255. Note, however, +that notes with a velocity of 1 will most likely be inaudible. + +

    +The decay option value must be in the range -50 to 50; however, be +cautious using any values outside the range -5 to 5 since the volume +(velocity) of the notes will change quite quickly. The default +value is 0 (no decay). + +

    + +

    +
    +Octave +

    + +

    +When +MMA initializes and after the SEQCLEAR command all track +octaves are set to ``4''. This will place most chord and bass notes in +the region of middle C. + +

    +You can change the octave for any voice with OCTAVE command. For example: + +

    + + +
    + +
    Bass-1 Octave 3
    + +
    + +

    +Sets the notes used in the ``Bass-1'' track one octave lower than normal. + +

    +The octave specification can be any value from 0 to 10. Various +combinations of INVERT, TRANSPOSE and OCTAVE can +force notes to be out of the valid MIDI range. In this case the lowest +or highest available note will be used. + +

    +You can specify a different OCTAVE for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Octave 4 5 / 4
    + +
    + +

    + +

    +
    +Off +

    + +

    +To disable the generation of MIDI output on a specific track: + +

    + + +
    + +
    Bass Off
    + +
    + +

    +This can be used anywhere in a file. Use it to override the effect of +a predefined groove, if you wish. This is simpler than resetting a +voice in a groove. The only way to reset this command is with a +ON directive. + +

    + +

    +
    +On +

    + +

    +To enable the generation of MIDI output on a specific track which has +been disabled with an OFF directive: + +

    + + +
    + +
    Bass On
    + +
    + +

    + +

    +Print +

    + +

    +The PRINT directive will display its argument to the screen +when it is encountered. For example, if you want to print the filename +of the input file while processing, you could insert: + +

    + + +
    + +
    Print Making beautiful music for MY SONG
    + +
    + +

    +No control characters are supported. + +

    +This can be useful in debugging input files. + +

    + +

    +PrintActive +

    + +

    +The PRINTACTIVE directive will the currently active +GROOVE and the active tracks. This can be quite useful when +writing groove files and you want to modify and existing groove. + +

    +Any parameters given are printed as single comment at the end of the header line. + +

    +This is strictly a debugging tool. No PRINTACTIVE statements +should appear in finalized grooves or song files. + +

    + +

    +RndSeed +

    + +

    +All of the random functions (RTIME, RSKIP, etc.) in +MMA depend +on the Python random module. Each time +MMA generates a track the values generated +by the random functions will be different. In most cases this is a ``good thing''; however, +you may want +MMA to use the same sequence of random values20.1 each time it generates a track. Simple: just use: + +

    + + +
    + +
    RndSeed 123.56
    + +
    + +

    +at the top of your song file. You can use any value you want: it really doesn't +make any difference, but different values will generate different sequences. + +

    +You can also use this with no value, in which case Python uses its own value (see +the Python manual for details). Essentially, using no value undoes the effect which +permits the mixing of random and not-so-random sections in the same song. + +

    +One interesting use of RNDSEED could be to ensure that a repeated section +is identical: simply start the section with something like: + +

    + + +
    + +
    Repeat +
    +RndSeed 8 +
    ... chords
    + +
    + +

    +It is highly recommended that you do not use this command in library files. + +

    + +

    +
    +RSkip +

    + +

    +To aid in creating syncopated sounding patterns, you can use the +RSKIP directive to randomly silence or skip notes. The command +takes a value in the range 0 to 99. The ``0'' argument disables +skipping. For example: + +

    + + +
    + +
    Begin Drum +
        Define D1 1 0 90 +
        Define D8 D1 * 8 +
        Sequence D8 +
        Tone OpenHiHat +
        RSkip 40 +
    +End
    + +
    + +

    +In this case a drum pattern has been defined to hit short ``OpenHiHat'' +notes 8 per bar. The RSKIP argument of ``40'' causes the +note to be NOT sounded (randomly) only 40% of the time. + +

    +Using a value of ``10'' will cause notes to be skipped 10% of the +time (they are played 90% of the time), ``90'' means to skip the +notes 90% of the time, etc. + +

    +You can specify a different RSKIP for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Scale RSkip 40 90 / 40
    + +
    + +

    +If you use the RSKIP in a chord track, the entire chord +will not be silenced. The option will be applied to the +individual notes of each chord. This may or may not be what you are +after. You cannot use this option to generate entire chords randomly. +For this effect you need to create several chord patterns and select +them with SEQRND. + +

    + +

    +
    +RTime +

    + +

    +One of the biggest problem with computer generated drum and rhythm +tracks is that, unlike real musicians, the beats are precise and ``on +the beat''. The RTIME directive attempts to solve this. + +

    +The command can be applied to all tracks. + +

    + + +
    + +
    Drum-4 Rtime 4
    + +
    + +

    +The value passed to the RTime directive are the number of MIDI ticks +with which to vary the start time of the notes. For example, if you +specify ``5'' the start times will vary from -5 to +5 ticks) on each +note for the specified track. There are 192 MIDI ticks in each quarter +note. + +

    +Any value from 0 to 100 can be used; however values in the range 0 to +10 are most commonly used. Exercise caution in using large values! + +

    +You can specify a different RTIME for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord RTime 4 10 / 4
    + +
    + +

    +RTIME is guaranteed never to start a note before the start of a bar. + +

    + +

    +
    +ScaleType +

    + +

    +This option is only used by SCALE tracks. It can be set for +other tracks, but the setting is not used. + +

    +By default, the SCALETYPE is set to AUTO. The settings +permissible are: + +

    +

    + + + + + + + +
    CHROMATICForces use of a chromatic scale
    AUTOUses scale based on the current chord (default)
    +
    + +

    +When this command is encountered in a SCALE track the start +point of the scale is reset. + +

    + +

    + +
    +Seq +

    + +

    +If your sequence, or groove, has more than one pattern (i.e., you have +set SeqSize to a value other than 1), you can use this directive to +force a particular pattern point to be used. The directive: + +

    + + +
    + +
    Seq
    + +
    + +

    +resets the sequence counter to 1. This means that the next bar +will use the first pattern in the current sequence. You can force a +specific pattern point by using an optional value after the directive. +For example: + +

    + + +
    + +
    Seq 8
    + +
    + +

    +forces the use of pattern point 8 for the next bar. This can be quite +useful if you have a multi-bar sequence and, perhaps, the eight bar is +variation which you want used every eight bars, but also for a +transition bar, or the final bar. Just put a SEQ 8 at those +points. You might also want to put a SEQ at the start of +sections to force the restart of the count. + +

    +If you have enable sequence randomization with the SEQRND ON +command, the randomization will be disabled by a SEQ +command.20.2 However, +settings of track SEQRND will not be effected. One difference +between SEQRND OFF and SEQ is that the current sequence +point is set with the latter; with SEQRND OFF it is left at a +random point. + +

    +Note: Using a value greater than the current SEQSIZE is not +permitted. + +

    +This is a very useful command! For example, look at the four bar +introduction of the song ``Exactly Like You'': + +

    + + +
    + +
    Groove BossanovaEnd +
    +seq 3 +
    +1 C +
    +seq 2 +
    +2 Am7 +
    +seq 1 +
    +3 Dm7 +
    +seq 3 +
    +4 G7 / G7#5
    + +
    + +

    +In this example the four bar ``ending groove'' has been used to create +an interesting introduction. + +

    + +

    +
    +Strum +

    + +

    +By default +MMA plays all the notes in a chord at the same time. To +make the chord more like something a guitar or banjo might play, use +the STRUM directive. For example: + +

    + + +
    + +
    Chord-1 Strum 5
    + +
    + +

    +sets the strumming factor to 5 for track Chord-1. + +

    +Setting the STRUM in any track other than a CHORD track +will generate a warning message and the command will be ignored. + +

    +The strum factor is specified in MIDI ticks. Usually values around 10 +to 15 work just fine. The valid range for STRUM is 0 to 100. + +

    +You can specify a different STRUM for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Strum 20 5 / 10
    + +
    + +

    +Note: When chords have both a STRUM and INVERT applied, +the order of the notes played will not necessarily be root, third, +etc. The notes are sorted into ascending order, so for a C major scale +with and INVERT of 1 the notes played would be ``E G C''. That +is, unless the DIRECTION has been set to ``DOWN'' in which case +the order would be reversed (but the notes would be the same). + +

    + +

    +Transpose +

    + +

    +You can change the key of a piece with the ``Transpose'' command. For +example, if you have a piece notated in the key of ``C'' and you want +it played back in the key of ``D'': + +

    + + +
    + +
    Transpose 2
    + +
    + +

    +will raise the playback by 2 semi-tones. Since +MMA 's author plays tenor saxophone + +

    + + +
    + +
    Transpose -2
    + +
    + +

    +which puts the MIDI keyboard into the same key as the horn, is not an +uncommon directive + +

    +You can use any value between -12 and 12. All tracks (with the logical +exception of the drum tracks) are effected by this command. + +

    + +

    +Unify +

    + +

    +The UNIFY command is used to force multiple notes of the same +voice and pitch to be combined into a single, long, tone. This is very +useful when creating a sustained voice track. For example, consider +the following which might be used in real groove file: + +

    + + +
    + +
    Begin Bass-Sus +
    +Sequence 1 1 1 90 4 +
    +Articulate 100 +
    +Unify On +
    +Voice TremoloStrings +
    +End
    + +
    + +

    +Without the UNIFY ON command the strings would be sounded (or +hit) four times during each bar; with it enabled the four hits are +combined into one long tone. This tone can span several bars if the +note(s) remain the same. + +

    +The use of this command depends on a number of items: + +

    + +

      +
    • The VOICE being used. It makes sense to use enable the + setting if using a sustained tone like ``Strings"; it probably + doesn't make sense if using a tone like ``Piano1''. + +

      +

    • +
    • For tones to be combined you will need to have ARTICULATE + set to a value of 100. Otherwise the on/off events will have small + gaps in them which will cancel the effects of UNIFY. + +

      +

    • +
    • Ensure that RTIME is not set for UNIFY tracks + since the start times may cause gaps. + +

      +

    • +
    • If your pattern or sequence has different volumes in different + beats (or bars) the effect of a UNIFY will be to ignore + volumes other than the first. Only the first NOTE ON and the + last NOTE OFF events will appear in the MIDI file. + +

      +

    • +
    + +

    +You can specify a different UNIFY for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Unify On / / Off
    + +
    + +

    +But, you probably don't want to use this particular feature. + +

    +Valid arguments are ``On'' or ``1'' to enable; ``Off'' or ``0'' to +disable. + +

    + +

    +
    +Voice +

    + +

    +The MIDI instrument or voice used for a track is set with: + +

    + + +
    + +
    Chord-2 Voice Piano1
    + +
    + +

    +Voices apply only to the specified track. The actual instrument can be +specified via the MIDI instrument number, or with the symbolic name. +See the tables in the MIDI voicing section for lists of the recognized +names. + +

    +You can create interesting effects by varying the voice used with drum +tracks. By default ``Voice 0'' is used. However, you can change the +drum voices. The supplied library files do not change the voices since this +appears to be highly dependent on the MIDI synth you are using. + +

    +You can specify a different VOICE for each bar in a sequence. +Repeated values can be represented with a ``/'': + +

    + + +
    + +
    Chord Voice Piano1 / / Piano2
    + +
    + +

    +It is possible to set up translations for the selected voice: see +VOICETR. + +

    +


    Footnotes

    +
    +
    ... values20.1
    +
    Yes, this is +a contradiction of terms. + +
    +
    ... +command.20.2
    +
    A warning message will also be displayed. + +
    +

    + + +next + +up + +previous +
    + Next: Begin/End Blocks + Up: Reference Manual + Previous: Fine Tuning (Translations) + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node21.html b/mma/docs/html/ref/node21.html new file mode 100644 index 0000000..7630dea --- /dev/null +++ b/mma/docs/html/ref/node21.html @@ -0,0 +1,210 @@ + + + + + +Begin/End Blocks + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Documentation Strings + Up: Reference Manual + Previous: Other Commands and Directives +
    +
    + + +Subsections + + + +
    + +

    + +
    +Begin/End Blocks +

    + +

    +Entering a series of directives for a specific track can get quite +tedious. To make the creation of library files a bit easier, you can +create a block. For example, the following: + +

    + + +
    + +
    Drum Define X 0 2 100; 50 2 90 +
    +Drum Define Y 0 2 100 +
    +Drum Sequence X Y
    + +
    + +

    +Can be replaced with: + +

    + + +
    + +
    Drum Begin +
        Define X 0 2 100; 50 2 90 +
        Define Y 0 2 100 + End +
    +Drum Sequence X Y
    + +
    + +

    +Or, even more simply, with: + +

    + + +
    + +
    Drum Begin Define +
        X 0 2 100; 50 2 90 +
        Y 0 2 100 +
    +End
    + +
    + +

    +If you examine some of the library files you will see that this +shortcut is used a lot. + +

    + +

    +Begin +

    + +

    +The BEGIN command requires any number of arguments. Valid +examples include: + +

    + + +
    + +
    Begin Drum +
    +Begin Chord2 +
    +Begin Walk Define
    + +
    + +

    +Once a BEGIN block has been entered, all subsequent lines have +the words from the BEGIN command prepended to each line of +data. There is not much magic here--BEGIN/END is really +just some syntactic sugar. + +

    + +

    +End +

    + +

    +To finish off a BEGIN block, use a single END on a line +by itself. + +

    +Defining musical data, repeats, or other BEGINs inside a block +(other than COMMENT blocks) will not work. + +

    +Nesting is permitted. Eg: + +

    + + +
    + +
    Scale Begin +
        Begin Define +
            
    stuff
    +
        End +
        Sequence
    stuff
    +
    +End
    + +
    + +

    +A BEGIN must be competed with a END before the end of a +file, otherwise an error will be generated. The USE and +INCLUDE commands are not permitted inside a block. +


    + + +next + +up + +previous +
    + Next: Documentation Strings + Up: Reference Manual + Previous: Other Commands and Directives + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node22.html b/mma/docs/html/ref/node22.html new file mode 100644 index 0000000..a7c9e8d --- /dev/null +++ b/mma/docs/html/ref/node22.html @@ -0,0 +1,178 @@ + + + + + +Documentation Strings + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Paths, Files and Libraries + Up: Reference Manual + Previous: Begin/End Blocks +
    +
    + + +Subsections + + + +
    + +

    +Documentation Strings +

    + +

    +It has been mentioned a few times already the importance of clearly +documenting your files and library files. For the most part, you can +use comments in your files; but in library files you use the +DOC directive. + +

    +In addition to the commands listed in this chapter, you should also +note DEFGROOVES). + +

    +For some real-life examples of how to document your library files, +look at any of the library files supplied with this distribution. + +

    + +

    +
    +Doc +

    + +

    +A DOC command is pretty simple: + +

    + + +
    + +
    Doc This is a documentation string!
    + +
    + +

    +In most cases, DOCs are treated as COMMENTs. However, +if the -Dx22.1 option is given +on the command line, DOCs are processed and printed to standard +output. + +

    +For producing the +MMA Standard Library Reference a trivial +Python program is used to collate the output generated with a command +like: + +

    + + +
    + +
    $ mma -Dx -w /usr/local/lib/mma/swing
    + +
    + +

    +Note, the '-w' option has been used to suppress the printing of warning +messages. + +

    + +

    +Author +

    + +

    +As part of the documentation package, there is a AUTHOR +command: + +

    + + +
    + +
    Author Bob van der Poel
    + +
    + +

    +Currently AUTHOR lines are processed and the data is saved, but +never used. It may be used in a future library documentation +procedures, so you should use it in any library files you write. +


    Footnotes

    +
    +
    ...-Dx22.1
    +
    See the command + summary. + +
    +

    + + +next + +up + +previous +
    + Next: Paths, Files and Libraries + Up: Reference Manual + Previous: Begin/End Blocks + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node23.html b/mma/docs/html/ref/node23.html new file mode 100644 index 0000000..159cca5 --- /dev/null +++ b/mma/docs/html/ref/node23.html @@ -0,0 +1,1101 @@ + + + + + +Paths, Files and Libraries + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Creating Effects + Up: Reference Manual + Previous: Documentation Strings +
    +
    + + +Subsections + + + +
    + +

    + +
    +Paths, Files and Libraries +

    + +

    +This chapter covers +MMA filenames, extensions and a variety of +commands and/or directives which effect the way in which files are +read and processed. + +

    +But, first a few comments on the location of the +MMA Python modules. + +

    +The Python language (which was used to write +MMA ) has a very useful +feature: it can include other files and refer to functions and data +defined in these files. A large number of these files or modules are +included in every Python distribution. The program +MMA consists of a +short ``main'' program and several ``module'' files. Without these +additional modules +MMA will not work. + +

    +The only sticky problem in a program intended for a wider audience is +where to place these modules. Hopefully, it is a ``good thing'' that +they should be in one of three locations: + +

    + +

      +
    • /usr/local/share/mma/MMA + +

      +

    • +
    • /usr/share/mma/MMA + +

      +

    • +
    • ./MMA + +

      +

    • +
    + +

    +If, when initializing itself, +MMA cannot find one of the above +directories, it will terminate with an error message. + +

    +If you are using +MMA on a Windows platform please see the comments about +the default paths (here). + +

    + +

    +
    +File Extensions +

    + +

    +For most files the use of a the filename extension ``.mma'' is +optional. However, it is suggested that most files (with the exceptions +listed below) have the extension present. It makes it much easier to +identify +MMA song and library files and to do selective processing +on these files. + +

    +In processing an input song file +MMA can encounter several different +types of input files. For all files, the initial search is done by +adding the filename extension ``.mma'' to filename (unless it is +already present), then a search for the file as given is done. + +

    +For files included with the USE directive, the directory set +with SETLIBPATH is first checked, followed by the current +directory. + +

    +For files included with the INCLUDE directive, the directory +set with SETINCPATH is first checked, followed by the current +directory. + +

    +Following is a summary of the different files supported: + +

    +

    +
    Song Files
    +
    The input file specified on the command line should + always be named with the ``.mma'' extension. When +MMA searches for + the file it will automatically add the extension if the file name + specified does not exist and doesn't have the extension. + +

    +

    +
    Library Files
    +
    Library files really should all be named + with the extension. +MMA will find non-extension names when used in + a USE or INCLUDE directive. However, it will not + process these files when creating indexes with the ``-g'' command + line option--these index files are used by the GROOVE + commands to automatically find and include libraries. + +

    +

    +
    RC Files
    +
    As noted in the RC-File discussion + (here) +MMA will + automatically include a variety of ``RC'' files. You can use the + extension on these files, but common usage suggests that these files + are probably better without. + +

    +

    +
    MMAstart and MMAend
    +
    +MMA will automatically include a file at + the beginning or end of processing (start/end + details). Typically these files are + named MMASTART and MMAEND. Common usage is to + not use the extension if the file is in the current + directory; use the file if it is in an ``includes'' directory. + +

    +

    +
    + +

    +One further point to remember is that filenames specified on the +command line are subject to wild-card expansion via the shell you are +using. + +

    + +

    +Tilde Expansion +

    + +

    +On Unix-like systems all filenames may be prefaced with tilde or a +tilde with a username. All file operations in +MMA honor this +convention. This includes the setting of library and include paths. + +

    +The result of this operation is system dependent. See the entry for +os.path.expanduser in the Python library reference. + +

    + +

    +Eof +

    + +

    +Normally, a file is processed until its end. However, you can +short-circuit this behavior with the EOF directive. If +MMA finds a line starting with EOF no further processing will be +done on that file ... it's just as if the real end of file was +encountered. Anything on the same line, after the EOF is also +discarded. + +

    +You may find this handy if you want to test process only a part of a +file, or if you making large edits to a library file. It is often used +to quit when using the LABEL and GOTO directives to +simulate constructs like D.C. al Coda, etc. + +

    + +

    +
    +LibPath +

    + +

    +The search for library files can be set with the LibPath variable. To +set LIBPATH: + +

    + + +
    + +
    SetLibPath PATH
    + +
    + +

    +You can have only one path in the SETLIBPATH directive. + +

    +When +MMA starts up it sets the library path to the first valid +directory in the list: + +

    + +

      +
    • /usr/local/share/mma/lib + +

      +

    • +
    • /usr/share/mma/lib + +

      +

    • +
    • ./lib + +

      +

    • +
    + +

    +The last choice lets you run +MMA directly from the distribution +directory. + +

    +You are free to change this to any other location in a +RCFile. + +

    +LIBPATH is used by the routine which auto-loads grooves from +the library, and the USE directive. The -g command line option +is used to maintain the library database). + +

    +The current setting can be accessed via the macro $_LibPath. + +

    + +

    +AutoLibPath +

    + +

    +The sub-directory containing the current library files to automatically +load is determined by the current setting of AUTOLIBPATH. +Please see the library file discussion here for details. + +

    +You can change the automatic include directory by resetting this +variable. It must be a sub-directory of LIBPATH for it to work. + +

    +The command to reset the variable is: + +

    + + +
    + +
    SetAutoLibPath mydir
    + +
    + +

    +The current setting can be accessed via the macro $_AutoLibPath. By +default the setting is ``stdlib''. + +

    +Any existing GROOVE definitions are deleted from memory when +this command is issued (this it to avoid name conflicts between libraries). + +

    + +

    +
    +OutPath +

    + +

    +MIDI file generation is to an automatically generated filename +(more details). If the +OUTPATH variable is set, that value will be prepended to the +output filename. To set the value: + +

    + + +
    + +
    SetOutPath PATH
    + +
    + +

    +Just make sure that ``PATH'' is a simple path name with no +spaces in it. The variable is case sensitive (assuming that your +operating system supports case sensitive filenames). This is a common +directive in a RC file (more details). By default, it has no value. + +

    +You can disable the OUTPATH variable quite simply: just issue +the command without an argument. + +

    +If the name set by this command begins with a ``.'', ``/'' or +`` \'' it is prepended to the complete filename specified on +the command line. For example, if you have the input filename +test.mma and the output path is +~/mids +--the output file will be /home/bob/mids/test.mid. + +

    +If the name doesn't start with the special characters noted in the +preceding paragraph the contents of the path will be inserted before +the filename portion of the input filename. Again, an example: the +input filename is mma/rock/crying and the output path is +``midi''--the output file will be mma/rock/midi/crying.mid. + +

    +The current setting can be accessed via the macro $_OutPath. + +

    +Note that this option is ignored if you use the -f + command line option or +if an absolute name for the input file (one starting with a ``/'' or + a ``~'') is used. + +

    + +

    +Include +

    + +

    +Other files with sequence, pattern or music data can be included at +any point in your input file. There is no limit to the level of +includes. + +

    + + +
    + +
    Include Filename
    + +
    + +

    +A search for the file is done in the INCPATH directory (see +below) and the current directory. The ``.mma'' filename extension is +optional (if a filename exists both with and without the ``.mma'' +extension, the file with the extension will be used). + +

    +The use of this command should be quite rare in user files; however, +it is used extensively in library files to include standard +patterns. + +

    + +

    +
    +IncPath +

    + +

    +The search for include files can be set with the INCPATH +variable. To set INCPATH: + +

    + + +
    + +
    SetIncPath PATH
    + +
    + +

    +You can have only one path in the SETINCPATH directive. + +

    +When +MMA initializes it sets the include path to first found directory in: + +

    + +

      +
    • /usr/local/share/mma/includes +
    • +
    • /usr/share/mma/includes +
    • +
    • ./includes + +

      +

    • +
    + +

    +The last location lets you run +MMA from the distribution directory. + +

    +If this value is not appropriate for your system, you are free to +change it in a RC File. + +

    +The current setting can be accessed via the macro $_IncPath. + +

    + +

    +
    +Use +

    + +

    +Similar to INCLUDE, but a bit more useful. The USE +command is used to include library files and their predefined grooves. + +

    +Compared to INCLUDE, USE has important features: + +

    + +

      +
    • The search for the file is done in the paths specified by the LibPath variable, + +

      +

    • +
    • The current state of the program is saved before the library + file is read and restored when the operation is complete. + +

      +

    • +
    + +

    +Let's examine each feature in a bit more detail. + +

    +When a USE directive is issued, eg: + +

    + + +
    + +
    use stdlib/swing
    + +
    + +

    + +MMA first attempts to locate the file ``stdlib/swing'' in the +directory specified by LIBPATH or the current directory. As +mentioned above, +MMA automatically added the ``.mma'' extension to +the file and checks for the non-extension filename if that can't be +found. + +

    +If things aren't working out quite right, check to see if the filename +is correct. Problems you can encounter include: + +

    + +

      +
    • Search order: you might be expecting the file in the current + directory to be used, but the same filename exists in the + LIBPATH, in which case that file is used. + +

      +

    • +
    • Not using extensions: Remember that files with the + extension added are first checked. + +

      +

    • +
    • Case: The filename is case sensitive. The files ``Swing'' + and ``swing'' are not the same. Since most things in +MMA are case + insensitive, this can be an easy mistake to make. + +

      +

    • +
    • The file is in a sub directory of the LIBPATH. In a + standard distribution the actual library files are in + /usr/local/share/mma/lib/stdlib, but the libpath is set to + /usr/local/share/mma/lib. In this case you must name the file + to be used as stdlib/rhumba not rhumba. + +

      +

    • +
    + +

    +As mentioned above, the current state of the compiler is saved during +a USE. +MMA accomplishes this by issuing a slightly modified +DEFGROOVE and GROOVE command before and after the +reading of the file. Please note that INCLUDE doesn't do this. +But, don't let this feature fool you--since the effects of defining +grooves are cumulative you really should have SEQCLEAR +statements at the top of all your library files. If you don't you'll +end up with unwanted tracks in the grooves you are defining. + +

    +In most cases you will not need to use the USE directive + in your music files. If you have properly installed +MMA and keep +the database up-to-date by using the command: + +

    + + +
    + +
    $ mma -g
    + +
    + +

    +grooves from library files will be automatically found and loaded. +Internally, the USE directive is used, so existing states are +saved. + +

    +If you are developing new or alternate library files you will find the +USE directive handy. + +

    + +

    +
    +MmaStart +

    + +

    +If you wish to process a certain file or files before your main input +file, set the MMASTART filename in an RCFile. For example, you +might have a number of files in a directory which you wish to use +certain PAN settings. In that directory, you just need to have +a file mmarc which contains the following command: + +

    + + +
    + +
    MmaStart setpan
    + +
    + +

    +The actual file setpan has the following directives: + +

    + + +
    + +
    Bass Pan 0 +
    +Bass1 Pan 0 +
    +Bass2 Pan 0 +
    +Walk Pan 0 +
    +Walk1 Pan 0 +
    +Walk2 Pan 0
    + +
    + +

    +So, before each file in that directory is processed, the PAN +for the bass and walking bass voices are set to the left channel. + +

    +If the file specified by a MMASTART directive does not exist a +warning message will be printed (this is not an error). + +

    +Also useful is the ability to include a generic file with all the MIDI +files you create. For example, you might like to have a MIDI reset at the +start of your files--simple, just include the following in your mmarc file: + +

    + + +
    + +
    MMAstart reset
    + +
    + +

    +This includes the file reset.mma located in the ``includes'' +directory (IncludePath). + +

    +Multiple MMASTART directives are permitted. The files are +processed in the order declared. You can have multiple filenames on a +MMASTART line. + +

    +One caution with MMASTART files: the file is processed after +the RC file, just before the actual song file. + +

    + +

    +
    +MmaEnd +

    + +

    +Just the opposite of MMASTART, this command specifies a file to +be included at the end of a main input file. See the comments above +for more details. + +

    +To continue this example, in your mmarc file you would have: + +

    + + +
    + +
    MmaEnd nopan
    + +
    + +

    +and in the file nopan have: + +

    + + +
    + +
    Bass Pan 64 +
    +Bass1 Pan 64 +
    +Bass2 Pan 64 +
    +Walk Pan 64 +
    +Walk1 Pan 64 +
    +Walk2 Pan 64
    + +
    + +

    +If the file specified by a MMAEND directive does not exist a +warning message will be printed (this is not an error). + +

    +Multiple MMAEND directives are permitted and processed in the +order declared. You can have multiple filenames on a MMAEND line. + +

    + +

    + +
    +RC Files +

    + +

    +When +MMA starts it checks for initialization files. Only the first +found file is processed. The following locations/files are checked (in order): + +

    + +

      +
    1. mmarc -- this is a normal file in the current directory. + +

      +

    2. +
    3. ~/.mmarc -- this is an ``invisible'' file in the users + home directory. + +

      +

    4. +
    5. /usr/local/etc/mmarc + +

      +

    6. +
    7. /etc/mmarc + +

      +

    8. +
    + +

    + Only the first found file will be processed. This means you can +override a ``global'' RC file with a user specific one. If you just +want to override some specific commands you might want to: + +

    + +

      +
    1. Create the file mmarc in a directory with +MMA files, + +

      +

    2. +
    3. As the first line in that file have the command: + +

      + + +
      + +
      include ~/.mmarc
      + +
      + +

      +to force the inclusion of your global stuff, + +

      +

    4. +
    5. Now, place your directory specific commands in your custom RC file. +
    6. +
    + +

    +By default, no RC files are installed. You may want to create an empty +~/.mmarc file to eliminate a warning message. + +

    +An alternate method for using a different RC file is to specify the +name of the file on the command line by using the -i option +(here). Using this option +you can have several RC files in a directory and complile your songs +differently depending on the RC file you specify. + +

    +The RC file is processed as a +MMA input file. As such, it can +contain anything a normal input file can, including music commands. +However, you should limit the contents of RC files to things +like: + +

    + + +
    + +
    SetOutPath +
    +SetLibPath +
    +MMAStart +
    +MMAEnd
    + +
    + +

    +A useful setup is to have your source files in one directory and MIDI +files saved into a different directory. Having the file mmarc +in the directory with the source files permits setting OUTPATH +to the MIDI path. + +

    + +

    +
    +Library Files +

    + +

    +Included in this distribution are a number of predefined patterns, +sequences and grooves. They are in different files in the ``lib'' +directory. + +

    +The library files should be self-documenting. A list of standard file +and the grooves they define is included in the separate document, +supplied in this distribution as ``mma-lib.ps''. + +

    + +

    +
    +Maintaining and Using Libraries +

    + +

    +The basic +MMA distribution comes with a set of pattern files which +are installed in the mma/lib/stdlib directory. Each one of +these files has a number of GROOVEs defined in them. For +example, the file mma/lib/stdlib/rhumba.mma contains the +grooves Rhumba, RhumbaEnd and many more. + +

    +If you are writing GROOVEs with the intention of adding them to +the standard library you should ensure that none of the names you +choose duplicate existing names already used. + +

    +If you are creating a set of alternate grooves to duplicate the +existing library you might do the following: + +

    + +

      +
    1. Create a directory with your name or other short id in the + mma/lib/ hierarchy. For example, if your name is ``Bob van + der Poel'' you might create the directory mma/lib/bvdp. + +

      +

    2. +
    3. Place all your files (or modified files) in that directory. + +

      +

    4. +
    5. Now, when your song wants to use a groove, you have two choices: + +

      + +

        +
      1. Include the file with the USE directive. For example, + if you have created the file rock.mma and want to use the + GROOVE rock8 you would: + +

        + +

          +
        1. place the directive USE BVDP/ROCK near the top of the + song file. Note: it might not be apparent from the typeface here, but the + filename here is all lowercase. In Unix/Linux case is important, so + please make sure of the case of the filenames in commands like USE. + +

          +

        2. +
        3. enable the groove with the directive GROOVE ROCK8 (and here the + case is not important since +MMA thinks that upper and lower case are the same). + +

          +

        4. +
        + +

        +

      2. +
      3. Force +MMA to use your groove directory by resetting + the auto-lib directory (again, the case for the path is important): + +

        + + +
        + +
        SetAutoLibPath bvdp
        + +
        + +

        +You will have to update the +MMA database with the -g or -G + command line options for this to work. If you elect this route, + please note that the files in the standard library will not be + available, but you can use both with something like this: + +

        + + +
        + +
        Groove Metronome2-4 +
        +z * 2 +
        +SetAutoLibPath bvdp +
        +Groove BossaNova // the bossa from lib/bvdp, not stdlib! +
        +chords...
        + +
        + +

        +The nice thing about this method is that you can have multiple + sets of library files all using the same GROOVE + names. To create a different version you just need to change + the SETAUTOLIBPATH variable in your song file ...or, + for a collection of songs put the variable in your MMARC + file. + +

        +

      4. +
      + +

      +

    6. +
    + +

    +For those who ``really need to know'', here are the steps that +MMA takes when it encounters a GROOVE command: + +

    + +

      +
    1. if the named groove has been loaded/created already +MMA just + switches to the internal version of that groove. + +

      +

    2. +
    3. if the groove can't be found in memory, a search of the groove + database (created with the -g command line option) is done. If no + database is in memory it is loaded from the directory pointed to by + the LIBPATH and AUTOLIBPATH variables. This database + is then searched for the needed GROOVE. The database contains + the filenames associated with each GROOVE and that file is + then read with the USE code. + +

      +

    4. +
    + +

    +The database is a file .mmaDB stored in each sub directory of +LIBPATH. This is a ``hidden'' file (due to the leading ``.'' in +the filename). You cannot change the name of this file. If there are +sub-directories the entries for them will be stored in the database +file for the main tree. + +

    +By using a USE directive or by resetting AUTOLIBDIR you +force the loading of your set of grooves. + +

    + +

    + +
    +Paths on Windows Platforms +

    + +

    +To make +MMA as platform independent as possible a number of additional paths have been +defined. When starting up, in addition to the standard Linux paths discussed above, the +following are also checked: + +

    + +

      +
    • Modules can be in c: +
      +mma
      , +
    • +
    • Include files can be in c: +
      +mma +
      +includes
      , +
    • +
    • Library files can be in c: +
      +mma +
      +lib
      . + +

      +

    • +
    + +

    +


    + + +next + +up + +previous +
    + Next: Creating Effects + Up: Reference Manual + Previous: Documentation Strings + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node24.html b/mma/docs/html/ref/node24.html new file mode 100644 index 0000000..fed3c8e --- /dev/null +++ b/mma/docs/html/ref/node24.html @@ -0,0 +1,216 @@ + + + + + +Creating Effects + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Frequency Asked Questions + Up: Reference Manual + Previous: Paths, Files and Libraries +
    +
    + + +Subsections + + + +
    + +

    + +
    +Creating Effects +

    + +

    +It's really quite amazing how easy and effective it is to create +different patterns, sequences and special effects. As +MMA was +developed lots of silly things were tried...this chapter is an +attempt to display and preserve some of them. + +

    +The examples don't show any music to apply the patterns or sequences +to. The manual assumes that if you've read this far you'll know +that you should have something like: + +

    + + +
    + +
    1 C +
    +2 G +
    +3 G +
    +4 C
    + +
    + +

    +as a simple test piece to apply tests to. + +

    + +

    +Overlapping Notes +

    + +

    +As a general rule, you should not create patterns in which notes +overlap. However, here's an interesting effect which relies on +ignoring that rule: + +

    + + +
    + +
    Begin Scale +
        define S1 1 1+1+1+1 90 +
        define S32 S1 * 32 +
        Sequence S32 +
        ScaleType +
        Direction Both +
        Voice Accordion +
        Octave 5 +
    +End
    + +
    + +

    +``S1'' is defined with a note length of 4 whole notes (1+1+1+1) so that +when it is multiplied for S32 a pattern of 32 8th notes is created. +Of course, the notes overlap. Running this up and down a chromatic +scale is ``interesting.'' You might want to play with this a bit and +try changing ``S1'' to: + +

    + + +
    + +
    define S1 1 1 90
    + +
    + +

    +to see what the effect is of the notes overlapping. + +

    + +

    +Jungle Birds +

    + +

    +Here's another use for SCALEs. Someone (certainly not the +author) decided that some jungle sounds would be perfect as an +introduction to ``Yellow Bird''. + +

    + + +
    + +
    groove Rhumba +
    +Begin Scale +
        define S1 1 1 90 +
        define S32 S1 * 32 +
        Sequence S32 +
        ScaleType Chromatic +
        Direction Random +
        Voice BirdTweet +
        Octave 5 6 4 5 +
        RVolume 30 +
        Rtime 2 3 4 5 +
        Volume pp pp ppp ppp +
    +End +
    +DefGroove BirdRhumba
    + +
    + +

    +The above is an extract from the +MMA score. The entire song is +included in the ``songs'' directory of this distribution. + +

    +A neat trick is to create the bird sound track and then add it to the +existing Rhumba groove. Then define a new groove. Now one can select +either the library ``rhumba'' or the enhanced ``BirdRhumba'' with a +simple GROOVE directive. + +

    +


    + + +next + +up + +previous +
    + Next: Frequency Asked Questions + Up: Reference Manual + Previous: Paths, Files and Libraries + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node25.html b/mma/docs/html/ref/node25.html new file mode 100644 index 0000000..f3651ea --- /dev/null +++ b/mma/docs/html/ref/node25.html @@ -0,0 +1,271 @@ + + + + + +Frequency Asked Questions + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Symbols and Constants + Up: Reference Manual + Previous: Creating Effects +
    +
    + + +Subsections + + + +
    + +

    + +
    +Frequency Asked Questions +

    + +

    +This chapter will serve as a container for questions asked by +some enthusiastic +MMA users. It may make some sense in the future to +distribute this information as a separate file. + +

    + +

    +Chord Octaves +

    + +

    +I've keyed in a song but some of the chords sound way too high + (or low). + +

    +When a real player plays chords he or she adjusts the position of the +chords so that they don't ``bounce'' around between octaves. One way + +MMA tries to do the same is with the ``Voicing Mode=Optimal'' +setting. However, sometimes the chord range of a piece is too large +for this to work properly. In this case you'll have to use the octave +adjustments in chords. For more details go here. + +

    + +

    +AABA Song Forms +

    + +

    +How can one define parts as part "A", part "B" ...and + arrange them at the end of the file? An option to repeat a ``solo'' + section a number of times would be nice as well. + +

    +Using +MMA variables and some simple looping, one might try something like: + +

    + + +
    + +
    Groove Swing +
    // Set the music into a +
    // series of macros +
    +mset A +
      Print Section A +
      C +
      G +
    +endmset +
    +mset B +
      print Section B +
      Dm +
      Em +
    +endmset +
    +mset Solo +
      Print Solo Section $Count +
      Am / B7 Cdim +
    +endmset +
    // Use the macros for an +
    // "A, A, B, Solo * 8, A" +
    // form +
    $A +
    $A +
    $B +
    +set Count 1 +
    +label a +
      $solo +
      inc COUNT +
      if le $count 8 +
        goto A +
      endif +
    $A +
    + +
    + +

    +Note that the ``Print'' lines are used for debugging purposes. The case +of the variable names has been mixed to illustrate the fact that +``Solo'' is the same as ``SOLO'' which is the same as ``solo''. + +

    +Now, if you don't like things that look like old BASIC program code, +you could just as easily duplicate the above with: + +

    + + +
    + +
    Groove Swing +
    +repeat +
      repeat +
        Print Section A +
        C +
        G +
        If Def count +
          eof +
        Endif +
        Endrepeat +
        Print Section B +
        Dm +
        Em +
        Set Count 1 +
        Repeat +
          Print Solo $Count +
          Am +
          Inc Count +
        Repeatending 7 +
      Repeatend +
    +Repeatend
    + +
    + +

    +The choice is up to you. + +

    + +

    +Where's the GUI? +

    + +

    +I really think that +MMA is a cool program. But, it needs a + GUI. Are you planning on writing one? Will you help me if I + start to write one? + +

    +Thanks for the kind comments! The author likes +MMA too. A lot! + +

    +Some attempts have been made to write a number of GUIs for + +MMA . But, nothing seemed to be much more useful than the existing +text interface. So, why waste too much time? There is nothing wrong with +graphical programming interfaces, but perhaps not in this case. + +

    +But, I may well be wrong. If you think it'd be better with a +GUI ...well, this is open source and you are more than +welcome to write one. If you do, I'd suggest that you make your +program a front-end which lets a user compile standard +MMA files. If +you find that more error reporting, etc. is required to interact +properly with your code, let me know and I'll probably be quite +willing to make those kind of changes. + +

    + +

    +Where's the manual index? +

    + +

    +Yes,this manual needs an index. I just don't have the time +to go though and do all the necessary work. Is there a volunteer? + +

    + +

    +


    + + +next + +up + +previous +
    + Next: Symbols and Constants + Up: Reference Manual + Previous: Creating Effects + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node26.html b/mma/docs/html/ref/node26.html new file mode 100644 index 0000000..9334355 --- /dev/null +++ b/mma/docs/html/ref/node26.html @@ -0,0 +1,3180 @@ + + + + + +Symbols and Constants + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Bibliography and Thanks + Up: Reference Manual + Previous: Frequency Asked Questions +
    +
    + + +Subsections + + + +
    + +

    + +
    +Symbols and Constants +

    + +

    +This appendix is a reference to the chords that +MMA recognizes and +name/value tables for drum and instrument names. The tables have been +auto-generated by +MMA using the -D options. + +

    + +

    +Chord Names +

    + +

    + +MMA recognizes standard chord names as listed below. The names are +case sensitive and must be entered in uppercase letters as shown: + +

    +A + A$\sharp$ + A$\flat$ + B + B$\sharp$ + B$\flat$ + C + C$\sharp$ + C$\flat$ + D + D$\sharp$ + D$\flat$ + E + E$\sharp$ + E$\flat$ + F + F$\sharp$ + F$\flat$ + G + G$\sharp$ + G$\flat$ + +

    +Please note that in your input files you must use a lowercase ``b'' or +an ``&'' to represent a $\flat$ and a ``#'' for a $\sharp$. + +

    +The following types of chords are recognized (these are case sensitive +and must be in the mixed upper and lowercase shown): + +

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    $\sharp$5Augmented triad.
    +Augmented triad.
    +7An augmented chord (raised 5th) with a dominant 7th.
    119th chord plus 11th.
    11$\flat$99th chord plus flat 11th.
    13Dominant 7th (including 5th) plus 13th.
    5Altered Fifth or Power Chord; root and 5th only.
    6Major tiad with added 6th.
    6(add9)6th with added 9th. This is sometimes notated as a slash chord in the form ``6/9''.
    696th with added 9th. This is sometimes notated as a slash chord in the form ``6/9''.
    7Dominant 7th.
    7$\sharp$11Dominant 7th plus 9th and sharp 11th.
    7$\sharp$57th, sharp 5.
    7$\sharp$5$\sharp$9Dominant 7th with sharp 5th and sharp 9th.
    7$\sharp$5$\flat$9Dominant 7th with sharp 5th and flat 9th.
    7$\sharp$9Dominant 7th with sharp 9th.
    7$\sharp$9$\sharp$11Dominant 7th plus sharp 9th and sharp 11th.
    7+An augmented chord (raised 5th) with a dominant 7th.
    7+57th, sharp 5.
    7+9Dominant 7th with sharp 9th.
    7-57th, flat 5.
    7-9Dominant 7th with flat 9th.
    7altDominant 7th with flat 5th and flat 9th.
    7$\flat$57th, flat 5.
    7$\flat$5$\sharp$9Dominant 7th with flat 5th and sharp 9th.
    7$\flat$5$\flat$9Dominant 7th with flat 5th and flat 9th.
    7$\flat$9Dominant 7th with flat 9th.
    7sus7th with suspended 4th, dominant 7th with 3rd raised half tone.
    7sus2A sus2 with dominant 7th added.
    7sus47th with suspended 4th, dominant 7th with 3rd raised half tone.
    9Dominant 7th plus 9th.
    9$\sharp$11Dominant 7th plus 9th and sharp 11th.
    9$\sharp$5Dominant 7th plus 9th with sharp 5th.
    9+5Dominant 7th plus 9th with sharp 5th.
    9-5Dominant 7th plus 9th with flat 5th.
    9$\flat$5Dominant 7th plus 9th with flat 5th.
    9susDominant 7th plus 9th, omit 7th.
    MMajor triad. This is the default and is used in the absense of any other chord type specification.
    M13Major 7th (including 5th) plus 13th.
    M6Major tiad with added 6th.
    M7Major 7th.
    M7$\sharp$11Major 7th plus 9th and sharp 11th.
    M7$\sharp$5Major 7th with sharp 5th.
    M7+5Major 7th with sharp 5th.
    M7-5Major 7th with a flat 5th.
    M7$\flat$5Major 7th with a flat 5th.
    M9Major 7th plus 9th.
    augAugmented triad.
    aug7An augmented chord (raised 5th) with a dominant 7th.
    aug7$\flat$9Augmented 7th with flat 5th and sharp 9th.
    aug9Dominant 7th plus 9th with sharp 5th.
    dimA dim7, not a triad!
    dim3Diminished triad (non-standard notation).
    dim7Diminished seventh.
    mMinor triad.
    m$\sharp$5Major triad with augmented 5th.
    m$\sharp$7Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    m(maj7)Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    m(sus9)Minor triad plus 9th (no 7th).
    m+5Major triad with augmented 5th.
    m+7Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    m119th with minor 3rd, plus 11th.
    m6Minor 6th.
    m6(add9)Minor 6th with added 9th. This is sometimes notated as a slash chord in the form ``m6/9''.
    m69Minor 6th with added 9th. This is sometimes notated as a slash chord in the form ``m6/9''.
    m7Minor 7th.
    m7-5Minor 7th, flat 5 (aka 1/2 diminished).
    m7$\flat$5Minor 7th, flat 5 (aka 1/2 diminished).
    m7$\flat$9Minor 7th with added flat 9th.
    m9Minor triad plus 7th and 9th.
    m9$\flat$5Minor triad, flat 5, plus 7th and 9th.
    mM7Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    maj7Major 7th.
    m$\flat$5Minor triad with flat 5th.
    min$\sharp$7Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    min(maj7)Minor Triad plus Major 7th. You will also see this printed as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' (which +MMA accepts); as well as the +MMA invalid forms: ``-($\Delta$7)'', and ``min$\natural$7''.
    susSuspended 4th, major triad with 3rd raised half tone.
    sus2Suspended 2nd, major triad with major 2nd above root substituted for 3rd.
    sus4Suspended 4th, major triad with 3rd raised half tone.
    sus9Dominant 7th plus 9th, omit 7th.
     
    +In modern pop charts the ``M'' in a major 7th chord (and other major +chords) is often represented by a ``$\Delta$''. When entering these +chords, just replace the ``$\Delta$'' with an ``M''. For example, +change ``G$\Delta$7'' to ``GM7''. + +

    +A chord name without a type is interpreted as a major chord (or +triad). For example, the chord ``C'' is identical to ``CM''. + +

    + +MMA has an large set of defined chords. However, you can add your +own with the DEFCHORD command, details + here. + +

    + +

    +
    +Octave Adjustment +

    + +

    +Depending on the key and chord sequence, a chord may end up in the +wrong octave. This is caused by +MMA 's internal routines which +create a chord: all of the tables are maintained for a ``C'' chord and +the others are derived from that point by subtracting or adding a +constant. To compensate you can add a leading ``-'' or ``+'' to the +chordname to force the movement of that chord and scale up or down an +octave. + +

    +For example, the following line will move the chord up and down for +the third and fourth beats: + +

    + + +
    + +
    Cm Fm -Gm +D7
    + +
    + +

    +The effect of octave shifting is also highly dependent on the voicing +options in effect for the track. + +

    +You'll have to listen to the +MMA output to detemine when +and where to use this adjustment. Hopefully, it won't be needed all +that much. + +

    +If you have a large number of chords to adjust, use the CHORDADJUST +command , here. + +

    + +

    +Diminished Chords +

    + +

    +In most pop and jazz charts it is assumed that a diminished chord is +always a diminished 7th ...a diminished triad is never played. + +MMA continues this, sometimes, erroneous assumption. You can change +the behaviour in several ways: change the chord notes and scale for a +``dim'' from a dim7 to a triad by following the instructions +here; use the slightly oddball +notation of ``m$\flat$5'' which generates a ``diminished tirad''; or +use the more-oddball notation ``dim3''. + +

    +Notational notes: In printed music a ``diminished'' chord is sometimes +represented with a small circle symbol (eg. +``FO'') and a ``half-diminished'' as a +small slashed circle (e.g., ``CØ''). + +

    +A half-diminished chord in +MMA is specified with the notation +``m7$\flat$5''. + +

    + +

    +Slash Chords +

    + +

    +Charts sometimes use slash chords in the form ``Am/E''. This +notation is used, mainly, to indicate chord inversions. For example, +the chord notes in ``Am/E'' become ``E'', ``A'' and ''C'' with the +``E'' taking the root position. +MMA will accept chords of this type. +However, you may not notice any difference in the generated tracks due +to the inversions used by the current pattern. + +

    +You may also encounter slash chords where the slash-part of the chord +is not a note in the chord. Consider the ambiguous notation +``Dm/C''. The composer (or copyist) might mean to add a ``C'' bass +note to a ``Dm'' chord, or she might mean ``Dm7'', or even an inverted +``Dm7''. +MMA will handle these ...almost perfectly. When the +``slash'' part of the chord indicates a note which is not a +note in the chord, +MMA assumes that the indicated note should be +used in the bass line. Since each chord generated by +MMA also has a +``scale'' associated with it for use by bass and scale patterns this +works. For example, a C Major chord will have the scale ``c, d, e, f, +g, a, b''; a C Minor chord has the same scale, but with an e$\flat$. +If the slash note is contained in the scale, the scale will be rotated +so that the note becomes the ``root'' note. + +

    +A warning message will be printed if the note is not in both the chord +and the scale. + +

    +Another notation you may see is something like ``Dm/9''. Again, +the meaning is not clear. It probably means a ``Dm9'', or ``Dm9/E'' +... but since +MMA isn't sure this notation will generate an +error. + +

    +Please note that for fairly obvious reasons you cannot have both slash +notation and an inversion (see the next section). + +

    +For more details on ``slash chords'' your favorite +music theory book or teacher is highly recommended! + +

    + +

    +Chord Inversions +

    + +

    +Instead of using a slash chord you can specify an inversion to use with a chord. +The notation is simply an ``>'' and a number between -5 and 5 immediately following +the chord name. + +

    +The chord will be ``rotated'' as specified by the value after the ``>''. + +

    +For example, the chord ``C>2'' will generate the notes G, C and E; ``F>-1'' +gives C, F and A. + +

    +There is an important difference between this option and a slash chord: in inversions neither +the root note nor the associated scale are modified. + +

    + +

    + +
    +MIDI Voices +

    + +

    +When setting a voice for a track (IE Bass Voice NN), you can specify +the patch to use with a symbolic constant. Any combination of upper +and lower case is permitted. The following are the names with the +equivalent voice numbers: + +

    + +

    + +

    +Voices, Alphabetically +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    5thSawWave86
    Accordion21
    AcousticBass32
    AgogoBells113
    AltoSax65
    Applause/Noise126
    Atmosphere99
    BagPipe109
    Bandoneon23
    Banjo105
    BaritoneSax67
    Bass&Lead87
    Bassoon70
    BirdTweet123
    BottleBlow76
    BowedGlass92
    BrassSection61
    BreathNoise121
    Brightness100
    Celesta8
    Cello42
    Charang84
    ChifferLead83
    ChoirAahs52
    ChurchOrgan19
    Clarinet71
    Clavinet7
    CleanGuitar27
    ContraBass43
    Crystal98
    DistortonGuitar30
    EPiano5
    EchoDrops102
    EnglishHorn69
    Fantasia88
    Fiddle110
    FingeredBass33
    Flute73
    FrenchHorn60
    FretlessBass35
    Glockenspiel9
    Goblins101
    GuitarFretNoise120
    GuitarHarmonics31
    GunShot127
    HaloPad94
    Harmonica22
    HarpsiChord6
    HelicopterBlade125
    Honky-TonkPiano3
    IceRain96
    JazzGuitar26
    Kalimba108
    Koto107
    Marimba12
    MelodicTom1117
    MetalPad93
    MusicBox10
    MutedGuitar28
    MutedTrumpet59
    NylonGuitar24
    Oboe68
    Ocarina79
    OrchestraHit55
    OrchestralHarp46
    Organ116
    Organ217
    Organ318
    OverDriveGuitar29
    PanFlute75
    Piano10
    Piano21
    Piano32
    Piccolo72
    PickedBass34
    PizzicatoString45
    PolySynth90
    Recorder74
    ReedOrgan20
    ReverseCymbal119
    RhodesPiano4
    Santur15
    SawWave81
    SeaShore122
    Shakuhachi77
    Shamisen106
    Shanai111
    Sitar104
    SlapBass136
    SlapBass237
    SlowStrings49
    SoloVoice85
    SopranoSax64
    SoundTrack97
    SpaceVoice91
    SquareWave80
    StarTheme103
    SteelDrums114
    SteelGuitar25
    Strings48
    SweepPad95
    SynCalliope82
    SynthBass138
    SynthBass239
    SynthBrass162
    SynthBrass263
    SynthDrum118
    SynthStrings150
    SynthStrings251
    SynthVox54
    TaikoDrum116
    TelephoneRing124
    TenorSax66
    Timpani47
    TinkleBell112
    TremoloStrings44
    Trombone57
    Trumpet56
    Tuba58
    TubularBells14
    Vibraphone11
    Viola41
    Violin40
    VoiceOohs53
    WarmPad89
    Whistle78
    WoodBlock115
    Xylophone13
     
    +

    + +

    +Voices, By MIDI Value +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0Piano1
    1Piano2
    2Piano3
    3Honky-TonkPiano
    4RhodesPiano
    5EPiano
    6HarpsiChord
    7Clavinet
    8Celesta
    9Glockenspiel
    10MusicBox
    11Vibraphone
    12Marimba
    13Xylophone
    14TubularBells
    15Santur
    16Organ1
    17Organ2
    18Organ3
    19ChurchOrgan
    20ReedOrgan
    21Accordion
    22Harmonica
    23Bandoneon
    24NylonGuitar
    25SteelGuitar
    26JazzGuitar
    27CleanGuitar
    28MutedGuitar
    29OverDriveGuitar
    30DistortonGuitar
    31GuitarHarmonics
    32AcousticBass
    33FingeredBass
    34PickedBass
    35FretlessBass
    36SlapBass1
    37SlapBass2
    38SynthBass1
    39SynthBass2
    40Violin
    41Viola
    42Cello
    43ContraBass
    44TremoloStrings
    45PizzicatoString
    46OrchestralHarp
    47Timpani
    48Strings
    49SlowStrings
    50SynthStrings1
    51SynthStrings2
    52ChoirAahs
    53VoiceOohs
    54SynthVox
    55OrchestraHit
    56Trumpet
    57Trombone
    58Tuba
    59MutedTrumpet
    60FrenchHorn
    61BrassSection
    62SynthBrass1
    63SynthBrass2
    64SopranoSax
    65AltoSax
    66TenorSax
    67BaritoneSax
    68Oboe
    69EnglishHorn
    70Bassoon
    71Clarinet
    72Piccolo
    73Flute
    74Recorder
    75PanFlute
    76BottleBlow
    77Shakuhachi
    78Whistle
    79Ocarina
    80SquareWave
    81SawWave
    82SynCalliope
    83ChifferLead
    84Charang
    85SoloVoice
    865thSawWave
    87Bass&Lead
    88Fantasia
    89WarmPad
    90PolySynth
    91SpaceVoice
    92BowedGlass
    93MetalPad
    94HaloPad
    95SweepPad
    96IceRain
    97SoundTrack
    98Crystal
    99Atmosphere
    100Brightness
    101Goblins
    102EchoDrops
    103StarTheme
    104Sitar
    105Banjo
    106Shamisen
    107Koto
    108Kalimba
    109BagPipe
    110Fiddle
    111Shanai
    112TinkleBell
    113AgogoBells
    114SteelDrums
    115WoodBlock
    116TaikoDrum
    117MelodicTom1
    118SynthDrum
    119ReverseCymbal
    120GuitarFretNoise
    121BreathNoise
    122SeaShore
    123BirdTweet
    124TelephoneRing
    125HelicopterBlade
    126Applause/Noise
    127GunShot
     
    +

    + +

    + +
    +Drum Notes +

    + +

    +When defining a drum tone, you can specify the patch to use with a +symbolic constant. Any combination of upper and lower case is +permitted. In addition to the drum tone name and the MIDI value, the +equivalent ``name'' in +$^{superscript}$ is included. The ``names'' may help you +find the tones on your keyboard. + +

    + +

    +Drum Notes, Alphabetically +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cabasa69$^{A}$
    Castanets84$^{C}$
    ChineseCymbal52$^{E}$
    Claves75$^{E\flat}$
    ClosedHiHat42$^{G\flat}$
    CowBell56$^{A\flat}$
    CrashCymbal149$^{D\flat}$
    CrashCymbal257$^{A}$
    HandClap39$^{E\flat}$
    HighAgogo67$^{G}$
    HighBongo60$^{C}$
    HighQ27$^{E\flat}$
    HighTimbale65$^{F}$
    HighTom150$^{D}$
    HighTom248$^{C}$
    HighWoodBlock76$^{E}$
    JingleBell83$^{B}$
    KickDrum136$^{C}$
    KickDrum235$^{B}$
    LongGuiro74$^{D}$
    LongLowWhistle72$^{C}$
    LowAgogo68$^{A\flat}$
    LowBongo61$^{D\flat}$
    LowConga64$^{E}$
    LowTimbale66$^{G\flat}$
    LowTom143$^{G}$
    LowTom241$^{F}$
    LowWoodBlock77$^{F}$
    Maracas70$^{B\flat}$
    MetronomeBell34$^{B\flat}$
    MetronomeClick33$^{A}$
    MidTom147$^{B}$
    MidTom245$^{A}$
    MuteCuica78$^{G\flat}$
    MuteHighConga62$^{D}$
    MuteSudro85$^{D\flat}$
    MuteTriangle80$^{A\flat}$
    OpenCuica79$^{G}$
    OpenHiHat46$^{B\flat}$
    OpenHighConga63$^{E\flat}$
    OpenSudro86$^{D}$
    OpenTriangle81$^{A}$
    PedalHiHat44$^{A\flat}$
    RideBell53$^{F}$
    RideCymbal151$^{E\flat}$
    RideCymbal259$^{B}$
    ScratchPull30$^{G\flat}$
    ScratchPush29$^{F}$
    Shaker82$^{B\flat}$
    ShortGuiro73$^{D\flat}$
    ShortHiWhistle71$^{B}$
    SideKick37$^{D\flat}$
    Slap28$^{E}$
    SnareDrum138$^{D}$
    SnareDrum240$^{E}$
    SplashCymbal55$^{G}$
    SquareClick32$^{A\flat}$
    Sticks31$^{G}$
    Tambourine54$^{G\flat}$
    VibraSlap58$^{B\flat}$
     
    +

    + +

    +Drum Notes, by MIDI Value +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    27HighQ$^{E\flat}$
    28Slap$^{E}$
    29ScratchPush$^{F}$
    30ScratchPull$^{G\flat}$
    31Sticks$^{G}$
    32SquareClick$^{A\flat}$
    33MetronomeClick$^{A}$
    34MetronomeBell$^{B\flat}$
    35KickDrum2$^{B}$
    36KickDrum1$^{C}$
    37SideKick$^{D\flat}$
    38SnareDrum1$^{D}$
    39HandClap$^{E\flat}$
    40SnareDrum2$^{E}$
    41LowTom2$^{F}$
    42ClosedHiHat$^{G\flat}$
    43LowTom1$^{G}$
    44PedalHiHat$^{A\flat}$
    45MidTom2$^{A}$
    46OpenHiHat$^{B\flat}$
    47MidTom1$^{B}$
    48HighTom2$^{C}$
    49CrashCymbal1$^{D\flat}$
    50HighTom1$^{D}$
    51RideCymbal1$^{E\flat}$
    52ChineseCymbal$^{E}$
    53RideBell$^{F}$
    54Tambourine$^{G\flat}$
    55SplashCymbal$^{G}$
    56CowBell$^{A\flat}$
    57CrashCymbal2$^{A}$
    58VibraSlap$^{B\flat}$
    59RideCymbal2$^{B}$
    60HighBongo$^{C}$
    61LowBongo$^{D\flat}$
    62MuteHighConga$^{D}$
    63OpenHighConga$^{E\flat}$
    64LowConga$^{E}$
    65HighTimbale$^{F}$
    66LowTimbale$^{G\flat}$
    67HighAgogo$^{G}$
    68LowAgogo$^{A\flat}$
    69Cabasa$^{A}$
    70Maracas$^{B\flat}$
    71ShortHiWhistle$^{B}$
    72LongLowWhistle$^{C}$
    73ShortGuiro$^{D\flat}$
    74LongGuiro$^{D}$
    75Claves$^{E\flat}$
    76HighWoodBlock$^{E}$
    77LowWoodBlock$^{F}$
    78MuteCuica$^{G\flat}$
    79OpenCuica$^{G}$
    80MuteTriangle$^{A\flat}$
    81OpenTriangle$^{A}$
    82Shaker$^{B\flat}$
    83JingleBell$^{B}$
    84Castanets$^{C}$
    85MuteSudro$^{D\flat}$
    86OpenSudro$^{D}$
     
    +

    + +

    + +
    +MIDI Controllers +

    + +

    +When specifying a MIDI Controller in a MIDISEQ or +MIDIVOICE command you can use the absolute value in (either as +a decimal number or in hexadecimal by prefixing the value with a +``0x''), or the symbolic name in the following tables. The tables have +been extracted from information at +http://www.midi.org/about-midi/table3.shtml. Note that all the +values in these tables are in hexadecimal notation. + +

    +Complete reference for this is not a part of +MMA . Please refer to a +detailed text on MIDI or the manual for your synthesizer. + +

    + +

    +Controllers, Alphabetically +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AllNotesOff7b
    AllSoundsOff78
    AttackTime49
    Balance08
    BalanceLSB28
    Bank00
    BankLSB20
    Breath02
    BreathLSB22
    Brightness4a
    Chorus5d
    Ctrl10266
    Ctrl10367
    Ctrl10468
    Ctrl10569
    Ctrl1066a
    Ctrl1076b
    Ctrl1086c
    Ctrl1096d
    Ctrl1106e
    Ctrl1116f
    Ctrl11270
    Ctrl11371
    Ctrl11472
    Ctrl11573
    Ctrl11674
    Ctrl11775
    Ctrl11876
    Ctrl11977
    Ctrl140e
    Ctrl150f
    Ctrl2014
    Ctrl2115
    Ctrl2216
    Ctrl2317
    Ctrl2418
    Ctrl2519
    Ctrl261a
    Ctrl271b
    Ctrl281c
    Ctrl291d
    Ctrl303
    Ctrl301e
    Ctrl311f
    Ctrl3523
    Ctrl4129
    Ctrl462e
    Ctrl472f
    Ctrl5234
    Ctrl5335
    Ctrl5436
    Ctrl5537
    Ctrl5638
    Ctrl5739
    Ctrl583a
    Ctrl593b
    Ctrl603c
    Ctrl613d
    Ctrl623e
    Ctrl633f
    Ctrl794f
    Ctrl8555
    Ctrl8656
    Ctrl8757
    Ctrl8858
    Ctrl8959
    Ctrl909
    Ctrl905a
    Data06
    DataDec61
    DataInc60
    DataLSB26
    DecayTime4b
    Detune5e
    Effect10c
    Effect1LSB2c
    Effect20d
    Effect2LSB2d
    Expression0b
    ExpressionLSB2b
    Foot04
    FootLSB24
    General110
    General1LSB30
    General211
    General2LSB31
    General312
    General3LSB32
    General413
    General4LSB33
    General550
    General651
    General752
    General853
    Hold245
    Legato44
    LocalCtrl7a
    Modulation01
    ModulationLSB21
    NonRegLSB62
    NonRegMSB63
    OmniOff7c
    OmniOn7d
    Pan0a
    PanLSB2a
    Phaser5f
    PolyOff7e
    PolyOn7f
    Portamento05
    Portamento41
    PortamentoCtrl54
    PortamentoLSB25
    RegParLSB64
    RegParMSB65
    ReleaseTime48
    ResetAll79
    Resonance47
    Reverb5b
    SoftPedal43
    Sostenuto42
    Sustain40
    Tremolo5c
    Variation46
    VibratoDelay4e
    VibratoDepth4d
    VibratoRate4c
    Volume07
    VolumeLSB27
     
    +

    + +

    +Controllers, by Value +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    00Bank
    01Modulation
    02Breath
    03Ctrl3
    04Foot
    05Portamento
    06Data
    07Volume
    08Balance
    09Ctrl9
    0aPan
    0bExpression
    0cEffect1
    0dEffect2
    0eCtrl14
    0fCtrl15
    10General1
    11General2
    12General3
    13General4
    14Ctrl20
    15Ctrl21
    16Ctrl22
    17Ctrl23
    18Ctrl24
    19Ctrl25
    1aCtrl26
    1bCtrl27
    1cCtrl28
    1dCtrl29
    1eCtrl30
    1fCtrl31
    20BankLSB
    21ModulationLSB
    22BreathLSB
    23Ctrl35
    24FootLSB
    25PortamentoLSB
    26DataLSB
    27VolumeLSB
    28BalanceLSB
    29Ctrl41
    2aPanLSB
    2bExpressionLSB
    2cEffect1LSB
    2dEffect2LSB
    2eCtrl46
    2fCtrl47
    30General1LSB
    31General2LSB
    32General3LSB
    33General4LSB
    34Ctrl52
    35Ctrl53
    36Ctrl54
    37Ctrl55
    38Ctrl56
    39Ctrl57
    3aCtrl58
    3bCtrl59
    3cCtrl60
    3dCtrl61
    3eCtrl62
    3fCtrl63
    40Sustain
    41Portamento
    42Sostenuto
    43SoftPedal
    44Legato
    45Hold2
    46Variation
    47Resonance
    48ReleaseTime
    49AttackTime
    4aBrightness
    4bDecayTime
    4cVibratoRate
    4dVibratoDepth
    4eVibratoDelay
    4fCtrl79
    50General5
    51General6
    52General7
    53General8
    54PortamentoCtrl
    55Ctrl85
    56Ctrl86
    57Ctrl87
    58Ctrl88
    59Ctrl89
    5aCtrl90
    5bReverb
    5cTremolo
    5dChorus
    5eDetune
    5fPhaser
    60DataInc
    61DataDec
    62NonRegLSB
    63NonRegMSB
    64RegParLSB
    65RegParMSB
    66Ctrl102
    67Ctrl103
    68Ctrl104
    69Ctrl105
    6aCtrl106
    6bCtrl107
    6cCtrl108
    6dCtrl109
    6eCtrl110
    6fCtrl111
    70Ctrl112
    71Ctrl113
    72Ctrl114
    73Ctrl115
    74Ctrl116
    75Ctrl117
    76Ctrl118
    77Ctrl119
    78AllSoundsOff
    79ResetAll
    7aLocalCtrl
    7bAllNotesOff
    7cOmniOff
    7dOmniOn
    7ePolyOff
    7fPolyOn
     
    +

    + +

    +


    + + +next + +up + +previous +
    + Next: Bibliography and Thanks + Up: Reference Manual + Previous: Frequency Asked Questions + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node27.html b/mma/docs/html/ref/node27.html new file mode 100644 index 0000000..7c5c62c --- /dev/null +++ b/mma/docs/html/ref/node27.html @@ -0,0 +1,140 @@ + + + + + +Bibliography and Thanks + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Command Summary + Up: Reference Manual + Previous: Symbols and Constants +
    +
    + + +

    +Bibliography and Thanks +

    + +

    +I've had help from a lot of different people and sources in developing +this program. If I have missed listing you in the CONTRIB +file shipped with the +MMA distribution, please let me know and I'll +add it right away. I really want to do this! + +

    +I've also had the use of a number of reference materials: +

    +
    +
    Craig Anderson. MIDI for Musicians. Amsco Publishing, New +York, NY. + +

    +

    +
    +
    William Duckworth. Music Fundamentals. Wadsworth Publishing, +Belomnt, CA. + +

    +

    +
    +
    Michael Esterowitz. How To Play From A Fakebook. Ekay Music, +Inc. Katonah, NY. + +

    +

    +
    +
    Pete Goodliffe. MIDI documentation (for the TSE3 library). +http://tse3.sourceforge.net/. + +

    +

    +
    +
    Norman Lloyd. The Golden Encyclopedia Of Music. Golden Press, +New York, NY. + +

    +

    +
    +
    The MIDI Manufacturers Association. Various papers, tables and + other information. http://www.midi.org/. + +

    +

    +
    +
    Victor López. Latin Rhythms: Mystery Unraveled. Alfred Publishing Company. These are handout notes from the 2005 Midwest Clinic 59th Annual Conference, Chicago, Illinois, December 16, 2005. A PDF of this document is available on various internet sites. + +

    +

    +
    + +

    +And, finally, to all those music teachers my parents and I paid for, +and the many people who have helped by listening and providing helpful +suggestions and encouragement in my musical pursuits for the +last 40 plus years that I've been banging, squeezing and blowing. You know +who you are--thanks. + +

    +


    + + +next + +up + +previous +
    + Next: Command Summary + Up: Reference Manual + Previous: Symbols and Constants + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node28.html b/mma/docs/html/ref/node28.html new file mode 100644 index 0000000..a9ab42b --- /dev/null +++ b/mma/docs/html/ref/node28.html @@ -0,0 +1,434 @@ + + + + + +Command Summary + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: About this document ... + Up: Reference Manual + Previous: Bibliography and Thanks +
    +
    + + +

    +Command Summary +

    + +

    +

    +TRACK Accent <beat adj> Adjust volume for specified beat(s) in each bar of a track. +
    +

    +

    AdjustVolume <name=value> Set the volume ratios for named volume(s). +
    +

    +

    AllTracks <cmds> Applies cmds(s) to all active tracks. +
    +

    +

    TRACK Articulate <value> ... Duration/holding-time of notes. +
    +

    +

    Author <stuff> A specialized comment used by documentation extractors. +
    +

    +

    AutoSoloTracks <tracks> Set the tracks used in auto assigning solo/melody notes. +
    +

    +

    BarNumbers Leading <number> on data line (ignored). +
    +

    +

    BarRepeat Data bars can repeat with a ``* nn'' +
    +

    +

    BeatAdjust <beats> Adjust current pointer by <beats>. +
    +

    +

    Begin Delimits the start of a block. +
    +

    +

    TRACK ChShare <track> Force track to share MIDI track. +
    +

    +

    TRACK Channel <1..16> Force the MIDI channel for a track. +
    +

    +

    TRACK ChannelPref <1..16> Set a preferred channel for track. +
    +

    +

    ChordAdjust <Tonic=adj> Adjust center point of selected chords. +
    +

    +

    Comment <text> ignore/discard <text>. +
    +

    +

    TRACK Compress <value> ... Enable chord compression for track. +
    +

    +

    TRACK Copy <source> Overlay <source> track to sepecified track. +
    +

    +

    [TRACK] Cresc <[start] end count> Decrease volume over bars. +
    +

    +

    [TRACK] Cut <beat> Force all notes off at <beat> offset. +
    +

    +

    Debug <options> Selectively enable/disable debugging levels. +
    +

    +

    Dec <name> [value] Decrement the value of variable <name> by 1 or <value>. +
    +

    +

    [TRACK] Decresc <[start] end count> Increase volume over bars. +
    +

    +

    DefChord <name notelist scalelist> Define a new chord. +
    +

    +

    DefGroove <name> [Description] Define a new groove. +
    +

    +

    TRACK Define <pattern> Define a pattern to use in a track. +
    +

    +

    TRACK Delete Delete specified track for future use. +
    +

    +

    TRACK Direction [Up | Down | BOTH | RANDOM] ... Set direction of runs in Scale, Apreggio and Walk tracks. +
    +

    +

    Doc <stuff> A special comment used by documentation extractors. +
    +

    +

    DrumTR <old>=<new> translates MIDI drum tone <old> to <new>. +
    +

    +

    TRACK DrumType Force a solo track to be a drum track. +
    +

    +

    DrumVolTr <tone>=<adj> ... adjusts volume for specified drum tone. +
    +

    +

    TRACK DupRoot <octave> Duplicate the root note in a chord to lower/higher octave. +
    +

    +

    End Delimits the end of a block. +
    +

    +

    EndIf End processing of ``IF''. +
    +

    +

    EndMset End of a ``Mset'' section. +
    +

    +

    EndRepeat [count] End a repeated section. +
    +

    +

    Eof Immediately stop/end input file. +
    +

    +

    Fermata <beat> <count> <adjustment> Expand <beat> for <count> by <adjustment percentage. +
    +

    +

    TRACK ForceOut Force voicing and raw data output for track. +
    +

    +

    Goto <name> jump processing to <name>. +
    +

    +

    Groove <name> Enable a previously defined groove. +
    +

    +

    TRACK Harmony [Option] ... Set harmony for Bass, Walk, Arpeggio, Scale, Solo and Melody tracks. +
    +

    +

    TRACK HarmonyOnly <Option> ... Force track to sound only harmony notes from current pattern. +
    +

    +

    TRACK HarmonyVolume <Percentage> ... Set the volume used by harmony notes. +
    +

    +

    If <test> <cmds> Test condition and process <cmds>. +
    +

    +

    IfEnd End processing of ``IF''. +
    +

    +

    Inc <name> [value] Increment the value of variable <name> by 1 or <value>. +
    +

    +

    Include <file> Include a file. +
    +

    +

    TRACK Invert <value> ... set the inversion factor for chords in track. +
    +

    +

    KeySig <sig> Set the key signature. +
    +

    +

    Label <name> Set <name> as a label for ``GOTO''. +
    +

    +

    TRACK Limit <value> Limit number of notes used in a chord to <value>. +
    +

    +

    Lyric <options> Set various lyrics options. +
    +

    +

    MIDI <values> Send raw MIDI commands to MIDI meta-track. +
    +

    +

    TRACK MIDIClear <Beat Controller Data> Set command (or series) of MIDI commands to send when track is completed. +
    +

    +

    MIDIFile <option> Set various MIDI file generation options. +
    +

    +

    TRACK MIDIGlis <1..127> Set MIDI portamento (glissando) value for track. +
    +

    +

    TRACK MIDIInc <File> <Options> Include an existing MIDI file into a track. +
    +

    +

    MIDIMark [offset] Label Inserts Label into the MIDI track. +
    +

    +

    TRACK MIDIPan <0..127> Set MIDI pan/balance for track. +
    +

    +

    TRACK MIDISeq <Beat Controller Data> options> ... Set MIDI controller data for a track. +
    +

    +

    MIDISplit <channel list> Force split output for track. +
    +

    +

    TRACK MIDITName <string> Assigns an alternate name to a MIDI track. +
    +

    +

    TRACK MIDIVoice <Beat Controller Data> Set ``one-time'' MIDI controller command for track. +
    +

    +

    TRACK MIDIVolume <1..128> Set MIDI volume for track. +
    +

    +

    TRACK Mallet <Rate=nn | Decay=nns> Set mallet repeat for track. +
    +

    +

    MmaEnd <file> Set filename to process after main file completed. +
    +

    +

    MmaStart <file> Set file to include before processing main file. +
    +

    +

    Mset <name> <lines> Set <variable> to series of lines. +
    +

    +

    MsetEnd End of a ``Mset'' section. +
    +

    +

    TRACK NoteSpan <start> <end> set MIDI range of notes for track. +
    +

    +

    TRACK Octave <0..10> ... Set the octave for track. +
    +

    +

    TRACK Off Disable note generation for specified track. +
    +

    +

    TRACK On Enable note generation for specified track. +
    +

    +

    Print <stuff> Print <stuff> to output during compile. Useful for debugging. +
    +

    +

    PrintActive Print list of active tracks to output. +
    +

    +

    PrintChord <name(s)> Print the chord and scale for specific chord types. +
    +

    +

    TRACK RSkip <Value> ... Skip/silence random percentage of notes. +
    +

    +

    TRACK RTime <Value] ... +
    +

    +

    TRACK RVolume <adj> ... Set volume randomization for track. +
    +

    +

    TRACK Range <value> Set number of octaves used in Scale and Arpeggio tracks. +
    +

    +

    Repeat Start a repeated section. +
    +

    +

    RepeatEnd [count] End a repeated section. +
    +

    +

    RepeatEnding Start a repeat-ending. +
    +

    +

    TRACK Riff <pattern> Define a special pattern to use in track for next bar. +
    +

    +

    RndSeed <Value> ... Seed random number generator. +
    +

    +

    RndSet <variable> <list of values> Randomly set variable. +
    +

    +

    TRACK ScaleType <Chromatic | Auto> ... Set type of scale. Only for Scale tracks. +
    +

    +

    Seq Set the sequence point (bar pattern number). +
    +

    +

    [TRACK] SeqClear Clears sequence for track (or all tracks). +
    +

    +

    [TRACK] SeqRnd <On/Off/Tracks> Enable random seqeuence selection for track (or all tracks). +
    +

    +

    [TRACK] SeqRndWeight <list of values> Sets the randomization weight for track or global. +
    +

    +

    SeqSize <value> Set the number of bars in a sequence. +
    +

    +

    TRACK Sequence <pattern> ... Set pattern(s) to use for track. +
    +

    +

    Set <name> <stuff> Set the variable <name> to <stuff>. +
    +

    +

    SetAutoLibPath <path> Set the Auto-Include file path. +
    +

    +

    SetIncPath <path> Set the path for included files. +
    +

    +

    SetLibPath <path> Set the path to the style file library. +
    +

    +

    SetOutPath <path> Set the output filename. +
    +

    +

    ShowVars Display user defined variables. +
    +

    +

    StackValue <stuff> Push <stuff> onto a temporary stack. Remove with special macro $_StackValue. +
    +

    +

    TRACK Strum <value> ... Set the strumming factor for Chord tracks. +
    +

    +

    SwingMode <on/off> Set swing mode timing. +
    +

    +

    Tempo <rate> Set the rate in beats per minute. +
    +

    +

    Time <count> Set number of beats in a bar. +
    +

    +

    TimeSig <nn dd> Set the MIDI timesignature (not used by MMA). +
    +

    +

    TRACK Tone <Note> ... Set the drum-tone to use in a sequence. +
    +

    +

    Transpose <value> Transpose all tracks to a different key. +
    +

    +

    UnSet <name> Remove the variable <name>. +
    +

    +

    [TRACK] Unify <On | Off> ... Unify overlapping notes. +
    +

    +

    Use <file> Include/import an existing .mma file. +
    +

    +

    VExpand <on/off> Set variable expansion. +
    +

    +

    TRACK Voice <instrument> ... Set MIDI voice for track. +
    +

    +

    VoiceTr <old=new> ... - translates MIDI instrument <old> to <new>. +
    +

    +

    VoiceVolTr <voice>=<adj> ... - adjusts volume for specified voice. +
    +

    +

    TRACK Voicing <options. Set the voicing for a chord track. +
    +

    +

    [TRACK] Volume <value> ... Set the volume for a track or all tracks. +
    +

    +

    +
    + +

    +


    + + +next + +up + +previous +
    + Next: About this document ... + Up: Reference Manual + Previous: Bibliography and Thanks + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node29.html b/mma/docs/html/ref/node29.html new file mode 100644 index 0000000..6f59668 --- /dev/null +++ b/mma/docs/html/ref/node29.html @@ -0,0 +1,73 @@ + + + + + +About this document ... + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Up: Reference Manual + Previous: Command Summary +
    +
    + + +

    +About this document ... +

    + LOST LOGO + +

    +Reference Manual

    +This document was generated using the +LaTeX2HTML translator Version 2002-2-1 (1.71) +

    +Copyright © 1993, 1994, 1995, 1996, +Nikos Drakos, +Computer Based Learning Unit, University of Leeds. +
    +Copyright © 1997, 1998, 1999, +Ross Moore, +Mathematics Department, Macquarie University, Sydney. +

    +The command line arguments were:
    + latex2html -split +1 -dir html -no_math -no_footnode -local_icons -up_url ../mma.html -up_title 'Main MMA Reference' mma.tex +

    +The translation was initiated by Bob on 2006-10-15 +


    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node3.html b/mma/docs/html/ref/node3.html new file mode 100644 index 0000000..92dab2c --- /dev/null +++ b/mma/docs/html/ref/node3.html @@ -0,0 +1,488 @@ + + + + + +Tracks and Channels + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Patterns + Up: Reference Manual + Previous: Running +
    +
    + + +Subsections + + + +
    + +

    + +
    +Tracks and Channels +

    + +

    +This chapter discusses +MMA tracks and MIDI channels. If you are +reading this manual for the first time you might find some parts +confusing. If you do just skip ahead--you can run +MMA without +knowing many of these details. + +

    + +

    + +MMA Tracks +

    + +

    +To create your accompaniment tracks, +MMA divides output into several +internal tracks. There are a total of 8 different types of tracks, and +an unlimited number of sub-tracks. + +

    +When +MMA is initialized there are no tracks assigned; however, as +your library and song files are processed various tracks will be +created. Each track is created a unique name. The track types are discussed +later in this chapter, but for now they are BASS, CHORD, +WALK, DRUM, ARPEGGIO, SCALE, MELODY +and SOLO. + +

    +All tracks are named by appending a ``-'' and ``name'' to the +type-name. This makes it very easy to remember the names, without any +complicated rules. So, drum tracks can have names ``Drum-1'', +``Drum-Loud'' or even ``Drum-a-long-name''. The other tracks follow +the same rule. + +

    +In addition to the hyphenated names described above, you can also name +a track using the type-name. So, ``DRUM'' is a valid drum track name. +In the supplied library files you'll see that the hyphenated form is +usually used to describe patterns. + +

    +All track names are case insensitive. This means that the names +``Chord-Sus'', ``CHORD-SUS'' and ``CHORD-sus'' all refer to the same +track. + +

    +If you want to see the names defined in a song, just run +MMA on the +file with the ``-c'' command line option. + +

    + +

    +Track Channels +

    + +

    +MIDI defines 16 distinct channels numbered 1 to 16.3.1 There is nothing which says that ``chording'' +should be sent to a specific channel, but the drum channel should +always be channel 10.3.2 +

    +For +MMA to produce any output, a MIDI channel must be assigned to a +track. During initialization all of the DRUM tracks are assigned to +special MIDI channel 10. As musical data is created other MIDI +channels are assigned to various tracks as needed. + +

    +Channels are assigned from 16 down to 1. This means that the lower +numbered channels will most likely not be used, and will be available +for other programs or as a ``keyboard track'' on your synth. + +

    +In most cases this will work out just fine. However, there are a +number of methods you can use to set the channels ``manually.'' You +might want to read the sections on CHANNEL +(here), CHSHARE +(here), ON +(here), and OFF +(here). + +

    +Why bother with all these channels? It would be much easier to put all +the information onto one channel, but this would not permit you to set +special effects (like MIDIGLIS or MIDIPAN) for a specific +track. It would also mean that all your tracks would need to use the +same instrumentation. + +

    + +

    +Track Descriptions +

    + +

    +You might want to come back to this section after reading more of the +manual. But, somewhere, the different track types, +and why they exist needs to be detailed. + +

    +Musical accompaniment comes in a combination of the following: + +

    + +

      +
    • Chords played in a rhythmic or sustained manner, + +

      +

    • +
    • Single notes from chords played in a sustained manner, + +

      +

    • +
    • Bass notes. Usually played one at a time in a rhythmic manner, + +

      +

    • +
    • Scales, or parts of scales. Usually as an embellishment, + +

      +

    • +
    • Single notes from chords played one at time: arpeggios. + +

      +

    • +
    • Drums and other percussive instruments played rhythmically. + +

      +

    • +
    + +

    +Of course, this leaves the melody ... but that is up to you, not + +MMA ...but, if you suspect that some power is missing here, read +the brief description of SOLO and MELODY tracks +(here) and the complete ``Solo and +Melody Tracks'' chapter (here). + +

    + +MMA comes with several types of tracks, each designed to fill +different accompaniment roles. However, it's quite possible to use a +track for different roles than originally envisioned. For example, the +bass track can be used to generate a single, sustained treble +note--or, by enabling HARMONY, multiple notes. + +

    +The following sections describe the tracks and give a few suggestions +on their uses. + +

    + +

    +Drum +

    + +

    +Drums are the first thing one usually thinks about when we hear the word +``accompaniment''. All +MMA drum tracks share MIDI channel 10, which +is a GM MIDI convention. Drum tracks play single notes determined by +the TONE setting for a particular sequence. + +

    + +

    +Chord +

    + +

    +If you are familiar with the sound of guitar strumming, then you're +familiar with the sound of a chord. +MMA chord tracks play a number +of notes, all at the same time. The volume of the notes (and the +number of notes) and the rhythm is determined by pattern definitions. +The instrument used for the chord is determined by the VOICE +setting for a sequence. + +

    + +

    +Arpeggio +

    + +

    +In musical terms an arpeggio3.3 is the notes of a chord played +one at a time. +MMA arpeggio tracks take the current chord and, in +accordance to the current pattern, play single notes from the chord. +The choice of which note to play is mostly decided by +MMA . You can +help it along with the DIRECTION modifier. + +

    +ARPEGGIO tracks are used quite often to highlight rhythms. Using +the RSKIP directive produces broken arpeggios. + +

    +Using different note length values in patterns helps to make +interesting accompaniments. + +

    + +

    +Scale +

    + +

    +The playing of scales is a common musical embellishment which addes +depth and character to a piece. + +

    +When +MMA plays a scale, it first determines +the current chord. There is an associated scale for each chord which +attempts to match the flavor of that chord. The following table +sums up the logic used to create the scales: + +

    +

    +
    Major
    +
    A major scale + +

    +

    +
    Minor
    +
    A melodic minor scale3.4 +

    +

    +
    Diminished
    +
    A melodic minor scale with a minor fifth and minor + dominant seventh. + +

    +

    +
    + +

    +All scales start on the tonic of the current chord. + +

    +If the SCALETYPE is set to CHROMATIC, then a chromatic +scale is used. The default for SCALETYPE is AUTO. + +

    + +MMA plays successive notes of a scale. The timing and length of the +notes is determined by the current pattern. Depending on the +DIRECTION setting, the notes are played up, down or up and down +the scale. + +

    + +

    +Bass +

    + +

    +BASS tracks are designed to play single notes for a chord for +standard bass patterns. The note to be played, as well as its timing, +is determined by the pattern definition. The pattern defines which +note from the current chord to play. For example, a standard bass +pattern might alternate the playing of the root and fifth notes of a +scale or chord. You can also use BASS tracks to play single, +sustained treble notes. + +

    + +

    +Walk +

    + +

    +The WALK tracks are designed to imitate ``walking bass'' lines. +Traditionally, they are played on bass instruments like the upright +bass, bass guitar or tuba. + +

    +A WALK track uses a pattern to define the note timing and +volume. Which note is played is determined from the current chord and +a simplistic algorithm. There is no user control over the note +selection. + +

    + +

    + +
    +Solo and Melody +

    + +

    +SOLO and MELODY tracks are used for arbitrary note data. +Most likely, this is a melody or counter-melody ...but these +tracks can also be used to create interesting endings, introductions or +transitions. + +

    + +

    +Silencing a Track +

    + +

    +There are a number of ways to silence a track: + +

    + +

      +
    • Use the OFF (page [*]) command to stop the + generation of MIDI data, + +

      +

    • +
    • Disable the sequence for the bar with an empty sequence (page + [*]). + +

      +

    • +
    • Delete the entire sequence with SEQCLEAR (page + [*]). + +

      +

    • +
    • Disable the MIDI channel with a ``Channel 0'' (page + [*]). + +

      +

    • +
    + +

    +Please refer to the appropriate sections on this manual for further +details. + +

    + +

    +


    Footnotes

    +
    +
    ... 16.3.1
    +
    The + values 1 to 16 are used in this document. Internally they are stored + as values 0 to 15. + +
    +
    ... 10.3.2
    +
    This is not a MIDI rule, but a + convention established in the GM (General MIDI) standard. If you + want to find out more about this, there are lots of books on MIDI + available. + +
    +
    ...arpeggio3.3
    +
    The term is derived from + the Italian ``to play like a harp''. + +
    +
    ... scale3.4
    +
    If + you think that support for Melodic and Harmonic minor scales is + important, please contact us. + +
    +

    + + +next + +up + +previous +
    + Next: Patterns + Up: Reference Manual + Previous: Running + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node4.html b/mma/docs/html/ref/node4.html new file mode 100644 index 0000000..f377269 --- /dev/null +++ b/mma/docs/html/ref/node4.html @@ -0,0 +1,1284 @@ + + + + + +Patterns + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Sequences + Up: Reference Manual + Previous: Tracks and Channels +
    +
    + + +Subsections + + + +
    + +

    + +
    +Patterns +

    + +

    + +MMA builds its output based on PATTERNs and SEQUENCEs +supplied by you. These can be defined in the same file as the rest of +the song data, or can be included (see +here) from a library file. + +

    +A pattern is a definition for a voice or track which describes what +rhythm to play during the current bar. The actual notes selected for +the rhythm are determined by the song bar data (see +here). + +

    + +

    +Defining a Pattern +

    + +

    +The formats for the different tracks vary, but are similar enough to +confuse the unwary. + +

    +Each pattern definition consists of three parts: + +

    + +

      +
    • A unique label to identify the pattern. This is + case-insensitive. Note that the same label names can be used in + different tracks--for example, you could use the name ``MyPattern'' + in both a Drum and Chord pattern...but this is probably not a + good idea. Names can use punctuation characters, but must not begin + with an underscore (``_''). The pattern names ``z'' or ``Z'' and + ``-'' are also reserved. + +

      +

    • +
    • A series of note definitions. Each set in the series is + delimited with a ``;''. + +

      +

    • +
    • The end of the pattern definition is indicated by the + end-of-line. +
    • +
    + +

    +In the following sections definitions are shown in continuation +lines; however, it is quite legal to mash all the information onto a +single line. + +

    +The following concepts are used when defining a pattern: + +

    +

    +
    Start
    +
    When to start the note. This is expressed as a beat + offset. For example, to start a note at the start of a bar you use + ``1'', the second beat would be ``2'', the fourth ``4'', etc. You + can easily use off-beats as well: The ``and'' of 2 is ``2.5'', the + ``and ahh'' of the first beat is ``1.75'', etc. Using a beat offset + greater than the number of beats in a bar or less than ``0'' is not + permitted. Please note that offsets in the range ``0'' to ``.999'' + will actually be played in the previous bar (this can be + useful in Jazz charts, and it will generate a + warning!).4.1 See TIME + (here). + +

    +The offset can be further modified by appending a note length (see + the duration chart, below). If you want to specify an offset in the + middle of the first beat you can use ``1.5'' or ``1+8''. The latter + means the first beat plus the value of an eight note. This notation + is quite useful when generating ``swing'' sequences. For example, + two ``swing eights'' chords on beat one would be notated as: ``1 81 + 90; 1+81 82 90''. + +

    +You can subtract note lengths as well, but this is rarely done. And, + to make your style files completely unreadable, you can even use + note length combinations. So, yes, the following pattern is + fine:4.2 +

    + + +
    + +
    Chord Define C1 2-81+4 82 90
    + +
    + +

    + +

    +

    +
    Duration
    +
    The length of a note is somewhat standard musical + notation. Since it is impractical to draw in graphical notes or to + use fractions (like 1/4) +MMA , uses a shorthand + notation detailed in the following table: + +

    +

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NotationDescription
    1Whole note
    2Half
    4Quarter
    8Eighth
    81The first of a pair of swing eights
    82The second of a pair of swing eights
    16Sixteenth
    32Thirty-second
    64Sixty-fourth
    3Eight note triplet
    43Quarter note triplet
    23Half note triplet
    6Sixteenth note triplet
    5Eight note quintuplet
    0A single MIDI tick
    + +
    + +
    + +

    +The ``81'' and ``82'' notations represent the values of a pair of + eighth notes in a swing pair. These values vary depending on the + setting of SWINGMODE SKEW, see here. + +

    +The note length ``0'' is a special value often used in drum + tracks where the actual ``ringing''length appears to be controlled + by the MIDI synth, not the driving program. Internally, a ``0'' note + length is converted to a single MIDI tick. + +

    +Lengths can have a single or double dot appended. For example, + ``2.'' is a dotted half note and ``4..'' adds an eight and sixteenth + value to a quarter note. + +

    +Note lengths can be combined using ``+''. For example, to make a + dotted eight note use the notation ``8+16'', a dotted half ``2+4'', + and a quarter triplet ``3+3''. + +

    +Note lengths can also be combined using a ``-''. For example, to + make a dotted half you could use ``1-4''. Subtraction might appear + silly at first, but is useful in generating a note just a bit + shorter than its full beat. For example, ``1-0'' will generate a + note 1 MIDI tick shorter than a whole note. This can be used in + generating breaks in sustained tones.4.3 +

    +It is permissible to combine notes with ``dots'', ``+''s and ``-''s. The + notation ``2.+4'' would be the same as a whole note. + +

    +The actual duration given to a note will be adjusted by the + ARTICULATE value here). + +

    +

    +
    Volume
    +
    The MIDI velocity4.4 to use for the specified note. + For a detailed explanation of how +MMA calculates the volume of a + note, see read this. + +

    +MIDI velocities are limited to the range 0 to 127. However, +MMA does not check the volumes specified in a pattern for + validity.4.5 +

    +In most cases velocities in the range 50 to 100 are useful. + +

    +

    +
    Offset
    +
    The offset into the current chord. If you have, for + example, a C minor chord (C, E$\flat$, and G) has 3 offsets: 0, 1 + and 2. Note that the offsets refer to the chord not the + scale. For example, a musician might refer to the ``fifth''--this + means the fifth note of a scale ...in a major chord this is the + third note, which has an offset of 2 in +MMA . + +

    +

    +
    + +

    +Patterns can be defined for BASS, WALK, CHORD, +ARPEGGIO and DRUM tracks. All patterns are +shared by the tracks of the same type--Chord-Sus and +Chord-Piano share the patterns for Chord. As a +convenience, +MMA will permit you to define a pattern for a +sub-track, but remember that it will be shared by all similar tracks. +For example: + +

    + + +
    + +
    Drum Define S1 1 0 50
    + +
    + +

    +and + +

    + + +
    + +
    Drum-woof Define S1 1 0 50
    + +
    + +

    +Will generate identical outcomes.4.6 +

    + +

    +
    +Bass +

    + +

    +A bass pattern is defined with: + +

    + + +
    + +
    Position Duration Offset Volume ; ...
    + +
    + +

    +Each group consists of an beat offset for the start point, the note +duration, the note offset and volume. + +

    +The note offset is one of the digits ``1'' through ``7'', each +representing a note of the chord scale. So, if you want to play the +root and fifth in a traditional bass pattern you'd use ``1'' and ``5'' +in your pattern definition. + +

    +The note offset can be modified by appending a single or multiple set +of ``+'' or ``-'' signs. Each ``+'' will force the note up an octave; +each ``-'' forces it down. This modifier is handy in creating bass +patterns when you wish to alternate between the root note and the root +up an octave ...but users will find other interesting +patterns. There is no limit to the number of ``+''s or ``-''s. You can +even use both together if you're in a mood to obfuscate. + +

    +The note offset can be further modified with a single accidental "#", +"&" or "b". This modifier will raise or lower the note by a +semitone.4.7 In the boogie-woogie +library file a "6#" is used to generate a dominant 7th. + +

    + +
    + +
    + Bass Definition +
    + + + +
    + +
    Bass Define Broken8 1 8 1 90 ; \ +
        2 8 5 80 ; \ +
        3 8 3 90 ; \ +
        4 8 1+ 80
    + +
    + +

    +
    +
    Sheet Music Equivalent + +

    +
    +
    + +

    + Lost Image + + +

    + +

    + +

    +This example defines 4 bass notes +(probably staccato eight notes) at beats 1, 2, 3 and 4 in a +4/4 time bar. The first note is the root of the chord, the +second is the fifth; the third note is the third; the last note is the +root up an octave. The volumes of the notes are set to a MIDI velocity +of 90 for beats 1 and 3 and 80 for beats 2 and 4. + +

    + +MMA refers to note tables to determine the ``scale'' to use in a +bass pattern. Each recognized chord type has an associated scale. For +example, the chord ``Cm'' consists of the notes ``c'', ``e$\flat$'' +and ``g''; the scale for this chord is ``c, d, e$\flat$, f, g, a, b''. + +

    +Due to the ease in which specific notes of a scale can be specified, +BASS tracks and patterns are useful for much more than ``bass'' +lines! These tracks are useful for sustained string voices, interesting +arpeggio and scale lines, and counter melodies. + +

    + +

    +
    +Chord +

    + +

    +A Chord pattern is defined with: + +

    + + +
    + +
    Position Duration Volume1 Volume2 .. ; ...
    + +
    + +

    +Each group consists of an beat offset for the start point, the note +duration, and the volumes for each note in the chord. If you have +fewer volumes than notes in a chord, the last volume will apply to the +remaining notes. + +

    + +
    + +
    + Chord Definition +
    + + + +
    + +
    Chord Define Straight4+3 1 4 100 ; \ +
        2 4 90 ; \ +
        3 4 100 ; \ +
        4 3 90 ; \ +
        4.3 3 80 ; \ +
        4.6 3 80
    + +
    + +

    +
    +
    Sheet Music Equivalent + +

    +
    +
    + Lost Image + + +

    + +

    + +

    +This example defines a +4/4 pattern in a quarter, quarter, quarter, triplet rhythm. +The quarter notes sound on beats 1, 2 and 3; the triplet is played on +beat 4. The example assumes that you have C major for beats 1 and 2, +and G major for 3 and 4. + +

    +Using a volume of ``0'' will disable a note. So, you want only the +root and third of a chord to sound, you could use something like: + +

    + + +
    + +
    Chord Define Dups 1 8 90 0 90 0; 3 8 90 0 90 0
    + +
    + +

    + +

    +Arpeggio +

    + +

    +An Arpeggio pattern is defined with: + +

    + + +
    + +
    Position Duration Volume ; ...
    + +
    + +

    +The arpeggio tracks play notes from a chord one at a time. This is +quite different from chords where the notes are played all at +once--refer to the STRUM directive +(here). + +

    +Each group consists of an beat offset, the note duration, and the note +volume. You have no choice as to which notes of a chord are played +(however, they are played in alternating ascending/descending +order.4.8 Volumes are +selected for the specific beat, not for the actual note. + +

    + +
    + +
    + Arpeggio Definition +
    + + + +
    + +
    Arpeggio Define 4s 1 4 100; \ +
        2 4 90; \ +
        3 4 100; \ +
        4 4 100
    + +
    + +

    +
    +
    Sheet Music Equivalent
    +
    + Lost Image + + +

    + +

    + +

    +This example plays quarter note +on beats 1, 2, 3 and 4 of a bar in 4/4 time. + +

    + +

    +Walk +

    + +

    +A Walking Bass pattern is defined with: + +

    + + +
    + +
    Position Duration Volume ; ...
    + +
    + +

    +Walking bass tracks play up and down the first part of a scale, paying +attention to the ``color''4.9 of the +chord. Walking bass lines are very common in jazz and swing music. They +appear quite often as an ``emphasis'' bar in marches. + +

    +Each group consists of an beat offset, the note duration, and the note +volume. +MMA selects the actual note pitches to play based on the +current chord (you cannot change this). + +

    + +
    + +
    + Walking Bass Definition +
    + + + +
    + +
    Walk Define Walk4 1 4 100 ; \ +
        2 4 90; \ +
        3 4 90
    + +
    + +

    + + +

    + +

    + +

    +This example plays a bass note +on beats 1, 2 and 3 of a bar in 3/4 time. + +

    + +

    +Scale +

    + +

    +A scale pattern is defined with: + +

    + + +
    + +
    Position Duration Volume ; ...
    + +
    + +

    +Each group consists of an beat offset for the start point, the note +duration, and volume. + +

    + +
    + +
    + Scale Definition +
    + + + +
    + +
    Scale Define S1 1 1 90 +
    +Scale Define S4 S1 * 4 +
    +Scale Define S8 S1 * 8
    + +
    + + +
    + +

    + +

    +This example defines three scale +patterns: ``S1'' is just a single whole note, not that useful on its +own, but it is used as a base for ``S4'' and ``S8''. + +

    +``S4'' is 4 quarter notes and ``S8'' is 8 eight notes. All the volumes +are set to a MIDI velocity of 90. + +

    +Scale patterns are quite useful in endings. More options for scales +detailed in the SCALEDIRECTION +(here) and SCALETYPE +(here) sections. + +

    + +

    +
    +Drum +

    + +

    +Drum tracks are a bit different from the other tracks discussed so +far. Instead of having each track saved as a separate MIDI track, all +the drum tracks are combined onto MIDI track 10. + +

    +A Drum pattern is defined with: + +

    + + +
    + +
    Position Duration Volume; ...
    + +
    + +

    + +
    + +
    + Drum Definition +
    + + + +
    + +
    Drum Define S2 1 0 100; \ +
        2 0 80 ; \ +
        3 0 100 ; \ +
        4 0 80
    + +
    + + +
    + +

    + +

    +This example plays a drum sound on +beats 1, 2, 3 and 4 of a bar in 4/4 time. The MIDI velocity +(volume) of the drum is 100 on beats 1 and 3; 80 on beats 2 and 4. + +

    +This example uses the special duration of ``0'', which +indicates 1 MIDI tick. + +

    + +

    +
    +Drum Tone +

    + +

    +Essential to drum definitions is the TONE directive. + +

    +When a drum pattern is defined it uses the default ``note'' or +``tone'' which is a snare drum sound. But, this can (and should) be +changed using the TONE directive. This is normally issued at +the same time as a sequence is set up (see +sequences). + +

    +TONE is a list of drum sounds which match the sequence length. +Here's a short, concocted example (see the library files for many +more): + +

    + + +
    + +
    Drum Define S1 1 0 90 +
    +Drum Define S2 S1 * 2 +
    +Drum Define S4 S1 * 4 +
    +SeqClear +
    +SeqSize 4 +
    +Drum Sequence S4 S2 S2 S4 +
    +Drum Tone SnareDrum1 SideKick LowTom1 Slap
    + +
    + +

    +Here the drum patterns ``S2'' and ``S4'' are defined to sound a drum +on beats 1 and 3, and 1, 2, 3 and 4 respectively (see +DefMult for details on the ``*'' +option). Next, a sequence size of 4 bars and a drum sequence are set +to use this pattern. Finally, +MMA is instructed to use a SnareDrum1 +sound in bar 1, a SideKick sound in bar 2, a LowTom1 in bar 3 and a +Slap in bar 4. If the song has more than four bars, this sequence will +be repeated. + +

    +In most cases you will probably use a single drum tone name for the +entire sequence, but it can be useful to alternate the tone between +bars. + +

    +To repeat the same ``tone'' in a sequence list, use a single ``/''. + +

    +The ``tone'' can be specified with a MIDI note value or with a +symbolic name. For example, a snare drum could be specified as ``38'' +or ``SnareDrum1''. The Drumnames + appendix lists all the defined symbolic +names. + +

    +It is possible to substitute tone values. See +TONETR. + +

    + +

    +Including Existing Patterns in New Definitions +

    + +

    +When defining a pattern, you can use an existing pattern name in place +of a definition grouping. For example, if you have already defined a +chord pattern (which is played on beats 1 and 3) as: + +

    + + +
    + +
    Chord Define M13 1 4 80; 3 4 80
    + +
    + +

    +you can create a new pattern which plays on same beats and adds a +single push note just before the third beat: + +

    + + +
    + +
    Chord Define M1+3 M13; 2.5 16 80 0
    + +
    + +

    +A few points to note: + +

    + +

      +
    • the existing pattern must exist and belong to the same track, + +

      +

    • +
    • the existing pattern is expanded in place, + +

      +

    • +
    • it is perfectly acceptable to have several existing definitions, + just be sure to delimit each with a ``;'', + +

      +

    • +
    • the order of items in a definition does not matter, each will be + placed at the correct position in the bar. + +

      +

    • +
    + +

    +This is a powerful shortcut in creating patterns. See the included +library files for examples. + +

    + +

    +
    +Multiplying and Shifting Patterns +

    + +

    +Since most pattern definitions are, internally, repetitious, you can +create complex rhythms by multiplying a copy of an existing pattern. +For example, if you have defined a pattern to play a chord on beats 1 +though 4 (a quarter note strum), you can easily create a similar +pattern to play eighth note chords on beats 1, 1.5, etc. though 4.5 +with a command like: + +

    + + +
    + +
    Track Define NewPattern OldPattern * N
    + +
    + +

    +where ``Track'' is a valid track name (``Chord'', ``Walk'', ``Bass'', +``Arpeggio'' or ``Drum'', as well as ``Chord2'' or ``DRUM3'', etc.). + +

    +The ``*'' is absolutely required. + +

    +``N'' can be any integer value between 2 and 100. + +

    + +
    + +
    + Multiply Define +
    + + +
    + +
    Drum Define S1 1 1 100 +
    +Drum Define S13 S1 * 2 +
    +Drum Define S1234 S1 * 4 +
    +Drum Define S8 S1234 * 2 +
    +Drum Define S16 S8 * 2 +
    +Drum Define S32 S16 * 2 +
    +Drum Define S64 S1 * 64
    + +
    + + +
    + +

    + +

    +In this example a Drum pattern +is defined which plays a drum tone on beat 1 (assuming +4/4 time). Then a new pattern, ``S13'', is created. This is +the old ``S1'' multiplied by 2. This new pattern will play a tone on +beats 1 and 3. + +

    +Next, ``S1234'' is created. This plays 4 notes, one the each beat. + +

    +Note the definition for ``S64'': ``S32'' could have been multiplied by +2, but, for illustrative purposes, ``S1'' has been multiplied by +64--same result either way. + +

    +When +MMA multiplies an existing pattern it will (usually) do what +you expect. The start positions for all notes are adjusted to the new +positions; the length of all the notes are adjusted (quarter notes +become eighth notes, etc.). No changes are made to note offsets or +volumes. + +

    +This example shows how to get a +swing pattern which might be useful on a snare drum. + +

    + +
    + +
    + Swing Beat Drum Definition +
    + + + +
    + +
    Begin Drum Define +
        SB8 1 2+16 0 90 ; 3.66 4+32 80 +
        SB8 SB8 * 4 +
    +End
    + +
    + +

    +
    +
    Sheet Music Equivalent, Normal Notation + +

    +
    +
    + Lost Image + +

    +
    +
    Sheet Music Equivalent, Actual Rhythm + +

    + Lost Image + + +

    + +

    + +

    +To see the effects of multiplying patterns, create a simple test file +and process it though +MMA with the ``-p'' option. + +

    +Even cooler4.10 is combining a multiplier, and +existing pattern and a new pattern all in one statement. The following +is quite legal (and useful): + +

    + + +
    + +
    Drum Define D1234 1 0 90 * 4
    + +
    + +

    +which creates drum hits on beats 1, 2, 3 and 4. + +

    +More contrived (but examples are needed) is: + +

    + + +
    + +
    Drum Define Dfunny D1234 * 2; 1.5 0 70 * 2
    + +
    + +

    +If you're really interested in the result, run +MMA with the ``-p'' +option with the above definition. + +

    + +

    +An existing pattern can be modified by shifting it a beat, or +portion of a beat. This is done in a +MMA definition with the +SHIFT directive. This + example shows a triplet pattern created to +play on beat 1, and then a second pattern played on beat 3. + +

    + +
    + +
    + Shift Pattern Definition +
    + + + +
    + +
    Chord Define C1-3 1 3 90; \ +
        1.33 3 90; 1.66 3 90
    + +
    +
    +
    + +

    + Lost Image + +

    +
    +
    + +

    + + +
    + +
    Chord Define C3-3 C1-3 Shift 2
    + +
    + +

    + Lost Image + + +

    + +

    + +

    +Note that the shift factor can be a negative or positive value. It can +be fractional. Just be sure that the factor doesn't force the note +placement to be less than 1 or greater than the TIME setting. + +

    +And, just like the multiplier discussed earlier you can shift patterns +as they are defined. And shifts and multipliers can be combined. So, +to define a series of quarter notes on the offbeat you could use: + +

    + + +
    + +
    Drum Define D1234' 1 0 90 * 4 Shift .5
    + +
    + +

    +which would create the same pattern as the longer: + +

    + + +
    + +
    Drum Define D1234' 1.5 1 90; 2.5 1 90; 3.5 1 90; 4.5 1 90
    + +
    + +

    + +

    +


    Footnotes

    +
    +
    ... warning!).4.1
    +
    The exception is that RTIME may move the + chord back into the bar. + +
    +
    ... fine:4.2
    +
    The start offset is the value of the first of a pair + of swing eights plus a quarter before the second beat. + +
    +
    ... tones.4.3
    +
    See the supplied + GROOVE ``Bluegrass'' for an example. + +
    +
    ... velocity4.4
    +
    MIDI ``note on'' events are + declared with a ``velocity'' value. Think of this as the + ``striking pressure'' on a piano. + +
    +
    ... validity.4.5
    +
    This is a feature that you probably don't want to + use, but if you want to ensure that a note is always sounded use a + very large value (e.g., 1000) for the volume. That way, future + adjustments will maintain a large value and this large value will + be clipped to the maximum permitted MIDI velocity. + +
    +
    ... outcomes.4.6
    +
    What really happens is that + this definition is stored in a slot named ``DRUM''. + +
    +
    ... +semitone.4.7
    +
    Be careful using this feature ...certain + scales/chords may return non-musical results. + +
    +
    ... +order.4.8
    +
    See the DIRECTION command + (here). + +
    +
    ... ``color''4.9
    +
    The color of a chord are items + like ``minor'', ``major'', etc. The current walking bass algorithm + generates acceptable (uninspired) lines. If you want something + better there is nothing stopping you from using a RIFF to + over-ride the computer generated pattern for important bars. + +
    +
    ... cooler4.10
    +
    In this case the word ``cool'' substitutes for + the more correct ``useful''. + +
    +

    + + +next + +up + +previous +
    + Next: Sequences + Up: Reference Manual + Previous: Tracks and Channels + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node5.html b/mma/docs/html/ref/node5.html new file mode 100644 index 0000000..bbd0ef3 --- /dev/null +++ b/mma/docs/html/ref/node5.html @@ -0,0 +1,875 @@ + + + + + +Sequences + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Grooves + Up: Reference Manual + Previous: Patterns +
    +
    + + +Subsections + + + +
    + +

    +
    +Sequences +

    + +

    +Patterns by themselves don't do much good. They have to be combined into +sequences to be of any use to you or to +MMA . + +

    + +

    +Defining Sequences +

    + +

    +A SEQUENCE command sets the pattern(s) used in creating +each track in your song: + +

    + + +
    + +
    Track Sequence Pattern1 Pattern2 ...
    + +
    + +

    +``Track'' can be any valid track name: ``Chord'', ``Walk'', +``Walk-Sus'', ``Arpeggio-88'', etc. + +

    +All pattern names used when setting a sequence need to be defined when +this command is issued; or you can use what appears to be a pattern +definition right in the sequence command by enclosing the pattern +definition in a set of curly brackets ``{ }''. + +

    + +
    + +
    + Simple Sequence +
    + + + +
    + +
    SeqClear +
    +SeqSize 2 +
    +Begin Drum +
        Sequence Snare4 +
        Tone Snaredrum1 +
    +End +
    +Begin Drum-1 +
        Sequence Bass1 Bass2 +
        Tone KickDrum2 +
    +End +
    +Chord Sequence Broken8 +
    +Bass Sequence Broken8 +
    +Arpeggio Sequence { 1 1 100 * 8 } { 1 1 80 * 4 }
    + +
    + + +
    + +

    + +

    +This example creates a 2 bar +pattern. The Drum, Chord and Bass patterns repeat on every bar; the +Drum-1 sequence repeats after 2 bars. Note how the Arpeggio pattern is +defined at run-time.5.1 +

    +If there are fewer patterns than SEQSIZE, the sequence will be +filled out to correct size. If the number of patterns used is greater +than SEQSIZE (see +directives) a warning +message will be printed and the pattern list will be truncated. + +

    +When defining longer sequences, you can use the ``repeat'' symbol, a +single ``/'', to save typing. For example, the following two lines are +equivalent: + +

    + + +
    + +
    Bass Sequence Bass1 Bass1 Bass2 Bass2 +
    +Bass Sequence Bass1 / Bass2 /
    + +
    + +

    + +

    +The special pattern name ``-'' (no quotes, just a single hyphen), or a +single ``z'' can be used to turn a track off. For example, if you have +set the sequences in this example +and decide to delete the Bass halfway though the song you could: + +

    + + +
    + +
    Bass Sequence -
    + +
    + +

    +The special sequences, ``-'' or ``z'', are also the equivalent of a +rest or ``tacet'' sequence. For example, in defining a 4 bar sequence +with a 1-5 bass pattern on the first 3 bars and a walking bass on bar +4 you might do something like: + +

    + + +
    + +
    Bass Sequence Bass4-13 / / z +
    +Walk Sequence z / / Walk4-4
    + +
    + +

    +If you already have a sequence defined5.2 you can repeat or copy the existing pattern by +using a single ``*'' as the pattern name. This is useful when you are +modifying an exisiting sequence. + +

    +For example, assume that we have created a four bar GROOVE +called ``Neato''. Now, we want to change the CHORD pattern to +use for an introduction ... but, we really only want to change the +fourth bar in the pattern: + +

    + + +
    + +
    Groove Neato +
    +Chord Sequence * * * {1 2 90} +
    +Defgroove NeatoIntro
    + +
    + +

    +When a sequence is created a series of pointers to the existing +patterns are created. If you change the definition of a particular +pattern later in your file the new definition will have no +effect on your existing sequences. + +

    +Sequences are the workhorse of +MMA . With them you can set up many +interesting patterns and variations. This chapter should certainly +give more detail and many more examples. + +

    +The following commands help manipulate sequences in your creations: + +

    + +

    +
    +SeqClear +

    + +

    +This command clears all existing sequences from memory. It is useful +when defining a new sequence and you want to be sure that no +``leftover'' sequences are active. The command: + +

    + + +
    + +
    SeqClear
    + +
    + +

    +deletes all sequence information, with the important exception that +SOLO tracks are ignored. + +

    +Alternately, the command: + +

    + + +
    + +
    Drum SeqClear
    + +
    + +

    +deletes all drum sequences. This includes the track ``Drum'', +``Drum1'', etc. + +

    +If you use a sub-track: + +

    + + +
    + +
    Chord-Piano SeqClear
    + +
    + +

    +only the sequence for that track is cleared.5.3 +

    +In addition to clearing the sequence pattern, the following other +settings are restored to a default condition: + +

    + +

      +
    • Track Invert setting, + +

      +

    • +
    • Track Sequence Rnd setting, + +

      +

    • +
    • Track MidiSeq setting, + +

      +

    • +
    • Track octave, + +

      +

    • +
    • Track voice, + +

      +

    • +
    • Track Rvolume, + +

      +

    • +
    • Track Volume, + +

      +

    • +
    • Track RTime, + +

      +

    • +
    • Track Strum. + +

      +

    • +
    + +

    +CAUTION: It is not possible to clear only a track like DRUM or +CHORD using this command. The command + +

    + + +
    + +
    Chord SeqClear
    + +
    + +

    +resets all CHORD tracks, whereas the command: + +

    + + +
    + +
    Chord-Foo SeqClear
    + +
    + +

    +resets the CHORD-FOO track. If you need to clear only +the CHORD track use the ``-'' option. + +

    + +

    +SeqRnd +

    + +

    +Normally, the patterns used for each bar are selected in order. For +example, if you had a sequence: + +

    + + +
    + +
    Drum-2 Sequence P1 P2 P3 z
    + +
    + +

    +bar 1 would use ``P1'', bar 2 ``P2'', etc. However, it is quite +possible (and fun and useful) to insert a randomness to the order of +sequences. +MMA can achieve this in three different ways: + +

    + +

      +
    1. Separately for each track: + +

      + + +
      + +
      Drum-Snare SeqRnd On
      + +
      + +

      +

    2. +
    3. Globally for all tracks: + +

      + + +
      + +
      SeqRnd On
      + +
      + +

      +

    4. +
    5. For a selected set of tracks (keeping the tracks synchronized): + +

      + + +
      + +
      SeqRnd Drum-Snare Chord-2 Chord-3
      + +
      + +

      +

    6. +
    + +

    +To disable random sequencing: + +

    + + +
    + +
    SeqRnd Off +
    +Drum SeqRnd Off
    + +
    + +

    +To illustrate the different effects you can generate, assume that you +have a total of four tracks defined: Drum-Snare, Drum-Low, Chord and +Bass; your sequence size is 4 bars; and you have created some type of +sequence for each track with a commands similar to: + +

    + + +
    + +
    Drum-Snare Sequence D1 D2 D3 D4 +
    +Drum-Low Sequence D11 D22 D33 D44 +
    +Chord Sequence C1 C2 C3 C4 +
    +Bass Sequence B1 B2 B3 B4
    + +
    + +

    +With no sequence randomization at all, the tracks will be be processed +as: + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Track \ Bar12345
          
    Drum-SnareD1D2D3D4D1
    Drum-LowD11D22D33D44D11
    ChordC1C2C3C4C1
    BassB1B2B3B4B1
    +
    + +

    +Next, assume we have set sequence randomization with: + +

    + + +
    + +
    SeqRnd On
    + +
    + +

    +Now, the sequence may look like: + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Track \ Bar12345
          
    Drum-SnareD3D1D1D2D4
    Drum-LowD33D11D11D22D44
    ChordC3C1C1C2C4
    BassB3B1B1B2B4
    +
    + +

    +Note that the randomization keeps the different sequences together: +Drum sequences D3 and D33 are always played with Chord sequence C3, +etc. + +

    +Next, we will set randomization for a Drum and Chord track only: + +

    + + +
    + +
    Drum-Low SeqRnd On +
    +Chord SeqRnd On
    + +
    + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Track \ Bar12345
          
    Drum-SnareD1D2D3D4D1
    Drum-LowD22D11D44D44D33
    ChordC3C4C2C1C1
    BassB1B2B3B4B1
    +
    + +

    +In this case there is no relationship between any of the randomized +tracks. + +

    +Finally, it is possible to set a ``global'' randomization for a +selected set of tracks. In this case we will set the Drum tracks only: + +

    + + +
    + +
    SeqRnd Drum-Snare Drum-Low
    + +
    + +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Track \ Bar12345
          
    Drum-SnareD3D1D4D4D2
    Drum-LowD33D11D44D44D22
    ChordC1C2C3C4C1
    BassB1B2B3B4B1
    +
    + +

    +Note that the drum sequences always ``line up'' with each other and +the Chord and Bass sequences follow in the normal order. + +

    +The SEQCLEAR command will disable all sequence +randomization. The SEQ command will disable ``global'' (for all +tracks) randomization. + +

    + +

    +SeqRndWeight +

    + +

    +When SEQRND is enabled each sequence for the track (or globally) has an equal chance +of being selected. There are times when you may want to change this behaviour. For example, +you might have a sequence like this: + +

    + + +
    + +
    Chord Sequence C1 C2 C3 C4
    + +
    + +

    +and you feel that the patterns C1 and C2 need to be used twice as often as C3 and C4. +Simple: + +

    + + +
    + +
    Chord SeqRndWeight 2 2 1 1
    + +
    + +

    +Think of the random selection occurring like selecting balls out of bag. The SEQRNDWEIGHT +command ``fills up the bag.'' In the above case, there will be two C1 and C2 balls, one C3 and C4 ball-- +for a total of six balls. + +

    +This command can be used in both a track and global context. + +

    +The effects are saved in GROOVES. + +

    +SEQCLEAR will reset both global and track contexts to the default (equal) condition. + +

    + +

    +SeqSize +

    + +

    +The number of bars in a sequence are set with the ``SeqSize'' command. +For example: + +

    + + +
    + +
    SeqSize 4
    + +
    + +

    +sets it to 4 bars. The SeqSize applies to all tracks. + +

    +This command resets the sequence counter to 1. + +

    +If some sequences have already been defined, they will be truncated or +expanded to the new size. Truncation is done by removing patterns from +the end of the sequence; expansion is done by duplicating the sequence +until it is long enough. + +

    +


    Footnotes

    +
    +
    ... run-time.5.1
    +
    If you run +MMA with the ``-s'' option + you'll see pattern names in the format ``_1''. The leading + underscore indicates that the pattern was dynamically created in the + sequence. + +
    +
    ... defined5.2
    +
    In reality there is + always a sequence defined for every track, but it might be a series + of ``rest'' bars. + +
    +
    ... cleared.5.3
    +
    It is probably + easier to use the command: + +
    + +
    Chord-Piano Sequence -
    + +
    + if that is + what you want to do. In this case only sequence pattern is + cleared. + +
    +

    + + +next + +up + +previous +
    + Next: Grooves + Up: Reference Manual + Previous: Patterns + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node6.html b/mma/docs/html/ref/node6.html new file mode 100644 index 0000000..290928a --- /dev/null +++ b/mma/docs/html/ref/node6.html @@ -0,0 +1,573 @@ + + + + + +Grooves + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Riffs + Up: Reference Manual + Previous: Sequences +
    +
    + + +Subsections + + + +
    + +

    + +
    +Grooves +

    + +

    +Grooves, in some ways, are +MMA 's answer to macros...but +they are cooler, easier to use, and have a more musical name. + +

    +Really, though, a groove is just a simple mechanism for saving and +restoring a set of patterns and sequences. Using grooves it is easy to +create sequence libraries which can be incorporated into your songs +with a single command. + +

    + +

    +Creating A Groove +

    + +

    +A groove can be created at anytime in an input file with the command: + +

    + + +
    + +
    DefGroove SlowRhumba
    + +
    + +

    +Optionally, you can include a documentation string to the end of this +command: + +

    + + +
    + +
    DefGroove SlowRumba A descriptive comment!
    + +
    + +

    +A groove name can include any character, including digits and +punctuation. However, it cannot include a space character (used as a +delimiter) or a '/'6.1, nor can consist solely of digits6.2 +

    +In normal operation the documentation strings are ignored. However, +when +MMA is run with the -Dx command line option these strings are +printed to the terminal screen in LATEX format. The standard library +document is generated from this data. The comments must be +suitable for LATEX: this means that special symbols like ``#'', +``&'', etc. must be ``quoted'' with a preceding `` \''. + +

    +At this point the following information is saved: + +

    + +

      +
    • Current Sequence size, +
    • +
    • The current sequence for each track, +
    • +
    • Time setting (quarter notes per bar), +
    • +
    • ``Accent'', +
    • +
    • ``Articulation'' settings for each track, +
    • +
    • ``Compress'', +
    • +
    • ``Direction'', +
    • +
    • ``DupRoot'', +
    • +
    • ``Harmony'', +
    • +
    • ``HarmonyOnly'', +
    • +
    • ``HarmonyVolume'', +
    • +
    • ``Invert'', +
    • +
    • ``Limit'', +
    • +
    • ``Mallet'' (rate and decay), +
    • +
    • ``MidiSeq'', +
    • +
    • ``MidiVoice'', +
    • +
    • ``MidiClear'' +
    • +
    • ``NoteSpan'', +
    • +
    • ``Octave'', +
    • +
    • ``Range'', +
    • +
    • ``RSkip'', +
    • +
    • ``Rtime'', +
    • +
    • ``Rvolume'', +
    • +
    • ``Scale'', +
    • +
    • ``SeqRnd'', globally and for each track, +
    • +
    • ``SeqRndWeight'', globally and for each track, +
    • +
    • ``Strum'', +
    • +
    • ``SwingMode'' Status and Skew, +
    • +
    • ``Time Signature'', +
    • +
    • ``Tone'' for drum tracks, +
    • +
    • ``Unify'', +
    • +
    • ``Voice'', +
    • +
    • ``VoicingCenter'', +
    • +
    • ``VoicingMode'', +
    • +
    • ``VoicingMove'', +
    • +
    • ``VoicingRange'', +
    • +
    • ``Volume'' for tracks and master, +
    • +
    • ``VolumeRatio''. + +

      +

    • +
    + +

    + +

    +Using A Groove +

    + +

    +You can restore a previously defined groove at anytime in your song +with: + +

    + + +
    + +
    Groove Name
    + +
    + +

    +At this point all of the previously saved information is restored. + +

    +A few cautions: + +

    + +

      +
    • Pattern definitions are not saved in grooves. Redefining + a pattern results in a new pattern definition. Sequences use the + pattern definition in effect when the sequence is declared. + +

      +

    • +
    • The ``SeqSize'' setting is restored with a groove. The sequence + point is also reset to bar 1. If you have multi-bar sequences, + restoring a groove may upset your idea of the sequence pattern. + +

      +

    • +
    + +

    +To make life (infinitely) more interesting, you can specify more than +one previously defined groove. In this case the next groove is +selected after each bar. For example: + +

    + + +
    + +
    Groove Tango LightTango LightTangoSus LightTango
    + +
    + +

    +would create the following bars: + +

    + +

      +
    1. Tango +
    2. +
    3. LightTango +
    4. +
    5. LightTangoSus +
    6. +
    7. LightTango +
    8. +
    9. Tango +
    10. +
    + +

    +Note how the groove pattern wraps around to the first one when the +list is exhausted. There is no way to select an item from the list, +except by going though it. + +

    +You might find this handy if you have a piece with an alternating time +signature. For example, you might have a 3/4 4/4 +song. Rather than creating a 2 bar groove, you could do something +like: + +

    + + +
    + +
    Groove Groove34 Groove44
    + +
    + +

    +For long lists you can use the ``/'' to repeat the last groove in the +list. The example above could be written: + +

    + + +
    + +
    Groove Tango LightTango LightTangoSus /
    + +
    + +

    +When you use the ``list'' feature of GROOVEs you should be +aware of what happens with the bar sequence number. Normally the +sequence number is incremented after each bar is processed; and, when +a new groove is selected the sequence number is reset (see SEQ, +discussed here). When +you use a list which changes the GROOVE after each bar the +sequence number is reset after each bar ...with one exeption: if +the same GROOVE is being used for two or more bars the sequence +will not be reset.6.3 +

    +Another way to select GROOVEs is to use a list of grooves with a leading value. This lets you select the GROOVE to use based on the value of a variable ...handy if you want different sounds for repeated sections. Again, an example: + +

    + + +
    + +
    Set loop 1 // create counter with value of 1 +
    +Repeat +
      Groove $loop BossaNovaSus BossaNova1Sus BossaNovaFill +
      print This is loop $Loop ... Groove is $_Groove +
      1 A / Am +
      Inc Loop // Bump the counter value +
    +RepeatEnd 4 +
    + +
    + +

    +If you use this option, make sure the value of the counter is greater than 0. Also, note that the values larger than the list count are ``looped'' to be valid. The use of ``/''s for repeated names is also permitted. For an example have a look at the file grooves.mma, included in this distribution. You could get the same results with various ``if'' statements, but this is easier. + +

    + +

    +Overlay Grooves +

    + +

    +To make the creation of variations easier, you can use GROOVE +in a track setting: + +

    + + +
    + +
    Scale Groove Funny
    + +
    + +

    +In this case only the information saved in the corresponding +DEFGROOVE FUNNY for the SCALE track will be restored. +You might think of this as a ``groove overlay''. Have a look at the +sample song ``Yellow Bird'' for an example. + +

    +When restoring track grooves, as in the above example, the +SEQSIZE is not reset. The sequence size of the restored track +is adjusted to fit the current sequence size setting. + +

    +One caution with these ``overlays'' is that no check is done to see if +the track you're using exists. Yes, the GROOVE must have been +defined, but not the track. Huh? Well, you need to know a bit about +how +MMA parses files and how it handles new tracks. When +MMA reads +a line in a file it first checks to see if the first word on the line +is a simple command like PRINT, MIDI or any other +command which doesn't require a leading trackname. If it is, the +appropriate function is called and file parsing continues. If it is +not a simple command +MMA tests to see if it is a track specific +command. But to do that, it first has to test the first word to see if +it is a valid track name like Bass or Chord-Major. And, +if it is a valid track name and that track doesn't exist, the track is +created...this is done before the rest of the command is +processed. So, if you have a command like: + +

    + + +
    + +
    Bass-Foo Groove Something
    + +
    + +

    +and you really meant to type: + +

    + + +
    + +
    Bass-Foe Groove Something
    + +
    + +

    +you'll have a number of things happening: + +

    + +

      +
    1. The track Bass-Foo will be created. This is not an issue + to be concerned over since no data will be created for this new + track unless you set a SEQUENCE for it. + +

      +

    2. +
    3. As part of the creation, all the existing GROOVEs will + have the Bass-Foo track (with its default/empty settings) + added to them. + +

      +

    4. +
    5. And the current setting you think you're modifying with the + Bass-Foe settings will be created with the Bass-Foo + settings (which are nothing). + +

      +

    6. +
    7. Eventually you'll wonder why +MMA isn't working. + +

      +

    8. +
    + +

    +So, be very careful using this command option. Check your spelling. +And use the PRINTACTIVE command to verify your GROOVE +creations. A basic test is done by +MMA when you use a GROOVE +in this manner and if the sequence for the named track is not defined +you will get a warning. + +

    + +

    +Library Issues +

    + +

    +If you are using a groove from a library file, you just need to do +something like: + +

    + + +
    + +
    Groove Rhumba2
    + +
    + +

    +at the appropriate position in your input file. + +

    +One minor problem which may arise is that more than one library +file has defined the same groove name. This might happen if you have a +third-party library file. For the proposes of this example, lets +assume that the standard library file ``rhumba.mma'' and a second file +``xyz-rhumba.mma'' both define the groove ``Rhumba2''. The +auto-load routines +which search the library database will load the first ``Rhumba2'' it +finds, and the search order cannot be determined. To overcome this +possible problem, do a explicit loading of the correct file. In this +case, simply do: + +

    + + +
    + +
    Use xyz-rhumba
    + +
    + +

    +near the top of your file. And if you wish to switch to the groove +defined in the standard file, you can always do: + +

    + + +
    + +
    Use rhumba
    + +
    + +

    +just before the groove call. The USE will read the specified +file and overwrite the old definition of ``Rhumba2'' with its own. + +

    +This issue in covered in more detail on page [*] +of this manual. +


    Footnotes

    +
    +
    ... '/'6.1
    +
    The '/' is reserved for future + enhancements. + +
    +
    ... digits6.2
    +
    12345 and 2 are invalid; 11foo11 and a2-2 are permitted. + +
    +
    ... reset.6.3
    +
    Actually, +MMA checks to see the next + GROOVE in the list is the same as the current one, and if it + is then no change is done. + +
    +

    + + +next + +up + +previous +
    + Next: Riffs + Up: Reference Manual + Previous: Sequences + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node7.html b/mma/docs/html/ref/node7.html new file mode 100644 index 0000000..fa3edd7 --- /dev/null +++ b/mma/docs/html/ref/node7.html @@ -0,0 +1,335 @@ + + + + + +Riffs + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Musical Data Format + Up: Reference Manual + Previous: Grooves +
    +
    + + +

    +
    +Riffs +

    + +

    +In previous chapters you were shown how to create a PATTERN +which becomes a part of a SEQUENCE. And how to set a musical +style by defining a GROOVE. + +

    +These predefined GROOVEs are wonderful things. And, yes, entire +accompaniment tracks can be created with just some chords and a single +GROOVE. But, often a bit of variety in the track is needed. + +

    +The RIFF command permits the setting of an alternate pattern +for any track for a single bar-this overrides the current +SEQUENCE for that track. + +

    +The syntax for RIFF is very similar to that of DEFINE, +with the exception that no pattern name is used. You might think of +RIFF as the setting of an SEQUENCE with an anonymous +pattern. + +

    +A RIFF is set with the command: + +

    + + +
    + +
    Track Riff Pattern
    + +
    + +

    +where: + +

    +

    +
    Track
    +
    is any valid +MMA track name, + +

    +

    +
    Pattern
    +
    is any existing pattern name defined for the specified + track, or a pattern definition following the same syntax as a + DEFINE. In addition the pattern can be a single ``z'', + indicating no pattern for the specified track. + +

    +

    +
    + +

    +Following is a short example using RIFF to change the Chord Pattern: + +

    + + +
    + +
    Groove Rhumba +
    +1 Fm7 +
    +2 Bb7 +
    +3 EbM7 +
    +Chord Riff 1 4 100; 3 8 90; 3.666 8 80; 4.333 8 70 +
    +4 Eb6 / Eb +
    +5 Fm7
    + +
    + +

    +In this case there is a Rhumba Groove for the song; however, in bar 4 +the melodic pattern is emphasized by chording a quarter-note triplet +over beats 3 and 4. In this case the pattern has been defined right in +the RIFF command. + +

    +The next example shows that RIFF patterns can be defined just +like the patterns used in a sequence. + +

    + + +
    + +
    Drum Define Emph8 1 0 128 * 8 +
    +Groove Blues +
    +1 C +
    +2 G +
    +Drum-Clap Riff Emph8 +
    +3 G +
    +4 F +
    +Drum-Clap Riff Emph8 +
    +5 C
    + +
    + +

    +Here the Emph8 pattern is defined as a series of eighth notes. +This is applied for the third and fifth bars. If you compile and play this example +you will hear a sporadic hand-clap on bar 3. The Drum-Clap +track was previously defined in the Blues GROOVE as random +claps on beats 2 and 4--our RIFF changes this to a louder +volume with multiple hits. + +

    +The special pattern ``z'' can be used to turn off a track for a single +bar. This is similar to using a ``z'' in the SEQUENCE +directive. + +

    +A few things to keep in mind when using RIFFs: + +

    + +

      +
    • Each RIFF is in effect for only one bar (see the + discussion below about multiple RIFFs. + +

      +

    • +
    • RIFF sequences are always enabled. Even if there is no + sequence for a track, or if the ``z'' sequence is being used, the + pattern specified in RIFF will apply. + +

      +

    • +
    • The existing voicing, articulation, etc. for the track will + apply to the RIFF. + +

      +

    • +
    • It's quite possible to use a macro for repeated RIFFs. + The following example uses a macro which + sets the VOLUME, ARTICULATE, etc. as well as the + pattern. Note how the pattern is initially set as single whole note, + but, redefined in the RIFF as a run controlled by another + macro. In bar 2 an eight note run is played and in bar 5 this is + changed to a run of triplets. + +

      + + +
      + +
      Mset CRiff +
        Begin Scale +
          Define Run 1 1 120 +
          Riff Run * $SSpeed +
          Voice AltoSax +
          Volume f +
          Articulate 80 +
          Rskip 5 +
        End +
      +MsetEnd +
      +Groove Blues +
      +1 C +
      +Set SSpeed 8 +
      $CRiff +
      +2 G +
      +3 G +
      +Set SSpeed 12 +
      $CRIFF +
      +5 C
      + +
      + +

      +

    • +
    • A RIFF can only be deleted by using it (i.e., a music bar + follows the setting), with a SEQCLEAR or by a track DELETE. + +

      +

    • +
    + +

    +RIFFs can also be used to specify a bar of music in a +SOLO or MELODY track. Please see Solo and + Melody. + +

    +The above examples show how to apply a temporary pattern to a single +bar--the bar which follows the RIFF command. But, you can +``stack''7.1 a number of patterns to be processed sequentially. Each +successive RIFF command adds a pattern to the stack; these +patterns are then ``pulled'' from the stack as successive chord lines +are processed. + +

    +Recycling an earlier example, lets assume that you want to use a +customized pattern for bars 4 and 5 in a mythical song: + +

    + + +
    + +
    Groove Rhumba +
    +1 Fm7 +
    +2 Bb7 +
    +3 EbM7 +
    +Chord Riff 1 4 100; 3 8 90; 3.666 8 80; 4.333 8 70 +
    +Chord Riff 1 2 100; 3 8 90; +
    +4 Eb6 / Eb +
    +5 Fm7
    + +
    + +

    +In this example the first Chord Riff will be used in bar 4; the +second in bar 5. For an example of this see the sample file +egs/riffs.mma. + +

    +I often use this feature when creating a SOLO line. +


    Footnotes

    +
    +
    ... +``stack''7.1
    +
    Actually a queue or FIFO (First In, First Out) +buffer. + +
    +

    + + +next + +up + +previous +
    + Next: Musical Data Format + Up: Reference Manual + Previous: Grooves + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node8.html b/mma/docs/html/ref/node8.html new file mode 100644 index 0000000..88aa72c --- /dev/null +++ b/mma/docs/html/ref/node8.html @@ -0,0 +1,475 @@ + + + + + +Musical Data Format + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Lyrics + Up: Reference Manual + Previous: Riffs +
    +
    + + +Subsections + + + +
    + +

    + +
    +Musical Data Format +

    + +

    +Compared to patterns, sequences, grooves and the various directives used in +MMA , +the actual bar by bar chord notations are surprisingly simple. + +

    +Any line in your input file which is not a directive or comment is assumed to +be a bar of chord data. + +

    +A line for chord data consists of the following parts: + +

    + +

      +
    • Optional line number, + +

      +

    • +
    • Chord or Rest data, + +

      +

    • +
    • Optional lyric data, + +

      +

    • +
    • Optional solo or melody data, + +

      +

    • +
    • Optional multiplier. + +

      +

    • +
    + +

    +Formally, this becomes: + +

    + + +
    + +
    [num] Chord [Chord ...] [lyric] [solo] [* Factor]
    + +
    + +

    +As you can see, all that is really needed is a single chord. So, the line: + +

    + + +
    + +
    Cm
    + +
    + +

    +is completely valid. As is: + +

    + + +
    + +
    10 Cm Dm Em Fm * 4
    + +
    + +

    +The optional solo or melody data is enclosed in ``{ }''. The +complete format and use is detailed in the Solo and + Melody Tracks. + +

    + +

    +Bar Numbers +

    + +

    +The optional leading bar number is silently discarded by +MMA . It is +really just a specialized comment which helps you debug your music. +Note that only a numeric item is permitted here. + +

    +Get in the habit of using bar numbers. You'll thank yourself when a +song seems to be missing a bar, or appears to have an extra one. +Without the leading bar numbers it can be quite frustrating to match +your input file to a piece of sheet music. + +

    +You should note that it is perfectly acceptable to have only a bar +number on a line. This is common when you are using bar repeat, for +example: + +

    + + +
    + +
    1 Cm * 4 +
    +2 +
    +3 +
    +4 +
    +5 A
    + +
    + +

    +In the above example bars 2, 3 and 4 are comment bars. + +

    + +

    +Bar Repeat +

    + +

    +Quite often music has several sequential identical bars. Instead of +typing these bars over and over again, +MMA has an optional +multiplier which can be placed at the end of a line of music +data. The multiplier or factor can is specified as ``* NN'' This will +cause the current bar to repeated the specified number of times. For +example: + +

    + + +
    + +
    Cm / Dm / * 4
    + +
    + +

    +produces 4 bars of output with each the first 2 beats of each bar a Cm +chord and the last 2 a Dm. (The ``/'' is explained below.) + +

    + +

    +Chords +

    + +

    +The most important part of a musical data line is, of course, the +chords. You can specify a different chord for each beat in your music. +For example: + +

    + + +
    + +
    Cm Dm Em Fm
    + +
    + +

    +specifies four different chords in a bar. It should be obvious by now +that in a piece in 4/4 you'll end up with a ``Cm'' chord on +beat 1, ``Dm'' on 2, etc. + +

    +If you have fewer chord names than beats, the bar will be filled +automatically with the last chord name on the line. In other words: + +

    + + +
    + +
    Cm
    + +
    + +

    +and + +

    + + +
    + +
    Cm Cm Cm Cm
    + +
    + +

    +are equivalent (assuming 4 beats per bar). There must be one (or more) +spaces between each chord. + +

    +One further shorthand is the ``/''. This simply means to repeat the +last chord. So: + +

    + + +
    + +
    Cm / Dm /
    + +
    + +

    +is the same as + +

    + + +
    + +
    Cm Cm Dm Dm
    + +
    + +

    +It is perfectly okay to start a line with a ``/''. In this case the +last chord from the previous line is used. If the first line of music +data begins with a ``/'' you'll get an error-- +MMA tries to be +smart, but it doesn't read minds. + +

    + +MMA recognizes a wide variety of chords in standard notation. In +addition, you can specify slash chords and shift the octave up or +down. Refer to the complete table in the appendix for +details. + +

    + +

    +Rests +

    + +

    +To disable a voice for a beat you can use a ``z'' for a chord name. If +used by itself a ``z'' will disable all but the drum tracks for the +given beat. However, you can disable ``Chord'', ``Arpeggio'', +``Scale'', ``Walk'' or ``Bass'' tracks as well by appending a track +specifier to the ``z''. Track specifiers are the single letters ``C'', +``A'', ``S'', ``W'', ``B'' or `D'' and ``!''. Track specifiers are +only valid if you also specify a chord. The track specifiers are: + +

    + +

    +
    D +
    All drum tracks, + +

    +

    W +
    All walking bass tracks, + +

    +

    B +
    All bass tracks, + +

    +

    C +
    All chord tracks, + +

    +

    A +
    All arpeggio tracks, + +

    +

    S +
    All scale tracks, + +

    +

    ! +
    All tracks (almost the same as DWBCA, see below). + +

    +

    +
    +

    +Assuming the ``C'' is the chord and ``AB'' are the track specifiers: + +

    + +

    +
    CzAB +
    mutes the APREGGIO and BASS tracks, + +

    +

    z +
    mutes all the tracks except for the drums, + +

    +

    Cz +
    is not permitted, + +

    +

    zAB +
    is not permitted. + +

    +

    +
    +

    +Assuming that you have a drum, chord and bass pattern defined: + +

    + + +
    + +
    Fm z G7zC CmzD
    + +
    + +

    +would generate the following beats: + +

    + +

    +
    1 +
    Drum pattern, Fm chord and bass, + +

    +

    2 +
    Drum pattern only, + +

    +

    3 +
    Drum pattern and G7 bass, no chord, + +

    +

    4 +
    Cm chord and bass, no drum. + +

    +

    +
    +

    +In addition, there is a super-z notation. ``z!'' forces all +instruments to be silent for the given beats. ``z!'' is the same as +``zABCDW'', except that the latter is not valid since it needs a +prefixed chord. + +

    +The ``z'' notation is used when you have a ``tacet'' beat or beats. +The alternate notations can be used to silence specific tracks for a +beat or two, but this is used less frequently. + +

    + +

    +Case Sensitivity +

    + +

    +In direct conflict with the rest of the rules for input files, all +chord names are case sensitive. This means that you can + not use notations like ``cm''--use ``Cm'' instead. + +

    +The ``z'' and the associated track specifiers are also case sensitive. +For example, the form ``Zc'' will not work! + +

    + +

    +


    + + +next + +up + +previous +
    + Next: Lyrics + Up: Reference Manual + Previous: Riffs + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/node9.html b/mma/docs/html/ref/node9.html new file mode 100644 index 0000000..4a3da3e --- /dev/null +++ b/mma/docs/html/ref/node9.html @@ -0,0 +1,655 @@ + + + + + +Lyrics + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Solo and Melody Tracks + Up: Reference Manual + Previous: Musical Data Format +
    +
    + + +Subsections + + + +
    + +

    + +
    +Lyrics +

    + +

    +MIDI files can include song lyrics. And some MIDI players or +sequencers can display them as a file is played. Some, but not all. + +

    +I'm not aware of any keyboards which display lyrics; and most Linux +based players do not display them. Exceptions to the rule are the +programs Kmid which displays and highlights lyrics almost in a +Karaoke manner, xplaymidi and timidity which display the +lyrics in a secondary panel. + +

    +With this qualifier out of the way, there really is no reason for +lyrics NOT to be useful in a program like +MMA . Singers do not want +a melody playing while they are vocalizing (really, they are no +different in this than any other instrumentalist). And some +platforms9.1 other than Linux support lyric display in a more +useful format. + +

    +The ``Standard MIDI File'' document describes a Lyric Meta-event: + +

    +

    +

    FF 05 len text Lyric. A lyric to be sung. + Generally, each syllable will be a separate lyric event which begins + at the event's time.9.2
    +

    + +

    +Unfortunately, not all players and creators follow the +specification--the most notable exception are ``.kar'' files. These +files eschew the Lyric event and place their lyrics as a +Text Event. There are programs strewn on the net which convert +between the two formats (but I really don't know if +conversion is needed). + +

    +If you want to read the word from the source, refer to the official +MIDI lyrics documentation at +http://www.midi.org/about-midi/smf/rp017.shtml. + +

    + +

    +Lyric Options +

    + +

    + +MMA has a number of options in setting lyrics. They are all called +via the LYRIC command. Most options are set as option/setting +pairs with the option name and the setting joined with an ``=''. + +

    + +

    +Event Type +

    + +

    + +MMA supports both format for lyrics (discussed above). The +EVENT option is used to select the desired mode. + +

    + + +
    + +
    Lyric EVENT=LYRIC
    + +
    + +

    +selects the default LYRIC EVENT mode. + +

    + + +
    + +
    Lyric EVENT=TEXT
    + +
    + +

    +selects the TEXT EVENT mode. Use of this option also prints a +warning message. + +

    + +

    +Word Splitting +

    + +

    +Another option controlled by the LYRIC command is to determine +the method used to split words. As mentioned earlier (and in various +MIDI documents), the lyrics should be split into syllables. +MMA does +this by taking each word (anything with white space surrounding it) +and setting a MIDI event for that. However, depending on your player, +you might want only one event per bar. You might even want to put the +lyrics for several bars into one event. In this case simply set the +``bar at a time'' flag: + +

    + + +
    + +
    Lyric SPLIT=BAR
    + +
    + +

    +You can return to normal (syllable/word) mode at anytime with: + +

    + + +
    + +
    Lyric SPLIT=NORMAL
    + +
    + +

    + +

    +Chord Name Insertion +

    + +

    +It is possible to have +MMA duplicate the current chord names and +insert them as a lyrics. The option: + +

    + + +
    + +
    Lyric CHORDS=On
    + +
    + +

    +will enable this. In this mode the chord line is parsed and inserted +as verse one into each bar. + +

    +The mode is enabled with ``On'' or ``1'' and disabled with ``Off'' or +``0''. + +

    +After the chords are extracted they are treated exactly like a verse +you have entered as to word splitting, etc. Note that the special +chord ``z'' is converted to ``N.C.'' and directives after the ``z'' in +constructs like ``C7zCS'' will appear with only the chord name. + +

    + +

    +Chord Tranposition +

    + +

    +If you are transposing a piece or if you with to display the chords +for a guitar with a cappo you can tell +MMA to transpose the chord +names inserted with CHORDS=ON. Just add a transpose directive +in the LYRIC command: + +

    + + +
    + +
    Lyric CHORDS=On Transpose=2
    + +
    + +

    +Please note that the Lyrics code does not look at the global +TRANSPOSE setting.9.3 +

    + +MMA isn't too smart in it's transposition and will often display the +``wrong'' chord names in relation to ``sharp'' and ``flat'' names. If +you find that you are getting too many ``wrong'' names, try setting +the CNAMES option to either ``Sharp'' or ``Flat''. Another +example: + +

    + + +
    + +
    Lyric CHORDS=On Transpose=2 CNames=Flat
    + +
    + +

    +By default, the ``flat'' setting is used. In addition to ``Flat'' and +``Sharp'' you can use the abbreviations ``#'', ``b'' and ``SPMamp;''. + +

    +You can (and may well need to) change the CNAMES setting +anywhere in the song. + +

    + +

    +Setting Lyrics +

    + +

    +Adding a lyric to your song is a simple matter ...and like so many +things, there is more than one way to do it. + +

    +Lyrics can be set for a bar in-between a pair of []s +somewhere in a data bar.9.4 For +example: + +

    + + +
    + +
    z [ Pardon ] +
    +C [ me, If I'm ] +
    +E7 [ sentimental, \r] +
    +C [when we say good ]
    + +
    + +

    +The alternate method is to use the LYRIC SET directive: + +

    + + +
    + +
    Lyric Set Hello Young Lovers
    + +
    + +

    +Unlike the other LYRIC options, the SET option must be +the last one on a line, and it does not use the ``='' sign. If you are +setting the lyric for a single verse the []s are optional; +however, for multiple verses they are used (just like they are when +you include the lyric in a data/chord line). The advantage to using +LYRIC SET is that you can specify multiple bars of lyrics at +one point in your file. See the sample file egs/lyrics.mma for +an example. + +

    +The lyrics for each bar are separated into individual events, one for +each word ...unless the option SPLIT=BAR has been used, in +which case the entire lyric is placed at the offset corresponding to +the start of the bar. + +

    + +MMA recognizes two special characters in a LYRIC: + +

    + +

      +
    • A \r is converted into an EOL character (hex + value 0x0D). A \r should appear at the end of each + lyrical line. + +

      +

    • +
    • A \n is converted into a LF character (hex + value 0x0A). A \n should appear at the end of each + verse or paragraph. + +

      +

    • +
    + +

    +When a multi-verse section is created using a REPEAT or +GOTO, different lyrics can be specified for different passes. +In this case you simply specify two more sets of lyrics: + +

    + + +
    + +
    A / Am / [First verse] [Second Verse]
    + +
    + +

    +However, for this work properly you must set the internal counter +LYRICVERSE for any verse other than 1. This counter is set with +the command: + +

    + + +
    + +
    Lyric Verse=Value | INC | DEC
    + +
    + +

    +This means that you can directly set the value (the default value is +1) with a command like: + +

    + + +
    + +
    Lyric Verse=2
    + +
    + +

    +And you can increment or decrement the value with the INC and +DEC options. This is handy at to use in repeat sections: + +

    + + +
    + +
    Lyric Verse=Inc
    + +
    + +

    +You cannot set the value to a value less than 1. + +

    +There are a couple of special cases: + +

    + +

      +
    • If there is only one set of lyrics in a line, it will be treated + as text for verse 1, regardless of the value of LYRICVERSE. + +

      +

    • +
    • If the value of LYRICVERSE is greater than the number of + verses found after splitting the line, then no lyrics are produced. + In most cases this is probably not what you want. + +

      +

    • +
    + +

    +At times you may wish to override +MMA 's method of determining the +beat offsets for a lyric or a single syllable in a lyric. You can +specify the beat in the bar by enclosing the value in ``$< >$'' +brackets. For example, suppose that your song starts with a pickup bar +and you'd like the lyrics for the first bar to start on beat 4: + +

    + + +
    + +
    z z z C [ <4>Hello ] +
    +F [ Young lovers ]
    + +
    + +

    +Assuming 4/4 the above would put the word ``Hello'' at beat +4 of the first bar; ``Young'' on the first beat of bar 2; and +``lovers'' on beat 3 of bar 2. + +

    +Note: there must not be a space inside the ``$< >$'', nor can there be +a space between the bracket and the syllable it applies to. + +

    +Only the first ``$< >$'' is checked. So, if you really want to have +the characters ``$<$'' or ``$>$'' in a lyric just include a dummy to +keep +MMA happy: + +

    + + +
    + +
    C [ <><Verse_1.>This is a Demo ]
    + +
    + +

    +This example 9.5 shows a complete +song with lyrics. You should also examine the file +egs/lyrics.mma for an alternate example. + +

    + +
    + +
    + Twinkle, Twinkle, Little Star +
    + + + +
    + +
    Tempo 200 +
    +Groove Folk +
    +Repeat +
      1 G [Twinkle,] [When the] +
      2 G [Twinkle] [blazing ] +
      3 C [little] [sun is] +
      4 G [star; \r] [gone, \r] +
      5 Am [How I] [When he ] +
      6 G [wonder] [nothing] +
      7 D7 [what you] [shines u-] +
      8 G [are. \r] [pon. \r] +
      9 G [Up a-] [then you] +
      10 D7 [bove the] [show your] +
      11 G [world so] [little] +
      12 D [high, \r] [light, \r] +
      13 G [Like a] [Twinkle, ] +
      14 D7 [diamond] [twinkle,] +
      15 G [in the] [all the] +
      16 D7 [sky! \r] [night. \r] +
      17 G [Twinkle,] +
      18 G [twinkle] +
      19 C [Little] +
      20 G [star, \r] +
      21 Am [How I] +
      22 G [wonder] +
      23 D7 [what you] +
      24 G [are. \r \n] +
      +
      Lyric Verse=Inc +
    +RepeatEnd
    + +
    + + +
    + +

    + +

    + +

    +Limitations +

    + +

    +A few combinations are not permitted: + +

    + +

      +
    • You cannot specify lyrics in bars that are being repeated with + the ``*'' option. + +

      +

    • +
    • You cannot insert lyrics with LYRIC SET and [STUFF]. + +

      +

    • +
    +

    Footnotes

    +
    +
    ... +platforms9.1
    +
    Pointers and reviews to other players would be + would appreciated. + +
    +
    ... time.9.2
    +
    I am quoting from ``MIDI + Documentation'' distributed with the TSE Library. Pete Goodliffe, + Oct. 21, 1999. Page 41. + +
    +
    ... setting.9.3
    +
    This is a feature! It permits you + to have separate control over music generation and chord symbol + display. + +
    +
    ... bar.9.4
    +
    Although the lyric can be placed + anywhere in the bar, it is recommended that you only place the lyric at + the end of the bar. All the examples follow this style. + +
    +
    ...eg:twk 9.5
    +
    Included in + this distribution as songs/twinkle.mma. + +
    +

    + + +next + +up + +previous +
    + Next: Solo and Melody Tracks + Up: Reference Manual + Previous: Musical Data Format + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/ref/prev.png b/mma/docs/html/ref/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..e60b8b4073572dcd83b07c60b082ea6e2ba394c9 GIT binary patch literal 279 zcmV+y0qFjTP)fWJ4@hJr9=)Yx5|PDs2VC9?nk002ovPDHLkV1i^Ya=-up literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/prev_g.png b/mma/docs/html/ref/prev_g.png new file mode 100644 index 0000000000000000000000000000000000000000..476d9568c900e2ada6c2019b67eeee166a5f1288 GIT binary patch literal 327 zcmV-N0l5B&P)18~ zIpil5yY|hg&aw;rvXQ~olHp&x|G5Aw{ug* Z|8M28X+2RX!WaMm002ovPDHLkV1gF^iYx#C literal 0 HcmV?d00001 diff --git a/mma/docs/html/ref/up.png b/mma/docs/html/ref/up.png new file mode 100644 index 0000000000000000000000000000000000000000..3937e168f44bc997766dbe3b9383bd1db44f094d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h#LU3J`0lmo0U(Dbz$e6Y|Ni~?`T5VEKaXZ$ zILr2UCs3TRB*-tA!Qt7BG$5zc)5S5QVoq$YAz!lrkL&!DV=`*aVJGv=2TrrsUKR?`=XF~0x$5q(BOL&qeQ?X^G$FnGH9 KxvX@a!R<*>X0K7&N_)1@@}28%Z6=9 t-O~MHw|5t0`TuI#<-T9Me##YR_J!+(UN4n;@(5@ygQu&X%Q~loCIFb&G|K=0 literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/index.html b/mma/docs/html/tut/index.html new file mode 100644 index 0000000..ffdfe4a --- /dev/null +++ b/mma/docs/html/tut/index.html @@ -0,0 +1,125 @@ + + + + + +Tutorial + + + + + + + + + + + + + + + + +next + +up +previous +
    + Next: Introduction + Up: Main MMA Reference +
    +
    + + +

    + +

    + +

    + +

    + +

    +

    LOST LOGO + +

    + Tutorial

    +
    + +

    Bob van der Poel

    +

    Wynndel, BC, Canada

    +

    October 15, 2006

    +
    + +

    + +

    +


    + + + + + +

    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/mma-tutorial.css b/mma/docs/html/tut/mma-tutorial.css new file mode 100644 index 0000000..d1824af --- /dev/null +++ b/mma/docs/html/tut/mma-tutorial.css @@ -0,0 +1,30 @@ +/* Century Schoolbook font is very similar to Computer Modern Math: cmmi */ +.MATH { font-family: "Century Schoolbook", serif; } +.MATH I { font-family: "Century Schoolbook", serif; font-style: italic } +.BOLDMATH { font-family: "Century Schoolbook", serif; font-weight: bold } + +/* implement both fixed-size and relative sizes */ +SMALL.XTINY { font-size : xx-small } +SMALL.TINY { font-size : x-small } +SMALL.SCRIPTSIZE { font-size : smaller } +SMALL.FOOTNOTESIZE { font-size : small } +SMALL.SMALL { } +BIG.LARGE { } +BIG.XLARGE { font-size : large } +BIG.XXLARGE { font-size : x-large } +BIG.HUGE { font-size : larger } +BIG.XHUGE { font-size : xx-large } + +/* heading styles */ +H1 { } +H2 { } +H3 { } +H4 { } +H5 { } + +/* mathematics styles */ +DIV.displaymath { } /* math displays */ +TD.eqno { } /* equation-number cells */ + + +/* document-specific styles come next */ diff --git a/mma/docs/html/tut/mma-tutorial.html b/mma/docs/html/tut/mma-tutorial.html new file mode 100644 index 0000000..ffdfe4a --- /dev/null +++ b/mma/docs/html/tut/mma-tutorial.html @@ -0,0 +1,125 @@ + + + + + +Tutorial + + + + + + + + + + + + + + + + +next + +up +previous +
    + Next: Introduction + Up: Main MMA Reference +
    +
    + + +

    + +

    + +

    + +

    + +

    +

    LOST LOGO + +

    + Tutorial

    +
    + +

    Bob van der Poel

    +

    Wynndel, BC, Canada

    +

    October 15, 2006

    +
    + +

    + +

    +


    + + + + + +

    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/mup/bass.png b/mma/docs/html/tut/mup/bass.png new file mode 100644 index 0000000000000000000000000000000000000000..24f5f0904bd724f62c89d2ae0cf0a20d5dc7b48d GIT binary patch literal 2134 zcmd6odpr~BAIG0DHTTPDA!OxOgb-57WpdYXJBT>cFqbpSZLEuFNfa?<(T|v>i(^ct zVRPuB(nTAQTN}B?T<3Cz&~K;L>-X>P@82KK^Lc;2-{<-K^*pc74KEL8d6``@004Pc z7l+>fkU)w#4+a(QZl;<|Vvz_v>FfZ0WRlvSi7V+im(z)2b@{oR-eGJ2*v@cuu=71X zFw3{T$g|jS4TbPz`}UuxG1)?^nVmod&kU-c2NZuYIc&mg2;V=X+g(?Ac2^dihLT-2FHd&k@ zWZR_fC?Rn>+qm%0BVo(JAjh^uGBxv;pXW9I4kmy`D+yTU=8n1V*=*t4H1JaTNPl~q zVp5leADaqQGOCO{JD>_x@|e7KsDq|4^xzYGA2BY=Xd8LBm%;dlWx~pO$klp~^!#%S zYtc*Bg@QX(;;IXG=(*ZkCsvjU@~FGI8~du&diUr zSa&zECX1p!tj%I@Li?LW?C6gtyTAM3gg*B~ZxA$2=Hy84w)Ko`dXyvn$MdJWSgk(O z2LrJC_pM?&b0nh%&1PuUP%m6(Qn_)(-U=qr_w!Z_=EX}VXSeb*zEbB?7N&<(Q@)ie z)=)$*r(DUMYjZ234AFy^6*ckpHk9As?h0jlQs;*AKM_r~qUU_fjs8mRTRhZ}vlqr9 z{}~kuaNvXjtNHqCmoI=uG-_>mRSOxAbQ|7#pKDHXqVVSJOG$-sS}#7PO&B_$@kSJ0O^ zYdVh=6>rB-fhQe8*)ifqXkejq7A(eQw%2a=g?u$aDd=gg%7B=Y(uikU<}reGB(HM& z6Qe1kfCYZc(_a(}J?nGf%2&RvUQR z@&pQ}Dwr&`X!M!K$+u0C6!Uz^@wzefk#|75V|is_QUh23#33 z*+;Lj;Ip&*bEZRGRxMV%3%=BI-aL!PI65>Dey9(fQ9d+Z&o|r3^$$?4ZP`6X&5p?L z=q>s&HR?`)`LSMCH$d;jXD@9wck_#{Ie@_qmLU9e` zR@f2+v%^k_$PYqK{8;afPX8dyoaH)UaO1r3K8}Nqb@@c{-J8S$dAexPU5kH88HOpJy)Ohg&Y!*{U|R9G_=(Fw4!a zo_w-4?*CbsKXn+tF~C2w`b=sNZ?UB^_g!(?thO$4!zWt1W^M6<0acgZZYo1viT~09=xFs~|OA#=uSNjFa zC9$IxDf(}0M@OTtQnmUeqHNZ9fg3Rm-z?L_)gxubgV!Pcd9b%`)GAe5lhA=?}*5!lAcg+_9 zg?0Sd)_uoLw_s^afj$1L`SBh%ZbgHZ5&P|b|493dVa_r(lgTdzUPrV&c^QEP zCGkyR$V~zm%Tq)CBZW%H(OSiP4p{7$D--r*${GVpEVN_c!8X+puz0c&s*?ix`s5H1 z1Q5^>sbF>Zx( z48YmPVzKCRIDl})q9W0VNc1^$0t$x?M}%HLIQn=YoTFkBafx9G(Q!D0UN|~AIt*i)8)$)`v6x*4+r{*vuXbU=C;-K literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/mup/deep.png b/mma/docs/html/tut/mup/deep.png new file mode 100644 index 0000000000000000000000000000000000000000..668733b7199b92bff3ae6eda290ffbd191299c0e GIT binary patch literal 24804 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 Gh5Zi@f0u0l literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/mup/drums.png b/mma/docs/html/tut/mup/drums.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbdf387bd45a2701c4839e0aeafb2c369dd300b GIT binary patch literal 2315 zcmcgudt8!P8vbxB9UU*#PHJURPPJud8liSECrxxQHPJ4DW*UkjqJWlH+-kCm={7Tg zDXEQ9gyp3aj0mjN(I!JvOEeYp1{tX-w-k^CcXszT|Ih3n-*?V;-sgSa=l7lGcb;=8 zBnWO{w#Ezq0E+;B-%tQB^48BAOpW#LUMp0oelUtbzMrB(SPaj z`xWN}0H*N)zTbwOc{?@4OOrmgTmJ4=Cp#6@x0*gExEbK9jz5NPnxhYR1 zeb?;YeqC^m`w#C+XT4+cY`|p_M1=#^!}inHrq<0q5WtS&zaNNhGPbss`7D68OJ)=d zxz8D_qV5!qQq%PF9?hq+_7m|ANVvCmfu5ZnS6>M%1TTPIz0!4CMVlq5-{rZ13<1urq7vNCV}<3Hmx64j$?M3H_o%D3-}Qj0%G1+Y%9n~ z>Yrh~E|Z#?UR?3t4vu+wwjkpcQ!x17HU5;)%Ugx>tDkDq4Q+x9#xXG?t5;QWiXdtpwU2~=yjfvw{d;O_ttuFqcY_t0$vw0V1#|H)SQ%|I zq)e)Uwe4e5jNc}8pNfX69%2Xt6=7=4dg`MVVO5aJ6~^vqRW3dIQ&GhEO;53k@QAoQ^7mT$m-#PO!E}CI#+yOkPdllT)FDsR=n{ z^9@Mp2Wg5xBcU-zZnAYf`+JYf+_WE#yQkaO%x#?rrrgJiYO@ffx7isb+xM3=${)T# zx;?-kbL^}7*B-m$B}#Cibk7OYu>(oMcI1?9VsSe4F?Kd=U}(ns;YGm4mo+Lf`YXXI!4NkkI(cZN zXASLAR}u$9%Hc)*aO5L(mHT^MZDW3s&~giEnD22%(5py?bJ$}I>#w=um8y&QLUD1_ zX21F={f|&Y9Ex~=ih=`?SrdcdHp`}F$`_vqlxdoGCT(``aT!dV)p7(blNs;|13qU7 zj{qWv?`th~cN$wZ<2w!u%jnvtrLn$VxcVk|(rM^^DJBLg>3hiJ^Q%J0yoCUQDmpq zY(s!+*ts@Cil@DIvR~TH51~Br&cuNws6|CiVB4&W!M!l)L7l{0VN6U_dh!HeC-QOK zmxqXMc}lkp{WRLaRo~+&2ObWDNq!_4PFf{>A>Ftw0yc%w-r4tp!>AIp8tXYM?Gm`gJ&Rc<{`dGmoyA^-8)gNFTy!cu! z=IAqO&90Xi_y3i=7hNiQomK8X!=3omTw>u?VuVFHyS(l_ZA0u|S-CY2HlbDf25|=y z9L{xZKM3GkIm*+0LUWeZoFkbF>*V&~8#}Q4N2>9|jUT^}uVg6)Y}8rjy9O7q&fy0A zs@(0{=B^jFCp+|{e#Ah9#|?`@SI5y$VBVrg?kQiX4^Df`5qRuGsBlk-^nR#=*iAF> z<8s=;&)(ITIA?=XS?XQ z-^%xFxkb}mr1Qc?!RzmWO_h{z=p-(7-qPksOv3Y7Zi7Yer`<`8Ollta5h@n{TM(f`wmc1`mSl4~4;-^cgLZaneDo(NuU4utnGPJAI z>yB*s9<6r3&CLxF`f)yx z4&NCIAsy9#0;?C1@5Z(~eKZ_OV=b{Hgnwv8U)X=WX!s|}lT1g@*f-*-oh5s|4|i?tWHJB_z@LoAfa5XA7~)AX<`g(4 z1AGt}0)}G=Br++Mn2e*seN BOo;#h literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/mup/fella.png b/mma/docs/html/tut/mup/fella.png new file mode 100644 index 0000000000000000000000000000000000000000..775a7c25a359a73f52ab5301459d9eead3b6e842 GIT binary patch literal 19244 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 WGDyh~oC>l40000 + + + + +Introduction + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Installation + Up: Tutorial + Previous: Tutorial +
    +
    + + +

    +Introduction +

    + +

    +This document is provided as a aid for the new +MMA user to get +started in a easy, gentle manner. It is a supplement to the main +reference manual. + +

    + +MMA is a complex and powerful program. We don't intend to show each +and every possible command in this tutorial; we'll be quite happy if +we show enough of the basics to get you started! And, please, read the +reference manual! + +

    +We hope to cover the following topics: + +

    + +

      +
    • Installing +MMA on your system, + +

      +

    • +
    • A step-by-step example showing how to create a simple backing + track, + +

      +

    • +
    • An example showing how to create a library file. + +

      +

    • +
    + +

    +The examples may include songs which are probably not in the +public domain. Certainly ``Happy Birthday'' should be public domain, +but isn't. User's should note1.1 that the +copyrighted songs in this document are examples only. It is probably +not legal for you to copy it or play them. If this document is +violating copyright by including any of the sheet music used in the +examples, please let us know and it will be removed. + +

    + +

    +

    + + +
    + This is a draft document. + Feedback is solicited! + +
    + +
    + +

    + +

    + +

    +


    Footnotes

    +
    +
    ... note1.1
    +
    Bad pun intended! + +
    +

    + + +next + +up + +previous +
    + Next: Installation + Up: Tutorial + Previous: Tutorial + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/node2.html b/mma/docs/html/tut/node2.html new file mode 100644 index 0000000..691b862 --- /dev/null +++ b/mma/docs/html/tut/node2.html @@ -0,0 +1,65 @@ + + + + + +Installation + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: A Simple Example + Up: Tutorial + Previous: Introduction +
    +
    + + +

    +Installation +

    + +

    +For now, you'll have to rely +on the reference manual and the READMEs for this. + +

    + +


    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/node3.html b/mma/docs/html/tut/node3.html new file mode 100644 index 0000000..e6c3dc8 --- /dev/null +++ b/mma/docs/html/tut/node3.html @@ -0,0 +1,476 @@ + + + + + +A Simple Example + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: A More Complex Example + Up: Tutorial + Previous: Installation +
    +
    + + +Subsections + + + +
    + +

    +A Simple Example +

    + +

    + +

    +Fella Bird, Basic Edition +

    + +

    + +
    + +
    + Sheet Music for a Popular Song +
    + + Lost Image + + +
    + +

    + +

    +This example piece of music is shown in a ``fake book'' or ``lead sheet'' +style. It shows the melody notes, lyrics and chords. + +

    +As a first try at making a MIDI accompaniment file, we have created the +following file: + +

    +// Sample tutorial file +
    // Fella Bird, try 1 +
      +
    +Tempo 120 +
    +Groove Rhumba +
      +
    +1       F +
    +2       F +
    +3       C7 +
    +4       F +
    +5       F +
    +6       F +
    +7       C7 +
    +8       F +
    +9       Gm +
    +10      F +
    +11      C7 +
    +12      F +
    +13      Gm +
    +14      F +
    +15      C7 +
    +16      F  /  / z! +
      +
    + +

    +After the comments in the file, the first line to note is: + +

    + + +
    + +
    Tempo 120
    + +
    + +

    +This sets the tempo, or speed, of the piece to 120 beats per minute. You may +have to guess the tempo--very few pieces (especially in ``fake book'' style) +will include a metronome setting. For slow pieces you might want to start with a +tempo setting of ``80''; for faster pieces, like swings, try around ``150''; polkas +and marches, which are really in 2/2 time, may require fast +sounding tempos like ``250''. Feel free to modify the tempo setting in +the example files--you're not going to break anything. + +

    +Since we are using the standard library which was shipped with +MMA , +we can select one of the predefined grooves: + +

    + + +
    + +
    Groove Rhumba
    + +
    + +

    +Note that this command also sets up the ``time signature'' to 4/4. +Not quite the same as the ``cut'' time indicated, but close enough. And speaking +of ``close enough'', we're using a rhumba rhythm instead of the merengue indicated +in the score. + +

    +Finally, we have the chord information. The first bar (in the sheet music) +indicates an ``F'' chord. So that's what we tell +MMA to use: + +

    + + +
    + +
    1 F
    + +
    + +

    +We continue in a similar manner for the rest of the song. + +

    +We've simplifed the song a bit and show only one chord per bar. + +MMA automatically fills out the bars so that each has four chords. +We could have entered the first bar as: + +

    + + +
    + +
    2 F F F F
    + +
    + +

    +or, more simply: + +

    + + +
    + +
    2 F / / /
    + +
    + +

    +and had the same result. But, who wants to do all that typing? + +

    +In the final bar, the last beat is a rest. + +

    +The line: + +

    + + +
    + +
    16 F / / z!
    + +
    + +

    +causes an ``F'' chord to be used on the first three beats, the fourth +beat is completely silent due the to the ``z!''. Note the difference +between a ``z'' and ``z!''--the first silences all but the drum track, +the second silences everything. See the reference manual for more details +on ``z''. + +

    +Now, let's create our first MIDI file! If you are using the standard +distribution, you should find a file ``fella1.mma'' in the tutorial directory. +Change to this directory and type the command: + +

    + + +
    + +
    mma fella1
    + +
    + +

    +Your computer should run the python script called ``mma'' and process the +file ``fella1.mma''. The MIDI file ``fella1.mid'' should be created. If this doesn't +happen, please check your python installation, and make sure that you +have installed ``mma'' where your shell can find it. If you are completely stuck, +drop me an email. + +

    +Now, use your favorite MIDI file player to play the song. + +

    +How'd that sound? A piano doing some chords, a jazzy bass line, +and a bit of drumming? Wonderful! + +

    + +

    +Fella Bird, Improved Edition +

    + +

    +If you play the MIDI created in the previous section you'll find a number +of things lacking. Certainly: + +

    + +

      +
    • It is hard to sing to because there is no aural indication of + when to start, + +

      +

    • +
    • The whole piece is the same volume, + +

      +

    • +
    • It's a pretty short song, so let's play it twice. + +

      +

    • +
    + +

    +The following example has a number of improvements: + +

    + // Sample tutorial file +
    // Fella Bird, try 2 +
      +
    +Tempo 120 +
    +Groove Metronome2-4 +
      +
    +z * 2 +
      +
    +Groove Rhumba +
    +Repeat +
    +Volume mp +
    +Cresc mf 4 +
      +
    +1      F +
    +2      F +
    +3      C7 +
    +4      F +
    +5      F +
    +6      F +
    +7      C7 +
    +8      F +
    +9      Gm +
    +10     F +
    +11     C7 +
      +
    +Decresc p 4 +
      +
    +12     F +
    +13     Gm +
    +14     F +
    +15     C7 +
      +
    +RepeatEnding +
      +
    +16     F  /  / z +
      +
    +RepeatEnd +
      +
    +17     F  /  / z! +
    +cut -1 +
      +
      +
    +Try running +MMA on this file and listen to it. Oh my, much better. + +

    +So, let's look at the changes. + +

    + + +
    + +
    Groove Metronome2-4
    + +
    + +

    +This sets the current ``groove'' to a metronome. To find this groove + +MMA will automatically process the library file ``metronome''. + +

    +The metronome groove consists of wood-blocks being struck in a +4/4 pattern. In order to ``sound'' the metronome, we need +to create an empty bar: + +

    + + +
    + +
       z * 2
    + +
    + +

    +Mind you, we could have specified a chord here and gotten the same +result (the groove has no definitions for any instruments other than +the wood-block, so nothing else will sound). But, it seems to be more +clear to use a ``z''. + +

    +Okay, we lied. We didn't create an empty bar for the metronome. If +you're sharp you'll notice that the ``z'' is followed by ``* 2''. This +means to play this bar two times. So, you get 2 bars of metronome. +Cool. + +

    +We've not made any changes to the chords, but a few little changes do +help this simple piece. Remember the dull, single volume? Well, have a +look at the ``volume'' directives we've included in this version. We +start the song off at a moderate volume, and increase it in several +steps. And, at the end we use a ``decresc'' to reduce the volume to +``quiet'' over the final 4 bars. + +

    +Please refer to the +MMA Reference Manual for salient details on the +volume commands. + +

    +One minor change we did make in the chords is in bar 16. Note the +change between this and bar 17. In the first we have a ``z'', the +second a ``z!''. The difference between the two is that we want the +precussion tracks to continue though the ending, but not on the final +beat. + +

    +Finally, to ensure a complete cutoff in the final bar we have added a +``cut'' command. We're sure you'll find these minor changes a great +improvement. + +

    + +

    +


    + + +next + +up + +previous +
    + Next: A More Complex Example + Up: Tutorial + Previous: Installation + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/node4.html b/mma/docs/html/tut/node4.html new file mode 100644 index 0000000..2b75e9c --- /dev/null +++ b/mma/docs/html/tut/node4.html @@ -0,0 +1,444 @@ + + + + + +A More Complex Example + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: Library File Creation + Up: Tutorial + Previous: A Simple Example +
    +
    + + +Subsections + + + +
    + +

    +A More Complex Example +

    + +

    +Fun time. We're going to take an old (slow) spiritual and surprise some people! +We'll also learn about repeats, play with volumes, and do some interesting +tempo things. + +

    + +

    +Deep River--A Swinging Spiritual +

    + +

    + +
    + +
    + A Public Domain Song +
    + + Lost Image + +
    + + +
    + +

    + +

    +Rather than list the song separately, we've inter spaced the listing with +textual comments. If you want to see the listing, it is in the egs +directory. + +

    +We start out with a comment block. + +

    + + +
    + +
    // Deep River
    + +
    + +

    +Start off by selecting the 4 beat metronome. + +

    + + +
    + +
    Groove metronome2-4
    + +
    + +

    +We want to surprise our listeners a bit, so we start off with a ``normal'' +tempo. The single ``z'' produces a 4 beat introduction. + +

    + + +
    + +
    Tempo 90 +
    +z +
    +Groove FolkArticulated
    + +
    + +

    +As an introduction we play some nice, gentle chords for 4 bars. + +

    + + +
    + +
    1 F +
    +2 Dm +
    +3 Gm +
    +4 C7
    + +
    + +

    +Surprise time. We are going to pump the tempo up to 140 BPM and +select the Swing2 Groove. + +

    + + +
    + +
    Tempo 140 +
    +Groove Swing2
    + +
    + +

    +If we just did a switch of rhythm and tempo it'd be quite ``interesting''. +We need some +kind of a transition. Hmmm, what if we have two beats (not four) of swing +drums? We could create a 2 beat measure, but it's quite cool to give the +drummer a real workout. So, here we double the time and put in a single +``z'' bar. + +

    + + +
    + +
    Tempo *2 +
    +z
    + +
    + +

    +Now, we restore the tempo to the original 140. + +

    + + +
    + +
    Tempo *.5
    + +
    + +

    +Each time we restart the piece we want the same volume setting. This is bit +of overkill, but it's supposed to be an example. So, we set the volume to +``mf'' and assign that to the Volume Groove ``Main''. + +

    + + +
    + +
    Volume mf +
    +DefVolume Main
    + +
    + +

    +Now, just like the sheet music we insert a repeat start. + +

    + + +
    + +
    Repeat
    + +
    + +

    +Set the volume, and advise +MMA that we'd like it get softer over the +next 8 bars. + +

    + + +
    + +
    SetVolume Main +
    +Decresc mp 8
    + +
    + +

    +This is straightforward chording. + +

    + + +
    + +
    5 F +
    +6 Gm +
    +7 Dm +
    +8 Am C +
    +9 F +
    +10 Gm / Dm +
    +11 F / C7 +
    +12 F +
    +13 Dm +
    +14 Am
    + +
    + +

    +Increase the volume over the next 4 bars, and more chording. + +

    + + +
    + +
    Cresc ff 4 +
    +
    +15 Bb +
    +16 Am / / C7 +
    +17 F +
    +18 Gm +
    +19 F / C7 +
    +20 Am / Dm C7 +
    +21 F +
    +22 Gm
    + +
    + +

    +This is the first/second ending. Note how we've put a ``2'' at the end +of the next line ... this forces 2 repeats. + +

    + + +
    + +
    RepeatEnding 2 +
    +
    +23 / / / C7 +
    +24 F
    + +
    + +

    +For the second and third time we play this we want a more interesting +accompaniment. So, we select ``Swing2Plus'' which adds a clarinet doing +its thing. + +

    + + +
    + +
    Groove Swing2Plus
    + +
    + +

    +This ends the repeated section. + +

    + + +
    + +
    RepeatEnd
    + +
    + +

    +For our 2 bar ending we select the ``Swing2End'' groove. Next, we +ritard our tempo over the next 2 bars. + +

    + + +
    + +
    Groove Swing2End +
    +Tempo -40 2 +
    +
    +1 / / / C7
    + +
    + +

    +The ``Swing2End'' groove has a neat little saxophone scale. But only on the +third and fourth bars. It is a four bar sequence and the first two give +the sax player time to rest. The Seq 3 forces the sequence to use +the bar with the solo. We also set the solo to a louder volume. + +

    + + +
    + +
    Scale Volume ff +
    +Seq 3 +
    +1 F +
    +Fermata -1 1 200
    + +
    + +

    +To finish off the example, we add a bit of time to the last note with a fermata +command. + +

    +Compile this example and play it. Follow along on both the sheet music and the + +MMA file so you understand what's happening. + +

    + +

    +Future Directions +

    + +

    +Well, that's two examples. + +

    +Certainly, the ideas here only scratch the surface of what +MMA can do. +We, as developers, can only hope that we've included enough commands and options +for you to create wonderful music. And hope that if we haven't, that you +let us know. + +

    +May we suggest that you list and examine some of the +sample songs--then, it's all up to you. Have fun! + +

    + +

    +


    + + +next + +up + +previous +
    + Next: Library File Creation + Up: Tutorial + Previous: A Simple Example + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/node5.html b/mma/docs/html/tut/node5.html new file mode 100644 index 0000000..8b70294 --- /dev/null +++ b/mma/docs/html/tut/node5.html @@ -0,0 +1,736 @@ + + + + + +Library File Creation + + + + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Next: About this document ... + Up: Tutorial + Previous: A More Complex Example +
    +
    + + +Subsections + + + +
    + +

    +Library File Creation +

    + +

    +You should know that the GROOVE definition engine is a very powerful +tool that has almost unlimited possibilities. It is impossible to +explain all those possibilities in a short tutorial. The flexibility +of +MMA allows you to do the same things in different ways; the example +you'll see here is just one way to create a GROOVE. We have tried +to keep it simple and organized it in different sections so that you +understand how the GROOVE was built.5.1 +

    +The day that you decide to create your proper GROOVEs you'll have +to read the manual in detail! + +

    + +

    +Let's Create Our First GROOVE +

    + +

    +The GROOVE we will create will be a simple 4/4 rock GROOVE. + +

    +The first thing we have to do set the timing for 4/4 +and initialize some variables (those are explained in detail in the + +MMA manual) + +

    + + +
    + +
    SeqClear +
    +SeqSize 1 +
    +Time 4 +
    +Timesig 4 4
    + +
    + +

    +Now let start to create our patterns. + +

    + +

    +The Drummer +

    + +

    +For the drummer we will use the following pattern: + +

    +

    + Lost Image + +
    + +

    +As we can see this is a pretty simple pattern. + +

    +We have: + +

    + +

      +
    • A kick drum on beats 1, 2 and, 3 +
    • +
    • A snare on beat 2 and 4 +
    • +
    • A closed highhat every eight note +
    • +
    +Before we actually define the drum-instruments we will define the +patterns that we will use: + +

    + +

    + + +

    + + +
    + +
    Begin Drum Define +
        D1 1 8 90 ; 2.5 8 90 ; 4 8 90
    + +
    + +

    + +

    +
    + + +

    +So what have we done? + +

    +Well, we have just translated what we have seen on the score. We have +created a pattern D1 with a 8th note on beats 1, 2.5 and 4 and a velocity +of 90.5.2 +

    +Using the same logic we can create the pattern for the snare drum. + +

    + + +
    + +
    S1 2 8 90 ; 4 8 90
    + +
    + +

    +For the closed HiHat pattern we will use a little trick to avoid having to +enter 8 notes + +

    + + +
    + +
    CH1 1 8 90 +
    +C1 CH1 * 8
    + +
    + +

    +As you can see we just define one note on the first beat and multiplied +it by 8, which will result in eight notes. + +

    +And we close the definition by adding + +

    + + +
    + +
    End
    + +
    + +

    +Now that we have the patterns for our drum, we will create the different +instruments.5.3 +

    + + +
    + +
    Begin Drum-Kick +
      Tone KickDrum1 +
      Sequence D1 +
    +End +
      +
    +Begin Drum-Snare +
      Tone SnareDrum1 +
      Sequence S1 +
    +End +
       +
    +Begin Drum-HH +
      Tone ClosedHiHat +
      Sequence C1 +
    +End
    + +
    + +

    + +

    +The Bass Player +

    + +

    +Now that we have a drummer, let's have a look at the bass player for +our GROOVE. + +

    +

    + Lost Image + +
    + +

    +Those are the notes the bass player plays on a C chord. He +builds a nice riff using only the root of the chord. + +

    +This is pretty simple to translate in +MMA syntax, using what we have +learned to create the drum pattern. + +

    +So we go up in our text file to the point where we created the patterns +for the drum (the line after End) and we add: + +

    + + +
    + +
    Begin Bass Define +
      B1 1 4+8 1 90 ; 2.5 8 1 90 ; 3 8 1 90 ; 3.5 4 1 90 ; 4.5 8 1 90 +
    +End
    + +
    + +

    +You will already recognize the timing of the riff, the duration and +the velocity of the notes. The only item that is different for a bass +player is that we add in the pitch definition for the note to be played. + +

    +If we look at the first note definition we see that beat 1 is a +note with duration 4+8 (dotted quarter),5.4the note to play is the first +(root) of the chord and the volume or velocity of the note is 90.5.5 +

    +Now the only thing left is to add the bass player at the end of the +file, the same way we did with the drums. + +

    + + +
    + +
    Begin Bass-Simple +
      Voice AcousticBass5.6 +
      Sequence B1 +
    +End
    + +
    + +

    + +

    +The Piano +

    + +

    +As a last example, we will add a piano player with a simple riff to +our GROOVE. + +

    +

    + Lost Image + +
    + +

    +Creating piano patterns is a bit different from other players as they +(most of the time) play with both hands. As we can see on the above +score (using only a C chord), our piano player will play the second inversion +of the chord with his right hand as a dotted halfs and a fourth note +and with the left hand he plays the root on the start of the bar also +as a dotted half note. + +

    +There are a couple of ways in +MMA to define this, what we explain +here is just one of the possibilities. + +

    +We will define both ``hands'' of the piano player separately.5.7 +

    +Let's start with the easiest, the left hand. Actually if you think +a bit about it, there is not a big difference between a bass player +and the left hand of a piano player. Following this logic, we will +simply define a new pattern and attach it to a new bass player called +Bass-LeftHandPiano. + +

    +We already know how to do this. + +

    +In the pattern section of our GROOVE we will add: + +

    + + +
    + +
    L1 1 2+4 1 90
    + +
    + +

    +Remember: First beat, half+fourth note, root of the +chord, velocity 90. + +

    +And we will create a new bass player + +

    + + +
    + +
    Begin Bass-LeftHandPiano +
      Voice Piano1 +
      Sequence L1 +
      Octave 3 // This a new command, but simple to understand +
    +End
    + +
    + +

    +Now the right hand. What the right hand of the piano player does is +more the playing of chords than playing simple notes. That's exactly what +we will tell +MMA : play chords. + +

    +On the example score we see that he plays the chord in his first inversion +form, but for the sake of simplicity of this ``Getting started'' document +we are just ignoring this and we will define the standard form of +the chord.5.8 +

    +Again, we go up in the definition section of our GROOVE and under the +bass patterns we will enter the chord definition + +

    + + +
    + +
    Begin Chord Define +
      C1 1 2+4 80 ; 4 4 80 5.9 +
    +End
    + +
    + +

    +As you can see the chord definition structure is a bit different from +what we have done until now. + +

    +Chord definitions are done as follows: Name (C1), Beat (1), and the note +volume or velocity. It is possible to specify different velocities for +each note in a chord (see page [*] in the Reference Manual) +and even disable certain notes or limit the range of chord. + +

    +Finally we need our piano right hand player + +

    + + +
    + +
    Begin Chord-RightHandPiano +
      Voice Piano1 +
      Sequence C1 +
    +End
    + +
    + +

    + +

    +Putting It All Together +

    + +

    +We have just created a trio to play Drums, Bass and Piano for +us. + +

    +We have to give a name to the created GROOVE, so that we can use it +in a song: + +

    + + +
    + +
    DefGroove Myrock1
    + +
    + +

    +is added at the end of the file. + +

    +The file that we created should look like this5.10 +

    + + +
    + +
    SeqClear +
      SeqSize 1 +
      Timesig 4 4 +
       +
    +Begin Drum Define +
      D1 1 8 90 ; 2.5 8 90 ; 4 8 90 +
      S1 2 8 90 ; 4 8 90 +
      CH1 1 8 90 +
      C1 CH1 * 8 +
    +End +
       +
    +Begin Bass Define +
      B1 1 4+8 1 90 ; 2.5 8 1 90 ; 3 8 1 90 ; 3.5 4 1 90 ; 4.5 8 1 90 +
      L1 1 2+4 1 90 +
    +End +
       +
    +Begin Chord Define +
      C1 1 2+4 80; 4 4 80 +
    +End +
       +
    +Begin Drum-Kick +
      Tone KickDrum1 +
      Sequence D1 +
    +End +
       +
    +Begin Drum-Snare +
      Tone SnareDrum1 +
      Sequence S1 +
    +End +
       +
    +Begin Drum-HH +
      Tone ClosedHiHat +
      Sequence C1 +
    +End +
       +
    +Begin Bass-Simple +
      Voice AcousticBass +
      Sequence B1 +
    +End +
       +
    +Begin Bass-LeftHandPiano +
      Voice Piano1 +
      Sequence L1 +
      Octave 3 // This a new command, but simple to understand +
    +End +
       +
    +Begin Chord-RightHandPiano +
      Voice Piano1 +
      Sequence C1 +
    +End +
       +
    +DefGroove Myrock1
    + +
    + +

    + +

    +How To Use Our First GROOVE +

    + +

    +Save the text file we just created in the lib-directory of +MMA under +the name myrock.mma. + +

    +First thing we have to do is tell +MMA to update its database +so that our new GROOVE can be found. + +

    +Go to a command prompt and enter: $ mma -g + +

    +Now start a new textfile to create a song and start the file with: + +

    + + +
    + +
    Groove Myrock1 +
    +Tempo 120 +
      +
    // Enter chords here
    + +
    + +

    +Save the file as Mysong.mma and compile it as explained in the first +part of this tutorial. + +

    + +

    +Where Do We Go From Here +

    + +

    +As you probably noticed, the style that we have created here sounds +very simple and lacks variation ...an intro, a break and an ending .... +Don't panic, all those things are possible but beyond the scope of +this small '`Getting Started''. + +

    +Now before you do anything else: READ THE MANUAL! + +

    +This is the best advice you can get. The author of this program has +put a lot of effort in the development process so that the software can be as powerful +and flexible as possible. Years of development went into this product, +so don't think you will learn it in a day. + +

    +Also read the README files that are delivered with the distribution. +You can find valuable information in these.5.11 +

    +Have fun with +MMA ! + +

    + +

    +


    Footnotes

    +
    +
    ... built.5.1
    +
    This chapter was written +by Rony Steelandt of Kara Music +Production with minor spelling and grammar fixes by Bob van der Poel. + +
    +
    ...5.2
    +
    See +MMA Reference Manual section [*] +for more details. + +
    +
    ...5.3
    +
    See +MMA Reference Manual section [*] for more details. + +
    +
    ... quarter),5.4
    +
    When specifying the +duration of a note the following are equal: ``4+8'', ``4.'' or ``8+8+8''. + +
    +
    ...5.5
    +
    See +MMA Reference Manual section [*] for more detail. + +
    +
    ... AcousticBass5.6
    +
    For drums we use TONE for other instruments we use VOICE. + +
    +
    ...5.7
    +
    As many things in +MMA there are different ways to define that kind +of pattern. If you're curious, look at the Reference Manual section [*], page +[*]. + +
    +
    ...5.8
    +
    If you are curious about how to define inverted chords, see the Reference Manual +section [*], page [*]. + +
    +
    ...5.9
    +
    This is not exactly right, it will play the 7th on a C7 chord too, + but this is beyond the scope of this tutorial. + +
    +
    ... this5.10
    +
    If you are really lazy and don't want to type the text, you download +the file here: http://www.kara-moon.com/MMA/tut1.mma. + +
    +
    ...5.11
    +
    Amongst others, some very good information about fake books. + +
    +

    + + +next + +up + +previous +
    + Next: About this document ... + Up: Tutorial + Previous: A More Complex Example + +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/node6.html b/mma/docs/html/tut/node6.html new file mode 100644 index 0000000..6527c09 --- /dev/null +++ b/mma/docs/html/tut/node6.html @@ -0,0 +1,73 @@ + + + + + +About this document ... + + + + + + + + + + + + + + + + +next + +up + +previous +
    + Up: Tutorial + Previous: Library File Creation +
    +
    + + +

    +About this document ... +

    + LOST LOGO + +

    + Tutorial

    +This document was generated using the +LaTeX2HTML translator Version 2002-2-1 (1.71) +

    +Copyright © 1993, 1994, 1995, 1996, +Nikos Drakos, +Computer Based Learning Unit, University of Leeds. +
    +Copyright © 1997, 1998, 1999, +Ross Moore, +Mathematics Department, Macquarie University, Sydney. +

    +The command line arguments were:
    + latex2html -split +1 -dir html -no_math -no_footnode -local_icons -up_url ../mma.html -up_title 'Main MMA Reference' mma-tutorial.tex +

    +The translation was initiated by Bob on 2006-10-15 +


    +
    +Bob +2006-10-15 +
    + + diff --git a/mma/docs/html/tut/prev.png b/mma/docs/html/tut/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..e60b8b4073572dcd83b07c60b082ea6e2ba394c9 GIT binary patch literal 279 zcmV+y0qFjTP)fWJ4@hJr9=)Yx5|PDs2VC9?nk002ovPDHLkV1i^Ya=-up literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/prev_g.png b/mma/docs/html/tut/prev_g.png new file mode 100644 index 0000000000000000000000000000000000000000..476d9568c900e2ada6c2019b67eeee166a5f1288 GIT binary patch literal 327 zcmV-N0l5B&P)18~ zIpil5yY|hg&aw;rvXQ~olHp&x|G5Aw{ug* Z|8M28X+2RX!WaMm002ovPDHLkV1gF^iYx#C literal 0 HcmV?d00001 diff --git a/mma/docs/html/tut/up.png b/mma/docs/html/tut/up.png new file mode 100644 index 0000000000000000000000000000000000000000..3937e168f44bc997766dbe3b9383bd1db44f094d GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h#LU3J`0lmo0U(Dbz$e6Y|Ni~?`T5VEKaXZ$ zILr2UCs3TRB*-tA!Qt7BG$5zc)5S5QVoq$YAz!lrkL&!DV=`*aVJGv=2TrrsUKR?`=XF~0x$5q(BOL&qeQ?X^G$FnGH9 KxvXl} zdK0OEP1{-Wruzw6^`?GoP&io z@Rzhbcm!AzII%uoAMAFX?slhlo=>M~;NoQbbLsBWPJ7U~{|G0Wu9(`00p#Hlm-8=ocgU<%oVYqF;~bHzWG(h<-Ps-;d}IBl_cr{xqULkLZ*0 z-{MGLil2P#+0*I0hmUukboO^k(+@g>{evgZ-TnPe=5wTTZ+{ynx5xeioGc*M0-tj5 ziCX7_4>JGL>0^9%?km~U9J1ov*2OtonCWCwGwSVzdYkJh+w4rL4rgb!hqm1FcK$YV z=i&_Gy2H0rz0KdvrsgqQY-LkL#(i~YyQOT!JL)hi7B?>zS%EfPy`}0c(6)ftIi_aW zIrgG$o4S|1;oEzBdo|DaGc`|R@N7TxKLft!tf0`a9H0Qpe}v+7%Lj@$a#t*;0v9xS zg}Ozn*MqYNcg^wu`nz;XEp}FRmQ}pFhC*ubw16?c!z_o+HGRIy!@w<}D3!Gcs}Nb< zzN+Wp&|OwmXBqC2c4oL>F%)B_e(tadSTwn8Lh2?4j5=~FJn{VlRv9aXRw31C@u71K zH0kCl#dT&FSL3zR3A^%k82emz6|k-u4~3ep*rNZTv#P_(D!-#!DhkURppd8%oV>t+ zT{V*BKW6zC?lsjM+x5N_i?&H96bLHAPg*~6!u zLFWJU?PGku(zLzA4iYSh+^gnX{($J9Rc$ zVW_Y}hBBj0H>o0{GubAq!Va2el1-|bu^lyE<)5rFJp+?dN9D-&V!JL>x_8RD=Q`{N zc175JWY^hsq=)fg=LS`ZdC$yJNo;?Vg?$?5EG$dg(?f-c$*+g7l_641hw`jpEw(+j zp4bf*UNb5-V6QQPwIjR1RHqGU1{$amBk~#Y8f$tum5RfiiAZz=H}zUXnJd(Ld9ABg z+sD7SeOqro^Z)jR<8S^T4Y66r`yp;d*VIdogqP=+`We6Aw@Q4JUVl{STE%RIwhG=_WyI>K&uaX$QSPgm|BpA1@uRqpq&?5E z64-GM$(G?Rk`2QOpQ9?m})D-ho^dBe3#oWd#j( zp?!q*QQU>lK0^D%+9%dNvG!5iMXY^d?eqT@vy|%P@oGxgsb1cY_40uZ$s9-X_aRVu0ptm%Mh0gmmnO&D-iQJ|IZ(bE1Cb#FCXK_LH`&55cEIx1018;&-^Oj@xlLp bpAY`a2Yk>c>>q=|*7;UfE*~ow{s;dTJqSuj literal 0 HcmV?d00001 diff --git a/mma/egs/harmony/harmony.mma b/mma/egs/harmony/harmony.mma new file mode 100644 index 0000000..1ccaee4 --- /dev/null +++ b/mma/egs/harmony/harmony.mma @@ -0,0 +1,55 @@ +// A few bars of "Boo Hoo" to show how you can split a +// melody line into parts to use for harmony. + +Tempo 150 + +// This sets up 3 solo tracks, each one shares the same solo +// line. + +AutoSolotracks Solo-1 Solo-2 Solo-3 + +// Create voicing for each solo track. +// Note that '2' and '3' are HarmonyOnly tracks. + +begin Solo-1 + Voice Violin + Volume f + Octave 5 + Articulate 100 +end + +begin Solo-2 + Volume f + Voice Marimba + HarmonyOnly 3above + Mallet Rate=16 Decay=-2 + Octave 5 +end + +begin Solo-3 + Volume f + Voice AltoSax + HarmonyOnly Open + Octave 5 + Articulate 90 +end + +keysig 2b + +// And here's a few bars of melody. + +groove Swing + z z F7#5 {2r;f;} + Bb F+ Bb {1+2.f~;} + Bb F+ Bb + / / Cm7 C#dim {4r;d;e;en;} + Bb / Dbdim {4f;2a;4g;} + F7 / Fm7b5 {1+2.e~;} + F7 Fm7b5 F7 + + +// This could have been done by duplicating the +// solos with repeated {}s: +// Bb F+ Bb {4a;b;c;d;} {4a;b;c;d;} {4a;b;c;d;} +// but it's easier for the computer to do the duplications. + diff --git a/mma/egs/lyrics/twinkle.mid b/mma/egs/lyrics/twinkle.mid new file mode 100644 index 0000000000000000000000000000000000000000..e808afa2850a25e145e2a69796afbf76a4316b1e GIT binary patch literal 5632 zcmc&%TaO$^6+YcF+n4H|wFxA?LN-zqMM|6?BTZ|lR;%gmn!ZgB0gS>`Xu=NO#p~T@ zca4=0+q5l5ks^UWJirq|Jn}P-KXMgTzf9Yp` z?Pq`MXMgW!|LAA$*mvO4g>v`R8;2X;+TL02F0L;>y>WPRd-vMT@`dZy7i|oe2EY6s zJy>(EbmHeX-o%%)`qCfv&i3Kq&Qi~?A`3XOFh^(_jWgz`&xVL z=GNk{(|T?1hMue~_Lnbo`rZD)7hml@7nk_dwO97Ov+TAUZgmsu=HC9!rj`v3_Vj3N zZC~AbzT4Lwvo_nl)~TBdEq6Az7uR8mHe|59tA)d(GuIBTz4p|@`ycUt6{ODp*(3g+ zxcGna|85t*hlaJ6x0a9C=)AJCczt{Ksy1SHaHCruY#(U5t*d*x%M+FyA2C=(&e`2N z+&VhJKEQO@Z8mRo!G3jb_rznYAwDZB`UgAMT0QU@MEm;ghcg26t6PUB3^^G~cNNPn zvxbYEos&;t@A3gB%s6>~^PxTlJ$R8iL>Qb#`45xD!9g3pyFovBvTV;iN$u5VFg}Cv z(eI}re;V@VFh2Jl>rX-c6y(oheD*!okIub>^-J%u{^))0r~g5(KWfj1?f?J#{tr67 z?|1%(>;G|G(0{ltvi%#^+xTBZKOKMD7}J|H{#rMD8N=Pz$6vwlBXj%`h9AB$Uh9WCpb- z3p*;>^IFS}$PAP#Qvne+x{?Go@nz%k#bXP)Vti2 z1~L;-W2dUUphb2{W|+Eh<)vwRHY7JD5zdVioyye1@lS;0#l&ZYl^s_;w9bWO$HX^= zjTb8~EmvAX@QUOT_1HLq+fgo(QmDo%^7b(} zlt6cGD6$HoBwbf?rzqP~5!nfxt4u{sK}J&BN_p6U1ur36kr|~<+?bShMW(9VVkWArJq^bcx$Mhw@ggiwab_BJHY`{W zgFE4ctVNXbwZI4~D2JSy3;_Jdh$HI7V9as;5M0`4=aHGnF_1MTEgAtQlgry(X3^Bka+@M9d8v|^$$eA$e0GnKBou2@b z7{QFmY!udZhhQU(q$WSo+y#twD2))qRAi%_0@Ngp_#N3t5dnXvD;U*?pCg2#vmUPt zY+xUg+EbNR6z#eO6cnTpO_6;%SyQi=wa8pR5PSk?aj_t(r%*zD;!Q^zw8Jj%)>On9STrDU@{p|)dY8`ywBS#anEFgdI@!HYaX8|9 zy~_gR%DPS;h&<*V9eq#?M>|GhsP^%YM)*SybB6tR=HUU5QOG;c5sJ{^#39v zWDYOh++H?Gj^B4f)J<%m}H}HYC#K0hV-$ZB};%AGbe6D7NC%ZnqOVq2-3ovTC#>iPBb0C z)Q@$UE*ogsQNw}mi_&0fYkXC?;3MQ6s15i52E&^hiE`D<>4*x+0BSHIU>|dy%Vbiv zr#0tc!9<{v2J9eI<{;s)0BQqg&}EzeXvx=QegET^$q8s(QV`_6Q~(X83P2n{V-OU! zoR2yZ0FS{K3K~l)hB#;er6Dp{Yc@iXA@5dNjQE9BR07oYn1*EV@*pWRwN2fk7FBvo zZOnOU#za-59-Y6-;e#jLRr!K&QhB@jT*P5j4nJR~BAJ4ruOB z0T7`A7=Jt9#@m3?Em;Y;(6h=gNgY)>xcZ_-Vn>q}*qIslycU50hDm0t%&l_Pf`OXa zlu)JU2oPNZv?xe@IRi`_-$=}38TSK-5C=_HCK?+ywS#OYXi$b0qc{reh;j|igBp+L z!g;g^$Ar&Bl_9`Bu0~YWb>m|sg~#CngQcr*0eE!d12gAn5gaDNs$JJlqT^Vw7qUhj zv%TCA2c@gji#fkNDWs=7sjT(UpK-+#2~=(nA*%xS=>-#qb_Zr&LFHstZdXRM8E{#oNl{I z=GVSCH>3g(9b+bfgB}}Ql@FX-p`k1pb)w7z8o~(h7wc9a@!5F(9gP;bL?=@Ef)Zi?EZ#syU~5}|J;88tQUWp literal 0 HcmV?d00001 diff --git a/mma/egs/lyrics/twinkle.mma b/mma/egs/lyrics/twinkle.mma new file mode 100644 index 0000000..da675f0 --- /dev/null +++ b/mma/egs/lyrics/twinkle.mma @@ -0,0 +1,37 @@ +// Twinkle, Twinkle, Little Star +// Demo to show how to include LYRICs + +Tempo 250 +groove folk + +Repeat + +1 G [Twinkle,] [When the] +2 G [Twinkle] [blazing ] +3 C [little] [sun is] +4 G [star; \n] [gone, \n] +5 Am [How I] [When he ] +6 G [wonder] [nothing] +7 D7 [what you] [shines u-] +8 G [are. \n] [pon. \n] +9 G [Up a-] [then you] +10 D7 [bove the] [show your] +11 G [world so] [little] +12 D [high, \n] [light, \n] +13 G [Like a] [Twinkle, ] +14 D7 [diamond] [twinkle,] +15 G [in the] [all the] +16 D7 [sky! \n] [night. \n] +17 G [Twinkle,] +18 G [twinkle] +19 C [Little] +20 G [star, \n] +21 Am [How I] +22 G [wonder] +23 D7 [what you] +24 G [are. \n \n] + +Lyric Verse=Inc +RepeatEnd + + diff --git a/mma/egs/lyrics/twinkle1.mid b/mma/egs/lyrics/twinkle1.mid new file mode 100644 index 0000000000000000000000000000000000000000..f5668dc9a5342d4cc51e8a4c8213294731a744ea GIT binary patch literal 5724 zcmc&%TaO$^6|SC{?XJGeZWkD^et+gr}-LbvxJZJKbE~+GLE` z%whxfujcapHO2-$yKg;~?Jwqsi_P^bZ?8AaS6*TF`);#1oL}Cbzj=+_|7zd))jGTX z#$eEUm9r0iz?hdX=QZ}>YWADe?6<4g?^d(luV#N(&HlKW{b@D(^J?~&)$FgU+22;P zzprNhSk3;qntk9L!K4et?prqw*T1*Dv)G+qUwnD}@aFdJwVlP6Ub%jK-X*Z9|LY&J z`)lrHBY%1Q9=`bUOMf^!+lPlc3q7|F4(Iz~{ax(od3qSAy_@E{(1UYxZ+COCuXnHA z+?pSnU2pH*(37?K{^Aw0-<x^ zcXm#P!r7$@PN{MF0{)o>gWdlkGmy}K9Q8j)=LZK}^3gi``Ex~g?m5<7eF5VO7$5z9 z9`ffQe+lDDAG3ZD@{5qai1EdbS$}ZvC9GfinDs~B`=tG!_WGmxeAf2=zu*6~{rgGx zf426Y)P+@1T}=0HTaHz@cy0g0>j-q;}XNW{qZ;H>uCIK497>~ zD>U31Z_(P?!)x!~8h;DIA6erH1CG^!&-uxW@3VH7-ba zTc7*s(fBI9j^7!7*Q~uxYj?C^c!+i$-_h@3i`J#5Z+Y+bcus3axiiv zH{FF0SwS)Ahm9kOATB9=AcCzdtv%Uzs&Y%!J(e<0GQ7yr%q>|@Lfn-C3;@)U;CR$=WMR5ImVTGC_r(qYAfYT5V zPc)t>R(PAIB?Uk>fy!*C_PEvq(t%=j$p*4=RqnyTaMuXhq_w4Jd#_}U%7GCUKlM7e? zs3Gb+DyY^H;EC#>Er7_5rUTrSpp=nBS_B~KMY)$`PS$qMY5>p(CjCU|yEJlOS6{Ti zCQiGwUIc1{v>L9A60VSVaTwROQ33^J6D(8#fi2v57_jCjxI9HigTT0tt&HM)r2&FAS^HtM%o}P zeX4D_T=3!+Xy&9-EO@d-7I%+5z^2}YBs2@BzEH=X-$3&7h_e&)=AzUh;4-p6#{?w} zzQA)QVRALKIY~Z5`XE<0I3Q|?Rg%I7LqP=6^5MrQ^OB1EXsC@x8LoGe#y3f3cJ;)J zlecG-KF~{tsSV=dgd8AZ6ih{_xT0KeHFj|vMC5=Y$UBf0kEY;L$^xVhUa%$#3L}k) zv|KG>6BR_IlYmSoEQpvxyK;zl0=U#7*u+Ewy@uddc!COPNo}={97eg}MORG8?6}ot z>sWY#Y}BgaMdL!$Lp%jIxN?x4Rj5rU}?CTSRyt3k|9U4fc6Qq2Go(ok7*0 zHi(EVKsjONkRKl+e->sVD#MEO0<{r7hovJLYA2xt2$0%IDpr);l)45KE7E9?N-j%J zHAJ3IXs@^$5kR4RIkQzgf`XtnJZvbO>h*> zzo#?2aIy)dVKK7iu}>P0GC}fK0p#`BuHOSF*@J})J6v*i3AVQI*`@z=TPms zF$3ja3QI1U5i$vnz&1b3kx915iL^{>g5&*AqK8J0NRPlN$Z;eW3Wu`t zt9$Hzl-o%g0IncHyX!|Y9OMbQXGw5{T~GquGx%Z%k)hln0TD{2p%`iAl;mPUp1hUxQXbH`zyekfB NTi4ixbfN#b{{mF%l^_5B literal 0 HcmV?d00001 diff --git a/mma/egs/lyrics/twinkle1.mma b/mma/egs/lyrics/twinkle1.mma new file mode 100644 index 0000000..8e30c8d --- /dev/null +++ b/mma/egs/lyrics/twinkle1.mma @@ -0,0 +1,74 @@ +// Twinkle, Twinkle, Little Star +// Demo to show how to include LYRICS + +// This is different from the twinkle.mma file. +// Lyrics are notappended to data lines here, rather +// they are defined in a block. NOTE: We do the LYRICS commands +// inside the repeat block...this way they get processed 2x, and +// this is how we get different lyrics for verses 1 and 2. +// Also note the syntax: If have more than a single verse the []s +// are needed; for a single verse the []s are optional. + +Tempo 250 +groove folk + +Repeat + +Begin Lyric Set + [Twinkle,] [When the] + [Twinkle] [blazing ] + [little] [sun is] + [star; \n] [gone, \n] + [How I] [When he ] + [wonder] [nothing] + [what you] [shines u-] + [are. \n] [pon. \n] + [Up a-] [then you] + [bove the] [show your] + [world so] [little] + [high, \n] [light, \n] + [Like a] [Twinkle, ] + [diamond] [twinkle,] + [in the] [all the] + [sky! \n] [night. \n] + Twinkle, + twinkle + Little + star, \n + How I + wonder + what you + are. \n \n +End + + +1 G +2 G +3 C +4 G +5 Am +6 G +7 D7 +8 G +9 G +10 D7 +11 G +12 D +13 G +14 D7 +15 G +16 D7 +17 G +18 G +19 C +20 G +21 Am +22 G +23 D7 +24 G + +Lyric Verse=Inc +RepeatEnd + + + diff --git a/mma/egs/lyrics/twinkle2.mid b/mma/egs/lyrics/twinkle2.mid new file mode 100644 index 0000000000000000000000000000000000000000..9cc5cedac3ed0aa850d537246ad97e718f746bf7 GIT binary patch literal 5689 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 Bi=F@g literal 0 HcmV?d00001 diff --git a/mma/egs/lyrics/twinkle2.mma b/mma/egs/lyrics/twinkle2.mma new file mode 100644 index 0000000..acad671 --- /dev/null +++ b/mma/egs/lyrics/twinkle2.mma @@ -0,0 +1,107 @@ +// Twinkle, Twinkle, Little Star +// Yet another lyric AND macro demo. If you compile +// this with the -r command line flag you'll see the +// lyrics being assigned to the proper chord lines :) + +// Set the tempo, etc. + +Tempo 250 +Groove Folk + +// Create a macro with the chords... we'll use this +// instead of fooling with repeats. + +Mset Chords + 1 G + 2 G + 3 C + 4 G + 5 Am + 6 G + 7 D7 + 8 G + 9 G + 10 D7 + 11 G + 12 D + 13 G + 14 D7 + 15 G + 16 D7 + 17 G + 18 G + 19 C + 20 G + 21 Am + 22 G + 23 D7 + 24 G +EndMset + +// Verse 1. Here we push the entire lryic set for verse 1 +// on the stack. + +Begin Lyric Set + Twinkle, + Twinkle + little + star; \n + How I + wonder + what you + are. \n + Up a- + bove the + world so + high, \n + Like a + diamond + in the + sky! \n + Twinkle, + twinkle + Little + star, \n + How I + wonder + what you + are. \n \n +End + +$Chords // Expand macro for the chords, 1st verse + +Lyric Verse=Inc // set lyric counter to '2' + +Begin Lyric Set // lyrics for verse 2 + When the + blazing + sun is + gone, \n + When he + nothing + shines u- + pon. \n + then you + show your + little + light, \n + Twinkle, + twinkle, + all the + night. \n + Twinkle, + twinkle + Little + star, \n + How I + wonder + what you + are. \n \n +End + +$Chords // Expand macro for the chords, 2nd verse + + + + + diff --git a/mma/egs/lyrics/twinkle3.mid b/mma/egs/lyrics/twinkle3.mid new file mode 100644 index 0000000000000000000000000000000000000000..558ab11a21b0642421356f15fb52de407cc0f5de GIT binary patch literal 3533 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 literal 0 HcmV?d00001 diff --git a/mma/egs/midi-inc/frankie.mma b/mma/egs/midi-inc/frankie.mma new file mode 100644 index 0000000..181ed49 --- /dev/null +++ b/mma/egs/midi-inc/frankie.mma @@ -0,0 +1,80 @@ + +// The tempo is different from both include midi files. + +tempo 115 + +// We could use a different rhythm, and we do change later. + +Groove Foxtrot + +// First solo voice is track 'SOLO'. This does a number of things: +// - it creates a track (although MIDIINC would do that as well), +// - it sets a voicing (TenorSax) + +Solo Voice Tenorsax + +// Include the recorded MIDI. In the recording the +// notes are all channel 1. The command 'Solo=1' copies +// the notes from channel 1 to the SOLO track. Also, +// we change the volume and the octave. + +midiInc file=rec1.mid Solo=1 Volume=70 octave=-1 + +// Generate the accomp. + + C * 4 + F * 3 + C + G7 * 2 + C + +// Grab the 1 bar drum solo we recorded. The drum was played on +// with the keyboard set to a drum kit. And it was recorded on +// channel 1. We add in the 'transpose=0' to over-ride any +// global tranpose which might be in effect since we don't want +// drum tones moved. Note how this include overlays the last bar +// of the solo we included above and that we've turned off +// the chords and drums in the next bar as well. + +midiInc file=drum.mid Drum=1 Transpose=0 Volume=80 + + z! + +// Now do all this over with the 2nd recorded track. This +// is the one with the funky vibratos, etc. Make it a clarinet. + +Solo-Clr Voice Clarinet + +Groove EasySwing + +midiInc file=rec2.mid Solo-Clr=1 Volume=90 + + C * 4 + F * 3 + C + G7 * 2 + C * 2 + +// Third chorus. We take our recording and change the voicings. +// rec1.mid is played by an alto and rec2.mid is played by vibs. +// Note that this time we're doing a duet. + +Groove Blues + +Solo Voice Altosax +Solo-Clr Voice Vibraphone + +midiInc file=rec1.mid Solo=1 Volume=70 +midiInc file=rec1.mid Solo-Clr=1 Volume=100 + + C * 4 + F * 3 + C + G7 * 2 +Groove BluesEnd +Seq 3 + C + / z! + + + diff --git a/mma/egs/midi-inc/rec1.mid b/mma/egs/midi-inc/rec1.mid new file mode 100644 index 0000000000000000000000000000000000000000..5bf27224afc9902f57af5898f780751b89fe6a26 GIT binary patch literal 596 zcmW+z?@y9Z7(MU%A~;><<_fb9sfGPOfzez|ZV&f%_r#se5EGIj)HFa)KoSseZtwcq zhyI2Blm0Wh^x@ggo^#H#J?HG~*G>Th?Kt?mv)^d|E@7PWLVuPqJ_rQd#pz$c-{K@8 zkf-)b!gD!%A|bfiVZ77j4UGlPrWk!uiwP8E{G-I7I*%!Yb!APXC_cXsnA16{^dE>% zYXTK&CJ1-r>59ZLe|4$g%DtRKgfT_f(p85_>l*XCyG58`jKr~jPasZ%H-x0@4kR>H zURzF9QWAbpmGa8^h6ft!d=q1kspk!1+qIi*tn%o31(Y)Zu-D5F?o>5gY^Lq1@BVBCvkFaB@c7K$o3q-m?xr+^xVRLMRNo|oJ*#{-W$J+e9}+s~`}e+at@%0ZT;H`LV(y e*=tB7Xp|!)M6V%mq+6S|SXW%zVt;1Gar^^9B7lMb literal 0 HcmV?d00001 diff --git a/mma/egs/midi-inc/rec2.mid b/mma/egs/midi-inc/rec2.mid new file mode 100644 index 0000000000000000000000000000000000000000..6a294fb70b7d89705a6b21298eea34c5c1ba94b8 GIT binary patch literal 825 zcmY+C-A)rh9L3M>OhAMS6C_Z-fG8ya%7+M&X53C0h8_B~Efgt=6cD6<#^{BS%dP0G zd*yQwpMW>;!WU?G5&X}V7`@uvnK|eGJ7>07ZR`W+fCGk$V)f$*eci@Yg>{Wy;Ht*C zJ8#Z@3K&?$E4C{@wMq1T|6lO)e zA}}tt!qanSJ$&O}KN7V1GB2OZlFYAMnl+TsMQ?)gx@LK04H3mt=B5@MV zojW*7l2&9l{45sK`hdcyemAU9HH9!~kjz!)a_Bd^^9C7xG@>zN0;YG5G?+o3K6Xu` zq~Xv>eFAg1t>MP+j(Hm6Zy;-bJ&Vkk3N;c}J9wS-*dvchE9E+Sx& zgwsONMV@1YSDP5b^7*TtP7F4VtDa{BvP;xC! z%MQ&kEHlVQkv@2$F|GG*`e~QYTr9_%#Woa+d=kjj4q~zk$(y;VVNw*deXFaqQ79@IKbdVNDYGV6DuuopF)?L#LBN@DkhYrB_RDmIldVT4`>rebDbYJA3<4J8VUHryh3eVIxYnTA>nuD=on96}q%?q8xU+ zN_?c?Bqx<9NX!9NBo+Y65-WhN#4=!Bq6_Ft%mWIEJ|HOtpl6h;5-F>PO9dR&_6a2bYaQ^}B} zsgRPw5tFiH*kf1%%rYG=$1qEAnO={kc@(HP9O&PCNr|u2{F%#@$Z9Zd{}iM-oc3r6SRpWBu*tv4ky8+gLXS`UIJnZX{ymU7`Os%fjcND zsC;Pe>_}pKCkMA*p1jNdm3~hHIDmy5GU>+yz$(I6rDjYjAuZaELdr%JCVwO;QGTpC z1DMOaJrgijg+k6fMEV3Ad$3!Wvlgru)+=ktTCv_(@2n5jnzdnVSv%Gz>x-4z&-#>&sQ#U{@Ks}gT WyFd-7qx{E|qJiw>|JP?Q4!!{sidwD! literal 0 HcmV?d00001 diff --git a/mma/egs/misc/extended-voice.mma b/mma/egs/misc/extended-voice.mma new file mode 100644 index 0000000..e284a2f --- /dev/null +++ b/mma/egs/misc/extended-voice.mma @@ -0,0 +1,64 @@ +Print This demo shows how to get voicing from the different +Print soundbanks in a Casio WK-3000. Similar programming should +Print in other synths. Please list the file and read the comments! +Print + +// First off we create a simple pattern, just chords on 1,3 + +Seqsize 1 +Tempo 120 + +Begin Chord + Channel 1 + Voice Piano1 + Sequence {1 1 90 * 2} +End + +// Now play 1 bar of chords. We should be using the Piano1 voice + +C + +// Now, we change the voice the Casio "70's Jazz Organ". This is listed +// as Voice 444; Bank 65, Voice 17. Other synths will use different +// values. For example, the Yamaha use BankLSB and Bank (CC#20 and #00) +// for their extended voices. You'll have to read the fine manuals. + +Begin Chord + MidiClear 0 Bank 51 + MidiVoice {0 Bank 65} + Voice 17 +End + +C + + +// End of file. Note that the command to reset the sound bank back +// to the default of 51 WILL be in the generated MIDI file. But, +// the syth will most likely still be in "jazz organ" mode. + +// To reset to a default piano we could do something as simple +// the following segment. Everything is needed! +// - The 'Delete' command ends the track and issues the MidiClear +// code (as would just ending the file, +// - The Channel command is needed a 2nd time. MMA always tries to +// allocate from the top (channel 16) down. ChannelPref could have +// been used to avoid this. +// - The voice has to set, it's still at '17' +// - The sequence is a dummy sixteenth note chord with no volume. +// - The chord is needed since MMA will not issue the VOICE command +// - until something is sounded. + +// Set RESET // Uncomment this to enable 'reset' + +If Def RESET + Delete Chord + Begin Chord + Channel 1 + Voice Piano1 + Sequence {1 32 0} + End + C +EndIf + + + diff --git a/mma/egs/misc/grooves.mid b/mma/egs/misc/grooves.mid new file mode 100644 index 0000000000000000000000000000000000000000..f56e81e4f6df7c96a70a33745928994ec885c34f GIT binary patch literal 13516 zcmds7Nt0XWb-fQmx7@C>%VjxLA|*8;G&*Rs>6WVGMZyN~NHj!3%_a%5F*l|jIg=tq zYqGb{xHSzu}V*RAb)H}Kd0*vG;5EB6k@ZyxNQ*nQ{3*4F8t*vHB5Y#qEg-o7{9yI~*K zlkJwVMaG$F~lC|HRR~J9mC|aQ`Q_ zZjC45)TK4^D5NTIIdx`y|NbQW_ha_QnTM0Pj7=WoyOX)R{W6g~oYb<`T)A6Wu@~0* zliHeH$qy=dTg1p(27m11j}!Ukq?Wf%X1kKH=d(8_b6NYtcQcrqv1a}{MjX%I;fO}& zHb%UZ{RLNTuUy8ei);9@W|#6eFf5aKOZ)#Uf5iPKe~^8fYfau>yFHm(v&qkW*Jgej zgI~z+am`+4j5Uufzd5NbTj%7B%1L{18DEyIzIds!XfG{2n9MENrut?Q4(se2+%HDbKEOkEZN?F8hu~K3Ky{So1J*jUG1gdo&#;V`M8c zf;GpN5uIi0o!pl-SNX@*;$2yTFH5$wdb6@>$5wAnYO8j6>1t)kPDHVPD}N=j3nR03 zd8MJ)Bf@Jo$RE=245l&mEm=6`zT1lZVpelHD}Bs4w$|gEZhnYi$K9)z{y33GYVvk5 zbCKC_TenYMfvt;Jx(1I;NA>-NaWww}y zEHa0Ty}Nc8MHA`Gz=%6A;&<{`oj7q6yiNZaD+fZs(6QB*e_FklALEZ7<##z}l)3aM zuFaDp#q~06y|j1}wq};#(vo#oo3M4!ZN0G6gsmBmRwI8Cs~yYNeKlHe%%jy?xeW`R zU3-HTH1ll?dDWm%{I-lW;xrd4)CT`*a!-itUknZva}zRtX18$^1!keIKIrm$<1M~X+iEnkh6Ai zC&+GC(Sod{3gGfk}lL>`7!d@V*o7 zV)114fIDKroQGU$br~bOoEToGJ<3$4+QFMqZi}`dIE9M=u!J$#sASzTzV-kcjG03a(EEx# z?C4$qoLo&Y+!5;B+8`VgjdU5F(yxwC7nFD5R7%!%!vmEVz%z{N3nPQvd05hu*8};R zF5NdQfgLYGC}NN|fti-p zY;#S;zsro*I2X|iuVU6nC~B!9SYM7J#GK(8d#oCY_Po3c%3ZA111DgB2eWtxs{$;W zMUKue+S)xCjy(bxHjHAmg)w+3tLSML8AnLTNUuG~NTccwM)nn}ROxOUs}5|a9;)O; zN}O)+H8^-IhoMQ&6|I5ST2t;8#-h+bHfaGKDJ1Qw%UyMNF)tTzl0d#RDy^ zcA)i{AlCjN<3rcZM5bnGZ6bUlK=4tjRYdQI_7u*r%1ZZP2GWN&eOT);LAt?jC{lz1 zP|uwsmI~(sP#nw6(!Q5))lro>&f8iCcrbugQ5q@xNj8GBFbn~wZ74}(Py?`9fEb3m zf)-*WPfH`gn^vV{X9opN43PH%p(QAfv0z6vnDWRJcZ0$O5jcG88K@ifhY@4bwOq}u z>Vy1Q!d=UXtFu5F2_XpgkmW#owe)6CI#imN2KhnJPfZEOX8hDizhlp4*%NlR0a!vV-qK)PiPB~LiB1^Na zFtB6t0J;f0eXQpug^H$lY+n&hl6os?{3AG5Vgq;E3Z9M2@nzO2hOi?RtP&;FFRsvlq#O*(XGgq&~I#@symMK(n~2X zKqf}^H8)whF0_*wy3R|ERdkbbPx6mq0A_T=mMPdd)nfsOowE)tR7Hd~8_L=c+MuwheMM979bIpV{2kSWGi_RHHi`q{Tqv4nxFUtQLqtVPo)9za z$ew{}oJ|d3SJj};LhC}$KVkzp-c$AMmaZXj3DuNm&D9YTiXx($k&h|mu`QGWGloVC z{=`?Q-?p$cAM+l%xgwKv#U*}AmyZx7XA)|12u@``sn|BFhgfYSUpRNFoeXSQ+H*?p zdry~&P6&54D6xkrH|dJ>&$a(D0Ddj zQc8Zc#0I;Ct=JMrR9pNXA(pT_5U8*tx9d{W9Wp*BAH2btMd<1Px8Y5`0ZJpjdW5B( zcOURoSxT&o?tft6RY84&+^C7Mg?(|FpTC0AZDcbk^ft;(L_5jGQ7=~qWlJZlPx>!TGo7J%cX*nM8m^kvr4lyb1N_sccUEi4jYTp|%kU-f3(xa+O zl*X{IE1TKfaD>4u_=q-9ILl|IuS3i$<}DwoYzE;Cx}a1>XqT!C#0-9-++l2QC{_UQ zl+_V=ovJ!IPdO(91?-5<%gDE-n#i%}I|v9_MJW>uoD)*2LDyP-Ch{IJC&kiItRmi% zwLNvrgsMI%a0T>#_J-$1t|9i5t88+c#X z6}C-!m`?F_2-UI2mV|)AU!sUMGw(PrL<|7;UzgdDPH5@rn}ie85;FS^Z0>7<_$pF3;$4FFI5)7tkaxq_nPaC*$zuJX<^3)Kt4i(bQGVU*Ze zstgpO#|x-E+NQ`4NE+;D{3KRyXV0<9m@?>`O~y({c3$N*;FK*>y4{M-3yMHWd>iN% zqVFvj_;;#A-AS?F!WN5nltJ%GI8_;?0&N?}h7?5z4vA0~G7Q=qLWOk1KU3;N&IztG zl2DJKMSUSsP-@U%C%7inF$6<~cOhkM8B3|tQU9AQ69a?%Fvz2J7_qLr=CEbls<9Vz zq2Dk7voMBMv7uvb7p;W44vXOH81{2Dph(QntG~-xb z^C?9jtZEV%JUc)S+@q(V9fC`zsB23d&G|j2vJ6dP;ohTQF7xzF&8*0@RegyWFLns> zsfJfNpM@xEabte|t=6X^c3Y`-!TTh>onAXh0|Xg(%N^260RmkqS#VR!8}}g;64^c*5Bm{b#Nv#?l(>z ztDfTr-XR6>4k_^a7In9l`fNf`4OI0)Y{wDXor!8f90i$&^?7@VDN#tZBZPX+qC2jc zSxN08O~qqx)B&AQfkt(Zp{mkvab0<)q-6Z}3m)EiG7^{K(9K17vcPRTUDln$ylRa< zUGcXe-pKi>yeF%i16yU>-p9XHDJk(!eZjB!4<#yB@7&uzdF8?Ve+xf))jkMU-e=D~ zwPK|eJH2Anm0$4(knmaCz|$!+FcrR^Hrp^;$KZARfiHM*$_IS(Q~O|j#X`>2XAH** zGlSNj<<|`PgHesY}5ty?<8vCfv)Yw56-uGVH>)ze`;U9C4^=Xz}cwpVMb zq5W{(@cg~$gwk}0$%Rw3bg7m;t!08!mM&TPG#Agze5fN;r|Jt~9-r)VJ-t!Sl(-(= z<6qNo{DwX61Xmu#XjK7XK&MfdjnO0uw!UTl4>^$mT&7u` zK)b}=WgMQLNbzh!AH(M760;bYgASXY(WCqC5E>v>jJrLKagrCDPb3iM($SfciOSbn zRN!VbQAAOnC6>Mx2rRhT0}cLWsprZ6DMcP(^h4xWl4~aIzh&#ch+OS?6O|xaUbhz{ z6F*ImeQTk+@JUthnUdiDIcSmgsc4^K@XKhx#~Dk|eM}fEKiOKJT6=%0toh=__7vxb zF9BD;e^$OOPpkGRwCi##T%$80wZfNCtzQ|Uvl)+wXy(<-VeT_&^b;Q-^8Ikd)8~1f zM{zd5i3^KEe&f)IgDK9PxIL)7`uNc^F+E0AlFUH4eTv&;AmW#2)k6uMbm&x3t zS5J&uot{u9bMZ-Knmx7J>ET1i>u=1XFQ##4(xP&m*6z0{N8dh=aKMW3wjA2`lv$p- MHth59#tWYR1<(tz!vFvP literal 0 HcmV?d00001 diff --git a/mma/egs/misc/grooves.mma b/mma/egs/misc/grooves.mma new file mode 100644 index 0000000..0632b77 --- /dev/null +++ b/mma/egs/misc/grooves.mma @@ -0,0 +1,73 @@ +// Demo to show different GROOVE options. +// This assumes that the library file bossanova.mma is installed. + +// I've just stolen a few bars from 'A Day In The Life Of A Fool' for this. + +// Start off with a short intro. This just sets the rhythm to +// a bossa intro. + +Tempo 120 + +Print +Print Plain, single selection. + +Groove BossaNovaIntro +Print Bar $_BarNum Groove $_Groove + +1 Am +2 Bm7&5 / E7&9 +3 Am +4 Bm7&5 + +// Now show the selection method for grooves. +// This does 5 repeats with different grooves. + +Print +Print Count Groove Selection. + +Set Count 1 +Repeat +Groove $Count BossaNova BossaNovaSus / BossaNova1Sus +Print Bar $_BarNum Groove $_Groove + +5 Am +6 Bm7&5 / E7&9 +7 Am +8 Bm7&5 / E7&9 +9 Am +10 Dm7 / G7 +11 CM7 + +Inc Count +RepeatEnd 5 + +// Now do the goofy changes between bars. + +Print +Print Per bar Groove Selection. + +Groove BossaNovaFill BossaNovaSus BossaNovaFill BossaNova1Sus + +Print Bar $_BarNum Groove $_Groove +12 Am + +Print Bar $_BarNum Groove $_Groove +13 Bm7&5 / E7&9 + +Print Bar $_BarNum Groove $_Groove +14 A + +Print Bar $_BarNum Groove $_Groove +15 Bm7&5 / E7&9 + +Print Bar $_BarNum Groove $_Groove +16 Am + +Print Bar $_BarNum Groove $_Groove +17 Bm7&5 / E7&9 + +Print Bar $_BarNum Groove $_Groove +18 Am + +Print Bar $_BarNum Groove $_Groove +19 Bm7&5 / E7&9 diff --git a/mma/egs/misc/macros-all.mma b/mma/egs/misc/macros-all.mma new file mode 100644 index 0000000..9662197 --- /dev/null +++ b/mma/egs/misc/macros-all.mma @@ -0,0 +1,81 @@ + +Print A demo which shows all possible builtin macros. +Print +Print NOTE: This should be updated as new system macros are added. +Print NOTE: Bob--don't forget! +Print +Groove Rhumba + +// Push a nice little string onto the Stack for later +StackValue This message was pushed onto the stack. + +Print We've loaded in the Rhumba Groove so we have stuff to display. +Print +Print First, the global (non-track) settings: + +Print Keysig: $_Keysig +Print Time: $_TIME +Print Tempo: $_Tempo +Print Volume: $_Volume +Print VolumeRatio: $_VolumeRatio +Print LastVolume: $_LastVolume +Print Groove: $_Groove +Print LastGroove: $_LastGroove +Print SeqRnd: $_SeqRnd +Print SeqSize: $_SeqSize +Print SwingMode: $_SwingMode +Print Transpose: $_Transpose +Print Debug: $_Debug +Print LastDebug: $_LastDebug +Print VExpand: $_Vexpand +Print MIDISplit: $_MIDISplit +Print SeqRndWeight: $_SeqRndWeight +Print AutoLibPath: $_AutoLibPath +Print LibPath: $_LibPath +Print IncPath: $_IncPath +Print VoiceTr: $_VoiceTr +Print ToneTr: $_ToneTr +Print OutPath: $_OutPath +Print BarNum: $_BarNum +Print LineNum: $_LineNum +Print Lyric: $_Lyric + +Print +Print Now the setting for the Chord Track: +print Accent: $_Chord_Accent +print Articulate: $_Chord_Articulate +print Compress: $_Chord_Compress +Print Direction: $_Chord_direction +Print DupRoot: $_Chord_DupRoot +Print Harmony: $_Chord_Harmony +Print HarmonyVolume: $_Chord_HarmonyVolume +Print Invert: $_CHord_Invert +Print Limit: $_Chord_Limit +Print Octave: $_Chord_Octave +Print Range: $_Chord_Range +Print RSkip: $_Chord_Rskip +Print RTime: $_Chord_Rtime +Print RVolume: $_Chord_RVolume +Print SeqRnd: $_Chord_SeqRnd +Print SeqRndWeight: $_Chord_SeqRndWeight +Print Span: $_Chord_Span +Print Strum: $_Chord_Strum +Print Unify: $_Chord_Unify +Print Voice: $_Chord_Voice +Print Voicing: $_Chord_Voicing +Print Volume: $_CHord_Volume + +Print +Print TONE only applies in Drum tracks: +Print Drum-HH-TONE: $_Drum-HH_Tone + +Print +Print Mallet only applies to Solo Tracks: +Begin Solo + Mallet Rate=8 Decay=-15 +End +Print Mallet: $_Solo_Mallet +Print + +Print We pushed a message onto the stack earlier... $_StackValue +print \ No newline at end of file diff --git a/mma/egs/misc/macros.mid b/mma/egs/misc/macros.mid new file mode 100644 index 0000000000000000000000000000000000000000..761b805e843d9b11db7bd255ea271e00b3419b1c GIT binary patch literal 978 zcmd7QyGp}Q7zglwnzT_7T!Mqs*;|@eT4U`Jsf$BEA%mPPHjzqAE5~#Y2g%~#OBCOr z-tU(;@R8y%!q-8k;Lz>I|8Nf9<+xrq08oMg6(6oAdVsQsR9R??(2v7_?H)7NU9Tcl zXWcONJ>hqHNViq}f+5|}w1PE*@d+^JK;Ob8>56nsx*^???nw8f2htuhzKcZ=Pwv!ezxXK#jFx$X?wp0ZFXmK4)z_mufkNx9*5JY{~qq&z|}bK+mkj}zGz z|8ur8f2!>QudN)Fc04L=vUSvli}JIKM9pE|VO`^yq`D@@oNP^zNqS$CV@|gIH4}pK z;Cr#gmSB2V?2h_<5l?g*`amfrSch?AVO*6iF#!?&{$Hg zbVy>Q%ODFvX+*fvWmK4lE0sO^3drTrnIsWPYamzrxhNV<5TVopp`&Pq1&tA|bVy>Q zWsq~D=V(N@(lRQ{!OU$iR_dq5F-@Xoy%N zUFa?hSDwh!rVOW>@ZCpMx)H*O%+A3sZT9IfmgU-0nph)ku%8Hn-8u1Ur#5BTNDHb3 iYN2YyS6JA{>>OGRdJP79Q*rGnP5Tp>(L@ga0e%5tGwfFY literal 0 HcmV?d00001 diff --git a/mma/egs/misc/volumes.mma b/mma/egs/misc/volumes.mma new file mode 100644 index 0000000..f474754 --- /dev/null +++ b/mma/egs/misc/volumes.mma @@ -0,0 +1,105 @@ +// Demo file to show effects of different volume/ratio settings + + +Print +Print This file generates a few chords and solo notes. +Print Not much in the way of nice music, but the idea +Print is to demo how different volume combinations work. +Print +Print For all of this we are going to use a CHORD pattern +Print simply defined as 4 quarter notes. + +Begin Chord + // No Volume ... use default of "M" + Sequence {1 1 90 * 4} // simple 4 quarters + Voice JazzGuitar + Octave 5 + Articulate 80 +End + +Print +Print First off, just pay a bar of C chord. +Print + + C +BeatAdjust 1 + +Print Now, apply a crescendo from PP to FF over 4 bars +Print + +Cresc pp ff 4 + +Repeat +Print Volume == $_Volume + C +RepeatEnd 4 +BeatAdjust 1 + +Print +Print Now, we add a solo line. This is just a bit of mary's lamb +Print To be way too cute, we include the volume settings as lyric events. +Print Look at the source ... it's all done with macros :) + +Lyric Split=Bar +Vexpand Off +Set Vo Main $_Volume Solo $_Solo_Volume +Mset Mary + F {4a;g;f;g;} [ Volume Ratio $_VolumeRatio $Vo ] + / {4a; ; 2;} [ $Vo ] + C7 {4g; ; 2;} [ $Vo ] + F {4a; c+; 2;} [ $Vo ] + BeatAdjust 1 +EndMset +Vexpand On + +Begin Solo + Voice Trumpet + Articulate 90 + Harmony Open + Octave 5 +End + + +Volume M +Solo Volume Mf + +$Mary + +Print +Print Now, the same but with a different volume ratio ... +Print The ratio of 80 gives the track setting in Solo more beef + +AdjustVolume ratio=80 + +$Mary + +Print +Print Opposing Cresc and Decresc with normal ratio restored. + +AdjustVolume Ratio=60 + +Solo Cresc p f 4 +Decresc f p 4 + +$Mary + +Print +Print Same with the track ratio increased + +AdjustVolume Ratio=80 + +Solo Cresc p f 4 +Decresc f p 4 + +$Mary + +Print +Print Finally, with the track volume set to 40 + +AdjustVolume Ratio=60 + +Solo Cresc p f 4 +Decresc f p 4 + +$Mary + diff --git a/mma/egs/mkall b/mma/egs/mkall new file mode 100755 index 0000000..3e46bac --- /dev/null +++ b/mma/egs/mkall @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import os + +def doit(): + for f in os.listdir('.'): + if os.path.isdir(f): + os.chdir(f) + doit() + os.chdir("..") + else: + if f.endswith('.mma'): + os.system("mma %s" % f) + +doit() + + + + + + + diff --git a/mma/egs/riffs/riffs.mid b/mma/egs/riffs/riffs.mid new file mode 100644 index 0000000000000000000000000000000000000000..500ee76bb020e573141df845b267ca4da5125729 GIT binary patch literal 2084 zcmaJ>U2hXd6g{(c5>kW+d2*#f7B|Rs<8EA>#m=nR_1cbOh#kY)YJh?q(-<6+0CfP> zqymkpl9%$-m!f{D|A2mf()O)I{gV2Bs`Sn*UDB7n%$_@Q?>T4g-rZ`WvjSik414fX zwb8o*un>0G{z9+ay3tLtEYge#yIyCaJj-4~%u$J6|hnv7N zIgFgbCjt62K%WKZ^8kGjpf3aTRe-(@&^H14HbCD6==%UY3eXP$`Y}KcNAA*%G-Wmo|*`^_Ixdh4#Mw@NMjz)&2%{rs1~&%XIH>zO}J&Klh71 z^lofXBw`RHu);wAaqZpG><|748f7`D&E8|wUg zlIoMYbhI(4Q|#Sb7rDp4gX%d}#o%t`9IMbnMZ!^$aQ+)TM(BaZnPtKQvvA8w(mH3o zOzWn?dCy`V!qyD!ykSk#TCk4NdfN)qn)hbuG^9>NS{;j$N4ZbDHR$xl8S~M(pcEKV_{xpg>06jRC_ea zD@aTl!b<63C!_KFpq@gQ&N(JiI^#7)9bBRkN_G%+XPJ43Wf$-Do$`yd=y9@! zYz1>JcOds&X%=(DYaE7KLx~U0s*a$9=iT&(IiY1w3{JTiF`-fB(|_B~^k(e8|^{{Zv!qJjVb literal 0 HcmV?d00001 diff --git a/mma/egs/riffs/riffs.mma b/mma/egs/riffs/riffs.mma new file mode 100644 index 0000000..a4e42da --- /dev/null +++ b/mma/egs/riffs/riffs.mma @@ -0,0 +1,76 @@ +// Demo file for RIFFS. + +// This is just the 4 bar intro a few lines from the +// song "As Time Goes By". + +// Set up the time, do a metronome and set the key signature +Tempo 80 +Groove Metronome2-4 + z * 2 + +Keysig 3b + +// The initial groove is SlowJazz1Sus. This has a arpeggio in it +// which we overwrite. The 'RIFFS' set up an 8 note arp. for the +// first bar, 1/4s for the 2nd and 1/2s for 3 and 4. We also change +// the voicing and use some midi trickery. + +Groove SlowJazz1Sus + +Begin Arpeggio + Volume f + Voice Strings + Articulate 75 + MidiVoice {1 ReleaseTime 80 } + MidiClear 1 ReleaseTime 0 + + Begin Riff + 1 1 90 * 8 + 1 1 90 * 4 + 1 1 90 * 2 + 1 1 90 * 2 + End +End + +// The 'SOLO' is apreggio sounding, but done as a melody line. +// This is supposed to contrast with the auto arpeggios above. +// Again, we use RIFFS to define for the 4 bars. + +Begin Solo + Voice Piano1 + Volume mf + Harmony 2Above + Accent 1 10 3 10 + Articulate 99 + + Begin Riff + 8e;f;g;a;b;a;g;f; + 8e;f;g;a;4g;f; + 8f;g;a;b;4a;f; + 2.e; + End +End + +1 Eb +2 Abm +3 Bb7 +4 Eb + +// We've used up the SOLO and ARPEGGIO RIFF lines. +// The DELETE forces the MIDICLEAR as well, but it's not +// really needed here. Just a neat place to do it. + +Delete Solo Arpeggio + +// Now, normal chording. + +Groove SlowJazz + +5 Fm7 / Bb7 +6 Bbm6 / Bb7 +7 Eb Bb+ Eb +8 / / / Gm +9 F7 +10 Bb7sus4 Bb7 Fm7 Bb7 + +// ....... much more chording. diff --git a/mma/egs/rndset/rndchords.mid b/mma/egs/rndset/rndchords.mid new file mode 100644 index 0000000000000000000000000000000000000000..695ca0c111f355ef7ef1fe12b2cab9f8a4822ed8 GIT binary patch literal 4416 zcmds3OK%(36+U;!p<@SV7g-dD(@@F`1!x9Hwdo>}$QgNbZI38QrY(^}4oQ(BsYeyb zF=ZEZQ$Uz)e?hw{`VZ3g`>{+{{YmO~&Lt`K1sFj#?e6m4d%pXf?|kPBYx}1oA}Wxg zJpHw{KRG8X=|+7$nv4f8$D^gA*Gsk9=7)5XyIUK-9PCd9!*jZ+=kEM;iEfg7-dcN$ zKL3p9UPyPI(9htKZL8f0(cSIA8r~zWVcg z^_ThT^E=l_>6`K8r>|Zv9iM$Nz8qYPKVF(#j)tetC!?zmFD?dIh@=WXyiYgZqNxrD z%H>4-u_r&j+ z->ZmRrKfA>(HgzKwwuLk)LQLCtF-K%G3LJi44C)*bH+^FJzy@I*LM9rPCoFT@JZX< zk=G3R5B!m!f47KNij=)xImiktlzrxYhcTb}r-)nvB}8`Ir-&@NSHkQ2epe!2nKz#K z9o#JX7ko2uySVwj`+_l2zlM`<`1^da?>@)L2PT*1+7WVDUPH_p)mKlDOVOQh%rk!< zF|L2YF%9<|G4B;$XK|4lE4^rimRI(&c!i!6Pop9&xj1nt@e|>CXkzM!xh=!pZ*v*8 zCa*5C@NYyv)(r|zsCuY0QAkuJ%ZZdjRMM(MJw3vHr!rI(vh+39%6q6hYB(BqtkMIe zj}c2H;_xb|AXNdSPEC0`KTR3=mTD@z;1u{3&M}p@azO$#C7Gt7r0HlX?J3Q+X=>XFh+ z2|I~CBuHVh2*%6}Izy$>BV^GMZOM5EJ~?lfwJIM%rEYizCYE3}qzX9zngUfR6@@L` z2COBDb@hP4F~5Q+=Mm6ax`CgEOkn_ce# z=UeGRvAk%WK!>0!lI}7T%E2l3*i>+!w@u{%Lb!;6qjZA(BpiuWUB(n|Fi)0?qf+sb z(k*fx<0ruTI>o}mTVTl6!Vc?j0IFb!*vb{LZm#M!sIPB`x#(m3&~dha z14_IZ9wEwfXwP(?7Ym8eF%8fPwCijBI zsBJad1=yOznUKkJt1uTRp=|m;HnQAtCcgo~y?xJP@g||cszyhD_(iUDc ziWSN!I4E&ATLM~z#{joQ=Qira&bggt9qA@c0S1t~`r!%g8}C`p4kO4by~-J@;obKB ztk-IIJ&~R@zAZ@Y8b({M3MK7w!mPwUEu#-!WN~B~i&ibsrw@72tvVqLH=H`u(QPK| zY_m#of9fBp^`X4d5+^9>HCu2xP%;=Ag{f5KiioQlq63wW!KZ*Z>BW45LY?(;y@C*Z%dqnuaMLB&8STp?$D@*#z zs+@vSJ7_^+o)7pe3jdts+rjIQ-P^+^p>mr3k8;8LKKsV4|Q54{GC&ZC>Z5k~-@bs5heQ}-sf zIhvih-G0%WN7AI|{g|75I;;7cjt;_2cmw(7WCC|&b{UmOaz7An6o^YxdEl(^TDj&8^|F)wO!AhI*_LFTj3AKwDtADAgEOlEz`T`-$M9l~c3 zG-hAM+dofs4}YHQi2vng;osl2e-b8klw@yXhD5Zo5#NjAtgu1%_($Ci>vmLcY!Ge4 zHpC5MT%sthY!H58{Wadl=Iu_lJKJIya|^KMmLLHYNB{;>{Xbk<+)8Xi@86*oZ+&T= zo3X7WU3(M8Am+Ilr<`sbJG5E1wPCn${4Wu2&QNe!Uq7UGMB)Es_10s%!fK)RnOY|s zoduC1T3$G)uM@4;aYU7wo~G#kE#RM#Hr`y@{|}eGBdrukXMNRuw3*mCk){zZ`^Nfj zPmPW8u-B)Z&elg~;J>5vwcKH^N(}eD?0lsR*Au&v*dU2n^k(j0V+rl3E1H{^Rq&?f(+ugapdvoT-+cRrxjT9cmj;`(A-?_54^YR@$ z3Sx&pn8BlNJg#Ss;KK*NF$afzd^Fkpbh7)|WcTyQ?iZ8YFDJW?C%a!wcE6tNelywq zcC!23WcT~Y?hljQA1AvH5C4EEJ=b~d-kbMlUU~I#4hUcScT> z(2rDNAN?@;{j}=`Gvj#wpY>^RkMA9X|J{E_`8>If&PM0s^`QF)oj)0GjN`Mee_o8< z|Geuz3emmKy8i3!$p6zB0tYKJ=$M zjI%b~m1q|)cs#pgYzz%rjB8w0jh_5iOI#i%;7nA zXfeXTtsp4FPQ$E3abN=`Hp3jPnxEBtY`ZN4MHttR&+Ypd0x9NLjJ6dz^y~)2nL@Hk zB;u1qj9`3hgbiAC!Zx5;Irt{Q5Mj@$YHm@IatZPdtv8kDy6tE-4~y!dyr5#fCZlB- ztsABpZOU(OziGUoxfxPHPu*E0l7T|fcO?-`y&g+8NJ!7JlMZfG*jR*->RmseOI zzrriJ*%HnP(#62f%Sq%ZHO(TQmKW)7+-9+uV?V4j&JD$_maHRSIUEs;%A#+jVeBZP z$Z$%)5LHN?x8M|co!Q0Q24ilhyf&#lTWBF3T~$P9YGz&#npjud>ZFMJacYuLzOE65 zl>)2dZB2u)ys4 zgrUGgMJ*6})StXK~+oapNimV4E zS~X)&m5d-UU?K*!my+xhk}Wb!R^>UyVaHXZ)-Gap24;a^$V@j7Nypd-K4M{!?`{|` z!y&OL$y9YjKUkm-_N%$b2vf-d{6#4iyE`yprKEQBQQZW^wr1QTo`EY9BesuCw6qcR zav-INx0BXZ+$O>-$=2 z3FmGDJfxM%$yceUzKXx)R*_Vbka&Uu;dMC!eOu!Dn6mQVxR4=$u9K5`83WBN2u>H* z!xpPBP_r&>v#CpbTFN0xR)fgg?;YK@8Eun|Ngrbv!H^(IMLngHZB@HS4@hQI$)q>8 zth@s74k$Khb^;R(Tvu9!(dXfo%B9P$VRI?v#7(J@#_7u1`NF`qy9f>|GQer0n4}(P z)x*4K$(62;MSLbJe7zf1cpi&ppwBV>7K0FTq+ZRn>94Cvz8T6Sk900MnyR~H2C@x{ zA{d##!c|;#3e+nDGM{gXR0v6Zr#J^h9!h~5O2eDci7z9C8jv=pa}s?Ph3rv#em<&{ zu5hk9dDT-wew^dcpoV334cv^JP^b*WCu9a@$rO%X$hgJ*rkYw>kYxP6Uw~QD>=t3m7r`daQoeQmdmvxBEb)+JM!rt{%fOLn znkyf4b~JtBs`>-wPF7W4GcU37yWrQr2>YXkuV0hy=5>}}@($djN)&FFPzWOYzyMiDqBMOy0Ap~C(@wl9GpO6PF_ChR};(dVh>L1Z3C|EM{s ze}fcHir@Gz(THJOM|=qk5#oJ5Bg7HQU!Z|4A(CU-YzB&r#6H#0s5vglV-6?9_~fH; zE2B*y<5or+`X?Fc9W*;|qZ@Ug32@9Ec!S;JbkK@!uzMV!rEYwIhG@F%ql!jLgzAek zjG9q~tqD^t=&D|5Owv<@q<;4^{1kH(kf>Y6n0=yV*n zMEjXE8VRJ+*=Ei>mPRv&L?OcvC#|w);njN9t7ERYv?ODo<}QnuY%KN%`@>_rN;ettQDTWP@kjE$!3TCXIzVSW38&!!YQZfIe4);M^r~k zS)z&+EWVp8m0Q*N(Gpr!BpjPQ4_dSIKeXKNmT_`**;~a6%NF-NXO33G&N9hwRUpeYa4cW;@_fI;^J6uWKE-OzwwF&-VcW_j=vtyk7{}A|gmGMf a-)$|i7Netfo?g#38!YPWYK{0rp#K4>H4&%) literal 0 HcmV?d00001 diff --git a/mma/egs/rndset/tempo.mma b/mma/egs/rndset/tempo.mma new file mode 100644 index 0000000..4743329 --- /dev/null +++ b/mma/egs/rndset/tempo.mma @@ -0,0 +1,61 @@ +// Sometimes you might want to sounds like a real band, +// complete with all those unpredictable tempo changes :) + +// Yet another stupid example of how you might not want to use rndset. + +// You might want to study this a bit. It shows how to use VExpand + +Tempo 120 // Our base tempo +Set Tp $_Tempo // Save the base tempo in $TP + + +VExpand Off // needed! +Mset RTempo + RndSet Change .96 .97 .98 .99 1 1.01 1.02 1.03 1.04 // Select multiplier + Set T * + $Change // Create string in form *.98 + RndSet Beats 1 2 3 4 5 6 7 8 // Select change duration + Tempo $Tp // Reset to original tempo + Tempo $T $Beats // New tempo + Print Changing Tempo by $Change to $_Tempo over $Beats beats. +EndMSet +VExpand On + +Groove Ballad + +1 G6 / D9 +2 G GM7 G6 + +$RTempo + +3 B9 / F#m6 +4 / + +$RTempo + +5 Em +6 Em7 + +$RTempo + +7 Dm7 / G7 +8 / + +$RTempo + +9 C6 +17 Cm + +$RTempo + +18 G +19 E7 / B7 E7 + +$RTempo + +20 A7 +21 D7 + +$RTempo + +22 G / F9 +23 GM7 / z! diff --git a/mma/egs/scales/scales.mid b/mma/egs/scales/scales.mid new file mode 100644 index 0000000000000000000000000000000000000000..bdec69241614bab83f36ce7c6f3cf59f30d0a578 GIT binary patch literal 3437 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 literal 0 HcmV?d00001 diff --git a/mma/egs/simple/bill-bailey.mma b/mma/egs/simple/bill-bailey.mma new file mode 100644 index 0000000..6ecd13e --- /dev/null +++ b/mma/egs/simple/bill-bailey.mma @@ -0,0 +1,46 @@ + +// Won't You Come Home Bill Baily +// BVDP May 20, 2002 + +Tempo 180 +transpose +2 + +// 2 bar drum intro + +Groove Metronome2-4 + z * 2 + +Groove Dixie // banjos, drums and a 4 bar bass alternation +Volume mp + +Repeat // Play the song 2 times +Seq +1 F * 5 +6 / / F#dim +7 C7 * 8 +15 F * 7 +22 / / Adim +23 Gm / D7 / +24 Gm / Bb +25 Bb +26 / / Ddim +27 F +28 D7 +29 G9 +30 C7 + +Repeatending +Seq 4 +Cresc ff 4 +31 F / Bb / +Seq 4 +32 F / C7 / +Repeatend + +Volume ff + F + +Tempo -20 + FzC FzCB FzCBW FzDCBW + + diff --git a/mma/egs/simple/marine-hymn.mid b/mma/egs/simple/marine-hymn.mid new file mode 100644 index 0000000000000000000000000000000000000000..524cd44bda9be26d04fa0604582007a80bf9d50f GIT binary patch literal 4483 zcmeHKOHUhD6#kr$M^i;z#O9GK0L2>N7=ne2+y+GKxB-tJA#M>#czFySzp%0EA&byO zG?1cp%c`htqAt5j-|xq=QQLIee?!l`cRaphyGgsLRH+N@ob#P?zWbdscg90%p_l`3 z5-yy^PpO5*Cg3`TBiBpOhMwKlb3^O*hEl1>WgH!UA*F9;7aG}(O&q0Vp?s;LZ)L0cm7!|3QQFeSiubBpm#fvR8K$;+e7A5k4r>yxQQJM& zvW9UO{`m^t_3jv6?4I@S7=FBc_8)jm14vxdC$)Dl?@-2 z2g*i(E>6#4xl}eTkxpmK>B;*!JEGlpgw7qIQ|g^m3(tAsbLm?5mMCaV_T&JY?5mBt zRWtkqIP@<;x$W`;3VM}QmxA-kBCUPO3a!0-?N{!Q?N)B_=rXP66tTVx8P z*TPvaluay^4*~r9^iU=xjKP}oL-K*t^OFZU=!** zLL*;2ymr9qL-fQZBxcr}J)2y=wHKeR)gQY9tUul?D}FGOUWTH=Uv{P0Ed(9&`{`AJ zginsv8DEp)qS&f*IGm=9dA*Y?+X=07=QppCENY^+U@qW&%@RswP0gi&Ii8>G@~vjhfUu; zIZT>UjkE#PKW~Q5l4tNKQ9Yiic(~HH(=9B5@-Ga1;?%I15G;lL{?JZG&bJO~?@K zNKjmc;vAZjp%|i^h>2t(NYq@12o^|Cz?Me3h)ZqLMUb@}#S?9DX<&Ucu+x!7T`v?$ zwI|_U)d%7CE2=qK!8`7px|qXWxj=3K=7NCt2sTG^a0}O+Auj{>I$hS`*6E_#UY)!; zc7x)&Eeg#Aaor78)Wr(Scu8F>;S6{7%DTF!D1uBd*h-(xe290N&ByR zb5xNWF(^0TD^czZe~~`)4${6iG#{4z4b6}ISVJ2_#;=imu<9*nUMwp$O@Zz!Q;t~;z#P5oqi2g$~2>-tbMB~+OS2+S@!4!EOrs>?5yqazM8`J zTdMH?N&a`9%hrp;Rcrn5-YjLeYKP(9fky!y!8}5n=0E@l0wI`%KnB4KLhCZ-&ttrT zi99At<^cUaHx5hyla%dW!*~`G>zG_^iv)_CTbFqP8iHAbvJPwm!5l()2eyKshLGmK z@?G+ldESbg$F!C)p<|LLomy8gzJiGiCaJ&?2@rP)p@Pg4$RfCg(3%4yt$KSNX> Start each file with a commented filename. Just makes editing easier. + +>> Follow the filename with BEGIN DOC/END section. This holds a + descriptive comment, used in the library reference header. + +>> Include an "Author" directive line. Currently this is treated as a + comment, but we might use it in the future. + +>> Add a DocDefine to the end of each goove definition. Something like: + + DefGroove Waltz This is a nice waltz groove. + + This is extracted using the -Dx command line option for creation + of the library documentation. + +>> Be as descriptive as possible in the pattern and groove names. + Probably not as easy as it sounds ... but punct. and digits + are permitted in pattern/groove names. Just remember that + they are case-insensitive. + +>> Use lots of comments and blank lines. + +>> Try not to overwrite common names. There are no warnings for this, + and it could create unwanted results. With auto-loading of grooves, + name duplicates become more problematical! + +>> Including voice, volume, random settings in a groove is probably + a good idea. Easy enough for a user to override after he/she + selects. + +>> Don't make assumptions. Yes, you can get away without putting a + Time directive at the top of lib file, but don't. Lib files should + have an explicit SeqClear and SeqSize as well. + +>> It is probably a bad idea for library files to include other library + files. + +>> Do use the standard pattern include files! And don't rename the + patterns defined in them! + +>> Create patterns in logical order. The order in which you define them + is also the order in which they'll be listed in the docs. + +March/2005, bvdp. + + + diff --git a/mma/lib/kara/K50s_rock.mma b/mma/lib/kara/K50s_rock.mma new file mode 100644 index 0000000..a350300 --- /dev/null +++ b/mma/lib/kara/K50s_rock.mma @@ -0,0 +1,1192 @@ + +///// Created: Mon Oct 09 11:13:21 2006 + +Begin Doc + A 50's rock style + Highly reconizable rock from the 50's, Buddy Holly amongst, others, used + this style. +End +Author Kara Music Production + +Time 4 +TimeSig 4 4 + + +////////////////////// +/////// Main A +SeqClear +SeqSize 4 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 79; 1.44 0 0; 3 0 72; 3.53 0 0 } \ + {1.01 0 70; 1.42 0 0; 3 0 73; 3.55 0 0 } \ + {1 0 70; 1.44 0 0; 3.01 0 61; 3.52 0 0 } \ + {1 0 72; 1.42 0 0; 3 0 75; 3.54 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2.01 0 85; 2.4 0 0; 2.51 0 96; 2.99 0 0; 4.01 0 85; 4.4 0 0 } \ + {1.99 0 86; 2.4 0 0; 2.48 0 92; 2.96 0 0; 3.98 0 75; 4.41 0 0 } \ + {2.01 0 95; 2.4 0 0; 2.49 0 93; 2.97 0 0; 3.99 0 86; 4.44 0 0 } \ + {1.99 0 94; 2.39 0 0; 2.49 0 97; 2.97 0 0; 4 0 82; 4.4 0 0; 4.75 0 64; 4.85 0 82; 4.94 0 0; 4.99 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 84; 1.44 0 0; 1.51 0 52; 1.86 0 0; 1.99 0 58; 2.4 0 0; 2.5 0 85; 3.41 0 0; 3.51 0 81; 4.44 0 0; 4.49 0 60; 4.92 0 0 } \ + {1 0 80; 1.45 0 0; 1.49 0 62; 1.87 0 0; 1.99 0 59; 2.41 0 0; 2.5 0 80; 3.4 0 0; 3.51 0 85; 3.96 0 0; 4 0 72; 4.42 0 0; 4.51 0 59; 4.9 0 0; 4.98 0 77 } \ + {1.44 0 0; 1.48 0 61; 1.83 0 0; 2.01 0 65; 2.4 0 0; 2.5 0 81; 3.39 0 0; 3.51 0 73; 4.44 0 0; 4.49 0 58; 4.89 0 0; 4.99 0 87 } \ + {1.41 0 0; 1.51 0 53; 1.86 0 0; 1.99 0 58; 2.38 0 0; 2.49 0 80; 3.42 0 0; 3.51 0 79; 3.94 0 0; 3.99 0 73; 4.42 0 0; 4.49 0 55; 4.91 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4. 1 87; 2.99 4 5 81; 3.98 4 5 82; 4.98 4. 1 88 } \ + {2.99 4 5 91; 4 4 1 88; 4.99 4. 1 80 } \ + {2.99 4 5 89; 4 4 5 84; 4.99 4. 1 90 } \ + {2.99 4 5 91; 4 4 1 78 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.55 16 1 45; 1.72 16 3 62; 1.88 16 5 76; 2.02 8. 1 70; 2.5 8 5 78; 3.01 8 3 60; 3.49 8. 1 55; 3.99 8 3 65; 4.5 8 5 72 } \ + {1.55 16 1 51; 1.71 16 3 68; 1.88 16 5 80; 2.03 8. 1 70; 2.5 8 5 75; 3.01 8 3 57; 3.51 8. 1 60; 4 8 3 70; 4.49 8 5 69 } \ + {1.54 16 1 45; 1.71 16 3 71; 1.87 16 5 80; 2.01 8. 1 79; 2.48 8 5 75; 2.99 8 3 58; 3.48 8. 1 53; 3.98 8 3 57; 4.49 8 5 69 } \ + {1.54 16 1 54; 1.7 16 3 69; 1.86 16 5 69; 2 8. 1 79; 2.48 8 5 67; 3 8 3 60; 3.51 8. 1 51; 3.99 8 3 61; 4.51 8 5 80 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 4. 1 75; 1.53 4. 5 52; 1.65 8. 1 56; 1.8 8 3 64; 1.97 8 5 81; 2.48 8 3 56; 2.5 8 1 65; 3.01 4 5 67; 3.49 8 3 46; 3.51 8 1 63; 3.51 8 7- 57; 3.99 4 5 71; 4.5 8 1 58; 4.51 8 3 61; 4.51 8 7- 51; 4.99 4. 1 65 } \ + {1.52 4. 5 46; 1.63 8. 1 50; 1.78 8 3 59; 1.99 8 5 80; 2.49 8 1 61; 2.51 8 3 58; 2.99 4 5 69; 3.48 8 1 59; 3.49 8 7- 53; 3.5 8 3 47; 4 4 1 73; 4.48 8 3 59; 4.48 8 1 57; 4.5 8 7- 48; 4.99 4. 1 71 } \ + {1.5 4. 5 48; 1.64 8. 1 61; 1.8 8 3 67; 1.99 8 5 81; 2.48 8 3 55; 2.51 8 1 53; 2.99 4 5 67; 3.49 8 3 52; 3.5 8 7- 63; 3.51 8 1 62; 3.99 0 5 65; 4.49 8 3 61; 4.49 8 1 52; 4.5 8 7- 59 } \ + {1.01 4. 1 64; 1.5 4. 5 51; 1.63 8. 1 56; 1.8 8 3 65; 1.99 8 5 72; 2.49 8 3 56; 2.5 8 1 56; 3.01 4 5 71; 3.5 8 1 49; 3.51 8 3 48; 3.51 8 7- 53; 3.99 4 1 74; 4.48 8 1 61; 4.49 1 3 55; 4.49 1 7- 51 } +End + +DefGroove 50sMain-A 'Main A' 50s rock, length is 4 bars. + + +////////////////////// +/////// Fill In AA +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.48 0 51; 1.67 0 0; 2.01 0 51; 2.18 0 0; 2.51 0 55; 2.72 0 0; 2.98 0 63; 3.21 0 0; 3.51 0 73; 3.7 0 0; 3.99 0 82; 4.22 0 0; 4.51 0 79; 4.72 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 99; 1.18 0 0; 1.48 0 57; 1.69 0 0; 2.01 0 61; 2.19 0 0; 2.51 0 56; 2.67 0 0; 2.99 0 74; 3.21 0 0; 3.5 0 81; 3.69 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.5 0 94; 4.69 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.49 0 60; 1.74 0 0; 2 0 60; 2.2 0 0; 2.48 0 66; 2.76 0 0; 3.01 0 67; 3.26 0 0; 3.51 0 77; 3.94 0 0; 3.99 0 68; 4.28 0 0; 4.51 0 85; 4.73 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.01 0 90; 4.18 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.51 16 1 76; 2 16 1 61; 2.49 16 1 62; 3.01 16 1 64; 3.5 16 1 79; 3.98 16 2# 80; 4.51 16 3 82 } +End + +DefGroove 50sFill-In-AA 'One bar Fill In Main A substyle' 50s rock + + +////////////////////// +/////// Intro A +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 80; 1.73 0 0; 2.99 0 65; 3.69 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 85; 2.24 0 0; 2.5 0 87; 2.95 0 0; 3.99 0 67; 4.58 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 70; 1.3 0 0; 1.5 0 65; 1.91 0 0; 1.98 0 63; 2.45 0 0; 2.48 0 73; 3.4 0 0; 3.51 0 75; 3.93 0 0; 4.01 0 67; 4.43 0 0; 4.51 0 50; 4.89 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4. 1 83; 2.99 4 5 82; 4.01 4 7- 86 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.56 16 1 50; 1.71 16 3 60; 1.87 16 5 71; 2.01 8. 1 69; 2.5 8 5 78; 3 8 3 64; 3.5 8. 1 57; 3.99 8 3 61; 4.5 8 5 70 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 4. 1 72; 1.51 4. 5 49; 1.63 8. 1 58; 1.79 8 3 65; 1.99 8 5 71; 2.49 8 1 55; 2.51 8 3 64; 3 4 5 60; 3.48 8 3 50; 3.51 8 1 59; 4.01 4 7- 78; 4.49 1 1 62; 4.49 1 3 54 } +End + +DefGroove 50sIntro-A One bar 'Intro A' 50s rock + + +////////////////////// +/////// Ending A +SeqClear +SeqSize 2 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 75; 1.44 0 0; 2.98 0 70; 3.52 0 0 } \ + {1 0 95; 1.45 0 0; 2.51 0 96; 2.95 0 0; 4.17 0 114; 4.69 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 91; 2.36 0 0; 2.49 0 88; 2.97 0 0; 4.01 0 83; 4.44 0 0 } z +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {4.01 0 72; 4.18 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {1.98 0 94; 2.38 0 0; 3.88 0 72; 4.09 0 0 } +End + +Begin Drum-HighTom2 + Tone HighTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {1.51 0 90; 1.89 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 80; 1.43 0 0; 1.51 0 55; 1.84 0 0; 1.99 0 64; 2.41 0 0; 2.49 0 73; 3.4 0 0; 3.49 0 74; 4.42 0 0; 4.49 0 64; 4.88 0 0 } \ + {1.01 0 85; 1.42 0 0; 1.51 0 58; 1.84 0 0; 2.01 0 55; 2.41 0 0; 2.49 0 88; 3.93 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 89; 2 4 3 85; 3 4 5 83; 3.98 4 6 85 } \ + {1 8 1 93; 1.49 8 5 97; 1.99 8 6 102; 2.5 4. 1 88 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.54 16 1 51; 1.72 16 3 63; 1.88 16 5 75; 2.02 8. 1 75; 2.49 8 5 67; 2.98 8 3 57; 3.49 8. 1 52; 3.99 8 3 69; 4.51 8 5 70; 4.99 8 1 88 } \ + {1.01 8 1 72; 1.51 8 5 75; 2.01 8 6 73; 2.5 4. 1 85; 2.5 4. 1 77 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1 4. 1 61; 1.5 4. 5 44; 1.63 8. 1 60; 1.8 8 3 71; 1.97 8 5 84; 2.48 8 3 64; 2.5 8 1 56; 2.99 4 5 61; 3.49 8 3 46; 3.49 8 1 56; 4 4 6 64; 4.5 8 3 64; 4.51 8 1 53 } \ + {1.51 8 5 75; 2.01 8 6 72; 2.48 4. 1 78; 2.48 4. 3 60; 2.5 4. 7- 82; 2.51 4. 5 71 } +End + +DefGroove 50sEnding-A Two bars 'Ending A' 50s rock + + +////////////////////// +/////// Main B +SeqClear +SeqSize 4 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 69; 1.45 0 0; 3.01 0 63; 3.52 0 0 } \ + {1 0 74; 1.42 0 0; 2.99 0 73; 3.53 0 0 } \ + {1.01 0 70; 1.43 0 0; 2.99 0 73; 3.55 0 0 } \ + {1 0 69; 1.43 0 0; 3.01 0 67; 3.53 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 98; 2.38 0 0; 2.49 0 93; 2.98 0 0; 3.99 0 83; 4.42 0 0 } \ + {2.01 0 98; 2.35 0 0; 2.51 0 91; 2.98 0 0; 4.01 0 86; 4.4 0 0 } \ + {1.99 0 86; 2.4 0 0; 2.51 0 90; 3 0 0; 4.01 0 76; 4.4 0 0 } \ + {2.01 0 92; 2.38 0 0; 2.51 0 89; 2.97 0 0; 4.01 0 78; 4.4 0 0; 4.76 0 63; 4.86 0 79; 4.95 0 0; 4.99 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 78; 1.43 0 0; 1.51 0 55; 1.85 0 0; 1.98 0 60; 2.38 0 0; 2.51 0 76; 3.4 0 0; 3.48 0 79; 3.97 0 0; 4.01 0 83; 4.45 0 0; 4.48 0 58; 4.91 0 0; 4.99 0 75 } \ + {1.45 0 0; 1.49 0 66; 1.86 0 0; 2 0 68; 2.41 0 0; 2.51 0 82; 3.4 0 0; 3.49 0 76; 3.94 0 0; 3.99 0 80; 4.47 0 0; 4.51 0 57; 4.88 0 0; 4.99 0 78 } \ + {1.44 0 0; 1.51 0 55; 1.84 0 0; 1.99 0 62; 2.4 0 0; 2.49 0 75; 3.42 0 0; 3.48 0 76; 3.93 0 0; 4.01 0 76; 4.44 0 0; 4.48 0 60; 4.88 0 0 } \ + {1.01 0 82; 1.44 0 0; 1.48 0 62; 1.84 0 0; 2.01 0 56; 2.38 0 0; 2.49 0 72; 3.41 0 0; 3.51 0 82; 3.96 0 0; 3.98 0 82; 4.47 0 0; 4.49 0 69; 4.91 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 91; 2.01 4 3 88; 3 4 5 79; 3.99 4 3 83; 4.99 4 1 89 } \ + {1.99 4 3 82; 2.99 4 5 84; 3.98 4 3 92 } \ + {1.01 4 1 80; 2 4 3 84; 2.99 4 5 92; 4 4 3 89; 4.99 4 1 89 } \ + {1.98 4 3 88; 2.98 4 5 90; 4 4 3 92 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.49 8 1 60; 1.99 8 1 70; 1.99 8 5 67; 2 8 3 75; 2.51 8 1 57; 3.51 8. 1 61; 3.98 8 3 63; 3.99 8 1 60; 4 8 5 74 } \ + {1.51 8 1 69; 1.98 8 1 78; 1.99 8 5 68; 2.01 8 3 69; 2.51 8 1 61; 3.49 8. 1 63; 3.98 8 3 72; 3.98 8 5 65; 3.99 8 1 63 } \ + {1.51 8 1 64; 1.99 8 1 76; 2.01 8 5 71; 2.01 8 3 61; 2.51 8 1 67; 3.51 8. 1 70; 3.99 8 3 70; 3.99 8 5 70; 3.99 8 1 61 } \ + {1.49 8 1 57; 1.99 8 3 75; 2 8 1 76; 2.01 8 5 60; 2.48 8 1 58; 3.49 8. 1 61; 3.98 8 1 58; 3.99 8 3 64; 4.01 8 5 69 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.49 8 5 77; 1.49 8 1 76; 1.5 8 7- 84; 1.5 8 3 81; 1.99 8 1 57; 1.99 8 3 71; 1.99 8 7- 64; 1.99 8 5 73; 2.48 8 7- 61; 2.49 8 1 65; 2.49 8 3 62; 2.51 8 5 77; 3.99 8 7- 69; 4 8 1 69; 4.01 8 3 78; 4.01 8 5 95 } \ + {1.48 8 3 73; 1.5 8 5 72; 1.5 8 7- 79; 1.51 8 1 77; 1.99 8 7- 62; 2 8 5 80; 2 8 1 61; 2.01 8 3 67; 2.5 8 5 80; 2.5 8 7- 57; 2.51 8 1 66; 2.51 8 3 65; 3.99 8 1 77; 3.99 8 3 77; 4 8 7- 77; 4 8 5 84 } \ + {1.5 8 1 84; 1.51 8 5 76; 1.51 8 7- 75; 1.51 8 3 80; 1.99 8 7- 71; 2.01 8 3 62; 2.01 8 5 72; 2.01 8 1 64; 2.48 8 1 65; 2.48 8 5 78; 2.51 8 3 57; 2.51 8 7- 66; 3.99 8 3 85; 3.99 8 1 76; 4 8 5 92; 4.01 8 7- 67 } \ + {1.48 8 3 79; 1.49 8 7- 80; 1.5 8 5 77; 1.51 8 1 74; 2 8 7- 69; 2 8 5 74; 2.01 8 1 64; 2.01 8 3 66; 2.48 8 3 70; 2.49 8 7- 62; 2.49 8 5 75; 2.51 8 1 67; 3.98 8 7- 67; 3.99 8 1 72; 4 8 5 95; 4.01 8 3 77 } +End + +DefGroove 50sMain-B B sub-style 50s rock. Length is 4 bars + + +////////////////////// +/////// Fill In BB +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.49 0 54; 1.68 0 0; 1.99 0 52; 2.19 0 0; 2.49 0 64; 2.71 0 0; 3 0 61; 3.21 0 0; 3.51 0 67; 3.74 0 0; 3.99 0 76; 4.2 0 0; 4.51 0 68; 4.72 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 99; 1.18 0 0; 1.51 0 59; 1.66 0 0; 1.99 0 53; 2.2 0 0; 2.49 0 51; 2.7 0 0; 2.99 0 67; 3.21 0 0; 3.51 0 79; 3.69 0 0; 4.73 0 69; 4.85 0 83; 4.94 0 0; 4.99 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.49 0 93; 4.7 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.5 0 67; 1.73 0 0; 2.01 0 64; 2.21 0 0; 2.49 0 58; 2.76 0 0; 3.01 0 66; 3.27 0 0; 3.48 0 73; 3.92 0 0; 3.98 0 72; 4.27 0 0; 4.5 0 77; 4.74 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3.99 0 89; 4.22 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.49 16 1 72; 1.98 16 1 65; 2.51 16 1 63; 2.99 16 1 66; 3.5 16 1 68; 3.99 16 2# 84; 4.5 16 3 82 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.49 16 3 57; 1.49 16 1 67; 1.51 16 5 59; 1.51 32 7- 51; 1.98 16 1 51; 1.99 16 5 68; 2 32 3 53; 2.01 16 7- 49; 2.49 16 5 46; 2.5 16 3 41; 2.51 16 1 60; 2.51 16 7- 53; 2.99 16 5 64; 2.99 16 1 71; 3.01 16 7- 60; 3.01 16 3 67; 3.5 8 5 61; 3.5 16 3 59; 3.5 8 1 70; 3.5 8 7- 62; 3.98 16 1 86; 3.99 16 5 73; 4.01 16 3 53; 4.01 16 7- 64; 4.49 16 7- 77; 4.49 16 1 85; 4.49 16 3 62; 4.5 16 5 68 } +End + +DefGroove 50sFill-In-BB One Bar Fill In for B substyle' 50s rock + + +////////////////////// +/////// Fill In BA +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.51 0 51; 1.67 0 0; 1.98 0 50; 2.21 0 0; 2.49 0 54; 2.71 0 0; 3.01 0 56; 3.19 0 0; 3.49 0 77; 3.74 0 0; 4.01 0 81; 4.22 0 0; 4.49 0 75; 4.69 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 101; 1.18 0 0; 1.51 0 46; 1.67 0 0; 2 0 58; 2.19 0 0; 2.5 0 53; 2.69 0 0; 2.99 0 68; 3.23 0 0; 3.5 0 75; 3.72 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.51 0 94; 4.72 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.5 0 66; 1.72 0 0; 2 0 67; 2.23 0 0; 2.5 0 56; 2.77 0 0; 3 0 67; 3.27 0 0; 3.51 0 66; 3.93 0 0; 3.99 0 77; 4.28 0 0; 4.51 0 75; 4.74 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3.99 0 94; 4.21 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.51 16 1 71; 1.99 16 1 69; 2.48 16 1 65; 2.99 16 1 61; 3.5 16 1 71; 4.01 16 2# 83; 4.49 8 3 77 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.48 16 7- 54; 1.49 16 3 56; 1.49 16 1 59; 1.51 16 5 61; 1.98 16 3 47; 1.99 16 5 57; 1.99 16 7- 52; 1.99 16 1 53; 2.48 16 5 46; 2.5 32 3 40; 2.51 16 1 55; 2.51 16 7- 55; 2.98 16 3 61; 2.98 16 5 68; 2.99 16 7- 57; 3.01 16 1 61; 3.48 8 1 65; 3.49 8 5 58; 3.51 16 7- 53; 3.51 8 3 65; 3.98 16 3 54; 3.98 16 7- 63; 3.98 16 1 80; 3.99 16 5 66; 4.48 16 3 65; 4.49 16 5 76; 4.49 16 7- 72; 4.51 16 1 81 } +End + +DefGroove 50sFill-In-BA One bar Fill In used to return from B substyle to A substyle. 50s rock + + +////////////////////// +/////// Intro B +SeqClear +SeqSize 2 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 68; 1.73 0 0; 2.98 0 60; 3.69 0 0 } z +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 96; 2.23 0 0; 2.48 0 95; 2.95 0 0; 3.99 0 74; 4.59 0 0 } \ + {1.99 0 85; 2.4 0 0; 2.5 0 97; 3 0 0; 3.99 0 86; 4.44 0 0; 4.75 0 64; 4.85 0 81; 4.92 0 0; 4.99 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {1 0 83; 1.45 0 0; 1.51 0 73; 1.95 0 0; 2.99 0 78; 3.43 0 0; 4.73 0 79; 4.99 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 70; 1.31 0 0; 1.49 0 58; 1.93 0 0; 1.99 0 62; 2.47 0 0; 2.51 0 74; 3.43 0 0; 3.51 0 85; 3.94 0 0; 3.98 0 62; 4.45 0 0; 4.5 0 55; 4.88 0 0; 4.99 0 88 } \ + {1.45 0 0; 1.51 0 83; 1.92 0 0; 2.01 0 82; 2.45 0 0; 2.51 0 85; 2.93 0 0; 2.99 0 76; 3.41 0 0; 3.51 0 82; 3.95 0 0; 4.01 0 87; 4.45 0 0; 4.48 0 86; 4.73 0 87; 4.95 0 0; 4.99 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4. 1 81; 3 4 5 88; 4 4 7- 86 } \ + {1.99 8 1 84; 2.51 16 1 90; 4.01 8 1 96 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.56 16 1 48; 1.71 16 3 60; 1.85 16 5 78; 2.01 8. 1 67; 2.48 8 5 69; 3.01 8 3 61; 3.49 8. 1 52; 3.99 8 3 71; 4.51 8 5 78 } \ + {1.98 16 3 76; 1.98 16 5 80; 1.99 16 1 84; 2.01 16 1 78; 2.48 8 1 58; 2.49 8 5 76; 2.5 8 3 85; 2.51 8 1 82; 3.99 8 3 75; 4 8 1 80; 4.01 8 1 88; 4.01 8 5 87 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.01 4. 1 71; 1.53 4. 5 49; 1.64 8. 1 61; 1.79 8 3 63; 1.99 8 5 83; 2.48 8 1 57; 2.49 8 3 63; 2.99 4 5 69; 3.5 8 3 53; 3.51 8 1 55; 4 4 7- 65; 4.48 8 3 60; 4.48 8 1 57 } \ + {1.99 16 3 88; 1.99 16 5 102; 2.01 16 1 82; 2.48 8 3 81; 2.48 16 1 82; 2.51 16 5 80; 3.99 16 5 102; 4.01 16 3 99; 4.01 16 1 87 } +End + +DefGroove 50sIntro-B Two bar 'Intro B substyle ' 50s rock. + + +////////////////////// +/////// Ending B +SeqClear +SeqSize 3 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.51 0 46; 1.7 0 0; 2.01 0 49; 2.21 0 0; 2.48 0 64; 2.7 0 0; 3.01 0 68; 3.21 0 0; 3.48 0 79; 3.74 0 0; 4.01 0 74; 4.18 0 0; 4.5 0 75; 4.71 0 0; 4.99 0 76 } \ + {1.44 0 0; 3.01 0 63; 3.55 0 0 } \ + {1 0 99; 1.43 0 0; 2.51 0 100; 2.96 0 0; 4.16 0 116; 4.72 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 100; 1.18 0 0; 1.49 0 57; 1.69 0 0; 1.98 0 53; 2.2 0 0; 2.5 0 59; 2.69 0 0; 3.01 0 65; 3.19 0 0; 3.51 0 76; 3.72 0 0 } \ + {1.98 0 93; 2.39 0 0; 2.48 0 94; 2.96 0 0; 4.01 0 74; 4.42 0 0 } z +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.51 0 91; 4.7 0 0 } z {4.01 0 75; 4.17 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.5 0 60; 1.72 0 0; 1.98 0 68; 2.23 0 0; 2.49 0 62; 2.76 0 0; 2.99 0 63; 3.24 0 0; 3.49 0 69; 3.92 0 0; 4.01 0 77; 4.25 0 0; 4.48 0 80; 4.73 0 0 } z z +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.01 0 90; 4.21 0 0 } z {2.01 0 91; 2.39 0 0; 3.88 0 77; 4.06 0 0 } +End + +Begin Drum-HighTom2 + Tone HighTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z z {1.48 0 94; 1.91 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.99 0 87 } \ + {1.43 0 0; 1.49 0 63; 1.84 0 0; 2 0 60; 2.4 0 0; 2.48 0 84; 3.38 0 0; 3.51 0 80; 4.44 0 0; 4.48 0 56; 4.91 0 0 } \ + {1.01 0 83; 1.43 0 0; 1.49 0 64; 1.85 0 0; 1.99 0 54; 2.4 0 0; 2.5 0 101; 3.97 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1.49 16 1 73; 2 16 1 68; 2.49 16 1 70; 3 16 1 66; 3.51 16 1 67; 4 16 2# 77; 4.51 16 3 75 } \ + {1 4 1 82; 1.98 4 3 81; 3.01 4 5 91; 3.99 4 6 82 } \ + {1 8 1 95; 1.49 8 5 93; 1.99 8 6 102; 2.48 4. 1 89 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 6 + Sequence {1.48 16 1 57; 1.48 16 5 59; 1.5 16 3 52; 1.51 16 7- 64; 1.98 16 7- 60; 2 16 3 66; 2 16 1 61; 2.01 16 5 66; 2.48 16 1 64; 2.5 16 7- 59; 2.5 16 5 70; 2.51 16 3 57; 2.99 16 3 63; 2.99 16 7- 63; 3 16 5 59; 3.01 16 1 64; 3.49 16 3 64; 3.49 16 5 66; 3.51 16 7- 70; 3.51 16 1 64; 4 16 1 77; 4 16 3 67; 4.01 16 7- 66; 4.01 16 5 72; 4.48 16 1 70; 4.49 16 3 78; 4.5 16 5 78; 4.51 16 7- 66 } \ + {1.56 16 1 49; 1.72 16 3 58; 1.88 16 5 69; 2.01 8. 1 79; 2.48 8 5 71; 3.01 8 3 62; 3.51 8. 1 57; 3.98 8 3 67; 4.49 8 5 67; 4.98 8 1 75 } \ + {1 8 1 74; 1.51 8 5 78; 2.01 8 6 72; 2.49 4. 1 84; 2.49 4. 1 77 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.48 16 1 67; 1.49 16 3 68; 1.51 16 5 68; 1.51 16 7- 55; 2 16 1 61; 2.01 16 5 62; 2.01 16 3 51; 2.01 16 7- 51; 2.49 16 1 55; 2.51 32 5 51; 2.51 16 3 39; 2.51 16 7- 53; 2.98 16 5 60; 3 16 7- 58; 3.01 16 3 60; 3.01 16 1 70; 3.49 16 3 59; 3.5 8 1 68; 3.5 8 7- 55; 3.51 8 5 65; 3.98 16 5 70; 3.99 16 3 66; 3.99 16 1 86; 4.01 16 7- 53; 4.51 16 5 68; 4.51 16 1 80; 4.51 16 7- 67; 4.51 16 3 67 } \ + {1.01 4. 1 61; 1.51 4. 5 44; 1.64 8. 1 57; 1.8 8 3 57; 1.98 8 5 79; 2.48 8 3 54; 2.51 8 1 64; 2.98 4 5 60; 3.49 8 1 57; 3.5 8 3 45; 3.99 4 6 73; 4.49 8 1 48; 4.51 8 3 53 } \ + {1.51 8 5 66; 1.98 8 6 73; 2.49 4. 7- 85; 2.5 4. 1 75; 2.51 4. 3 70; 2.51 4. 5 77 } +End + +DefGroove 50sEnding-B Tree bars 'Ending B substyle' 50s rock + + +////////////////////// +/////// Main C +SeqClear +SeqSize 4 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 74; 1.45 0 0; 2.98 0 64; 3.55 0 0; 4.99 0 80 } \ + {1.44 0 0; 2.99 0 65; 3.53 0 0; 4.99 0 67 } \ + {1.43 0 0; 3.01 0 64; 3.54 0 0 } \ + {1 0 70; 1.44 0 0; 2.98 0 67; 3.51 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 92; 2.39 0 0; 2.49 0 94; 2.97 0 0 } \ + {1.99 0 89; 2.36 0 0; 2.51 0 86; 2.96 0 0 } \ + {1.99 0 87; 2.38 0 0; 2.5 0 90; 2.97 0 0 } \ + {1.98 0 88; 2.39 0 0; 2.48 0 85; 2.98 0 0; 4.74 0 57; 4.88 0 79; 4.91 0 0; 4.99 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3.99 0 87; 4.44 0 0 } \ + {3.99 0 94; 4.41 0 0 } \ + {3.98 0 92; 4.42 0 0 } \ + {4.01 0 89; 4.42 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 80; 1.46 0 0; 1.48 0 66; 1.83 0 0; 1.99 0 60; 2.37 0 0; 2.51 0 73; 3.43 0 0; 3.51 0 77; 4.4 0 0; 4.51 0 63; 4.91 0 0 } \ + {1 0 88; 1.43 0 0; 1.49 0 66; 1.85 0 0; 2.01 0 54; 2.4 0 0; 2.51 0 82; 3.42 0 0; 3.49 0 79; 4.43 0 0; 4.51 0 62; 4.9 0 0; 4.98 0 79 } \ + {1.44 0 0; 1.51 0 54; 1.85 0 0; 1.98 0 66; 2.4 0 0; 2.49 0 75; 3.38 0 0; 3.51 0 79; 4.44 0 0; 4.51 0 65; 4.91 0 0 } \ + {1 0 87; 1.45 0 0; 1.49 0 60; 1.85 0 0; 1.99 0 65; 2.4 0 0; 2.49 0 84; 3.43 0 0; 3.51 0 72; 4.44 0 0; 4.51 0 55; 4.88 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1.01 4 1 92; 2 4 3 92; 2.99 4 5 90; 3.98 4 3 80; 4.98 4 1 79 } \ + {1.99 4 3 91; 2.98 4 5 81; 3.99 4 3 84; 4.99 4 1 90 } \ + {1.98 4 3 92; 2.99 4 5 81; 3.99 4 3 90 } \ + {1 4 1 85; 1.99 4 3 82; 2.99 4 5 87; 4 4 3 87 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.55 16 1 57; 1.72 16 3 62; 1.85 16 5 70; 2.03 8. 1 66; 2.5 8 5 77; 2.99 8 3 69; 3.5 8. 1 56; 3.99 8 3 65; 4.51 8 5 80 } \ + {1.55 16 1 55; 1.7 16 3 65; 1.87 16 5 80; 2.01 8. 1 73; 2.51 8 5 67; 2.99 8 3 58; 3.49 8. 1 62; 4.01 8 3 70; 4.48 8 5 79 } \ + {1.55 16 1 59; 1.71 16 3 66; 1.88 16 5 76; 2.03 8. 1 69; 2.51 8 5 67; 3.01 8 3 61; 3.51 8. 1 63; 3.99 8 3 62; 4.48 8 5 73 } \ + {1.54 16 1 57; 1.71 16 3 70; 1.88 16 5 70; 2.03 8. 1 74; 2.49 8 5 69; 3 8 3 70; 3.49 8. 1 51; 4.01 8 3 68; 4.5 8 5 66 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 4. 1 69; 1.53 4. 5 42; 1.64 8. 1 57; 1.8 8 3 59; 1.98 8 5 74; 2.49 8 1 53; 2.49 8 3 58; 2.99 4 5 65; 3.49 8 7- 52; 3.5 8 1 53; 3.51 8 3 46; 4 4 5 68; 4.48 8 1 53; 4.49 8 7- 53; 4.51 8 3 62; 4.99 4. 1 75 } \ + {1.52 4. 5 53; 1.64 8. 1 61; 1.8 8 3 57; 1.98 8 5 84; 2.48 8 1 61; 2.48 8 3 55; 3.01 4 5 68; 3.48 8 7- 59; 3.48 8 3 53; 3.48 8 1 51; 4 4 5 66; 4.48 8 1 49; 4.49 8 7- 53; 4.51 8 3 58 } \ + {1 4. 1 75; 1.51 4. 5 51; 1.63 8. 1 51; 1.81 8 3 69; 1.97 8 5 72; 2.48 8 3 67; 2.48 8 1 66; 3.01 4 5 62; 3.48 8 3 48; 3.51 8 1 54; 3.51 8 7- 52; 3.98 0 5 64; 4.5 8 3 61; 4.5 8 7- 51; 4.51 8 1 61 } \ + {1 4. 1 63; 1.52 4. 5 41; 1.65 8. 1 57; 1.79 8 3 69; 1.99 8 5 76; 2.48 8 1 67; 2.51 8 3 55; 2.98 4 5 73; 3.48 8 7- 62; 3.48 8 1 62; 3.49 8 3 53; 3.99 4 5 63; 4.48 8 7- 51; 4.48 8 1 53; 4.49 8 3 55 } +End + +DefGroove 50sMain-C Four bar 'Main C substyle' 50s rock + + +////////////////////// +/////// Fill In CC +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.51 0 55; 1.69 0 0; 1.99 0 50; 2.18 0 0; 2.48 0 63; 2.7 0 0; 2.98 0 60; 3.16 0 0; 3.48 0 73; 3.7 0 0; 4 0 82; 4.21 0 0; 4.49 0 72; 4.7 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 101; 1.19 0 0; 1.5 0 58; 1.68 0 0; 1.99 0 58; 2.19 0 0; 2.49 0 63; 2.68 0 0; 2.99 0 63; 3.22 0 0; 3.51 0 79; 3.68 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.5 0 99; 4.72 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.48 0 69; 1.73 0 0; 2.01 0 56; 2.23 0 0; 2.49 0 63; 2.74 0 0; 3.01 0 56; 3.24 0 0; 3.48 0 77; 3.92 0 0; 4 0 73; 4.25 0 0; 4.51 0 75; 4.72 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3.98 0 94; 4.18 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.49 16 1- 76; 2 16 1- 70; 2.49 16 1- 59; 3.01 16 1- 61; 3.51 16 1- 79; 3.99 16 2#- 78; 4.49 16 3- 83 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 6 + Sequence {1.48 16 7- 55; 1.49 16 5 61; 1.5 16 1 47; 1.51 16 3 52; 1.99 16 7- 67; 1.99 16 1 68; 2.01 16 5 60; 2.01 16 3 69; 2.48 16 3 63; 2.49 16 7- 68; 2.49 16 5 60; 2.51 16 1 59; 2.98 16 3 58; 2.99 16 1 64; 2.99 16 7- 64; 2.99 16 5 59; 3.49 16 7- 62; 3.49 16 5 61; 3.5 16 1 59; 3.51 16 3 70; 3.98 16 7- 79; 4.01 16 5 75; 4.01 16 1 78; 4.01 16 3 80; 4.49 16 5 77; 4.49 16 7- 76; 4.49 16 3 79; 4.51 16 1 75 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.48 16 3 66; 1.48 16 5 57; 1.51 32 7- 52; 1.51 16 1 62; 1.99 16 7- 46; 1.99 16 3 42; 1.99 16 5 63; 1.99 16 1 51; 2.48 16 5 57; 2.49 16 1 61; 2.5 16 3 45; 2.51 16 7- 53; 2.98 16 3 57; 2.98 16 7- 64; 2.99 16 5 69; 2.99 16 1 61; 3.48 8 5 71; 3.49 16 7- 49; 3.49 8 1 57; 3.51 8 3 67; 3.98 16 5 73; 3.98 16 1 74; 4.01 16 3 66; 4.01 16 7- 58; 4.5 16 1 76; 4.5 16 7- 70; 4.51 16 3 55; 4.51 16 5 71 } +End + +DefGroove 50sFill-In-CC One bar Fill In for C substyle' 50s rock + + +////////////////////// +/////// Intro C +SeqClear +SeqSize 4 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 79; 1.73 0 0; 2.98 0 67; 3.72 0 0; 4.99 0 77 } \ + {1.41 0 0; 2.98 0 64; 3.53 0 0 } \ + {3.01 0 74; 3.52 0 0 } z +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 95; 2.24 0 0; 2.51 0 94; 2.92 0 0; 4 0 68; 4.59 0 0 } \ + {1.99 0 97; 2.36 0 0; 2.51 0 87; 2.96 0 0; 4.01 0 80; 4.43 0 0 } \ + {1.98 0 88; 2.4 0 0; 2.49 0 89; 2.96 0 0; 4.01 0 80; 4.42 0 0 } \ + {2.01 0 93; 2.39 0 0; 2.51 0 98; 2.97 0 0; 4 0 78; 4.41 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z z z {1.01 0 72; 1.45 0 0; 1.48 0 79; 1.94 0 0; 3.01 0 80; 3.47 0 0; 4.76 0 80; 4.98 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.01 0 69; 1.3 0 0; 1.51 0 70; 1.92 0 0; 2 0 60; 2.46 0 0; 2.49 0 83; 3.4 0 0; 3.51 0 83; 3.97 0 0; 4.01 0 68; 4.45 0 0; 4.51 0 53; 4.88 0 0 } \ + {1.01 0 81; 1.42 0 0; 1.51 0 55; 1.87 0 0; 1.98 0 63; 2.39 0 0; 2.48 0 72; 3.41 0 0; 3.51 0 81; 4.41 0 0; 4.5 0 67; 4.87 0 0 } \ + {1.5 0 58; 1.86 0 0; 2.01 0 55; 2.38 0 0; 2.49 0 82; 3.4 0 0; 3.51 0 76; 3.96 0 0; 3.98 0 82; 4.45 0 0; 4.48 0 56; 4.9 0 0 } \ + {1.01 0 76; 1.41 0 0; 1.51 0 77; 1.94 0 0; 2 0 89; 2.41 0 0; 2.51 0 83; 2.93 0 0; 2.98 0 86; 3.44 0 0; 3.48 0 78; 3.95 0 0; 3.98 0 87; 4.43 0 0; 4.51 0 83; 4.74 0 84; 4.94 0 0; 4.98 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1.01 4. 1 77; 2.99 4 5 88; 3.99 4 7- 80; 4.99 4. 1 81 } \ + {3 4 5 83; 4.01 4 5 83 } \ + {2.01 4 3 84; 2.98 4 5 86; 4 4 3 83 } \ + {2 8 1 81; 2.48 8 1 93; 4 8 1 97 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.54 16 1 58; 1.71 16 3 69; 1.87 16 5 76; 2.02 8. 1 75; 2.51 8 5 69; 2.98 8 3 64; 3.51 8. 1 62; 3.99 8 3 66; 4.49 8 5 80 } \ + {1.54 16 1 46; 1.7 16 3 70; 1.88 16 5 68; 2.02 8. 1 78; 2.49 8 5 77; 2.99 8 3 63; 3.51 8. 1 49; 4.01 8 3 57; 4.51 8 5 76 } \ + {1.51 8 1 64; 1.99 8 1 74; 2 8 3 68; 2.01 8 5 64; 2.48 8 1 58; 3.51 8. 1 59; 3.98 8 5 66; 4 8 1 65; 4 8 3 72 } \ + {1.99 16 3 86; 2 16 1 77; 2 16 1 88; 2.01 16 5 75; 2.48 8 3 84; 2.49 8 1 60; 2.51 8 5 79; 2.51 8 1 87; 3.98 8 1 87; 3.99 8 1 75; 3.99 8 5 78; 4.01 8 3 76 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1 4. 1 68; 1.53 4. 5 51; 1.65 8. 1 57; 1.78 8 3 57; 1.98 8 5 75; 2.48 8 3 59; 2.49 8 1 65; 2.99 4 5 73; 3.5 8 1 51; 3.51 8 3 57; 3.99 4 7- 70; 4.51 8 1 58; 4.51 8 3 60; 4.98 4. 1 67 } \ + {1.52 4. 5 49; 1.63 8. 1 59; 1.79 8 3 68; 2 8 5 85; 2.48 8 3 54; 2.49 8 1 67; 3 4 5 71; 3.49 8 1 62; 3.49 8 3 56; 3.49 8 7- 62; 3.99 0 5 70; 4.48 8 1 59; 4.49 8 7- 58; 4.51 8 3 52 } \ + {1.48 8 7- 80; 1.49 8 1 82; 1.49 8 3 79; 1.51 8 5 84; 1.98 8 1 63; 1.99 8 5 83; 2.01 8 3 66; 2.01 8 7- 70; 2.48 8 7- 66; 2.49 8 5 70; 2.49 8 1 67; 2.5 8 3 57; 3.98 8 3 75; 3.98 8 7- 80; 4 8 1 71; 4.01 8 5 94 } \ + {1.98 16 3 91; 2 16 1 85; 2.01 16 5 88; 2.49 16 5 80; 2.51 16 1 79; 2.51 16 3 82; 3.98 16 1 92; 4 16 5 101; 4.01 16 3 99 } +End + +DefGroove 50sIntro-C Four bar Intro for C substyle 50srock. + + +////////////////////// +/////// Ending C +SeqClear +SeqSize 5 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {1.01 0 75; 1.43 0 0; 3.01 0 67; 3.52 0 0 } \ + {1.51 0 42; 1.68 0 0; 2.01 0 47; 2.18 0 0; 2.48 0 60; 2.68 0 0; 2.99 0 59; 3.17 0 0; 3.49 0 79; 3.71 0 0; 3.99 0 81; 4.22 0 0; 4.51 0 72; 4.69 0 0 } \ + {1.01 0 67; 1.44 0 0; 2.99 0 72; 3.52 0 0; 4.99 0 92 } \ + {1.44 0 0; 2.48 0 95; 2.96 0 0; 4.16 0 120; 4.7 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 91; 2.4 0 0; 2.49 0 86; 2.97 0 0; 4.01 0 87; 4.42 0 0 } \ + {2.01 0 84; 2.4 0 0; 2.5 0 86; 2.96 0 0; 4.76 0 57; 4.87 0 74; 4.95 0 0 } \ + {1.01 0 101; 1.06 0 0; 1.18 0 0; 1.48 0 48; 1.69 0 0; 2.01 0 62; 2.22 0 0; 2.48 0 60; 2.69 0 0; 2.99 0 66; 3.24 0 0; 3.51 0 73; 3.71 0 0 } \ + {1.98 0 97; 2.4 0 0; 2.48 0 98; 2.98 0 0; 4.01 0 82; 4.44 0 0 } z +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 83; 1.44 0 0; 1.51 0 81; 1.93 0 0; 3.01 0 77; 3.43 0 0; 4.74 0 76 } \ + {1.22 0 0 } \ + {4.51 0 92; 4.7 0 0 } z {4.01 0 70; 4.16 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence z z {1.51 0 66; 1.69 0 0; 2.01 0 60; 2.23 0 0; 2.5 0 70; 2.76 0 0; 3.01 0 69; 3.26 0 0; 3.5 0 67; 3.89 0 0; 4.01 0 68; 4.26 0 0; 4.49 0 78; 4.72 0 0 } z z +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {4 0 83; 4.42 0 0 } \ + {3.99 0 89; 4.22 0 0 } z {1.98 0 96; 2.38 0 0; 3.88 0 75; 4.08 0 0 } +End + +Begin Drum-HighTom2 + Tone HighTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z z z z {1.51 0 96; 1.9 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 79; 1.45 0 0; 1.5 0 85; 1.95 0 0; 2.01 0 79; 2.44 0 0; 2.49 0 83; 2.93 0 0; 3 0 77; 3.46 0 0; 3.51 0 83; 3.92 0 0; 4 0 75; 4.44 0 0; 4.49 0 78; 4.73 0 75; 4.95 0 0; 4.98 0 82 } \ + {1.2 0 0; 1.43 0 0; 1.51 0 66; 1.84 0 0; 2.01 0 68; 2.39 0 0; 2.48 0 81; 3.4 0 0; 3.51 0 80; 4.41 0 0; 4.49 0 56; 4.91 0 0 } \ + {4.98 0 81 } \ + {1.45 0 0; 1.48 0 53; 1.84 0 0; 1.99 0 57; 2.37 0 0; 2.49 0 86; 3.43 0 0; 3.51 0 79; 4.42 0 0; 4.51 0 66; 4.87 0 0 } \ + {1.01 0 76; 1.41 0 0; 1.51 0 64; 1.83 0 0; 1.99 0 64; 2.4 0 0; 2.49 0 91; 3.96 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1.99 8 1 83; 2.51 16 1 92; 3.98 8 1 94; 4.99 4 1 81 } \ + {1.99 4 3 79; 2.99 4 5 85; 3.99 4 3 82 } \ + {1.48 16 1 72; 2.01 16 1 60; 2.48 16 1 63; 2.99 16 1 67; 3.5 16 1 71; 4.01 16 2# 87; 4.51 16 3 85 } \ + {1.01 4 1 82; 1.99 4 3 84; 2.98 4 5 86; 3.99 4 6 91; 4.99 8 1 102 } \ + {1.51 8 5 89; 1.98 8 6 96; 2.51 4. 1 100 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1.98 16 5 77; 1.99 16 3 76; 1.99 16 1 82; 2.01 16 1 83; 2.48 8 1 52; 2.49 8 1 78; 2.49 8 5 86; 2.51 8 3 86; 4 8 1 89; 4 8 5 86; 4 8 1 86; 4.01 8 3 79 } \ + {1.55 16 1 48; 1.72 16 3 60; 1.86 16 5 76; 2.02 8. 1 67; 2.49 8 5 68; 3 8 3 62; 3.51 8. 1 50; 4.01 8 3 68; 4.5 8 5 68 } \ + {1.48 16 1 46; 1.48 16 3 50; 1.51 16 5 67; 1.51 16 7- 66; 1.98 16 7- 59; 2 16 5 60; 2 16 1 65; 2.01 16 3 57; 2.49 16 5 61; 2.51 16 1 60; 2.51 16 3 67; 2.51 16 7- 64; 3 16 5 69; 3 16 3 63; 3 16 1 64; 3.01 16 7- 70; 3.49 16 5 69; 3.49 16 3 70; 3.49 16 1 67; 3.5 16 7- 57; 3.99 16 5 73; 4 16 3 68; 4.01 16 7- 72; 4.01 16 1 76; 4.49 16 5 78; 4.51 16 7- 69; 4.51 16 3 70; 4.51 16 1 74 } \ + {1.55 16 1 58; 1.72 16 3 58; 1.85 16 5 67; 2.03 8. 1 66; 2.51 8 5 77; 3.01 8 3 57; 3.51 8. 1 61; 4.01 8 3 68; 4.51 8 5 77; 4.99 8 1 73 } \ + {1.01 8 1 87; 1.49 8 5 71; 2.01 8 6 82; 2.49 4. 1 83; 2.51 4. 1 73 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.99 16 5 101; 1.99 16 1 75; 2.01 16 3 99; 2.49 16 3 81; 2.5 16 1 86; 2.51 16 5 83; 3.98 16 5 101; 3.99 16 1 98; 3.99 16 3 97; 4.98 4. 1 69 } \ + {1.5 4. 5 47; 1.65 8. 1 61; 1.78 8 3 67; 1.98 8 5 71; 2.49 8 1 65; 2.5 8 3 59; 3 4 5 61; 3.48 8 7- 59; 3.51 8 3 47; 3.51 8 1 59; 4.01 4 5 61; 4.49 8 1 49; 4.5 8 7- 51; 4.51 8 3 62 } \ + {1.48 16 7- 63; 1.49 16 5 59; 1.5 16 3 59; 1.5 16 1 53; 1.98 16 5 60; 1.99 16 7- 44; 1.99 16 1 49; 1.99 32 3 50; 2.49 16 5 49; 2.49 16 1 56; 2.5 16 7- 58; 2.51 32 3 45; 2.99 16 1 71; 2.99 16 5 58; 3 16 3 66; 3.01 16 7- 69; 3.48 8 1 71; 3.48 8 5 60; 3.49 8 3 66; 3.49 8 7- 50; 3.98 16 1 72; 3.99 16 3 66; 4 16 5 77; 4.01 16 7- 60; 4.49 16 1 85; 4.49 16 5 74; 4.51 16 7- 67; 4.51 16 3 62 } \ + {1.01 4. 1 63; 1.52 4. 5 42; 1.65 8. 1 61; 1.79 8 3 62; 1.97 8 5 80; 2.48 8 1 63; 2.48 8 3 66; 2.98 4 5 60; 3.48 8 1 63; 3.49 8 3 57; 3.98 4 6 63; 4.51 8 1 51; 4.51 8 3 50 } \ + {1.51 8 5 72; 1.98 8 6 82; 2.49 4. 3 60; 2.5 4. 7- 73; 2.51 4. 5 79; 2.51 4. 1 78 } +End + +DefGroove 50sEnding-C Five bar Ending for C substyle 50s rock + + +////////////////////// +/////// Main D +SeqClear +SeqSize 4 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 1.44 0 0; 3.01 0 66; 3.51 0 0 } \ + {1.01 0 78; 1.45 0 0; 3.01 0 66; 3.55 0 0 } \ + {1 0 75; 1.45 0 0; 3.01 0 62; 3.55 0 0; 4.98 0 79 } \ + {1.44 0 0; 2.99 0 73; 3.52 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.99 0 90; 2.35 0 0; 2.48 0 94; 2.96 0 0; 4 0 77; 4.4 0 0 } \ + {1.99 0 87; 2.37 0 0; 2.5 0 98; 2.97 0 0; 4 0 87; 4.41 0 0 } \ + {2.01 0 95; 2.37 0 0; 2.48 0 98; 2.97 0 0; 4.01 0 80; 4.4 0 0 } \ + {1.99 0 98; 2.39 0 0; 2.49 0 93; 2.96 0 0; 4 0 83; 4.43 0 0; 4.76 0 60; 4.88 0 74; 4.92 0 0; 4.99 0 0 } +End + +Begin Drum-RideCymbal1 + Tone RideCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 75; 1.46 0 0; 1.51 0 65; 1.83 0 0; 2.01 0 67; 2.4 0 0; 2.51 0 80; 3.42 0 0; 3.48 0 85; 3.97 0 0; 3.98 0 86; 4.46 0 0; 4.48 0 63; 4.87 0 0; 4.98 0 89 } \ + {1.45 0 0; 1.49 0 65; 1.86 0 0; 1.98 0 63; 2.42 0 0; 2.49 0 86; 3.4 0 0; 3.5 0 81; 3.97 0 0; 3.99 0 79; 4.47 0 0; 4.51 0 59; 4.87 0 0 } \ + {1.01 0 82; 1.45 0 0; 1.49 0 62; 1.85 0 0; 1.99 0 64; 2.41 0 0; 2.51 0 75; 3.41 0 0; 3.48 0 73; 3.95 0 0; 3.98 0 85; 4.45 0 0; 4.51 0 58; 4.88 0 0 } \ + {1.01 0 86; 1.46 0 0; 1.49 0 57; 1.85 0 0; 1.99 0 67; 2.42 0 0; 2.49 0 79; 3.39 0 0; 3.48 0 81; 3.96 0 0; 4.01 0 72; 4.44 0 0; 4.51 0 55; 4.89 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 80; 1.99 4 3 78; 3.01 4 5 81; 4.01 4 3 78; 4.99 4 1 90 } \ + {2.01 4 3 85; 2.99 4 5 83; 4.01 4 3 90; 4.98 4 1 89 } \ + {2 4 3 86; 2.99 4 5 88; 4.01 4 3 92 } \ + {1 4 1 78; 1.98 4 3 82; 2.99 4 5 88; 4 4 3 83 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 7 + Sequence {1 16 5 70; 1 16 5 59; 1 16 3 69; 1 16 1 69; 1.48 16 1 49; 1.5 16 5 63; 1.51 16 3 61; 1.51 16 5 73; 1.98 32 3 58; 1.99 32 5 46; 1.99 32 5 52; 1.99 16 1 54; 2.48 16 5 56; 2.48 16 1 57; 2.48 16 5 71; 2.49 16 3 68; 2.99 16 5 55; 3.01 16 3 63; 3.01 16 5 61; 3.01 16 1 67; 3.48 32 5 55; 3.49 16 5 59; 3.49 16 3 49; 3.51 32 1 58; 3.99 16 3 53; 4 16 5 45; 4 16 5 56; 4.01 16 1 53; 4.51 32 1 55; 4.51 16 3 62; 4.51 32 5 63; 4.51 32 5 52 } \ + {1 16 5 70; 1 16 5 67; 1 16 3 64; 1.01 16 1 60; 1.48 16 3 51; 1.48 16 1 49; 1.51 16 5 60; 1.51 16 5 71; 1.99 16 1 57; 2.01 16 5 56; 2.01 32 3 55; 2.01 32 5 49; 2.49 16 3 62; 2.49 16 1 69; 2.51 16 5 67; 2.51 16 5 63; 2.98 16 3 61; 2.98 16 5 56; 3.01 16 1 59; 3.01 16 5 60; 3.48 32 5 58; 3.49 32 1 50; 3.51 32 5 61; 3.51 32 3 49; 3.99 16 5 49; 4.01 16 1 58; 4.01 16 5 47; 4.01 16 3 60; 4.49 32 5 55; 4.49 16 3 59; 4.5 16 5 56; 4.51 32 1 62; 4.98 16 3 66; 4.99 16 5 66; 4.99 32 5 73; 4.99 16 1 65 } \ + {1.5 16 5 70; 1.5 16 5 51; 1.51 16 3 57; 1.51 16 1 57; 1.98 16 5 49; 1.99 32 3 62; 2.01 32 5 53; 2.01 32 1 51; 2.49 16 1 60; 2.5 16 5 54; 2.51 16 5 65; 2.51 16 3 58; 2.98 16 5 53; 2.99 16 3 60; 3 16 5 69; 3.01 16 1 58; 3.49 32 5 50; 3.49 32 5 59; 3.49 32 3 50; 3.51 32 1 49; 3.98 16 5 55; 3.99 16 5 53; 3.99 16 1 55; 4.01 16 3 53; 4.48 32 5 50; 4.49 32 3 63; 4.5 32 1 60; 4.51 32 5 56; 4.99 16 1 57; 4.99 16 3 71 } \ + {1 16 5 69; 1.01 16 5 73; 1.48 16 5 58; 1.49 16 5 72; 1.49 16 3 63; 1.51 16 1 49; 1.99 16 1 63; 2 32 5 52; 2.01 32 5 63; 2.01 32 3 57; 2.48 16 3 67; 2.48 16 1 70; 2.48 16 5 69; 2.5 16 5 60; 2.98 16 1 56; 3 16 3 54; 3.01 16 5 58; 3.01 16 5 61; 3.48 16 5 49; 3.5 32 3 57; 3.51 32 1 49; 3.51 32 5 61; 3.99 16 1 52; 3.99 16 5 51; 4 16 3 50; 4.01 16 5 55; 4.48 32 5 53; 4.49 32 1 58; 4.49 16 3 51; 4.51 32 5 62 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.48 8 5 76; 1.48 8 7- 76; 1.51 8 3 78; 1.51 8 1 85; 1.98 8 5 80; 1.98 8 7- 61; 2.01 8 3 57; 2.01 8 1 62; 2.49 8 3 76; 2.49 8 5 82; 2.5 16 1 78; 2.5 8 7- 80; 3.99 8 3 84; 3.99 8 7- 66; 4.01 8 1 66; 4.01 8 5 97 } \ + {1.5 8 7- 83; 1.5 8 3 83; 1.51 8 5 81; 1.51 8 1 77; 2.01 8 7- 64; 2.01 8 3 57; 2.01 8 5 74; 2.01 8 1 71; 2.48 8 7- 78; 2.49 8 3 75; 2.49 8 1 80; 2.51 16 5 82; 3.98 8 7- 67; 3.99 8 1 72; 3.99 8 5 90; 4.01 8 3 87 } \ + {1.49 8 1 80; 1.5 8 7- 81; 1.5 8 5 76; 1.51 8 3 72; 1.99 8 3 69; 1.99 8 5 86; 2 8 7- 61; 2.01 8 1 69; 2.49 8 1 88; 2.49 8 3 82; 2.49 8 5 89; 2.5 8 7- 84; 3.98 8 5 86; 3.98 8 7- 78; 3.98 8 1 75; 3.99 8 3 86 } \ + {1.48 8 7- 82; 1.49 8 3 74; 1.5 8 1 78; 1.5 8 5 72; 1.98 8 3 58; 1.99 8 7- 61; 2 8 1 67; 2.01 8 5 83; 2.48 16 3 83; 2.51 16 7- 82; 2.51 16 5 80; 2.51 16 1 81; 3.98 8. 5 85; 3.99 8 1 77; 4.01 8 7- 71; 4.01 8 3 79 } +End + +DefGroove 50sMain-D Four bar Main D substyle 50s rock. + + +////////////////////// +/////// Fill In DD +SeqClear +SeqSize 1 + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.49 0 45; 1.7 0 0; 2.01 0 46; 2.18 0 0; 2.48 0 55; 2.7 0 0; 2.98 0 68; 3.18 0 0; 3.49 0 72; 3.72 0 0; 3.99 0 75; 4.22 0 0; 4.49 0 71; 4.69 0 0 } +End + +Begin Drum-SnareDrum1 + Tone SnareDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 89; 1.18 0 0; 1.49 0 59; 1.69 0 0; 1.99 0 62; 2.19 0 0; 2.5 0 51; 2.68 0 0; 3.01 0 65; 3.21 0 0; 3.5 0 85; 3.71 0 0 } +End + +Begin Drum-LowTom2 + Tone LowTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.48 0 95; 4.71 0 0 } +End + +Begin Drum-ClosedHiHat + Tone ClosedHiHat + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.48 0 66; 1.72 0 0; 2.01 0 62; 2.23 0 0; 2.49 0 64; 2.77 0 0; 2.98 0 66; 3.24 0 0; 3.51 0 73; 3.91 0 0; 3.98 0 72; 4.27 0 0; 4.49 0 80; 4.76 0 0 } +End + +Begin Drum-MidTom2 + Tone MidTom2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.01 0 96; 4.2 0 0 } +End + +Begin Bass-11 + Voice AcousticBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.49 16 1- 74; 1.99 16 1- 58; 2.49 16 1- 67; 2.99 16 1- 65; 3.49 16 1- 73; 4.01 16 2# 80; 4.51 16 3- 82 } +End + +Begin Bass-12 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 6 + Sequence {1.48 16 5 64; 1.49 16 3 51; 1.5 16 1 55; 1.51 16 7- 62; 1.99 16 3 62; 2 16 1 62; 2 16 5 68; 2.01 16 7- 63; 2.49 16 3 71; 2.51 16 1 58; 2.51 16 5 70; 2.51 16 7- 62; 2.99 16 1 69; 2.99 16 3 61; 2.99 16 7- 64; 2.99 16 5 65; 3.49 16 3 59; 3.5 16 5 67; 3.5 16 1 68; 3.51 16 7- 69; 3.98 16 1 73; 3.98 16 5 71; 3.99 16 7- 78; 4.01 16 3 76; 4.48 16 1 68; 4.48 16 3 67; 4.5 16 7- 76; 4.51 16 5 68 } +End + +Begin Bass-13 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.48 16 3 63; 1.49 16 7- 59; 1.5 16 5 67; 1.51 16 1 53; 1.99 16 1 59; 2 16 5 60; 2 16 3 47; 2.01 16 7- 51; 2.49 16 7- 50; 2.5 16 3 39; 2.51 32 5 46; 2.51 16 1 57; 2.99 16 3 55; 3 16 7- 71; 3 16 5 68; 3.01 16 1 60; 3.48 8 5 61; 3.49 16 3 56; 3.5 8 1 67; 3.5 16 7- 58; 3.98 16 3 64; 3.99 16 7- 60; 4 16 5 67; 4.01 16 1 80; 4.49 16 7- 80; 4.51 16 3 67; 4.51 16 5 71; 4.51 16 1 86 } +End + +DefGroove 50sFill-In-DD One bar Fill In for D substyle 50s rock + diff --git a/mma/lib/kara/README b/mma/lib/kara/README new file mode 100644 index 0000000..b2b40c5 --- /dev/null +++ b/mma/lib/kara/README @@ -0,0 +1,15 @@ + +These files were donated for the betterment of humanity by +Kara Music Production. MMA only distributes a few of kara's +files ... for much more, please visit their website at: + + http://www.kara-moon.com/ + +for more style files. + +Also, visit and participate in the MMA forum discussion group at: + + http://www.kara-moon.com/forum/index.php?board=21.0 + +bvdp, October 2006 + diff --git a/mma/lib/kara/twi.mma b/mma/lib/kara/twi.mma new file mode 100644 index 0000000..56c7fe9 --- /dev/null +++ b/mma/lib/kara/twi.mma @@ -0,0 +1,736 @@ + +///// Created: Wed Oct 11 16:55:34 2006 + +Begin Doc + Style : twi.mma + A nice twist style +End +Author Kara Music Production + +Time 4 +TimeSig 4 4 + + +////////////////////// +/////// Main A +SeqClear +SeqSize 2 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 58; 1.51 0 54; 2.52 0 56; 3 0 58; 3.51 0 55; 4.52 0 57 } \ + {1 0 59; 1.52 0 55; 2.51 0 54; 3 0 58; 3.51 0 57; 4.52 0 57 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 2.52 0 71; 3 0 77 } \ + {1 0 80; 2.51 0 65; 3 0 76 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 86; 4 0 84 } \ + {2 0 76; 4 0 81 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 8 1 75; 1 8 5 66; 1.51 8 1 77; 1.51 8 5 67; 2 8 1 84; 2 8 6 73; 2.52 8 1 84; 2.52 8 5 61; 3 8 1 77; 3 8 5 72; 3.51 8 1 80; 3.51 8 5 72; 4 8 1 77; 4 8 6 67; 4.52 8 1 76; 4.52 8 5 58 } \ + {1 8 1 80; 1 8 5 72; 1.52 8 1 79; 1.52 8 5 67; 2 8 1 79; 2 8 6 68; 2.51 8 1 76; 2.51 8 5 67; 3 8 1 77; 3 8 5 70; 3.51 8 1 76; 3.51 8 5 68; 4 8 1 84; 4 8 6 74; 4.52 8 1 77; 4.52 8 5 72 } +End + + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 87; 2 4 3 93; 3 4 5 83; 4 8 6 86; 4.52 8 5 80 } \ + {1 4 1 87; 2 4 3 93; 3 4 5 87; 4 8 6 83; 4.52 8 5 83 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.06 16 1 99; 2.58 4. 3 96; 4.06 8 5 98 } \ + {1.06 16 1 94; 2.57 4. 3 104; 4.06 8 5 102 } +End + +DefGroove Main-A Bass, Steel Guitar, Tenor Sax & Drums + + +////////////////////// +/////// Fill In AA +SeqClear +SeqSize 1 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.51 0 48; 2.52 0 62; 3 0 70; 3.51 0 77; 4.52 0 57 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 75; 2.52 0 30; 3 0 75 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 62; 4 0 72 } +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 88; 4.99 0 75 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.51 8 1 50; 1.51 8 5 50; 2 8 1 57; 2 8 5 58; 2.52 8 1 66; 2.52 8 5 66; 3 8 1 73; 3 8 5 74; 3.51 8 1 80; 3.51 8 5 81; 4 8 1 84; 4 8 5 84; 4.52 8 1 90; 4.52 8 5 90 } +End + + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 8 1 87; 1.5 8 1 87; 2 8 3 93; 2.5 8 3 93; 3 8 5 83; 3.5 8 5 83; 4 8 6 86; 4.52 8 5 80 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.55 8 1 98; 2.07 8 3 105; 3.07 8 5 105; 4.07 8 6 98; 4.57 8 5 98 } +End + +DefGroove Fill-In-AA Fill for Main A style + + +////////////////////// +/////// Fill In AB +SeqClear +SeqSize 1 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 58; 1.5 0 54; 3 0 58; 3.5 0 55; 4.25 0 57 } +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.5 0 45; 2 0 53; 2.5 0 50; 3 0 49; 3.5 0 49; 4 0 73; 4.5 0 73 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 3 0 77 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 89; 2 0 87; 2.5 0 89; 3 0 89; 3.5 0 89; 4 0 89; 4.5 0 89 } +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {4.99 0 88 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 8 1 75; 1 8 5 66; 1.51 8 1 77; 1.51 8 5 67; 2 8 1 84; 2 8 6 73; 2.52 8 1 84; 2.52 8 5 61; 3 8 1 77; 3 8 5 72; 3.51 8 1 80; 3.51 8 5 72; 4 8 1 77; 4 8 6 67; 4.52 8 1 76; 4.52 8 5 58 } +End + + +Begin Bass-7 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.5 8 5 69; 1.5 8 7- 68; 1.5 8 3 77; 2.5 16 5 74; 2.5 16 7- 76; 2.5 16 3 84; 3.5 16 5 72; 3.5 16 7- 72; 3.5 16 3 80; 4.5 16 5 77; 4.5 16 7- 72; 4.5 16 3 87 } +End + +Begin Bass-8 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 70; 2 4 6 77; 3 4 5 73; 4 8 6 75; 4.5 8 5 75 } +End + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 87; 2 4 6 93; 3 4 5 83; 4 8 6 86; 4.52 8 5 80 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {2.07 8 5 102; 2.57 8 5 102; 3.57 8 5 102; 4.07 8 5 102 } +End + +DefGroove Fill-In-AB Fill In AB, add the piano to prepare the B substyle + + +////////////////////// +/////// Main B +SeqClear +SeqSize 2 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 58; 1.51 0 54; 3 0 58; 3.51 0 55; 4.52 0 57 } \ + {1 0 59; 1.52 0 55; 3 0 58; 3.51 0 55; 4.52 0 57 } +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2.52 0 62 } \ + {2.51 0 58; 3.51 0 44 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 3 0 77 } \ + {1 0 80; 3 0 76 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 86; 2.52 0 84; 4 0 84 } \ + {2 0 76; 2.51 0 86; 4 0 86 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 8 1 75; 1 8 5 66; 1.51 8 1 77; 1.51 8 5 67; 2 8 1 84; 2 8 6 73; 2.52 8 1 84; 2.52 8 5 61; 3 8 1 77; 3 8 5 72; 3.51 8 1 80; 3.51 8 5 72; 4 8 1 77; 4 8 6 67; 4.52 8 1 76; 4.52 8 5 58 } \ + {1 8 1 80; 1 8 5 72; 1.52 8 1 79; 1.52 8 5 67; 2 8 1 79; 2 8 6 68; 2.51 8 1 76; 2.51 8 5 67; 3 8 1 77; 3 8 5 70; 3.51 8 1 76; 3.51 8 5 68; 4 8 1 84; 4 8 6 74; 4.52 8 1 77; 4.52 8 5 72 } +End + + +Begin Bass-7 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.5 8 5 69; 1.5 8 7- 68; 1.5 8 3 77; 2.5 16 5 74; 2.5 16 7- 76; 2.5 16 3 84; 3.5 16 5 72; 3.5 16 7- 72; 3.5 16 3 80; 4.5 16 5 77; 4.5 16 7- 72; 4.5 16 3 87 } \ + {1.5 16 5 72; 1.5 16 7- 74; 1.5 16 3 78; 2.5 16 5 72; 2.5 16 7- 74; 2.5 8 3 91; 3.5 16 5 72; 3.5 16 7- 74; 3.5 16 3 77; 4.5 16 5 76; 4.5 8 7- 76; 4.5 8 3 80 } +End + +Begin Bass-8 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 70; 2 4 6 77; 3 4 5 73; 4 8 6 75; 4.5 8 5 75 } \ + {1 4 1 65; 2 4 6 76; 3 4 5 70; 4 8 6 76; 4.5 8 5 78 } +End + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 87; 2 4 3 93; 3 4 5 87; 4 8 3 83; 4.52 8 5 83 } \ + {1 4 1 87; 2 4 3 93; 3 4 5 87; 4 8 6 83; 4.52 8 5 83 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {2.07 8 5 102; 3.57 8 5 102 } \ + {1.06 8 5 114; 2.55 8 5 114 } +End + +DefGroove Main-B Here it realy grooves and we have a piano + + +////////////////////// +/////// Fill In BA +SeqClear +SeqSize 1 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 59; 2.51 0 63; 3 0 58; 3.51 0 55; 4.52 0 57 } +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.02 0 68; 3.06 0 73; 4 0 73 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 80; 3 0 76 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3.01 0 86; 3.51 0 71; 4 0 86; 4.5 0 89 } +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.02 0 63 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 8 1 80; 1 8 5 72; 2.51 8 1 48; 2.51 8 5 48; 3 8 1 56; 3 8 5 56; 3.51 8 1 72; 3.51 8 5 72; 4 8 1 102; 4 8 5 102; 4.52 8 1 81; 4.52 8 5 81 } +End + + +Begin Bass-7 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.02 1 5 72; 1.02 1 7- 74; 1.02 1 3 78 } +End + +Begin Bass-8 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 1 1 65 } +End + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 1 1 87 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.06 8 5 114; 4.1 4 5 91 } +End + +DefGroove Fill-In-BA Fill In BA, we go back to Main A so piano only on the first messure + + +////////////////////// +/////// Fill In BB +SeqClear +SeqSize 1 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3 0 70; 3.51 0 77; 4 0 71; 4.52 0 71 } +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {3 0 69; 4 0 45; 4.52 0 73 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 75; 2 0 52; 3 0 75 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1.51 0 71; 2 0 84; 2.52 0 71; 3 0 89; 3.51 0 70; 3.69 0 89; 4 0 89; 4.52 0 78 } +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 88; 4.99 0 88 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1.51 8 1 50; 1.51 8 5 50; 2 8 1 57; 2 8 5 58; 2.52 8 1 66; 2.52 8 5 66; 3 8 1 73; 3 8 5 74; 3.51 8 1 80; 3.51 8 5 81; 4 8 1 90; 4 8 5 90; 4.52 8 1 96; 4.52 8 5 97 } +End + + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 87; 2 4 3 93; 3 4 5 83; 4 4 3 86 } +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {2.07 4 3 105; 3.07 4 5 105; 4.07 4 3 98 } +End + +DefGroove Fill-In-BB Fill In BB, pause the piano + + +////////////////////// +/////// Intro B +SeqClear +SeqSize 4 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 58; 1.51 0 54; 3 0 58; 3.51 0 55; 4.52 0 57 } \ + {1 0 59; 1.52 0 55; 3 0 58; 3.51 0 55; 4.52 0 57 } \ + {1 0 58; 1.51 0 54; 3 0 58; 3.51 0 55; 4.52 0 57; 4.75 0 40 } \ + {1 0 59; 1.17 0 40; 1.33 0 40; 1.52 0 66; 2.75 0 53; 3 0 58; 3.51 0 55; 4.17 0 54; 4.52 0 67 } +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2.52 0 62 } \ + {2.51 0 58 } \ + {2.52 0 62 } \ + {2.51 0 58; 4.52 0 56 } +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 3 0 77 } \ + {1 0 80; 3 0 76 } \ + {1 0 76; 3 0 77 } \ + {1 0 80; 3 0 76 } +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 86; 2.52 0 84; 4 0 84 } \ + {2 0 76; 2.51 0 86; 4 0 86 } \ + {2 0 86; 2.52 0 84; 4 0 84 } \ + {1.52 0 62; 2 0 76; 2.51 0 86; 3 0 76; 3.51 0 59; 4 0 86 } +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z z z {4.99 0 63 } +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence z z z {1.51 8 1 50; 1.51 8 5 50; 2 8 1 57; 2 8 5 58; 2.52 8 1 66; 2.52 8 5 66; 3 8 1 73; 3 8 5 74; 3.51 8 1 80; 3.51 8 5 81; 4 8 1 90; 4 8 5 90; 4.52 8 1 96; 4.52 8 5 97 } +End + + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence z z z {4.52 8 5 92 } +End + +DefGroove Intro-B Our Intro-B , drums, guitar & bass + + +////////////////////// +/////// Ending B +SeqClear +SeqSize 3 + +Begin Drum-Sticks + Tone Sticks + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 58; 1.51 0 54; 3 0 58; 3.51 0 55; 4.52 0 57 } \ + {1 0 59; 1.52 0 55; 2 0 60; 3 0 60; 3.5 0 54 } z +End + +Begin Drum-MetronomeBell + Tone MetronomeBell + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2.52 0 62 } \ + {1.04 0 67; 2.51 0 58 } z +End + +Begin Drum-KickDrum1 + Tone KickDrum1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {1 0 76; 3 0 77 } \ + {1 0 80; 2.5 0 80; 4 0 80 } z +End + +Begin Drum-SnareDrum2 + Tone SnareDrum2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence {2 0 86; 2.52 0 84; 4 0 84 } \ + {1.01 0 86; 2.51 0 86; 4 0 86 } z +End + +Begin Drum-CrashCymbal1 + Tone CrashCymbal1 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {1 0 63; 4 0 63 } z +End + +Begin Drum-CrashCymbal2 + Tone CrashCymbal2 + Rvolume 0 + Rtime 0 + Volume mf + Sequence z {2.5 0 75 } z +End + +Begin Bass-2 + Voice SteelGuitar + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {1 8 1 75; 1 8 5 66; 1.51 8 1 77; 1.51 8 5 67; 2 8 1 84; 2 8 5 73; 2.52 8 1 84; 2.52 8 5 61; 3 8 1 77; 3 8 5 72; 3.51 8 1 80; 3.51 8 5 72; 4 8 1 77; 4 8 5 67; 4.52 8 1 76; 4.52 8 5 58 } \ + {1 8 1 96; 1 8 5 86; 2.51 8 1 91; 2.51 8 5 80; 4 1 1 98; 4 1 5 90 } z +End + + +Begin Bass-7 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 5 + Sequence {1.5 8 5 69; 1.5 8 7- 68; 1.5 8 3 77; 2.5 16 5 74; 2.5 16 7- 76; 2.5 16 3 84; 3.5 16 5 72; 3.5 16 7- 72; 3.5 16 3 80; 4.5 16 5 77; 4.5 16 7- 72; 4.5 16 3 87 } \ + {1 16 5 72; 1 16 7- 74; 1 16 3 78; 2.5 16 5 72; 2.5 16 7- 74; 2.5 8 3 91; 4 1 5 72; 4 1 7- 74; 4 1 3 77 } z +End + +Begin Bass-8 + Voice Piano1 + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 4 1 70; 2 4 6 77; 3 4 5 73; 4 8 6 75; 4.5 8 5 75 } \ + {1 8 1 65; 2.5 8 1 65; 4 1 1 65 } z +End + + +Begin Bass-11 + Voice PickedBass + Rvolume 0 + Rtime 0 + Volume mf + Octave 3 + Sequence {1 8 1 87; 1.5 8 1 87; 2 8 6 93; 2.5 8 6 93; 3 8 5 83; 3.5 8 5 83; 4 8 6 86; 4.52 8 5 80 } \ + {1 8 1 87; 2.5 8 1 87; 4 1 1 87 } z +End + + +Begin Bass-15 + Voice TenorSax + Rvolume 0 + Rtime 0 + Volume mf + Octave 4 + Sequence {2.07 8 3 86; 3.57 8 3 86 } \ + {1.06 8 3 81; 2.55 8 3 81; 4.05 1 3 81 } z +End + +DefGroove Ending-B The ending, all instruments involved + + + +Groove Main-A +DefGroove Main-C /// Alias definition from Main-A + +Groove Main-A +DefGroove Main-D /// Alias definition from Main-A + +Groove Intro-B +DefGroove Intro-A /// Alias definition from Intro-B + +Groove Intro-B +DefGroove Intro-C /// Alias definition from Intro-B + +Groove Ending-B +DefGroove Ending-A /// Alias definition from Ending-B + +Groove Ending-B +DefGroove Ending-C /// Alias definition from Ending-B + +Groove Fill-In-AA +DefGroove Fill-In-CC /// Alias definition from Fill-In-AA + +Groove Fill-In-AA +DefGroove Fill-In-DD /// Alias definition from Fill-In-AA + diff --git a/mma/lib/stdlib/.mmaDB b/mma/lib/stdlib/.mmaDB new file mode 100644 index 0000000000000000000000000000000000000000..c2d37380a35cd5a70e123a6f822bb51fd18694c1 GIT binary patch literal 9613 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 MBBg!ITB`&911kSh($ literal 0 HcmV?d00001 diff --git a/mma/lib/stdlib/50srock.mma b/mma/lib/stdlib/50srock.mma new file mode 100644 index 0000000..6ac436c --- /dev/null +++ b/mma/lib/stdlib/50srock.mma @@ -0,0 +1,212 @@ +// 50srock + +Begin Doc + + Most older rock tunes accept these. Try it with songs like + "There's a Kind Of Hush". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////// Additional patterns + + +///////////// + +SeqSize 2 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D1234 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Clap + Tone HandClap + Sequence D24 + Volume pp + Rskip 5 + Rvolume 5 + Rtime 5 +End + +Begin Drum-Snare + Tone SnareDrum2 + Sequence D24 { D24; 3.75 0 80} + SeqRnd On + Volume p + Rvolume 5 + Rtime 5 +End + +Begin Drum-HH + Tone ClosedHiHat + Sequence { D1234; 2.75 0 90; 4.75 0 90} + Volume mp + Rvolume 5 + Rtime 5 + Volume mf +End + +Begin Walk + Voice AcousticBass + Sequence W1234 { W1234; 4.75 8 90 } + Octave 3 + Articulate 50 + Accent 1 10 3 10 + Rvolume 20 + Rtime 10 + Volume mf +End + +Begin Bass-Sax + Voice TenorSax + Sequence B1 B3 + Articulate 90 + Octave 4 + Rvolume 30 + Volume p + Rtime 10 +End + + +Begin Chord-Piano + Voice Piano3 + Sequence { C1234; 1.75 8 90 ; 3.75 8 90} { C14; 1.75 8 90; 3.75 8 90 } + Accent 1 20 3 20 + Voicing Mode=Optimal + DupRoot -1 + Articulate 74 + Rvolume 20 + Rskip 10 + Rtime 10 + Volume mp + Octave 5 +End + +Begin Chord-Sax + Voice TenorSax + Sequence { C2; C3 Shift .75 } { C1; C3 Shift .75 } + Voicing Mode=Optimal + SeqRnd On + Articulate 60 + Octave 5 + Rvolume 30 + Volume p + Rtime 10 + Rskip 10 +End + + +DefGroove 50sRock Your basic rock beat from the 50s. + + +/////////////////////////////////// +//////// Add in sustained strings + +Begin Chord-Sus + Voice TremoloStrings + Sequence {1 1 90 0 90 0 * 4} + Voicing Mode=Optimal + Unify On + Volume p + Octave 5 + Articulate 100 +End + +DefGroove 50sRockSus Sustained strings added. + + +/////////////////////////////// +/// Turn off the shuffle-feel + +Groove 50sRock + +Begin Drum-Clap + Tone HandClap + Sequence D24 + Rskip 20 + Rvolume 10 + Rtime 10 + Volume mp +End + +Drum-Snare Sequence D24 { D24; 3.5 0 80} +Drum-HH Sequence { D1234 ; 2.5 0 90; 4.5 0 90} +Walk Sequence W1234 { W1234; 4.5 8 90 } +Chord-Piano Sequence C134 C14 +Chord-Sax Sequence C23 C13 + +DefGroove 50sRock1 Cut out most of the shuffle. Good for short \ + contrast sections. + +Chord-Sus Groove 50sRockSus + +DefGroove 50sRock1Sus Unshuffled 50s with sustained strings. + + +//////////////////////// +////// Intro + +Groove 50sRock +SeqSize 4 +Alltracks SeqRnd Off + +Begin Drum-Kick + Sequence D1234 / / D1234 + Volume mp mp mf fff +End + +Drum-Clap Sequence D24 / / D1 +Begin Drum-Snare + Sequence {D1234; 2.5 0 90; 4.5 0 90 } / / D1234 + Volume p p mp fff +End + +Drum-HH Sequence D1234 / / D13 + +Walk Sequence {W1234; 4.75 8 90} / / {1 2 90 } + +Begin Bass-Sax + Sequence {1 2 1 90} + Octave 3 + Volume pp p mp f +End + +Chord-Piano Sequence L1 C24 L1 {1 2 90} + +Chord-Sax Sequence { C2; C3 Shift .75 } / / {1 2 90} + +DefGroove 50sRockIntro A 4 bar introduction. + + +////////////////////////////////// +////////// Simple Ending + +Groove 50sRock + +Drum-Snare Sequence D24 +Drum-HH Sequence D1234 +Walk Sequence - +Chord-Sax Sequence C13 +Bass-Sax Sequence - + +Begin Bass + Voice $_Walk_Voice + Octave $_Walk_Octave + Sequence B13 + Volume ff + Articulate 80 +End + +DefGroove 50sRockEnd Simple, single bar ending. + + diff --git a/mma/lib/stdlib/60srock.mma b/mma/lib/stdlib/60srock.mma new file mode 100644 index 0000000..bdff36d --- /dev/null +++ b/mma/lib/stdlib/60srock.mma @@ -0,0 +1,159 @@ +// 60srock + +Begin Doc + + Straight ahead rock beat in 4. Written for "Pretty Woman". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////// Additional patterns + + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Volume mf + Sequence D1234 + Rtime 10 + Rvolume 10 +End + +Begin Drum-Snare + Tone SnareDrum2 + Volume pp + Sequence {D24 Shift .5} + Rtime 10 + Rvolume 10 +End + +Begin Drum-OHH + Tone OpenHiHat + Sequence D1234 + Rskip 10 + Rtime 10 + Rvolume 10 + Volume pp +End + +Begin Bass + Voice FretlessBass + Volume mf + Octave 3 + Rtime 10 + Articulate 70 + Rvolume 10 + Sequence B13 / / z +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Volume mf + Articulate 70 + Rtime 10 + Rvolume 10 + Sequence z z z W1234 +End + +Begin Chord + Voice CleanGuitar + Sequence {C1234; C24 Shift .5} / / C1234 + Voicing Mode=Optimal + Volume mf + Articulate 90 + Strum 5 + Octave 4 + Rtime 10 + Rvolume 10 +End + +Begin Chord-Straight + Voice CleanGuitar + Sequence C1234 + Voicing Mode=Optimal + Volume mp + Articulate 99 + Strum 5 + Octave 5 + Rtime 10 + Rvolume 10 +End + +DefGroove 60sRock A loud, steady rock beat. + +/// Change the drum pattern for our alt. version + +Begin Drum-LBongo + Tone LowConga + Sequence D24 / / D1234 + Volume f + Rtime 10 + Rvolume 10 +End + +Begin Drum-HBongo + Tone OpenHighConga + Sequence D13 / / {D1234 Shift .5} + Volume f + Rtime 10 + Rvolume 10 +End + +Chord Sequence {C134; C23 Shift .5} / / C13 +Chord-Straight Sequence L2 +Walk Sequence - +Bass Sequence B13 +Drum-OHH Sequence - +Drum-Snare Sequence - + +DefGroove 60sRock1 Bridge version of 60sRock. + + +/////// Sustained + + +Groove 60sRock + +Begin Chord-Sus + Voice Strings + Articulate 100 + Voicing Mode=Optimal + Unify On + Sequence { 1 1 90 0 90 0 * 4 } + Octave 5 + Volume mp +End + +DefGroove 60sRockSus 60s Rock with strings. + +Groove 60sRock1 +Chord-Sus Groove 60sRockSus +DefGroove 60sRock1Sus Alternate 60s Rock with strings. + +////////////// +// Ending + +Groove 60sRock + +SeqSize 2 +Drum-Kick Sequence D1234 D13 +Drum-Snare Sequence {D1234 Shift .5} D13 +Drum-OHH Sequence D1234 D1 + +Bass Sequence B13 B11 +Walk Sequence - + +Chord Sequence C1234 C13 +Chord-Straight Sequence - + + +DefGroove 60sRockEnd Simple ending with 4 on first bar and 2 on 2nd. + diff --git a/mma/lib/stdlib/8beat.mma b/mma/lib/stdlib/8beat.mma new file mode 100644 index 0000000..9443c51 --- /dev/null +++ b/mma/lib/stdlib/8beat.mma @@ -0,0 +1,199 @@ + +// 8beat + +Begin Doc + + Most older rock tunes accept these. Try it with songs like + "There's a Kind Of Hush". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////// +// Define patterns + +Begin Drum Define + D1234+ D1234 ; D34 Shift .5 +End + +Begin Chord Define + P1 C1; C234 Shift .5 + P2 C1; C3 Shift .5 + P3 C1; C34 Shift .5 + P4 C34 Shift .5 + + // Guitar chords only play root/5th -- don't invert! + + G1 1 4 90 0 90 0 ; \ + 2.5 8 90 0 90 0; \ + 3 4 90 0 90 0; \ + 4 4 90 0 90 0 + + G2 1 1 90 0 90 0 * 4 +End + +Begin Bass Define + Bmain 1 4 1 110 ; 2 8 1 60 ; \ + 2.5 8 1 60 ; 3 8 1 60 ; \ + 3.5 8 1 60 ; 4.5 8 1 60 + Bplus 1 4 1 90 ; 2.5 8 1 80 ; \ + 3 8 1 90 ; 4 8 5 90 +End + +Begin Walk Define + Wskip 1 8 90 ; \ + 1.5 8 90 ; \ + 2.5 8 80 ; \ + 3 8 90 ; \ + 4 8 90 +End + +///////////////// +// 8beat + + +SeqSize 4 + +// Straight ahead drum stuff + +Begin Drum-OHH + Sequence { D1234; 1.5 0 90; 2.5 0 90} + Rskip 30 + Volume mp + Tone OpenHiHat + RVolume 20 +End + +Begin Drum-CHH + Sequence D8 + Tone ClosedHiHat + Rskip 20 + Volume mp + Rtime 2 + RVolume 20 +End + +Begin Drum-Snare + Sequence D24 / / { D24; 3.5 0 90; 4.5 0 90 } + Tone SnareDrum1 + Volume mp + Rtime 2 + RVolume 20 +End + +Begin Drum-Kick + Sequence {D1; 3.5 0 90; 4.5 0 90} {D1; D1 Shift .5; 3.5 0 90; 4.5 0 90} + Tone KickDrum1 + Volume mp + Rtime 3 + RVolume 10 +End + +// Bass. A heavy beat on 1 with softer on offbeats + +Begin Bass + Sequence Bmain + Voice FingeredBass + Octave 3 + Volume mf + RVolume 5 + Articulate 76 +End + +// Randomized chords on 1, 2, 2.5, 3, 3.5, 4 + +Begin Chord + Voice Honky-TonkPiano + Sequence P1 P2 P3 P4 + SeqRnd On + Voicing Mode=Optimal Rmove=10 + Volume mf + Articulate 90 + Octave 5 +End + +// Open harmony guitar chords + +Begin Chord-Guitar + Sequence G1 G1 G1 G2 + Voicing Mode=Invert + Articulate 90 + Volume mp + Voice CleanGuitar + Octave 4 +End + +DefGroove 8Beat Good for oldish rock stuff. + + + +//////////////////////////////////////////////////////////// +// Enhance the 8beat rhythms by adding a sustained string +//////////////////////////////////////////////////////////// + +// The SlowStrings groove is used as a track setting to +// be added to 8Beat and 8Beat1 grooves. Not meant to be +// used alone. + +Groove 8Beat + +Begin Chord-Sus + Voice SlowStrings + Sequence {1 1 90 0 90 0 * 4} + Voicing Mode=Optimal + Volume mp + Unify On + Octave 5 + Articulate 100 +End + +DefGroove 8BeatSus Adds sustained string to 8Beat. + +/////////////////////////////////////// +// 8Beat1 +// Adds a better bass line to 8beat. + +Groove 8Beat + +Bass Sequence Bplus z Bplus z +Begin Walk + Sequence z W1234 z Wskip + Voice FingeredBass + Octave 3 + RVolume 5 + Articulate 60 +End + +DefGroove 8Beat1 Adds interest to bass line with alternate walking bars. + +Chord-Sus Groove 8BeatSus +DefGroove 8Beat1Sus Adds sustained string to 8Beat1. + + +/////////////////////////////////////// +// 8BeatEnd + + +Groove 8Beat + +Seqsize 2 + +Drum-OHH Sequence D1234 +Drum-CHH Sequence D1234 D1 +Drum-Snare Sequence D1234 +Drum-Kick Sequence D1234+ D13 + +Chord Sequence C1234 C13 +Chord-Guitar Sequence C1234 C13 + +Bass Sequence B1 + +DefGroove 8BeatEnd Simple ending. + + diff --git a/mma/lib/stdlib/README b/mma/lib/stdlib/README new file mode 100644 index 0000000..1c40f4c --- /dev/null +++ b/mma/lib/stdlib/README @@ -0,0 +1,9 @@ + +These library files are presented as a proof-of-concept. A number +are sounding quite good, but many still need much more work to make +them "musical". Many of them were developed by recording the auto-accomp +on my Casio keyboard and then manually re-creating. + + +June/2004, bvdp. + diff --git a/mma/lib/stdlib/ballad.mma b/mma/lib/stdlib/ballad.mma new file mode 100644 index 0000000..5fd0f8a --- /dev/null +++ b/mma/lib/stdlib/ballad.mma @@ -0,0 +1,262 @@ + +// ballad + +Doc A rock ballad in 4. + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////// Additional Patterns + + +////////// Ballad + +SeqSize 4 + +// We just set some timings/volumes for the DRUM track, but no +// sequence. This is then used to as a master to copy into +// the real tracks. + +Begin Drum + Rvolume 20 + Rtime 4 + Rskip 5 + Volume p +End + +Begin Drum-Kick + Copy Drum + Sequence {D13; D2 shift .5} + Tone KickDrum1 + Volume f +End + +Begin Drum-HH + Copy Drum + Sequence D2 + Tone PedalHiHat +End + +Begin Drum-Cym + Copy Drum + Sequence D1 D1 z z + Tone RideCymbal1 +End + +Begin Drum-Tamb + Copy Drum + Sequence D4 + Tone Tambourine +End + +Begin Drum-Bongo + Copy Drum + Sequence {D2 shift .5} + Tone LowBongo +End + +Begin Drum-HiConga + Copy Drum + Sequence D4 + Tone MuteHighConga +End + +Begin Drum-LoConga + Copy Drum + Sequence D13 + Tone LowConga +End + +Begin Drum-Cabasa + Copy Drum + Sequence D1234 + Tone Cabasa +End + +Begin Drum-MuteTri + Copy Drum + Sequence {D24; D24 Shift .5} + Tone MuteTriangle +End + +Begin Drum-OpenTri + Copy Drum + Sequence D124 {D1234 Shift .5} + SeqRnd On + Tone OpenTriangle + Volume pp +End + +Begin Drum-Shake + Copy Drum + Sequence {D1234 Shift .5} + Tone Shaker +End + +// Chord is a 4 bar pattern. In bar 3 the +// 1st beat is skipped. + +Begin Chord + Voice Atmosphere + Sequence C1234 / C234 C1234 + Voicing Mode=Optimal Rmove=20 + Octave 5 + Articulate 99 + Volume mp +End + +// Bass beat is a 2 bar sequence. The first bar +// uses the root on beats 1 and 4; the 2nd uses +// the root and the 5th. + +Begin Bass + Voice FretLessBass + Sequence { 1 4 1 90 ; 4 4 1 80 } { 1 4 1 90 ; 4 4 5 80 } + Articulate 60 + Rtime 5 + Rvolume 10 + Octave 3 +End + +// Arpeggiate in 8ths. A fair bit of randomizing for the +// volume and timing. We also skip about 10% of the hits. + +Begin Arpeggio + Voice OrchestralHarp + Sequence A8 + Articulate 80 + Range 2 + Rtime 20 + Rskip 10 + Rvolume 30 + Octave 4 + SeqRnd On + Volume p +End + +DefGroove Ballad Simple Rock ballad in 4. + + +/////// Add sustained strings + +Groove Ballad + +Begin Chord-Sus + Voice TremoloStrings + Sequence {1 1 90 0 90 0 * 4} + Voicing Mode=Optimal + Octave 5 + Articulate 100 + Unify On + Volume p +End + + +DefGroove BalladSus Our simple ballad with sustained strings. + + +////////// Ballad1 - replace the arpeggio with block chords + +Groove Ballad + +Arpeggio Sequence - + +Begin Chord-Harp + Voice OrchestralHarp + Sequence { C134; 2.5 8 90 } + Articulate 80 + Rtime 20 + Rskip 10 + Rvolume 30 + Octave 4 5 + SeqRnd On + Volume p +End + +DefGroove Ballad1 Arpeggios replaced with block chords. + +Chord-Sus Groove BalladSus + +DefGroove Ballad1Sus Add sustained strings to Ballad1. + + +/////////////////// +/// 4 bar Intro + +Groove Ballad + +Begin Alltracks + SeqRnd Off + Rskip 0 +End + +Drum-Kick Sequence - +Drum-HH Sequence - +Drum-Cym Sequence D1 +Drum-Tamb Sequence - +Drum-Bongo Sequence - +Drum-HiConga Sequence D24 +Drum-LoConga Sequence D13 +Drum-Cabasa Sequence D1234 / / D13 +Drum-MuteTri Sequence D1234 +Begin Drum-OpenTri + Sequence D8 / / D12 + Volume ppp +End +Drum-Shake Sequence D1234 + +Chord Sequence {1 1 90 * 2} / / {1 2. 90} +Bass Sequence B11 / B13 {1 4 1 90; 2 4 5 90; 3 2 3 90} +Begin Arpeggio + Sequence A4 / / A1 + Rtime 0 + Volume f + Octave 5 +End + +DefGroove BalladIntro 4 bar introduction. + +Arpeggio Sequence - +Chord Sequence C1234 {C1234; C1 Shift .5} {C1234; C2 Shift .5} {1 2. 90} + +Bass Sequence B11 / B13 {1 4 5 90; 2 2. 1 90} + +DefGroove BalladIntro1 Intro without arpeggios and straight chords. + +Begin Chord-Sus + Groove BalladSus + Sequence * * * {1 2. 90 0 90 0} +End + +DefGroove BalladIntro2 Add in some sustained strings to BalladIntro1. + + +////////////////////////////////// +///////// BalladEnd + +Groove Ballad + +Drum-Kick Sequence D13 +Drum-Cym Sequence D1234 +Drum-MuteTri Sequence D24 +Drum-OpenTri Sequence D124 +Chord Sequence C1234 / C13 C1 +Bass Sequence B13 / / B1 +Arpeggio Sequence - +Begin Scale + Voice OrchestralHarp + Articulate 80 + Sequence Scale16 Scale8 Scale4 Scale2 + Range 3 + Direction Up + Volume mf +End + +DefGroove BalladEnd A 4 bar ending with a scale played on a harp. \ + The scale goes from 16ths, 8ths, quarters and half notes on \ + bars 1 to 4. + diff --git a/mma/lib/stdlib/basicrock.mma b/mma/lib/stdlib/basicrock.mma new file mode 100644 index 0000000..7c44d15 --- /dev/null +++ b/mma/lib/stdlib/basicrock.mma @@ -0,0 +1,158 @@ +// basicrock + +Begin Doc + + Basic Rock beat for things a bit to hard for softrock and + ballad beats. I wrote this for "Love Potion No. 9". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////// Additional patterns + +Begin Bass Define + Ba 1 4 1 90; 2.5 8 1 90; 3 4 1 90; 4.5 8 1 90 + Bb 1 4 1 90; 2.5 8 1 90; 3 4 1 90; 4.5 8 5 90 +End + +///////////// + +SeqSize 2 + +Begin Drum-Kick + Tone KickDrum1 + Sequence {D1; D2 Shift .5} + Volume mp + Rtime 10 + Rvolume 10 + Accent 1 20 +End + +Begin Drum-Snare + Tone SnareDrum1 + Sequence D24 + Volume mp + Rtime 10 + Rvolume 10 +End + +Begin Drum-OHH + Tone OpenHiHat + Sequence D1234 + Volume mp + Rtime 10 + Rvolume 10 + Accent 1 20 3 10 +End + +Begin Drum-Tam + Tone Tambourine + Sequence D8 + Volume mp + Rtime 10 + Rvolume 10 + Accent 1 20 3 10 + Rskip 10 +End + +Begin Bass + Voice FingeredBass + Sequence Ba Bb + Volume f + Octave 3 + Articulate 80 +End + +Begin Chord-Clean + Voice CleanGuitar + Sequence {1 8 90; 1.5 8 90; 2.5 8 90; 3 8 90; 4 8 90} + Octave 5 + Volume m + Articulate 80 + Rtime 5 + Rvolume 10 +End + +Begin Chord-Clean2 + Copy Chord-Clean + Sequence {2 8 90; 3.5 8 90; 4.5 8 90} + Invert 1 +End + +Begin Chord-Dist + Copy Chord-Clean + Voice DistortonGuitar + Sequence {1 8 90 0; 1.5 8 90 0; 2 8 70; 3 8 70 0; 3.5 8 70; 4.5 8 70} + Octave 4 + Volume p + Articulate 70 + Rvolume 10 + RTime 5 + RSkip 5 +End + + +DefGroove BasicRock A very basic rock beat in 4. + +Begin Chord-Sus + Voice Strings + Voicing Mode=Optimal + Volume mp + Articulate 100 + Unify On + Octave 5 + Sequence {1 1 90 0 90 0 * 4 } +End + +DefGroove BasicRockSus Even rockers like strings! + + +/////// Take out some of the off-beat stuff in the guitar chords. + +Groove BasicRock + +Begin Chord-Clean + Sequence C1234 + Articulate 90 + Volume mf +End + +Chord-Clean2 Sequence - + +Begin Bass + Sequence { B13; 3.5 8 5 90} {B13; 4.5 8 5 90} + SeqRnd On +End + +DefGroove BasicRock4 Same rock with more of a 4/4 emphasis. Good for \ + alternate sections. + + + +Chord-Sus Groove BasicRockSus + +DefGroove BasicRock4Sus Our 4/4 version with strings. + + +/// Ending + +Groove BasicRock + +Drum-Kickb Sequence D13 +Drum-Snare Sequence D24 D13 +Drum-OHH Sequence D1234 D13 +Drum-Tam Sequence D8 D13 +Bass Sequence B13 B11 +Chord-Clean Sequence C1234 C13 +Chord-Clean2 Sequence - +Chord-Dist Sequence {1 8 90 0; 3 8 70 } + +DefGroove BasicRockEnd A 2 bar ending. + + diff --git a/mma/lib/stdlib/beguine.mma b/mma/lib/stdlib/beguine.mma new file mode 100644 index 0000000..1b12179 --- /dev/null +++ b/mma/lib/stdlib/beguine.mma @@ -0,0 +1,248 @@ + +// beguine + +Begin Doc + + This started life as a copy of the rumba patterns. I've changed + the drum sounds from snares to toms, and deleted hits on final 8th + beat. I really don't know the difference between a rhumba and a + beguine, so help would be welcome! + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +///////////////////////////////// +///////// Beguine + + +SeqSize 4 + +//////// Lots of drum stuff going on, but on my synth it doesn't sound too busy. + +Begin Drum + Tone Claves + Sequence {D14 ; 2.5 0 90;} {D1 ; 3.5 0 90} {D13 shift .5} {D123 Shift .5} + SeqRnd On + Rvolume 10 + Rtime 2 + RSkip 5 + Volume ff +End + +Begin Drum-Maraca + Tone Maracas + Sequence D8 / / D1234 + SeqRnd On + Rvolume 5 + Rtime 2 + RSkip 5 +End + +Begin Drum-Lconga + Tone LowConga + Sequence D4 { D4; D3 shift .5 } + Rvolume 5 + Rtime 2 + Volume ff + RSkip 5 +End + +Begin Drum-Toms1 + Tone MidTom1 HighTom1 + Sequence D3 { D3 shift .5 } / z + SeqRnd On + Rvolume 5 + Rtime 2 + RSkip 5 +End + +Begin Drum-Toms2 + Tone MidTom2 HighTom2 + Sequence D3 { D2 shift .5 ; D4} + Rvolume 5 + Rtime 2 + RSkip 5 +End + + +Begin Drum-Hconga + Tone MuteHighConga + Sequence D2 { D1 shift .5 } + Rvolume 5 + Rtime 2 + RSkip 5 +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence D8 + Rvolume 5 + Rtime 2 +End + +/////// Main chording is the piano + + +Begin Chord + Voice Piano2 + Sequence C14 { C124; C34 Shift .5 } { C2; C34 Shift .5 } C124 + Accent 1 20 3 10 + SeqRnd On + Voicing Mode=Optimal + Octave 5 + Articulate 90 + Volume mf +End + + +/// Alternate bars with walk/bass. Gives a nice feeling. + +Begin Walk + Voice FretLessBass + Begin Define + Wa 1 4 85 ; 2.5 4 88 ; 4 4 80 + Wb Wa ; 4.5 8 77 + End + Sequence Wa z Wb z + Accent 1 20 + Articulate 60 + Volume mp + Octave 3 +End + +Begin Bass + Sequence z {B13 ; 2.5 4 5 70 } + Accent $_Walk_Accent + Voice $_Walk_Voice + Articulate $_Walk_Articulate + Volume $_Walk_Volume + Octave $_Walk_Octave +End + +DefGroove Beguine Nice, smooth easy listening. + +//////// Sustained strings in the background. + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing Mode=Optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + +DefGroove BeguineSus Adds in a sustained string. + + +//////////////////////////// +// Beguine1 +// This builds on the Beguine, adds in pizzicato arpeggios. + +Groove Beguine + +Begin Arpeggio + Sequence A4 + Invert 0 0 1 2 + SeqRnd On + Voice PizzicatoString + Articulate 80 + Octave 5 + Direction Random + Volume fff + Rvolume 10 + Rskip 30 +End + +DefGroove Beguine1 Adds a pizzicato string to standard Beguine. + +Chord-Sus Groove BeguineSus + +DefGroove Beguine1Sus This has the pizzicatos strings and a sustained string. + +///////////////////////////// +/// Fill + +Groove Beguine +SeqSize 1 + +Alltracks SeqRnd Off + +Begin Drum-Wis /// added tone + Tone ShortHiWhistle + Sequence {D1; D23 Shift .5} + Volume mp + Rvolume 5 + Rtime 2 +End + +Drum-Maraca Sequence D8 +Drum-Lconga Sequence D24 +Drum-Toms1 Sequence D3 +Drum-Toms2 Sequence D14 +Drum-Hconga Sequence D2 +Drum-HH Sequence D8 + +Chord Sequence { C134; C123 Shift .5 } +Walk Sequence - +Bass Sequence B1234 + +DefGroove BeguineFill Single bar fill, good for endings. + +/////////////////////////// +// Introduction + +Groove Beguine + +Alltracks SeqRnd Off +Alltracks RSkip 0 + +Drum Sequence * * * D12 +Drum-Maraca Sequence * * * D12 +Drum-Lconga Sequence D4 / / z +Drum-HH Sequence * + +Chord Sequence * * * {1 2 90} + +Bass Sequence * * * B1 + + +DefGroove BeguineIntro Simple enough 4 bar introduction. + + + +/////////////////////////// +// Ending + +// Just add a string run to the basic beguine + +Groove Beguine + +Begin Scale + Sequence Scale8 Scale4 Scale2 Scale + Voice SlowStrings + Articulate 99 + Volume m + Octave 4 + Harmony Open / / 3 + Direction Down + Range 3 +End + + +DefGroove BeguineEnd Ending with string scales. Uses 8ths \ + on 1st bar 4th on 2nd, halves 3rd and a fullish chord \ + on the 4th. Use a CUT if the final chord sounds too long. + + + + diff --git a/mma/lib/stdlib/bigband.mma b/mma/lib/stdlib/bigband.mma new file mode 100644 index 0000000..3e138b9 --- /dev/null +++ b/mma/lib/stdlib/bigband.mma @@ -0,0 +1,355 @@ + +// bigband + +Doc For a standard tune which doesn't fit the Swing grooves. + +Author Bob van der Poel + +SeqClear +Time 4 // All patterns are 4/4 +Timesig 4 4 +Include stdpats + +////////// Do all the defs first. + +Begin Drum Define + D1+234 D1234 ; 1.75 0 90 +End + +Begin Chord Define + C12' C1 ; C2 Shift .75 + C2'4 C2 Shift .75 ; C4 +End + + +//////////////////////// +// BigBand +// Basic Big Band + + +SeqSize 4 + +Begin Drum-HH + Sequence { D1234; D24 Shift .75 } + Rskip 10 + Tone OpenHiHat + Volume p + Rvolume 10 + Rtime 10 +End + +Begin Drum-Snare + Sequence z z z { D3 Shift .75 } + Tone SnareDrum1 + Volume mp + Rtime 10 +End + +Begin Drum-Kick + Sequence D1234 + Accent 1 20 2 -10 3 -10 4 -10 + Tone KickDrum1 + Volume mp + Rvolume 10 + Rtime 10 +End + +Begin Drum-Ride + Sequence D1 z z z + Tone RideCymbal1 + Rvolume 10 + Rtime 10 +End + +Begin Walk + Sequence W1234 + Accent 1 10 3 10 + Octave 3 + Voice AcousticBass + Articulate 80 + Volume f + Rvolume 4 +End + +Begin Chord + Sequence { 1 4. 90; 2.75 8 90 } { 1.75 8 90; 3 8 90 } + Voice Trombone + Voicing Mode=Optimal RMove=10 + Articulate 80 + Octave 5 + Volume mf + Rvolume 9 +End + +Begin Chord-Hits1 + Sequence { 4 8 90 } { 2 8 90; 3 8 90 } + Voice MutedTrumpet + Articulate 90 + Volume mf + Octave 5 + Rvolume 5 + Rskip 10 +End + +DefGroove BigBand Basic big band beat. + +Begin Chord-sus + Voice TremoloStrings + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Articulate 100 + Unify On + Volume p + Octave 5 +End + + +Chord-Hits1 Sequence - + +DefGroove BigBandSus Tremolo strings added to BigBand. + + +Groove BigBand + +Begin Arpeggio + Sequence A2 A4 Swing8 z + Invert 0 1 2 0 + Voice Piano1 + SeqRnd On + Volume mf f mp + Articulate 90 + Harmony OpenAbove / - + Rskip 10 20 40 0 + Rvolume 10 + Octave 6 +End + +DefGroove BigBandPlus Additional piano notes. + +Groove BigBandSus +Arpeggio Groove BigBandPlus +DefGroove BigBandSusPlus Sustained strings and piano. + +///////////////////////////////////// +// BigBand1 +// Basic Big Band with 1,3 bass +// Walking bass is replaced with a 1/3 +// Change 'bone seq to Piano +// Synth voice added to contrast with brass hits + +Groove BigBand // restore basic sequence + +Walk Sequence - + +Begin Bass + Sequence B13 + Voice AcousticBass + Octave 3 + Volume f +End + +Begin Chord + Voice Piano1 + Articulate 90 +End + +Begin Chord-Hits1 + Octave 5 +End + +Begin Chord-Hits2 + Sequence C2'4 C12' + Octave 6 + Voice SynthVox + Articulate 70 + Volume mp +End + +DefGroove BigBand1 Basic big band with 1,3 bass, no walking. + +Chord-Sus Groove BigBandSus + +DefGroove BigBand1Sus Bigband1 with sustained strings. + + +///////////////////////////////////////////// +// BigBand8 +// Basic Big Band with 8 bar variation + +Groove BigBand // restore basic +SeqSize 8 + +Drum-Kick Sequence D13 / / / / / / D8 + +Begin Chord + Sequence C12' C2'4 C12' C2'4 C12' C2'4 C12' C13 + Articulate 100 + Volume p +End + +Begin Walk + Voice AcousticBass + Sequence W1234 / / z W1234 / / z + Accent 1 10 3 10 + Octave 3 + Volume f +End + +Begin Bass + Voice $_Walk_Voice + Octave $_Walk_Octave + Sequence z z z B13 z z z B11 + Volume f +End + +DefGroove BigBand8 BigBand with 8 bar variation. + +Chord-Sus Groove BigBandSus + +DefGroove BigBand8Sus BigBand8 with sustained strings. + +///////////////////////// +/// Fill + +Groove BigBand + +SeqSize 1 + +// no change in drums + +Walk Sequence {1 1 90 * 2} +Chord Sequence - +Begin Chord-Hits1 + Octave 6 + Articulate 80 + Rvolume 0 + Rskip 0 + Sequence {1 4. 80; 3 16 100} +End + +DefGroove BigBandFill Simple fill bar, good in an ending. + +/////////////////////////////////// +// Intros + +Groove BigBand + + +Walk Sequence - + +Begin Bass + Voice $_Walk_Voice + Octave $_Walk_Octave + Articulate 90 + Volume f + Rvolume 4 + Sequence {1 4 1 90; 2 4 1 90; 3 4 3 90; 4 4 5 90} +End + +Begin Chord + Sequence { 1 4. 90; 2.75 8. 90 } { 1.75 8. 90; 3 8. 90 } + Voice Trombone + Voicing Mode=Optimal Rmove=0 + Articulate 80 + Octave 5 + Volume mf + Rvolume 9 +End + +Begin Chord-Hits1 + Sequence { 1 4 90 0 90 0; 4 8 90 0 90 0 } { 2 8 90 0 90 0; 3 4 90 0 90 0 } + Voice Trumpet + Voicing Mode=Optimal + Articulate 90 + Volume ff + Octave 5 + Rvolume 5 + Rskip 0 +End + + +DefGroove BigBandIntro 4 bar introduction. + +///////////////////////////////// +// Endings + +// 2 bar to finish BigBand + +Groove Bigband +SeqSize 2 + +Drum-HH Sequence D1+234 D13 +Drum-Kick Sequence D13 D1234 +Walk Sequence - + +Begin Bass + Sequence B13 + Octave 3 +End + +Chord Sequence C1234 C13 +Chord-Hits1 Sequence C1234 C13 + + +DefGroove BigBandEnd Straight ending for BigBand. + + +Groove BigBand1 +SeqSize 2 + +Drum-HH Sequence D1+234 D13 +Drum-Kick Sequence D13 D1234 + +Bass Sequence B11 +Chord Sequence C1234 C13 +Chord-Hits2 Sequence - + +Begin Chord-Sus + Groove BigBandSus + Volume m +End + +DefGroove BigBand1End Ending for BigBand1. + +// 4 bar to finish BigBand. Simalar to BigbandEnd, but 4 bars + + +Groove Bigband + +Drum-HH Sequence D14 D13 D1+234 D13 +Drum-Kick Sequence D13 / / D1234 +Walk Sequence - + +Begin Bass + Sequence B13 + Octave 3 +End + +Chord Sequence C13 / C1234 C13 +Chord-Hits1 Sequence C13 C123 C1234 C13 + + +DefGroove BigBand2End Straight, 4 bar ending for BigBand. + + + +// 4 bar to finish BigBand8 + +Groove BigBand +SeqSize 4 + +Drum-HH Sequence D1+234 D13 +Drum-Kick Sequence D13 D1234 + +Walk Sequence - +Bass Sequence B13 B11 +Chord Sequence C2'4 C2'4 C13 C13 +Chord-Hits2 Sequence C13 / + + +DefGroove BigBand4End A 4 bar ending. Good ending for BigBand8. + + + diff --git a/mma/lib/stdlib/bluegrass.mma b/mma/lib/stdlib/bluegrass.mma new file mode 100644 index 0000000..1b4cb7f --- /dev/null +++ b/mma/lib/stdlib/bluegrass.mma @@ -0,0 +1,175 @@ + +// bluegrass + +Begin Doc + + Completely out of my league and knowledge base here! But, what + the hell, we might as well give the old banjo a go. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////////// +///////// Pattern defines + +Begin Arpeggio Define + Arp4 1 2+16 90; 3.66 4+32 80 + Arp4 Arp4 * 2 +End + + +//////////////////////////////////// +/////////////////// Bluegrass + +SeqSize 4 + +Begin Chord + Voice NylonGuitar + Sequence C1234 / / C13 + Accent 1 20 3 10 + RSkip 10 + Voicing Mode=Optimal + Octave 5 + Strum 2 + Articulate 90 +End + +Begin Chord-Banjo + Voice Banjo + Sequence C8 / / C1234 + RSkip 20 + SeqRnd On + Voicing Mode=Invert + Octave 5 + Strum 30 + Articulate 50 + Volume pp +End + +Begin Bass + Voice AcousticBass + Sequence B13 / / z + Accent 1 20 + Octave 3 + Articulate 80 + Volume f +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Accent 1 20 + Articulate 80 + Volume f +End + +Begin Drum-HH + Sequence D13 / / D1234 + Tone OpenHiHat + RSkip 20 + Volume pp + Rvolume 20 + Rtime 4 +End + +Begin Drum-Snare + Sequence D1234 / / D8 + Rskip 10 + Tone SnareDrum1 + Rvolume 20 + Volume pp + Rtime 3 +End + +DefGroove BlueGrass A simple BlueGrass sound with a banjo and guitar doing \ + the strumming with a doghouse bass and drum holding the beat. + +// Add in a hand clap + +Begin Drum-Clap + Tone Handclap + Sequence D13 / / D1234 + Rskip 5 + Rtime 10 + Rvolume 10 + Volume mf +End + +DefGroove BlueGrassClap Bluegrass with added handclaps. + +/// Add in the good-old bottle section + +Begin Arpeggio + Voice BottleBlow + Sequence Arp4 + Articulate 50 60 70 80 + Octave 5 4 5 4 + Volume mf + SeqRnd On + Rskip 20 30 10 20 + Rvolume 30 +End + +DefGroove BlueGrassBottle Adds in a blow-bottle which no blue grass group \ + seems to be without. + +Drum-Clap Groove BlueGrassClap + +DefGroove BlueGrassBottleClap Bottles and handclaps...where will it stop! + +/////////////////////////////// +// Sustained strings with bluegrass? Sure +// Note the sequence used in the sustain. A full half note +// on beat 1 and a half note minus 1 midi tick on beat 3. +// This, with "Articulate 100" forces same-chords within +// the bar to be joined, but a short break at the bar ends. + +Groove BlueGrass + +Begin Chord-Sus + Sequence { 1 2 90 0 90 0; 3 2-0 90 0 90 0} + Octave 5 + Voice Accordion + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume p +End + +DefGroove BlueGrassSus Add sustained accordion. + + +////////////////////////////////////////// +// Simple ending for the bluegrassers + +Groove BlueGrass +SeqSize 1 + +Walk Sequence - +Drum-Snare Sequence D1234 +Drum-HH Sequence D8 +Chord Sequence C1234 + +Begin Bass + Sequence B11 + Volume ff +End + +Begin Chord-Banjo + Sequence C8 + Strum 0 + Articulate 99 +End + +DefGroove BlueGrassEnd One bar ending. + + + + diff --git a/mma/lib/stdlib/blues.mma b/mma/lib/stdlib/blues.mma new file mode 100644 index 0000000..4a59c2d --- /dev/null +++ b/mma/lib/stdlib/blues.mma @@ -0,0 +1,165 @@ + +// blues + + +Begin Doc + + If you don't understand the Blues, don't use these grooves + ... they will make you way too sad. + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + +//////////////////////////// +/// Pattern definitions + +Begin Walk Define + W1+34 1 4 80; 2.5 8 70; 3 4 80; 4 4 80 +End + + +/////////////////////////// +/// Groove definitons + +// Blues + +SeqSize 4 + +Begin Drum + Sequence D1234 + Tone SnareDrum1 + Rvolume 10 + Rskip 50 + Rtime 4 + Volume ppp +End + +Begin Drum-Clap + Sequence D24 + Tone HandClap + SeqRnd On + Rvolume 10 + RSkip 50 + Rtime 4 + Volume pp +End + +Begin Drum-HH + Sequence D1234 + Tone ClosedHiHat + RVolume 10 + Volume mp +End + +Begin Walk + Voice AcousticBass + Sequence W1234 / / z + Octave 3 + Volume mp + Articulate 80 +End + +Begin Bass + Voice $_Walk_Voice + Octave $_Walk_Octave + Sequence z / / B11 + Volume mp + Articulate 80 +End + +Begin Chord + Sequence C13 / / C1234 + Voicing Mode=Optimal + Voice Piano1 + Octave 4 + Volume mp + Articulate 99 +End + +DefGroove Blues Straight-ahead blues. + +Begin Chord + Sequence {C1234 * 3} + Octave 5 +End + +DefGroove BluesTriple Change the piano chords to triplets. Nice for \ + a transition bar. + + +Groove Blues + + +Begin Chord-sus + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Voice Harmonica + Articulate 100 + Unify On + Volume pp + Octave 5 +End + +DefGroove BluesSus Add a sustained harmonica. Annoying. + +Chord Groove BluesTriple + +DefGroove BluesTripleSus Sustained 'arp and chord triplets. + + +////////////////////////////////////// +// Alternate with piano + +Groove Blues + +Begin Arpeggio + Voice $_Chord_Voice + Volume mf + Articulate 80 + RSkip 40 + Sequence Swing8 + Rtime 10 + RVolume 15 +End + +DefGroove Blues1 Add honky-piano. + +Chord-Sus Groove BluesSus + +DefGroove Blues1Sus The honky-piano meets the mouth-arp. + +////////////////////////////////////// +/// Intro + +Groove Blues + +Drum Sequence D1234 / / D1 +Drum-Clap Sequence D1 +Drum-HH Sequence D1234 / / D1 +// Leave WALK as W1234 / / z +Bass Sequence z z z {1 2 1 90} +Chord Sequence C13 / / L1 + +DefGroove BluesIntro Simple, 4 bar, introduction. + +/// Ending + + +Chord Sequence C1234 / C13 / +Bass Sequence B11 +Walk Sequence - +Drum-Clap Sequence D13 +Drum Sequence D1234 / D13 / +Drum-HH Sequence D1234 / D13 / + +DefGroove BluesEnd A 4 bar ending. First 2 bars have 4 "hits", \ + the last 2 have 2. + diff --git a/mma/lib/stdlib/boggiewoggie.mma b/mma/lib/stdlib/boggiewoggie.mma new file mode 100644 index 0000000..6968ea8 --- /dev/null +++ b/mma/lib/stdlib/boggiewoggie.mma @@ -0,0 +1,101 @@ +// boggiewoogie + +Begin Doc + + A standard boogie-woogie blues beat. Great if you like this + style; I find it gets old on my ears fairly fast. + NOTE: This style uses dominate 7ths in the bass patterns. It'll + probably not sound good in songs with Major 7th or Diminished chords. +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////// Additional patterns + +Begin Bass Define + B4-1 1 4 1 90; 2 4 3 90; 3 4 5 90; 4 4 6 90 + B4-2 1 4 6# 90; 2 4 6 90; 3 4 5 90; 4 4 3 90 + + B8s-1 1 81 1 90; 1+81 82 1 90; 2 81 3 90; 2+81 82 3 90; \ + 3 81 5 90; 3+81 82 5 90; 4 81 6 90; 4+81 82 6 90 + B8s-2 1 81 6# 90; 1+81 82 6# 90; 2 81 6 90; 2+81 82 6 90; \ + 3 81 5 90; 3+81 82 5 90; 4 81 3 90; 4+81 82 3 90 + +End + +Begin Chord Define + BChord-1 1 81 90; 2+81 82 90 + + Bchord-2 1+81 82 90; 3 82 90; 3+81 82 90 + + Bchord-3 1+81 82 90; C2; C3; C4 + + Bchord-4 1 81 90; 1+81 82 90; 2 81 90; 2+81 82 90; 3+81 82 90; 3 4 90 + +End + +///////////// + +// The standard bass line for a boogie-woogie is +// 1,3,5,6 + +SeqSize 4 + +Begin Bass + Voice Piano2 + Octave 3 + Articulate 70 + Rtime 10 + RVolume 10 + Accent 1 3 + Sequence B4-1 B4-2 +End + +Begin Chord + Voice Piano2 + Octave 5 + Articulate 90 + Sequence Bchord-1 Bchord-2 Bchord-1 Bchord-4 +End + +DefGroove BoggieWoggie Basic BG with four-to-the-bar bass line. + +SeqSize 2 +Chord Sequence C13 Bchord-3 + +DefGroove BoggieWoggie1 Basic BG with stronger chord line. + + +Groove BoggieWoggie + +Begin Bass + Articulate 94 + Sequence B8s-1 B8s-2 +End + +DefGroove BoggieWoggie2 BG with 8/16s bass line. + +SeqSize 2 +Chord Sequence C13 Bchord-3 + +DefGroove BoggieWoggie3 BG with 8/16s bass line and strong chords. + +///////////////////// +// Ending + +Groove BoggieWoggie +SeqSize 2 + +Chord Sequence C13 C123 + +DefGroove BoggieWoggieEnd Same bass line but bar 1 has chords on 1/3 and \ + bar 2 has 1/2/3. Use a ``z!'' to turn off the \ + bass on the last beat(s). + + + diff --git a/mma/lib/stdlib/bolero.mma b/mma/lib/stdlib/bolero.mma new file mode 100644 index 0000000..1eb2135 --- /dev/null +++ b/mma/lib/stdlib/bolero.mma @@ -0,0 +1,313 @@ + +// bolero + +Begin Doc + + A try at a Bolero. Written for "Tonight". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////// +/////// Instrument patterns + + +Begin Chord Define + TR3 1 3 90; 1.33 3 90; 1.66 3 90 + CT1 C13; TR3 Shift 1 ; TR3 Shift 3 + CT2 C134; TR3 Shift 1 + CT3 C13; TR3 +End + +Drum Define Dtriple 1 0 90; 1.333 0 90; 1.666 0 90 + +///////////////////////////////// + + + +SeqSize 4 + +Begin Drum-Kick + Sequence {D1; D2 Shift .5} + Tone KickDrum1 + Rvolume 10 + Rtime 2 + Volume p +End + +Begin Drum-Hbongo + Sequence {D3 Shift .5} + Tone HighBongo + Rvolume 5 + Volume mp + Rtime 2 +End + +Begin Drum-Lbongo + Sequence {D4; D4 Shift .5} + Tone LowBongo + Rvolume 5 + Rtime 2 + Volume mp +End + +Begin Drum-Maraca + Sequence {D1234; D1234 Shift .5; D1 Shift .5} + Tone Maracas + Rskip 10 + Volume mp + Rvolume 5 + Rtime 2 +End + +Begin Drum-Claves + Sequence {D2; D3 Shift .5} + Tone Claves + Volume mp + Rvolume 5 + Rtime 2 +End + +Begin Chord + Voice SteelGuitar + Articulate 60 + Volume mp + Voicing Mode=Optimal + Sequence C8 + Octave 5 + Rskip 20 + Strum 3 + Rvolume 20 + Rtime 10 +End + +Begin Bass + Voice FingeredBass + Octave 3 + Articulate 80 + Accent 1 20 + Volume mf + Rtime 10 + Rvolume 20 + Sequence {1 4. 1 90; 2.5 8 3 90; 4 4 1 90} +End + +Begin Bass-Guitar + Voice NylonGuitar + Volume f + Octave 4 + Sequence {1 2. 1 90 } {4.5 8 1 90 } + Articulate 90 +End + +DefGroove Bolero Latin-style Bolero rhythm. + + +Begin Arpeggio + Voice Flute + Volume mp + Octave 5 + Range 2 + Sequence A8 + Articulate 60 + Rskip 20 + Rtime 10 + Rvolume 20 +End + +DefGroove BoleroFill Add arpeggiating flute. + +Groove Bolero + +Begin Chord-Sus + Voice Strings + Voicing Mode=Optimal + Octave 6 + Volume pp + Articulate 100 + Unify On + Sequence L2 +End + +DefGroove BoleroSus Bolero with sustained strings. +Arpeggio Groove BoleroFill +DefGroove BoleroSusFill Sustained Bolero with flute fill. + + +///////// Intro + +Groove Bolero + +Drum-Kick Sequence {D1; D2 Shift .5} / / D1 +Drum-Hbongo Sequence {D3 Shift .5} / / D1 +Drum-Lbongo Sequence {D4; D4 Shift .5} / / D1 +Drum-Maraca Sequence {D1234; D1234 Shift .5; D1 Shift .5} / / D1 +Drum-Claves Sequence {D2; D3 Shift .5} / / D1 + +Chord Sequence C134 / C1234 L1 + +Bass Sequence {1 4. 1 90; 2.5 8 3 90; 4 4 1 90} / / {1 1 1 90} +Bass-Guitar Sequence {1 2. 1 90 } {4.5 8 1 90 } / {1 1 3 90} + + +DefGroove BoleroIntro 4 bar intro. + + + +///////// Ending + +Groove Bolero + +Begin Scale + Sequence Scale8 Scale4 Scale2 Scale + Voice Strings + Range 3 + Articulate 99 + Volume ff + Octave 4 + Direction Both +End + +DefGroove BoleroEnd Ending with string scales. Uses 8ths \ + on 1st bar 4th on 2nd, halves 3rd and a \ + whole note on 4th. + + + +/////////////////////////////////////////////// +///////////////// More Spanish sounding + +SeqClear +SeqSize 4 + +Begin Drum-Snare + Sequence D13 + Tone SnareDrum2 + Rvolume 10 + Rtime 2 + Volume p +End + +Begin Drum-Hbongo + Sequence D13 + Tone HighBongo + Rvolume 5 + Volume mp + Rtime 2 +End + +Begin Drum-Lbongo + Sequence {Dtriple shift 1; Dtriple Shift 3} {Dtriple Shift 1; D4} + Tone LowBongo + Rvolume 5 + Rtime 2 + Volume mp +End + +Begin Drum-Claves + Sequence {Dtriple shift 1; D14} + Tone Claves + Volume mp + Rvolume 5 + Rtime 2 +End + +Begin Chord + Voice NylonGuitar + Articulate 80 + Volume mp + Voicing Mode=Optimal + Sequence CT1 CT2 + Octave 5 + Strum 3 + Rvolume 20 + Rtime 10 +End + +Begin Bass + Voice FingeredBass + Octave 3 + Articulate 80 + Accent 1 20 + Volume mf + Rtime 10 + Rvolume 20 + Sequence {1 4 1 90; 2.5 8 1 90; 3 8 5 90; 4 4 1 90} B11 +End + +DefGroove Bolero1 Spanish-style Bolero rhythm. + +Begin Arpeggio + Voice $_Chord_Voice + Sequence A2 A4 + SeqRnd On + RSkip 10 + Octave 5 + Range 1 + Harmony Open + Articulate 100 + Unify On + Volume ff +End + +DefGroove Bolero1Fill Add guitar arpeggios to Bolero1. + +Groove Bolero1 + +Begin Chord-Sus + Voice Strings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing Mode=Optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + + +DefGroove Bolero1Sus Spanish Bolero with sustained strings. + +Arpeggio Groove Bolero1Fill +DefGroove Bolero1SusFill Sustained Bolero1 with guitar fill. + + +////////////////// +//// Intro + +Groove Bolero1 + +Drum-Snare Sequence D13 / / D1 +Drum-Hbongo Sequence D13 / / D1 +Drum-Lbongo Sequence {Dtriple shift 1; Dtriple Shift 3} \ + {Dtriple Shift 1; D4} / D1 +Drum-Claves Sequence {Dtriple shift 1; D14} / / D1 + +Chord Sequence CT1 CT2 CT1 L1 + +Bass Sequence {1 4 1 90; 2.5 8 1 90; 3 8 5 90; 4 4 1 90} B11 B13 {1 1 1 90} + + +DefGroove Bolero1Intro 4 bar intro. + +/////////////////////// +///// Ending + +Groove Bolero1 +SeqSize 1 + +Drum-Lbongo Sequence {Dtriple ; Dtriple shift 1 ; D3} +Drum-Claves Sequence {Dtriple ; Dtriple shift 1 ; D3} +Chord Sequence CT3 +Bass Sequence B11 + +DefGroove Bolero1End Single bar ending for Bolero1. + + + + diff --git a/mma/lib/stdlib/bossanova.mma b/mma/lib/stdlib/bossanova.mma new file mode 100644 index 0000000..7d3d47f --- /dev/null +++ b/mma/lib/stdlib/bossanova.mma @@ -0,0 +1,296 @@ + +// bossanova + +Begin Doc + + This is a great latin rhythm for pieces like + "Girl From Ipanema". There's a real tendency + for me to get these latin rhythms way too complicated, so + if you want to take some stuff out, feel free to do so. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////////////// +// Do all defines first + +// For all the beats I describe them with 1,2,3,4 representing on-the-beat +// and 1', 2', etc. being on the and-of-1, and-of-2, etc. +// '8' is 8 8th notes + +Begin Drum Define + D2'4' D13 Shift 1.5 + D23' D2; 3.5 0 90 + D12'3 D13; 2.5 0 90 + D12'4 D14; 2.5 0 90 + D13' D1 ; 3.5 0 90 + D12'34' D13; D2'4' +End + + +Begin Bass Define + Basic 1 4. 1 100 ; 2.5 8 5 90 ; 3 4. 5 90 ; 4.5 8 1 90 +End + + +Begin Chord Define + C1233'4' C123; 3.5 8 90; 4. 8 90 + C1'2'34 C12 Shift .5; C34 + Sus1 1 1 90 * 2 + Sus3 1 1 0 90 0 * 2 + Sus5 1 1 0 0 90 0 * 2 +End + +////////////////////////////////////////////// +// BossaNova + + +SeqSize 4 + +Begin Drum + Tone Cabasa + Sequence D8 + Rvolume 10 + Rtime 5 + Volume mf + Accent 2 90 4 90 +End + +Begin Drum-LowConga + Sequence D13' + Rvolume 10 + Rtime 5 + Volume f + Tone LowConga +End + +Begin Drum-OpenHiConga + Sequence D2'4' + Rvolume 10 + Rtime 5 + Volume mf + Tone OpenHighConga +End + +Begin Drum-MuteConga + Sequence D2 + Rvolume 10 + Rtime 5 + Volume f + Tone MuteHighConga +End + +Begin Drum-LowBongo + Sequence D3 + Rvolume 10 + Rtime 5 + Volume mf + Tone LowBongo +End + +Begin Drum-CHH + Sequence D23 + Rvolume 10 + Volume mp + Rtime 5 + Tone ClosedHiHat +End + +Begin Drum-SideKick + Sequence D12'4 D23' // this is a 3/2 Clave pattern with delayed last beat + Rvolume 10 + Rtime 5 + Volume mp + Tone SideKick +End + +Begin Drum-Kick + Sequence D12'34' + Rvolume 10 + Volume mp + Rtime 5 + Tone KickDrum2 +End + +Begin Drum-Clave + Sequence D12'4 D23' // this is a 3/2 Clave pattern with delayed last beat + Tone Claves + Volume mf + RSkip 30 +End + +Begin Bass + Sequence B13 Basic / / + Accent 1 20 + SeqRnd On + RVolume 20 + Rtime 5 + Voice JazzGuitar + Octave 3 + Articulate 70 + Volume mf +End + +Begin Chord + Sequence C1233'4' C1'2'34 + Accent 1 20 3 10 + Voicing Mode=Optimal + Voice JazzGuitar + Articulate 75 + Rskip 5 + Strum 5 + Octave 5 + Volume mp +End + +DefGroove BossaNova Standard bossanova beat. + +////////////////////////////////// +// BossaNovaSus +// Add in sustained 1st ,3rd and 5ths + +Groove BossaNova + +// Change the seqsize from 4 to 8. This is done to let us give a lot +// of variety to the voices. We use 5th, 3rds and roots in 2 octaves. + +SeqSize 8 + +Begin Chord-Sus + Voice ChoirAahs / / / VoiceOohs / / / + Sequence Sus1 Sus3 Sus5 Sus1 Sus1 Sus3 Sus5 z + Voicing Mode=Optimal + Volume ppp + Octave 5 + Articulate 100 + Unify On + SeqRnd On +End + +DefGroove BossaNovaSus Adds sustained choir voices. + +Groove BossaNova + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Octave 5 + Voice Strings + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume pp +End + +DefGroove BossaNova1Sus Adds sustained strings. + +////////////////////////// +// BossaNovaFill +// Add some bells. Good for a 1/2 bar transition + +Groove BossaNova + +// Drum mods ... +// 1 - kill the congas +// 2 - add a triangle +// 3 - add in snares on 8ths + + +Drum-OpenHiConga Sequence - +Drum-MuteConga Sequence - + +Begin Drum-Triangle + Sequence { D1234 Shift .5 } + Rskip 30 + Tone OpenTriangle + Volume ff +End + +Begin Drum-Snare + Sequence D1234 + Volume mf + RSkip 10 + Tone SnareDrum1 +End + +Begin Drum-Snare1 + Copy Drum-Snare + Sequence { D1234 Shift .5 } + Tone SnareDrum2 +End + +// Make the bass just 13 + +Bass Sequence B13 + +// Make chord just 1234 + +Chord Sequence C1234 + +DefGroove BossaNovaFill Adds a bell to the BossaNova groove and \ + forces the chord to a straight pattern. \ + This Good for the occasional bar in an ending, etc. +/////////////////////////////////////////////////////// +// Intro + +Groove BossaNova + +Alltracks SeqRnd Off + +Bass Sequence B13 Basic / B1 +Chord Sequence C1233'4' C1'2'34 / {1 2 90} + +DefGroove BossaNovaIntro Dull introduction. + +SeqSize 8 + + +Bass Sequence B13 Basic B13 Basic B13 Basic Basic B1 +Chord Sequence C1233'4' / C1'2'34 / C1233'4' / C1'2'34 {1 2 90} + +DefGroove BossaNovaIntro8 Another dull intro, but this is for 8 bars. + +/////////////////////////////////////////////////////// +// Endings + + +Groove BossaNova + +Alltracks SeqRnd Off +Bass Sequence B13 / / {1 2 1 90} + +Begin Scale + Sequence Scale8 Scale4 Scale2 Scale + Range 4 + Octave 4 + Articulate 99 + Voice Strings +End + +Chord Sequence C1234 +Chord Duproot -1 + +DefGroove BossaNovaEnd The strings do a scale. First bar is eights, \ + second is quarters, third is halves, and \ + the last is a held whole note. + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Octave 5 + Voice TremoloStrings + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume mp +End + +DefGroove BossaNova1End Same ending, but with sustained strings added. + +Scale Sequence - + +DefGroove BossaNova2End Ending with sustained strings, but no scale. diff --git a/mma/lib/stdlib/broadway.mma b/mma/lib/stdlib/broadway.mma new file mode 100644 index 0000000..7fca11d --- /dev/null +++ b/mma/lib/stdlib/broadway.mma @@ -0,0 +1,166 @@ + +// broadway + +Begin Doc + + A real ripoff of the Casio rhythm. Note that this is really + a 2/4 pattern, so you'll probably want to double the tempo. + I'm using this in "Everything's Coming Up Roses" at a tempo of 280. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +///////////////////////////////////// +//// Basic Pattern + +Seqsize 8 + +Begin Drum-Kick + Tone KickDrum1 + Volume mp + Rvolume 10 + Rtime 2 + Sequence D13 +End + +Begin Drum-Snare + Tone SnareDrum1 + Volume mp + Sequence D1 z z z +End + +Begin Drum-HiH1 + Tone ClosedHiHat + Volume f + Sequence D13 +End + +Begin Drum-HiH2 + Tone ClosedHiHat + Volume mp + Sequence D24 + Rtime 2 + Rskip 5 +End + +Begin Drum-Tri + Tone OpenTriangle + Volume mp + Sequence {D1 shift .2} z z z +End + +Begin Bass + Voice AcousticBass + Volume mf + Articulate 60 + Rtime 4 + Rvolume 10 + Accent 1 10 3 10 + Sequence B13 / {1 4 1 90; 3 8 3 90; 4 8 4 90} { 1 4 5 90; 3 4 3 90} + Octave 3 +End + +Begin Chord-Piz + Voice PizzicatoString + Volume mp + Rskip 10 + Rvolume 10 + Rtime 5 + Voicing Mode=Optimal + Sequence C24 + Octave 5 +End + + +Begin Chord-Gloc + Voice Glockenspiel + Sequence C2 C1 C2 C13 C2 C1 C24 C1 + Voicing Mode=Optimal + Rskip 50 + Articulate 50 + Volume p + Octave 7 +End + +DefGroove Broadway A very corny Broadway tune rhythm. + +Begin Arpeggio + Voice Piccolo + Sequence A4 + Articulate 40 + Rskip 60 + Octave 7 + Volume m +End + +DefGroove Broadway1 Add in arpegiating flute. + + +//////////////////////////////////// +/// Sustained versions + +Groove Broadway + +Begin Chord-Sus + Voice Strings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Octave 5 + Articulate 100 + Unify On + Rvolume 5 + Volume p +End + +Chord-Piz Volume -30 + +DefGroove BroadwaySus Add sustained strings. + +Begin Arpeggio + Groove Broadway1 + Volume -40 +End + +DefGroove Broadway1Sus Sustained strings and apregiating flute. + + +///////////////////////////////////////////// +/// Introduction + +Groove Broadway + +SeqSize 4 + +Drum-Kick Sequence * * * D13 +Bass Sequence * * {1 2 5 90; 3 2 4 90} {1 4. 3 90; 3 4. 2 90} +Chord-Piz Sequence * * C13 C1 +Chord-Gloc Sequence * * C13 C1 + +DefGroove BroadwayIntro Simple 4 bar intro. + + +//////////////////////////////////////////// +/// Ending + + +Groove Broadway +SeqSize 2 + +Drum-Kick Sequence D1234 D12 +Drum-Snare Sequence D1 / +Drum-HiH1 Sequence D1234 D12 +Drum-HiH2 Sequence * {D1 Shift .5} +Drum-Tri Sequence D1 / +Bass Sequence {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} {1 2 1 90} +Chord-Piz Sequence * {C12;C1 Shift .5} +Chord-Gloc Sequence * C12 + + +Defgroove BroadWayEnd A 2 bar ending reminiscent of a cha-cha. diff --git a/mma/lib/stdlib/calypso.mma b/mma/lib/stdlib/calypso.mma new file mode 100644 index 0000000..2046a6c --- /dev/null +++ b/mma/lib/stdlib/calypso.mma @@ -0,0 +1,144 @@ + +// calypso + + +Begin Doc + + Again, I'm no expert! I did this one to play with the + Sonny Rollins song "St. Thomas". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////// +// Define patterns + +Begin Chord Define + C12'3 C14 ; 2.5 16 80 + C12'34 C12'3 ; C4 +End + +Begin Drum Define + D13+ D13 ; D13 Shift .5 + D2'4 2.5 0 90; 4 0 90 +End + +Begin Walk Define + W1'3 W13; 2.5 16 80 + W13' W13; 4.5 16 80 +End + +///////////////// +// Calypso + + +SeqSize 4 + +Begin Chord + Sequence C12'3 / / C12'34 + Voice JazzGuitar + Volume mp + Voicing Mode=Optimal Rmove=10 + Octave 6 + DupRoot -1 + Articulate 90 + Rvolume 5 + Rtime 2 + Rskip 5 + Strum 6 +End + +Begin Drum-LowBongo + Sequence D13 D13+ + Tone LowBongo + Rvolume 20 + Rtime 5 +End + +Begin Drum-LowConga + Sequence D2'4 + Tone LowConga + Rvolume 20 + RTime 4 +End + +Begin Drum-Cym + Sequence D1234 + Tone CrashCymbal1 + Volume ppp + Rtime 20 + Rvolume 20 + Rskip 90 +End + +Begin Walk + Sequence W13 / W1'3 W13' + Accent 1 10 + SeqRnd On + Octave 3 + Voice AcousticBass + Articulate 90 + Volume f + Rvolume 4 + Rtime 5 +End + +DefGroove Calypso A nice, simple Calypos beat with lots of tom-drums. + +Begin Chord-Sus + Voice SynthVox + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + +DefGroove CalypsoSus A synth voice sustained under the beat. + + +////////////// +// Alternate with a 4 to the bar walk + +Groove Calypso + +Begin Walk + Sequence W1234 + Direction Down + Octave 3 + Articulate 70 +End + +DefGroove Calypso1 Walking Bass changed to 4-in-a-bar. + +Chord-Sus Groove CalypsoSus + +DefGroove Calypso1Sus 4-in-a-bar bass with sustained, artifical voices. + +//////////////// +// A 1 bar ending. This uses all the same instruments +// but puts everything on the beat. + +Groove Calypso +SeqSize 1 + +Alltracks Rskip 0 + +Drum-LowBongo Sequence D1234 +Drum-LowConga Sequence D1234 +Drum-Cym Sequence D12 +Walk Sequence W1234 +Chord Sequence C1234 + +DefGroove CalypsoEnd A very simple, finalized ending. All \ + the same instruments as Calypso, but \ + all are on beats 1,2,3 and 4. + + diff --git a/mma/lib/stdlib/chacha.mma b/mma/lib/stdlib/chacha.mma new file mode 100644 index 0000000..eac946c --- /dev/null +++ b/mma/lib/stdlib/chacha.mma @@ -0,0 +1,202 @@ + +// chacha + +Begin Doc + + A popular, albeit somewhat dated and make trite by Americanized versions, + The Cha-Cha-Cha remains a popular rhythm with broad audience appeal. + I've used ``Rico Vacilon'' as a demo. + This file was mostly developed from the patterns in``Latin Rhythms: Mystery Unraveled'' + by Victor Lopez. +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +Seqsize 2 + +Begin Drum-Clave + Tone Claves + Volume f + Sequence Clave2 Clave3 + Rvolume 10 + Rtime 5 +End + +Begin Drum-LGuiro + Tone LongGuiro + Volume f + Sequence {D13; D13 Shift .2} + Rvolume 10 + Rtime 5 +End + +Begin Drum-SGuiro + Tone ShortGuiro + Volume f + Sequence {D24; D24 Shift .5} + Rvolume 10 + Rtime 5 +End + +Begin Drum-HConga + Tone MuteHighConga + Volume m + Rvolume 10 + Rtime 2 + Sequence {D1; D13 Shift .5} {D1; D1234 Shift .5} +End + +Begin Drum-LConga + Tone LowConga + Volume m + Rvolume 10 + Rtime 2 + Sequence {D234; D24 Shift .5} D234 +End + +Begin Drum-Snare + Tone SnareDrum1 + Volume m + Rvolume 10 + Rtime 2 + Sequence D13 +End + +Begin Drum-HH + Tone RideCymbal1 + Volume p + Rvolume 10 + Rtime 2 + Accent 1 70 2 60 3 70 4 60 + Sequence D8 +End + +Begin Drum-MTom + Tone MidTom2 + Volume f + Rvolume 10 + Rtime 2 + Sequence D4 +End + +Begin Drum-HTom + Tone HighTom2 + Volume f + Rvolume 10 + Rtime 2 + Sequence {D4 Shift .5} +End + +Begin Bass + Voice JazzGuitar + Volume f + Octave 3 + Articulate 100 + Unify On + Sequence {1 4 1- 90; 2.5 16 5 90; 3 8 3 90; 4 4 1 90} \ + {1 4 1 90; 2.5 16 5 90; 3 8 5 90; 4 4 1- 90} +End + +Begin Chord + Voice Piano1 + Volume mf + Articulate 66 + Voicing Mode=Optimal + Octave 5 + Rskip 10 + Rvolume 10 + Sequence {C12; C34 Shift .5} {C23 Shift .5} +End + + +DefGroove ChaCha Our basic, non-American, pattern. + +////// Add in flute arps. + +Groove ChaCha + +Begin Arpeggio + Voice Flute + Volume m + Articulate 80 + SeqRnd On + Octave 7 + Range 1 + Direction Random + Harmony Open + HarmonyVolume 50 + Rskip 10 + Rvolume 30 + Rtime 20 + Sequence A8 A4 +End + +DefGroove ChaCha1 Adds in flute arpeggios. + +////// Sustained + +Groove ChaCha + +Alltracks Volume -20 + +Begin Arpeggio-Sus + Voice Bandoneon + Volume p + Octave 6 + Articulate 100 + Harmony Open + Range 1 + Direction Random + Sequence A2 +End + +DefGroove ChaChaSus Adds sustained string arpeggios. + +Groove ChaCha1 +Arpeggio-Sus Groove ChaChaSus +DefGroove ChaCha1Sus Combines the flute and string arpeggios. + +////// Introduction + +Groove ChaCha +SeqSize 4 + +Drum-Clave Sequence * * * D14 +Drum-LGuiro Sequence * * * D1 +Drum-SGuiro Sequence * * * {D12 Shift .5} +Drum-HConga Sequence D13 +Drum-LConga Sequence D24 +Drum-Snare Sequence D1 +Drum-HH Sequence * * D16 D123 +//Drum-MTom Sequence D4 +//Drum-HTom Sequence {D4 Shift .5} +Bass Sequence * * * B11 +Chord Sequence * * {C4; C4 Shift .5} L1 + +DefGroove ChaChaIntro A plain 4 bar introduction. + +///// Ending + +Groove ChaCha + +Drum-Clave Sequence D1234 D13 +Drum-LGuiro Sequence * z +Drum-SGuiro Sequence * {D2; D2 Shift .5} +//Drum-HConga Sequence D13 +Drum-LConga Sequence D2 +Drum-Snare Sequence D8 D1 +Drum-HH Sequence D16 z +Drum-MTom Sequence * z +Drum-HTom Sequence * z +Bass Sequence * B11 +Chord Sequence * L1 + +DefGroove ChaChaEnd The End. + + + diff --git a/mma/lib/stdlib/countryblues.mma b/mma/lib/stdlib/countryblues.mma new file mode 100644 index 0000000..9866faa --- /dev/null +++ b/mma/lib/stdlib/countryblues.mma @@ -0,0 +1,213 @@ + +// countryblues + + +Doc I use this on some country tunes like "I Fall To Pieces". + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + +//////////////////////////// +/// Pattern definitions + + +Begin Bass Define + B134 1 4 1 90; 3 8+16 3 80; 4 4 5 85 +End + + +//////////////////////////////////////////////////// + + +SeqSize 4 + +Begin Drum-Snare + Sequence D8 + Tone SnareDrum1 + Rskip 10 + Rtime 2 + Volume pp +End + +Begin Drum-HH + Sequence { D8 Shift .5 } + Tone OpenHiHat + Rskip 40 + Rtime 2 + Volume ppp +End + +Begin Drum-Clap + Sequence D24 + Tone HandClap + Volume mp + Rvolume 10 + RSkip 50 +End + + +// Piano chords on beats 1, 2, 3 and 4 + +Begin Chord + Voice Piano3 + Sequence C1234 + Voicing Mode=Optimal + RVolume 5 + Octave 5 + Volume mf + Articulate 99 +End + +// Push notes just before beats 2 and 4. Same piano as CHORD, but +// different volume, articulation, and octave. + +Begin Chord-1 + Voice $_Chord_Voice + Octave 6 + RVolume 5 + Sequence {C13 Shift .666} + Articulate 80 + Volume mp +End + +// Simple enough bass pattern: +// bar 1 & 3 - root on 1, 3rd on 3 and 5th on 4 +// bar 2 - root on 1, 5th on 3 +// bar 4 - 1/4 note walk + +Begin Bass + Voice FretlessBass + Sequence B134 B13 B134 z + Octave 3 + Volume mp + Articulate 80 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Volume $_Bass_Volume + Articulate $_Bass_Articulate +End + + +DefGroove CountryBlues Somewhat lamentive blues. + + + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume mp + Voice SlowStrings + Octave 5 + Articulate 100 + Unify On +End + +DefGroove CountryBluesSus Adds sustained strings. + +/// Full walking bass + +Groove CountryBlues + +Bass Sequence - +Walk Sequence W1234 + +DefGroove CountryBluesWalk Walking bass version. + +Chord-Sus Groove CountryBluesSus + +DefGroove CountryBluesWalkSus Walking bass and sustained strings. + + +////////////////////////////////////////////// +// CountryBlues1 +// Change chord for a random Triplet/Triplet/Chord/Chord + +Groove CountryBlues + +Begin Chord + Sequence C1234 { C1234 * 3 } + Volume mp p +End + +Chord-1 Sequence {C13 Shift .66} C13 + +DefGroove CountryBlues1 Add piano triplets every 4 bars. + +Chord-Sus Groove CountryBluesSus + +DefGroove CountryBlues1Sus Sustained version. + +Groove CountryBlues1 +Bass Sequence - +Walk Sequence W1234 + +DefGroove CountryBlues1Walk Triplet version with walking bass. + +Chord-Sus Groove CountryBluesSus + +DefGroove CountryBlues1WalkSus Triplet version with walking bass and strings. + + +////////////////// +/// Fiddle fill versions + + +Groove CountryBlues + +Begin Arpeggio + Voice Violin + Sequence A4 / A8 A6 + RSkip 10 + Articulate 99 + Unify on + Direction Random + SeqRnd On + Range 2 + Volume p + Octave 5 +End + +DefGroove CountryBluesFill Adds a bad fiddler (use sparingly!). + +Groove CountryBluesWalk +Arpeggio Groove CountryBluesFill +DefGroove CountryBluesWalkFill Walking bass with fiddler. + +Groove CountryBlues1 +Arpeggio Groove CountryBluesFill +DefGroove CountryBlues1Fill Piano triplets and fiddle. + +Groove CountryBlues1Walk +Arpeggio Groove CountryBluesFill +DefGroove CountryBlues1WalkFill Piano triplets, walking bass and fiddle. + + + +////////////////////////////////////// +/// Endings + +Groove CountryBlues + +Drum-Snare Sequence D13 +Drum-HH Sequence D13 +Begin Drum-Clap + Sequence D24 + RSkip 0 +End + +Chord Sequence C1234 +CHord-1 Sequence - +Bass Sequence B11 +Walk Sequence - + +Defgroove CountryBluesEnd Simple ending. + + diff --git a/mma/lib/stdlib/countryswing.mma b/mma/lib/stdlib/countryswing.mma new file mode 100644 index 0000000..166725e --- /dev/null +++ b/mma/lib/stdlib/countryswing.mma @@ -0,0 +1,186 @@ + +// countryswing + +Begin Doc + + Quite simple rhythm. I'm not big on country, but this + does seem to fit with "Singing The Blues". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////////// +///////// Pattern defines + +Begin Arpeggio Define + Fiddle1 1 2 90 * 2; 2+81 82 80; 3+81 82 80 + Fiddle2 1 1 90 * 4; 1+81 82 80; 2+81 82 80; 3+81 82 80; 4+81 82 80 +End + + +Begin Drum Define + D12+34 D1234 ; 2.5 0 80 +End + +//////////////////////////////////// +/////////////////// CountrySwing + + +SeqSize 4 + +Begin Chord + Sequence C1234 / / {C1234 ; 1.5 16 60 ; 3.5 16 60 } + Accent 1 10 + RSkip 10 + Voicing Mode=Optimal + Voice NylonGuitar + Volume f + Octave 5 + Strum 4 + Direction Both + Articulate 99 +End + +Begin Bass + Voice FingeredBass + Sequence B13 / / z + Octave 3 + Articulate 99 + Volume mp +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Articulate 80 + Volume mp +End + +Begin Drum-HH + Sequence D13 / / D1234 + Tone OpenHiHat + RSkip 5 + Volume pp + Rvolume 20 + Rtime 4 +End + +Begin Drum-Snare + Sequence D12+34 + Tone SnareDrum2 + Rvolume 20 + Volume ppp + Rtime 3 +End + +DefGroove CountrySwing Marty Robbins might like this. + +// Here we could use a bass track since we are only playing +// single notes in the sustain ... but, using chords gives +// the advantage of VOICING ... which avoids some awkward jumps. +// The sequence toggles between root and 5 ONLY. + +Begin Chord-Sus + Voice Fiddle + Sequence { 1 1 90 0 * 4 } { 1 1 0 0 90 0 * 4} + Octave 6 + SeqRnd On + Voicing Mode=Optimal + Volume ppp + Articulate 100 + Unify On +End + +DefGroove CountrySwingSus Adds a sustained fiddle to the hoedown. + + +//////////////////////////////// +// CountrySwing1 +// Add a fiddle. Cheesy! + +Groove CountrySwing + +Begin Arpeggio + Sequence Fiddle1 Fiddle2 / / + RSkip 20 + Articulate 97 + SeqRnd On + Voice Violin + Range 2 + Volume p + Octave 5 +End + +DefGroove CountrySwing1 Adds an annoying fiddle. + +Chord-Sus Groove CountrySwingSus + +DefGroove CountrySwing1Sus Now we have 2 fiddlers, one off in wonderland \ + and a second playing long notes. + +///// A different fiddler + +Groove CountrySwing + +Begin Arpeggio + Voice Violin + Sequence A8 + Harmony OpenAbove + Invert 0 1 2 -1 + Accent 1 10 3 10 + Rskip 10 + Articulate 90 80 100 70 + SeqRnd On + Volume ppp + Octave 5 +End + +DefGroove CountrySwing2 Same fiddle, but a more sane pattern. + +Chord-Sus Groove CountrySwingSus + +DefGroove CountrySwing2Sus A sustained and a random fiddler. Great dance! + +//////////////////////////////// +// Introduction +//////////////////////////////// + + +Groove CountrySwing + +Alltracks SeqRnd Off + +Chord Sequence C1234 / / {1 2. 80} +Bass Sequence B13 / / {1 2 1 80} +Walk Sequence - +Drum-HH Sequence D13 / / D14 +Drum-Snare Sequence D12+34 / / D1 + +DefGroove CountrySwingIntro Simple 4 bar introduction. + +//////////////////////////////// +// CountrySwingEnd +// 2 bar ending, just set everything to a straight 4 + +Groove CountrySwing + +Seqsize 2 + +Arpeggio Sequence - +Walk Sequence - +Bass Sequence B1234 B13 +Chord Sequence C1234 C13 + +Drum-HH Sequence D1234 +Drum-Snare Sequence D1234 D13 + +DefGroove CountrySwingEnd Simple ending. Hits on each beat on bar 1, \ + beats 1 and 3 on bar 2. + diff --git a/mma/lib/stdlib/countrywaltz.mma b/mma/lib/stdlib/countrywaltz.mma new file mode 100644 index 0000000..14ec542 --- /dev/null +++ b/mma/lib/stdlib/countrywaltz.mma @@ -0,0 +1,212 @@ + +// countrywaltz + +Begin Doc + + These waltzes are good for "old-time" things like + "Que Sera Sera" and "Tammy". + +End + +Author Bob van der Poel + +SeqClear +Time 3 +Timesig 3 4 +Include stdpats34 + + +///////////////////////////////////////////// +// Country/Old-time + + +Seqsize 4 + +Begin Bass + Sequence {1 4. 1 90} {1 4. 5 90} + Voice AcousticBass + Octave 3 + Articulate 90 + Volume mf +End + +Begin Chord + Sequence C23 + Voice NylonGuitar + Voicing Mode=Optimal + Octave 4 + Strum 10 + Volume p + Articulate 100 +End + +// Same voice as the strumming guitar we play a decending 5/3/1 line +// on the 1st, 5th, etc. bar, and the same accending on 3, 7, etc. + +Begin Bass-Chord + Sequence {1 4 5 90; 2 4 3 90; 3 4 1 90} z B123 z + Voice NylonGuitar + Octave 4 + Volume mp + Articulate 99 +End + + +Begin Drum + Sequence D23 + Tone ClosedHiHat + Rtime 10 + Rvolume 10 + Rskip 10 + Volume mp +End + +Begin Drum-Kick + Sequence D1 + Tone KickDrum1 + Rtime 10 + Rvolume 10 + Volume pp +End + +DefGroove CountryWaltz Doris Day would like this! A string \ + bass on beat 1 with a strummed guitar on 2 \ + and 3, and a light-feeling drum. + +/// Add a sustained string to our CountryWaltz + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 1 90 0 80 0 * 3} // Root and fifth notes only. + Voicing Mode=Optimal + Volume pp + Octave 5 + Articulate 100 + Unify On +End + + +DefGroove CountryWaltzSus The CountryWaltz with a sustained string. + +/////////////////////////////////////// +/// CountryWaltz with a decending flute line + +Groove CountryWaltz + +Begin Arpeggio + Sequence A6 A3 + Octave 5 + Invert 0 1 2 1 + Voice Flute + Direction Down + Rskip 30 + SeqRnd On + Rvolume 30 + Volume ppp + Articulate 90 +End + +DefGroove CountryWaltz1 Same old waltz with an arpeggiating flute. Nice. +Chord-Sus Groove CountryWaltzsus +DefGroove CountryWaltz1Sus Arpeggiating flute and sustained strings. + +Groove CountryWaltz + +Begin Arpeggio + Voice NylonGuitar + Sequence A3 / / A6 + Octave 4 + Range 2 + Direction Up / / Down + Rvolume 10 + Accent 1 10 + Volume mp + Articulate 99 +End + +DefGroove CountryWaltz2 Guitar arpeggios. + +Chord-Sus Groove CountryWaltzsus + +DefGroove CountryWaltz2Sus Guitar arpeggios and sustained strings. + + +//// Walking bass versions + +Groove CountryWaltz + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence W123 + Articulate 75 + Volume mf +End + +DefGroove CountryWaltzWalk Countrywaltz with walking bass. + +Groove CountryWaltzSus +Bass Sequence - +Walk Groove CountryWaltzWalk +DefGroove CountryWaltzWalkSus CountryWaltz with sustained string and \ + walking bass. + +Groove CountryWaltz1 +Bass Sequence - +Walk Groove CountryWaltzWalk +DefGroove CountryWaltz1Walk Walking bass and arpeggiating flute. + +Groove CountryWaltz2 +Bass Sequence - +Walk Groove CountryWaltzWalk +DefGroove Countrywaltz2Walk Walking bass and apreggiating guitar. + +Groove CountryWaltz1Sus +Bass Sequence - +Walk Groove CountryWaltzWalk +DefGroove CountryWaltz1SusWalk Arpeggiating flute, sustained string \ + and walking bass + +Groove CountryWaltz2Sus +Bass Sequence - +Walk Groove CountryWaltzWalk +DefGroove CountryWaltz2SusWalk Apregginating guitar, sustained string \ + and walking bass. + + + + + + + +//// Ending + +Groove CountryWaltz + +Begin Chord + Sequence C23 / L2 L1 + Articulate 100 + Volume pp +End + +Begin Bass + Sequence B123 B1/5 B123 B1 + Volume mp +End + +Begin Drum + Sequence D12 / / D1 + Volume ppp pp p mf +End + +Begin Drum-Kick + Sequence D1 + Volume p +End + +DefGroove CountryWaltzEnd A good ending with a cymbal roll. The \ + 4th bar just hits on the first beat. + + diff --git a/mma/lib/stdlib/desert.mma b/mma/lib/stdlib/desert.mma new file mode 100644 index 0000000..e0d6727 --- /dev/null +++ b/mma/lib/stdlib/desert.mma @@ -0,0 +1,158 @@ + +// desert + +Begin Doc + + This is somewhat ``mysterious'' and mildly ``Eastern'' + sounding. Written for the Duke Ellington hit ``Caravan''. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////// +/////// Instrument patterns + +Begin Drum Define + Sync D13; D24 Shift .5 +End + +///////////////////////////////// + + +SeqSize 4 + +// Our main drum is the Tom. The pattern is trying to be hypnotic. + +Begin Drum + Tone LowTom2 + Sequence Sync D1234 Sync D124 + Volume mp + Rvolume 10 + Rtime 5 + Accent 1 10 3 10 +End + +// Play a triangle on beat 1 of the first of every 4 bars. +// Helps us focus a bit on the placement. + +Begin Drum-T + Tone OpenTriangle + Volume mp + Rvolume 10 + Sequence D1 z z z +End + +// Alternate bass/walking + +Begin Bass + Voice AcousticBass + Octave 3 + Sequence B13 z B11 z + Articulate 100 + Rvolume 10 + Rtime 5 + Accent 3 40 +End + +Begin Walk + Voice $_Bass_Voice + Volume $_Bass_Volume + Octave $_Bass_Octave + Rvolume 10 + Rtime 5 + Accent $_Bass_Accent + Articulate $_Bass_Articulate + Sequence z W1234 + Direction Up / Down / +End + + +// Some piano chording. + +Begin Chord + Voice Piano2 + Volume mf + Octave 5 + Articulate 80 + Sequence C1 C3 C1234 C13 +End + +// And a mystic feel with the sitar + +Begin Chord-String + Voice Sitar + Octave 5 + Articulate 90 + Strum 10 + Sequence C13 / / C134 + Volume mf +End + +DefGroove Desert Pretty funky beat for the desert. + + +Begin Chord-Sus + Voice TremoloStrings + + // The sustained chord has Root and fifth notes only. + // Note that we just have a whole note pattern, which means + // that chord changes on beats 2,3,4 are ignored. + + Sequence { 1 1 90 0 80 0 } + + DupRoot -2 + Octave 5 + Articulate 100 + Unify On + Rvolume 5 + Volume mf +End + +DefGroove DesertSus Add sustained strings. + +/////////////////////////////// +// Fill, this just puts the chords in 1.2.3.4 and +// adds extra, random, drum beats. + +Groove Desert + +Chord Sequence C1234 C13 +Chord-String Sequence C13 C134 + +Begin Drum-Fill + Tone $_Drum_Tone + Sequence { D1234 * 2} + Volume mf + Rvolume 10 + Rtime 5 + RSkip 50 +End + +DefGroove DesertFill A bit of a drum torrent over the basic beat. + +///////////////////////////////// +// Ending + +Groove Desert + +Drum Sequence D1234 / D13 D1 +Begin Drum-T + Sequence D1 / / / + Volume mp p pp ppp +End + +Walk Sequence - + +Bass Sequence B13 / B11 {1 2 1 90} + +Chord Sequence C1 C3 C1234 L1 + +Chord-String Sequence C13 / / L1 + +DefGroove DesertEnd Desert Ending. diff --git a/mma/lib/stdlib/dixie.mma b/mma/lib/stdlib/dixie.mma new file mode 100644 index 0000000..14c46a0 --- /dev/null +++ b/mma/lib/stdlib/dixie.mma @@ -0,0 +1,208 @@ + +// dixie + +Begin Doc + + These Dixieland grooves are great for songs like "Bill Bailey". The + Time is set to 4, so if you have a 2/4 piece double the tempo. + This rhythm works best with tempos around 200. + This might be a bit busy, if so you're free to make changes! + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////////// +// Pattern definitions + +Begin Drum Define + D12+3 D13; 2.5 0 90 +End + +Begin Chord Define + Swing1 C1234 ; 2.5 8 80 +End + + +////////////////////////////////////////////////////////// +// Dixie + + +SeqSize 4 + +Begin Drum-Snare + Sequence D12+3 + Tone SnareDrum1 + Rvolume 10 + Rskip 20 + Volume pp +End + +Begin Drum-Kick + Sequence D13 + Tone KickDrum1 + Rvolume 10 + Rskip 10 + Volume p +End + +Begin Drum-HH + Sequence D4 + Tone OpenHiHat + Rvolume 10 + Rskip 5 + Rtime 10 + Volume mp +End + + +Begin Chord + Sequence Swing1 / / C1234 + Invert 0 1 0 1 + SeqRnd On + Voice Honky-TonkPiano + Strum 3 + Octave 5 + Volume mp + Articulate 99 +End + +Begin Bass + Voice Tuba + Sequence z z z B13 + Octave 3 + Volume p + Rvolume 10 + Rtime 10 + Articulate 85 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence W1234 / / z + Articulate 85 + Volume p + Rskip 5 + Rvolume 10 + Rtime 10 +End + +Begin Arpeggio + Sequence A16 / / A8 + SeqRnd On + Volume p + Voice Banjo + Articulate 99 + Harmony Open + Rskip 20 + Octave 5 +End + +DefGroove Dixie Complete with arpeggiating banjo. + +/////////////////////////////////////////////////// +// Dixie1 +// Alternate, swap bass/walk bars + +Groove Dixie + +Bass Sequence B13 / / z +Walk Sequence z / / W1234 + +DefGroove Dixie1 Bass/walk variation. + +//////////////////////////////////////////////////// +// Dixie2 +// Alternate with slower arp + +Groove Dixie + +Arpeggio Sequence A8 / / A4 + +Begin Chord-Banjo + Sequence L2 C1234 + Invert 0 1 2 3 + SeqRnd On + Volume pp + Voice Banjo + Octave 5 + Articulate 50 +End + +DefGroove Dixie2 The arpeggio has been slowed down and a \ + stumming banjo has been added. Use this for \ + repeat endings, etc. + +////////////////////////////////// +// Dixie3 +// A bit calmer version + +Groove Dixie + +Drum-Snare Sequence D13 D1234 +Drum-HH Sequence D1 + +Begin Chord + Sequence L2 + Invert 0 1 0 1 + SeqRnd On + Octave 5 + Articulate 80 +End + +Begin Chord-Guitar + Sequence L2 / C1234 / + Invert 0 0 1 1 + SeqRnd On + Voice JazzGuitar + Octave 6 + Volume p + Articulate 90 +End + +Bass Sequence B13 / B11 z +Walk Sequence z z z W1234 + +Arpeggio Sequence A2 A4 z z + +DefGroove Dixie3 A more gentle attempt. + +////////////// + +Groove Dixie + +Arpeggio Sequence - +Begin Chord-Banjo + Sequence C1234 Swing1 + Strum 10 + Direction Both + Voice Banjo + Volume p + Octave 5 + Articulate 90 +End + +DefGroove DixieStrum Strumming banjo and piano. No apreggiating. + +////////////////////////////////////////////////// +// DixieEnd + +Groove Dixie + +Drum-Snare Sequence D13 / D1 / +Drum-Kick Sequence D13 / D1 / +Drum-HH Sequence D4 D13 D1 / +Chord Sequence C1234 / L2 C1 +Bass Sequence B13 B11 B13 B11 +Walk Sequence - +Arpeggio Sequence A16 A8 A4 A2 + +DefGroove DixieEnd Straight ending. + + diff --git a/mma/lib/stdlib/dixiemarch.mma b/mma/lib/stdlib/dixiemarch.mma new file mode 100644 index 0000000..dac4ab1 --- /dev/null +++ b/mma/lib/stdlib/dixiemarch.mma @@ -0,0 +1,154 @@ + +// march + + +Begin Doc + + A Dixieland March done for "Muskrat Ramble". Uses traditional + instrumentation ... a single snare drum, tuba and banjo. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +//////////////////////////////////// +// Additional pattern defs + + +Begin Bass Define + + B1'3 B13; 2.5 8 3 90 + + +End + + +///////////////////////////////////// +// Basic Pattern + +SeqClear +SeqSize 4 + +Begin Drum-Snare + Tone SnareDrum1 + Sequence D1234 {D1234; D13 Shift .5} + Rtime 5 + Rvolume 10 + Rskip 1 + Volume p +End + +Begin Bass + Voice Tuba + Octave 3 + Sequence B13 B1'3 B13 z + Articulate 80 + Volume mf +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Articulate $_Bass_Articulate + Sequence z z z W1234 + Volume f +End + +Begin Chord + Voice Piano1 + Sequence C14 C13 / C134 + Articulate 80 + Octave 5 + Voicing Mode=Optimal + Volume mf +End + +Begin Chord-Banjo + Voice Banjo + Sequence C1234 / / C13 + Articulate 70 + Volume p + Strum 10 + Direction Both + Rtime 10 + RVolume 20 + Octave 6 + Voicing Mode=Optimal +End + + +DefGroove DixieMarch A basic Dixieland March. + + +//////////// + +Groove DixieMarch + +Begin Arpeggio + Voice Clarinet + Sequence A8 A8 A8 A4 + Rskip 20 + Articulate 90 + Octave 5 + Range 3 + Volume mp + RVolume 20 + Rtime 10 +End + +DefGroove DixieMarchPlus Add in a wild clarinet. + +////////////// + +Groove DixieMarch + +Begin Chord-Sus + Voice Clarinet + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Octave 5 + Articulate 100 + Unify On + Rvolume 5 + Volume pp +End + +DefGroove DixieMarchSus A little change with the arpeggios gone. + +Arpeggio Groove DixieMarchPlus + +DefGroove DixieMarchSusPlus Apreggios and sustain. + +////// Intro + +Groove DixieMarch + +Drum-Snare Sequence D8 D1234 / D12 +Begin Walk + Sequence z z z W1234 + Octave 2 + Direction Down +End +Bass Sequence B13 / / z +Chord Sequence C12 / / L1 + +DefGroove DixieMarchIntro A 4 bar introduction. + + +////// Ending + +Groove DixieMarch +SeqSize 2 + +Drum-Snare Sequence D8 D1 +Chord Sequence C1234 L1 +Walk Sequence W1234 z +Bass Sequence z {1 2. 1 100} + +DefGroove DixieMarchEnd Finis! \ No newline at end of file diff --git a/mma/lib/stdlib/easyswing.mma b/mma/lib/stdlib/easyswing.mma new file mode 100644 index 0000000..fb61367 --- /dev/null +++ b/mma/lib/stdlib/easyswing.mma @@ -0,0 +1,282 @@ + +// easyswing + +Begin Doc + + Soft guitar strumming. Great of tunes like "Beyond The Sea" + and "Summertime". + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + + +/////////////////////////// +/// EasySwing + + +SeqSize 4 + + +Begin Chord + Sequence C1234 / / C13 + Voicing Mode=Optimal + Voice JazzGuitar + Volume mf + Articulate 95 + Strum 5 + Accent 1 10 3 5 + RVolume 10 + Octave 5 +End + +Begin Bass + Voice AcousticBass + Sequence B13 / / z + Octave 3 + Articulate 80 + Volume mp +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Articulate 80 + Volume mp +End + +Begin Drum-HH + Sequence D1234 + Rvolume 5 + RSkip 40 + Tone OpenHihat + Volume p +End +Begin Drum-PHH + Sequence D24 + Tone PedalHiHat + Volume p +End + +DefGroove EasySwing Nice/simple jazz guitar in 4. + + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume p + Voice TremoloStrings + Octave 5 + Articulate 100 + Unify On +End + +DefGroove EasySwingSus Adds a sustained strings (2 part) to EasySwing. + +Groove EasySwing + +Begin Arpeggio + Voice JazzGuitar + Sequence A4 / / A8 + RVolume 20 + Volume mp + Octave 5 + Harmony Open + Direction Both Random Both Down + Articulate 99 + Rskip 5 +End + +DefGroove EasySwingFill Adds guitar apreggio. Quarters on \ + bar 1,2,3 and eights on bar 4. + +// EasySwingWalk +// Same as above with with constant walking bass line + +Groove EasySwing + +Begin Walk + Sequence W1234 + Articulate 70 + Volume mf +End + +Bass SeqClear + +DefGroove EasySwingWalk The EasySwing Groove with a full walking \ + bass line. The bass volume has been increased \ + as well. + +Chord-Sus Groove EasySwingSus + +DefGroove EasySwingWalkSus The EasySwing with a walking bass line and \ + a sustained string. + + +Groove Easyswing +Arpeggio Groove EasySwingFill +DefGroove EasySwingWalkFill Walking bass fill. + +//////////////////////////////////////////////////////// +///// Easy Swing1 - Same, but with 1 chord per bar + +Groove EasySwing // Just modify the easyswing pattern + +Begin Chord + Sequence L1 + Strum 20 +End + +DefGroove EasySwing1 One strum per bar. Okay if the tempo is \ + quite fast, or as an introduction. + +Chord-Sus Groove EasySwingSus +DefGroove EasySwing1Sus Adds sustained strings to EasySwing1. + +Groove EasySwing1 +Arpeggio Groove EasySwingFill +DefGroove EasySwing1Fill Add apreggios to single chord swing. + +//////////////////////////////////////////////////////// +///// Easy Swing2 - Same, but with 2 chords per bar + +Groove EasySwing + +Begin Chord + Sequence L2 + Strum 10 +End + +DefGroove EasySwing2 Same EasySwing, but with 2 strums per bar. + +Chord-Sus Groove EasySwingSus +DefGroove EasySwing2Sus Adds ChoirAahs to EasySwing2. + +Groove EasySwing2 +Arpeggio Groove EasySwingFill +DefGroove EasySwing2Fill Add apreggios to two chord swing. + +///////////////////////////////////////////// +/// EasySwing42 - alternate 4 and 2 strum bars + +Groove EasySwing +Chord Sequence C1234 L2 +DefGroove EasySwing42 For faster rhythms, a bar of 4 followed \ + by a bar of 2. + +Groove EasySwing42 +Chord-Sus Groove EasySwingSus +DefGroove EasySwing42Sus Add sustained strings to the 4-2 pattern. + +Groove EasySwing42 +Arpeggio Groove EasySwingFill +DefGroove EasySwing42Fill Add arpeggios to 4-2 pattern. + +Groove EasySwingWalk +Chord Groove EasySwing42 +DefGroove EasySwing42Walk A 4-2 pattern with a walking bass. + +Chord-Sus Groove EasySwingSus +DefGroove EasySwing42WalkSus The 4-2 pattern with walking bass and \ + sustained strings. + +Groove EasySwing42Walk +Arpeggio Groove EasySwingFill +DefGroove EasySwing42WalkFill Add arpeggios and walking bass with 4-2 pattern. + +//////////////////////////////// +/// Intros + +Groove Easyswing + +Begin Alltracks + SeqRnd Off + Rskip 0 +End + +Chord Sequence C1234 / C13 L1 +Bass Sequence {1 2. 1 90} / / {1 4 1 80; 2 4 3 85; 3 2 5 95} +Walk Sequence - +Drum-HH Sequence D1234 / / D13 +Drum-PHH Sequence D24 / / D1 + +DefGroove EasySwingIntro 4 bar intro + + +///////////// + +Groove EasySwingIntro + +Begin Chord + Sequence L1 + Articulate 99 +End + +Bass Sequence {1 2. 1 90} +Drum-HH Sequence D1234 / / D1 + +DefGroove EasySwingIntro1 4 bar intro with 1 long chord per bar. + +////////// + +Groove EasySwingIntro + +Chord Sequence L2 + +Begin Drum-HH + Tone RideCymbal1 + Sequence D16 / / D12 + Accent 1 60 +End + +Drum-PHH Sequence D1234 / / D12 + +DefGroove EasySwingIntro2 4 bar intro with cymbals and 2 strum chords. + +////////////// + +Groove EasySwingIntro + +Bass Sequence z z z {1 2. 1 95} +Begin Arpeggio + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence {1 82 95; 1+81 82 90; 2+81 82 90; 3 2 95 } / / z + Articulate 90 +End + +DefGroove EasySwingIntro3 4 bar intro with triplet bass pattern. + + + +/////////////////////////////////////////////// +// EasySwingEnd - a 2 bar ending + + +SeqClear +Groove EasySwing // Just modify the easyswing pattern +SeqSize 2 + +Begin Alltracks + SeqRnd Off + Rskip 0 + Rtime 0 +End + +Drum-HH Sequence D16 D13 +Drum-PHH Sequence D16 D13 + +Chord Sequence C1234 L1 + +Walk Sequence W1234 z +Bass Sequence z {1 1 1 90} + +DefGroove EasySwingEnd Simple ending. + + diff --git a/mma/lib/stdlib/fastblues.mma b/mma/lib/stdlib/fastblues.mma new file mode 100644 index 0000000..979f782 --- /dev/null +++ b/mma/lib/stdlib/fastblues.mma @@ -0,0 +1,218 @@ + +// fastblues + + +Begin Doc + + I use this in "Mad About Him...Blues". + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + +//////////////////////////// +/// Pattern definitions + +Begin Chord Define + Cshuffle C1; C1 Shift 1.5 +End + +Begin Bass Define + Bx 1 8 1 90 ; 1.66 16 5 90 + Bsuffle Bx; Bx Shift 1; Bx Shift 2; Bx Shift 3 +End + +Begin Walk Define + Wx 1 8 90 ; 1.66 3 80 + Wsuffle Wx; Wx Shift 1; Wx Shift 2; Wx Shift 3 +End + +Begin Arpeggio Define + Ax 1 4 90; 1.66 3 80 + Ashuffle 1.66 3 90; Ax Shift 1; Ax Shift 2; 4 8 90 +End + + +//////////////////////////////////////////////////// +////// FastBlues + + +SeqSize 4 + +Begin Drum-Snare + Sequence { D1234 Shift .75 } + Tone SnareDrum1 + Rskip 5 + Rtime 2 + Volume mp +End + +Begin Drum-Snare2 + Sequence D24 + Tone SnareDrum2 + Rskip 5 + Rtime 2 + Volume mp +End + +Begin Drum-HH + Sequence D1234 + Tone OpenHiHat + Accent 3 -20 + Rskip 5 + Rtime 2 + Volume mf +End + +Begin Drum-Kick + Sequence D1234 + Tone KickDrum1 + Volume mf + Rvolume 10 +End + +Begin Bass + Sequence Bsuffle + Voice FingeredBass + Articulate 90 + Volume mp + Octave 3 +End + +Begin Chord-Piano + Sequence {Cshuffle Shift .1} + Voicing Mode=Optimal + Voice Piano2 + Articulate 60 + Volume p + Octave 6 +End + +Begin Chord-Sax + Copy Chord-Piano + Invert 1 + Sequence {Cshuffle Shift .05} + Octave 6 + Voice TenorSax +End + +Begin Chord-Guitar + Copy Chord-Piano + Voicing Mode=Optimal + Sequence Cshuffle + Volume mp + Octave 5 + Voice CleanGuitar +End + +DefGroove FastBlues Fast blues with a bit of R&B. + +Begin Chord-Sus + Sequence {1 1 90 0 90 0 * 4 } + Voicing Mode=Optimal + Octave 5 + Volume mp + Articulate 100 + Unify On + Voice Strings +End + +DefGroove FastBluesSus Adds sustained strings to FastBlues + +// Walking bass versions + +Groove FastBlues + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence Wsuffle + Articulate 80 + Volume mp +End + + +DefGroove FastBluesWalk Change bass line from 1/5 to walking. + +Chord-Sus Groove FastBluesSus + +DefGroove FastBluesWalkSus Walking bass version with sustained strings. + + + +////////////////////////////////////////////// +// FastBlues1 + +Groove FastBluesWalk + +Chord-Sax Sequence - + +Begin Chord-Guitar + Voice DistortonGuitar + Sequence Cshuffle z + Articulate 60 + Octave 5 + Volume p +End + +Begin Arpeggio + Sequence z Ashuffle + Voice DistortonGuitar + Articulate 60 + Octave 5 + Range 2 + Rskip 5 + Rvolume 20 + Rtime 10 + Volume p +End + +Begin Chord-Piano + Voice Piano3 + Sequence { C1234 Shift .66 } + Articulate 60 + Volume mf + Octave 6 +End + +Begin Bass + Sequence Bsuffle + Voice CleanGuitar + Harmony OpenAbove + Octave 4 + Volume mp +End + +DefGroove FastBlues1 A more rowdy version, with alternating bars of \ + a distorted guitar riff. + +Chord-Sus Groove FastBluesSus + +DefGroove FastBlues1Sus Who invited the violin guys to the blues party? + +////////////////////////////////////// + + +Groove FastBlues + +Bass Sequence B13 B11 +Chord-guitar Sequence C1234 C13 +Chord-piano Sequence C1234 C1 +Chord-sax Sequence - +Drum-hh Sequence D1234 D13 +Drum-kick Sequence D13 +Drum-snare Sequence {D13 Shift .75} {D1 Shift .75} +Drum-snare2 Sequence D13 + + +Defgroove FastBluesEnd Simple ending. + + + diff --git a/mma/lib/stdlib/folk.mma b/mma/lib/stdlib/folk.mma new file mode 100644 index 0000000..f873679 --- /dev/null +++ b/mma/lib/stdlib/folk.mma @@ -0,0 +1,155 @@ + +// folk + +Begin Doc + + Generally folk music doesn't have complicated rhythms. + You can use other libaries like "EasySwing", but if + you are into finger picking guitar, give this a try. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +//////////////////////////////////////////////////////////////// + + +SeqSize 8 + +Begin Drum-Tamb + Sequence D13 + RVolume 20 + Rskip 60 + Tone Tambourine + Rtime 3 +End + +Begin Bass + Sequence B13 + Voice AcousticBass + Octave 3 + Volume mp + Articulate 80 +End + +Begin Chord + Sequence {L1 * 4} / / / / / / L1 + Invert 0 1 0 1 0 1 0 -1 + Strum 10 + Rtime 2 + Rvolume 9 + Articulate 90 + Octave 5 + Volume mp + Voice NylonGuitar +End + +DefGroove Folk A very simple pattern to set against old songs. Uses a \ + random Tambourine to liven things up a bit. Wear something \ + tie-dyed when you use this. + +///////////////////////////// +/// Walking bass + +Groove Folk + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Articulate 70 + Volume mp + Sequence W13 / / / / / / W1234 +End + +DefGroove FolkWalk Plain folk rhythm with walking bass. + +//////////////////////////////////////////////////////////////// +//////// Add in the Doc Watson effect. I use this version for +/////// Deep River Blues. + +Begin Arpeggio + Sequence A8 / / / / / / A4 + Voice NylonGuitar + Octave 5 + Articulate 70 + RTime 4 + RVolume 6 + Rskip 10 // This makes it sound much more human! +End + +Bass Sequence B13 / / z + +Begin Walk + Sequence z / / W1234 + Voice AcousticBass + Octave 3 + Articulate 80 + Direction Down + Volume mp +End + + +DefGroove FolkArticulated Fingered picked guitar and a bit of bass. + +/////////////////////////// +//// Introduction + +SeqClear +SeqSize 4 + +Begin Drum-Tamb + Sequence D13 / / D1 + RVolume 20 + Tone Tambourine +End + +Begin Bass + Sequence B13 / / {1 1 1 100} + Voice AcousticBass + Octave 3 + Volume mp + Articulate 80 +End + +Begin Chord + Sequence {L1 * 4} / {L1 * 2} L1 + Strum 10 + Articulate 90 + Octave 5 + Volume mp + Voice NylonGuitar +End + +DefGroove FolkIntro Pretty boring 4 bar intro. + + +////////////////////////////// +///// Ending + +Groove Folk +SeqSize 2 + +Begin Drum-Tamb + Sequence D13 D1 + Rskip 0 +End + +Bass Sequence B11 + +Begin Chord + Sequence C1234 C13 + Invert 0 +End + +DefGroove FolkEnd Easy, 2 bar ending. First bar has 4 strums, second \ + bar has 2 strums. + + diff --git a/mma/lib/stdlib/foxtrot.mma b/mma/lib/stdlib/foxtrot.mma new file mode 100644 index 0000000..00d4692 --- /dev/null +++ b/mma/lib/stdlib/foxtrot.mma @@ -0,0 +1,267 @@ +// foxtrot + + +Begin Doc + + Just about any old-fashioned dance piece can be set to a + foxtrot. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////////////////////// +/// Foxtrot + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence { 1 0 100; 4.75 0 70} + Volume mp + Rtime 5 + Rvolume 10 +End + +Begin Drum-Side + Tone SideKick + Sequence D4 + Volume p + Rtime 10 + Rvolume 10 +End + +Begin Drum-PHH + Tone PedalHiHat + Sequence D24 + Volume p + Rtime 10 + Rvolume 10 +End + +Begin Drum-OHH + Tone OpenHiHat + Sequence { D13 ; D24 Shift .75 } + Volume p + Rtime 10 + Rvolume 10 +End + + +Begin Bass + Voice AcousticBass + Sequence { B13; 2.75 8 5 70 } \ + { B13; 2.75 8 5 70; 4 4 3 90; 4.75 8 3 70} + Accent 1 20 + Articulate 80 + Octave 3 + Volume mp +End + +Begin Chord + Sequence C1234 + Voicing Mode=Optimal + Accent 1 20 3 10 + Octave 5 + Articulate 80 + Strum 2 + Volume p + Voice NylonGuitar +End + +// Single notes on the piano...bars 1,3, etc. we hit a +// low root on beat 1; bars 2,4, etc. a high root on +// beat 3. + +Begin Bass-Piano + Sequence B1 {B1 Shift 3} + Voice Piano1 + Articulate 50 + Octave 4 6 + Volume mp +End + +// Piano chords on off-beats + +Begin Chord-Piano + Sequence { C1 Shift .75; C2 } { C34 Shift .75 } + Voice Piano1 + Voicing Mode=Optimal + Volume pp + Articulate 70 + Octave 5 +End + +DefGroove Foxtrot Basic Foxtrot. + + +Begin Chord-Sus + Sequence { 1 1 90 0 90 0 * 4 } + Voicing Mode=Optimal + Volume p + Voice TremoloStrings + Octave 5 + Articulate 100 + Unify On +End + + +Defgroove FoxtrotSus Adds sustained strings to Foxtrot. + +Groove Foxtrot + +Begin Arpeggio + Voice Piano1 + Sequence { 1 2 90 * 4; 3.5 4 90 * 4 } + Harmony Open + Articulate 80 + Octave 7 + Rskip 30 + Volume mp +End + +DefGroove FoxTrotPlus A jazzy piano addition to the basic beat. + +Chord-Sus Groove FoxTrotSus + +DefGroove FoxTrotSusPlus Sustained strings and piano 8ths. + + +/////// Foxtrot1 + +Groove FoxTrot + +Begin Drum-Crash + Sequence D1 z z z + Tone CrashCymbal1 + Volume p +End + +Chord-Piano Sequence C24 +Bass Sequence - + +Begin Chord-Sax + Sequence C13 {C13; 4.5 8 100} {C1; 2 2 90} C12 + Voice TenorSax + SeqRnd On + Volume pp + Voicing Mode=Optimal + Octave 5 + Articulate 70 + RVolume 3 +End + +Begin Walk + Sequence {W1234; 4.75 8 100 } + Voice FretlessBass + Octave 3 + Volume pp + Articulate 70 + RVolume 5 +End + + +DefGroove Foxtrot1 FoxTrot with sax section and walking bass. + +Chord-Sus Groove FoxTrotSus + +DefGroove FoxTrot1Sus TremoloStrings added to FoxTrot1. + +//////////////////////////// +/// Intros + +Groove Foxtrot + + + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Sequence W1234 + Accent $_Bass_Accent + Articulate $_Bass_Articulate + Octave $_Bass_Octave + Volume mf +End + +Chord Sequence C1234 +Chord-Piano Sequence C13 + +DefGroove FoxTrotIntro Walking bass intro. + +////////////////////// +// Fill + +Groove FoxTrot +SeqSize 2 + +Drum-PHH Sequence D1234 +Begin Bass + Sequence {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} \ + {1 4 1 90; 2 4 2 90; 3 4 3 90; 4 4 1 90} + Articulate 60 +End +Chord Sequence C1234 +Bass-Piano Sequence B1 +Chord-Piano Sequence C1234 + + +DefGroove FoxtrotFill A 2 bar fill with a rather heavy walking bass. + + + +//////////////////////// +/// Endings + +Groove Foxtrot +SeqSize 2 + +Drum-Side Sequence - +Drum-OHH Sequence D1234 D13 +Drum-PHH Sequence D13 +Drum-Kick Sequence D1234 D13 + +Bass-Piano Sequence - + +Chord Sequence C1234 C13 +Chord-Piano Sequence C1234 C13 + + +Bass Sequence B11 + +DefGroove FoxTrotEnd Simple ending, 4 beats on first bar and 2 \ + on second. + + +/// Foxtrot1End + +Groove FoxTrot1 +SeqSize 2 + +Alltracks SeqRnd Off + +Drum-Kick Sequence D1234 D13 +Drum-Crash Sequence D1 +Drum-OHH Sequence D8 D12 +Drum-PHH Sequence D2 +Drum-Side Sequence D13 +Walk Sequence - +Bass Sequence B11 +Bass-Piano Sequence - +Chord Sequence C13 +Chord-Piano Sequence C24 C13 +Begin Chord-Sax + Sequence C13 + Articulate 99 60 +End + +DefGroove FoxTrot1End Ending based on Foxtrot1. + + + diff --git a/mma/lib/stdlib/frenchwaltz.mma b/mma/lib/stdlib/frenchwaltz.mma new file mode 100644 index 0000000..08dac8c --- /dev/null +++ b/mma/lib/stdlib/frenchwaltz.mma @@ -0,0 +1,164 @@ + +// frenchwaltz + +Doc These try to do the "French Cafe" sound. + +Author Bob van der Poel + +SeqClear +Time 3 +Timesig 3 4 +Include stdpats34 + +////////////////////////////////////////////// +///// FrenchWaltz Cheezy 3/4 with accordion + + +SeqSize 8 + +// For the left hand chord (the basic accomp. on an +// accordion, we use a combination of a chord and +// bass pattern. The BASS track is a single note on +// beat 1, the CHORD track has full chords on 2, 3. +// Accordion basses are quite limited ... in most cases +// a single octave. So, to duplicate this sound we use +// the SPAN directive for Chord and Bass to limit +// the notes used from C3. + + +Begin Chord + Begin Define + A1 2 3 70 ; 3 3 70 // chords on 2,3 + A2 2 8. 70 ; 3 3 60 // same, but with 2 a bit draggy + A3 2 8. 50 ; 3 8. 50 // same, but a bit softer to use with bass walk + End + Sequence A1 / / A2 A1 / / A3 + Voice Accordion + Octave 4 + Articulate 70 + NoteSpan 48 59 + Volume mp +End + +Begin Bass + Voice $_Chord_Voice + Sequence B1 B1/5 B1 B1/5 B1 B1/5 B1/5 B123 + Articulate 60 + Octave $_Chord_Octave + Volume mp + NoteSpan $_Chord_Span +End + +// Chunck/chunck/chunck guitar on 1/2/3 + +Begin Chord-Guitar + Sequence C123 + Voicing Mode=Optimal + Strum 5 + Voice NylonGuitar + Accent 1 10 + Octave 5 + Volume pp + Articulate 90 +End + +Begin Drum-Tam + Sequence D23 + Tone Tambourine + Volume pp + Rvolume 10 + Rskip 5 + Rtime 10 +End + +Begin Drum-Tri + Sequence D1 + Tone OpenTriangle + Volume pp + Rskip 50 + Rvolume 30 + Rtime 10 +End + +DefGroove FrenchWaltz Accordion umm-paa. Ya either love it or hate it! + + +//////// Sustained strings in the background. + +Begin Chord-Sus + Voice Strings + Sequence { 1 2. 90 0 80 0 * 3} // Root and fifth notes only. + Voicing Mode=Optimal + Volume p + Octave 5 + Articulate 100 + Unify On +End + +DefGroove FrenchWaltzSus Add sustained strings to basic pattern. + + +//////////////////////////////////////////////////// +// Alternate adds a light 1/8th and 1/4 note aprs + +Groove FrenchWaltz + +Chord-Guitar Sequence - + +Begin Arpeggio + Sequence A6 / / A3 + SeqRnd On + Accent 1 10 + Range 3 + Articulate 80 + Voice Accordion + Octave 5 + Volume pp + Rvolume 10 + Rskip 10 10 50 10 + Rtime 2 +End + +DefGroove FrenchWaltz1 FrenchWaltz with with accordion apreggios. + +Chord-Sus Groove FrenchWaltzSus +DefGroove FrenchWaltz1Sus Arpeggios and sustained strings. + +///////////////////////////////// +//// Ending + +Groove FrenchWaltz +Seqsize 4 + +Chord-Guitar Sequence - +Chord Sequence A1 / / {1 2 40} +Bass Sequence B1 B1/5 B1 {1 2 1 40} +Drum-Tam Sequence D23 / / D1 + +Begin Scale + SeqClear + Sequence S6 S3 S3 {1 2 80} + Direction Up + Voice Strings + Octave 5 + Articulate 80 80 80 100 +End + +DefGroove FrenchWaltzEnd A scale with the strings to end \ + the FrenchWaltz. The scales run from \ + 16, 8, 4 and whole notes. + + +// Variation + +Begin Scale + Voice Accordion + Direction Down + Range 4 + Octave 3 +End + +DefGroove FrenchWaltz1End Same ending as FrenchWaltzEnd but with \ + an accordion instead of strings. + + diff --git a/mma/lib/stdlib/guitarballad.mma b/mma/lib/stdlib/guitarballad.mma new file mode 100644 index 0000000..01de847 --- /dev/null +++ b/mma/lib/stdlib/guitarballad.mma @@ -0,0 +1,156 @@ + +// guitarballad + +Begin Doc + + Guitar based ballad with a bit of a rock feel. Written for + Beatles classic "Yesterday". + + This is a conversion of the pianoballad groove. + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + + +///////////////////////// +/// Basic Pattern + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D123 + Volume mp + Rtime 3 + RVolume 10 +End + +Begin Drum-Side + Tone SideKick + Sequence D13 + Volume mp + Rtime 3 + Rvolume 10 +End + +Begin Drum-CHiHat + Tone ClosedHiHat + Sequence D8 + Volume p + Rtime 2 + Rvolume 10 +End + +Begin Bass + Voice FingeredBass + Volume mp + Octave 3 + Articulate 80 + Sequence {1 4. 1 90; 2.5 8 1 90; 3 4. 1 90; 4.5 4 5 90} \ + {1 4. 1 90; 2.5 8 1 90; 3 4 1 90; 4 4 3 90} +End + +Begin Arpeggio-4 + Voice NylonGuitar + Volume mp + Articulate 80 + Octave 5 + Range 1 + Sequence A4 + Rskip 5 +End + +Begin Arpeggio-8 + Voice CleanGuitar + Volume p + Articulate 70 + Octave 5 + Range 2 + Sequence A8 + Rskip 20 +End + +DefGroove GuitarBallad Simple ballad with drums and guitar. + +Begin Chord + Voice JazzGuitar + Volume p + Articulate 120 + Octave 5 + Sequence C1 C13 C3 C1 +End + +DefGroove GuitarBallad1 Add additional guitar chords. + +//////////////////////// +/// Sustained version + +Groove GuitarBallad + +Begin Chord-Sus + Voice SynthStrings1 + Sequence { 1 1 90 0 90 0 * 4 } + Voicing Mode=Optimal + Octave 5 + Articulate 100 + Unify On + Rvolume 10 + Volume p +End + +DefGroove GuitarBalladSus Guitar arpeggios with a bit of strings. + +Groove GuitarBallad1 +Begin Chord-Sus + Groove GuitarBalladSus + Volume -20 +End + +DefGroove GuitarBallad1Sus Guitar arpeggios with chords and strings. + +////////////////////// +//// Intro + +Groove GuitarBallad + +Drum-Kick Sequence D12 +Drum-Side Sequence D13 +Drum-CHiHat Sequence D8 + +Bass Sequence * * * { 1 2 1 90 } +Arpeggio-4 Sequence A4 / / A2 +Arpeggio-8 Sequence A8 / / A4 + +DefGroove GuitarBalladIntro A 4 bar introduction. + + +//////////////////////// +//// Ending + +Groove GuitarBallad + +SeqSize 2 +Alltracks Rskip 0 + +Drum-Kick Sequence D1234 D1 +Drum-Side Sequence D1234 D12 +Drum-CHiHat Sequence D8 { D12 ; D12 Shift .5} + +Bass Sequence * { 1 2 1 90 } +Arpeggio-4 Sequence A4 A2 +Arpeggio-8 Sequence - + +Begin Chord + Sequence C13 C123 + Octave 6 5 + Volume mp p + Articulate 150 +End + +DefGroove GuitarBalladEnd A 2 bar ending. diff --git a/mma/lib/stdlib/hillcountry.mma b/mma/lib/stdlib/hillcountry.mma new file mode 100644 index 0000000..47e4e9c --- /dev/null +++ b/mma/lib/stdlib/hillcountry.mma @@ -0,0 +1,138 @@ + +// hillcountry + +Begin Doc + + A HillBilly country beat. Seems to work with ''Flowers on the Wall.'' + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + + +//////////////////////////////////// +/////////////////// Our basic beat + + +SeqSize 4 + +Begin Chord + Sequence C1234 + Accent 1 10 + RSkip 10 + Voicing Mode=Optimal + Voice Banjo + Volume mp + Octave 5 + Strum 10 + Direction Both + Articulate 99 +End + +Begin Bass + Voice FingeredBass + Sequence B13 B11 B13 {1 2. 1 90 * 2} + Octave 3 + Articulate 99 + Volume m +End + + +Begin Drum-HH + Sequence D13 / / D1234 + Tone OpenHiHat + RSkip 5 + Volume pp + Rvolume 20 + Rtime 4 +End + +Begin Drum-Snare + Sequence D1234 + Tone SnareDrum2 + Rvolume 20 + Volume pp + Rtime 3 +End + +DefGroove HillCountry Our basic hillbilly beat. Pretty boring. + + +Begin Arpeggio + VOice Banjo + Octave 6 + Volume mp + Range 1 + Direction Up + Sequence A8 + Rskip 30 +End + +DefGroove HillCountryPlus Adds in another banjo. + + +Groove HillCountry + +Begin Chord-Sus + Voice Strings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + DupRoot -1 + Voicing Mode=Optimal + Volume mp + Rskip 10 + Octave 5 + Articulate 100 + Unify On +End + + +DefGroove HillCountrySus Why not strings in the hills? + + +Arpeggio Groove HillCountryPlus + +DefGroove HillCountrySusPlus Strings and banjos! + +//////////////////////////////// +/// Single bar fill, good in repeats + +Groove HillCountry + +Chord Sequence C8 +Bass Sequence {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} // walk down +Drum-HH Sequence D1234 +Drum-Snare Sequence D13 + +DefGroove HillCountryFill Single bar fill with walking bass, good for repeats. + +////////////////////////////// +/// 4 bar Intro + +Groove HillCountry + +Chord Sequence * * * {1 8 90; 1.5 8 90; 2 2 90} +Bass Sequence B11 / / {1 2 1 90} +Drum-HH Sequence * * * {1 0 120} +Drum-Snare Sequence * * * D12 + + +DefGroove HillCountryIntro A basic 4 bar intro. + +/////////////////////////////// +/// 2 Bar Ending + +Groove HillCountry +SeqSize 2 + +Chord Sequence C8 {1 1 90} +Bass Sequence B11 {1 1 1 90} +Drum-HH Sequence * {1 0 120} +Drum-Snare Sequence * D1 + +DefGroove HillCountryEnd An abrupt 2 bar ending. \ No newline at end of file diff --git a/mma/lib/stdlib/jazz-54.mma b/mma/lib/stdlib/jazz-54.mma new file mode 100644 index 0000000..bdf9eb8 --- /dev/null +++ b/mma/lib/stdlib/jazz-54.mma @@ -0,0 +1,104 @@ + +// jazz-54 + +Doc A 5/4 jazz beat, written for "Take Five". + +Author Bob van der Poel + +SeqClear +Time 5 +Timesig 5 4 +Include stdpats54 + +////////// Do all the defs first. + +Begin Drum Define + D3'45 3.5 0 90 ; D45 + Dsnare 1 0 90 ; 2.5 0 80 ; 3.5 0 80 ; 4 0 90 + Dlow 1 0 90 ; 3.5 0 80 ; 4 0 90 +End + + +//////////////////////// +// 5/4 Jazz + + +SeqSize 4 + +Begin Bass + Sequence B145 + Accent 1 10 + Voice AcousticBass + Octave 3 + Rskip 5 + Rvolume 10 + Rtime 3 + Articulate 90 +End + +Begin Drum-HH + Sequence D12345 + Tone OpenHiHat + Volume p + Rvolume 30 +End + +Begin Drum-Snare + Sequence Dsnare + Tone SnareDrum1 + Volume mp + Rskip 40 + Rvolume 10 +End + +Begin Drum-Tom + Sequence Dlow + Tone LowTom1 + Volume p + RSkip 40 + Rvolume 20 +End + +Begin Chord + Sequence C25 / / C245 + SeqRnd On + Voicing Mode=Optimal Rmove=20 + DupRoot -1 + Octave 4 + Volume mp + Voice Piano1 + Articulate 90 + Rvolume 30 + Rskip 10 +End + +DefGroove Jazz54 Basic 5/4 jazz rhythm. + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence W12345 + Rskip 5 + Rvolume 10 + Rtime 3 + Articulate 99 +End + +DefGroove Jazz54Walk This replaces the straight bass pattern \ + with a five-to-the-bar walking bass. + + +////// A 1 bar intro + +SeqClear +SeqSize 1 + +Drum-HH Sequence D12345 +Drum-Snare Sequence D1 +Drum-Tom Sequence D3'45 + +DefGroove Jazz54Intro Single bar intro for 5/4 jazz. Can be used as ending? + + diff --git a/mma/lib/stdlib/jazzwaltz.mma b/mma/lib/stdlib/jazzwaltz.mma new file mode 100644 index 0000000..ebfe3b4 --- /dev/null +++ b/mma/lib/stdlib/jazzwaltz.mma @@ -0,0 +1,242 @@ + +// jazzwaltz + +Doc 3/4 time for jazz pieces like "Bluesette". + +Author Bob van der Poel + +SeqClear +Time 3 +Timesig 3 4 +Include stdpats34 + +////////////////////////////////////////////// +/// Patterns + +Begin Chord Define + C1+23 C123 ; 1.5 8 80 +End + +Begin Bass Define + B1+ 1 4 1 90; 3.5 8 5 80 +End + +Begin Walk Define + W1+23 W123; 1.5 8 80 +End + +Begin Arpeggio Define + Ajazz 1 4 90; 2 3+3 70; 2.667 3 80; 3 3+3 70; 3.667 3 80 +End + +////////////////////////////////////////////// +///// Jazzwaltz + + +SeqSize 4 + + +Begin Drum-Snare + Sequence D1 + Tone SnareDrum1 + Volume mp + Rvolume 10 + Rtime 10 +End + +Begin Drum-HH + Tone ClosedHiHat + Sequence {D123 shift .5} + Volume mp + Rvolume 10 + Rtime 10 +End + +Begin Drum-Cym + Sequence D123 {D123; D23 Shift .5} + Tone RideCymbal1 + RSkip 30 + Volume mp + Rvolume 10 + Rtime 10 +End + + +Begin Chord + Sequence C1+23 / C123 C1+23 + Voicing Mode=Optimal + Accent 1 30 + Volume mp + Voice Piano1 + Octave 5 + Rvolume 10 + Articulate 99 +End + +Begin Chord-Guitar + Sequence C3 / C1 C12 + Voice JazzGuitar + SeqRnd On + Strum 10 + Rvolume 8 + Volume mp + Invert 1 + Articulate 85 / 60 60 + Octave 4 +End + + // The bass line is root on beat 1 for 3 bars, + // then a bit of a walk on bar 4. + +Begin Bass + Voice AcousticBass + Sequence B1 B1+ B1 z + Articulate 80 + Volume mf + Rvolume 4 + Octave 3 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1+23 + Articulate 80 + Accent 1 20 + Volume mf + Rvolume 5 + Rskip 10 +End + +DefGroove JazzWaltz Basic jazz waltz. + + +////////// Sustain + +Begin Chord-Sus + Sequence { 1 2. 90 0 90 0 * 3 } + Voice TremoloStrings + Octave 5 + Voicing Mode=Optimal + Volume p + Rvolume 5 + Rskip 5 + Articulate 100 + Unify On +End + +DefGroove JazzWaltzSus Strings added to our waltz. + + +//////////// Arpeggios + +Groove JazzWaltz + +Begin Arpeggio + Voice Celesta + Sequence Ajazz + Harmony Open + Octave 6 + Volume mp + Range 2 + Articulate 70 + Rskip 20 + Rvolume 20 + Rtime 10 +End + +DefGroove JazzWaltz1 Add arpeggio runs. + +Chord-Sus Groove JazzWaltzSus + +DefGroove JazzWaltz1Sus Sustained strings and arpeggios. + +//////////////////////////// +// Intros + +Groove JazzWaltz + + +Drum-Snare Sequence D1 +Drum-HH Sequence {D123 shift .5} / / z +Begin Drum-Cym + Sequence D123 / / {D1 * 24} + RSkip 20 +End +Chord Sequence C1+23 / C123 L1 +Chord-Guitar Sequence C3 / C1 L1 +Bass Sequence B1 B1+ B1 z +Walk Sequence z z z W123 + + +DefGroove JazzWaltzIntro 4 bar intro. + +SeqSize 8 + +Drum-HH Sequence {D123 shift .5} / / / / / / z + +Begin Drum-Cym + Sequence D123 / / / / / / {D1 * 24} + RSkip 20 +End +Chord Sequence C1+23 / C123 C1+23 / C123 C1+23 L1 +Chord-Guitar Sequence C3 / C1 C12 C3 / C12 L1 +Bass Sequence B1 B1+ B1 B1+ B1 B1+ B1 z +Walk Sequence z z z z z z z W123 + +DefGroove JazzWaltzIntro8 8 bar intro. + +////////////////////////// +/// Fill + +Groove JazzWaltz + +SeqSize 1 + +Alltracks SeqRnd Off + +Drum-HH Sequence D6 +Drum-Snare Sequence D1 +Drum-HH Sequence {D123 shift .5} +Drum-Cym Sequence D123 + +Chord Sequence {C123 * 2} +Chord-Guitar Sequence C123 +Bass Sequence {1 4 5 100; 3 8 3 110; 3 4 1 100} +Walk Sequence - + +DefGroove JazzWaltzFill Single bar fill, can be used in endings. + + + +////////////////////////// +/// Endings + +Groove JazzWaltz + +SeqSize 2 + +Alltracks SeqRnd Off + +Drum-HH Sequence D6 D1 +Drum-Snare Sequence D1 +Drum-HH Sequence {D123 shift .5} z +Drum-Cym Sequence D123 D1 + +Chord Sequence C123 {1 1 90} +Chord-Guitar Sequence C3 {1 1 90} +Bass Sequence B1 +Walk Sequence - + +DefGroove JazzWaltzEnd Simple ending. + + +Begin Arpeggio + Groove JazzWaltz1 + Sequence A6 A3 + Rskip 0 + Range 3 +End + +DefGroove JazzWaltz1End Ending with arpeggio eights and quarters. + diff --git a/mma/lib/stdlib/jive.mma b/mma/lib/stdlib/jive.mma new file mode 100644 index 0000000..3b4fba2 --- /dev/null +++ b/mma/lib/stdlib/jive.mma @@ -0,0 +1,208 @@ + +// jive + +Begin Doc + + Thinking of a sock-hop? I wrote this for "Bye Bye Love". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +///////////// + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence { D13; D2 Shift .75 } + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Snare + Tone SnareDrum1 + Sequence D24 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-HH + Tone ClosedHiHat + Sequence { D1234; D1234 Shift .75 } + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Bass + Voice AcousticBass + Sequence B13 / / {1 4 1 90; 2.5 8 5 90; 3.5 8 3 90; 4 8 1 90} + Octave 3 + Articulate 75 + Accent 1 10 3 10 + Rvolume 20 + Rtime 10 + Volume f +End + +Begin Bass-Sax + Voice AltoSax + Sequence B11 / / {1 4. 1 90; 2.5 4 5 99} + Articulate 70 + Octave 5 + Harmony Open + Accent 1 50 + Rvolume 10 + Volume p + Rtime 10 +End + + +Begin Chord + Voice Piano2 + Sequence C24 {C2; C3 Shift .5 } + Accent 1 20 3 10 + Voicing Mode=Optimal + Articulate 99 + Rvolume 20 + Rtime 10 + Volume f + Octave 5 +End + + +DefGroove Jive A simple jive-dance beat. + + +Begin Drum-Clap + Tone HandClap + Sequence D24 / / D124 + SeqRnd On + Volume f + Rskip 10 + Rvolume 5 + Rtime 5 +End + + +DefGroove JiveClap Adds a handclap to the Jive beat, mostly on 2 and 4. + +Groove Jive + +Begin Chord-Sus + Voice Strings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + +DefGroove JiveSus Harmonic strings added. + +Drum-Clap Groove JiveClap + +DefGroove JiveClapSus Sustained strings with handclaps. + + +/// Add arpeggio + +Groove Jive + +Begin Arpeggio + Voice Tenorsax + Sequence {1 4 90; 2 8 80; 2.5 8 90; 4 8 90 } + Range 3 + Octave 4 + Harmony Open + Volume mp + Articulate 100 + Accent 1 20 3 20 + RTime 10 + RVolume 10 + Rskip 5 +End + +DefGroove JivePlus Add some additional apreggios. + +Chord-Sus Groove JiveSus + +DefGroove JiveSusPlus Apreggios plus strings. + + +/////// This is a little less shuffle-style + + +Groove Jive + +Drum-Kick Sequence { D13; D2 Shift .5 } +Drum-HH Sequence { D1234; D1234 Shift .5 } +Bass-Sax Sequence B11 / / {1 4. 1 90; 2.5 4 5 99} +Chord Sequence C24 {C2; C3 Shift .5 } + +DefGroove Jive1 Our jive-dance with less shuffle. + +Drum-Clap Groove JiveClap +DefGroove Jive1Clap Handclap added to Jive1 beat. + +Groove Jive1 +Chord-Sus Groove JiveSus +DefGroove Jive1Sus Harmonic strings added. + +Drum-Clap Groove JiveClap +DefGroove Jive1ClapSus Sustained strings with handclaps. + +Groove Jive1 +Arpeggio Groove JivePlus +DefGroove Jive1Plus The un-push version with arpeggios. +Chord-Sus Groove JiveSus +DefGroove Jive1SusPlus No push with strings and arpeggios. + +//////////////////////// +/// Intro + +Groove Jive + +AllTracks SeqRnd Off +AllTracks Rskip 0 + +Drum-Kick Sequence D13 / / D1 +Drum-Snare Sequence D24 / / D1 +Drum-HH Sequence D1234 / / D1 +Bass Sequence B13 / / {1 4 1 90; 2 4 3 90; 3 2 1 90} +Bass-Sax Sequence B11 / / {1 2 1 90} +Chord Sequence C24 / / L1 +Drum-Clap Sequence D1234 / / D1 + +DefGroove JiveIntro 4 bar intro. + + + +//////////////////////// +/// Ending + +Groove Jive + +SeqSize 2 + +Bass Sequence B13 B13 +Bass-Sax Sequence B13 B11 +Chord Sequence C24 C13 +Drum-HH Sequence D8 D13 +Drum-Kick Sequence D24 D13 +Drum-Snare Sequence D1234 D13 + +DefGroove JiveEnd This 2 bar ending has 4 beats/hits on the first bar \ + and hits on 1 and 3 on the second. + + diff --git a/mma/lib/stdlib/lfusion.mma b/mma/lib/stdlib/lfusion.mma new file mode 100644 index 0000000..bda3860 --- /dev/null +++ b/mma/lib/stdlib/lfusion.mma @@ -0,0 +1,247 @@ +// lfusion + +Begin Doc + + Latin Fusion ... whatever that might mean to you. I figure it's + a combination of swing, jazz and latin. I created this for the + Hank Williams tune "Jambalaya" which I've heard done in too many + genres to list here. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////// Additional patterns + +Begin Chord Define + Acc1 1 8 90; 1.5 8 90; 2 8 90; 2.5 8 90; C34 + Acc2 C134; 2 8 90; 2.5 8 90 +End + + +///////////// + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence {D13; d2 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Rcym + Tone RideCymbal1 + Sequence {D12; D34 Shift .5} {D12 Shift .5; D34} + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Bongo + Tone HighBongo + Sequence D4 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Mconga + Tone MuteHighConga + Sequence D2 + Volume mp + Rvolume 5 + Rtime 5 + Volume mf p +End + +Begin Drum-Oconga + Tone OpenHighConga + Sequence {D1; D24 Shift .5} {D12 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Lconga + Tone LowConga + Sequence D3 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Cabasa + Tone Cabasa + Sequence {D13 ; D1234 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Claves + Tone Claves + Sequence {D2; D3 Shift .5} {D24; D3 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Block + Tone HighWoodBlock + Sequence {D14; D2 Shift .5} {D2; D3 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + + +Begin Drum-Cuica + Tone MuteCuica + Sequence z D4 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-MTri + Tone MuteTriangle + Sequence {D234; D24 Shift .5} {D1234; D24 Shift .5} + Volume mp + Rvolume 5 + Rtime 5 +End + + +Begin Drum-OTir + Tone OpenTriangle + Sequence { D13 Shift .5 } + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Shaker + Tone Shaker + Sequence D13 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Bass + Voice FretlessBass + Volume ff + Octave 3 + Sequence {1 4 1 90; 2.5 8 1 80; 3 4 5 90; 4.5 8 5 80} / / z + Articulate 80 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Volume ff + Sequence z z z W1234 + Articulate 80 +End + +Begin Chord + Voice Piano2 + Volume mf + Octave 5 + Sequence {C123; C34 Shift .5} {C12 Shift .5; C34} + Articulate 80 + Accent 1 20 3 20 +End + +Begin Arpeggio + Voice Atmosphere + Articulate 90 + Volume mf + Harmony Open + Octave 4 + Sequence {1 4 90; 2 4 90; 2.5 8 90; 3.5 8 90; 4.5 8 90} \ + {1 8 90; 1.5 4 90; 2.5 4 90; 3.5 8 90; 4 4 90} +End + +DefGroove LFusion Basic Latin Fusion. + +Arpeggio Sequence - + +Begin Chord-Sus + Voice Strings + Octave 4 + Voicing Mode=Optimal + Sequence { 1 1 90 0 90 0 * 4 } + Articulate 100 + Unify On + Volume f +End + +DefGroove LFusionSus Add sustained atmosphere. + +// Give a more cajan/zydeco feel with an accordion + +Groove LFusion + +Arpeggio Sequence - + +Begin Chord + Voice Bandoneon + Octave 5 + Articulate 70 + Accent 1 40 3 20 + Volume p + Sequence Acc1 Acc2 Acc1 C124 +End + +DefGroove LFusion1 Same rhythm but with an accordion for that zydeco feeling. + + +Chord-Sus Groove LfusionSus + +DefGroove LFusion1Sus The zydeco with strings. + +////////////////////////// +/// Endings + +Groove Lfusion + +Drum-Kick Sequence D13 +Drum-Rcym Sequence D123 +Drum-Bongo Sequence - +Drum-Mconga Sequence D1 +Drum-Oconga Sequence D1 +Drum-Lconga Sequence D3 +Drum-Cabasa Sequence - +Drum-Claves Sequence {D13; D1 Shift .5} +Drum-Block Sequence D123 +Drum-Cuica Sequence - +Drum-MTri Sequence D13 +Drum-OTir Sequence - +Drum-Shaker Sequence D13 + +Walk Sequence - +Bass Sequence B11 + +Arpeggio Sequence - + +Chord Sequence C13 + +DefGroove LFusionEnd A one bar ending. + + +Begin Chord + Groove LFusion1 + Sequence C13 +End + +DefGroove Lfusion1End Same as LFusionEnd, but uses accordion instead \ + of piano. + diff --git a/mma/lib/stdlib/lighttango.mma b/mma/lib/stdlib/lighttango.mma new file mode 100644 index 0000000..56568b0 --- /dev/null +++ b/mma/lib/stdlib/lighttango.mma @@ -0,0 +1,195 @@ + +// lightttango + +Begin Doc + + A light version of our tango. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////// +//// Additional patterns + +Begin Bass Define + Btang 1 4 1 90; 2.5 8 1 90; 3 8 5 90; 4 8 3 90; + Bp1 3.5 8 3 90; 4 8 5 90; 4.5 8 1 90; + Bp2 1 2 1 90 + Bp3 2 2 1 90 + Bp4 2.5 2 5 90 + +End + +///////// + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D1234 + Accent 1 30 + Volume mp + Rtime 5 + Rvolume 5 +End + +Begin Drum-Snare + Tone SnareDrum1 + Sequence D1234 {D1234; D4 Shift .75} + Accent 1 30 + Volume mp + Rtime 5 + Rvolume 5 +End + +Begin Drum-PHH + Tone PedalHiHat + Sequence D1234 + Volume mp + Rtime 5 + Rvolume 5 +End + +Begin Drum-Tam + Tone Tambourine + Sequence {D14; D3 shift .5} + Rskip 10 + Volume mp + Rtime 5 + Rvolume 5 +End + +Begin Drum-Clave + Tone Claves + Sequence {D3 Shift .5; D4} z + Volume mp + Rtime 5 + Rvolume 5 +End + +Begin Chord-Accordion + Voice Accordion + Voicing Mode=Optimal + Sequence C1234 { C1234; C3 Shift .5 } \ + C1234 { C1234; C13 Shift .5 } + Articulate 30 + Accent 1 20 3 10 + Volume ppp + Octave 6 +End + +Begin Chord-Guitar + Voice NylonGuitar + Voicing Mode=Optimal + Sequence C1234 { C1234; C4 Shift .5 } \ + C1234 { C1234; C24 Shift .5 } + Articulate 50 + Accent 1 20 3 10 + Volume mp + Octave 6 +End + +Begin Bass-Piano + Voice Piano1 + Sequence Bp1 Bp2 Bp3 Bp4 + Volume mp + Harmony - - 3Above / + Articulate 100 + Octave 5 +End + +Begin Bass + Voice AcousticBass + Sequence Btang + Volume mf + Articulate 80 + Accent 1 20 + Octave 3 +End + +DefGroove LightTango A light Tango, more Spanish. + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume p + Voice TremoloStrings + Octave 5 + Articulate 100 + Unify On +End + +DefGroove LightTangoSus Add a sustained tone to the tango. + +// change out accordion for piano + +Groove LightTango + +Chord-Accordion Sequence - + +Begin Chord-Piano + Voice Piano1 + Voicing Mode=Optimal + Sequence C1234 { C1234; C3 Shift .5 } \ + C1234 { C1234; C13 Shift .5 } + Articulate 70 + Accent 1 20 3 10 + Volume pp + Octave 6 +End + +DefGroove LightTango1 Change out the accordion for a piano. + +Chord-Sus Groove LightTangoSus +DefGroove LightTango1Sus Add a sustained tone to the piano variant. + +///////////////////// +/// Introduction + +Groove LightTango + +AllTracks SeqRnd Off + +Drum-Kick Sequence * * * D1 +Drum-Snare Sequence * * D8 D12 +Drum-PHH Sequence * * * D13 +Drum-Tam Sequence * * * D13 +Drum-Clave Sequence * * * D1 + +Chord-Accordion Sequence * * * L1 +Chord-Guitar Sequence * * * C1 +Bass-Piano Sequence Bp1 Bp2 Bp3 B1 +Bass Sequence * * * B1 + + +DefGroove LightTangoIntro Simple introduction. + +////////////// Ending + +Groove LightTango + +SeqSize 1 + +Bass Sequence B11 +Bass-Piano Sequence - +Chord-Accordion Sequence C13 +Chord-Guitar Sequence C13 +Drum-Clave Sequence - +Drum-Kick Sequence D13 +Drum-PHH Sequence {D123; D12 Shift .5} +Drum-Snare Sequence D1 +Drum-Tam Sequence - + +DefGroove LightTangoEnd A fast single bar ending. + + + + + + diff --git a/mma/lib/stdlib/mambo.mma b/mma/lib/stdlib/mambo.mma new file mode 100644 index 0000000..65173e6 --- /dev/null +++ b/mma/lib/stdlib/mambo.mma @@ -0,0 +1,219 @@ + +// mambo + +Begin Doc + + The Mambo was popularized by the great Cuban bandleader Perez Prado. + The sample song ``Patricia, It's Patricia'' is a decent demo. + This file was mostly developed from the patterns in``Latin Rhythms: Mystery Unraveled'' + by Victor Lopez. The variations in this file are mostly borrowed from the + Rhumba library. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +SeqSize 2 + +Begin Drum-Clave + Tone Claves + Volume mf + Sequence Clave2 Clave3 + Rvolume 10 + Rtime 5 +End + +Begin Drum-Cow + Tone CowBell + Volume mf + Sequence {D1234; D3 Shift .5} {D12; D23 Shift .5} + Rvolume 10 + Rtime 5 +End + +Begin Drum-Bell + Tone RideBell + Volume p + Rvolume 10 + Rtime 5 + Sequence {D1234; D34 Shift .5} { D234; D124 Shift .5} +End + +Begin Drum-Snare + Tone SnareDrum1 + Volume m + Rvolume 10 + Rtime 5 + Sequence D2 +End + +Begin Drum-HConga + Tone OpenHighConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {1 0 90; 1.5 0 90; 3.5 0 90} {1 0 90; 1.5 0 90; 2.5 0 90; 3.5 0 90; 4.5 0 90} +End + +Begin Drum-LConga + Tone LowConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {2 0 90; 2.5 0 90; 3 0 90; 4 0 90; 4.5 0 90} {2 0 90; 3 0 90; 4 0 90} +End + + +Begin Chord + Voice Piano2 + Octave 5 + Volume m + Articulate 80 + Voicing Mode=Optimal + Define Broken 1 8 90; 1.5 8 0 90 0; 2 8 0 0 90; 2.5 8 90 + Sequence { Broken; Broken Shift 2 } +End + +Begin Arpeggio + Voice $_Chord_Voice + Octave 4 + Volume mp + Articulate 77 + Sequence A8 + Range 1 +End + +Begin Bass + Voice JazzGuitar + Volume ff + Octave 3 + Articulate 80 + Sequence {1 4. 1 90; 2.5 4. 5 90; 4 2 1+ 90} +End + +DefGroove Mambo Basic rhythm. + +// Variation 1 + +Groove Mambo +Seqsize 4 +Begin Arpeggio + Sequence A4 A8 A4 A8 + Invert 0 0 1 1 + SeqRnd On + Voice PizzicatoString + Articulate 110 + Octave 5 6 + Volume mf + Rvolume 10 + Rskip 20 +End + +DefGroove Mambo1 Adds pizzicato arpeggios. + +///// Variation 2 + +Groove Mambo + +Begin Chord-Mallet + Voice Marimba + Sequence {C1234; C1234 Shift .2; C1234 Shift .4; C1234 Shift .6; C1234 Shift .8} \ + {C24; C24 Shift .2; C24 Shift .4 ; C24 Shift .6; C24 Shift .8} + Articulate 60 + Voicing Mode=Optimal + Octave 6 + DupRoot -1 + Accent 1 40 + Volume p +End + +DefGroove Mambo2 Add articulated Marimbas. + +///// Variation 3 + +Groove Mambo +SeqSize 4 +Begin Chord-Guitar + Voice JazzGuitar + Sequence C1234 C134 C24 C13 + SeqRnd On + Voicing Mode=Optimal + Articulate 110 + Octave 6 + Accent 1 20 3 20 + Volume p +End + +DefGroove Mambo3 Add jazz guitar chords. + +//////// Sustained versions + +Groove Mambo +Alltracks Volume -20 +Begin Chord-Sus + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Voice Strings + Articulate 110 + Unify On + Volume mp + Octave 5 +End + +DefGroove MamboSus Sustained version. + +Groove Mambo1 +Alltracks Volume -20 +Chord-Sus Groove MamboSus +DefGroove Mambo1Sus Sustain and pizzicato arpeggios. + +Groove Mambo2 +Alltracks Volume -20 +Chord-Sus Groove MamboSus +DefGroove Mambo2Sus Sustain and articulated Marimbas. + +Groove Mambo3 +Alltracks Volume -20 +Chord-Sus Groove MamboSus +DefGroove Mambo3Sus Sustain and guitar chords. + +////// Intro + +Groove Mambo +SeqSize 4 // change from 2 bar pattern to 4 + +Drum-Clave Sequence D1 D1 Clave2 D12 +Drum-Cow Sequence D13 * * D1 +Drum-Bell Sequence D2 * * D2 +Drum-Snare Sequence D24 / / D12 +Drum-HConga Sequence * * * z +Drum-LConga Sequence * * * z +Chord Sequence L1 * * {L1; L1 Shift .5; L1 Shift 1} +Arpeggio Sequence z z * z +Bass Sequence * * * {1 1 1 90} + +DefGroove MamboIntro 4 bar intro with a bit of a cha-cha on 4. + +//// Ending + +Groove Mambo + +Drum-Clave Sequence Clave2 D1 +// Drum-Cow no change +Drum-Bell Sequence D1234 D1 +// Drum-Snare no change +Drum-HConga Sequence * D1 +Drum-LConga Sequence * D1 +Chord Sequence {L1; L1 Shift .5; L1 Shift 1} C13 +Arpeggio Sequence z +Bass Sequence {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} {1 1 1 90} + +DefGroove MamboEnd That's the end! diff --git a/mma/lib/stdlib/march.mma b/mma/lib/stdlib/march.mma new file mode 100644 index 0000000..1b18bd0 --- /dev/null +++ b/mma/lib/stdlib/march.mma @@ -0,0 +1,266 @@ + +// march + + +Begin Doc + + Sousa would love this file. These all need a bit of work---they + tend too sound a bit to ponderous and/or heavy. The sequences assume + 4 chords per bar, but most marches are in 2/4 time. So, double the + tempo for "proper" results. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +//////////////////////////////////// +// Additional pattern defs + +Begin Chord Define + C13+ C13; C24 Shift .5 + C+1234 C1234 Shift .5 + + Long1 1 1 90 + Long2 Long1 * 2 + Long4 Long1 * 4 +End + +Begin Arpeggio Define + A4+ A4 ; 1.5 4 90; 3.5 4 90 +End + + +////////////////////////////// +// Some military-style drum intros +// MilIntro4 + + +SeqSize 4 + +Begin Drum-Snare + Sequence Droll D12 {Droll * 2} D1234 + Tone SnareDrum1 + Rtime 2 + Rvolume 5 +End + +Begin Drum-Tom + Sequence D1 D12 D1 D13 + Tone LowTom1 +End + +DefGroove MilIntro4 A 4 bar military-style intro. Easy to use \ + if you include a line like "z * 4" at the \ + start of the piece. + + +// MilIntor2 + +SeqSize 2 + +DefGroove MilIntro2 A 2 bar military-style intro. This is \ + identical to the MilIntro4, but only uses \ + the first 2 bars of the sequence. + + +///////////////////////////////////// +// Standard march + +SeqClear +SeqSize 4 + +Begin Drum + Sequence D13 / / D1234 + SeqRnd On + Tone SnareDrum1 + Volume mp +End + +Begin Drum-Tom + Sequence D1 / D13 / + Tone LowTom1 + Volume f +End + +Begin Drum-Tri + Sequence D1 D13 + SeqRnd On + Tone OpenTriangle + Rvolume 5 + RSkip 20 + Volume mf +End + +Begin Chord + Voice Trumpet + Sequence C13 / / C13+ + Accent 1 10 + Octave 6 + Articulate 90 + Volume mp +End + +Begin Chord-TBone + Voice Trombone + Sequence C13 + Octave 5 + Articulate 60 + Volume mp + RVolume 5 + Rskip 10 +End + +Begin Bass + Voice Tuba + Sequence B13 / / B11 + Articulate 60 + Octave 3 + Volume ff +End + +DefGroove March Standard march pattern. Boring, but it works. + + +// March1 +// This adds some walking bass to March and changes 'bones to piano + + +Chord-Tbone Sequence - + +Begin Chord-Piano + Voice Piano1 + SeqClear + Sequence C13 + Accent 1 10 + Octave 4 + Articulate 80 + Volume mf + RVolume 5 +End + +Bass Sequence B13 z + +Begin Walk + Voice Tuba + Sequence z W1234 + Articulate 60 + Octave 3 + Rvolume 10 + Rtime 5 + Volume f +End + +DefGroove March1 Adds alterating bars of walking bass to the \ + standard march. Also, \ + changes the trombones to a piano. + + +Walk Sequence W13 +Bass Sequence - + +DefGroove March1Slow This is just March1 with the walking bass \ + set to beats 1 and 3 instead of 1,2,3 and 4. + + +//////////////////////////////////////////// +// March2 +// Add sus strings to March2, no trumpets + + +Groove March1 + +Begin Chord // in March1 this is the trumpet track + SeqClear + Sequence Long2 + Rskip 30 + Octave 5 + Voice TremoloStrings + Articulate 100 + Unify On + Invert 0 1 2 0 + Volume mp +End + +DefGroove March2 Adds sustained strings to March1. The strings \ + replace the trumpets. A major sound difference. + + +// Add piccolo to March1 + +Groove March1 + +Begin Arpeggio + SeqClear + Sequence A8 / A4+ z + SeqRnd On + Voice Flute + Octave 8 + Invert 0 1 2 + Articulate 70 + Volume mp + Rskip 40 +End + +DefGroove March3 Adds an apreggiating piccolo to March1. \ + Great for trios. + + +// Add sus strings to March2, kill trumpets, add piccolo + +Groove March2 + +Begin Arpeggio + SeqClear + Sequence A8 A4+ A4 z + SeqRnd On + Voice Flute + Octave 8 + Articulate 90 + Invert 0 2 1 + Volume mp + Rskip 50 +End + +Begin Bass + Sequence B13 / / z + Articulate 60 + Voice Tuba + Octave 3 + Volume f +End + +Begin Walk + Sequence z z z W1234 + Voice Tuba + Articulate 50 + Octave 3 + Rvolume 10 + Rtime 5 + Volume f +End + + +DefGroove March4 Add sustained strings and apreggiating piccolo to March2. + + +/// Ending + +Groove March + +Alltracks SeqRnd Off + +Drum Sequence D8 / D1234 D1 +Drum-Tom Sequence D1 / D13 D1 +Drum-Tri Sequence D1 D13 D1 / +Chord Sequence C13 / / C1 +Chord-TBone Sequence C13 / / C1 +Bass Sequence B13 / B1 / + + +DefGroove MarchEnd Four bar ending. diff --git a/mma/lib/stdlib/merengue.mma b/mma/lib/stdlib/merengue.mma new file mode 100644 index 0000000..9f26a23 --- /dev/null +++ b/mma/lib/stdlib/merengue.mma @@ -0,0 +1,176 @@ + +// merengue + +Begin Doc + + This is a very fast dance rhythm native to the Dominican Republic. + The demo song for this ``Compadre Pedro Juan''. Note that you'll have + to double up on the tempo for this to sound right. Patterns are from + ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +Seqsize 2 + +Begin Drum-Claves + Tone Claves + Volume mf + Rvolume 10 + Rtime 2 + Sequence Clave3 Clave2 +End + +Begin Drum-Cowbell + Tone CowBell + Volume mf + Rvolume 10 + Rtime 2 + Sequence D13 +End + +Begin Drum-Snare + Tone SnareDrum2 + Volume p + Rtime 2 + Sequence {D134; D24 Shift .5}{D1234; D34 Shift .5} +End + +Begin Drum-Tom + Tone LowTom2 + Volume m + Rtime 2 + Sequence D13 +End + +Begin Drum-HHat + Tone OpenHiHat + Volume p + Rtime 2 + Sequence Clave3 Clave2 +End + +Begin Chord + Voice Piano1 + Voicing Mode=Optimal + Volume mf + Octave 6 + Sequence {C1 Shift .5; 2.5 8 0 90 0; 3 4 0 0 90 0; C4} \ + {1 4 0 90 0; C2; 3 4. 0 0 90 0; 4 8 90 0} +End + +Begin Chord-2 // duplicate the 1st piano down an octave + Voice Piano1 + Voicing Mode=Optimal + Volume m + Octave 5 + Sequence {C1 Shift .5; 2.5 8 0 90 0; 3 4 0 0 90 0; C4} \ + {1 4 0 90 0; C2; 3 4. 0 0 90 0; 4 8 90 0} +End + +Begin Bass + Voice AcousticBass + Volume f + Octave 3 + Articulate 70 + Sequence {1 2 1 100;3 2 5 90} +End + +DefGroove Merengue Driving dance rhythm. + +Groove Merengue + +Begin Chord + Voice Bandoneon + Voicing Mode=Optimal + Volume pp + Octave 8 +End + +DefGroove Merengue1 Substitute bandoneon for first piano. + +Groove Merengue +SeqSize 4 + +Begin Chord-Brass + Voice BrassSection + Volume mf + Voicing Mode=Optimal + Articulate 70 + Octave 6 + Sequence z z z C24 +End + +DefGroove Merengue2 Add brass hits every 4 bars. + +//////// Sustained versions + +Groove Merengue + +Alltracks Volume -20 +Begin Chord-Sus + Voice Bandoneon + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Octave 6 + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume mp +End + +DefGroove MerengueSus Basic version with sustained bandoneon. + +Groove Merengue1 +Alltracks Volume -20 +Chord-Sus Groove MerengueSus +DefGroove Merengue1Sus Bandoneon rhythm and sustain. + +Groove Merengue2 +Alltracks Volume -20 +Chord-Brass Volume +30 +Chord-Sus Groove MerengueSus +DefGroove Merengue2Sus Bandoneon rhythm with 4 bar brass hits. + +////// Intro + +Groove Merengue +SeqSize 8 + +Drum-Claves Sequence * * * * * * D8 D1234 +//Drum-Cowbell Sequence D13 +//Drum-Snare Sequence {D134; D24 Shift .5} {D1234; D34 Shift .5} +//Drum-Tom Sequence D13 +Drum-HHat Sequence * * * * * * D8 D1234 +Chord Sequence * * * * * * C1234 {C1;L1 Shift .5} +Chord-2 Sequence * * * * * * C1234 {C1;L1 Shift .5} +Bass Sequence * * * B11 * * {1 2 1 90; 3 8 5 90; 4 4 5 90} {1 1 1 90} + +DefGroove MerengueIntro 8 bar introduction. + +///// Ending + +Groove Merengue +SeqSize 4 + +Drum-Claves Sequence * * D8 D1 +Drum-Cowbell Sequence * * * D1 +Drum-Snare Sequence * * D8 z +Drum-Tom Sequence * * * D1 +Drum-HHat Sequence * * D8 D1 +Chord Sequence * * C13 L1 +Chord-2 Sequence * * C13 L1 +Bass Sequence * * B11 {1 1 1 90} + +DefGroove MerengueEnd 4 bar ending. + + + + + + + diff --git a/mma/lib/stdlib/metronome.mma b/mma/lib/stdlib/metronome.mma new file mode 100644 index 0000000..4dd4719 --- /dev/null +++ b/mma/lib/stdlib/metronome.mma @@ -0,0 +1,86 @@ + +// metronome + +Begin Doc + + Simple beats to put at the start of a piece. This file has + only 4/4 times. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 + +Begin Drum Define + M1 1 0 90 + M3 M1 Shift 2 + M13 M1; M3 + M24 M13 Shift 1 + M1234 M13; M24 +End + +//////////////////////////////////////////////////////// +/// Metronome2 Ticks on beat 1 and 3 + + +Seqsize 1 + +Begin Drum-Low + Sequence M1 + Tone LowWoodBlock +End + +Begin Drum-Hi + Sequence M3 + Tone HighWoodBlock +End + +DefGroove Metronome2 Single bar sequence with hits on beats 1 and 3. + +//////////////////////////////////////////////////////// +/// Metronome4 Ticks on 1, 2, 3 and 4. + +SeqClear +Seqsize 1 + +Begin Drum-Low + Sequence M13 + Tone LowWoodBlock +End + +Begin Drum-Hi + Sequence M24 + Tone HighWoodBlock +End + +DefGroove Metronome4 Single bar sequence with hits on beats \ + 1, 2, 3 and 4. + + +///////////////////////////////////// +/// Metronome2-4 +/// Tick on 1,3 then 1,2,3,4. 2 Bar seq. + +SeqClear +SeqSize 2 + +Begin Drum-Low + Sequence M1 M13 + Tone LowWoodBlock +End + +Begin Drum-Hi + Sequence M3 M24 + Tone HighWoodBlock +End + +DefGroove Metronome2-4 A very useful introduction. On bar one we have \ + hits on beats 1 and 3; on bar two hits on beats \ + 1, 2, 3 and 4. + + + + diff --git a/mma/lib/stdlib/metronome3.mma b/mma/lib/stdlib/metronome3.mma new file mode 100644 index 0000000..9bf5b94 --- /dev/null +++ b/mma/lib/stdlib/metronome3.mma @@ -0,0 +1,44 @@ + +// metronome3 + +Begin Doc + + Simple beats to put at the start of a piece. This file has + only 3/4 times. + +End + +Author Bob van der Poel + +SeqClear +Time 3 +Timesig 3 4 + +Begin Drum Define + M1 1 0 90 + M23 M1 Shift 1; M1 Shift 2 +End + +///////////////////////////////////////// +////// Metronome3 +////// A 3/4 metronome. + +SeqSize 1 + + +Begin Drum-Low + Sequence M1 + Tone LowWoodBlock + Volume mp +End + +Begin Drum-Hi + Sequence M23 + Tone HighWoodBlock + Volume mp +End + +DefGroove Metronome3 A single bar waltz introduction. + + + diff --git a/mma/lib/stdlib/modernjazz.mma b/mma/lib/stdlib/modernjazz.mma new file mode 100644 index 0000000..1cb2887 --- /dev/null +++ b/mma/lib/stdlib/modernjazz.mma @@ -0,0 +1,225 @@ + +// modernjazz + +Begin Doc + A jazz style which has a bit of raunch and swing. + Works well with Peggy Lee's "Fever". +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////////// +///////// Additional Patterns + +Begin Chord Define + Sync23 C2; C3 Shift .75 + Sync34 C3; C4 Shift .75 + Sync33 C3; C3 Shift .75 +End + + + +Begin Walk Define + W1234+ 1 8 90 ; 1.75 32 90 ; 2 4 90 ; 3 4 90 ; 4 4 90 +End + +//////////////////////////////////// + + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D1 z D1 {D2 Shift .75; D4 } + Volume mf / / mp + RVolume 10 + RTime 5 +End + +Begin Drum-Side + Tone SnareDrum1 + Volume mp + Rvolume 10 + Rtime 5 + Sequence z {D34 Shift .75 } z {D13 Shift .75; D3 } +End + +Begin Drum-PHH + Tone PedalHiHat + Sequence D24 + Volume mp + Rvolume 10 + Rtime 5 +End + +Begin Drum-OHH + Tone OpenHiHat + Sequence D1 z z z + Volume mp + Rvolume 10 + Rtime 5 +End + +Begin Drum-Ride + Tone RideCymbal1 + Sequence {D1234; D24 Shift .75} + Volume mp + Rvolume 10 + Rtime 5 +End + +Begin Walk + Voice AcousticBass + Volume mf + Articulate 70 + Accent 1 20 3 10 + Octave 3 + Sequence W1234 W1234+ / W1234 +End + +Begin Chord-Guitar + Voice JazzGuitar + Volume mp + Voicing Mode=Optimal + Articulate 40 + Octave 5 + Rtime 5 + Rvolume 5 + Sequence C1 Sync23 C1 Sync33 +End + +Begin Chord-Piano + Voice Piano2 + Volume mf + Voicing Mode=Optimal + Articulate 40 + Octave 5 + Rvolume 10 + Rtime 5 + Sequence C24 Sync34 C2 Sync33 +End + +DefGroove ModernJazz ModernJazz with just a piano and guitar. + +Begin Arpeggio + Voice MutedTrumpet + Octave 5 + Range 1 + Volume mf + Rvolume 5 + Rtime 3 + Rskip 5 + Articulate 80 + Sequence {3 8 90; 3.75 8 90; 4.75 8 90 } z z z +End + +Begin Bass-Trp + Voice MutedTrumpet + Octave 5 + Volume mf + Rvolume 5 + Rtime 3 + Rskip 5 + Articulate 70 + Sequence z z {3 8 3 100; 3.5 8 5 80; 3.75 32 3 80; \ + 4 8 5 100; 4.75 16 3 90 } z +End + + +DefGroove ModernJazz1 Adds a muted trumpet on alternate bars. + +////////// Sustained versions + +Groove ModernJazz + +Begin Chord-sus + Voice VoiceOohs + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Articulate 100 + Unify On + Volume p + Octave 6 +End + + +Chord-Piano Sequence z Sync34 z Sync33 + +DefGroove ModernJazzSus ModernJazz with added sustained violins. + +Groove ModernJazz1 + +Chord-Sus Groove ModernJazzSus + +DefGroove ModernJazz1Sus The full-meal-deal. + +///////////////////////////////////////////////// +///////// Intro + +Groove ModernJazz + +Drum-Kick Sequence D1 z D1 D12 +Drum-Side Sequence z {D34 Shift .75 } z D1 +Drum-PHH Sequence D24 / / D2 +Begin Drum-OHH + Sequence D1 z z D16 + Volume mp ppp +End +Drum-Ride Sequence - + +Walk Sequence W1234 / / {1 2 90} + +Chord-Guitar Sequence C1 Sync23 C1 L1 + +Chord-Piano Sequence C24 Sync34 C2 C1 + +Begin Chord-Trp + Voice MutedTrumpet + Octave 5 + Volume mf + Rvolume 5 + Articulate 60 + Sequence {C1 ; C3 Shift .5} / / C1 +End + +DefGroove ModernJazzIntro 4 bar introduction. + + +//////// Ending + +Groove ModernJazz +SeqSize 2 + +Arpeggio Sequence - + +Begin Bass-Trp + Voice MutedTrumpet + Octave 5 + Volume mf + Articulate 70 + Sequence {1 8 1 90 ; 1.5 8 1 90 ; 2 8 1 90 ; \ + 2.5 8 1 90 ; 3 8 5 90 ; 4 8 5 90 } B11 +End + +Chord-Guitar Sequence C1234 C13 +Chord-Piano Sequence C24 C1 + +Drum-Kick Sequence D1 +Drum-OHH Sequence {D34 Shift .75 } z +Drum-PHH Sequence D8 D13 +Drum-Ride Sequence D8 D13 +Drum-Side Sequence - + +Walk Sequence W1234 W13 + +DefGroove ModernJazzEnd Nice, 2 bar, ending. First bar is full, \ + second has hits on 1 and 3. + + diff --git a/mma/lib/stdlib/pianoballad.mma b/mma/lib/stdlib/pianoballad.mma new file mode 100644 index 0000000..6a8e72b --- /dev/null +++ b/mma/lib/stdlib/pianoballad.mma @@ -0,0 +1,149 @@ + +// pianoballad + +Begin Doc + + Piano arpeggios with a bit of drum and bass. I wrote this for + "Nature Boy". + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + + +///////////////////////// +/// Basic Pattern + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D123 + Volume mp + Rtime 3 + RVolume 10 +End + +Begin Drum-Side + Tone SideKick + Sequence D13 + Volume mp + Rtime 3 + Rvolume 10 +End + +Begin Drum-CHiHat + Tone ClosedHiHat + Sequence D8 + Volume p + Rtime 2 + Rvolume 10 +End + +Begin Bass + Voice FingeredBass + Volume p + Octave 3 + Articulate 90 + Sequence {1 4. 1 90; 2.5 8 1 90; 3 4. 1 90; 4.5 4 5 90} \ + {1 4. 1 90; 2.5 8 1 90; 3 4 1 90; 4 4 3 90} +End + +Begin Arpeggio-High + Voice Piano1 + Volume mp + Articulate 80 + Octave 5 + Sequence { 1 4 90; 2 8 90; 2.5 8 90; 3 4 90; 4 8 90; 4.5 8 90 } \ + { 1 4. 90; 2.5 8 90; 3 4 90; 4 8 90; 4.5 8 90} +End + +Begin Arpeggio-Low + Voice Piano1 + Volume p + Articulate 70 + Octave 4 + Sequence { 1 8 90; 1.5 8 90; 2 4 90; 3.5 4 90; 4.5 8 90} \ + { 1 8 90; 1.5 2 90; 3.5 8 90; 4 4 90} +End + +DefGroove PianoBallad Simple ballad with drums and piano. + +Begin Chord-Piano + Voice Piano1 + Volume p + Articulate 100 + Octave 5 + Sequence C1 C13 C3 C1 +End + +DefGroove PianoBallad1 Add additional piano chords. + +//////////////////////// +/// Sustained version + +Groove PianoBallad + +// This uses a few tricks. First, a combination of single notes +// and 2 note chords get created by using different sets of +// volume lists; the decay is generated via a MIDIVOICE. This +// will not work on all sequencers. + +Begin Chord-Sus + Voice Strings + MidiVoice { 1 ReleaseTime 80; 1 Chorus 90 } + MidiClear 1 ReleaseTime 0; 1 Chorus 0 + Volume pp + Sequence {1 2. 90 0 90 0; 4.5 16 0 90 0; 4.75 16 0 0 90 0} \ + {1 1 90 0 90 0 * 4 } \ + {1 2. 90 0 90 0 ; 4.5 16 0 90 0; 4.75 16 0 0 90 0} \ + {1 16 90 0; 1.25 16 0 90 0; 1.5 2. 0 0 90 0} + Octave 6 + Unify On + Articulate 60 100 60 60 +End + +DefGroove PianoBalladSus Piano arpeggios with a bit of strings. + +Groove PianoBallad1 +Chord-Sus Groove PianoBalladSus + +DefGroove PianoBallad1Sus Piano arpeggios with chords and strings. + +////////////////////// +//// Intro + +Groove PianoBallad + +Drum-Kick Sequence D12 +Drum-Side Sequence D13 +Drum-CHiHat Sequence D8 + +Bass Sequence * * * { 1 2 1 90 } +Arpeggio-High Sequence * * * A4 +Arpeggio-Low Sequence A1 A2 A4 A1 + +DefGroove PianoBalladIntro A 4 bar introduction. + + +//////////////////////// +//// Ending + +Groove PianoBallad + +SeqSize 2 + +Drum-Kick Sequence D1234 D1 +Drum-Side Sequence D1234 D12 +Drum-CHiHat Sequence D8 { D12 ; D12 Shift .5} + +Bass Sequence * { 1 2 1 90 } +Arpeggio-High Sequence A4 A1 +Arpeggio-Low Sequence A4 A1 + +DefGroove PianoBalladEnd A 2 bar ending. diff --git a/mma/lib/stdlib/polka.mma b/mma/lib/stdlib/polka.mma new file mode 100644 index 0000000..e2fc509 --- /dev/null +++ b/mma/lib/stdlib/polka.mma @@ -0,0 +1,210 @@ + +// polka + +Begin Doc + + This is good for, gosh, polkas. They are all set as 4/4 time, and + as you know a polka is usually in 2/4. So, double up on the tempo + and all should work just fine. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////// +// Additional patterns + + +//////////////////////////////////////////////// +///// Polka + +SeqSize 4 + +Begin Chord + Sequence C13 / / { C1234; C2 Shift .5 } + Voicing Mode=Optimal + Voice Accordion + Accent 1 10 + Octave 5 + Articulate 70 + Volume p +End + +Begin Chord-Guitar + Sequence C1234 C24 / / + Voicing Mode=Optimal + Voice JazzGuitar + Octave 5 + Articulate 80 + Strum 4 + Volume p +End + +Begin Drum + Sequence D13 + Tone Slap + RVolume 5 + RSkip 5 + Rtime 2 + Volume p +End + +Begin Drum-HH + Sequence D13 + Tone ClosedHiHat + RVolume 4 + Rtime 4 + Rskip 5 + Volume p +End + +Begin Drum-Snare + Sequence D24 / / D1234 + Tone SnareDrum1 + RVolume 10 + RTime 3 + Volume p p p pp +End + +Begin Drum-Cym + Sequence D1 + Tone CrashCymbal1 + RVolume 20 + RSkip 80 + Volume p +End + +Begin Bass + Voice Tuba + Sequence B13 / / z + Octave 3 + Articulate 60 + Rvolume 10 + Volume mf +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Articulate 60 + Volume mf + RVolume 4 +End + +DefGroove Polka Simple, Barvarian-style polka. + +Begin Chord-Sus + Sequence { 1 1 90 0 90 0 * 4 } + Voice ChoirAahs + Octave 5 + Voicing Mode=Optimal + Articulate 100 + Unify On +End + +DefGroove PolkaSus Same as Polka, but we add in singing frauleins. + +// Add in arp accordion + +Groove Polka + +Begin Arpeggio + Sequence A4 A8 A4 A8 + Invert 0 0 1 1 + Range 2 + SeqRnd On + Voice Accordion + Octave 5 + Rvolume 5 + RSkip 20 + Volume mp +End + +DefGroove PolkaArp Polka with a imported accordion player for arpeggios. + +Chord-Sus Groove PolkaSus + +DefGroove PolkaSusArp Polka with frauleins and accordion player. Wow! + +// Polka1 Bass variation + +Groove Polka + +//Chord-Guitar Sequence C24 / / C1234 + +Bass Sequence {B1234; 2.5 8 5 80 } / / z +Walk Sequence z z z { W1234 ; 2.5 8 80 } + +DefGroove Polka1 Similar to Polka, but with a snazzier bass. + +Chord-Sus Groove PolkaSus +DefGroove Polka1Sus Polka1 with sustained voices. + +Groove Polka1 +Arpeggio Groove PolkaArp +DefGroove Polka1Arp Polka1 with Accordion arpeggios. + +Chord-Sus Groove PolkaSusArp +DefGroove Polka1SusArp Polka1 with voices and arpeggios. + +////////////////////////////////// +// PolkaIntro + +Groove Polka + +Chord Sequence C13 / / C1 +Chord-Guitar Sequence C13 / / C1 +Drum Sequence D13 / / D1 +Drum-HH Sequence D13 / / D1 +Drum-Snare Sequence D24 / / D2 +Begin Drum-Cym + Sequence z / / D1 + RVolume 0 + RSkip 0 + Volume mf +End + +Begin Bass + Voice Tuba + Sequence B13 / / {1 4 5 80; 2 4 4 90; 3 4 3 100; 4 4 2 120} + Octave 3 + Articulate 70 + Rvolume 0 + Volume f +End + +Walk Sequence - + +DefGroove PolkaIntro A nice little 4 bar intro. + + +////////////////////////////////// +// PolkaEnd +// 1 bar ending + +Groove Polka +SeqSize 1 + +Begin Chord + Sequence C13 + Invert 0 + Volume mf +End + +Walk Sequence - +Bass Sequence B11 +Drum-Snare Sequence D1234 +Drum-Cym Sequence D1 + +DefGroove PolkaEnd A repeatable, single bar ending. + + + + + diff --git a/mma/lib/stdlib/popballad.mma b/mma/lib/stdlib/popballad.mma new file mode 100644 index 0000000..98ad7ff --- /dev/null +++ b/mma/lib/stdlib/popballad.mma @@ -0,0 +1,202 @@ + +// popballad + +Begin Doc + + A rock ballad in 4. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////////// +///// Additional patterns + + +Begin Bass Define + B12'3 B13; 2.75 32 1 50 + B12'34' B12'3; 4.5 4 5 90 +End + +Begin Chord Define + + // A fairly complicated piano chord. On beats 1,2,3,4 we have + // quarter note ROOT tones, on the off-beats (1.5, etc) we + // have the 3rd and 5th of the chord. + + Cpiano 1 1 90 0 * 4; 1 1 0 80 80 0 * 4 Shift .5 +End + +/////////////////////////////////////////////////////// + +SeqSize 4 + +Begin Drum-HH + Tone ClosedHiHat + Sequence D8 + Rtime 5 + Rskip 5 + Rvolume 5 +End + +Begin Drum-Cym + Tone CrashCymbal1 + Sequence D1 z + Volume p +End + +Begin Drum-Kick + Tone KickDrum1 + Sequence { D13; D23 Shift .5 } + Volume mf + Rskip 20 + Rtime 5 + Rvolume 10 +End + +Begin Drum-Snare + Tone SnareDrum1 + Sequence D24 +End + +Begin Drum-Cabasa + Tone Cabasa + Sequence D1234 + Rskip 40 + Rtime 10 + Rvolume 20 +End + +Begin Drum-Shake + Tone Shaker + Sequence D1234 + Rskip 40 + Rtime 10 + Rvolume 20 +End + +Begin Bass + Sequence B12'3 B12'34' + SeqRnd On + Voice AcousticBass + Articulate 80 + Rtime 4 + Rvolume 10 + Octave 3 +End + +Begin Chord + Sequence Cpiano + Accent 1 10 3 10 + Voice Piano2 + Octave 4 + Articulate 90 + Rskip 5 + Volume p +End + +Begin Arpeggio + Voice Atmosphere + Sequence A8 + Octave 5 + Articulate 90 + Rtime 5 + Rvolume 10 + Rskip 10 + Volume p + Harmony Open + Direction Down +End + +DefGroove PopBallad Plain old Pop Ballad. + +/////////// PopBallad1 +/// Change the drums a bit and change the atmosphere to synthstring + +Groove PopBallad + +Drum-HH Sequence - + +Begin Drum-Ride + Tone RideCymbal1 + Sequence D8 + Rtime 10 + Rvolume 20 +End + +Begin Drum-Conga + Tone MuteHighConga + Sequence D24 + Rtime 5 + Rvolume 20 + Volume p +End + +Begin Drum-OConga + Tone OpenHighConga + Sequence { D34 Shift .5 } + Rtime 5 + Rvolume 20 + Volume p +End + +Begin Drum-LConga + Tone LowConga + Sequence D13 + Rtime 10 + Rvolume 20 + Volume p +End + +Begin Chord-Sus + Voice SynthStrings1 + Sequence { 1 1 90 0 90 0 * 4 } + Voicing Mode=Optimal + Octave 5 + Articulate 100 + Unify On + Rvolume 10 + Volume p +End + +Arpeggio Sequence - + +DefGroove PopBallad1 The PopBallad with a bit more drum beat and \ + some sustained strings. + +/// PopBallad without the arpeggios and a stronger piano + +Groove PopBallad + +Arpeggio Sequence - // No arps + +Begin Chord // Bump piano volume + Volume mf + Articulate 76 +End + +Drum-Kick Sequence D1234 // Kill kickdrum offbeats + +Defgroove PopBallad2 A straighter version of the ballad. + +/////// Ending + + +Groove PopBallad +SeqSize 1 + +Drum-Kick Sequence D1234 + +Bass Sequence B1234 + +Chord Sequence C4 + +Arpeggio Sequence - + +DefGroove PopBalladEnd This is a finalizing, 1 bar ending. + diff --git a/mma/lib/stdlib/quickstep.mma b/mma/lib/stdlib/quickstep.mma new file mode 100644 index 0000000..c0bf06b --- /dev/null +++ b/mma/lib/stdlib/quickstep.mma @@ -0,0 +1,182 @@ + +// quickstep + +Begin Doc + + A quickstep beat. You might want to double up on the tempo when + using this. Written for ``Hooray For Hollywood''. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////////// +// Pattern definitions + + + + +////////////////////////////////////////////////////////// +// Quickstep + + +SeqSize 2 + +Begin Drum-OpenHH + Tone OpenHiHat + Volume mp + Rvolume 10 + Rskip 2 + Sequence {D13; D24 Shift .5} +End + +Begin Drum-ClosedHH + Tone ClosedHiHat + Volume mp + Rvolume 10 + Rskip 5 + Sequence D24 +End + +Begin Drum-Kick + Tone KickDrum1 + Volume mp + Rvolume 10 + Sequence D13 +End + +Begin Bass + Voice AcousticBass + Volume mf + Articulate 94 + Octave 3 + Rvolume 10 + Rtime 2 + Sequence B13 +End + +Begin Chord-Piano + Voice Piano2 + Volume mp + Voicing Mode=Optimal + Articulate 70 + Octave 5 + Rtime 2 + Rvolume 10 + Sequence {1 4 90; 2 8 90; 3 4 90; 4 8 90} +End + +Begin Chord-Guitar + Voice JazzGuitar + Volume mf + Voicing Mode=Optimal + Articulate 90 + Octave 5 + Sequence {1 4 90 0; 3.5 8 90 0 90 0; 4 3 90 0 90 0; 4.66 3 90 0 90 0} \ + {4 4 90 0 } +End + +DefGroove QuickStep Snappy quickstep, good for showtunes. + +Groove QuickStep + +Begin Chord-Hit + Voice BrassSection + Volume mp + Voicing Mode=Optimal + Octave 6 + Articulate 60 + Rskip 20 + Sequence {1 4. 90; 4 8 90; 4.5 8 90} +End + +DefGroove QuickStepHit Brass hits on 1, 4 and 4.5. + + +////////////////////////////////// +/// Sustained Versions + +Groove QuickStep + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing Mode=Optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + +DefGroove QuickStepSus Sustained version with strings. + +Groove QuickStepHit +Chord-Sus Groove QuickStepSus +DefGroove QuickStepHitSus Sustains with hits. + +//////////////////////////////// +/// Vocal version + + +Groove QuickStep +SeqSize 4 // for the randomized vocal patterns + +Begin Chord-Duh + Voice VoiceOohs + Octave 5 + Voicing Mode=Optimal + Volume m + Sequence {1 4 90 0 90 0} {3 4 90 0 90 0; 4 4 90 0 90 0} \ + {2 2 90 0 90 0} {2 4 90 0 90 0; 3 4 90 0 90 0} + SeqRnd On + Articulate 60 +End + + +DefGroove QuickStepDuh Some vocalization over the basic beat. + +Groove QuickStepSus +Chord-Duh Groove QuickStepDuh +DefGroove QuickStepDuhSus Sustains with vocalization. + + +////////////////////////////////////////////////////////// +// Intro + +Groove QuickStep + +SeqSize 4 + +Alltracks Rskip 0 + +Drum-OpenHH Sequence * D8 D16 D12 +Drum-ClosedHH Sequence * D8 D16 D12 +Drum-Kick Sequence * * * D1 +Bass Sequence B13 / / {1 1 1 90} +Chord-Piano Sequence * * C1234 L1 +Chord-Guitar Sequence C1 / / L1 + + +Defgroove QuickStepIntro Four bar intro. + +////////////////////////////////////////////////////////// +// Ending + +Groove QuickStep + +AllTracks Rskip 0 + + +Drum-OpenHH Sequence D16 D1 +Drum-ClosedHH Sequence D16 D1 +Drum-Kick Sequence * D1 +Bass Sequence B13 B1 +Chord-Piano Sequence C1234 L1 +Chord-Guitar Sequence L1 C1 + +DefGroove QuickStepEnd Two bar ending. diff --git a/mma/lib/stdlib/rb.mma b/mma/lib/stdlib/rb.mma new file mode 100644 index 0000000..327d5ba --- /dev/null +++ b/mma/lib/stdlib/rb.mma @@ -0,0 +1,190 @@ + +// rb.mma + +Begin Doc + Rythmn and Blues. I did a different version of "My + Blue Heaven" using this groove. +End + + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////////////// + +SeqSize 2 + +Begin Drum-Kick + Tone KickDrum1 + Sequence {D13; D34 Shift .5} + Volume p + Accent 1 10 3 10 + Rtime 10 + Rvolume 20 +End + +Begin Drum-Clap + Tone HandClap + Sequence D24 + Volume mp + Rskip 10 + Rtime 10 + Rvolume 20 +End + +Begin Drum-Snare + Tone SnareDrum2 + Sequence D24 + Volume p + Rtime 10 + Rvolume 20 +End + +Begin Drum-Ride + Tone RideCymbal1 + Sequence D1234 + Rskip 10 + Volume p + Accent 1 10 3 10 + Rtime 10 + Rvolume 20 +End + +Begin Drum-Tam + Tone Tambourine + Sequence D14 + Rskip 5 + Volume p + Rtime 10 + Rvolume 20 +End + +Begin Chord + Voice Piano2 + Sequence {C134 Shift .5; C3} {C4 Shift .5} + Rtime 10 + Rvolume 10 + Octave 5 + Volume mp + Voicing Mode=Optimal +End + +Begin Chord-Organ + Voice Organ1 + Sequence {C2; C24 Shift .5} {C1234; C1 Shift .5} + DupRoot -2 + Articulate 60 + Rtime 10 + Rvolume 10 + Octave 5 + Volume pp +End + +Begin Bass-Guitar + Voice CleanGuitar + Sequence { B13 * 4 } + Rtime 10 + RVolume 10 + Rskip 20 + Accent 1 20 3 20 + Volume mf + Octave 4 +End + +Begin Bass + Voice FingeredBass + Octave 3 + Articulate 80 + Volume mf + Rtime 10 + Rvolume 10 + Sequence {1 4 1 90; 2.5 8 1 90; 3 8 3 90; 4 4 1 90 } z +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Articulate 80 + Volume mf + Rtime 10 + Rvolume 10 + Sequence z {2.5 8 90 ; 3 8 90; 3.5 8 90; 4 8 90; 4.5 8 90 } +End + +DefGroove R&B Basic Rythmn and Blues. + + +/// Sustained, take out rhythmic organ + +Begin Chord-Organ + Sequence L2 + Volume p + DupRoot 0 + Articulate 100 + Unify On + Voicing Mode=Optimal +End + +DefGroove R&BSus Change rhythmic organ to sustained chords. + + +///////////////////////////////////////////// +/// Intro + +Groove R&B + +SeqSize 4 // the main groove is 2 bars + +Begin Alltracks + Rskip 0 + Rtime 0 +End + +Drum-Kick Sequence * * * D1 +Drum-Clap Sequence * * * D1 +Drum-Snare Sequence * * * z + +Begin Drum-Snare2 + Tone $_Drum-Snare_Tone + Volume $_Drum-Snare_Volume + Mallet Rate=32 Decay=-3 + Rvolume 3 + Sequence z z z {1 1 100} +End + +Chord Sequence * * * C1 +Chord-Organ Sequence * * * C1 + +Bass-Guitar Sequence - +Bass Sequence * B13 * B1 +Walk Sequence - + +DefGroove R&BIntro A bit laid-back, 4 bar intro. + +///////////////////////////////////////////// +/// Ending + +Groove R&B + +Drum-Kick Sequence D13 D13 +Drum-Clap Sequence D24 D2 +Drum-Snare Sequence D24 D2 +Drum-Ride Sequence D1234 D1 +Drum-Tam Sequence D14 D1 + +Chord Sequence C134 {1 2 90 } +Chord-Organ Sequence C24 C1 +Bass-Guitar Sequence B1234 B11 +Bass Sequence B13 B11 +Walk Sequence - + + +DefGroove R&BEnd Ending for R&B. + + + + diff --git a/mma/lib/stdlib/rhumba.mma b/mma/lib/stdlib/rhumba.mma new file mode 100644 index 0000000..b243bdf --- /dev/null +++ b/mma/lib/stdlib/rhumba.mma @@ -0,0 +1,367 @@ + +// rhumba + +Begin Doc + + I created this for the Cole Porter tune "I've Got You + Under My Skin.". Traditional Latin rhythms generally have + a full percussion with lots of off-beats, but don't overdo it. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +///////////////////////////////////////// +/////// Instrument patterns + + +Begin Drum Define + D3+ D3 Shift .5 + D1+3+ D13 Shift .5 + D2+4+ D24 Shift .5 + D12+4 D14 ; D2 Shift .5 + D13+ D1 ; D3+ + D3+4 D3+ ; D4 + D1+2+3+ D1+3+; D3+ +End + +Begin Walk Define + W12+4 1 4 100 ; 2.5 4 100 ; 4 4 90 + W12+4+ W12+4 ; 4.5 8 77 +End + +Begin Bass Define + B12+4 1 4 1 90 ; 2.5 4 5 70 ; 4 4 1 90 +End + +Begin Chord Define + C30 1 81 70 ; 1+81 82 70 ; 2+81 82 70 +End + +///////////////////////////////// +///////// Rhumba + + +//////// Lots of drum stuff going on, but on +//////// my synth it doesn't sound too busy. + +SeqSize 4 + +Begin Drum-Claves + Sequence D12+4 D13+ D1+3+ D1+2+3+ + Tone Claves + SeqRnd On + Rvolume 10 + Rtime 2 + Volume ff +End + +Begin Drum-Maraca + Sequence D8 / / D1234 + Tone Maracas + SeqRnd On + Rvolume 5 + Rtime 2 +End + +Begin Drum-LoConga + Sequence D4 D3+4 + Tone LowConga + Rvolume 5 + Rtime 2 + Volume ff +End + +Begin Drum-HH + Sequence D3 D3+ / z + Tone OpenHighConga OpenHiHat / / + SeqRnd On + Rvolume 5 + Rtime 2 +End + +Begin Drum-MuteConga + Sequence D2 { D1 Shift .5 } + Tone MuteHighConga + Rvolume 5 + Rtime 2 +End + +Begin Drum-Bongo + Sequence D3 D2+4+ + Tone LowBongo HighBongo + Rvolume 5 + Rtime 2 +End + + +Begin Drum-Chh + Sequence D8 + Tone ClosedHiHat + Volume mp + Rvolume 5 + Rtime 2 +End + +/////// Main chording is the piano ... this is for all the variations. + + +Begin Chord + Sequence C134 C123 { C1; C34 Shift .5 } { C2; C34 Shift .5 } + Accent 1 20 3 10 + Voicing Mode=Optimal + SeqRnd On + Rvolume 10 + Voice Piano2 + Articulate 93 + Octave 5 + Volume mp +End + + +//////// The walk and bass alternate bars. Gives a nice feeling. + +Begin Bass + Voice FretLessBass + Sequence B12+4 z B12+4 z + Articulate 60 + Accent 1 20 + Rvolume 15 + Rtime 4 + Octave 3 + Volume mp +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Rvolume $_Bass_Rvolume + Rtime $_Bass_Rtime + Accent $_Bass_Accent + Articulate 55 + Volume $_Bass_Volume + Sequence z W12+4 z W12+4+ +End + + +DefGroove Rhumba Nice, smooth easy listening. + +//////// Add sustained strings + +/// The chord pattern just plays the root and 5th. The 2 defs +/// vary the volume of the root/5th. + +Begin Chord-sus + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Voice Strings + Articulate 110 + Unify On + Volume p + Octave 5 +End + +DefGroove RhumbaSus Sustained strings make it smoother. + +//////////////////////////// +// RhumbaTriple +// Change the piano in rhumba to 2 sets of triplets +/////////////////////////// + +Groove Rhumba +SeqSize 1 + +Begin Chord + Sequence { 1 1 70 * 6 } // Piano set to 1/4 triplets + Accent 1 40 3 40 // Accent beats 1/3 +End + +Walk Sequence - // Change walking bass +Bass Sequence B11 // to a 1/3 + + +DefGroove RhumbaTriple Rhumba with quarter note triplet chords. \ + Good for emphasizing a single bar in a piece. \ + Not great for more than one bar in a row. + +Chord-sus Groove RhumbaSus +DefGroove RhumbaTripleSus Triplets and sustained strings. + + +//// 1/4 triple on beats 1/2, regular stuff on beats 3/4 + +Groove RhumbaTriple + +Begin Chord + Sequence { C30; C34; C3 Shift .5 } + Accent 1 10 3 20 +End + + +DefGroove RhumbaTriple12 Variation of RhumbaTriple with triplets on \ + beats 1/2 and quarters on 3/4. + +Chord-sus Groove RhumbaSus +DefGroove RhumbaTriple12Sus Triplet on 1/2 and strings. + + +Begin Chord + Sequence { C12; C1 Shift .5; C30 Shift 2 } + Accent 1 20 3 10 +End + +DefGroove RhumbaTriple34 Variation of RhumbaTriple with triplets on \ + beats 3/4 and quarters on 1/2. + + +Chord-sus Groove RhumbaSus +DefGroove RhumbaTriple34Sus Triplet on 3/4 and strings. + + + +//////////////////////////// +// Rhumba1 + + +Groove Rhumba + +Begin Arpeggio + Sequence A4 A8 A4 A8 + Invert 0 0 1 1 + SeqRnd On + Voice PizzicatoString + Articulate 100 + Octave 5 + Volume mp + Rvolume 10 + Rskip 30 +End + +DefGroove Rhumba1 Adds pizzicato arpeggios. + +Chord-sus Groove RhumbaSus +DefGroove Rhumba1Sus Apreggios and sustained strings. + + + +////////////////////////////// +// Rhumba2 + +Groove Rhumba + +Begin Chord-Mallet + Voice Marimba + Sequence {C1234; C1234 Shift .2; C1234 Shift .4; C1234 Shift .6; C1234 Shift .8} \ + {C24; C24 Shift .2; C24 Shift .4 ; C24 Shift .6; C24 Shift .8} + Articulate 60 + Voicing Mode=Optimal + Octave 5 + DupRoot -1 + Accent 1 40 + Volume p +End + +DefGroove Rhumba2 Add articulated Marimbas. + +Chord-sus Groove RhumbaSus +DefGroove Rhumba2Sus Marimbas and sustained strings. + + +////////////////////////////////////// +//////// Rhumba3 + +Groove Rhumba + +Begin Chord-Guitar + Voice JazzGuitar + Sequence C1234 C134 C24 C13 + SeqRnd On + Voicing Mode=Optimal + Articulate 99 + Octave 6 + Accent 1 20 3 20 + Volume pp +End + +DefGroove Rhumba3 Add jazz guitar chords. + +Chord-sus Groove RhumbaSus +DefGroove Rhumba3Sus Guitar chords and sustained strings. + +/////////////////////////// +// Intro + +Groove Rhumba + +AllTracks SeqRnd Off + +Drum-Claves Sequence D12+4 D13+ D1+3+ D1234 +Drum-Maraca Sequence D8 / / D13 +Drum-LoConga Sequence D4 D3+4 D2 D1 +Drum-HH Sequence D3 D3+ / z +Drum-MuteConga Sequence D2 { D1 Shift .5 } D2 z +Drum-Bongo Sequence D3 D2+4+ D3 D3 +Drum-Chh Sequence D8 / / D1234 + +Chord Sequence C134 / / {1 1 8 0} +Bass Sequence B12+4 / / {1 2 1 90} +Walk Sequence - + +DefGroove RhumbaIntro 4 bar intro to go with standard Rhumba. + + +/////////////////////////// +// Endings + +// Just add a string run to the basic rhumba + +Groove Rhumba + +Chord-sus Sequence - + +Begin Scale + Sequence Scale8 Scale4 Scale2 Scale + Voice SlowStrings + Articulate 100 + Volume mf + Octave 6 + Direction Up + Range 5 +End + + +DefGroove RhumbaEnd Ending with string scales. The scales use \ + 8th, quarter, half and finally a whole note. \ + Setting the seq to different values for each \ + bar of the ending will create proper effects. + + + +/// Easy 2 bar ending + +Groove Rhumba +Seqsize 2 + +Alltracks SeqRnd Off + +Drum-Claves Sequence D8 D12 +Drum-Maraca Sequence D1 +Drum-LoConga Sequence D1234 D12 +Drum-HH Sequence D3+ D1 +Drum-MuteConga Sequence D2 +Drum-Bongo Sequence D3 D2 +Drum-Chh Sequence D8 D12 +Chord Sequence C134 C12 +Bass Sequence B12+4 B1 +Walk Sequence - + +DefGroove RhumbaEnd1 Simpler, 2 bar, ending. + diff --git a/mma/lib/stdlib/rock-128.mma b/mma/lib/stdlib/rock-128.mma new file mode 100644 index 0000000..e62c7b3 --- /dev/null +++ b/mma/lib/stdlib/rock-128.mma @@ -0,0 +1,127 @@ + +// rock128 + +Begin Doc + + Doo-Wop rock from the 50s. These songs are mostly written + in 12/8 time, but this file assumes 4/4. So, when figuring + tempo use a dotted quarter for the beat count. We use this + for the song "Sea Of Love". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +/////// Basic groove + +SeqSize 4 +Begin Bass + Sequence B11 + Octave 3 + Voice FretlessBass + Articulate 70 + Volume f +End + +Begin Chord + Sequence {C1234 * 3 } / / C1234 + Voice Piano2 + Voicing Mode=Optimal + Accent 1 90 2 10 3 90 4 10 + Articulate 70 + Volume pp + Octave 5 + Rtime 4 + Rvolume 10 +End + +Begin Drum-Kick + Tone KickDrum1 + Sequence D1234 + Volume mp + Rvolume 5 + Rtime 5 +End + +Begin Drum-Clap + Tone HandClap + Sequence D24 + Volume p + Rvolume 5 + Rtime 5 +End + +Begin Drum-HH + Tone OpenHiHat + Sequence D1234 {D1234 * 3} + Volume pp + Accent 1 90 2 10 3 90 4 10 + Rvolume 5 + Rtime 5 +End + + +DefGroove Rock128 Basic 12/8 beat with the piano \ + doing most of the work. + + +//////// Add in sustained strings + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 1 90 0 * 2 } + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume mp + Octave 5 +End + +Begin Chord-SusHarmony + Voice ChoirAAHs + Voicing Mode=Optimal + Sequence { 1 1 0 0 70 * 2 } + Volume p + Octave 5 + Articulate 100 + Unify On +End + + +DefGroove Rock128Sus Add in sustained strings and voices. + +/////////////////////////////// +// Intro + +Groove Rock128 + +Bass Sequence B11 / / { 1 4 1 90; 2 4 3 90; 3 2 1 90 } +Chord Sequence {C1234 * 3 } / / L1 +Drum-Kick Sequence D1234 / / D12 +Drum-Clap Sequence D1234 / / D1 +Drum-HH Sequence D1234 {D1234 * 3} D1234 D12 + +DefGroove Rock128Intro A 4 bar introduction. + + +/////////////////////////////// +// Ending + + +Groove Rock128 +Seqsize 2 + +Bass Sequence B11 { 1 2 1 90 } +Chord Sequence {C1234 * 3 } { 1 2 90 } +Drum-Kick Sequence D1234 D1 +Drum-Clap Sequence D1234 D1 +Drum-HH Sequence {D1234 * 3} D1 + +DefGroove Rock128End Simple ending. + diff --git a/mma/lib/stdlib/rockballad.mma b/mma/lib/stdlib/rockballad.mma new file mode 100644 index 0000000..4d83b88 --- /dev/null +++ b/mma/lib/stdlib/rockballad.mma @@ -0,0 +1,154 @@ + +// rockballad + +Begin Doc + + Written for slowish/doo-wop things like "You Belong To Me". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////////////////// +////// Additional patterns + + +///////////////////////////////////////////////// +////// RockBallad + +SeqSize 4 + +Begin Drum + Sequence {D1234 * 3 } + Tone ClosedHiHat + Volume mf + Rskip 1 + Rvolume 10 + End + +Begin Drum-Snare + Sequence D1234 + Tone SnareDrum1 + Volume p + Rvolume 20 +End + +Begin Drum-Kick + Sequence D1 + Tone KickDrum1 + Volume mp + Rvolume 20 +End + +Begin Bass + Voice FretlessBass + Sequence B13 / / z + Octave 3 + Volume mf + Articulate 80 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Volume mf + Articulate 80 +End + +Begin Chord + Sequence C1234 / / { C1234 * 3 } + Accent 1 20 3 20 + Voice JazzGuitar + Volume mp + Octave 5 + Articulate 80 +End + +DefGroove RockBallad Basic beat with triplet Hi-Hats. + +////////////////////////// +// Guitar Fill + +Groove RockBallad + +Begin Arpeggio + Voice JazzGuitar + Sequence A4 / / { A4 * 3 } + RSkip 5 + Octave 4 / / 5 + Range 2 + Harmony Open / / None + Direction Up + Articulate 105 +End + + +DefGroove RockBalladFill Add guitar arpeggios. + +///////////////////////////// +// Adds some (sustained) voices + +Groove RockBallad + +Begin Chord-Sus + Voice ChoirAahs + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume p + Octave 4 + Articulate 100 + Unify On +End + +DefGroove RockBalladVoice Adds some cheese with choir voices. + +///////////////////////////// +//// Intro + +Groove RockBallad + +Begin Drum + Sequence {D1234 * 3} / / {1 1 55} + Tone ClosedHiHat / / CrashCymbal1 +End + +Drum-Snare Sequence D1234 / / D1 +Drum-Kick Sequence D1 +Bass Sequence B13 / / z +Walk Sequence z z z W1234 + +Begin Chord + Sequence { C1234 * 3 } / C1234 L1 + Articulate 80 / / 105 +End + + +DefGroove RockBalladIntro 4 bar intro. + +/////////////////////////////////////////////// +/// 4 bar ending + + +Groove RockBallad + +Chord Sequence C1234 +Bass Sequence B13 +Walk SeqClear + +Begin Scale + Sequence Scale16 Scale8 Scale4 Scale2 + Volume mp + Voice TenorSax + Articulate 99 +End + +DefGroove RockBalladEnd Ending with a scaling tenor sax. Use Seq 1 \ + to 4 for 16ths, 8th, 4th or 1/2 note runs. + + diff --git a/mma/lib/stdlib/samba.mma b/mma/lib/stdlib/samba.mma new file mode 100644 index 0000000..c9059c4 --- /dev/null +++ b/mma/lib/stdlib/samba.mma @@ -0,0 +1,222 @@ + +// rhumba + +Begin Doc + + First try at a samba. Note: This is really in 2/2 time + but we notate with 4 chords/bar ... so double the tempo! + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + +///////////////////////////////////////// +/////// Instrument patterns + + + +///////////////////////////////// +///////// Samba + + +Seqsize 4 + + +Begin Drum-Kick + Tone KickDrum2 + Sequence D13 + Volume fff + Rtime 4 + Rvolume 10 +End + +Begin Drum-Side + Tone SideKick + Sequence {D13; D34 Shift .5} {D1 shift .5; D34} + Volume mf + Rvolume 10 + Rskip 5 + RTime 5 +End + +Begin Drum-PHH + Tone PedalHiHat + Sequence z D4 + Rskip 10 + Volume fff + Rtime 5 + RVolume 10 +End + +Begin Drum-OHH + Tone OpenHiHat + Sequence z D1 + Volume f + Rtime 5 + Rvolume 10 + Rskip 5 +End + +Begin Drum-Ride + Tone RideCymbal1 + Sequence D24 + Rtime 10 + Rskip 5 + Rvolume 10 +End + +Begin Drum-Shaker + Tone Shaker + Sequence D8 + Rtime 5 + Rskip 10 + Rvolume 10 +End + +Begin Bass + Voice FretlessBass + Sequence {1 8 1 90; 2.5 16 1 80; 3 4 5- 90; 4 4 1 90} \ + {2.5 16 1 80; 3 8 5- 90; 4 8 5- 9 } \ + {1 4 1 90; 3 4 5 90; 4.5 8 1+ 80} \ + {1 4 5 90; 3 8 1 90; 4 8 1 90} + Octave 3 + Rvolume 20 + Rtime 3 + Rskip 4 + Articulate 75 +End + +Begin Chord-Piano + Voice Piano1 + Voicing Mode=Optimal + Volume mf + Octave 5 + Articulate 75 + Rskip 10 + Rvolume 10 + Rtime 3 + Sequence { 1 8 90; 2.5 8 90; 3 4 90; 4 4 90} \ + { 1.5 8 90; 3 4 90; 4 4 90 } \ + { 1 4. 90; 2.5 8 90; 3.5 8 90; 4.5 8 90} \ + { 1.5 8 90; 2 4 90; 4 4 90} +End + +Begin Chord-Guitar + Voice JazzGuitar + Voicing Mode=Optimal + Volume mf + Octave 5 + Rvolume 10 + Rtime 3 + Strum 5 + Articulate 90 + Strum 5 + Sequence { 1 1 90 } \ + { 1 2 90; 3 8 90; 4 4 90 } \ + { 1 4 90 } \ + { 2 4 90 ; 4 4 90} + +End + +Defgroove Samba Our basic dance beat. + +Begin Drum-Whistle + Tone ShortHiWhistle + Sequence D1234 + Volume f + Rskip 30 + Rvolume 10 +End + +DefGroove SambaFill Adds a whistle to the sandard beat. + +Groove Samba + +Chord-Guitar Sequence - + +Begin Arpeggio + Voice PizzicatoString + Volume mf + Articulate 120 + Rskip 50 + Rvolume 20 + Rtime 5 + Octave 6 + Range 2 + Direction Random + Sequence A8 +End + +DefGroove SambaPlus Adds pizzicato strings + +//////////////////////////////////////////// +/// Sustained versions + +Groove Samba + +Begin Chord-Sus + Voice Bandoneon + Sequence { 1 1 70 40 50 0 * 2 } { 1 1 50 40 70 0 * 2 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Articulate 100 + Unify On + Volume mf + Octave 5 +End + +DefGroove SambaSus Add sustained bandoneon. + +Groove SambaFill +Chord-Sus Groove SambaSus +DefGroove SambaSusFill Sustained bandoneon and whistle. + +Groove SambaPlus +Chord-Sus Groove SambaSus +DefGroove SambaSusPlus Sustained bandoneon and arpeggios. + + +////////////////////////////////// +/// Intros + + +Groove Samba + +Drum-PHH Sequence D1 +Drum-OHH Sequence D1 +Drum-Shaker Sequence D8 / D16 {D12; D12 Shift .5} + +Bass Sequence B13 / / {1 4 5 100; 2 4 3 100; 3 4 3 110; 4 4 2 120 } +Chord-Piano Sequence {C1234; C24 Shift .5} / / L1 +Chord-Guitar Sequence C13 / / L1 + +DefGroove SambaIntro 4 bar introduction. + + +////////////////////////////////////// +///// Ending + +Groove Samba +Alltracks SeqRnd Off +Drum-OHH Sequence - + +Begin Drum-Whistle + Groove SambaFill + Rskip 0 + Sequence D124 D13 D13 D1234 +End + +Drum-Shaker Sequence {D123; D12 Shift .5} +Bass Sequence B1234 / / {1 2 1 90} +Chord-Piano Sequence {C1234; C24 Shift .5} / / L1 +Chord-Guitar Sequence C13 + + +Defgroove SambaEnd 4 bar ending. diff --git a/mma/lib/stdlib/ska.mma b/mma/lib/stdlib/ska.mma new file mode 100644 index 0000000..2fbccec --- /dev/null +++ b/mma/lib/stdlib/ska.mma @@ -0,0 +1,195 @@ + +// ska + +Begin Doc + + This was written for the Beatle's song "Ob-La-Di, Ob-La-Da". + You will probably want double the tempo when using this. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +/////////////////////////// +// Additional patterns + +Begin Bass Define + B134 B13 ; 4 8 3 120 + B1135 1 4 1 90 ; 2 4 1 90 ; 3 4 1 90 ; 4 4 5 90 + +End + +///////////////// +// Ska + +SeqSize 2 + +Begin Drum + Volume mf + Rvolume 20 + Rtime 10 + Rskip 10 +End + +Begin Drum-Kick + Copy Drum + Tone KickDrum1 + Sequence D1 { D1 ; 4.5 0 50 } + Volume mp +End + +Begin Drum-Snare + Copy Drum + Tone Snaredrum2 + Sequence D24 +End + +Begin Drum-hh + Copy Drum + Tone ClosedHiHat + Sequence { D1234 shift .75 } +End + +Begin Drum-Cym + Copy Drum + Tone ChineseCymbal + Sequence D1 + Rskip 50 +End + +Begin Drum-Cabasa + Copy Drum + Tone Cabasa + Sequence { D24; D24 shift -.25 } +End + + +Begin Drum-Maraca + Copy Drum + Tone Maracas + Sequence { D24 shift .25 } +End + +Begin Drum-Shake + Copy Drum + Tone Shaker + Sequence { D1234 Shift .75 } + Volume pp +End + +Begin Bass + Sequence B13 B134 + Articulate 90 + Voice AcousticBass + Rtime 10 + Rvolume 10 + Octave 3 +End + +Begin Chord + Voice Piano1 + Sequence C124 C24 + Rvolume 20 + Articulate 80 +End + +Begin Chord-Sax + Voice AltoSax + Sequence C24 + Rskip 10 + Rtime 10 + Rvolume 20 + Articulate 70 +End + +DefGroove Ska Good if you're from Trinidad. + +///////////////////////////////////// +/// Ska1 - simple variation + +Groove Ska + +// change piano to steels + +Begin Chord + Voice Steeldrums + Octave 5 + Strum 10 + Articulate 99 +End + +// Add in 1/8 note claves + +Begin Drum-Clave + Copy Drum + Tone Claves + Sequence { D1234 * 2 } + Rskip 12 + Volume ff +End + +DefGroove Ska1 Change Piano to SteelDrums and add \ + in some eight note Claves. + +///////////////////////////////// +//// Add sustained strings to SKA + +Groove Ska + +Begin Chord-Sus + Voice SynthVox + Sequence { 1 1 90 0 90 0 * 4 } + Octave 5 + Voicing Mode=Optimal + Articulate 100 + Unify On +End + +DefGroove SkaSus Adds sustained voices to Ska. + +Groove Ska1 +Chord-Sus Groove SkaSus +DefGroove Ska1Sus Adds sustained voices to Ska1. + + +///////////////////////////////////////////// +/// Handclap + +Groove Ska + +Begin Drum-Clap + Tone HandClap + Sequence { D1234 } + Rskip 20 + Volume ffff +End + +DefGroove SkaClap Adds a rather loud handclap to the basic beat. \ + Good for repeatendings, etc. + + +//////////////////////////////// +/// Ending + +Groove Ska + +Begin Bass + Sequence B1135 + Articulate 60 +End + +Begin Chord-Sax + Sequence C1234 +End + +Begin Chord + Sequence C1234 +End + +DefGroove SkaEnd A funky ending. Really does need some work. + diff --git a/mma/lib/stdlib/slowblues.mma b/mma/lib/stdlib/slowblues.mma new file mode 100644 index 0000000..f95ad9a --- /dev/null +++ b/mma/lib/stdlib/slowblues.mma @@ -0,0 +1,236 @@ + +// slowblues + + +Begin Doc + + A variation of "blues.mma" for slower tempos. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////// +/// Pattern definitions + +Begin Walk Define + W1+34 1 4 80; 2.5 8 70; 3 4 80; 4 4 80 +End + + +/// SlowBlues + +SeqSize 4 + +Begin Chord + Voice JazzGuitar + Sequence C1234 {C124; 3.5 8 70 } C1234 {C13 ; 3.5 8 70; 4 4 80} + Voicing Mode=Optimal + RVolume 10 + Volume mp + Octave 5 + Strum 5 0 5 0 + Articulate 80 + Accent 1 20 3 10 +End + +Begin Bass + Voice AcousticBass + Sequence B13 B11 B13 z + Octave 3 + Volume mp + Articulate 70 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1+34 + Volume mp + Articulate 70 +End + +Begin Drum-OHH + Sequence D8 + Rvolume 5 + RSKip 30 + Tone ClosedHiHat + Volume pp +End + +Begin Drum-Side + Tone SideKick + Sequence D1 + Volume pp + Rtime 5 + Rvolume 10 +End + +Begin Drum-PHH + Sequence D24 + Tone PedalHiHat + Volume mp +End + +DefGroove SlowBlues Simple guitar chords. + +////////////// A fill groove + +Groove SlowBlues + +Walk Sequence - +Begin Bass + Sequence B11 + Volume f + Articulate 100 +End + +Begin Chord + Sequence {1 1 90} + Volume p +End + +Begin Arpeggio + Voice JazzGuitar + Sequence { 1 1 90 * 4; 3.666 2 90 * 4 } + RVolume 20 + Volume p + Octave 5 + Harmony Open + Articulate 100 + Rskip 10 +End + + +DefGroove SlowBluesFill Full chord plus argeggio for fills. +Arpeggio Sequence A8 +DefGroove SlowBluesFill1 Same as fill1 but with straight 8ths. + +Groove SlowBluesFill +Arpeggio Sequence - + +Begin Scale + Voice JazzGuitar + Sequence { 1 1 90 * 4; 3.666 2 90 * 4 } + Direction Up + RVolume 20 + Volume p + Octave 5 + Articulate 100 + Rskip 10 +End + +Bass Sequence - +Begin Walk + Sequence W1234 + Volume f + Articulate 90 +End + +DefGroove SlowBluesFill2 Full chord plus scale for fills. +Scale Sequence Scale8 +DefGroove SlowBluesFill3 Same as fill2 but with straight 8ths. + +////////////// Sustain + +Groove SlowBlues + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume ppp + Voice ChoirAahs + Octave 5 + Articulate 100 + Unify On +End + + +DefGroove SlowBluesSus Our simple blues with the choir added. + + +//// 4 to the bar walking bassline + +Groove SlowBlues + +Bass Sequence - + +Begin Walk + Sequence W1234 / / W1+34 + Articulate 65 +End + +DefGroove SlowBluesWalk4 Same as SlowBlues but with \ + a strong quarter note walking bass. + +Chord-Sus Groove SlowBluesSus + +DefGroove SlowBluesWalk4Sus Choir added to Walk4. + +/////// 8 to bar walk + +Groove SlowBlues + +Begin Chord + Articulate 80 + Volume p +End + +Begin Walk + Sequence W8 / / W1234 + Articulate 60 + Volume mp +End + +DefGroove SlowBluesWalk8 Same as SlowBlues but with a strong eight \ + note walking bass. This works nicely with \ + SlowBluesWalk4 in an A-A-B-A selection with \ + the B section using this groove and the A \ + using SlowBLuesWalk4. + +Chord-Sus Groove SlowBLuesWalk4Sus + +DefGroove SlowBluesWalk8Sus Choir added to Walk8. + +//////////////////////// +/// Intro + +Groove SlowBlues + +Chord Sequence * * * L1 +Bass Sequence * * * {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} +Walk Sequence - +Drum-OHH Sequence * * * D1234 + +DefGroove SlowBluesIntro Standard 4 bar introduction with walking bass on 4th bar. + +/////////////////////// +/// Ending + + +Groove SlowBlues + +Begin Drum-OHH + Sequence D16 D8 D1234 D13 + RSkip 0 +End + +Drum-PHH Sequence D13 +Chord Sequence C1234 / C13 {1 2 80} +Begin Chord-Sus + Groove SlowBluesSus + Sequence {1 1 80 0 * 2} / / {1 2 70 0} +End +Bass Sequence B11 +Walk Sequence - + +DefGroove SlowBluesEnd Quite a dull ending. The High Hats play 16 \ + notes on the first bar, 8 on the second, \ + 4 on the third and 2 on the fourth. Set the \ + SEQ point appropiately for your ending. + diff --git a/mma/lib/stdlib/slowbolero.mma b/mma/lib/stdlib/slowbolero.mma new file mode 100644 index 0000000..cec248b --- /dev/null +++ b/mma/lib/stdlib/slowbolero.mma @@ -0,0 +1,170 @@ + +// slowbolero + +Begin Doc + + This bolero is different from the Ravel-ish sounds of ``bolero.mma''. + Sounds nice with slower songs. For an example see the exemplar + ``Abrazame Asi''. This file is largely based on ``Latin Rhythms: Mystery Unraveled'' + by Victor Lopez. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +SeqSize 4 + +Begin Drum-Claves + Tone Claves + Volume mf + Rvolume 10 + Rtime 2 + Sequence Clave2 Clave3 +End + +Begin Drum-Maraca + Tone Maracas + Volume mp + Rvolume 10 + Rtime 2 + Sequence {D8; D1 Shift .75} {D8; D1 Shift .5; D1 Shift .666; D1 Shift .832} +End + +Begin Drum-HConga + Tone OpenHighConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {1 0 90; 1.5 0 90; 2.5 0 90; 4 0 90} {1 0 90; 1.5 0 90; 2.5 0 90; 4 0 90} +End + +Begin Drum-LConga + Tone LowConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {2 0 90; 3 0 90; 3.5 0 90; 4.5 0 90} {2 0 90; 3 0 90; 3.5 0 90; 4.5 0 90} +End + +Begin Drum-OHH + Tone OpenHiHat + Volume pp + Rvolume 10 + Rtime 2 + Rskip 5 + Sequence D8 +End + +Begin Drum-SQ + Tone SquareClick + Volume mf + Rvolume 10 + Rtime 2 + Sequence D24 +End + +Begin Drum-Snare + Tone SnareDrum1 + Volume mp + Rvolume 10 + Rtime 2 + Sequence {D13; D24 Shift .5} +End + +Begin Bass + Voice FingeredBass + Volume f + Octave 3 + Articulate 80 + Sequence {1 1 1 90 * 2} {1 2 1 90; 3 4 1+ 9; 4 4 5 90} +End + +Begin Chord + Voice Piano1 + Voicing Mode=Optimal + Articulate 90 + Volume m + Octave 6 + DupRoot -1 + Sequence L2 L1 L2 {1 2 90; C3 Shift .5} +End + +Begin Chord-Guitar + Voice SteelGuitar + Articulate 120 + Voicing Mode=Optimal + Octave 6 + Volume p + Sequence C8 C1234 C8 {C12; C3 Shift .5} +End + +DefGroove SlowBolero Easy going Bolero for ballads. + +//// Sustained + + +Groove SlowBolero + +Alltracks Volume -30 +Begin Bass + Volume +40 + Articulate 70 +End + +Begin Chord-Sus + Sequence C1234 + Limit 3 + Octave 5 + Voice VoiceOohs + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume mp +End + +DefGroove SlowBoleroSus Add sustained voices. + +////// Intro + +Groove SlowBolero + +//Drum-Claves Sequence Clave2 Clave3 +Drum-Maraca Sequence * * * D8 +Drum-HConga Sequence * * * D12 +Drum-LConga Sequence * * * D1234 +Begin Drum-OHH + Sequence * D16 * D16 + Rskip 0 + Cresc mp 4 +End +Drum-SQ Sequence * * * D2 +Drum-Snare Sequence * * * D13 + +Bass Sequence * * * {1 4 1 90; 2 4 5 90; 3 4 3 90; 4 4 1 90} +Chord Sequence * * C1234 L2 + +DefGroove SlowBoleroIntro A simple introduction. + +////// Ending + +Groove SlowBolero +Seqsize 2 + +Drum-Claves Sequence * z +Drum-Maraca Sequence * z +Drum-HConga Sequence * D1 +Drum-LConga Sequence D1234 D12 +Drum-OHH Sequence D16 {D12; D12 Shift .5} +Drum-SQ Sequence * D2 +Drum-Snare Sequence * D13 + +Bass Sequence * {1 1 1 90} +Chord Sequence C1234 L2 + +DefGroove SlowBoleroEnd 2 bar ending. + diff --git a/mma/lib/stdlib/slowcountry.mma b/mma/lib/stdlib/slowcountry.mma new file mode 100644 index 0000000..6c63cba --- /dev/null +++ b/mma/lib/stdlib/slowcountry.mma @@ -0,0 +1,198 @@ + +// slowcountry + + +Begin Doc + + For slow, mellow country tunes. I use this for the Patsy Cline + hit ``Crazy''. + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + +Begin Chord + Define C13'4 1 2 90; 3 4 90 0; 3.5 8. 0 0 90 0; 4 4 90 + +End + +/////////////////////////// +/// SlowCountry + + +SeqSize 4 + + +// For the chord I thought I could just use patterns with +// only the root or 5th being played (like 1 4 0 0 90 0), +// but that doesn't work if you are using voicing ... well, +// note quite. The notes will be the 3rd, 5th, etc. but the +// octaves will get shifted. So, easy to use 2 patterns, +// one with full chords and a bass with the same voice/track +// for the single note fills. + +Begin Chord + Voice JazzGuitar + Define CL4 1 2 80 60 ; 4 4 80 60 + Sequence CL4 L2 CL4 L2 + Volume mf + Voicing Mode=Optimal + Articulate 95 + Strum 15 + Accent 1 10 3 5 + RVolume 10 + Octave 4 +End + +Begin Bass-Fill + Voice $_Chord_Voice + Articulate $_Chord_Articulate + Octave $_Chord_Octave + Define F1 3 4. 1 90; 3.5 4 5 90 + Define F2 4.5 8 1 90 + Sequence F1 F2 F1 z + Volume mp +End + +// Toggle between bass and walk for the bass line. + +Begin Bass + Voice FingeredBass + Sequence B13 / B11 z + Octave 3 + Articulate 90 + Volume mp +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W1234 + Articulate $_Bass_Articulate + Volume mp +End + +Begin Drum-Tom + Sequence D13 + Rtime 5 + Rvolume 5 + Tone LowTom1 + Volume mp +End + +Begin Drum-PHH + Sequence D24 + Tone PedalHiHat + Rtime 5 + Rvolume 10 + Volume mp +End + +DefGroove SlowCountry Simple nylon guitar in 2. + + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Volume p + Voice TremoloStrings + Octave 5 + Articulate 100 + Unify On +End + +DefGroove SlowCountrySus Adds a sustained strings (2 part) to SlowCountry. + +Groove SlowCountry + +Begin Arpeggio + Voice Piano2 + Sequence A4 / / A8 + RVolume 20 + Volume mp + Octave 6 + Harmony Open + Direction Both Random Both Down + Articulate 90 + Rskip 5 +End + +DefGroove SlowCountryFill Adds guitar apreggio. Quarters on \ + bar 1,2,3 and eights on bar 4. + +/////////////////////// +// Same as above with with constant walking bass line + +Groove SlowCountry + +Begin Walk + Sequence W1234 + Articulate 70 + Volume mf +End + +Bass SeqClear + +DefGroove SlowCountryWalk The SlowCountry Groove with a full walking \ + bass line. The bass volume has been increased \ + as well. + +Chord-Sus Groove SlowCountrySus + +DefGroove SlowCountryWalkSus SlowCountry with a walking bass line and \ + a sustained string. + + +Groove SlowCountry +Arpeggio Groove SlowCountryFill +DefGroove SlowCountryWalkFill Walking bass fill. + +//////////////////////////////// +/// Intros + +Groove SlowCountry + +Begin Alltracks + SeqRnd Off + Rskip 0 +End + +Chord Sequence L2 / / L1 +Bass Sequence B13 / / {1 2. 1 90} +Walk Sequence - +Drum-Tom Sequence D13 / / D1 +Drum-PHH Sequence D24 / / D1 + +DefGroove SlowCountryIntro 4 bar intro + +/////////////////////////////////////////////// +// Endings + + +SeqClear +Groove SlowCountry +SeqSize 2 + +Begin Alltracks + SeqRnd Off + Rskip 0 + Rtime 0 +End + +Drum-Tom Sequence D1234 D1 +Drum-PHH Sequence D1234 D1 + +Chord Sequence L2 L1 + +Walk Sequence W1234 z +Bass Sequence z {1 1 1 90} + +DefGroove SlowCountryEnd Simple ending. + + + diff --git a/mma/lib/stdlib/slowjazz.mma b/mma/lib/stdlib/slowjazz.mma new file mode 100644 index 0000000..244ee0a --- /dev/null +++ b/mma/lib/stdlib/slowjazz.mma @@ -0,0 +1,315 @@ + +// slowjazz + + +Begin Doc + + An easy going jazz rhythm in 4. Mostly piano chords, sort of what + you'd expect from a piano-bass-drum trio. I use this for + "As Time Goes By". The SlowJazz2 variations bring in a nice organ. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +//////////////////////////// +/// Additional patterns + + +/// Sweet open chords... +/// R1 has root & fifth for dotted 1/2 note, plus a push chord at bar end, +/// R2 has root & fifth half notes on 1/3. + +Begin Chord Define + R1 1 2. 70 0 90 0; 3+81 82 70 80 90 + R2 1 1 70 0 90 0 * 2 + R3 1 2 70 0 90 0 ; 3 4 70 0 90 0 + R4 R2 * 2 +End + +Begin Drum Define + Swing8 1+81 0 90; 2+81 0 90; 3+81 0 90; 4+81 0 9 +End + +///// Basic sound + + +Seqsize 4 + +Begin Drum-HH + Tone RideCymbal2 + Sequence {D1234; Swing8} D1234 + Volume pp + Rtime 5 + Rvolume 5 + Rskip 5 + Accent 1 10 3 10 +End + +Begin Drum-Shake + Tone Shaker + Sequence D13 + Rtime 5 + Rvolume 10 + Rskip 10 + Volume p +End + +// Alternate the bass pattern with a 1/3 in bar 1, walk in bar 2 +// 1/1 in bar 3 and a full walk in bar 3. + +Begin Bass + Voice AcousticBass + Volume mp + Articulate 90 + Accent 1 10 + Rtime 10 + Rvolume 5 + Octave 3 + Sequence B13 z B11 z +End + + + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Volume mf + Articulate 90 + Accent 1 10 + Rtime 10 + Rvolume 5 + Sequence z W13 z W1234 + Direction Down +End + +Begin Arpeggio + Voice Piano2 + Articulate 99 + + // The first pattern is 8ths on 2, 2.3, 3 and 4. This is used + // in bars 1, 2 and 3. The 4th bar gets 8./16ths as swing notes. + + Sequence {2 8 90; 2+81 8 90; 3 8 90; 4 8 90} / / Swing8 + Octave 4 + Range 2 + Harmony OpenAbove + Volume mp + Rskip 5 +End + +Begin Chord + Voice Piano2 + Voicing mode=optimal + DupRoot -1 + Articulate 100 90 + Octave 5 + Rvolume 10 + Rtime 6 + Volume mp + Sequence R1 R2 +End + +DefGroove SlowJazz Slow, basic jazz backup track. + +//////// Sustained + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Octave 5 + Articulate 100 + Unify On + Rvolume 5 + Volume pp +End + +DefGroove SlowJazzSus Bring in the orchestra. + + +/// Walking bass version + +Groove SlowJazz +Bass Sequence - +Walk Sequence W1234 + +DefGroove SlowJazzWalk Change bass to walk on 1/2/3/4. + +Chord-Sus Groove SlowJazzSus + +DefGroove SlowJazzWalkSus Sustained version with full walk. + + +//////////////////////////////////////////////////////////////// +//// Duplicate all the grooves leaving out the push chords. ('1' versions) +//// +//// To add some life we set up some randomness in the chords and aprpeggios. + +Groove SlowJazz + +Drum-HH Sequence {D1234; D1234 Shift .5} D1234 + +Begin Chord + Sequence R2 / R3 R4 + SeqRnd On +End + +Begin Arpeggio + Sequence A8 A4 A8 A2 + Range 3 + SeqRnd On + Rskip 20 5 20 0 +End + +DefGroove SlowJazz1 Slow jazz piano with a straight rhythm. + +Groove SlowJazzSus +Chord Groove SlowJazz1 +Arpeggio Groove SlowJazz1 +DefGroove SlowJazz1Sus Add sustained strings to straight slow jazz. + +Groove SlowJazzWalk +Chord Groove SlowJazz1 +Arpeggio Groove SlowJazz1 +DefGroove SlowJazz1Walk Slow, straight piano jazz with walking bass. + +Groove SlowJazzWalkSus +Chord Groove SlowJazz1 +Arpeggio Groove SlowJazz1 +DefGroove SlowJazz1WalkSus Slow, straight walking with strings. + + +/////////////////////////////////// +// Jazz guitar version (straight) + +SeqClear +Seqsize 4 + +Begin Drum-Shake + Tone Shaker + Sequence D1234 + Rtime 5 + Rvolume 10 + Volume mf +End + +Begin Drum-Snare + Tone SnareDrum2 + Sequence D13 + Volume pp + Rtime 5 + Rvolume 5 + Accent 1 10 3 10 +End + +// For the chording we use a jazzguitar. There is a push note defined +// for one of beat 1, 2, 3 or 4. We use seqrnd so that the push is +// always a surprise. + +Begin Chord + Voice JazzGuitar + Sequence R4 / / R2 + Voicing Mode=Optimal + Octave 4 + Volume mp + Articulate 95 + Accent 1 10 3 5 + Rvolume 6 +End + +Begin Chord-Fill + Voice $_Chord_Voice + Octave $_Chord_Octave + Volume $_Chord_Volume + RVolume $_Chord_RVolume + Voicing $_Chord_Voicing + Define P1 1.75 8 0 70 0; 2 4 0 90 0 + Sequence {P1} {P1 Shift 1} { P1 Shift 2 } { P1 Shift 3 } + SeqRnd On +End + +Bass Groove SlowJazz +Walk Groove SlowJazz + +DefGroove SlowJazz2 A pretty straight, guitar strum for slow tunes. + +Chord Volume mp +Drum-Snare Volume pp + +Begin Chord-Organ + Voice Organ3 + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing mode=optimal + Octave 6 + DupRoot -1 + Articulate 100 + Unify On + Rvolume 5 + Volume mf +End + +DefGroove SlowJazz2Sus Straight guitar with sustained Hammond-like organ. + +//////////////////////// +/////////// Intros + + +Groove SlowJazz + +Drum-HH Sequence {D1234; Swing8} / / D1 +Drum-Shake Sequence D13 / / D1 +Bass Sequence B13 z B11 z +Walk Sequence z W13 z {1 4 90; 2 4 90; 3 2 90} + +Begin Arpeggio + Sequence {2 81 90; 2+81 82 90; 3 81 90; 4 81 90} / / z + Range 1 +End +Chord Sequence R1 / / L1 + + +DefGroove SlowJazzIntro A 4 bar introduction. + + +Chord Sequence R2 / / L1 +Arpeggio Sequence {2 8 90; 2.5 8 90; 3 8 90; 4 8 90} / / z + +DefGroove SlowJazz1Intro 4 bar intro without push chords. + + +Groove SlowJazzIntro +Arpeggio Sequence - +Chord Sequence - +Begin Chord-Organ + Groove SlowJazz2Sus + DupRoot 0 + Octave 6 +End + +DefGroove SlowJazz2Intro A 4 bar intro with organ + +/////////////////////// +////// Ending + +Groove SlowJazz + +SeqSize 2 + +Walk Sequence - +Bass Sequence B13 B11 +Drum-HH Sequence D1234 D13 +Arpeggio Sequence A4 A2 +Chord Sequence L2 + +DefGroove SlowJazzEnd An easy, 2 bar ending. + + +Chord Voice Organ3 + +DefGroove SlowJazz2End Substitute organ for Piano. diff --git a/mma/lib/stdlib/softrock.mma b/mma/lib/stdlib/softrock.mma new file mode 100644 index 0000000..fea7daa --- /dev/null +++ b/mma/lib/stdlib/softrock.mma @@ -0,0 +1,173 @@ + +// softrock + +Begin Doc + + Seems to work nicely for relatively fast + (ie. not "slow dance"), older rock tunes. + I use the SoftRock1 for "Blame It On The Bossa Nova". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +////// Additional Patterns + + +Begin Drum Define + D12+34 D134 ; 2.5 0 90 +End + + +Begin Chord Define + C1+34 C134; C2 Shift 2.5 +End + +///////////////////////////////////////////////// +////// SoftRock + +SeqSize 4 + +Begin Drum-Snare + Sequence D12+34 + Tone SnareDrum1 SnareDrum2 + SeqRnd On + Volume p + Rvolume 10 +End + +Begin Drum-HH + Sequence D8 + Tone ClosedHiHat + Volume mf + Rvolume 10 + Rtime 10 +End + +Begin Drum-Tri + Sequence D12 / / z + Tone OpenTriangle + Rskip 50 + Volume pp + Rvolume 10 + RTime 20 +End + +Begin Chord + Sequence C1+34 C13 C1+34 C134 + Voicing Mode=Optimal + SeqRnd On + Voice Piano3 + Volume mf + Octave 5 + Articulate 90 +End + +Begin Bass + Voice FretlessBass + Sequence B13 z B13 z + Octave 3 + Volume mp + Articulate 80 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z W13 z {1 4 90 ; 2.5 8 70 ; 3 8 90 ; 3.5 8 70 ; 4 8 70 } + Volume mp + Articulate 80 +End + +DefGroove SoftRock Basic Soft-rock for 60's tunes. + +Begin Chord-sus + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Voice TremoloStrings + Articulate 100 + Unify On + Volume pp + Octave 5 +End + + +DefGroove SoftRockSus Strings with the rock. + +//// SoftRock1 Add in a latiny sounding arp + + +Groove SoftRock // Start with the basic + +Begin Arpeggio + Voice Flute + Sequence A8 A8 A4 {A1 * 6} + SeqRnd On + RSkip 25 + Rvolume 15 + Rtime 6 + Range 3 + Accent 1 10 3 10 + Articulate 80 + Volume p + Octave 6 +End + +DefGroove SoftRock1 Adds a latin-pop touch by using flute arpeggios. + +Chord-Sus Groove SoftRockSus + +DefGroove SoftRock1Sus Latin-pop with sustained strings. + + + +//////////////////////////////////// +/// Intro + +Groove SoftRock + +Alltracks SeqRnd Off + +Drum-Snare Sequence D12+34 / / D1234 +Drum-HH Sequence D8 / / D13 +Begin Drum-Tri + Sequence D12 / / z + Tone OpenTriangle + Rskip 0 +End + +Chord Sequence C1+34 C13 C1+34 C13 +Bass Sequence B13 B11 B13 {1 2 5 100; 3 2 1 120} +Walk Sequence - + +DefGroove SoftRockIntro Basic introduction. + +Begin Chord-Sus + Groove SoftRockSus + SeqRnd Off + Sequence { 1 1 90 0 50 * 4 } / / {1 2 90 0 50 } + Volume mp p pp ppp + Octave 5 +End + +DefGroove SoftRockSusIntro Basic introduction with added strings. + +//////////////////////////////////// +/// SoftRockEnd Change to straight 4s + +Groove SoftRock + +Chord Sequence C1234 +Drum-Snare Sequence D1234 +Walk Sequence - +Bass Sequence B11 + +DefGroove SoftRockEnd Simple 4 beats to the bar ending. + diff --git a/mma/lib/stdlib/softshoe.mma b/mma/lib/stdlib/softshoe.mma new file mode 100644 index 0000000..27e523b --- /dev/null +++ b/mma/lib/stdlib/softshoe.mma @@ -0,0 +1,160 @@ + +// softshoe + +Begin Doc + + Syncopated ditty for the old dancers. Written for "Me and + My Shadow". + +End + +Author Bob van der Poel + +SeqClear +Time 4 // All these patterns are 4/4 +Timesig 4 4 +Include stdpats + + +///////////////////////// +/// Basic Pattern + +SeqSize 4 + +Begin Drum-Kick + Tone KickDrum1 + Sequence D13 + Volume pp + Rtime 5 + Rvolume 10 +End + +Begin Drum-Side + Tone SideKick + Sequence D24 + Volume pp + Rtime 10 + Rvolume 10 +End + + +Begin Drum-OHH + Tone OpenHiHat + Sequence { D13 ; D24 Shift .75 } / / {D1234 ; D12 Shift .75; D34 Shift .5} + Volume pp / pp-10 pp-20 + Rtime 2 + Rvolume 10 +End + +Begin Bass + Voice AcousticBass + Sequence B13 / / z + Accent 1 20 + Articulate 80 + Octave 3 + Volume mp + Rtime 5 + RVolume 5 +End + +Begin Walk + Voice $_Bass_Voice + Sequence z z z W1234 + Articulate $_Bass_Articulate + Octave $_Bass_Octave + Volume $_Bass_Volume + Rtime $_Bass_Rtime + Rvolume $_Bass_Rvolume +End + +Begin Chord + Voice Piano2 + Volume mp + Articulate 110 110 80 70 + Octave 5 + Sequence C13 / {C134 ; C2 Shift .5} {C134; C23 Shift .5} + Rskip 5 + Rvolume 10 + Rtime 3 +End + +DefGroove Softshoe Nice little dance beat with ``shuffles'' on bar 3 and 4. + +Begin Arpeggio + Voice Clarinet + Sequence {A4 Shift .5; A2} A8 A4 {A2 Shift .5} + SeqRnd On + Harmony Open + Articulate 80 + Octave 5 + Range 2 + Direction Up + Rskip 50 + Volume p +End + +DefGroove SoftShoePlus Add a cool clarinet. + +//////////////////////// +/// Sustained version + +Groove Softshoe + +Begin Chord-Sus + Sequence { 1 1 90 0 90 0 * 4 } + Voicing Mode=Optimal + Volume p + Voice Strings + Octave 5 + Articulate 100 + Unify On +End + +DefGroove SoftShoeSus Add sustained strings. + +Begin Arpeggio + Groove SoftShoePlus + Volume pp + Articulate 70 + Direction Down +End + +DefGroove SoftShoeSusPlus Add the cool clarinet and strings. + + +////////////////////// +//// Intro + +Groove SoftShoe + + +Drum-Side Sequence * * * D1 +Drum-OHH Sequence { D13 ; D24 Shift .75 } / / D13 + +Bass Sequence B13 / / {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} +Walk Sequence - + +Chord Sequence * * * L1 + + +DefGroove SoftShoeIntro A 4 bar introduction. + + +//////////////////////// +//// Ending + +Groove SoftShoe + +SeqSize 2 + + +Drum-Side Sequence * D1 +Drum-OHH Sequence D8 D12 + +Bass Sequence {1 4 5 90; 2 4 4 90; 3 4 3 90; 4 4 2 90} {1 2 1 90} +Walk Sequence - + +Chord Sequence C13 L1 + + +DefGroove SoftShoeEnd 2 bar ending with nice walk on first bar. diff --git a/mma/lib/stdlib/son.mma b/mma/lib/stdlib/son.mma new file mode 100644 index 0000000..b7227c5 --- /dev/null +++ b/mma/lib/stdlib/son.mma @@ -0,0 +1,180 @@ + +// son + +Begin Doc + + The Son or Son Montuno is a traditional Cuban rhythm. The song + ``Alma De Mujer'' in the sample songs uses this. For the most + part I've developed the patterns right from ``Latin Rhythms: Mystery Unraveled'' + by Victor Lopez. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +Seqsize 2 + +Begin Drum-Claves + Tone Claves + Volume mf + Rvolume 10 + Rtime 2 + Sequence Clave2 Clave3 +End + +Begin Drum-Sguiro + Tone ShortGuiro + Volume m + Rvolume 10 + Rtime 2 + Sequence D8 + Accent 1.5 -30 3.5 -30 +End + +Begin Drum-Maraca + Tone Maracas + Volume mp + Rvolume 10 + Rtime 2 + Sequence D8 + Accent 2 50 4 50 +End + +Begin Drum-HBongo + Tone HighBongo + Rvolume 10 + Rtime 2 + Volume f + Sequence D13 +End + +Begin Drum-LBongo + Tone LowBongo + Volume m + Rvolume 10 + Rtime 2 + Sequence {D1 Shift .5; D2; D2 Shift .5; D3 Shift .5; D4; D4 Shift .5} +End + +Begin Drum-HConga + Tone OpenHighConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {1 0 90; 1.5 0 90; 3.5 0 90} {1 0 90; 1.5 0 90; 2.5 0 90; 3.5 0 90; 4.5 0 90} +End + +Begin Drum-LConga + Tone LowConga + Volume mp + Rvolume 10 + Rtime 2 + Sequence {2 0 90; 2.5 0 90; 3 0 90; 4 0 90; 4.5 0 90} {2 0 90; 3 0 90; 4 0 90} +End + +// Use a LowTom and Cymbal for the Timbales + +Begin Drum-Cymbal + Tone RideCymbal1 + Rvolume 10 + Rtime 2 + Volume p + Sequence {1 0 90; 2 0 90; 3 0 90; 3.5 0 90; 4.5 0 90}{1 0 90; 2 0 90; 2.5 0 90; 3.5 0 90; 4.5 0 90} +End + +Begin Drum-LowTom + Tone LowTom1 + Volume p + Rvolume 10 + Rtime 2 + Sequence D24 {2 0 90; 3.5 0 90} +End + +Begin Bass + Voice JazzGuitar + Volume f + Octave 3 + Articulate 80 + Sequence {1 4. 1 90; 2.5 4. 5 90; 4 2 1 90} +End + +Begin Chord + Voice Piano2 + Voicing Mode=Optimal + Volume m + Octave 5 + Sequence {1 4 90; 2 8 90; 2.5 4 90; 3.5 4 90; 4.5 4 90} \ + {1.5 4 90; 2.5 4 90; 3.5 4 90; 4.5 8 90} +End + +DefGroove Son Our basic Son rhythm. + +////// Sustained + +Groove Son + +Alltracks Volume -30 +Begin Bass + Volume +40 + Articulate 70 +End + +Begin Chord-Sus + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Octave 5 + Voice Strings + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume mp +End + +DefGroove SonSus Son with sustained strings. + + +///// Intro + +Groove Son + +SeqSize 4 + +Drum-Claves Sequence * * * D1234 +Drum-Sguiro Sequence * * * D12 +Drum-Maraca Sequence * * * D1 +Drum-HBongo Sequence * * D8 z +Drum-LBongo Sequence * * D1234 z +Drum-HConga Sequence D1234 z * z +Drum-LConga Sequence D13 z * z +Drum-Cymbal Sequence D8 / D13 D1 +Drum-LowTom Sequence * * * D1 + +Bass Sequence B1 * * {1 2 5 100; 3 2 1 100} +Chord Sequence C13 * * L1 + +DefGroove SonIntro Boring, four bar introduction. + +///// Ending + +Groove Son + + +Drum-Claves Sequence * D1 +Drum-Sguiro Sequence * D13 +Drum-Maraca Sequence * D13 +// Drum-HBongo -- no change +Drum-LBongo Sequence * D1 +Drum-HConga Sequence D1234 D13 +Drum-LConga Sequence D2 / +Drum-Cymbal Sequence D8 D13 +Drum-LowTom Sequence * z + +Bass Sequence B1234 B13 +Chord Sequence C1234 L1 + +DefGroove SonEnd Simple ending. + diff --git a/mma/lib/stdlib/swing.mma b/mma/lib/stdlib/swing.mma new file mode 100644 index 0000000..b28a220 --- /dev/null +++ b/mma/lib/stdlib/swing.mma @@ -0,0 +1,575 @@ +// swing + +Begin Doc + + Some pretty good swing stuff. Works well for standards like + "C'est Si Bon". The "Triple" and "Plus" versions are built + on their basics, so it it sounds fine to toggle between, for + example, Swing, SwingPlus and SwingTriple. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////////////// +////// Additional pattern defs + + +Begin Chord Define + LongSS1 1 4 90 ; 1+81 82 80 ; 2 8 85 + LongSS2 1 4 90 ; 2 4 80 ; 3+81 82 85 ; 4 8 80 +End + +Begin Bass Define + Sync1 1 4 1 90; 2+81 16 1 80; 3 4 1 90; 4+81 16 1 80 + Sync2 1 4 1 90; 2+81 16 1 80; 3 4 5 90; 4 4 1 80 +End + +Begin Walk Define + Sync1 1 4 90 ; 2+81 82 80; 3 4 90 ; 4+81 82 80 + Sync2 1 4 90 ; 2+81 82 80; 3 4 90 ; 4 4 80 +End + + +//////////////////////////// +// Basic Swing Patterns +//////////////////////////// + +///////////////////// +////// Swing + +SeqClear +Seqsize 4 // Make all the patterns 4 bars long + +// The hats use a swing pattern. + +Begin Drum-PHH + Sequence Swing8 + Tone PedalHiHat + Rskip 30 + Rvolume 10 + Rtime 1 + Volume p +End + +Begin Drum-OHH + Sequence Swing8 + Tone OpenHiHat + Rskip 30 + Rvolume 10 + Rtime 1 + Volume p +End + +// Kicks are one 1,2,3 and 4 + +Begin Drum-Kick + Sequence D1234 + Tone KickDrum2 + Rskip 40 + Rvolume 10 + Rtime 3 + Volume mp +End + +Begin Drum-Side + Sequence D1234 + Tone SideKick + Rskip 40 + Rvolume 10 + Rtime 3 + Volume mp +End + +// Low-Congas on 1 and 3; hi on 2,4 + +Begin Drum-LowConga + Sequence D13 + Tone LowConga + Rskip 10 + Rvolume 10 + Rtime 5 + Volume f +End + +Begin Drum-HiConga + Sequence D24 + Tone OpenHighConga + Rskip 10 + Rvolume 10 + Rtime 5 + Volume f +End + + +Begin Chord + Voice Organ3 + Sequence {1 2 90 ; 3+81 4. 85 } C1 + Octave 6 + Voicing Mode=Optimal + Volume mp + Articulate 80 + Rvolume 3 +End + +Begin Chord-Guitar + Voice JazzGuitar + Sequence C13 C1234 + Voicing Mode=Optimal + Articulate 90 + Strum 5 + Octave 5 + SeqRnd On + Volume mp + Rvolume 5 +End + +Begin Bass + Voice AcousticBass + Sequence Sync1 Sync2 + Articulate 80 + Octave 3 + Volume mf + Rvolume 10 +End + +DefGroove Swing Basic swing beat. + +/// Change bass to walking. + +Groove Swing + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence Sync1 Sync2 + Articulate 76 + Volume mf + Rvolume 10 +End + +DefGroove SwingWalk Change the 1/3 syncapated bass to the same \ + pattern, but with a walking style. + + +////// Single bar triple swing + +Groove Swing +SeqSize 1 + +Drum-PHH Sequence Triple6 +Bass Sequence B13 +Chord Sequence C13 + +Begin Chord-Guitar + Sequence Triple6 + Articulate 85 + Accent 1 30 3 30 +End + +DefGroove SwingTriple Modified Swing with quarter note triplets. Good \ + for occasional fill bars. + + +////// Arpeggiating clarinet + +Groove Swing + +Begin Arpeggio + Sequence Swing8 / / z + Invert 0 1 2 0 + Voice Clarinet + SeqRnd On + Volume p + Articulate 70 + Rskip 10 50 40 0 + Rvolume 10 + Octave 6 +End + +DefGroove SwingPlus Adds clarinet arpeggios to Swing. + +Groove SwingWalk +Arpeggio Groove SwingPlus +DefGroove SwingWalkPlus Swing with walking bass and arpeggios. + +/// Sustained strings over the swing pattern. + +Groove Swing + +Begin Chord-sus + Voice TremoloStrings + Sequence { 1 1 90 0 50 0 * 4 } { 1 1 50 0 90 0 * 4 } + SeqRnd On + Voicing Mode=Optimal + Rvolume 10 + Articulate 100 + Unify On + Volume p + Octave 5 +End + + +DefGroove SwingSus Add sustained strings to Swing. + + +Groove SwingPlus +Chord-Sus Groove SwingSus +DefGroove SwingPlusSus Add sustained strings to SwingPlus. This is\ + getting a bit thick sounding. + + +Groove SwingWalk +Chord-Sus Groove SwingSus +DefGroove SwingWalkSus Swing with walking bass and sustained strings. + +Arpeggio Groove SwingPlus +DefGroove SwingWalkPlusSus Swing with walking bass, arpeggio \ + and sustained Strings. + + +///////////////////// +/// Variation 1 + +Groove Swing // Use basic swing voicing + +// Leave the drums mostly the same, but cancel the pedal hihats +// and grab a RideCymbal + + +Drum-PHH Sequence - +Begin Drum-RideC + Copy Drum-PHH + Sequence Swing8 + Tone RideCymbal1 +End + +// Change the organ to a piano, same rhythm + +Begin Chord + Voice Piano2 + Octave 5 + Articulate 80 +End + +// Replace syncopated bass with straight 1/3 + +Begin Bass + Voice SlapBass1 + Octave 3 + Articulate 90 + Sequence B13 +End + +DefGroove Swing1 A more syncopated version of Swing. This sounds \ + a bit "twangy" with the piano voice selected. + + +// Same swing with walking bass + +Bass Sequence - + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence W1234 + Accent 1 10 3 10 + Articulate 70 + Volume mf + Rvolume 10 + Rtime 5 +End + +DefGroove Swing1Walk Walking bass version of Swing1. + +//// Triplet version + +Groove Swing1 +SeqSize 1 + +Bass Sequence B11 +Chord Sequence C13 + +Begin Chord-Guitar + Sequence Triple6 + Articulate 99 + Accent 1 30 3 30 +End + +Drum-HiConga Sequence - +Drum-Kick Sequence D1 +Drum-LowConga Sequence D13 +Drum-OHH Sequence Triple6 +Drum-RideC Sequence Triple6 +Drum-Side Sequence D1 + +DefGroove Swing1Triple Modified Swing1 with quarter note triplets. + + +///// Sustained versions + +Groove Swing1 +Chord-Sus Groove SwingSus +DefGroove Swing1Sus Swing1 with sustained strings. + +Groove Swing1Walk +Chord-Sus Groove SwingSus +DefGroove Swing1WalkSus Swing1Walk with sustained strings. + +//// Clarinet versions + +Groove Swing1 +Arpeggio Groove SwingPlus +DefGroove Swing1Plus Swing1 with arpeggiating clarinets. + +Chord-Sus Groove SwingSus +DefGroove Swing1PlusSus Swing1 with clarinet and sustained strings. +Groove Swing1Walk +Arpeggio Groove SwingPlus +DefGroove Swing1WalkPlus Swing1Walk with the clarinet. + +Chord-Sus Groove SwingSus +DefGroove Swing1WalkPlusSus Swing1Walk with clarinet and sustained strings. + + +///////////////////// +////// Variation 2 + +Groove Swing + + +// Change the organ chording and voice + +Begin Chord + Sequence LongSS1 / / / + Voice Organ3 + Voicing Mode=None + Invert 0 2 1 0 + Articulate 90 + SeqRnd On + Volume p + Octave 5 +End + +// Change guitar as well + +Chord-Guitar Sequence - + +Begin Chord-Sax + Sequence LongSS2 C13 C1234 LongSS2 + Voicing Mode=Optimal + Volume ppp + SeqRnd On + Articulate 80 50 50 80 + Octave 5 + Voice AltoSax + Limit 3 // Just play the 1st 3 chord notes; + // the sustained chords take care of 7ths, etc. +End + +// The bass line consists of 3 bars of walking bass +// followed by a fourth bar of a root/root bass. + + +Begin Walk + Sequence W1234 / / z + Articulate 60 + Accent 1 10 3 10 + Octave 3 + Volume mf + Voice SlapBass1 + RVolume 10 +End + +Begin Bass + Voice $_Walk_Voice + Octave $_Walk_Octave + Sequence z z z B11 + Articulate 60 + Volume mf + RVolume 10 +End + +DefGroove Swing2 This version is much better with slower tempos \ + (no walking bass versions since it's already marching). + +//////// Triplet + +Groove Swing2 +SeqSize 1 + +Bass Sequence B13 +Walk Sequence - +Begin Chord + Sequence Triple6 + Volume mf + Octave 6 +End +Chord-Sax Sequence C13 +Drum-HiConga Sequence - +Drum-Kick Sequence Triple6 +Drum-OHH Sequence Triple6 +Drum-PHH Sequence D1 +Drum-Side Sequence Triple6 + +DefGroove Swing2Triple Modified Swing2 with quarter note triplets. + + +/// Clarinets + +Groove Swing2 +Arpeggio Groove SwingPlus +DefGroove Swing2Plus Swing2 with clarinet + +///// Sustained version + +Groove Swing2 +Chord-Sus Groove SwingSus +DefGroove Swing2Sus Swing2 with sustained strings. + +//// Combo + +Groove Swing2Sus +Arpeggio Groove SwingPlus +DefGroove Swing2PlusSus Swing2 with clarinet. + + +/////////////////////// +// Intro + + +Groove Swing + +Alltracks SeqRnd Off + +Drum-PHH Sequence Swing8 / / D12 +Drum-OHH Sequence Swing8 / / D12 +Drum-Kick Sequence D1234 / / D12 +Drum-Side Sequence D1234 / / D12 +Drum-LowConga Sequence D13 / / D1 +Drum-HiConga Sequence D24 / / D2 +Chord Sequence {1 2 90 ; 3+81 4. 85 } C1 C13 {1 2 90} +Chord-Guitar Sequence C13 C1234 C13 L1 +Bass Sequence Sync1 Sync2 Sync1 B1 + + +DefGroove SwingIntro Simple, 4 bar introduction. + +Groove Swing2 + +Alltracks SeqRnd Off + +Drum-PHH Sequence Swing8 / / D12 +Drum-OHH Sequence Swing8 / / D12 +Drum-Kick Sequence D1234 / / D12 +Drum-Side Sequence D1234 / / D12 +Drum-LowConga Sequence D13 / / D1 +Drum-HiConga Sequence D24 / / D2 +Chord Sequence {1 2 90 ; 3+81 4. 85 } C13 C13 {1 2 90} +Chord-Sax Sequence {C1; 3 8 100} / / {1 2 100} +Walk Sequence - +Bass Sequence Sync1 Sync2 Sync1 B1 + + +DefGroove SwingIntro2 Same intro, but Swing2 voices. + + +/////////////////////// +// Endings + + +Groove Swing // Use basic swing voicing +SeqSize 2 +Alltracks SeqRnd Off + +Chord Sequence C13 +Chord-Guitar Sequence C1234 C13 +Bass Sequence B1234 B13 + +Begin Drum-Snare + Sequence D8 D13 + Tone SnareDrum1 +End + +Drum-Kick Sequence D13 +Drum-PHH Sequence - +Drum-OHH Sequence - +Drum-Side Sequence - +Drum-HiConga Sequence D24 D13 + +DefGroove SwingEnd Basic ending based on Swing. 4 beats on first bar; \ + beats on 1 and 3 on the second. + + + +Groove Swing1 +SeqSize 2 + +Alltracks SeqRnd Off + +Chord Sequence C1234 C13 +Chord-Guitar Sequence C1234 C13 +Bass Sequence B11 +Walk Sequence - +Drum-Kick Sequence D13 +Drum-RideC Sequence D8 D13 +Drum-OHH Sequence D1234 D1 +Drum-Side Sequence D13 - +Drum-LowConga Sequence D24 D13 +Drum-HiConga Sequence D24 D13 + + +DefGroove Swing1End Ending for Swing1. + + + +Groove Swing2 + +// We use the same inst for the Chords, but change the pattern +// We continue with the Sax Chord for 2 bars, then kill it +// We make the alto play the impossible scale for the 3rd bar, +// and a hold note for the last. + +Alltracks SeqRnd Off + +Chord Sequence LongSS2 LongSS2 LongSS2 C12 +Chord-Sax Sequence C1234 z z z + +Begin Scale + SeqCLear + Sequence z Scale16 Scale8 Scale2 + Direction Up + Articulate 99 + Range 3 + octave 5 + Volume mp + ScaleType Chromatic + Voice AltoSax +End + +// Change the bass to be more repetitive + +Bass Sequence z z B11 B11 +Walk Sequence W1234 / / z + +// And some finality to the the drums + +Drum-HiConga Sequence D24 / D1 / +Drum-Kick Sequence D1234 / D13 D1 +Drum-LowConga Sequence D13 / / D13 +Drum-OHH Sequence Droll / D1234 D1 +Drum-PHH Sequence DRoll D1234 D13 D1 +Drum-Side Sequence D1234 / / D1 + +DefGroove Swing2End Swing2 ending with alto sax run. Use ``seq'' so \ + that you end on bar 4. The sax plays 1 bar of chords,\ + then 16th, 8th, half note runs on bar 2, 3 and 4. If \ + don't like the sax run, use ''Scale Off'' to disable. + diff --git a/mma/lib/stdlib/tango.mma b/mma/lib/stdlib/tango.mma new file mode 100644 index 0000000..7ddc2ef --- /dev/null +++ b/mma/lib/stdlib/tango.mma @@ -0,0 +1,204 @@ + +// tango + +Begin Doc + + This is a stronger, heavy version of Tango. You might also + want to look at the "LightTango" for an alternative. + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + +///////////////////////////////////////// +//// Additional patterns + + +Begin Drum Define + D1234+ D1234 Shift .5 + D12+3+4 D1234; D23 Shift .5 + Roll4 4.5 0 80; 4.625 0 75; 4.75 0 75; 4.875 0 88 +End + +Begin Chord Define + OffBeat1 C12 Shift .5 ; C4 + OffBeat2 C124 Shift .5; C4 +End + +Begin Bass Define + V1-1 1.5 4 1 90; 2.5 8 1 90; 3 8 1 90 + V1-3 1.5 4 3 90; 2.5 8 3 90; 3 8 3 90 + V1-5 1.5 4 5 90; 2.5 8 5 90; 3 8 5 90 + V2-1 1 1 1 90 + V2-3 1 1 3 90 + V2-5 1 1 5 90 +End + +Begin Arpeggio Define + AR1 2 8 90; 2.5 8 90; 3 8 90; 3.5 4 90 + AR2 1.5 4 90; 2.5 8 90; 3 8 90; 4 8 90 + AR3 1 8 90; 1.5 8 90; 2 8 90; 4 8 90 +End + +///////////////////////////////// +///////// Tango + + +SeqSize 8 + +Begin Drum + Sequence D1234 + Tone SnareDrum1 + Rvolume 10 + Rtime 1 +End + +Begin Drum-Rolls + Sequence Roll4 z z z + Tone SnareDrum1 + Rvolume 20 + Rtime 1 +End + +Begin Drum-Kick + Sequence D1234 / / D1234+ + Tone KickDrum1 + Rskip 40 + Rtime 3 + Rvolume 10 +End + +Begin Drum-HH + Sequence D1234 + Tone PedalHiHat + Rskip 10 + Rtime 4 + Rvolume 20 +End + +Begin Drum-OHH + Sequence D4 z D4 z + Tone OpenHiHat + Rvolume 10 + Rtime 1 +End + +Begin Walk + Sequence W1234 + Rskip 10 + Rtime 5 + Octave 3 + Volume mf + Articulate 60 + Voice AcousticBass +End + +Begin Arpeggio + Sequence AR1 AR2 AR3 z + Voice Bandoneon + Octave 6 + SeqRnd On + Articulate 70 + Rskip 5 + Rvolume 20 + Volume mf + Rtime 5 + Direction Down +End + +Begin Chord + Voice Bandoneon + Voicing Mode=Optimal + Sequence C1234 OffBeat1 C134 OffBeat2 + Articulate 40 + Volume mp + Octave 5 +End + +// This bass slot is used for the violin counter melody + +Begin Bass-Violin + Sequence V1-1 V1-3 V1-5 V1-1 V2-1 V2-3 V2-5 V1-1 + Voice Violin + Articulate 99 + Volume mp + Octave 5 +End + +DefGroove Tango Basic tango. + +////////////////////////////////// +// Tango1 -- More March-like version +// The chords are changed to piano from accordion, +// minor tweaks to the accordion-aprs and violin counter. + +Groove Tango + +Begin Chord + SeqClear + Sequence C1234 OffBeat1 C1234 OffBeat2 + Articulate 70 + Voicing Mode=Optimal + Voice Piano1 + Octave 5 + Volume mp +End + +Begin Arpeggio + Volume pp + Articulate 95 +End + +Begin Bass-Violin + Volume p + SeqRnd On + Octave 5 + Rskip 50 +End + +DefGroove Tango1 Our basic Tango with a March feel. + +////////////////////////////////// +// TangoEnd +// 2 bar ending + +Groove Tango +SeqSize 2 + +// Turn off the apreggiating accordion, walking bass and drum rolls + +Arpeggio Sequence - +Walk Sequence - +Drum-Roll Sequence - + +// Change remaining drums, bass and accordion chords +// to 1-2-3-4 , 1-3 pattern + +Drum Sequence D1234 D13 +Drum-Kick Sequence D1234 D13 +Drum-HH Sequence D13 + +Begin Bass + Sequence B1234 B13 + Octave 3 + Volume f + Articulate 60 + Voice AcousticBass +End + +Chord Sequence C1234 C13 + +// Funky violin only plays on the 1st bar + +Bass-Violin Sequence V2-1 z + + +DefGroove TangoEnd A nice ending for our dance. + + + diff --git a/mma/lib/stdlib/vienesewaltz.mma b/mma/lib/stdlib/vienesewaltz.mma new file mode 100644 index 0000000..48b30dc --- /dev/null +++ b/mma/lib/stdlib/vienesewaltz.mma @@ -0,0 +1,145 @@ + +// waltz + + +Begin Doc + + Strauss waltz pattern. + +End + +Author Bob van der Poel + +SeqClear +Time 3 +Timesig 4 4 +Include stdpats34 + + +////////////////////////////////////////////////// +// VieneseWaltz + + +SeqSize 4 + +// For the chords we use a piano on beat 1. This +// is done with a bass pattern. Beats 2 and 3 have +// a piano chord. + +Begin Bass + Sequence B1 B1/5 + Voice Piano2 + Octave 3 + Articulate 90 + Volume f +End + + +Begin Chord-Piano + Sequence C23 + Invert 1 0 + Voice Piano2 + Articulate 95 + RVolume 10 + Octave 4 + Volume mp +End + + +Begin Drum-Kick + Sequence D1 + Tone KickDrum1 + Rvolume 20 + Volume p + Rtime 4 +End + +Begin Drum-Cym + Sequence D2 + Tone RideCymbal1 + Rvolume 10 + Volume mp + Rtime 3 +End + +Begin Drum-HH + Sequence D23 + Tone ClosedHiHat + Rvolume 10 + Volume p + Rtime 2 + Rskip 20 +End + + +DefGroove VieneseWaltz Basic waltz, piano only. + + +Begin Chord-Sus + Sequence C123 + Articulate 100 + Voicing Mode=Optimal + Unify On + Octave 6 + Voice Strings + Volume p +End + + +DefGroove VieneseWaltzSus Basic waltz with strings and piano. + + +/// VieneseWaltz1 - Same as above, but with arp musicbox + + +Groove VieneseWaltz + +Chord-Piano Sequence - // Kill piano + +// Set up a musicbox to arpeggiate on 3 bars and a scale on the 4th +// A6 and S6 are both 3 pairs of 1/8 notes. + +Begin Arpeggio + Sequence A6 / / z + Accent 1 10 + Invert 0 1 + Articulate 99 + Volume mp + Range 2 + Octave 5 + Rvolume 20 + Voice MusicBox +End + +Begin Scale + Sequence z z z S6 + Accent 1 10 + Articulate 99 + Volume mp + Octave 5 + Rvolume 20 + Voice MusicBox +End + +DefGroove VieneseWaltz1 Our VieneseWaltz with light, eight note arpeggios. + +Chord-Sus Groove VieneseWaltzSus +Scale Rskip 5 +Arpeggio Rskip 20 + +DefGroove VieneseWaltz1Sus Waltz with arpeggios and strings. + +/// Ending + +Groove VieneseWaltz + +Chord-Piano Sequence C23 / C1 / +Bass Sequence B1 B123 / B1 +Drum-Cym Sequence D2 / D1 / +Drum-HH Sequence D123 / D12 D1 + +DefGroove VieneseWaltzEnd A 4 bar ending. Set SEQ so that the \ + final bar is the 4th bar of the pattern. \ + A CUT after the last bar will help. + + diff --git a/mma/lib/stdlib/waltz.mma b/mma/lib/stdlib/waltz.mma new file mode 100644 index 0000000..30ffb87 --- /dev/null +++ b/mma/lib/stdlib/waltz.mma @@ -0,0 +1,208 @@ + +// waltz + +Begin Doc + + A pretty basic 3/4 waltz. + +End + +Author Bob van der Poel + +SeqClear +Time 3 +TimeSig 3 4 +Include stdpats34 + + +////////////////////////////////////// +///// Waltz - plain, dull (and a bit heavy sounding), 3/4 + + +SeqSize 4 + +Begin Drum-CHH + Tone ClosedHiHat + Sequence D1 D23 + Volume mp + Rvolume 10 + Rtime 3 +End + +Begin Drum-Kick + Sequence z D1 / / + Tone KickDrum1 + Volume mp + Rskip 5 + Rvolume 10 + Rtime 3 +End + +Begin Drum-Snare + Sequence D23 / / {D1 Shift .5 ; D23 } + Tone SnareDrum1 + Volume pp + Rskip 2 + Rvolume 20 + Rtime 2 +End + +Begin Drum-Tri + Sequence D1 z z z + Tone OpenTriangle + Volume pp + Rvolume 10 + Rtime 2 +End + +Begin Chord + Sequence C123 {C123; C2 Shift .5} C123 {C123; C23 Shift .5} + Accent 1 40 + Voicing Mode=Optimal + Volume p + Voice Piano1 + Articulate 80 + Octave 4 +End + +// Alternate bass on root/five bar to bar + +Begin Bass + Voice AcousticBass + Sequence B1 B1/5 B1 z + Octave 3 + Volume p + Articulate 70 +End + +Begin Walk + Voice $_Bass_Voice + Octave $_Bass_Octave + Sequence z z z W123 + Volume p + Articulate 70 +End + +DefGroove Waltz A very boring waltz with piano chords. + +Begin Chord-Sus + Voice TremoloStrings + Sequence { 1 2. 90 0 50 * 3 } + Voicing Mode=Optimal + Articulate 100 + Unify On + Volume p + Octave 5 +End + + +DefGroove WaltzSus Adds strings to Waltz. + + +// Add interest by alternating scales and apreggios. + +Groove Waltz + +Chord Sequence C13 / / C123 + +Begin Arpeggio + Sequence z A6 / / + Voice Piano1 + Octave 4 + Range 2 + Rskip 10 + Invert 0 1 2 1 + Volume p + Articulate 99 +End + +Begin Scale + Sequence S6 z z z + Voice Piano1 + Octave 4 + Range 2 + Volume p + Articulate 99 +End + +DefGroove Waltz1 Add piano apreggios to the basic waltz. +Chord-Sus Groove WaltzSus + +DefGroove Waltz1Sus Waltz with arpeggios and sustained strings. + + +///////////////////////////////////// +/// Walking bass versions + +Groove Waltz + +Bass Sequence - +Walk Sequence W123 +DefGroove WaltzWalk Walking bass version of Waltz. + +Chord-Sus Groove WaltzSus +DefGroove WaltzWalkSus Walking bass and sustained strings. + +Groove Waltz1 +Bass Sequence - +Walk Sequence W123 +DefGroove Waltz1Walk Walking bass and arpeggios. + +Chord-Sus Groove WaltzSus +DefGroove Waltz1WalkSus Walking bass, arpeggios and sustained strings. + + +///////////////////////// +/// Intro + +Groove Waltz + +Drum-CHH Sequence * * * D123 +Drum-Tri Sequence D1 z z D1 + +Chord Sequence * * * {1 2. 100} + + +DefGroove WaltzIntro Waltz intro with piano chords. + +Chord Sequence - + +Begin Arpeggio + Sequence A6 / / A3 + Voice Piano1 + Octave 4 + Range 2 + Volume p + Articulate 99 +End + +DefGroove Waltz1Intro Waltz intro with piano arpeggios. + +//////////////////////// +///// Ending + + +Groove Waltz + +Drum-Snare Sequence D123 / D23 D1 +Drum-Tri Sequence D1 z D1 z +Drum-CHH Sequence D1 +Chord Sequence C123 / C12 C1 +Bass Sequence B1 B1/5 B1 B1 +Walk Sequence - + +Begin Scale + Sequence S12 S6 S3 S1 + Voice Piano1 + Octave 4 + Volume mp + Articulate 99 +End + +DefGroove WaltzEnd Simple ending based on Waltz with piano scales. \ + Scales are 16ths on bar 1, 8ths on 2, quarters \ + on 3 and a single note on 4. Adjust your SEQ \ + accordingly, and use a CUT to finish the last bar. + + + diff --git a/mma/lib/stdlib/zydeco.mma b/mma/lib/stdlib/zydeco.mma new file mode 100644 index 0000000..e22a1f3 --- /dev/null +++ b/mma/lib/stdlib/zydeco.mma @@ -0,0 +1,135 @@ + +// zydeco + +Begin Doc + + After listening to way too much Buckwheat I came up with this. I + use it for "Jambalaya". + +End + +Author Bob van der Poel + +SeqClear +Time 4 +Timesig 4 4 +Include stdpats + + + +///////////////////////////// +/// Basic + +Seqsize 4 + +Begin Drum-snare + Tone SnareDrum1 + Volume mp + Rvolume 20 + Rtime 10 + Sequence { D1234; D2 Shift .5 } +End + + +Begin Drum-Kick + Tone KickDrum1 + Volume f + Rvolume 10 + Sequence D1 +End + + +Begin Chord + Voice JazzGuitar + Volume mf + Octave 5 + Articulate 90 + Strum 5 + Direction Both + Rtime 10 + Rvolume 10 + Rskip 20 + Sequence C1234 / / C13 +End + + +Begin Bass + Voice FretlessBass + Volume f + Octave 3 + Articulate 120 + Sequence B11 / / B13 +End + + +DefGroove Zydeco Our basic cajan beat. + + +Begin Chord-Acc + Voice Accordion + Sequence {C1234; C2 Shift .5} / / {1 2 90; 3 2 90} + Voicing Mode=Optimal + Volume p + Octave 6 + Rskip 10 + Articulate 70 +End + + +DefGroove ZydecoPlus Adds a rhythmic accordion + + +/////////////////////// +/// Sustained versions + +Groove Zydeco + +Begin Chord-Sus + Voice Strings + Sequence { 1 1 90 0 80 0 * 2} // Root and fifth notes only. + Voicing Mode=Optimal + Volume mp + Octave 5 + Articulate 100 + Unify On +End + +DefGroove ZydecoSus The orchestra in New Orleans? + +Chord-Acc Groove ZydecoPlus +DefGroove ZydecoSusPlus String and accordion? Too cool! + + +////////////////////////////// +/// Intro + +Groove Zydeco + +Drum-snare Sequence { D1234; D2 Shift .5 } / / D13 +Chord Sequence - +Bass Sequence B11 / / B1 +Chord-Acc Groove ZydecoPlus + +DefGroove ZydecoIntro A simple, 4 bar, introduction with accordion. + + +////////////////////////////// +/// Ending + +Groove Zydeco + +Seqsize 2 + +Drum-snare Sequence D1234 D1 +Chord Sequence C1234 L1 +Bass Sequence B11 B1 + +DefGroove ZydecoEnd 2 bar ending with guitar. + + +Begin Chord-Acc + Groove ZydecoPlus + Sequence {C1234; C2 Shift .5} L1 +End + +DefGroove ZydecoPlusEnd 2 bar ending with accordion. \ No newline at end of file diff --git a/mma/ln-install b/mma/ln-install new file mode 100755 index 0000000..1fd9ee8 --- /dev/null +++ b/mma/ln-install @@ -0,0 +1,8 @@ +#!/bin/sh + +echo Creating symbolic links for MMA. + +ln -s `pwd` /usr/local/share/mma +ln -s `pwd`/mma.py /usr/local/bin/mma + +echo Done. \ No newline at end of file diff --git a/mma/mma.py b/mma/mma.py new file mode 100755 index 0000000..cabd499 --- /dev/null +++ b/mma/mma.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +""" +The program "MMA - Musical Midi Accompaniment" and the associated +modules distributed with it are protected by copyright. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Bob van der Poel + +""" + +import sys +import os + +# Ensure a proper version is available. + +pyMaj=2 +pyMin=4 + +if sys.version_info[0] < pyMaj or sys.version_info[1] < pyMin: + print + print "You need a more current version of Python to run MMA." + print "We're looking for something equal or greater than version %s.%s" % \ + (pyMaj,pyMin) + print "Current Python version is ", sys.version + print + sys.exit(0) + +""" MMA uses a number of application specific modules. These should + be installed in a mma modules directory or in your python + site-packages directory). MMA searches for the modules + directory and pre-pends the first found to the python system list. +""" + +for d in ("c:\\mma", "/usr/local/share/mma", "/usr/share/mma", "."): + if os.path.isdir(d): + sys.path.insert(0, d) + break; + +# Call the mainline code. Hopefully, byte-compiled. + +import MMA.main + diff --git a/mma/text/ANNOUNCE b/mma/text/ANNOUNCE new file mode 100644 index 0000000..9131c73 --- /dev/null +++ b/mma/text/ANNOUNCE @@ -0,0 +1,29 @@ + +Version 1.0-RC2 of MMA - Musical MIDI Accompaniment - is now +available for downloading. Included in this release: + + Improved support for windows path names. + + A number of packaging issues resolved. + + Inclusion of mklibdoc.py for updating of lib docs from user contributed files. + + Fractional RANGE settings for arpeggio and scale tracks. + +This is our second version 1 release candidate. Please let me know +if anything is broken before we release the real 1.0! + +Please note the new web and email addresses. The old ones still work, +but not for long. Update your records. + +MMA is a accompaniment generator -- it creates midi tracks +for a soloist to perform with. User supplied files contain +pattern selections, chords, and MMA directives. For full details +please visit: + + http://www.mellowood.ca/mma/ + +If you have any questions or comments, please send them +to: bob@mellowood.ca + + diff --git a/mma/text/CHANGES-1.0.rc1 b/mma/text/CHANGES-1.0.rc1 new file mode 100644 index 0000000..4bcb6b1 --- /dev/null +++ b/mma/text/CHANGES-1.0.rc1 @@ -0,0 +1,28 @@ + +Starting in this version the CHANGES files will be split out. A new file will be + created for each release. + +Changed the search paths for the modules, libs and includes to include "c:\mma". This should + make life easier for Windows users. For RC files, added "c:\mma\mmarc". + +Changed the command line options a bit. '-Dx' is gone, replaced with '-Dxl' and '-Dxh'. The + first generates Latex docs, the 2nd html. This also led to some html code generation writing. + +The binary distribution now has the text files in a separate directory. This is tidier and + it resolves conflicts with files like 'install' and 'INSTALL' in non-case-sensitive + environments. + +The program 'mklibdoc.py' and a README has been included in the utils directory of the + binary distro. This will update the HTML version of the library docs. + +In SCALE/ARPEGGIO tracks you can now use a fractional value for RANGE. See the docs. + +Added the document chords.pdf to the distribution tree. This shows the chords/scales used + in musical notation. Good for debugging chord errors. + +The install has changed a bit. I've renamed the old install script to cp-install and + included a new ln-install script. This just creates a link is probably an easier + method to use. + +The base distribution now includes the html documentation. + diff --git a/mma/text/CHANGES-beta b/mma/text/CHANGES-beta new file mode 100644 index 0000000..b7bd293 --- /dev/null +++ b/mma/text/CHANGES-beta @@ -0,0 +1,1223 @@ + +Change log for beta version 0.1 to current beta. This entire file +will be deleted when we achieve a 1.0 milestone????? + +Feburary 16/2003 + +Released version 0.1 to the world. + +================================= + +May 4/2003 + +Added new error message to USE. It now checks for a matching filename +is a different case. Should help for this common error. I've not done +the same for INCLUDE, and it's probably not necessary???? + +---------- + +Added a few more chords. I'm not going to document these here, they +are updated in the docs. + +----------- + +Fixed up the read() code so that it returns lists. The BEGIN/END logic +has been moved to read() as well, which fixes the earlier problem with +repeats not working properly. NOTE for docs: BEGIN/END are local to a +file, and an error occurs if you try USE or INCLUDE while a BEGIN is +active. + +------------ + +Continuation lines! Multiple lines in a file can be concatenated by +ending successive lines with a single '\'. For example: + + Chord Define G1 1 4 90 0 90 0 ; \ 2.5 8 90 0 90 0; \ 3 4 90 0 90 0; \ 4 4 90 0 90 0 + +Get translated to the single line: + + Chord Define G1 1 4 90 0 90 0 ; 2.5 8 90 0 90 0; 3 4 90 0 90 0; 4 4 90 0 90 0 + +Comments are stripped AFTER lines are appended. So: + + Chord Define G1 1 4 90 0 90 0 ; // This is a comment \ 2.5 8 90 0 90 0 + +Becomes: + + Chord Define G1 1 4 90 0 90 0 ; + +NOTE: The 2nd line as well as the comment have been deleted! + +We could change this, but the whole ugliness of continuation lines +probably suggests that the way we have it is the right way. Comments? + + +Note that you can use continuation lines at any point in your input. + +INPUT FILE FORMAT CHANGE!!!!!!!!!!! With this the trailing '@' to +indicate the end of a DEFINE has been eliminated. In fact, having a +trailing '@' will generate an error. They have been deleted from all +my files.... + +--------------------- + +The docs have been split into two different files. The reference to +the standard library has been taken out of the reference manual and is +now a separate file (lib.ps). As well, a tutorial has been started. + +--------------------- + +Test for proper python version added. + +--------------------------- + +BEGIN/END Blocks can now be nested. This means that you can do +something like: + + Begin Chord + Begin Define + C1234 4 + End + Octave 4 + Voice Piano1 + End + +This is most useful for Doc blocks. + +---------------------------- + +Documentation blocks. Please see the ref-man for detail, but a new set +of commands for embedding documentation in library files has been +added. Also, added a -x option to print out (eXtract) the doc strings. + +The syntax for DefGroove has been expanded to permit a trailing +comment. + + DefGroove Waltz This is a waltz groove + +Defines the groove, but it also does a: + + Doc Defines This is a waltz groove + +This should help in maintaining library docs! + + +----------------------------------------- + +Added new comand: + + Chord | BASS | etc. LIMIT + +This limits the number of notes of a chord used. Mostly, this will +kill off the odd sounding (to some people) of the higher notes in +chord, esp. when the chord is an 11th, 13th, etc. + + +--------------------- + +Added new command: + + EOF + +This stops the processing of a file. Useful if you just want to test +the first part. Note that the rest of the file is NOT PARSED. + + +May 15, 2003 - released 0.2 + +========================================== + +New command: Duplicate. This duplicates each note for Scale, Chord, +Apreggio, and Bass by the specified ocatve. + +--------------------------- + +July 19, 2003 + +Fixed up error reporting to include filename being processed. + +Added several lib files. + +August 2, 2003 - released 0.3 + +=============================================== + +Aug 28, 2003 + +Added CUT command. + + +Septebmer 18, 2003 + +Variable support, conditionals, label and goto have been added. This +is a big addition (and probably has bugs!). Read the new chapter in +the manual "Varaibles..." for all the details. + + +Changed the input reading routine again. Continuation lines and +comments have been changed once again. Comments are now stripped after +line joining. + + +October 19, 2003 - released 0.4 + + +Modified InvertChord function. Chords are no longer rotated; just the +notes are changed. + +December 4, 2003 + +Added new command: + + Debug [mode=on/off] Modes debug, patterns, sequence, runtime, warnings, expand. + +This is the same as the commandline options -dpsrwe + + +Changed command line options a bit. All document extractions are now +part of -D. + +Added commands to extract midi inst. and chord info (see -D) + +Reworked chords into a class. + +December 5, 2003 + +The file extenstion .mma has been created. For song files using an +extension is optional, but for lib files using automatic groove +detection it is mandatory. Simply, when mma opens a file it first +checks to see if the filename as given exists. If it does not exist +AND the filename does not end with ".mma", the extension is added. The +deliberate exception is that when libraries are searched/processed +with the -g option only files with a .mma extension are processed. + +A lot of testing is done to make sure that files can be specified with +or without the .mma extension. And tests are done to strip the +extension when creating the midi file. If you find a bug here, please +shout at me! + +December 11, 2003 + +Added LYRIC command. See the docs for details, but the short version +is: + + lyric My lyrics are not so good. + +This adds the text in the current bar, so it should appear before the +chord data. Lyrics are added a MIDI Meta-event data ($FF $05) in the +Meta track. + + +December 17, 2003 + +The LIMIT command has been changed. No longer can you specify +different values for each bar in the sequence. Just didn't make +musical sense. Shout at me if you think you need it. + +December 19, 2003 + +Changed the defaults for searching for the library. We now set up the +path depending on what library can be found. + +December 22, 2003 + +Added DIRECTION UP/DOWN code to walking bass. + +Added -o option to display complete filenames as they are +opened. Handy to figure what lib files are really being used. + +Chord voicing: This has been a lot of work (THANKS ALAIN!). I think it +is working well enough to set it free in the real world. Please read +the new chapter in the reference manual dealing with voicing! This is +a big change and makes tracks much more musical. + + +December 26, 2003 + +Okay--this is a big release! And there are a lot of changes NOT listed +above (sorry). I'll try to be more prompt in future releases. And, +yes, I think we are approaching 1.0! + +Released 0.5. + +------------------------------------- + +MAJOR CHANGE: MMA is now modular Python! + +Install note: the python modules for mma MUST be in one of the +following locations: + + /usr/local/share/mma/modules -- the preferred location + + /usr/share/mma/modules -- alternate + + ./modules -- permits running from working dir + + +The library location has been changed. The standard lib is now in on +of: + + /usr/local/share/mma/lib/stdlib + + /usr/share/mma/lib/stdlib + + ./lib/stdlib + +The idea is that other template libs should be put into the lib +directory. + +This does create a problem for people with USE directives calling +standard files. You really should get rid of the USE and rely on 'mma +-g' and the database it creates, or change the paths in USE to include +the subdir. IE, change "use rhumba" to "use stdlib/rhumba". + +To complete this, we've modifed the -g code (and made it much +simpler). It now runs MUCH faster. It also scans subdirectories. And, +if there is a special file "MMAIGNORE" in a directory, that dir will +be ignored (including subdirs). + +The SetLibPath command has been modified. It now looks for a '+' as a +leading char in any of the args, or by itself. If found, ALL the paths +in the command are APPENDED to the current path; otherwise the libpath +is set to path(s). + +Rewritten part of the tutorial. Originally we used "Happy Birthday" as +an example song, but that song is under copyright (really!) and we +can't legally include the score for it. So, we're using "Fella Bird" +instead. + +Added MIDI command to send arbitrary MIDI data to any track. See docs! + +Added the IncPath directive. This sets the search path for MMAstart, +MMAend and Include paths. + +MMAstart and MMAend can now have multiple values. + +February 7, 2004 + +Again, way too long in releasing this. But, the modularization changes +keep biting back. I think it's stable now. Feedback appreciated! + +Fixed bug in random chord movement which caused chords to float off +the keyboard. + +February 9, 2004 + +Released 0.6 + +----------------------------------- + +February 10, 2004 + +The chord table has been changed. Duplicates are now listed in a +synonym table. Added code to properly handle this in the doc generator +as well. + + +Minor change to FERMATA. If the offset is negative (FERMATA -1 1 150) +then all note-on events in the specified beat are cancelled. See docs +for detailed explanation. + + +Added RIFF. A riff is a one bar override to an existing pattern. See +the new chapter on RIFFs in the docs. + +Better error detection in main module when loading modules. + +In specifying note durations the dotted and double dotted notation has +be added. So, "2." = "2+4" = "4+4+4"; "2.." == "2+4+8". + +The notation in patterns '3' was generating a 1/4 note triplet, not a +1/8 as advertised. Fixed (you may have pattern/lib issues). + +MIDI tracks are now automatically allocated. The -c command now parses +the entire file and then reports MIDI channel usage (no file is +produced). + +The MIDI commands for Portamento, Pan, TrackName and ChannelVolume are +now stacked in the track buffers. They are sent into the MIDI stream +when musical data is created for the track. This saves on creating +MIDI tracks with only directives, but no data. Also makes it easier to +assign these events to the track, not the channel. + +Add the MELODY and SOLO tracks. This lets you add any kind of music to +your tracks. Added the commands KEYSIG, AUTOSOLOTRACKS and HARMONY. +See the new chapter in the docs. + +I've spent a few days on the docs and have successfully implementing +latex2html for all the files. This means that there is now an HTML +version of the docs in addition to the ps standard. + + +Added COPY command. This takes a useful subset of parms from one track +and copies it to another. Useful in libs when you want a set of tracks +with the same articulation, voicing, etc. + +April 19, 2004 Released 0.7 + +--------------------------- + +MAJOR CHANGE IN TRACK ALLOCATION AND NAMES! + +1. Valid track names are BASS, CHORD, etc (just the base) and +the base plus a '-' and a string. This means that all +of the following are valid track names: + + BASS BASS-1 BASS-Sustaining-String + +However, the old notation of BASS1, DRUM5, etc. are NO +LONGER VALID. + +2. Tracks are now allocated dynamically and there is no limit +on the number of sub-tracks. To see what's happening +run mma with the -c option of a few existing songs to +see the track allocation. + +Sorry if this breaks your existing libs, but I think we need +some stable track nameing rules. This new naming scheme should +also permit more descriptive names in lib file for the +different tracks. + +The -c command line option has been modified to show the names of the +allocated tracks as well as the midi channel info. + + +Rewrote the harmony function. Valid harmony types are 2, 3, OPEN, +2ABOVE, 3ABOVE or OpenAbove. To disable harmony use a '-' or 0. +Harmony enabled for scale, arpeggio, walk, bass, solo and melody. Also +fixed bug in harmony when used with transpose (you really do need to +tranpose both the main and the harmony at the same time!) + + +Fixed some MS-DOS/WINDOWS problems. Added a 'b' to the open/file +statement when creating a midi file to force binary. Plus, the midi +file is now created in-memory with the possibly problematic +tell()/seek() being deleted. + +Large rewrite of the pattern define code. You can now do things like: + + Drum Define D1234 1 0 90 * 4 + + or even + + Drum Define D1234' 1 0 90 * 4 Shift .5 + +See the updated docs! + +When setting a sequence you can use a dynamically allocated pattern. +For example: + + Drum-Ugly Sequence { 1 0 99 * 4 } + + or + + Drum-Foo Sequence { D1234; 1.5 0 99 } { D1234 } + + +I've added this option since I find that an awful lot of defines are +just used once, and they _really_ should be with the sequence, not in +a separate block. + +Fixed sequence sizing error when restoring volume grooves. + +Added the ACCENT command. + +The entire chunk of code dealing with patterns and definitions has +been reworked and simplified: + + - Definitions are now stored in one big dict, they are not + + - saved or restored in grooves, they must exist when used in a + + - SEQUENCE, changing the def of a pattern after it is used in + + - a SEQUENCE has no effect on the seq. + + +Deleted optional notation for specifing a repeated bar. Used to be +that + + 1 Em / / / *2 // NOW ILLEGAL + +and + + 2 Em / / / * 2 + +were the same. (1) is no longer permitted. + +LibPath and IncPath are NO longer lists. Only one path can be +specified for either. The file search stuff has been rewritten as +well... searches now follow a simple line for opening all files. See +the docs in the paths chapter for details. + +The auto-groove stuff has been rewritten. The database is now stored +in MMADIR as a picked dataset. + +Added PrintActive command. Use when developing groove files to see +what is active at certain points. Debugging tool only! + +Fixed problem with overlapping ON/OFF events. This eliminates all +kinds of RSKIP/ARTICULATE problems. + +Walking bass routine reworked. Resulting patterns are harmonious (but +uninspired). + +Added DELETE command. This lets you delete an existing track, freeing +its midi channel for future use. + +Changed the TEMPO command ... if you use a '*', '+' or '-' modifier +this must be a separate token. Earlier we demanded "*.9", now we want +"* .9". Sorry, if this breaks anything, but it makes things more +consistent. + +The DOC suite of commands has been changed/simplified. The old syntax +of "DOC AUTHOR" or "Doc Note ..." is no longer recognized. Instead, we +have three doc methods or commands: + + 1. Anything after a DEFGROOVE is passed to docs to be saved as + as description. 2. AUTHOR - this saves the "author name", + but is not currently used. 3. DOC ... - this saves the + data for use in a lib file header. + +See the docs or just look at some of the included lib files. + + +The '/' is NOT permitted in a groove name. This is now reserved for a +future use idea. + +June 25, 2004 + +Released 0.8 + +--------------------------- + + +Running status has been implemented for the generated MIDI files. This +is actually pretty simple to do and generates MIDI files which are +about 25% smaller. Don't know if there are any other savings, but it +seems to be the "right thing" to do. If you DON'T WANT running status +generation use the "MidiFile Running=0" directive. + +You can now generate type 0 MIDI files. Some players only play these, +so you have the option. The command "MidiFile SMF=" sets this to +1 (default) or 0. I suggest adding this to your mmarc file. There is a +cmdline option for this as well '-M x' where x is 0 or 1. This will +override the setting in the RC file, but not in your song/init/groove +files. + +Added RANGE command. This applies to the number of octaves a scale or +arpeggio uses. Note: scale used to use COMPRESS for this...COMPRESS +does nothing for scale. + +DUPLICATE was transposing already transposed notes for very +interesting effects. + +I have done a lot of increased modularization. I had a bit of fear +that this would slow processing, but I see no such effect. And smaller +modules should make code writing easier! + +When creating a track MMA no longer sets the default channel volume to +100. It is left as is. Either set the volume in an include file (see +includes/init.mma for an example), or do a explicit TRACK +CHANNELVOLUME command in your groove or song file (or even a mmastart +file). This is done the way it now is to avoid having MMA do things +behind your back... + +Opps, I wasn't opening the database file in binary mode...so sorry if +you are using an OS from Redmond which requires this. + +July 5, 2004 + +Released 0.9 + +------------------------------ + + +Fixed up the -g option so that only new/modfied/deleted library files +are processed. Greatly speeds up this operation! + + +MAJOR change to the way bass patterns are defined. The note offset +MUST be a '1', '3' or '5', referring to the root, third and fifth of +the scale. + + +Python version change: Minimum version for Python has been upped to +2.3. Since this version was release in Aug/03 I don't think we're +pushed too many envelopes on this. + +Added internal macros $_Volume and $_LastVolume. + +I will drop DEFVOLUME/SETVOLUME from the next release unless people +really want it left in! I find that the code is ugly and quite +useless...it really doesn't do what people expect. Easier, if you need +to save a set of volumes for differnt inst. settings, just to do a +DefGroove to a private name. + +In the library docs the grooves are listed in the order in which they +are defined. There is probably a reason for having defines in the +groove files in a certain order and the reporting should abide by +that. + + +The channel assigment code has been tweaked a bit. CHSHARE no long +complains about duplicate assignments. Added ChannelPref command (see +docs). + + +2 new variables: $_DEBUG and $_LASTDEBUG reflect the current state of +the debug flags and the state before the last "debug xxx=yy" +command. This value can be used to reset the debug state after a temp +change. + +Added a MALLET command to reiterate notes in solo/melody tracks. Makes +things like marimbas should quite cool. See docs in the SOLO +section. See the sample song "Yellow Bird" for an example usage. + + +Added -G command line opt. Same as -g, but forces creation of +completely new database. + + +The VoicingMode and friends syntax has been changed :) The command +VoicingMode, VoicingCenter and VoicingRange have been deleted. New +command is VOICING with the option pairs MODE=XX, RANGE=xx, CENTER=xx, +RMOVE=xx, DIR=xx. See docs. + +Minor changes to install script. + +July 25, 2004 Released 0.10 + +-------------------------- + +The DefVolume/SetVolume code has been deleted from the code and the +docs. A "good idea" gone forever :) + +Added the VoiceTR command. This lets you set up a voice name +translation table. Handy if you have a non-GM MIDI synth or want to +use difference voicings with library files. + +The LYRIC command set has been changed, mostly just to get all the +lyric stuff into one container. Gone is LYRICVERSE. And the command +LYRIC now is used for all LYRIC options. Details in docs. As well, you +can specify the beat for a lyric syllable--just enclose it in <>s The +set [<3>Pick Up] will start the lyrics on beat 3. Useful in a pickup +bar situation. + +Added the UNIFY command. If you set UNIFY for a track overlapping note +ON/OFF events will be combined into one long note. So, if you're doing +a sustained background note use: + + Begin Chord-Sus Sequence {1 1 90 * 4 } Voice Strings + Articulate 100 Unify 1 End + +This should generate more pleasing results than using a half or whole +note sequence and will obey chord changes on each note. See docs. All +supplied grooves have been fixed to use this. + +To aid creation of BASS patterns ... you can specify an octave offset +in the offset. So, in addition to an offset of '1' you can have '1+' +or '1++' or '1-', etc. + +MIDISeq - New command permits MIDI controller data to be sent at every +beat (or partial) in a bar for each track. + +MIDIVoice - New command permits MIDI controller data to be sent with a +VOICE setting for each track/bar. + +MIDIClear - Recommended command to undo the effects of MIDIVoice/Seq +at groove changes and file end. + +MIDIDEF - definition class for MIDISeq/Voice/Clear. + +Added docs for midi controller names. Added -Dcm and -Dca opts for doc +printing. + + +IMPORTANT NOTATION CHANGE in the MIDI command: Previously the args +were to be in hex; this has been changed. You can enter the value +'0x7f' as '0x7f' or '127' or even (if you like octal) '0177'. In +previous versions of mma we insisted on '7f' ... this will no longer +work. + +Sept 21, 2004 Released 0.11 + +-------------------------- + + +Timesig is properly set, only when needed. It's also saved as part of +the GROOVE. + + +Major change to BASS patterns. First off I've put tables into +MMAchords.py which represent scales associated with different +chords. I think they are all correct, but proof reading is +welcome. These scales are used to select bass notes, instead of taking +the notes out of a chord. The result is that you can now specify any +of 1 to 7 as the noteoffset to select in a bass pattern. This makes +bass much more versatile. + +BASS pattern note offsets can also have a "+ - # b or &" added to +represent an alternate note. The "+ -" are for octaves, and can be +concatenated. For example, a note offset "5++" would be the fifth of +the scale (a "g" in a C chord) 2 octaves above the normal note. The +note offset "6#" would be the 6th raised a semitone (we use this in +the boggiewoggie style). + +To keep chord names and note names similar, you can not use '&' as +well as 'b' to designate a flat. The chords 'E&' and 'Eb' are the +same. + +The SCALE track has be revamped to use the new scale tables. The +SCALETYPE options are now limited to CHROMATIC and AUTO. I've also +attempted to keep the scale running to the next note even when chords +change. Also, changing SCALETYPE or DIRECTION will now reset the scale +to restart at point 0. + +The WALK track now uses the scale tables. This should be transparent +from older versions, but faster. + +Fixed minor problem with drum tracks not getting a default +voice. Added code to signal current voice set in shared tracks. + +Added harmony types: 8 or 8BELOW - single note one octave below 8ABOVE + - single note one octave up 8BOTH - two notes, one octave + below and one above 16BOTH - two notes, 2 octaves below/above + +AUTOSOLOTRACKS: This list now has a dual purpose. First, it assigns +solos to tracks in chord lines (as before). Second, it is parsed +before each chord line and any assigned tracks set as HarmonyOnly are +filled with Note data from the first line. See docs for details. + +MIDIVOICE: I've added/duplicated the loops so that data can be sent +BEFORE or AFTER the controller voice data. Seems that some controllers +are reset by a voice, others not. My experiments show that BANK should +be sent before, most others AFTER. So, we use the beat offset: 0 -> +before; 1 (or anything not 0) after. Egs: + + Voice Piano1 MidiVoice {0 Bank 5} + + results in: + + 0 Param Ch=xx Con=00 val=05 0 ProgCh Ch=xx Prog=00 + + Voice Piano1 MidiVoice {1 ReleaseTime 100} + + results in: + + 0 ProgCh Ch=xx Prog=00 0 Param Ch=xx Con=72 val=80 + + +Just the order is changed, but a sequencer should send items in the +right order. + + +RIFFS: A new command, RIFFS (not RIFF) lets you set multiple riff +lines (for solos or sequences) in a stack. See the docs or the sample +file egs/riffs.mma. + +LYRICS: Yes, a new command option "Lyric Set stuff" lets you define +lyrics in a command line. See the file egs/lyrics.mma for +example. Neat thing is that it works much like RIFFS so you can stack +all your lyrics in one place. Your mma files should look neater with +this :) + +REPEATEND: Added optional counter. Now, "REPEAT..REPEATEND 2" will +cause a a total of 3 copies to be made. "REPEATEND 1" is the same as +the default. A bit of odd behaviour with REPEATENDINGS, but this +seems to be a logical way to handle things. + +Added ~ notation to solo lines. A ~ as last note-event means to not +warn about too-long lines. In addition, the extra time is saved for +the next line. If a line starts with a ~ and the previous line ends +with ~ as well the extra time is squeezed into the new bar. This makes +it easy to handle notes which are tied across bar lines. Also, you can +have empty events by using just a <>. This is covered in the docs +better, but consider this: + + z {4a;b;c;1+1+4d~;} z {~<>~;} z {~4a;} + + +Added the ability to include arbitary MIDI files into a MMA generated +file. See the docs and/or the files in eg/frankie. + + +Fixed bug in the voicing RMOVE code. I think the limits now work +properly and we no long have chords walking into the bass domain. + +Dec 3, 2004 Released 0.12 + +-------------------------- + +Added note '6' for 1/16 triplet and '5' for 1/8 note quintuplet. + + +Slash chord (ie. F/C) are now supported. There are 3 possible slash +combinations: + + - C/E - simple inversion D/C - addition of maj7 as bass note + - ("in the scale") D/G# - addition of a aug4 as bass note + - ("out of scale") + +The first 2 forms are supported, the final causes an error. + +Added a longish note on libraries in the paths section of the +documenation. + + +Added DEFCHORD. This permits you to define a new chord type in a mma +file. Syntax is detailed in the manual, but: + + DefChord NAME Notes Scale + + name is case INsensitive Notes are chord + offsets. Enclosed in () and comma separated. + (eg. Major Chord is ( 0, 3, 5) Scale are scale + offsets. Have to be 7. Enclosed in () and comma + separated. (eg. Major Chord has (0,2,3,5,7,9,10) + +Added PrintChord. Prints the notes/scale associated with an existing +chord. Useful to cut/paste to create new chords with DEFCHORD. + + PrintChord maj7 m7 dim + +will print the existing defs for a "maj7", "m7" and "dim" chord. + +Added ChShare* command. Exactly the same as ChShare, but no warning +printed. This is probably a shortlived addition, so you might NOT want +to use it :) + +Chord patterns can have 'direction both' which causes strumming to +alternate directions. + +The system macros have been completely reworked. They are now all +dynamic, so they don's show up in a ShowVars command. In addition, a +number have been added, in particular look at the $_TrackName_xx +macros ... these are useful in situations like when you do a +ChShare. See docs ... quite a bit on this. + +Added warning if you select a track-groove with no sequence. + + +March 21, 2005 - released 0.13 + +-------------------------- + +CHSHARE* is gone. + +CHSHARE has been changed a bit so that the current voice and octave +from the old track are now copied to the new track. In most cases, +this is what you will want. I really don't think that doing chshare is +a great idea unless it's really needed due to running out of MIDI +tracks. Makes for subtle problems and more difficult debugging. + +VOICE - if you change voice in a track which has been CHSHAREd, a +warning will be printed. + +OUTPATH: This setting can be done in the song file now, not only in a +MMAStart. + +System macros $_AutoLibPath, $_LibPath, $_IncPath and $_Outpath +added. Well, a lot more than that ... best to check the docs for the +current list of system variables. + +A major change to the auto groove loading database. Please read the +manual in the PATHS/FILES section. Autolib variable and setting +added. If you have a MMADIR file in your mma/lib directory please +delete it. The database(s) are now stored in files named '.mmaDB' in +each subdirectory in mma/lib. + +Variable can be concatenated in SET. For example, + + Set a foo bar Print $a > foo bar Set a foo + bar Print $a > + foobar + +A chordname can start with a single "+" or "-". This will move the +chord and scale up/down one complete octave. Useful for chromatic +chord runs when the octave shifts the wrong way. Also, a secondary +octave adjustment has been removed (hopefully this will avoid some +awkward shifts). + +Added new command ALLTRACKS. This loops though all currently defined +tracks and applies the given command. Eg: "Alltracks Articulate 90". + +With ALLTRACKS working the global versions of CHANNELVOLUME, RSKIP, +RTIME and RVOLUME have been deleted. Use the track specific versions +or use ALLTRACKS. I think that this is more explicit and easier to +follow. + +Increased permittable ARTICULATE values to 200 (which means that notes +will sound 2x as long as requested). Values greater than 120 will +generate warning (the 200 limit is just something self-imposed). You +might find values in the range 100 to 120 handy to force long and tied +notes. + +Fixed DOWN DIRECTION in Scale tracks (it now works). + +Fixed annoying bug which sometimes put VOICE changes after the first +note in a track (RSKIP could put first note before bar start). + +May 14, 2005 - released 0.14 + +---------------------------------- + +Fixed Voicing so that "Rmove=0" is legal. Validation didn't accept +"0" and this created a system macro problem. + +Fixed MidiClear to take at the start of a groove switch, not the +end. If done at the end the data was gone. + +The (de)cresc code has been modified to take an intial "start +volume". So, instead of doing something like: + + volume pp + Cresc mf 8 + +you can now combine this to: + + Cresc pp mf 8 + + + +The ACCENT code has been tweaked and you can now have a different set +of accents for each bar in the seq. To use this you have to set +different bars in {}s. The old method still works. Egs: + + // accent drum on beats 1 and 3 + + Drum Accent 1 20 3 20 + + // same as above for bars 1/2/3, on 4 do beat 1 only. + + Drum Accent {1 20 3 20} / / {1 50} + + +A new command, DrumTR, as been added. This is similar to the existing +VoiceTR command, but translated drum tone selections. + +Added VoiceVolTr and DrumVolTR. Same purpose as DrumTr and VoiceTr +... in both cases the volumes assigned to certain tones are +adjusted. Read the docs. + +The RC FILE logic has been changed a bit. First, the order for +checking for RC files now FOLLOWS the order in the docs. Second, the +reading of RC files ends when the first one has been found. If you +want multiple RC files read, include the others in the top level. + +Don't know what I was thinking at the time, but most of the minor +scales were wrong (the chords were okay). + +Fixed bug in tilde continuation in solo notation. + +Added ChordAdjust command. This moves selected chords (by pitch) +up/down one octave. See docs. + +Fixed Solo tracks so that tracks without data are properly converted +when HarmonyOnly is set. Whatever code was in previous versions was +dumb and wrong. + +July 22, 2005 - release 0.15 + +------------------------------- + +Added NOTESPAN directive (mostly to duplicate accordion bass). Added Macro +$_TRACK_NOTESPAN. + +When calculating a note length you can subtract as well as add. So, to +get a note just a bit shorter than a full bar, you can do something +like "1-0" which generates a note 1 midi tick shorter than "1". + +The code which set the keysig in the MIDI track was broken. Fixed. + +You can now use names like "F" or "G#" when setting the key signature +(as well as 1b, 2#, etc). See docs. + +ALLTRACKS has been fixed, and now has an optional track type +parameter. See docs. + +For all volume commands you can now specify the volume as a dynamic +string (ff, mp, etc) a value (10,30, 100, etc) or an percentage +adjustment (-10, +30, etc.) + +The various volume macros now print numeric values instead of guessing +at the closest musical string. + +Subdirectories in the lib directory were not properly initializing the +.mmaDB database file. + +When defining patterns you can specify a beat from 0 to 4.9 (assuming +4/4) rather than 1 to 4.99. Any chords player in the 0 to .999 range +will be played in the previous bar, but with the current bar's +chord. Nice for push chords in jazz. A warning will be printed for all +patterns with 0 to .99 offsets. + +Added 81 and 82 notes. 81 is the first of a swingskew 8th, 82 the 2nd. + +Added SWINGMODE command: args ON/OFF en/disable swingmode. Skew=xx +sets the rate for paired 8ths. You need to use the special 81 and 82 +notation for this. See docs ... it's way too complicated for this file. + +Added STACKVALUE command. This puts its args on a stack. You can +retrive with $_STACKVALUE. Handy to save/restore settings in a section +without needing a 'real' variable. + +Oct, 2005 - release 0.16 + +------------------------------- + +The SEQNORND command has been removed (use SeqRnd OFF). + +SeqRnd has been enhanced. You now need to specify ON or OFF, plus in +global mode you can specify the tracks to apply rnd to. See docs. + +Added macros $_SeqRnd and $_TRACK_SeqRnd. + +Fixed bug in INVERT - thanks to Matti Jokinen. + +The notes C# and Cb were left as natural in Solo/Melody (a result of +the swingmode hacking). Also, the note C below the staff was not +generating a harmony note. Sorry ... important enough to force an +interm release. + +Oct 8, 2005 - release 0.17 + +------------------------------- + +AutoSoloTracks: If there was a trailing space in the first solo an +error would occur with the auto track. Lines like {1c ; } didn't parse +properly for the 2nd track. + +When a variable set with MSET is epxanded the current state of BEGIN +will be honored. Have a look at the song "All of Me" to see how this +feature is used to create a solo riff in 2 tracks. + +The Begin/End code has been rewritten. I think it belongs in the parse +code, not the file. + +Mset macros with only one line now work. + +TEMPO: Changed again. Sorry. But, to make this consistent I've decided +to change the syntax once again. Now, you MUST NOT have a space +between the "+-*" and the value. So, to double the tempo use "Tempo +*2". + +Warning messages now display filename as well as line number. + +The RIFFS command has been deleted. The singular RIFF now handles +single and multiple settings. + +Added the note lengths '23' and '43' for a half note and quarter note +triplet. + +SEQCLEAR no longer deletes/clears info for SOLO tracks in global +context. Note, that "Solo Seqclear" still works as before. This change +is in keeping with the "gooves etc don't effect solo tracks" concept. + +DUPLICATE. Gone! This was a command inserted in early development, +before we had unlimited tracks, etc. And it never really worked ... if +you want to duplicate a voice into a different octave, etc. just +create a new track. + +From the command line it is possible to define a macro: -S foo=bar +will set the macro $foo to the value 'bar'. + +Added CHORDS option to LYRICS. This copies the chord line as a lyric +event. So, your karaoke player can display the chords as they go +though the song. And while screwing with Lyric I've added a lyric +macro ... not that useful, but can be used in debugging. + +A further enhancement to set volumes: you can set a volume with a +string and inc/dec that by a percentage. Example: ff+10 will give the +'ff' setting plus 10%; mf-10 will give the 'mf' setting minus 10%. + +Adjustvolume: 2 changes ... set the changes as "mf=xx" pairs; the 'xx' +can be an existing volume, ie "mf=f+200" sets the volume "mf" to the +"f" volume plus 200%. + +Nov 3, 2005 - release 0.18 + +--------------------------------- + +The lyrics->chord option wasn't discarding leading "-+". + + +GOTO has been improved. Now all lines with a leading linenumber are +considered to be labeled lines. So, it is now easy to jump to a +section without having to set a label. Handy if you want to just test +the last few bars of a song. Still doesn't work in repeats :) + +A new "pattern" has been added to the "Sequence" command. You can now +use a single "*" to indicate "use existing pattern". This is useful if +you want to create a modification of an exisiting sequence. Example: + + Drum Sequence D1234 D1 + Drum Sequence * D24 + +The 2nd sequence will really be "D1234 D24" + + +Added default Tone to Solo tracks if they are DRUMTYPE. This is set +with a "Trackname Tone xx". It just means that you don't have to set +the initial tone in a solo string. Also, you can use the special name +"*" in a solo drum line to force the use of the default. + +The MALLET option has been enhanced so that it now works will all +tracks, not just SOLO/MELODY as before. + +Lyrics now support transposed chord names with the Chords=On +option. It DOESN'T look at the global transpose setting, so you can +have transposed chord names (perhaps for cappo?) other than the chord +names in the mma file. See docs. + +For some unknown (to me) reason volumes were being applied +stupidly. In previous versions the base velocity was muliplied by the +track and master percentage ... now, the base is mulitplied by the +combinations of the track and master. This gives more consistant and +broader volumes. + +Added volume "m" and use that as default. This is set to 100%. + +The ratio of the master vrs. track volume can be adjusted with the +VolumeRatio command. Default applies 60% of the track volume and 40% +of the master. + +Solo/Melody tracks had a funny initial velocity. They now default all +notes to a velocity of 90 ... this is adjusted by the track and master +volumes. You can't change the 90. + +A bit of fiddling with REPEATs now permit using 0 and 1 as the +count. See the docs and the example file 'repeats'. This lets +you skip entire repeat sections. Handy for debugging and setting up codas. + +VEXPAND -- somewhere along the way this was broken. Fixed. + +LYRICS BARSPLIT -- was broken, fixed. + +Added macros $_VExpand, $_BarNum and $_LineNum. SHOWVARS can now take +args (which vars to print). + +Tweak to (De)Cresc. Previously the first bar after the Cresc was +played at an increased volume (or decreased for Decresc). Now the +first bar is played at the current volume. This makes sense in the +case of commands like "Cresc PP F 4" ... the first bar will now be at +PP, the 4th at F and the other 2 something inbetween. + +Added -Dk command line option. This will print out a summary of the +various keywords MMA uses. This is meant to help folks writing editor +extentsions for MMA. + +Dec 24, 2005 - release 0.19 + +--------------------------------- + +Bug in Sequence "*" when existing pattern was NULL fixed. + +Solo tracks were not doing ARTICULATE. + +In just about all cases where an integer value is expected you can use +hex or octal notation. Shout if I missed something. Mainly done to +support inc/dec for hex macro values. + +Some additional harmony modes added. + +Minor bug fixes. + +March 8, 2006 - release 0.20 + +----------------------------------- + +Fixed warning report when unknown track is used with "Track Groove". + +MAJOR change to the modules stuff. I've done a bit better at using +Python standard packaging methods. As a plus, the code seems to run a +bit faster. From a user perspective, the only real change is that the +modules directory has been renamed MMA. + +Fixed a few mistakes in midiInc ... misspelling of char() instead of +chars(). + +Lyric and Text events can now be copied via a MidiInc command. See +docs. + +April 6, 2006 - release 0.21 + +----------------------------------- + + +Added GROOVE list. You can now have a list of grooves (instead of just +one) on a GROOVE command directive. This is for alternating time sigs, +or if you want a quick & dirty change between alternate bars. ALTERNATELY, +you can start a list of grooves with a , and the specified groove will +be used. Handy for changing gooves in repeated sections. Minor change: you can't +have an integer as the name of a groove. + +Fixed -c option, now shows channel assignments. + +Added HarmonyVolume ... default harmony notes are 80% of main note. + +Changed the harmony settings: the number of modes has been reduced, +but you can concatenate them like OPEN+8BELOW, etc. See docs. + +Harmony now gets its own manual section. + +Added optional 'cut' and 'common' settings to TIMESIG. + +Added -i option to specify the RCfile to use. + +Modified -Dk to be a bit more machine friendly ... no extra formatting. + +Fixed parse bug. Lines with only a line number were causing an eof. + +The routines extracting lib info reported tracks which had no sequence set. + +Added ForceOut command. This forces the output of MIDI Voicing commands to +"empty" tracks. Neat to set the keyboard channel with a song. See manual. + +June 26, 2006 - release 0.22 + +----------------------------------------- + +I just discovered that python 2.4 has sorted() as a builtin :) So, I've gone +though the MMA code and changed a bunch of sort() to sorted(). + +Added RNDSEED command. + +September 1, 2006 - release 0.23 + +----------------------------------------- + +MidiInc: Added a bunch of warnings, added Start and End options - this permits +the inclusion of selected part of a midi file. The filename is now expanded for tildes. + +Added MIDISPLIT so that each note in a track can be output to a different midi track. + +Split out the midi.py file into midiC.py, midiM.py and midi.py. + +Added SeqRndWeight for global and tracks. This is potentially very useful. Read the manual! + +Added $_TRACK_Channel macro. Returns currently assigned MIDI channel number. + +Added TRACK MIDITNAME command. This sets the track name (in the midi file) to something other + than the MMA track name. + +Added an inversion option to chord notation. You can specify an inversion + with CHORDNAME>N where N is -5 to 5. This indicates the number of + rotations to do. Handy if you want to avoid slash chords, but want a special sound. + This documented in appendix A.1 of the reference manual. + +The tutorial now has a "library creation" section. Thanks to Rony Steelandt. + +Added RndSet. Sets a variable randomly from a list: + RndSet A 1 2 3 4 5 +Sets $A to one of the values. + +Added MIDIMARK. Inserts a midi marker at the specified offset. + +Command name changes: + PAN -> MIDIPAN, + PORTAMENTO -> MIDIGLIS and + CHANNELVOLUME -> MIDIVOLUME. + These changes make all the MIDI commands somewhat more consistant. + +September 25, 2006 - Released 1.0-RC1 + diff --git a/mma/text/CONTRIB b/mma/text/CONTRIB new file mode 100644 index 0000000..759ade5 --- /dev/null +++ b/mma/text/CONTRIB @@ -0,0 +1,35 @@ + +This file will attempt to list those who have helped in the development +of MMA. If you've been missed, let me know! Each and every contribution +is truly appreciated. + + +++++++++++++++++++++++++++++++++++++++++++++++++ + + THANK YOU THANK YOU THANK YOU THANK YOU + + +++++++++++++++++++++++++++++++++++++++++++++++++ + +Alain Brenzikofer -- pushed the development of the + chord voicing routines and contributed most of the code for this. + +Raphael Goulais -- official Debian maintainer. + +Michael Mlivoncic -- pushed me into do adding + the MIDIvoice and MIDIseq commands. Plus some general debugging and + wrote the WINDOWS installation web page. + +Austin Acton -- Mandrake RPM packager. + +Lawson Hanson -- detailed manual + proofreading and corrections. + +David Asorey Álvarez has done a Spanish tutorial: + http://www.laclavedefa.org/tutorial-mma/index.html + and has packaged MMA for Windows: + http://winmma.sourceforge.net/ + +Eric Le Bras has packaged MMA for the Archlinux distibution + (www.archlinux.org). The build for the package is: + http://aur.archlinux.org/packages.php?do_Details=1&ID=6717 + +Rony Steelandt of Kara Music Production wrote the "creating a library" + tutorial, lots of debugging, suggestions on random ordering, + and encouragement. \ No newline at end of file diff --git a/mma/text/COPYING b/mma/text/COPYING new file mode 100644 index 0000000..60549be --- /dev/null +++ b/mma/text/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/mma/text/FAKEBOOKS b/mma/text/FAKEBOOKS new file mode 100644 index 0000000..53e62b3 --- /dev/null +++ b/mma/text/FAKEBOOKS @@ -0,0 +1,28 @@ + +Just a short note about Fake Books (and I suppose other books or +sheet music) and the chords they show for songs... Quite often +the chords are wrong! Don't be misled into thinking that just +because it's published that way it's right. I've found the same +error in not only one book, but I've seen the same error duplicated +in different books by different publishers. In many cases you'll +see a song published in many different books all by the same +publisher, and the mistakes are faithfully copied in each volume. + +So, if a chord in a song doesn't "sound right": + + - it might be a bug in MMA, + - it might be your ears, + - it might just be a dumb song, + - it might be a typo on your part, + - it might be a bad chart. + +You will need a bit of musical education to track down some +problems, or a musician friend. But, if you see something like +a "Em" chord in the key of B-flat and it sounds "odd", you +probably would be well to try a E-flat or E-flat-minor +chord instead. + +Don't even ask how I know all this :) + +bvdp, July/04 + diff --git a/mma/text/FAQ b/mma/text/FAQ new file mode 100644 index 0000000..6c32a1e --- /dev/null +++ b/mma/text/FAQ @@ -0,0 +1,3 @@ + +For some FAQs, please see the postcript documentation chapter FAQ. + diff --git a/mma/text/INSTALL b/mma/text/INSTALL new file mode 100644 index 0000000..ca37f35 --- /dev/null +++ b/mma/text/INSTALL @@ -0,0 +1,98 @@ + +MMA is a Python program. If you don't have Python installed you should +do this first. You'll need version 2.4 or greater of Python for MMA to +work. Python is available for most operating systems at: http://www.python.org + + +MMA consists of several parts. They should be installed as follows: + +1. The main executable script, mma, should be in /usr/local/bin or + somewhere else in your executable path. + +2. A number of modules which MMA needs. They should be installed in + /usr/local/share/mma/MMA. + +3. Some other files used by the library and user extensions. These are + installed in /usr/local/share/mma/includes. + +4. The standard MMA library. These are a number of style files. They + are installed in /usr/local/share/lib. + +There are 2 install scripts you can use. + +The first and recommended one is a shell script called ln-install. +This simply creates the symbolic link /usr/local/share/mma pointing +to the current directory where the uncompressed tar file you downloaded +exists. I have used the link method for years now and it works fine. +The only problem you have with this is that you must not delete +or move the files from the tarball. + +ln-install just has one line of code, a ln line. You must be root for this +to work: on a Linux system the command: + + su -c './ln-install' + +should be fine. If you have previously run this script it will fail since +the directory link it is creating already exists. As root delete that one +link and all will be fine. + + +The second method copies all the files in the distribution to +/usr/local/share/mma. To do this just run the script 'cp-install'. +You must be 'root' to do this. On a Linux system the command: + + su -c './cp-install' + +should work just fine. If it doesn't work, you might need to use: + + su -c 'python cp-install' + +or some varient which finds Python. If you don't have Python +installed, go back to the top of this file! + +The install file runs MMA with the -G command as its final step. It is +important to let this happen: + +1. It updates the auto-load library data base, +2. It will create the compiled python modules while you are still + logged in as 'root'. + + +If you want to install the python modules in the python +tree, that will work. Just create a file called 'MMA.pth' +in the python/site-packages directory, a directory called +'MMA' and copy the contents of the MMA directory in this +distribution to that location. However, you will still need +to have the library and include files in a location known to +MMA. For this reason, we really do recommend that you install +all of MMA in the recommended location. + +You can if you want install the main MMA tree in /usr/share without +changing MMA. But, the install script will need to be changed. + +You can change this to something else entirely. You'll have to make +changes to the main mma executable to reflect the location of the +module directory AND the gbl.py file for proper library file +locations. We really don't recommend you do this. + +You can run MMA from the directory you unpacked it in as well without +installing. Just issue the command './mma someMMAfile'. + + !!!! NOTE FOR UPGRADING MMA !!!!!! + +If you run the install script the existing /usr/local/bin/mma will be +overwritten and your existing /usr/local/share/mma directory will be +renamed to /usr/local/share/mma-old. You will received prompts for +this before action is taken. However, if you already have a backup +directory you will need to delete this by hand. This just a bit of +safety so I don't get blamed to deleting stuff off your (or my) hard +drive. + +Exercise normal prudent behaviour with backups, etc. Pay attention to +any songs you might have stored in your mma directory tree --- they +should NOT be there, but ... + + +Shout if problems! + +bvdp, March/2006 diff --git a/mma/text/README b/mma/text/README new file mode 100644 index 0000000..0b0c3ce --- /dev/null +++ b/mma/text/README @@ -0,0 +1,22 @@ + +MMA - Musical MIDI Accompaniment + +(C) 2002 - 2006 Bob van der Poel + +MMA and the various files supplied in the distribution are released +under the GNU General Public License. For additional details refer +to the manual included in this distribution. + +There's a lot going on with this program--please read the fine manual. + + +This is a BETA release, so please be forgiving in reporting bugs and +shortcomings. However, don't let the term BETA dissuade you from trying +the program! It does produce very useful backing tracks! + + +Comments, etc. appreciated: bvdp@xplornet.com + + +Bob van der Poel, Feb/2002 + diff --git a/mma/text/SLASHCHORDS b/mma/text/SLASHCHORDS new file mode 100644 index 0000000..eb7d867 --- /dev/null +++ b/mma/text/SLASHCHORDS @@ -0,0 +1,95 @@ + +If you start to transfer music from fake books to MMA you'll find +chords which look like C/E, Dm/C or Am/C. These chords are called +"slash chords". + +Unfortunately, the notation used by arrangers and composers who +create fakebooks and lead sheets in not nearly as standardized as one +might like. And, when it comes to slash chords, the standard is far +from firm. So, what to do in MMA? + +Let's look at the different ways that slash chords are used, but +first lets revisit the method used by MMA to create a chord. MMA has +a set of tables which represent each type of chord in terms of MIDI +note values. These note values are adjusted for the particular scale. +For example, the "notes" for a Major chord are stored in the table as +(0,4,7). If you specify a F Major chord the notes will be converted +to (5,9,12), which corresponds to F,A,C. In addition, each chord has +a list of notes for a corresponding scale. A Major chord will have +the notes for a Major scale, etc. So, in the previous example, a +scale list (5,7...16) representing the notes F,G,A,Bb,C,D,E is also +created. + +So, on to the slash chords ... we'll show different types and what MMA +does and doesn't do. + +The easiest case is the simple inversion. In this case the slash note +will be a note in the chord. Examples include Am/C, A/C# and C/E. +MMA handles these by: + + - Rotating the chord so that the slash note becomes the root. An + Am/C chord (A,C,E) becomes C,E,A; the C/E chord (C,E,G) becomes E,G,C. + + - Rotating the associated scale. In the case of Am/C the scale + A,B,C,D,E,F,G becomes C,D,E,F,G,A,B. + +This may OR MAY NOT effect the output, especially if you have enabled +MODE=OPTIMAL which may do chord rotation on its own. In most cases the +bass notes will be effected. + + +The next case encountered is a slash note which is not in the chord, +but is in the scale. Example of this include C/B and Am/F. A C Major +chord does not have a B note in it (although a B Major 7th chord +does), but the scale associated with the C Major chord C,D,E,F,G,A,B +does. So, MMA leaves the chord alone and rotates the scale to +B,C,D,E,F,G,A. Scale lists are used for bass and scale patterns. +Since scale patterns are mostly circular, the effect on these +patterns is negligible; however, for bass patterns the root note (1) +will be changed from C to F ... which is probably what you want. +However, note that the 5th is also changed from G to F which might +NOT be what you want. + + +Yet another slash notation is to have the slash note as neither a +scale or chord note. For example, one might want a C chord with the +dominant 7th played ONLY in the bass. The notation for this would be +C/Bb. If you encounter this, just change the chord to C7 and you'll +probably be as close as you're going to get. We've played with +different methods of handling this and haven't come up with anything +satisfactory. We considered the following (all of which ignore the +chord notes): + + - Just adding the Bb note to the scale. But, that's quite dumb since + in the case of C/Bb we'd end up with a scale Bb,C,D,E,F,G,A,B. Not + only is this 1 note too long (all scales are 7 notes long!) it has a + B and Bb in it. + + - Add the note and drop the extra note. In the above case this gives + us Bb,C,D,E,F,G,A. Perfect! But, what if we have C/Eb? If I saw this + in a chart I'd probably figure that we want a Cm chord with the Eb + played only in the bass. But, really, it could be just about + anything. And, if we followed the add and drop routine we'd have + Eb,C,D,E,F,G,A,B, which leaves that nasty E. + + - Find a "close" note, substitute and rotate. Well, not a bad idea. + In the case of C/Bb we could parse the scale and discover that B is + only one MIDI value away from Bb. Okay, lets change the B to a Bb and + rotate. Perfect ... but, the note A is only one value out too. So, + maybe that's the one to modify. If we had the tables listed as note + names instead of MIDI values this might be simpler. But, as it is ... + well, it's just not going to be reliable. + +So, in this case MMA just reports a failure, but doesn't barf. + + +In some charts (not so much new ones, but you never know) you'll see +things like Cm/9 or even Cm/dim. One can only guess at the meanings +... and MMA avoids guessing. So, in these cases it just reports an +error. + + + +bvdp, December/04 + + diff --git a/mma/text/SYNTHS b/mma/text/SYNTHS new file mode 100644 index 0000000..ba054a9 --- /dev/null +++ b/mma/text/SYNTHS @@ -0,0 +1,89 @@ + +A quick note on synths, instruments, volumes and the MIDI +standard. + +First, the MIDI standard says nothing about what a certain +instrument should sound like, or the relative volumes +between instruments. The GM extension helps a bit, but only +a bit, by saying that certain instruments should be +assigned certain program change values. This means that all +GM synths will play a "Piano" if instrument 000 is selected. + +But, if I play a GM file on synths A and B it will sound +quite different. + +The files supplied in this distribution have been created +to sound good on the author's setup: A Casio WK-3000 +keyboard. + +The author is aware of the fact that the files don't sound +very good using different setups, including the Linux +softsynth Timidity. + +Frankly, we're not sure how to handle this problem, but +giving it a minimal thought we suggest that changes be made +to volume settings in the groove files wrapped in +conditionals. So, if you are using Timidity, we'd suggest +the following: + +1. Set a variable in your ~/.mmarc file: + + Set Timidity-Volumes + +2. In the groove files modify the volume settings like this: + + Begin Drum-Snare + Tone SnareDrum1 + ...other settings + Volume mf + If Def Timidity-Volumes + Volume p + Endif + End + + +or .............. + +You might want to create a parallel set of groove +definitions. In your set, which would be included by +redefining the libpath variable in an init file, read the +supplied groove file and then modify the volumes (or even +instrument settings). The advantage of this method is that +original files are left unmodified. The disadvantage is +that it gets quite complicated to make sure that all the +tracks are properly modified. + + +or ..... + +MMA could develop some output routines which produce the +parallel files mentioned above with only volume and instrument +settings, and the appropiate include/defgroove commands. + +or .... + +Options could be built into MMA to automatically adjust volumes +based on a table. Maybe in an RC file you would have: + + Include Timidity + +and have a Timidity.mma file in your includes directory: + + VolumeAdjust SnareDrum1 -10 lower volume by 10% + VolumeAdjust AcousticGuitar +20 inc volume by 20% + .... + + ... the following are implemented at this point. + + ToneTR KickDrum1=KickDrum2 use KickDrum2 instead of 1 + VoiceTR Trumpet=Piano2 use piano2 when trumpet is called + + +This might be the best solution, and probably would be easy +to implement. + +If you have other suggestions, please shout. + + +bvdp, July/04 + diff --git a/mma/text/TODO b/mma/text/TODO new file mode 100644 index 0000000..242d3cc --- /dev/null +++ b/mma/text/TODO @@ -0,0 +1,8 @@ + +In anticipation of a real-soon-now 1.0 release more eg files need to be +written to test more features. + +Fix -Dk to show option keywords. + +Move all text file to 'text' for distribution. Ensure no duplicate filenames since MAC is +case-INsensitive. \ No newline at end of file diff --git a/mma/util/README.mklibdoc b/mma/util/README.mklibdoc new file mode 100644 index 0000000..f94e944 --- /dev/null +++ b/mma/util/README.mklibdoc @@ -0,0 +1,64 @@ + +Short usage file for mklibdoc.py. + +This is a program I use to automatically update the HTML documentation +of the MMA library. It can be used by anyone who adds 3rd party +files to the lib tree. + +If you have already downloaded and installed the HTML documentation package +from the MMA website you will have a root directory which looks something like: + + $ ls + lib/ logo.png mma.html README ref/ tut/ + +The lib directory contains the library documentation. A listing of this is: + + $ ls/lib + index.html stdlib/ + +If you add or modify the library files you can simply run this program and +update your library documentation with the same tool I used when creating +the distribution. The advantage is that any new libraries you have installed +will now be in the documentation tree. + +NOTE: You will probably have to be 'root' to run this program. This + depends on your installation and operating system. + +To do the update simply run the program. It will check your installation +and install or update the docs in the root tree where MMA is installed. +If you have a default installation this will be /usr/local/share/mma/docs/html. + +Three minor caveats: + + Old/unused HTML files are NOT deleted. So, if you move files around or + delete .mma files you can end up with a number of unused files. Just + delete the whole bunch every once in awhile if it becomes a problem. + + The program really assumes that you already have the html documentation + installed. So, it doesn't do a very good job of creating the complete + directory tree. If you find that you get an error right off the top of + program you will need to create the directories by hand. Assuming you + have installed in /usr/local/share/mma: + + cd /usr/local/share/mma + mkdir docs + cd docs + mkdir html + cd html + mkdir lib + + or (on Linux) + + mkdir -p /usr/local/share/mma/docs/html/lib + + Depending on how your system is set up you will most likely need to be + be the root user for any of this to work. If you get "permission" or + "access denied" errors, run as root or fix the permissions. + +Problems? Drop me a note or visit the official MMA users forum: + + http://www.kara-moon.com/forum + + +bvdp, October 2006. + diff --git a/mma/util/mklibdoc.py b/mma/util/mklibdoc.py new file mode 100755 index 0000000..3c79e11 --- /dev/null +++ b/mma/util/mklibdoc.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python + +# Parse libraries and create html docs + +import os, sys, time + +installdir = ( "c:\\mma\\", "/usr/local/share/mma", "/usr/share/mma", ".") + +libpath = '' +docpath = '' + +for p in installdir: + a = os.path.join(p, 'lib', '') + if os.path.isdir(a): + libpath=a + docpath = os.path.join(p, 'docs', 'html', 'lib') + break + +if not libpath: + print "Can't find the MMA library!" + print "Please check your installation and/or change the search path in this program." + sys.exit(1) + +try: + os.mkdir(docpath) +except: + pass + +index = [] +links = [] + +print "Processing library files" + +def dodir(dir): + """ Process files in directory. """ + + global index, links + newdirs = [] + + olib = os.path.join(docpath, dir) + if not os.path.isdir(olib): + try: + os.mkdir(olib) + except: + print "Can't create directory", olib + sys.exit(1) + + links.append("
  • %s

  • " % (dir, dir.title())) + + if dir.lower() == "stdlib": + index.append("

    These grooves can be used from a program just by using their name.

    ") + + index.append("" % dir) + index.append("

    %s

    " % dir.title() ) + + index.append("
      ") + + + for f in os.listdir(libpath + dir): + this = os.path.join(libpath, dir, f) + + if os.path.isdir(this): + newdirs.append(os.path.join(dir, f)) + continue + + if this.endswith('.mma'): + htmlfname = os.path.join(dir, f.replace('.mma' , '.html')) + htmldate = 0 + htmlout = os.path.join(docpath, htmlfname) + try: + htmldate = os.path.getmtime(htmlout) + except: + pass + + libdate = 0 + try: + libdate = os.path.getmtime(this) + except: + print "NO, NO, NO --- let Bob know about this!" + pass # shouldn't ever happen! + + if libdate < htmldate: + print "Skipping:", this + + else: + if htmldate == 0: + print "Creating:", htmlfname + else: + print "Updating:", htmlfname + + err = os.system("mma -Dxh -w -n %s > %s" % (this, htmlout) ) + if err: + print "ERROR Creating %s" % htmlout + print " %s" % err + try: + os.remove(htmlout) + except: + pass + continue + + index.append("
    • %s
    • " % (htmlfname, os.path.join(dir, f))) + + index.append("
    ") + + if dir.lower() == "stdlib": + index.append('

    Use the following grooves with a "use" directive.

    ') + + for d in newdirs: + dodir(d) + +############################## + + +a = os.listdir(libpath) +dirs = [] + +for b in a: + if os.path.isdir(libpath + b): + dirs.append(b) +dirs.sort() + +if dirs.count("stdlib"): + dirs.remove("stdlib") + dirs.insert(0, "stdlib") + + +for dir in dirs: + dodir(dir) + +out = file(os.path.join(docpath, 'index.html'), "w") + +out.write(""" + +

    The MMA Library

    + +

    +This document is provided as a supplement to the MMA Reference +Manual which lists all of the commands in the program and helpful +information which can be used to create your own "style" files. If you are a +newcomer to MMA, you +should also have a look at the MMA Tutorial for some "getting +started" information. + +

    +The information on these HTML pages has been generated directly +from the library files in your MMA library. Each +entry uses the filename as a header and then lists the various +defined grooves. + +

    +You should be able to use any of the grooves listed in the "STDLIB" +section in your files without +using other directives. However, if you have files in other +locations you will need to need to +explicitly load the library file(s) with a Use directive. + +

    +The filenames are in all lowercase. These are the actual filenames +used in the library. If you are loading files with the Use +directive you must use the same case (please note that +typographic case applies only to the filename---this is operating system +dependant). Groove commands are case-insensitive. + +

    +Following each groove description is a boxed number in the form +(4). This indicates the sequence size of the groove. Next, is +a list of tracks and instrument names. This shows the first voice or +drum note defined for each track---it is quite possible that the track +uses other voices. This data is included so that you can see what +tracks are active. + +

    +The library files supplied with MMA contain embedded documentation. +The -Dxh and -Dxl MMA command line options extract the following +information from the each library file: + +

      +
    • The filename from the "Doc File" directive. + +
    • The file description from the "Doc Note" directive. + +
    • Each groove description: This is the optional text following a + DefGroove directive. + +
        +
      • The sequence size. This is extracted from the current groove + information and was set with the SeqSize directive. It is + displayed in a small box after the groove description. + +
      • A "summary" of the voices used in the groove. Note that a + different voice or MIDI note is possible for each bar in the + sequence size; however, this listing only lists the selection for + the first bar. + +
      +
    + +

    If you find that you don't have some of the grooves listed below in your distribution + you need to run the program mklibdoc.py to update these docs. Not all style files are + distributed in the default MMA distribution. + +


    +

    Index

    + +""") + +if links: + out.write("
      ") + out.write("\n".join(links)) + out.write("
    ") + out.write("
    ") +out.write( "\n".join(index)) + +out.write(""" +
    +
    +

    This document and the files linked were created by mkdoclib.py. + +

    It is a part of the MMA distribution +and is protected by the same copyrights as MMA (the GNU General Public License). + +

    Created: %s""" % time.ctime() ) + +out.write("") + + +out.close() +