diff --git a/extra/mmelody.c b/extra/mmelody.c index 685f20c..4e2b0fe 100644 --- a/extra/mmelody.c +++ b/extra/mmelody.c @@ -7,75 +7,6 @@ #include "mmelody.h" -/* By default notes are in the scale C4 -> C5. - Note the first 12 frets on a six string guitar covers 3 octaves - from the pitch E2 (82.41 Hz) to the pitch E5 (659.26 Hz). - - Tunes are specified using the notation C4C5F4G4C4 but for brevity - this can be simplified to C4C5F4GC where the previously specified - octave number persists. A problem with this notation is the - verbosity when we have something like B2C3B2C3. Most melodies will - only require 2 and 3 at the most octaves. The ABC music notation - uses CDEFGABcdefgabc'd'e'f'g'a'b'c' to denote 3 octaves from C2 to - C5? This uses numbers to indicate note duration, for example, C2 - denotes a C of twice the standard duration. - - By default notes are crotchets (quarter notes) and tempos are - defined in beats per minute. If we assume 4/4 time, then each beat - has a quarter-note duration. - - The note duration can be halved with a comma suffix, e.g., A, - - The note duration can be extended by a half with a dot suffix, e.g., A. - - The note duration can be doubled with a slash suffix, e.g., A/ - - The note duration can be trebled with two slash suffixes, e.g., A// - (this can be continued to lengthen the note). - - If there are lots of quavers (eighth notes), then the default note - duration can be switched using *8. *4 returns to quarter note timing. - - Rests are specified with a space character. The timing modifiers , - . and / can be used. - - is equivalent to ABCABC - - 3 is equivalent to ABCABCABC - - ABC: performs an infinite repeat of ABC - - represents ABCDEABCFG where ]n denotes alternate - endings. - - A+ sounds an octave higher - - A- sounds an octave lower - - @120 sets the tempo to 120 beats per minute - - This could be made a lot more flexible but the orginal - implementation had a tight memory constraint. Possible extensions: - - * For emphasis perhaps use ^ to indicate louder, for example, C^. - Similarly, to make a note quieter it could have a v suffix. - - * Use | for bar markers; these can be ignored. - - * Time signatures. - - * Nested loops, e.g., > - - * sixteenth notes? Perhaps A,, - - * Perhaps lower case for eighth notes? - - * Triplets and other irrational tuplets? A triplet quarter note - has 2 / 3 the duration of a quarter note while a triplet eighth note - has 2 / 3 the duration of of an eighth note. This can be achieved - using *6 or *12. -*/ - enum {MMELODY_SCALE_SIZE = 12}; /* Assume each beat is a quarter note. */ diff --git a/extra/mmelody.h b/extra/mmelody.h index f6941b7..a34d003 100644 --- a/extra/mmelody.h +++ b/extra/mmelody.h @@ -3,6 +3,84 @@ @date 20 April 2007 @brief Play simple melodies. */ + +/* By default notes are in the scale C4 -> C5. + Note the first 12 frets on a six string guitar covers 3 octaves + from the pitch E2 (82.41 Hz) to the pitch E5 (659.26 Hz). + + Tunes are specified using a sequence of characters representing + notes, periods, and control operations. + + A note consists of the note name, followed by the octave number. + For example, middle C is C4. + + A simple melody could be represented by C4C5F4G4C4 but for brevity + this can be simplified to C4C5F4GC where the previously specified + octave number persists. + + A problem with this notation is the verbosity when we have + something like B2C3B2C3. Most melodies will only require 2 and 3 + at the most octaves. In contrast, the ABC music notation uses + CDEFGABcdefgabc'd'e'f'g'a'b'c' to denote 3 octaves from C2 to C5. + This uses numbers to indicate note duration, for example, C2 + denotes a C of twice the standard duration. + + By default notes are crotchets (quarter notes) and tempos are + defined in beats per minute. If we assume 4/4 time, then each beat + has a quarter-note duration. + + The note duration can be halved with a comma suffix, e.g., A, + + The note duration can be extended by a half with a dot suffix, e.g., A. + + The note duration can be doubled with a slash suffix, e.g., A/ + + The note duration can be trebled with two slash suffixes, e.g., A// + (this can be continued to lengthen the note). + + If there are lots of quavers (eighth notes), then the default note + duration can be switched using *8. *4 returns to quarter note timing. + + Rests are specified with a space character. The timing modifiers , + . and / can be used. + + is equivalent to ABCABC + + 3 is equivalent to ABCABCABC + + ABC: performs an infinite repeat of ABC + + represents ABCDEABCFG where ]n denotes alternate + endings. + + A+ sounds an octave higher + + A- sounds an octave lower + + @120 sets the tempo to 120 beats per minute + + This could be made a lot more flexible but the orginal + implementation had a tight memory constraint. Possible extensions: + + * For emphasis perhaps use ^ to indicate louder, for example, C^. + Similarly, to make a note quieter it could have a v suffix. + + * Use | for bar markers; these can be ignored. + + * Time signatures. + + * Nested loops, e.g., > + + * Sixteenth notes? Perhaps A,, + + * Perhaps lower case for eighth notes? + + * Triplets and other irrational tuplets? A triplet quarter note + has 2 / 3 the duration of a quarter note while a triplet eighth note + has 2 / 3 the duration of of an eighth note. This can be achieved + using *6 or *12. +*/ + #ifndef MMELODY_H #define MMELODY_H