
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 <value>
	
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=<type>" 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.

