📄 allegrord.cpp
字号:
char *msg = "Integer expected"; char *p = int_string; char c; while (c = *p++) { if (!isdigit(c)) { parse_error(field, 1, msg); return 0; } } if (strlen(int_string) < 1) { parse_error(field, 1, msg); return 0; } return atoi(int_string);}int Allegro_reader::find_real_in(char *field, int n){ // scans from offset n to the end of a real constant bool decimal = false; int len = strlen(field); for (int i = n; i < len; i++) { char c = field[i]; if (!isdigit(c)) { if (c == '.' && !decimal) { decimal = true; } else { return i; } } } return strlen(field);}double Allegro_reader::parse_real(char *field){ char real_string[80]; char *msg = "Real expected"; bool decimal = false; int last = find_real_in(field, 1); subseq(real_string, field, 1, last); if (last <= 1 || last < (int) strlen(field)) { parse_error(field, 1, msg); return 0; } return atof(real_string);}void Allegro_reader::parse_error(char *field, long offset, char *message){ int position = line_parser.pos - strlen(field) + offset; error_flag = true; puts(line_parser.string); for (int i = 0; i < position; i++) { putc(' ', stdout); } putc('^', stdout); printf(" %s\n", message);}double duration_lookup[] = { 0.25, 0.5, 1.0, 2.0, 4.0 };double Allegro_reader::parse_dur(char *field, double base){ char *msg = "Duration expected"; char real_string[80]; char *durs = "SIQHW"; char *p; int last; double dur; if (strlen(field) < 2) { // fall through to error message return -1; } else if (isdigit(field[1])) { last = find_real_in(field, 1); subseq(real_string, field, 1, last); dur = atof(real_string); // convert dur from seconds to beats dur = seq.map.time_to_beat(base + dur) - seq.map.time_to_beat(base); } else if (p = strchr(durs, field[1])) { dur = duration_lookup[p - durs]; last = 2; } else { parse_error(field, 1, msg); return 0; } dur = parse_after_dur(dur, field, last, base); dur = seq.map.beat_to_time(seq.map.time_to_beat(base) + dur) - base; return dur;}double Allegro_reader::parse_after_dur(double dur, char *field, int n, double base){ char a_string[80]; if ((int) strlen(field) == n) { return dur; } if (field[n] == 'T') { return parse_after_dur(dur * 2/3, field, n + 1, base); } if (field[n] == '.') { return parse_after_dur(dur * 1.5, field, n + 1, base); } if (isdigit(field[n])) { int last = find_real_in(field, n); subseq(a_string, field, n, last); double f = atof(a_string); return parse_after_dur(dur * f, field, last, base); } if (field[n] == '+') { subseq(a_string, field, n + 1, -1); return dur + parse_dur(a_string, seq.map.beat_to_time( seq.map.time_to_beat(base) + dur)); } parse_error(field, n, "Unexpected character in duration"); return dur;}static struct { char *str; int val;} loud_lookup[] = { {"FFF", 127}, {"FF", 120}, {"F", 110}, {"MF", 100}, {"MP", 90}, {"P", 80}, {"PP", 70}, {"PPP", 60}, {NULL, 0} };double Allegro_reader::parse_loud(char *field){ char *msg = "Loudness expected"; if (isdigit(field[1])) { return parse_int(field); } else { double loud = 0.0; char dyn[field_max]; strcpy(dyn, field + 1); char *p = dyn; while (*p) { if (isupper(*p)) *p = toupper(*p); } for (int i = 0; loud_lookup[i].str; i++) { if (streql(loud_lookup[i].str, dyn)) { return (double) loud_lookup[i].val; } } } parse_error(field, 1, msg); return 100.0;}int key_lookup[] = {21, 23, 12, 14, 16, 17, 19};long Allegro_reader::parse_key(char *field){ char *msg = "Pitch expected"; char *pitches = "ABCDEFG"; char *p; if (isdigit(field[1])) { return parse_int(field); } else if (p = strchr(pitches, field[1])) { long key = key_lookup[p - pitches]; key = parse_after_key(key, field, 2); return key; } parse_error(field, 1, msg); return 0;}long Allegro_reader::parse_after_key(int key, char *field, int n){ char octave[20]; if ((int) strlen(field) == n) { return key; } char c = toupper(field[n]); if (c == 'S') { return parse_after_key(key + 1, field, n + 1); } if (c == 'F') { return parse_after_key(key - 1, field, n + 1); } if (isdigit(c)) { int last = find_int_in(field, n); subseq(octave, field, n, last); int oct = atoi(octave); return parse_after_key(key + oct * 12, field, last); } parse_error(field, n, "Unexpected character in pitch"); return key;}long Allegro_reader::find_int_in(char *field, int n){ while ((int) strlen(field) > n && isdigit(field[n])) { n = n + 1; } return n;}bool Allegro_reader::parse_attribute(char *field, Parameter_ptr param){ int i = 1; while (i < (int) strlen(field)) { if (field[i] == ':') { char attr[80]; subseq(attr, field, 1, i); char type_char = field[i - 1]; if (strchr("iarsl", type_char)) { param->set_attr(symbol_table.insert_string(attr)); parse_val(param, field, i + 1); } return !error_flag; } i = i + 1; } return false;}bool Allegro_reader::parse_val(Parameter_ptr param, char *s, int i){ int len = (int) strlen(s); if (i >= len) { return false; } if (s[i] == '"') { if (!check_type('s', param)) { return false; } char *r = new char[len - i]; subseq(r, s, i + 1, len - 1); param->s = r; } else if (s[i] == '\'') { if (!check_type('a', param)) { return false; } char r[80]; subseq(r, s, i + 1, len - 1); param->a = symbol_table.insert_string(r); } else if (param->attr_type() == 'l') { if (streql(s + i, "true") || streql(s + i, "t")) { param->l = true; } else if (streql(s + i, "false") || streql(s + i, "nil")) { param->l = false; } else return false; } else if (isdigit(s[i])) { int pos = i + 1; bool period = false; while (pos < len) { if (isdigit(s[pos])) { ; } else if (!period && s[pos] == '.') { period = true; } else { parse_error(s, pos, "Unexpected char in number"); return false; } pos = pos + 1; } char r[80]; subseq(r, s, i, len); if (period) { if (!check_type('r', param)) { return false; } param->r = atof(r); } else { if (param->attr_type() == 'r') { param->r = atoi(r); } else if (!check_type('i', param)) { return false; } else { param->i = atoi(r); } } } return true;}bool Allegro_reader::check_type(char type_char, Parameter_ptr param){ return param->attr_type() == type_char;}//duration_lookup = {"S": 0.5, "I": 0.5, "Q": 1, "H": 2, "W": 4}//key_lookup = {"C": 12, "D": 14, "E": 16, "F": 17, "G": 19, "A": 21, "B": 23}/*def test(): reader = Allegro_reader(open("data\\test.gro", "r")) reader.parse() score = reader.seq.notes print "score:", score reader = nil*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -