mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 19:23:59 +00:00
1841 lines
44 KiB
HTML
1841 lines
44 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
|
|
<!--Converted with LaTeX2HTML 2008 (1.71)
|
|
original version by: Nikos Drakos, CBLU, University of Leeds
|
|
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
|
|
* with significant contributions from:
|
|
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
|
|
<HTML>
|
|
<HEAD>
|
|
<TITLE>Variables, Conditionals and Jumps</TITLE>
|
|
<META NAME="description" CONTENT="Variables, Conditionals and Jumps">
|
|
<META NAME="keywords" CONTENT="mma">
|
|
<META NAME="resource-type" CONTENT="document">
|
|
<META NAME="distribution" CONTENT="global">
|
|
|
|
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
|
<META NAME="Generator" CONTENT="LaTeX2HTML v2008">
|
|
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
|
|
|
|
<LINK REL="STYLESHEET" HREF="mma.css">
|
|
|
|
<LINK REL="next" HREF="node21.html">
|
|
<LINK REL="previous" HREF="node19.html">
|
|
<LINK REL="up" HREF="mma.html">
|
|
<LINK REL="next" HREF="node21.html">
|
|
</HEAD>
|
|
|
|
<BODY bgcolor="#ffffff">
|
|
|
|
<DIV CLASS="navigation"><!--Navigation Panel-->
|
|
<A NAME="tex2html700"
|
|
HREF="node21.html">
|
|
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
|
|
<A NAME="tex2html698"
|
|
HREF="mma.html">
|
|
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
|
|
<A NAME="tex2html692"
|
|
HREF="node19.html">
|
|
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
|
|
<BR>
|
|
<B> Next:</B> <A NAME="tex2html701"
|
|
HREF="node21.html">Low Level MIDI Commands</A>
|
|
<B> Up:</B> <A NAME="tex2html699"
|
|
HREF="mma.html">Reference Manual</A>
|
|
<B> Previous:</B> <A NAME="tex2html693"
|
|
HREF="node19.html">Repeats</A>
|
|
<BR>
|
|
<BR></DIV>
|
|
<!--End of Navigation Panel-->
|
|
<!--Table of Child-Links-->
|
|
<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A>
|
|
|
|
<UL CLASS="ChildLinks">
|
|
<LI><A NAME="tex2html702"
|
|
HREF="node20.html#SECTION002010000000000000000">Variables</A>
|
|
<UL>
|
|
<LI><A NAME="tex2html703"
|
|
HREF="node20.html#SECTION002011000000000000000">Set</A>
|
|
<LI><A NAME="tex2html704"
|
|
HREF="node20.html#SECTION002012000000000000000">NewSet</A>
|
|
<LI><A NAME="tex2html705"
|
|
HREF="node20.html#SECTION002013000000000000000">Mset</A>
|
|
<LI><A NAME="tex2html706"
|
|
HREF="node20.html#SECTION002014000000000000000">RndSet</A>
|
|
<LI><A NAME="tex2html707"
|
|
HREF="node20.html#SECTION002015000000000000000">UnSet VariableName</A>
|
|
<LI><A NAME="tex2html708"
|
|
HREF="node20.html#SECTION002016000000000000000">ShowVars</A>
|
|
<LI><A NAME="tex2html709"
|
|
HREF="node20.html#SECTION002017000000000000000">Inc and Dec</A>
|
|
<LI><A NAME="tex2html710"
|
|
HREF="node20.html#SECTION002018000000000000000">VExpand On or Off</A>
|
|
<LI><A NAME="tex2html711"
|
|
HREF="node20.html#SECTION002019000000000000000">StackValue</A>
|
|
</UL>
|
|
<BR>
|
|
<LI><A NAME="tex2html712"
|
|
HREF="node20.html#SECTION002020000000000000000">Predefined Variables</A>
|
|
<LI><A NAME="tex2html713"
|
|
HREF="node20.html#SECTION002030000000000000000">Indexing and Slicing</A>
|
|
<LI><A NAME="tex2html714"
|
|
HREF="node20.html#SECTION002040000000000000000">Mathematical Expressions</A>
|
|
<LI><A NAME="tex2html715"
|
|
HREF="node20.html#SECTION002050000000000000000">Conditionals</A>
|
|
<LI><A NAME="tex2html716"
|
|
HREF="node20.html#SECTION002060000000000000000">Goto</A>
|
|
</UL>
|
|
<!--End of Table of Child-Links-->
|
|
<HR>
|
|
|
|
<H1><A NAME="SECTION002000000000000000000"></A>
|
|
<A NAME="sec-variables"></A>
|
|
<BR>
|
|
Variables, Conditionals and Jumps
|
|
</H1>
|
|
|
|
<P>
|
|
To make the processing of your music easier,
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> supports a very
|
|
primitive set for variable manipulations along with some conditional
|
|
testing and the oft-frowned-upon <SMALL>GOTO</SMALL> command.
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002010000000000000000">
|
|
Variables</A>
|
|
</H1>
|
|
|
|
<P>
|
|
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> 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:
|
|
|
|
<P>
|
|
|
|
<UL>
|
|
<LI>For use in setting up conditional segments of your file,
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>As a shortcut to entering complex chord sequences.
|
|
|
|
<P>
|
|
</LI>
|
|
</UL>
|
|
|
|
<P>
|
|
To begin, the following list shows the available commands to set and
|
|
manipulate variables:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set VariableName <SPAN CLASS="textit">String</SPAN>
|
|
<BR>
|
|
Mset VariableName ...MsetEnd
|
|
<BR>
|
|
UnSet VariableName
|
|
<BR>
|
|
ShowVars
|
|
<BR>
|
|
Inc Variablename [value]
|
|
<BR>
|
|
Dec Variablename [value]
|
|
<BR>
|
|
Vexpand ON/Off </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
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) <SPAN CLASS="textit">and</SPAN> names cannot contain a
|
|
“[” or “]” character (brace characters are reserved for
|
|
indexing, <A HREF="#slicing">details here</A>).
|
|
|
|
<P>
|
|
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:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set Silly Am / Bm /
|
|
<BR>
|
|
1 $Silly </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The first line creates the variable “Silly”; the second creates a
|
|
bar of music with the chords “Am / Bm /”.
|
|
|
|
<P>
|
|
Note that the “$” must be the first item on a line or follow a
|
|
space character. For example, the following will NOT work:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set Silly 4a;b;c;d;
|
|
<BR>
|
|
1 Am {$Silly} </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
However:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>1 Am { $Silly} </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will work fine.
|
|
|
|
<P>
|
|
Following are details on all the available variable commands:
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002011000000000000000">
|
|
Set</A>
|
|
</H2>
|
|
|
|
<P>
|
|
Set or create a variable. You can skip the <SPAN CLASS="textit">String</SPAN> if you do
|
|
want to assign an empty string to the variable. A valid example is:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set PassCount 1 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
You can concatenate variables or constants by using a single “+”.
|
|
For example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Groove Rhumba
|
|
<BR>
|
|
Repeat
|
|
<BR> ...
|
|
<BR>
|
|
Set a $_Groove + Sus
|
|
<BR>
|
|
Groove $a
|
|
<BR> ...
|
|
<BR>
|
|
Groove Rhumba1
|
|
<BR>
|
|
Repeatend </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
This can be useful in calling G<SMALL>ROOVE</SMALL> variations.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002012000000000000000">
|
|
NewSet</A>
|
|
</H2>
|
|
|
|
<P>
|
|
The N<SMALL>EW</SMALL>S<SMALL>ET</SMALL> command works the same as S<SMALL>ET</SMALL> with the
|
|
exception that that it is completely ignored if the variable already
|
|
exists. So,
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>NewSet ChordVoice JazzGuitar </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
and
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If NDef ChordVoice
|
|
<BR>
|
|
Set ChordVoice JazzGuitar
|
|
<BR>
|
|
Endif </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
have identical results.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002013000000000000000"></A> <A NAME="sec-mset"></A>
|
|
<BR>
|
|
Mset
|
|
</H2>
|
|
|
|
<P>
|
|
This command is quite similar to S<SMALL>ET</SMALL>, but M<SMALL>SET</SMALL> expects
|
|
multiple lines. An example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>MSet LongVar
|
|
<BR>
|
|
1 Cm
|
|
<BR>
|
|
2 Gm
|
|
<BR>
|
|
3 G7
|
|
<BR>
|
|
MsetEnd </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
Each M<SMALL>SET</SMALL> must be terminated by a E<SMALL>ND</SMALL>M<SMALL>SET</SMALL> or
|
|
M<SMALL>SET</SMALL>E<SMALL>ND</SMALL> command (on its own separate line).
|
|
|
|
<P>
|
|
Be careful if you use an MS<SMALL>ET</SMALL> variable in a P<SMALL>RINT</SMALL>
|
|
statement ... you'll probably get an error. The P<SMALL>RINT</SMALL>
|
|
command will print the <SPAN CLASS="textit">first</SPAN> line of the variable and the
|
|
remainder will be reinserted into the input stream for interpretation.
|
|
|
|
<P>
|
|
Special code in
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> will maintain the block settings from
|
|
B<SMALL>EGIN</SMALL>/E<SMALL>ND</SMALL>. So, you can do something like:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Mset Spam
|
|
<BR> Line one
|
|
<BR> Line 2
|
|
<BR> 333
|
|
<BR>
|
|
EndMset
|
|
<BR>
|
|
Begin Print
|
|
<BR> $Spam
|
|
<BR>
|
|
End </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002014000000000000000"></A>
|
|
|
|
<A NAME="rndset"></A>
|
|
<BR>
|
|
RndSet
|
|
</H2>
|
|
|
|
<P>
|
|
There are times when you may want a random value to use in selecting a
|
|
G<SMALL>ROOVE</SMALL> or for other more creative purposes. The R<SMALL>ND</SMALL>S<SMALL>ET</SMALL>
|
|
command sets a variable from a value in a list. The list can be
|
|
anything; just remember that each white space forms the start of a new
|
|
item. So,
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>RndSet Var 1 2 3 4 5 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will set $V<SMALL>AR</SMALL> to one of the values 1, 2, 3, 4 or 5.
|
|
|
|
<P>
|
|
You could use this to randomly select a G<SMALL>ROOVE</SMALL>:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Groove $var Groove1 Groove2 Groove3 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Alternately,
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>RndSet Grv Groove1 Groove2 Groove3 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will set $G<SMALL>RV</SMALL> to one of “Groove1”, “Groove2” or
|
|
“Groove3”.
|
|
|
|
<P>
|
|
Then you can do the same as in the earlier example with:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Groove $Grv </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
You can also have fun using random values for timing, transposition,
|
|
etc.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002015000000000000000">
|
|
UnSet VariableName</A>
|
|
</H2>
|
|
|
|
<P>
|
|
Removes the variable. This can be useful if you have conditional tests
|
|
which simply rely on a certain variable being “defined”.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002016000000000000000">
|
|
ShowVars</A>
|
|
</H2>
|
|
|
|
<P>
|
|
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
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> variables are
|
|
not displayed with this command.
|
|
|
|
<P>
|
|
You can call S<SMALL>HOW</SMALL>V<SMALL>ARS</SMALL> 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 <SPAN CLASS="textit">not</SPAN> cause an error, e.g.:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>ShowVars xXx Count foo
|
|
<BR> $XXX - not defined
|
|
<BR> $COUNT: 11
|
|
<BR> $FOO: This is Foo </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002017000000000000000">
|
|
Inc and Dec</A>
|
|
</H2>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
A short example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set PassCount 1
|
|
<BR>
|
|
Set Foobar 4
|
|
<BR>
|
|
Showvars
|
|
<BR>
|
|
Inc FooBar 4
|
|
<BR>
|
|
Inc PassCount
|
|
<BR>
|
|
ShowVars </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
This command is quite useful for creating conditional tests for proper
|
|
handling of codas or groove changes in repeats.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002018000000000000000">
|
|
VExpand On or Off</A>
|
|
</H2>
|
|
|
|
<P>
|
|
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:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set LeftC Am Em
|
|
<BR>
|
|
Set RightC G /
|
|
<BR>
|
|
VExpand Off
|
|
<BR>
|
|
Set Full $LeftC $RightC
|
|
<BR>
|
|
VExpand On </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
In this case the actual contents of the variable “Full” is “$LeftC
|
|
$RightC”. If the O<SMALL>FF/</SMALL>O<SMALL>N</SMALL> option lines had not been used, the
|
|
contents would be “Am Em G /”. You can easily verify this with the
|
|
S<SMALL>HOW</SMALL>V<SMALL>ARS</SMALL> option.
|
|
|
|
<P>
|
|
When
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> processes a file it expands variables in a recursive
|
|
manner. This means that, in the above example, the line:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>1 $Full </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will be changed to:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>1 Am Em G / </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
However, if later in the file, you change the definition of one of the
|
|
variables ... for example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set LeftC Am / </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
the same line will now be “1 Am / G /”.
|
|
|
|
<P>
|
|
Most of
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> 's internal commands <SPAN CLASS="textit">can</SPAN> 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.
|
|
|
|
<P>
|
|
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!):
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set Rate Tempo 120
|
|
<BR> $Rate
|
|
<BR>
|
|
Set R Repeat
|
|
<BR> $R </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
But, the following will <SPAN CLASS="textit">not</SPAN> work:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set B Begin
|
|
<BR>
|
|
Set E End
|
|
<BR> $B Arpeggio Define
|
|
<BR> ...
|
|
<BR> $E </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
This fails since the Begin/End constructs are expanded before variable
|
|
expansion. However:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set A Define Arpeggio
|
|
<BR>
|
|
Begin $a ...End </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
is quite alright.
|
|
|
|
<P>
|
|
Even though you can use a variable to substitute for the R<SMALL>EPEAT</SMALL>
|
|
or I<SMALL>F</SMALL> directives, using one for R<SMALL>EPEAT</SMALL>E<SMALL>ND</SMALL>,
|
|
E<SMALL>ND</SMALL>R<SMALL>EPEAT</SMALL>, R<SMALL>EPEAT</SMALL>E<SMALL>NDING</SMALL>, L<SMALL>ABEL</SMALL>, I<SMALL>F</SMALL>E<SMALL>ND</SMALL> or
|
|
E<SMALL>ND</SMALL>I<SMALL>F</SMALL> will fail.
|
|
|
|
<P>
|
|
Variable expansion should usually not be a concern. In most normal
|
|
files,
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> will expand variables as they are encountered. However,
|
|
when reading the data in a R<SMALL>EPEAT</SMALL>, I<SMALL>F</SMALL> or M<SMALL>SET</SMALL>
|
|
section the expansion function is skipped--but, when the lines are
|
|
processed, after being stored in an internal queue, variables are
|
|
expanded.
|
|
|
|
<P>
|
|
|
|
<H2><A NAME="SECTION002019000000000000000">
|
|
StackValue</A>
|
|
</H2>
|
|
|
|
<P>
|
|
Sometimes you just want to save a value for a few lines of code. The
|
|
S<SMALL>TACK</SMALL>V<SMALL>ALUE</SMALL> command will save its arguments. You can later
|
|
retrieve them via the $_StackValue macro. For example (taken from
|
|
the <TT><SPAN CLASS="textbf">stdpats.mma</SPAN></TT> file):
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>StackValue $_SwingMode
|
|
<BR>
|
|
SwingMode On
|
|
<BR>
|
|
Begin Drum Define
|
|
<BR> Swing8 1 0 90 * 8
|
|
<BR>
|
|
End
|
|
<BR> ...
|
|
<BR>
|
|
SwingMode $_StackValue </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002020000000000000000">
|
|
Predefined Variables</A>
|
|
</H1>
|
|
|
|
<P>
|
|
For your convenience
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> tracks a number of internal settings and
|
|
you can access these values with special macros.<A NAME="tex2html70"
|
|
HREF="#foot9019"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A> All of these “system” variables are
|
|
prefaced with a single underscore. For example, the current tempo is
|
|
displayed with the variable $_TEMPO.
|
|
|
|
<P>
|
|
There are two categories of system variables. The first are the simple
|
|
values for global settings:
|
|
|
|
<P>
|
|
<DL>
|
|
<DT><STRONG> $_AutoLibPath</STRONG></DT>
|
|
<DD>Current A<SMALL>UTO</SMALL>L<SMALL>IB</SMALL>P<SMALL>ATH</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_BarNum</STRONG></DT>
|
|
<DD>Current bar number of song.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Debug</STRONG></DT>
|
|
<DD>Current debug settings.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Groove</STRONG></DT>
|
|
<DD>Name of the currently selected groove. May be
|
|
empty if no groove has been selected.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_KeySig</STRONG></DT>
|
|
<DD>Key signature as defined in song file. If no key
|
|
signature is set the somewhat cryptic 0# will be returned.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_IncPath</STRONG></DT>
|
|
<DD>Current I<SMALL>NC</SMALL>P<SMALL>ATH</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_LastDebug</STRONG></DT>
|
|
<DD>Debug settings prior to last D<SMALL>EBUG</SMALL>
|
|
command. This setting can be used to restore settings, e.g.:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Debug Warnings=off
|
|
<BR> ...stuff generating annoying warnings
|
|
<BR>
|
|
Debug $_LastDebug </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_LastGroove</STRONG></DT>
|
|
<DD>Name of the groove selected <SPAN CLASS="textit">before</SPAN> the
|
|
currently selected groove.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_LastVolume</STRONG></DT>
|
|
<DD>Previously set global volume setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_LibPath</STRONG></DT>
|
|
<DD>Current L<SMALL>IB</SMALL>P<SMALL>ATH</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_LineNum</STRONG></DT>
|
|
<DD>Line number in current file.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Lyric</STRONG></DT>
|
|
<DD>Current L<SMALL>YRIC</SMALL> settings.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_MIDISplit</STRONG></DT>
|
|
<DD>List of S<SMALL>PLIT</SMALL>C<SMALL>HANNELS</SMALL>.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_OutPath</STRONG></DT>
|
|
<DD>Current O<SMALL>UT</SMALL>P<SMALL>ATH</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_MIDIPlayer</STRONG></DT>
|
|
<DD>Current M<SMALL>IDI</SMALL>P<SMALL>LAYER</SMALL> setting, including options.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Seq</STRONG></DT>
|
|
<DD>Current S<SMALL>EQ</SMALL> point (0 to
|
|
S<SMALL>EQ</SMALL>S<SMALL>IZE</SMALL>). Useful in debugging.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_SeqRnd</STRONG></DT>
|
|
<DD>Global S<SMALL>EQ</SMALL>R<SMALL>ND</SMALL> setting (on, off or track
|
|
list).
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_SeqRndWeight</STRONG></DT>
|
|
<DD>Global S<SMALL>EQ</SMALL>R<SMALL>ND</SMALL>W<SMALL>EIGHT</SMALL> settings.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_SeqSize</STRONG></DT>
|
|
<DD>Current S<SMALL>EQ</SMALL>S<SMALL>IZE</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_SwingMode</STRONG></DT>
|
|
<DD>Current S<SMALL>WING</SMALL>M<SMALL>ODE</SMALL> setting (On or Off)
|
|
and the Skew value.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_StackValue</STRONG></DT>
|
|
<DD>The last value stored on the S<SMALL>TACK</SMALL>V<SMALL>ALUE</SMALL>
|
|
stack.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Tempo</STRONG></DT>
|
|
<DD>Current T<SMALL>EMPO</SMALL>. Note that if you have used
|
|
the optional <SPAN CLASS="textit">bar count</SPAN> in setting the tempo this will be the
|
|
target tempo.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Time</STRONG></DT>
|
|
<DD>The current T<SMALL>IME</SMALL> (beats per bar) setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_ToneTr</STRONG></DT>
|
|
<DD>List of all T<SMALL>ONE</SMALL>TR settings.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Transpose</STRONG></DT>
|
|
<DD>Current T<SMALL>RANSPOSE</SMALL> setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_VExpand</STRONG></DT>
|
|
<DD>VExpand value (On/Off). Not very useful since you
|
|
can't enable VEXPAND back with a macro.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_VoiceTr</STRONG></DT>
|
|
<DD>List of all V<SMALL>OICE</SMALL>TR settings.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_Volume</STRONG></DT>
|
|
<DD>Current global volume setting.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG> $_VolumeRatio</STRONG></DT>
|
|
<DD>Global volume ratio (track vrs. master) from
|
|
A<SMALL>DJUST</SMALL>V<SMALL>OLUME</SMALL> Ratio setting.
|
|
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
If the associated command permits a value for each sequence in your
|
|
pattern, the macro will more than one value. For example (assuming a
|
|
S<SMALL>EQ</SMALL>S<SMALL>IZE</SMALL> of 4):
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Bass Octave 3 4 2 4
|
|
<BR>
|
|
Print $_Bass_Octave
|
|
<BR> ...
|
|
<BR>
|
|
3 4 2 4 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The following are the available “TrackName” macros:
|
|
|
|
<P>
|
|
<DL>
|
|
<DT><STRONG> $_TRACKNAME_Accent</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Articulate</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Channel</STRONG></DT>
|
|
<DD>Assigned MIDI channel 1-16, 0 if not
|
|
assigned.
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Compress</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Direction</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_DupRoot</STRONG></DT>
|
|
<DD>(only permitted in Chord Tracks)
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Harmony</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_HarmonyVolume</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Invert</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Limit</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Mallet</STRONG></DT>
|
|
<DD>Rate and delay values (only valid in
|
|
Solo and Melody tracks)
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_MidiNote</STRONG></DT>
|
|
<DD>Current setting
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_NoteSpan</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Octave</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Range</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Rskip</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Rtime</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Rvolume</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_SeqRnd</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_SeqRndWeight</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Sequence</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Span</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Strum</STRONG></DT>
|
|
<DD>(only permitted in Chord tracks)
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Tone</STRONG></DT>
|
|
<DD>(only permitted in Drum tracks)
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Unify</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Voice</STRONG></DT>
|
|
<DD>
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Voicing</STRONG></DT>
|
|
<DD>(only permitted in Chord tracks)
|
|
</DD>
|
|
<DT><STRONG> $_TRACKNAME_Volume</STRONG></DT>
|
|
<DD><P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<P>
|
|
The “TrackName” macros are useful in copying values between
|
|
non-similar tracks and C<SMALL>H</SMALL>S<SMALL>HARE</SMALL> tracks. For example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Begin Bass
|
|
<BR> Voice AcousticBass
|
|
<BR> Octave 3
|
|
<BR> ...
|
|
<BR>
|
|
End
|
|
<BR>
|
|
Begin Walk
|
|
<BR> ChShare Bass
|
|
<BR> Voice $_Bass_Voice
|
|
<BR> Octave $_Bass_Octave
|
|
<BR> ...
|
|
<BR>
|
|
End </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002030000000000000000"></A>
|
|
<A NAME="slicing"></A>
|
|
<BR>
|
|
Indexing and Slicing
|
|
</H1>
|
|
|
|
<P>
|
|
All variables can have an option <SPAN CLASS="textit">slice</SPAN> or <SPAN CLASS="textit">index</SPAN> appended
|
|
to them using “[]” notation. The exact syntax of the data in the
|
|
“[]”s is dependent on the underlying Python interpreter. But, as a
|
|
summary:
|
|
|
|
<P>
|
|
<DL COMPACT>
|
|
<DT></DT>
|
|
<DD><SPAN CLASS="textbf">[2]</SPAN> - selects the 3rd item in the list,
|
|
</DD>
|
|
<DT></DT>
|
|
<DD><SPAN CLASS="textbf">[1:2]</SPAN> - selects the 2nd to 3rd item (which means only the
|
|
2nd),
|
|
</DD>
|
|
<DT></DT>
|
|
<DD><SPAN CLASS="textbf">[0:2]</SPAN> - selects items 1 and 2,
|
|
</DD>
|
|
<DT></DT>
|
|
<DD><SPAN CLASS="textbf">[-1]</SPAN> - selects the last item.
|
|
</DD>
|
|
</DL>
|
|
|
|
<P>
|
|
It is possible to use the <SPAN CLASS="textit">step</SPAN> option as well, but we don't
|
|
know when you would.
|
|
|
|
<P>
|
|
When indexing or slicing a variable, the following should be kept in
|
|
mind:
|
|
|
|
<P>
|
|
|
|
<UL>
|
|
<LI>For simple variables which contain only one element
|
|
(ie. $_Tempo) any index other than “[0]”, “[-1]”, etc. will
|
|
return an empty string.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>Variables containing multiple values (ie. $_Bass_Volume) are
|
|
treated as list. Slicing and indexing is useful to extract a single
|
|
value.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>Variables created with M<SMALL>SET</SMALL> are treated a list of
|
|
lines. Slicing returns multiple (or single) lines. This can be
|
|
useful in selecting only a portion of a previously created variable.
|
|
|
|
<P>
|
|
</LI>
|
|
</UL>
|
|
The “[]” must follow the variable <SPAN CLASS="textit">without</SPAN> any space
|
|
characters. The expression inside the “[]” must not contain any
|
|
spaces.
|
|
|
|
<P>
|
|
The index or slice expression cannot be a variable.
|
|
|
|
<P>
|
|
An example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Groove bossanova
|
|
<BR>
|
|
Bass Volume m mf p mp
|
|
<BR>
|
|
print $_Bass_Volume
|
|
<BR>
|
|
print $_Bass_Volume[1:3]
|
|
<BR>
|
|
print $_Bass_volume[2] </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will display:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>100 110 40 70
|
|
<BR>
|
|
110 40
|
|
<BR>
|
|
40 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002040000000000000000">
|
|
Mathematical Expressions</A>
|
|
</H1>
|
|
|
|
<P>
|
|
Anywhere you can use a variable (user defined or built-in) you can
|
|
also use a mathematical expression. Expressions delimited in a
|
|
$(...) set are passed to the underlying Python interpreter, parsed
|
|
and expanded. Included in an expression can be any combination of
|
|
values, operators, and
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> variables.
|
|
|
|
<P>
|
|
Here are a couple of examples with the
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> generated values:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Print $( 123 * (4.0/5) )
|
|
<BR>
|
|
98.4 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Tempo 100
|
|
<BR>
|
|
Set V $( $_Tempo + 44)
|
|
<BR>
|
|
Print $v
|
|
<BR>
|
|
144 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
How it works:
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> first parses each line and expands any variables
|
|
it finds. In the second example this means that the $_Tempo is
|
|
converted to “100”. After all the variable expansion is done a check
|
|
is made to find math delimiters. Anything inside these delimiters is
|
|
evaluated by Python.
|
|
|
|
<P>
|
|
You can even use this feature to modify values stored in
|
|
lists.<A NAME="tex2html71"
|
|
HREF="#foot9165"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">2</SPAN></SUP></A> A bit complex, but well worthwhile! In the following
|
|
example we add “10” to the current A<SMALL>RTICULATE</SMALL> setting. It's
|
|
split into three lines to make it clearer:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>set a $( ' $_Chord_Articulate '.split() ) </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Note the use of single quotes to convert the
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> “string” to
|
|
something Python can deal with. You could just as easily use double
|
|
quotes, but do note that the spaces before the “$” and before the
|
|
final “ ' ” are needed. The result of the above is that the variable
|
|
“$a” now is set to something like: “['100', '100', '90', '80']”.
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>set b $([str(int(x)+10)for x in $a ] ) </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Next we use a list comprehension to add “10” to each value in the
|
|
list. Our new list (contained in “$b”) will be: “['110', '110',
|
|
'100', '90']”. Notice how the strings were converted from strings to
|
|
integers (for the addition) and then back to strings.
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>set c $( ' '.join( $b ) ) </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The new list is now converted to a string which
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> can deal with
|
|
and store it in “$c”. In this case: “110 110 100 90”.
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Chord Articulate $c </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Finally, C<SMALL>HORD</SMALL> A<SMALL>RTICULATE</SMALL> is modified.
|
|
|
|
<P>
|
|
Now, that that is clear, you can easily combine the operation using no
|
|
variables at all:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Chord Articulate $(' '.join([str(int(x)+10)for x in'
|
|
$_Chord_Articulate '.split()])) </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Some additional notes:
|
|
|
|
<P>
|
|
|
|
<UL>
|
|
<LI>To keep your computer safe from malicious scripts, only the
|
|
following operators and functions are permitted.
|
|
|
|
<P>
|
|
The unary operators:
|
|
|
|
<P>
|
|
<PRE>
|
|
- + ~
|
|
</PRE>
|
|
|
|
<P>
|
|
the basic operators:
|
|
|
|
<P>
|
|
<PRE>
|
|
+ - / // % * **
|
|
</PRE>
|
|
|
|
<P>
|
|
the bitwise operators:
|
|
|
|
<P>
|
|
<PRE>
|
|
& | ^ << >>
|
|
</PRE>
|
|
|
|
<P>
|
|
the constants:
|
|
|
|
<P>
|
|
<PRE>
|
|
e pi
|
|
</PRE>
|
|
|
|
<P>
|
|
the functions:
|
|
|
|
<P>
|
|
<PRE>
|
|
ceil() fabs() floor() exp() log() log10() pow()
|
|
sqrt() acos() asin() atan() atan2() cos() hypot()
|
|
sin() tan() degrees() radians() cosh() sinh()
|
|
tanh() abs() chr() int()
|
|
</PRE>
|
|
|
|
<P>
|
|
the miscellaneous functions:<A NAME="tex2html72"
|
|
HREF="#foot9098"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">3</SPAN></SUP></A>
|
|
<P>
|
|
<PRE>
|
|
for, in, str(), .join(), .split()
|
|
</PRE>
|
|
|
|
<P>
|
|
and values and parentheses.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>For details on the use/format of the above please refer to the
|
|
Python documentation.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>$(...) expressions cannot be nested.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>There must be a whitespace character before the leading $.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>Any
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> variables must be delimited with whitespace. For
|
|
example $( $_Tempo + 44) will work; however, both $($_Tempo +
|
|
44) and $( $_Tempo+ 44) will cause an error.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>The supplied file <TT><SPAN CLASS="textbf">egs/misc/math.mma</SPAN></TT> shows a number of
|
|
examples.
|
|
|
|
<P>
|
|
</LI>
|
|
</UL>
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002050000000000000000">
|
|
Conditionals</A>
|
|
</H1>
|
|
|
|
<P>
|
|
One of the most important reasons to have variables in
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> is to use
|
|
them in conditionals. In
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> a conditional consists of a line
|
|
starting with an I<SMALL>F</SMALL> directive, a test, a series of lines to
|
|
process (depending upon the result of the test), and a closing
|
|
E<SMALL>ND</SMALL>I<SMALL>F</SMALL> or I<SMALL>F</SMALL>E<SMALL>ND</SMALL><A NAME="tex2html73"
|
|
HREF="#foot9166"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">4</SPAN></SUP></A> directive. An optional E<SMALL>LSE</SMALL> statement may be included.
|
|
|
|
<P>
|
|
The first set of tests are unary (they take no arguments):
|
|
|
|
<P>
|
|
<DL>
|
|
<DT><STRONG>Def VariableName</STRONG></DT>
|
|
<DD>Returns true if the variable has been defined.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>Ndef VariableName</STRONG></DT>
|
|
<DD>Returns true if the variable has not been
|
|
defined.
|
|
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
A simple example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If Def InCoda
|
|
<BR> 5 Cm
|
|
<BR> 6 /
|
|
<BR>
|
|
Endif </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The other tests are binary (they take two arguments):
|
|
|
|
<P>
|
|
<DL>
|
|
<DT><STRONG>LT Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">Str1</SPAN> is less than
|
|
<SPAN CLASS="textit">Str2</SPAN>. (Please see the discussion below on how the tests are
|
|
done.)
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>LE Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">str1</SPAN> is less than or equal
|
|
to <SPAN CLASS="textit">Str2</SPAN>.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>EQ Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">str1</SPAN> is equal to
|
|
<SPAN CLASS="textit">Str2</SPAN>.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>NE Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">str1</SPAN> is not equal to
|
|
<SPAN CLASS="textit">Str2</SPAN>.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>GT Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">str1</SPAN> is greater than
|
|
<SPAN CLASS="textit">Str2</SPAN>.
|
|
|
|
<P>
|
|
</DD>
|
|
<DT><STRONG>GE Str1 Str2</STRONG></DT>
|
|
<DD>Returns true if <SPAN CLASS="textit">str1</SPAN> is greater than or
|
|
equal to <SPAN CLASS="textit">Str2</SPAN>.
|
|
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<P>
|
|
In the above tests you have several choices in specifying <SPAN CLASS="textit">Str1</SPAN>
|
|
and <SPAN CLASS="textit">Str2</SPAN>. At some point, when
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> does the actual comparison,
|
|
two strings or numeric values are expected. So, you really could do:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If EQ abc ABC </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
and get a “true” result. The reason that “abc” equals “ABC” is
|
|
that all the comparisons in
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> are case-insensitive.
|
|
|
|
<P>
|
|
You can also compare a variable to a string:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If GT $foo abc </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
will evaluate to “true” if the <SPAN CLASS="textit">contents</SPAN> 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
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> will choke on the command. In the following
|
|
example:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set Foo A B
|
|
<BR>
|
|
If GT $Foo abc </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
the comparison is passed the line:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If GT A B abc </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
and
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> 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 I<SMALL>F</SMALL> directive is entered. So:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If $$foo abc </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
would generate a comparison between “A B” and “ABC”.
|
|
|
|
<P>
|
|
Delayed expansion can be applied to either variable. It only works in
|
|
an I<SMALL>F</SMALL> directive.
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
The rule in
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> 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.<A NAME="tex2html74"
|
|
HREF="#foot9139"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">5</SPAN></SUP></A>
|
|
<P>
|
|
This lets you do consistent comparisons in situations like:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Set Count 1
|
|
<BR>
|
|
If LE $$Count 4
|
|
<BR> ...
|
|
<BR>
|
|
IfEnd </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
Note that the above example could have used “$Count”, but you
|
|
should probably always use the “$$” in tests.
|
|
|
|
<P>
|
|
Much like other programming languages, an optional E<SMALL>LSE</SMALL>
|
|
condition may be used:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If Def Coda
|
|
<BR> Groove Rhumba1
|
|
<BR>
|
|
Else
|
|
<BR> Groove Rhumba
|
|
<BR>
|
|
Endif </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The E<SMALL>LSE</SMALL> statement(s) are processed only if the test for the
|
|
I<SMALL>F</SMALL> test is false.
|
|
|
|
<P>
|
|
Nesting of I<SMALL>F</SMALL>s is permitted:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>If ndef Foo
|
|
<BR> Print Foo has been defined.
|
|
<BR>
|
|
Else
|
|
<BR> If def bar
|
|
<BR> Print bar has been defined. Cool.
|
|
<BR> Else
|
|
<BR> Print no bar ...go thirsty.
|
|
<BR> Endif
|
|
<BR>
|
|
Endif </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
works just fine. Indentation has been used in these examples to
|
|
clearly show the nesting and conditions. You should do the same.
|
|
|
|
<P>
|
|
|
|
<H1><A NAME="SECTION002060000000000000000">
|
|
Goto</A>
|
|
</H1>
|
|
|
|
<P>
|
|
The G<SMALL>OTO</SMALL> command redirects the execution order of your script
|
|
to the point at which a L<SMALL>ABEL</SMALL> or line number has been
|
|
defined. There are really two parts to this:
|
|
|
|
<P>
|
|
|
|
<OL>
|
|
<LI>A command defining a label, and,
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>The G<SMALL>OTO</SMALL> command.
|
|
|
|
<P>
|
|
</LI>
|
|
</OL>
|
|
|
|
<P>
|
|
|
|
<P>
|
|
A label is set with the L<SMALL>ABEL</SMALL> directive:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Label Point1 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
The string defining the label can be any sequence of characters.
|
|
Labels are case-insensitive.
|
|
|
|
<P>
|
|
To make this look a lot more line those old BASIC programs, any lines
|
|
starting with a line number are considered to be label lines as well.
|
|
|
|
<P>
|
|
A few considerations on labels and line numbers:
|
|
|
|
<P>
|
|
|
|
<UL>
|
|
<LI>A duplicate label generated with a L<SMALL>ABEL</SMALL> command will
|
|
generate an error.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>A line number label duplicating a L<SMALL>ABEL</SMALL> is an error.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>A L<SMALL>ABEL</SMALL> duplicating a line number is an error.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>Duplicate line numbers are permitted. The last one encountered
|
|
will be the one used.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>All label points are generated when the file is opened, not as
|
|
it is parsed.
|
|
|
|
<P>
|
|
</LI>
|
|
<LI>Line numbers (really, just comments) do not need to be in any
|
|
order.
|
|
|
|
<P>
|
|
</LI>
|
|
</UL>
|
|
|
|
<P>
|
|
|
|
<P>
|
|
The command:
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Goto Point1 </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
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.
|
|
|
|
<P>
|
|
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> 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.
|
|
|
|
<P>
|
|
The following example shows the use of both types of label. In this
|
|
example only lines 2, 3, 5 and 6 will be processed.
|
|
|
|
<P>
|
|
|
|
<Table Hspace="40%" CellSpacing=0 CellPadding=10 BGColor="OldLace" Border=3>
|
|
<tr><td>
|
|
<B>Goto Foo
|
|
<BR>
|
|
1 Cm
|
|
<BR>
|
|
Label Foo
|
|
<BR>
|
|
2 Dm
|
|
<BR>
|
|
3 /
|
|
<BR>
|
|
Goto 5
|
|
<BR>
|
|
4 Am
|
|
<BR>
|
|
5 Cm
|
|
<BR>
|
|
6 Dm </B>
|
|
|
|
</td></tr>
|
|
</Table>
|
|
|
|
<P>
|
|
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.
|
|
<BR><HR><H4>Footnotes</H4>
|
|
<DL>
|
|
<DT><A NAME="foot9019">... macros.</A><A
|
|
HREF="node20.html#tex2html70"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">1</SPAN></SUP></A></DT>
|
|
<DD>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.
|
|
|
|
</DD>
|
|
<DT><A NAME="foot9165">...
|
|
lists.</A><A
|
|
HREF="node20.html#tex2html71"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">2</SPAN></SUP></A></DT>
|
|
<DD>this was written before the introduction of slices,
|
|
(<A HREF="#slicing">details here</A>). Slices make this
|
|
much easier, but lets leave the hard stuff in just to show what can
|
|
be done.
|
|
|
|
</DD>
|
|
<DT><A NAME="foot9098">... functions:</A><A
|
|
HREF="node20.html#tex2html72"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">3</SPAN></SUP></A></DT>
|
|
<DD>It is possible that the
|
|
following functions could be used to do “bad” things. If you see
|
|
code using these commands from a suspect source you should be
|
|
careful.
|
|
|
|
</DD>
|
|
<DT><A NAME="foot9166">...I<SMALL>F</SMALL>E<SMALL>ND</SMALL></A><A
|
|
HREF="node20.html#tex2html73"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">4</SPAN></SUP></A></DT>
|
|
<DD>
|
|
<FONT Face="Serif" Color="Navy"><I>MMA</I></FONT> '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.
|
|
|
|
</DD>
|
|
<DT><A NAME="foot9139">... strings.</A><A
|
|
HREF="node20.html#tex2html74"><SUP><SPAN CLASS="arabic">20</SPAN>.<SPAN CLASS="arabic">5</SPAN></SUP></A></DT>
|
|
<DD>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.
|
|
|
|
</DD>
|
|
</DL>
|
|
<DIV CLASS="navigation"><HR>
|
|
<!--Navigation Panel-->
|
|
<A NAME="tex2html700"
|
|
HREF="node21.html">
|
|
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A>
|
|
<A NAME="tex2html698"
|
|
HREF="mma.html">
|
|
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A>
|
|
<A NAME="tex2html692"
|
|
HREF="node19.html">
|
|
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A>
|
|
<BR>
|
|
<B> Next:</B> <A NAME="tex2html701"
|
|
HREF="node21.html">Low Level MIDI Commands</A>
|
|
<B> Up:</B> <A NAME="tex2html699"
|
|
HREF="mma.html">Reference Manual</A>
|
|
<B> Previous:</B> <A NAME="tex2html693"
|
|
HREF="node19.html">Repeats</A></DIV>
|
|
<!--End of Navigation Panel-->
|
|
<ADDRESS>
|
|
bob
|
|
2010-11-07
|
|
</ADDRESS>
|
|
</BODY>
|
|
</HTML>
|