⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 allegrord.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -