Fork me on GitHub

Dynamics: Volume control. The following rules are volume modifiers that when encountered change the loudness of the sound. This transition can become more gradual with the DYNAMIC_CRES and DYNAMIC_DECRES.

PPPP : 'pppp';
PPP  : 'ppp';
PP   : 'pp';
P    : 'p';
MP   : 'mp';
MF   : 'mf';
F    : 'f';
FF   : 'ff';
FFF  : 'fff';
FFFF : 'ffff';

Cresendo: Gradually increase hte volume until at the volume of the next dynamic

DYNAMIC_CRES   : '<<';

Decresendo: Gradually decrease the volume until at the volume of the next dynamic

DYNAMIC_DECRES : '>>';

Accents: These characters apply feel or style to a note. DOT also has another meaning in a rhythm context which is to extend a rhythm element by 1/2 it’s length.

DOT  : '.';
EXCLAMATION : '!';
HAT : '^';
BACK_TICK  : '`';
USCORE  : '_';
TILDA : '~';

Identifiers: There are various single letter keywords in Mellow D for describing notes and beats. Notes are the standard a, b, c, d, e, f, and g strictly in lowercase. Rhythm units consist of w (whole), h (half), e (eighth), q (quarter), s (sixteenth) and t (thirtysecond) strictly in lowercase. They represent the standard beat durations.

To eliminate the ambiguity in the IDENTIFIER the definition enforces that if the identifier starts with a note or whythm char, it is followed by at least one identifier char to distinguish it from the keyword. Similarily ppp, pp, p, mp, mf, f, ff, fff must also be distinguished from the DYNAMIC_* definitions by being followed by atleast one identifier char.

These tokens must be described individually and placed in a parser rule due to the context

A : 'a';
B : 'b';
C : 'c';
D : 'd';
E : 'e';
/*F : 'f'; is already defined above with the dynamics*/
G : 'g';
H : 'h';
Q : 'q';
S : 's';
T : 't';
W : 'w';

NUMBER : [0-9]+;
IDENTIFIER
    :   ( [i-lnoruvx-zA-Z]
        |   ( [a-hqstw]
            | ( 'm' [pf]? )
            | ( 'p' 'p'? 'p'? 'p'? )
            | ( 'f' 'f'? 'f'? 'f'? )
            )[a-zA-Z0-9]
        ) [a-zA-Z0-9]*
    ;

Octave shift up and down respectively.

PLUS : '+';
MINUS : '-';

STAR is an operator that distributes a melody over a rhythm.

STAR : '*';

COMMA is a list seperation token

COMMA : ',';

COLON is used for indexing

COLON : ':';

SHARP and FLAT shift a note up and down by a semi-tone respectively

SHARP : '#';
FLAT : '$';

ASSIGNMENT maps an identifier to a musical descriptor

ASSIGNMENT : '->';

Definition Boundaries: The following definitions are for tokens that mark the beginning and end of various definitions. They each have their respective match.

BRACKET_OPEN : '[';
BRACKET_CLOSE : ']';
PAREN_OPEN : '(';
PAREN_CLOSE : ')';
P_BRACKET_OPEN : '<';
P_BRACKET_CLOSE : '>';
BRACE_OPEN : '{';
BRACE_CLOSE : '}';

Skip comments. Line comments comment out all input untin the first matched newline. Mellow D also supports multi-line comments like java comments. /* opens the comment and */ closes the comment.

LINE_COMMENT : '//' ~[\r\n]* '\r'? '\n' -> skip;
MULTI_LINE_COMMENT : '/*' (.)*? '*/' -> skip;

Ignore whitespace and pipes (|) as they can be used by the developer to format their source however they like.

SRC_SUGAR : [| \n\r\t] -> skip;
h