diff --git a/src/sfizz/Opcode.h b/src/sfizz/Opcode.h index 29f05c7b..04cf67ac 100644 --- a/src/sfizz/Opcode.h +++ b/src/sfizz/Opcode.h @@ -42,6 +42,12 @@ enum OpcodeCategory { enum OpcodeScope { //! unknown scope or other kOpcodeScopeGeneric, + //! global scope + kOpcodeScopeGlobal, + //! control scope + kOpcodeScopeControl, + //! group scope + kOpcodeScopeGroup, //! region scope kOpcodeScopeRegion, //! effect scope diff --git a/src/sfizz/OpcodeCleanup.cpp b/src/sfizz/OpcodeCleanup.cpp index b42c44e1..9c895648 100644 --- a/src/sfizz/OpcodeCleanup.cpp +++ b/src/sfizz/OpcodeCleanup.cpp @@ -1,4 +1,4 @@ -/* Generated by re2c 1.3 on Tue May 5 03:27:40 2020 */ +/* Generated by re2c 1.3 on Fri May 15 08:30:58 2020 */ #line 1 "src/sfizz/OpcodeCleanup.re" /* -*- mode: c++; -*- */ // SPDX-License-Identifier: BSD-2-Clause @@ -10,6 +10,7 @@ #include "Opcode.h" #include "absl/strings/string_view.h" #include "absl/strings/str_cat.h" +#include "absl/strings/ascii.h" #include namespace sfz { @@ -18,7 +19,10 @@ static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope sc { std::string opcode { rawOpcode }; - #line 23 "src/sfizz/OpcodeCleanup.re" + // always convert it to lower case + absl::AsciiStrToLower(&opcode); + + #line 27 "src/sfizz/OpcodeCleanup.re" #define YYMAXNMATCH 4 @@ -36,15 +40,17 @@ static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope sc return absl::string_view(beg, end - beg); }; - #line 44 "src/sfizz/OpcodeCleanup.re" + #line 48 "src/sfizz/OpcodeCleanup.re" //-------------------------------------------------------------------------- + if (scope == kOpcodeScopeRegion) { + YYCURSOR = opcode.c_str(); -#line 48 "src/sfizz/OpcodeCleanup.cpp" +#line 54 "src/sfizz/OpcodeCleanup.cpp" { char yych; yych = *YYCURSOR; @@ -60,11 +66,11 @@ static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope sc yy2: ++YYCURSOR; yy3: -#line 57 "src/sfizz/OpcodeCleanup.re" +#line 63 "src/sfizz/OpcodeCleanup.re" { - goto end_generic; + goto end_region_oncc; } -#line 68 "src/sfizz/OpcodeCleanup.cpp" +#line 74 "src/sfizz/OpcodeCleanup.cpp" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych <= 0x00) goto yy3; @@ -148,19 +154,21 @@ yy15: yypmatch[1] = YYCURSOR; yypmatch[3] = yyt2 - 3; yypmatch[5] = YYCURSOR - 1; -#line 52 "src/sfizz/OpcodeCleanup.re" +#line 58 "src/sfizz/OpcodeCleanup.re" { opcode = absl::StrCat(group(1), "_oncc", group(2)); - goto end_generic; + goto end_region_oncc; } -#line 157 "src/sfizz/OpcodeCleanup.cpp" +#line 163 "src/sfizz/OpcodeCleanup.cpp" } -#line 61 "src/sfizz/OpcodeCleanup.re" +#line 67 "src/sfizz/OpcodeCleanup.re" -end_generic: +end_region_oncc: /* end */; + } // scope == kOpcodeScopeRegion + //-------------------------------------------------------------------------- if (scope == kOpcodeScopeRegion) { @@ -168,7 +176,7 @@ end_generic: YYCURSOR = opcode.c_str(); -#line 172 "src/sfizz/OpcodeCleanup.cpp" +#line 180 "src/sfizz/OpcodeCleanup.cpp" { char yych; yych = *YYCURSOR; @@ -189,214 +197,127 @@ end_generic: case 'g': yyt1 = YYCURSOR; goto yy26; + case 'h': goto yy27; case 'l': yyt1 = YYCURSOR; - goto yy27; - case 'o': goto yy28; + goto yy28; + case 'o': goto yy29; case 'p': yyt1 = YYCURSOR; - goto yy29; + goto yy30; case 'r': yyt1 = YYCURSOR; - goto yy30; + goto yy31; case 't': yyt1 = YYCURSOR; - goto yy31; + goto yy32; default: goto yy19; } yy19: ++YYCURSOR; yy20: -#line 149 "src/sfizz/OpcodeCleanup.re" +#line 166 "src/sfizz/OpcodeCleanup.re" { goto end_region; } -#line 215 "src/sfizz/OpcodeCleanup.cpp" +#line 224 "src/sfizz/OpcodeCleanup.cpp" yy21: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'm': goto yy32; + case 'm': goto yy33; default: goto yy20; } yy22: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'e': goto yy34; + case 'e': goto yy35; default: goto yy20; } yy23: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'u': goto yy35; + case 'u': goto yy36; default: goto yy20; } yy24: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'q': goto yy36; + case 'q': goto yy37; default: goto yy20; } yy25: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'i': goto yy37; + case 'i': goto yy38; default: goto yy20; } yy26: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'a': goto yy38; + case 'a': goto yy39; default: goto yy20; } yy27: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'f': goto yy39; - case 'o': goto yy40; + case 'i': goto yy40; default: goto yy20; } yy28: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case 'f': goto yy41; - case 'n': goto yy42; + case 'o': goto yy42; default: goto yy20; } yy29: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'i': goto yy43; - case 'o': goto yy44; + case 'f': goto yy43; + case 'n': goto yy44; default: goto yy20; } yy30: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'e': goto yy45; + case 'i': goto yy45; + case 'o': goto yy46; default: goto yy20; } yy31: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'u': goto yy46; + case 'e': goto yy47; default: goto yy20; } yy32: - yych = *++YYCURSOR; + yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'p': goto yy47; - default: goto yy33; + case 'u': goto yy48; + default: goto yy20; } yy33: - YYCURSOR = YYMARKER; - goto yy20; -yy34: yych = *++YYCURSOR; switch (yych) { - case 'n': goto yy48; - default: goto yy33; + case 'p': goto yy49; + default: goto yy34; } +yy34: + YYCURSOR = YYMARKER; + goto yy20; yy35: yych = *++YYCURSOR; switch (yych) { - case 't': goto yy49; - default: goto yy33; + case 'n': goto yy50; + default: goto yy34; } yy36: yych = *++YYCURSOR; switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy50; - default: goto yy33; + case 't': goto yy51; + default: goto yy34; } yy37: - yych = *++YYCURSOR; - switch (yych) { - case 'l': goto yy52; - default: goto yy33; - } -yy38: - yych = *++YYCURSOR; - switch (yych) { - case 'i': goto yy53; - default: goto yy33; - } -yy39: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy54; - default: goto yy33; - } -yy40: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy55; - default: goto yy33; - } -yy41: - yych = *++YYCURSOR; - switch (yych) { - case 'f': goto yy56; - default: goto yy33; - } -yy42: - yych = *++YYCURSOR; - switch (yych) { - case '_': goto yy57; - default: goto yy33; - } -yy43: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy58; - default: goto yy33; - } -yy44: - yych = *++YYCURSOR; - switch (yych) { - case 'l': goto yy59; - default: goto yy33; - } -yy45: - yych = *++YYCURSOR; - switch (yych) { - case 's': goto yy60; - default: goto yy33; - } -yy46: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy61; - default: goto yy33; - } -yy47: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy62; - case 'l': goto yy63; - default: goto yy33; - } -yy48: - yych = *++YYCURSOR; - switch (yych) { - case 'd': goto yy64; - default: goto yy33; - } -yy49: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy65; - default: goto yy33; - } -yy50: yych = *++YYCURSOR; switch (yych) { case '0': @@ -408,9 +329,94 @@ yy50: case '6': case '7': case '8': - case '9': goto yy50; - case '_': goto yy66; - default: goto yy33; + case '9': goto yy52; + default: goto yy34; + } +yy38: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy54; + default: goto yy34; + } +yy39: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy55; + default: goto yy34; + } +yy40: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy56; + default: goto yy34; + } +yy41: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy57; + default: goto yy34; + } +yy42: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy58; + case 'r': goto yy56; + default: goto yy34; + } +yy43: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy59; + default: goto yy34; + } +yy44: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy60; + default: goto yy34; + } +yy45: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy61; + default: goto yy34; + } +yy46: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy62; + default: goto yy34; + } +yy47: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy63; + default: goto yy34; + } +yy48: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy64; + default: goto yy34; + } +yy49: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy65; + case 'l': goto yy66; + default: goto yy34; + } +yy50: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy67; + default: goto yy34; + } +yy51: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy68; + default: goto yy34; } yy52: yych = *++YYCURSOR; @@ -424,20 +430,9 @@ yy52: case '6': case '7': case '8': - case '9': - yyt1 = YYCURSOR; - goto yy67; + case '9': goto yy52; case '_': goto yy69; - case 'e': goto yy62; - case 'l': goto yy63; - case 't': goto yy70; - default: goto yy33; - } -yy53: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy71; - default: goto yy33; + default: goto yy34; } yy54: yych = *++YYCURSOR; @@ -451,138 +446,134 @@ yy54: case '6': case '7': case '8': - case '9': goto yy72; - default: goto yy33; + case '9': + yyt1 = YYCURSOR; + goto yy70; + case '_': goto yy72; + case 'e': goto yy65; + case 'l': goto yy66; + case 't': goto yy73; + default: goto yy34; } yy55: yych = *++YYCURSOR; switch (yych) { - case 'p': goto yy74; - default: goto yy33; + case 'n': goto yy74; + default: goto yy34; } yy56: yych = *++YYCURSOR; switch (yych) { - case 'b': - yyt1 = YYCURSOR; - goto yy75; - case 'm': - yyt1 = YYCURSOR; - goto yy76; - default: goto yy33; + case 'e': goto yy75; + default: goto yy34; } yy57: yych = *++YYCURSOR; switch (yych) { - case 'h': goto yy77; - case 'l': goto yy78; - default: goto yy33; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy76; + default: goto yy34; } yy58: yych = *++YYCURSOR; switch (yych) { - case 'c': goto yy79; - default: goto yy33; + case 'p': goto yy78; + default: goto yy34; } yy59: yych = *++YYCURSOR; switch (yych) { - case 'y': goto yy80; - default: goto yy33; + case 'b': + yyt1 = YYCURSOR; + goto yy79; + case 'm': + yyt1 = YYCURSOR; + goto yy80; + default: goto yy34; } yy60: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy81; - default: goto yy33; + case 'h': goto yy81; + case 'l': goto yy82; + default: goto yy34; } yy61: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy82; - default: goto yy33; + case 'c': goto yy83; + default: goto yy34; } yy62: yych = *++YYCURSOR; switch (yych) { - case 'g': goto yy83; - default: goto yy33; + case 'y': goto yy84; + default: goto yy34; } yy63: yych = *++YYCURSOR; switch (yych) { - case 'f': goto yy84; - default: goto yy33; + case 'o': goto yy85; + default: goto yy34; } yy64: yych = *++YYCURSOR; switch (yych) { - case 'd': - yyt1 = YYCURSOR; - goto yy85; - case 'u': - yyt1 = YYCURSOR; - goto yy86; - default: goto yy33; + case 'e': goto yy86; + default: goto yy34; } yy65: yych = *++YYCURSOR; switch (yych) { - case 'f': goto yy87; - default: goto yy33; + case 'g': goto yy87; + default: goto yy34; } yy66: yych = *++YYCURSOR; switch (yych) { - case 'b': - yyt2 = YYCURSOR; - goto yy88; - case 'f': - yyt2 = YYCURSOR; - goto yy89; - case 'g': - yyt2 = YYCURSOR; - goto yy90; - default: goto yy33; + case 'f': goto yy88; + default: goto yy34; } yy67: yych = *++YYCURSOR; switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy67; - case 't': goto yy91; - default: goto yy33; + case 'd': + yyt1 = YYCURSOR; + goto yy89; + case 'u': + yyt1 = YYCURSOR; + goto yy90; + default: goto yy34; + } +yy68: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy91; + default: goto yy34; } yy69: yych = *++YYCURSOR; - yyt1 = YYCURSOR; - goto yy95; + switch (yych) { + case 'b': + yyt2 = YYCURSOR; + goto yy92; + case 'f': + yyt2 = YYCURSOR; + goto yy93; + case 'g': + yyt2 = YYCURSOR; + goto yy94; + default: goto yy34; + } yy70: - yych = *++YYCURSOR; - switch (yych) { - case 'y': goto yy96; - default: goto yy33; - } -yy71: - yych = *++YYCURSOR; - switch (yych) { - case 0x00: - yyt2 = yyt3 = NULL; - goto yy97; - case '_': - yyt3 = YYCURSOR; - goto yy99; - default: goto yy33; - } -yy72: yych = *++YYCURSOR; switch (yych) { case '0': @@ -594,463 +585,790 @@ yy72: case '6': case '7': case '8': - case '9': goto yy72; - case '_': goto yy101; - default: goto yy33; + case '9': goto yy70; + case 't': goto yy95; + default: goto yy34; + } +yy72: + yych = *++YYCURSOR; + yyt1 = YYCURSOR; + goto yy99; +yy73: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy100; + default: goto yy34; } yy74: yych = *++YYCURSOR; switch (yych) { - case 'e': - yyt1 = YYCURSOR; - goto yy102; - case 'm': - yyt1 = YYCURSOR; + case 0x00: + yyt2 = yyt3 = NULL; + goto yy101; + case '_': + yyt3 = YYCURSOR; goto yy103; - case 's': - yyt1 = YYCURSOR; - goto yy104; - default: goto yy33; + default: goto yy34; } yy75: yych = *++YYCURSOR; switch (yych) { - case 'y': goto yy105; - default: goto yy33; + case 'a': goto yy105; + default: goto yy34; } yy76: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy106; - default: goto yy33; - } -yy77: - yych = *++YYCURSOR; - switch (yych) { - case 'i': goto yy107; - default: goto yy33; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy76; + case '_': goto yy106; + default: goto yy34; } yy78: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy107; - default: goto yy33; + case 'e': + yyt1 = YYCURSOR; + goto yy107; + case 'm': + yyt1 = YYCURSOR; + goto yy108; + case 's': + yyt1 = YYCURSOR; + goto yy109; + default: goto yy34; } yy79: yych = *++YYCURSOR; switch (yych) { - case 'h': goto yy47; - default: goto yy33; + case 'y': goto yy110; + default: goto yy34; } yy80: yych = *++YYCURSOR; switch (yych) { - case 'p': goto yy108; - default: goto yy33; + case 'o': goto yy111; + default: goto yy34; } yy81: yych = *++YYCURSOR; switch (yych) { - case 'n': goto yy109; - default: goto yy33; + case 'i': goto yy112; + default: goto yy34; } yy82: yych = *++YYCURSOR; switch (yych) { - case 0x00: - yyt2 = yyt3 = NULL; - goto yy110; - case '_': - yyt3 = YYCURSOR; - goto yy112; - default: goto yy33; + case 'o': goto yy112; + default: goto yy34; } yy83: yych = *++YYCURSOR; switch (yych) { - case '_': goto yy114; - default: goto yy33; + case 'h': goto yy49; + default: goto yy34; } yy84: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy115; - default: goto yy33; + case 'p': goto yy113; + default: goto yy34; } yy85: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy116; - default: goto yy33; + case 'n': goto yy114; + default: goto yy34; } yy86: yych = *++YYCURSOR; switch (yych) { - case 'p': goto yy117; - default: goto yy33; + case 0x00: + yyt2 = yyt3 = NULL; + goto yy115; + case '_': + yyt3 = YYCURSOR; + goto yy117; + default: goto yy34; } yy87: yych = *++YYCURSOR; switch (yych) { - case 'f': goto yy118; - default: goto yy33; + case '_': goto yy119; + default: goto yy34; } yy88: yych = *++YYCURSOR; switch (yych) { - case 'w': goto yy119; - default: goto yy33; + case 'o': goto yy120; + default: goto yy34; } yy89: yych = *++YYCURSOR; switch (yych) { - case 'r': goto yy120; - default: goto yy33; + case 'o': goto yy121; + default: goto yy34; } yy90: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy121; - default: goto yy33; + case 'p': goto yy122; + default: goto yy34; } yy91: yych = *++YYCURSOR; switch (yych) { - case 'y': goto yy122; - default: goto yy33; + case 'f': goto yy123; + default: goto yy34; } yy92: + yych = *++YYCURSOR; + switch (yych) { + case 'w': goto yy124; + default: goto yy34; + } +yy93: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy125; + default: goto yy34; + } +yy94: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy126; + default: goto yy34; + } +yy95: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy127; + default: goto yy34; + } +yy96: ++YYCURSOR; yynmatch = 2; yypmatch[2] = yyt1; yypmatch[0] = yyt1 - 4; yypmatch[1] = YYCURSOR; yypmatch[3] = YYCURSOR - 1; -#line 136 "src/sfizz/OpcodeCleanup.re" +#line 148 "src/sfizz/OpcodeCleanup.re" { - opcode = absl::StrCat("fil1_", group(1)); - goto end_region; - } -#line 735 "src/sfizz/OpcodeCleanup.cpp" -yy94: + opcode = absl::StrCat("fil1_", group(1)); + goto end_region; + } +#line 769 "src/sfizz/OpcodeCleanup.cpp" +yy98: yych = *++YYCURSOR; -yy95: - if (yych <= 0x00) goto yy92; - goto yy94; -yy96: +yy99: + if (yych <= 0x00) goto yy96; + goto yy98; +yy100: yych = *++YYCURSOR; switch (yych) { - case 'p': goto yy123; - default: goto yy33; + case 'p': goto yy128; + default: goto yy34; } -yy97: +yy101: ++YYCURSOR; yynmatch = 2; yypmatch[0] = yyt1; yypmatch[2] = yyt3; yypmatch[3] = yyt2; yypmatch[1] = YYCURSOR; -#line 122 "src/sfizz/OpcodeCleanup.re" +#line 130 "src/sfizz/OpcodeCleanup.re" { - opcode = absl::StrCat("volume", group(1)); - goto end_region; - } -#line 759 "src/sfizz/OpcodeCleanup.cpp" -yy99: + opcode = absl::StrCat("volume", group(1)); + goto end_region; + } +#line 793 "src/sfizz/OpcodeCleanup.cpp" +yy103: yych = *++YYCURSOR; if (yych <= 0x00) { yyt2 = YYCURSOR; - goto yy97; + goto yy101; } - goto yy99; -yy101: + goto yy103; +yy105: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy129; + default: goto yy34; + } +yy106: yych = *++YYCURSOR; switch (yych) { case 'o': yyt2 = YYCURSOR; - goto yy124; + goto yy130; case 'r': yyt2 = YYCURSOR; - goto yy125; + goto yy131; case 's': yyt2 = YYCURSOR; - goto yy126; + goto yy132; case 'w': yyt2 = YYCURSOR; - goto yy127; - default: goto yy33; - } -yy102: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy128; - default: goto yy33; - } -yy103: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy129; - default: goto yy33; - } -yy104: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy130; - default: goto yy33; - } -yy105: - yych = *++YYCURSOR; - if (yych <= 0x00) goto yy131; - goto yy33; -yy106: - yych = *++YYCURSOR; - switch (yych) { - case 'd': goto yy133; - default: goto yy33; + goto yy133; + default: goto yy34; } yy107: yych = *++YYCURSOR; switch (yych) { - case 'c': goto yy134; - default: goto yy33; + case 'n': goto yy134; + default: goto yy34; } yy108: yych = *++YYCURSOR; switch (yych) { - case 'h': goto yy135; - default: goto yy33; + case 'o': goto yy135; + default: goto yy34; } yy109: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy136; - default: goto yy33; + case 't': goto yy136; + default: goto yy34; } yy110: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy137; + goto yy34; +yy111: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy139; + default: goto yy34; + } +yy112: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy140; + case 'h': goto yy141; + default: goto yy34; + } +yy113: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy142; + default: goto yy34; + } +yy114: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy143; + default: goto yy34; + } +yy115: ++YYCURSOR; yynmatch = 2; yypmatch[0] = yyt1; yypmatch[2] = yyt3; yypmatch[3] = yyt2; yypmatch[1] = YYCURSOR; -#line 126 "src/sfizz/OpcodeCleanup.re" +#line 134 "src/sfizz/OpcodeCleanup.re" { - opcode = absl::StrCat("pitch", group(1)); - goto end_region; - } -#line 842 "src/sfizz/OpcodeCleanup.cpp" -yy112: + opcode = absl::StrCat("pitch", group(1)); + goto end_region; + } +#line 883 "src/sfizz/OpcodeCleanup.cpp" +yy117: yych = *++YYCURSOR; if (yych <= 0x00) { yyt2 = YYCURSOR; - goto yy110; + goto yy115; } - goto yy112; -yy114: + goto yy117; +yy119: yych = *++YYCURSOR; switch (yych) { case 'a': yyt2 = YYCURSOR; - goto yy137; + goto yy144; case 'd': yyt2 = YYCURSOR; - goto yy138; + goto yy145; case 'h': yyt2 = YYCURSOR; - goto yy139; + goto yy146; case 'r': yyt2 = YYCURSOR; - goto yy140; + goto yy147; case 's': yyt2 = YYCURSOR; - goto yy141; - default: goto yy33; - } -yy115: - yych = *++YYCURSOR; - switch (yych) { - case '_': goto yy142; - default: goto yy33; - } -yy116: - yych = *++YYCURSOR; - switch (yych) { - case 'w': goto yy143; - default: goto yy33; - } -yy117: - yych = *++YYCURSOR; - if (yych <= 0x00) goto yy144; - goto yy33; -yy118: - yych = *++YYCURSOR; - switch (yych) { - case 0x00: - yyt2 = yyt3 = NULL; - goto yy146; - case '_': - yyt3 = YYCURSOR; goto yy148; - default: goto yy33; - } -yy119: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy150; - default: goto yy33; + default: goto yy34; } yy120: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy151; - default: goto yy33; + case '_': goto yy149; + default: goto yy34; } yy121: yych = *++YYCURSOR; switch (yych) { - case 'i': goto yy152; - default: goto yy33; + case 'w': goto yy150; + default: goto yy34; } yy122: yych = *++YYCURSOR; - switch (yych) { - case 'p': goto yy153; - default: goto yy33; - } + if (yych <= 0x00) goto yy151; + goto yy34; yy123: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy154; - default: goto yy33; + case 0x00: + yyt2 = yyt3 = NULL; + goto yy153; + case '_': + yyt3 = YYCURSOR; + goto yy155; + default: goto yy34; } yy124: yych = *++YYCURSOR; switch (yych) { - case 'f': goto yy155; - default: goto yy33; + case 'c': goto yy157; + default: goto yy34; } yy125: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy156; - default: goto yy33; + case 'e': goto yy158; + default: goto yy34; } yy126: yych = *++YYCURSOR; switch (yych) { - case 'c': goto yy157; - default: goto yy33; + case 'i': goto yy159; + default: goto yy34; } yy127: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy158; - default: goto yy33; + case 'p': goto yy160; + default: goto yy34; } yy128: yych = *++YYCURSOR; switch (yych) { - case 'd': goto yy159; - default: goto yy33; + case 'e': goto yy161; + default: goto yy34; } yy129: yych = *++YYCURSOR; switch (yych) { - case 'd': goto yy160; - default: goto yy33; + case 'c': goto yy162; + default: goto yy34; } yy130: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy161; - default: goto yy33; + case 'f': goto yy163; + default: goto yy34; } yy131: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy164; + default: goto yy34; + } +yy132: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy165; + default: goto yy34; + } +yy133: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy166; + default: goto yy34; + } +yy134: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy167; + default: goto yy34; + } +yy135: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy168; + default: goto yy34; + } +yy136: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy169; + default: goto yy34; + } +yy137: ++YYCURSOR; yynmatch = 2; yypmatch[2] = yyt1; yypmatch[0] = yyt1 - 3; yypmatch[1] = YYCURSOR; yypmatch[3] = YYCURSOR - 1; -#line 100 "src/sfizz/OpcodeCleanup.re" +#line 108 "src/sfizz/OpcodeCleanup.re" { opcode = absl::StrCat("off_", group(1)); goto end_region; } -#line 981 "src/sfizz/OpcodeCleanup.cpp" -yy133: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy105; - default: goto yy33; - } -yy134: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy162; - default: goto yy33; - } -yy135: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy163; - default: goto yy33; - } -yy136: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy164; - default: goto yy33; - } -yy137: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy165; - default: goto yy33; - } -yy138: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy166; - default: goto yy33; - } +#line 1028 "src/sfizz/OpcodeCleanup.cpp" yy139: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy167; - default: goto yy33; + case 'e': goto yy110; + default: goto yy34; } yy140: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy168; - default: goto yy33; + case 'c': goto yy170; + default: goto yy34; } yy141: yych = *++YYCURSOR; switch (yych) { - case 't': goto yy169; - case 'u': goto yy170; - default: goto yy33; + case 'd': goto yy171; + default: goto yy34; } yy142: yych = *++YYCURSOR; switch (yych) { - case 'd': - yyt2 = YYCURSOR; - goto yy171; - case 'f': - yyt2 = YYCURSOR; - goto yy172; - default: goto yy33; + case 'o': goto yy172; + default: goto yy34; } yy143: yych = *++YYCURSOR; switch (yych) { - case 'n': goto yy117; - default: goto yy33; + case 'n': goto yy173; + default: goto yy34; } yy144: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy174; + default: goto yy34; + } +yy145: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy175; + default: goto yy34; + } +yy146: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy176; + default: goto yy34; + } +yy147: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy177; + default: goto yy34; + } +yy148: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy178; + case 'u': goto yy179; + default: goto yy34; + } +yy149: + yych = *++YYCURSOR; + switch (yych) { + case 'd': + yyt2 = YYCURSOR; + goto yy180; + case 'f': + yyt2 = YYCURSOR; + goto yy181; + default: goto yy34; + } +yy150: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy122; + default: goto yy34; + } +yy151: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 4; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 1; +#line 112 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("bend_", group(1)); + goto end_region; + } +#line 1119 "src/sfizz/OpcodeCleanup.cpp" +yy153: + ++YYCURSOR; + yynmatch = 2; + yypmatch[0] = yyt1; + yypmatch[2] = yyt3; + yypmatch[3] = yyt2; + yypmatch[1] = YYCURSOR; +#line 152 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("cutoff1", group(1)); + goto end_region; + } +#line 1132 "src/sfizz/OpcodeCleanup.cpp" +yy155: + yych = *++YYCURSOR; + if (yych <= 0x00) { + yyt2 = YYCURSOR; + goto yy153; + } + goto yy155; +yy157: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy182; + default: goto yy34; + } +yy158: + yych = *++YYCURSOR; + switch (yych) { + case 'q': goto yy124; + default: goto yy34; + } +yy159: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy124; + default: goto yy34; + } +yy160: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy183; + default: goto yy34; + } +yy161: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy184; + goto yy34; +yy162: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy186; + default: goto yy34; + } +yy163: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy187; + default: goto yy34; + } +yy164: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy188; + default: goto yy34; + } +yy165: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy189; + default: goto yy34; + } +yy166: + yych = *++YYCURSOR; + switch (yych) { + case 'v': goto yy190; + default: goto yy34; + } +yy167: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy191; + goto yy34; +yy168: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy167; + default: goto yy34; + } +yy169: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy193; + default: goto yy34; + } +yy170: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = YYCURSOR; + goto yy194; + default: goto yy34; + } +yy171: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy196; + default: goto yy34; + } +yy172: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy197; + default: goto yy34; + } +yy173: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy198; + default: goto yy34; + } +yy174: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy199; + default: goto yy34; + } +yy175: + yych = *++YYCURSOR; + switch (yych) { + case 'c': + case 'l': goto yy200; + default: goto yy34; + } +yy176: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy201; + default: goto yy34; + } +yy177: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy202; + default: goto yy34; + } +yy178: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy203; + default: goto yy34; + } +yy179: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy204; + default: goto yy34; + } +yy180: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy205; + default: goto yy34; + } +yy181: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy206; + case 'r': goto yy207; + default: goto yy34; + } +yy182: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt3 = YYCURSOR; + goto yy208; + default: goto yy34; + } +yy183: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy210; + goto yy34; +yy184: + ++YYCURSOR; + yynmatch = 1; + yypmatch[0] = YYCURSOR - 8; + yypmatch[1] = YYCURSOR; +#line 116 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("fil1_type"); + goto end_region; + } +#line 1330 "src/sfizz/OpcodeCleanup.cpp" +yy186: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = YYCURSOR; + goto yy212; + default: goto yy34; + } +yy187: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy214; + default: goto yy34; + } +yy188: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy215; + default: goto yy34; + } +yy189: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy190; + default: goto yy34; + } +yy190: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy216; + default: goto yy34; + } +yy191: ++YYCURSOR; yynmatch = 2; yypmatch[2] = yyt1; @@ -1058,336 +1376,18 @@ yy144: yypmatch[1] = YYCURSOR; yypmatch[3] = YYCURSOR - 1; #line 104 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat("bend_", group(1)); - goto end_region; - } -#line 1066 "src/sfizz/OpcodeCleanup.cpp" -yy146: - ++YYCURSOR; - yynmatch = 2; - yypmatch[0] = yyt1; - yypmatch[2] = yyt3; - yypmatch[3] = yyt2; - yypmatch[1] = YYCURSOR; -#line 140 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat("cutoff1", group(1)); - goto end_region; - } -#line 1079 "src/sfizz/OpcodeCleanup.cpp" -yy148: - yych = *++YYCURSOR; - if (yych <= 0x00) { - yyt2 = YYCURSOR; - goto yy146; - } - goto yy148; -yy150: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy173; - default: goto yy33; - } -yy151: - yych = *++YYCURSOR; - switch (yych) { - case 'q': goto yy119; - default: goto yy33; - } -yy152: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy119; - default: goto yy33; - } -yy153: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy174; - default: goto yy33; - } -yy154: - yych = *++YYCURSOR; - if (yych <= 0x00) goto yy175; - goto yy33; -yy155: - yych = *++YYCURSOR; - switch (yych) { - case 'f': goto yy177; - default: goto yy33; - } -yy156: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy178; - default: goto yy33; - } -yy157: - yych = *++YYCURSOR; - switch (yych) { - case 'a': goto yy179; - default: goto yy33; - } -yy158: - yych = *++YYCURSOR; - switch (yych) { - case 'v': goto yy180; - default: goto yy33; - } -yy159: - yych = *++YYCURSOR; - if (yych <= 0x00) goto yy181; - goto yy33; -yy160: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy159; - default: goto yy33; - } -yy161: - yych = *++YYCURSOR; - switch (yych) { - case 'r': goto yy183; - default: goto yy33; - } -yy162: - yych = *++YYCURSOR; - switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - yyt1 = YYCURSOR; - goto yy184; - default: goto yy33; - } -yy163: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy186; - default: goto yy33; - } -yy164: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy187; - default: goto yy33; - } -yy165: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy188; - default: goto yy33; - } -yy166: - yych = *++YYCURSOR; - switch (yych) { - case 'c': - case 'l': goto yy189; - default: goto yy33; - } -yy167: - yych = *++YYCURSOR; - switch (yych) { - case 'l': goto yy190; - default: goto yy33; - } -yy168: - yych = *++YYCURSOR; - switch (yych) { - case 'l': goto yy191; - default: goto yy33; - } -yy169: - yych = *++YYCURSOR; - switch (yych) { - case 'a': goto yy192; - default: goto yy33; - } -yy170: - yych = *++YYCURSOR; - switch (yych) { - case 's': goto yy193; - default: goto yy33; - } -yy171: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy194; - default: goto yy33; - } -yy172: - yych = *++YYCURSOR; - switch (yych) { - case 'a': goto yy195; - case 'r': goto yy196; - default: goto yy33; - } -yy173: - yych = *++YYCURSOR; - switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - yyt3 = YYCURSOR; - goto yy197; - default: goto yy33; - } -yy174: - yych = *++YYCURSOR; - if (yych <= 0x00) goto yy199; - goto yy33; -yy175: - ++YYCURSOR; - yynmatch = 1; - yypmatch[0] = YYCURSOR - 8; - yypmatch[1] = YYCURSOR; -#line 108 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat("fil1_type"); - goto end_region; - } -#line 1265 "src/sfizz/OpcodeCleanup.cpp" -yy177: - yych = *++YYCURSOR; - switch (yych) { - case 's': goto yy201; - default: goto yy33; - } -yy178: - yych = *++YYCURSOR; - switch (yych) { - case 'i': goto yy202; - default: goto yy33; - } -yy179: - yych = *++YYCURSOR; - switch (yych) { - case 'l': goto yy180; - default: goto yy33; - } -yy180: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy203; - default: goto yy33; - } -yy181: - ++YYCURSOR; - yynmatch = 2; - yypmatch[2] = yyt1; - yypmatch[0] = yyt1 - 4; - yypmatch[1] = YYCURSOR; - yypmatch[3] = YYCURSOR - 1; -#line 96 "src/sfizz/OpcodeCleanup.re" { opcode = absl::StrCat("loop_", group(1)); goto end_region; } -#line 1302 "src/sfizz/OpcodeCleanup.cpp" -yy183: - yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy159; - default: goto yy33; - } -yy184: - yych = *++YYCURSOR; - switch (yych) { - case 0x00: goto yy204; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy184; - default: goto yy33; - } -yy186: - yych = *++YYCURSOR; - switch (yych) { - case 'y': goto yy206; - default: goto yy33; - } -yy187: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy207; - default: goto yy33; - } -yy188: - yych = *++YYCURSOR; - switch (yych) { - case 'a': goto yy208; - default: goto yy33; - } -yy189: - yych = *++YYCURSOR; - switch (yych) { - case 'a': goto yy209; - default: goto yy33; - } -yy190: - yych = *++YYCURSOR; - switch (yych) { - case 'd': goto yy210; - default: goto yy33; - } -yy191: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy211; - default: goto yy33; - } -yy192: - yych = *++YYCURSOR; - switch (yych) { - case 'r': goto yy212; - default: goto yy33; - } +#line 1384 "src/sfizz/OpcodeCleanup.cpp" yy193: yych = *++YYCURSOR; switch (yych) { - case 't': goto yy213; - default: goto yy33; + case 't': goto yy167; + default: goto yy34; } yy194: - yych = *++YYCURSOR; - switch (yych) { - case 'p': goto yy214; - default: goto yy33; - } -yy195: - yych = *++YYCURSOR; - switch (yych) { - case 'd': goto yy215; - default: goto yy33; - } -yy196: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy216; - default: goto yy33; - } -yy197: yych = *++YYCURSOR; switch (yych) { case 0x00: goto yy217; @@ -1400,39 +1400,143 @@ yy197: case '6': case '7': case '8': - case '9': goto yy197; - default: goto yy33; + case '9': goto yy194; + default: goto yy34; + } +yy196: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy219; + default: goto yy34; + } +yy197: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy220; + default: goto yy34; + } +yy198: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy221; + default: goto yy34; } yy199: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy222; + default: goto yy34; + } +yy200: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy223; + default: goto yy34; + } +yy201: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy224; + default: goto yy34; + } +yy202: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy225; + default: goto yy34; + } +yy203: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy226; + default: goto yy34; + } +yy204: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy227; + default: goto yy34; + } +yy205: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy228; + default: goto yy34; + } +yy206: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy229; + default: goto yy34; + } +yy207: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy230; + default: goto yy34; + } +yy208: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy231; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy208; + default: goto yy34; + } +yy210: ++YYCURSOR; yynmatch = 2; yypmatch[2] = yyt1; yypmatch[0] = yyt1 - 3; yypmatch[1] = YYCURSOR; yypmatch[3] = YYCURSOR - 5; -#line 112 "src/sfizz/OpcodeCleanup.re" +#line 120 "src/sfizz/OpcodeCleanup.re" { opcode = absl::StrCat("fil", group(1), "_type"); goto end_region; } -#line 1419 "src/sfizz/OpcodeCleanup.cpp" -yy201: +#line 1507 "src/sfizz/OpcodeCleanup.cpp" +yy212: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy219; - default: goto yy33; + case 0x00: goto yy233; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy212; + default: goto yy34; } -yy202: +yy214: yych = *++YYCURSOR; switch (yych) { - case 'o': goto yy203; - default: goto yy33; + case 'e': goto yy235; + default: goto yy34; } -yy203: +yy215: yych = *++YYCURSOR; - if (yych <= 0x00) goto yy220; - goto yy33; -yy204: + switch (yych) { + case 'o': goto yy216; + default: goto yy34; + } +yy216: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy236; + goto yy34; +yy217: ++YYCURSOR; yynmatch = 3; yypmatch[4] = yyt1; @@ -1441,84 +1545,372 @@ yy204: yypmatch[2] = yyt1 - 4; yypmatch[3] = yyt1 - 2; yypmatch[5] = YYCURSOR - 1; -#line 131 "src/sfizz/OpcodeCleanup.re" +#line 139 "src/sfizz/OpcodeCleanup.re" { opcode = absl::StrCat("start_", group(1), "cc", group(2)); goto end_region; } -#line 1450 "src/sfizz/OpcodeCleanup.cpp" -yy206: +#line 1554 "src/sfizz/OpcodeCleanup.cpp" +yy219: yych = *++YYCURSOR; switch (yych) { - case '_': goto yy222; - default: goto yy33; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = YYCURSOR; + goto yy238; + default: goto yy34; } -yy207: +yy220: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy240; + default: goto yy34; + } +yy221: yych = *++YYCURSOR; switch (yych) { case 0x00: yyt2 = yyt3 = NULL; - goto yy223; + goto yy241; case '_': yyt3 = YYCURSOR; - goto yy225; - default: goto yy33; + goto yy243; + default: goto yy34; } -yy208: +yy222: yych = *++YYCURSOR; switch (yych) { - case 'c': goto yy227; - default: goto yy33; + case 'c': goto yy245; + default: goto yy34; } -yy209: +yy223: yych = *++YYCURSOR; switch (yych) { - case 'y': goto yy210; - default: goto yy33; + case 'y': goto yy224; + default: goto yy34; } -yy210: +yy224: yych = *++YYCURSOR; switch (yych) { - case 'c': goto yy228; - default: goto yy33; + case 'c': goto yy246; + default: goto yy34; } -yy211: +yy225: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy229; - default: goto yy33; + case 'a': goto yy247; + default: goto yy34; } -yy212: +yy226: yych = *++YYCURSOR; switch (yych) { - case 't': goto yy210; - default: goto yy33; + case 't': goto yy224; + default: goto yy34; } -yy213: +yy227: yych = *++YYCURSOR; switch (yych) { - case 'a': goto yy230; - default: goto yy33; + case 'a': goto yy248; + default: goto yy34; } -yy214: +yy228: yych = *++YYCURSOR; switch (yych) { - case 't': goto yy231; - default: goto yy33; + case 't': goto yy249; + default: goto yy34; } -yy215: +yy229: yych = *++YYCURSOR; switch (yych) { - case 'e': goto yy232; - default: goto yy33; + case 'e': goto yy250; + default: goto yy34; } -yy216: +yy230: yych = *++YYCURSOR; switch (yych) { - case 'q': goto yy232; - default: goto yy33; + case 'q': goto yy250; + default: goto yy34; } -yy217: +yy231: + ++YYCURSOR; + yynmatch = 4; + yypmatch[2] = yyt1; + yypmatch[4] = yyt2; + yypmatch[6] = yyt3; + yypmatch[0] = yyt1; + yypmatch[1] = YYCURSOR; + yypmatch[3] = yyt2 - 1; + yypmatch[5] = yyt3 - 2; + yypmatch[7] = YYCURSOR - 1; +#line 95 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } +#line 1659 "src/sfizz/OpcodeCleanup.cpp" +yy233: + ++YYCURSOR; + yynmatch = 3; + yypmatch[4] = yyt1; + yypmatch[0] = yyt1 - 8; + yypmatch[1] = YYCURSOR; + yypmatch[2] = yyt1 - 8; + yypmatch[3] = yyt1 - 6; + yypmatch[5] = YYCURSOR - 1; +#line 161 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "hdcc", group(2)); + goto end_region; + } +#line 1674 "src/sfizz/OpcodeCleanup.cpp" +yy235: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy216; + default: goto yy34; + } +yy236: + ++YYCURSOR; + yynmatch = 3; + yypmatch[2] = yyt1; + yypmatch[4] = yyt2; + yypmatch[0] = yyt1; + yypmatch[1] = YYCURSOR; + yypmatch[3] = yyt2 - 1; + yypmatch[5] = YYCURSOR - 1; +#line 99 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "_", group(2), "1"); + goto end_region; + } +#line 1695 "src/sfizz/OpcodeCleanup.cpp" +yy238: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy251; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy238; + default: goto yy34; + } +yy240: + yych = *++YYCURSOR; + switch (yych) { + case 'g': goto yy253; + default: goto yy34; + } +yy241: + ++YYCURSOR; + yynmatch = 2; + yypmatch[0] = yyt1; + yypmatch[2] = yyt3; + yypmatch[3] = yyt2; + yypmatch[1] = YYCURSOR; +#line 156 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("resonance1", group(1)); + goto end_region; + } +#line 1730 "src/sfizz/OpcodeCleanup.cpp" +yy243: + yych = *++YYCURSOR; + if (yych <= 0x00) { + yyt2 = YYCURSOR; + goto yy241; + } + goto yy243; +yy245: + yych = *++YYCURSOR; + switch (yych) { + case 'k': goto yy224; + default: goto yy34; + } +yy246: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy254; + default: goto yy34; + } +yy247: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy255; + default: goto yy34; + } +yy248: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy256; + default: goto yy34; + } +yy249: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy250; + default: goto yy34; + } +yy250: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy257; + default: goto yy34; + } +yy251: + ++YYCURSOR; + yynmatch = 3; + yypmatch[4] = yyt1; + yypmatch[0] = yyt1 - 9; + yypmatch[1] = YYCURSOR; + yypmatch[2] = yyt1 - 6; + yypmatch[3] = yyt1 - 4; + yypmatch[5] = YYCURSOR - 1; +#line 143 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("start_", group(1), "hdcc", group(2)); + goto end_region; + } +#line 1788 "src/sfizz/OpcodeCleanup.cpp" +yy253: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy258; + default: goto yy34; + } +yy254: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt3 = YYCURSOR; + goto yy259; + default: goto yy34; + } +yy255: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy224; + default: goto yy34; + } +yy256: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy224; + default: goto yy34; + } +yy257: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy261; + default: goto yy34; + } +yy258: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy262; + default: goto yy34; + } +yy259: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy263; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy259; + default: goto yy34; + } +yy261: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt3 = YYCURSOR; + goto yy265; + default: goto yy34; + } +yy262: + yych = *++YYCURSOR; + switch (yych) { + case 'u': goto yy267; + default: goto yy34; + } +yy263: + ++YYCURSOR; + yynmatch = 4; + yypmatch[2] = yyt1; + yypmatch[4] = yyt2; + yypmatch[6] = yyt3; + yypmatch[0] = yyt1; + yypmatch[1] = YYCURSOR; + yypmatch[3] = yyt2 - 1; + yypmatch[5] = yyt3 - 2; + yypmatch[7] = YYCURSOR - 1; +#line 91 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } +#line 1891 "src/sfizz/OpcodeCleanup.cpp" +yy265: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy268; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy265; + default: goto yy34; + } +yy267: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy270; + default: goto yy34; + } +yy268: ++YYCURSOR; yynmatch = 4; yypmatch[2] = yyt1; @@ -1534,247 +1926,22 @@ yy217: opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); goto end_region; } -#line 1538 "src/sfizz/OpcodeCleanup.cpp" -yy219: +#line 1930 "src/sfizz/OpcodeCleanup.cpp" +yy270: yych = *++YYCURSOR; - switch (yych) { - case 't': goto yy203; - default: goto yy33; - } -yy220: - ++YYCURSOR; - yynmatch = 3; - yypmatch[2] = yyt1; - yypmatch[4] = yyt2; - yypmatch[0] = yyt1; - yypmatch[1] = YYCURSOR; - yypmatch[3] = yyt2 - 1; - yypmatch[5] = YYCURSOR - 1; -#line 91 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat(group(1), "_", group(2), "1"); - goto end_region; - } -#line 1559 "src/sfizz/OpcodeCleanup.cpp" -yy222: - yych = *++YYCURSOR; - switch (yych) { - case 'g': goto yy233; - default: goto yy33; - } -yy223: - ++YYCURSOR; - yynmatch = 2; - yypmatch[0] = yyt1; - yypmatch[2] = yyt3; - yypmatch[3] = yyt2; - yypmatch[1] = YYCURSOR; -#line 144 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat("resonance1", group(1)); - goto end_region; - } -#line 1578 "src/sfizz/OpcodeCleanup.cpp" -yy225: - yych = *++YYCURSOR; - if (yych <= 0x00) { - yyt2 = YYCURSOR; - goto yy223; - } - goto yy225; -yy227: - yych = *++YYCURSOR; - switch (yych) { - case 'k': goto yy210; - default: goto yy33; - } -yy228: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy234; - default: goto yy33; - } -yy229: - yych = *++YYCURSOR; - switch (yych) { - case 's': goto yy235; - default: goto yy33; - } -yy230: - yych = *++YYCURSOR; - switch (yych) { - case 'i': goto yy236; - default: goto yy33; - } -yy231: - yych = *++YYCURSOR; - switch (yych) { - case 'h': goto yy232; - default: goto yy33; - } -yy232: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy237; - default: goto yy33; - } -yy233: - yych = *++YYCURSOR; - switch (yych) { - case 'r': goto yy238; - default: goto yy33; - } -yy234: - yych = *++YYCURSOR; - switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - yyt3 = YYCURSOR; - goto yy239; - default: goto yy33; - } -yy235: - yych = *++YYCURSOR; - switch (yych) { - case 'e': goto yy210; - default: goto yy33; - } -yy236: - yych = *++YYCURSOR; - switch (yych) { - case 'n': goto yy210; - default: goto yy33; - } -yy237: - yych = *++YYCURSOR; - switch (yych) { - case 'c': goto yy241; - default: goto yy33; - } -yy238: - yych = *++YYCURSOR; - switch (yych) { - case 'o': goto yy242; - default: goto yy33; - } -yy239: - yych = *++YYCURSOR; - switch (yych) { - case 0x00: goto yy243; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy239; - default: goto yy33; - } -yy241: - yych = *++YYCURSOR; - switch (yych) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - yyt3 = YYCURSOR; - goto yy245; - default: goto yy33; - } -yy242: - yych = *++YYCURSOR; - switch (yych) { - case 'u': goto yy247; - default: goto yy33; - } -yy243: - ++YYCURSOR; - yynmatch = 4; - yypmatch[2] = yyt1; - yypmatch[4] = yyt2; - yypmatch[6] = yyt3; - yypmatch[0] = yyt1; - yypmatch[1] = YYCURSOR; - yypmatch[3] = yyt2 - 1; - yypmatch[5] = yyt3 - 2; - yypmatch[7] = YYCURSOR - 1; -#line 83 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); - goto end_region; - } -#line 1724 "src/sfizz/OpcodeCleanup.cpp" -yy245: - yych = *++YYCURSOR; - switch (yych) { - case 0x00: goto yy248; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy245; - default: goto yy33; - } -yy247: - yych = *++YYCURSOR; - switch (yych) { - case 'p': goto yy250; - default: goto yy33; - } -yy248: - ++YYCURSOR; - yynmatch = 4; - yypmatch[2] = yyt1; - yypmatch[4] = yyt2; - yypmatch[6] = yyt3; - yypmatch[0] = yyt1; - yypmatch[1] = YYCURSOR; - yypmatch[3] = yyt2 - 1; - yypmatch[5] = yyt3 - 2; - yypmatch[7] = YYCURSOR - 1; -#line 79 "src/sfizz/OpcodeCleanup.re" - { - opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); - goto end_region; - } -#line 1763 "src/sfizz/OpcodeCleanup.cpp" -yy250: - yych = *++YYCURSOR; - if (yych >= 0x01) goto yy33; + if (yych >= 0x01) goto yy34; ++YYCURSOR; yynmatch = 1; yypmatch[0] = YYCURSOR - 16; yypmatch[1] = YYCURSOR; -#line 117 "src/sfizz/OpcodeCleanup.re" +#line 125 "src/sfizz/OpcodeCleanup.re" { opcode = "group"; goto end_region; - } -#line 1776 "src/sfizz/OpcodeCleanup.cpp" + } +#line 1943 "src/sfizz/OpcodeCleanup.cpp" } -#line 153 "src/sfizz/OpcodeCleanup.re" +#line 170 "src/sfizz/OpcodeCleanup.re" end_region: @@ -1784,6 +1951,142 @@ end_region: //-------------------------------------------------------------------------- + if (scope == kOpcodeScopeControl) { + + YYCURSOR = opcode.c_str(); + + +#line 1960 "src/sfizz/OpcodeCleanup.cpp" +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case 's': goto yy277; + default: goto yy275; + } +yy275: + ++YYCURSOR; +yy276: +#line 190 "src/sfizz/OpcodeCleanup.re" + { + goto end_control; + } +#line 1975 "src/sfizz/OpcodeCleanup.cpp" +yy277: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'e': goto yy278; + default: goto yy276; + } +yy278: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy280; + default: goto yy279; + } +yy279: + YYCURSOR = YYMARKER; + goto yy276; +yy280: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy281; + default: goto yy279; + } +yy281: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy282; + default: goto yy279; + } +yy282: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy283; + default: goto yy279; + } +yy283: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy284; + default: goto yy279; + } +yy284: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy285; + default: goto yy279; + } +yy285: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy286; + default: goto yy279; + } +yy286: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy287; + default: goto yy279; + } +yy287: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = YYCURSOR; + goto yy288; + default: goto yy279; + } +yy288: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy290; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy288; + default: goto yy279; + } +yy290: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 10; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 1; +#line 185 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("set_hdcc", group(1)); + goto end_control; + } +#line 2078 "src/sfizz/OpcodeCleanup.cpp" +} +#line 194 "src/sfizz/OpcodeCleanup.re" + + +end_control: + /* end */; + + } // scope == kOpcodeScopeControl + + //-------------------------------------------------------------------------- + + #undef YYMAXNMATCH return opcode; diff --git a/src/sfizz/OpcodeCleanup.re b/src/sfizz/OpcodeCleanup.re index 05305bff..3cf7bc47 100644 --- a/src/sfizz/OpcodeCleanup.re +++ b/src/sfizz/OpcodeCleanup.re @@ -8,6 +8,7 @@ #include "Opcode.h" #include "absl/strings/string_view.h" #include "absl/strings/str_cat.h" +#include "absl/strings/ascii.h" #include namespace sfz { @@ -16,6 +17,9 @@ static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope sc { std::string opcode { rawOpcode }; + // always convert it to lower case + absl::AsciiStrToLower(&opcode); + /*!re2c re2c:flags:posix-captures = 1; re2c:define:YYCTYPE = char; @@ -45,24 +49,28 @@ static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope sc //-------------------------------------------------------------------------- + if (scope == kOpcodeScopeRegion) { + YYCURSOR = opcode.c_str(); /*!re2c (any) "_cc" (number) END { opcode = absl::StrCat(group(1), "_oncc", group(2)); - goto end_generic; + goto end_region_oncc; } * { - goto end_generic; + goto end_region_oncc; } */ -end_generic: +end_region_oncc: /* end */; + } // scope == kOpcodeScopeRegion + //-------------------------------------------------------------------------- if (scope == kOpcodeScopeRegion) { @@ -132,6 +140,10 @@ end_generic: opcode = absl::StrCat("start_", group(1), "cc", group(2)); goto end_region; } + "on_" ("hi"|"lo") "hdcc" (number) END { + opcode = absl::StrCat("start_", group(1), "hdcc", group(2)); + goto end_region; + } "fil_" (any) END { opcode = absl::StrCat("fil1_", group(1)); @@ -146,6 +158,11 @@ end_generic: goto end_region; } + ("hi"|"lo") "realcc" (number) END { + opcode = absl::StrCat(group(1), "hdcc", group(2)); + goto end_region; + } + * { goto end_region; } @@ -159,6 +176,31 @@ end_region: //-------------------------------------------------------------------------- + if (scope == kOpcodeScopeControl) { + + YYCURSOR = opcode.c_str(); + + /*!re2c + + "set_realcc" (number) END { + opcode = absl::StrCat("set_hdcc", group(1)); + goto end_control; + } + + * { + goto end_control; + } + + */ + +end_control: + /* end */; + + } // scope == kOpcodeScopeControl + + //-------------------------------------------------------------------------- + + #undef YYMAXNMATCH return opcode; diff --git a/src/sfizz/Range.h b/src/sfizz/Range.h index 9f339565..3b548535 100644 --- a/src/sfizz/Range.h +++ b/src/sfizz/Range.h @@ -102,6 +102,20 @@ public: _start = value; } + /** + * @brief Convert the range to a different value type + * + * @return Range + */ + template + Range to() const noexcept + { + return Range { + static_cast(_start), + static_cast(_end), + }; + } + private: Type _start { static_cast(0.0) }; Type _end { static_cast(0.0) }; diff --git a/src/sfizz/Region.cpp b/src/sfizz/Region.cpp index 8d505186..9e705904 100644 --- a/src/sfizz/Region.cpp +++ b/src/sfizz/Region.cpp @@ -206,6 +206,18 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccConditions[opcode.parameters.back()].setEnd(normalizeCC(*value)); break; + case hash("lohdcc&"): // also lorealcc& + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::normalizedRange)) + ccConditions[opcode.parameters.back()].setStart(*value); + break; + case hash("hihdcc&"): // also hirealcc& + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::normalizedRange)) + ccConditions[opcode.parameters.back()].setEnd(*value); + break; case hash("sw_lokey"): setRangeStartFromOpcode(opcode, keyswitchRange, Default::keyRange); break; @@ -309,6 +321,18 @@ bool sfz::Region::parseOpcode(const Opcode& rawOpcode) if (auto value = readOpcode(opcode.value, Default::midi7Range)) ccTriggers[opcode.parameters.back()].setEnd(normalizeCC(*value)); break; + case hash("start_lohdcc&"): // also on_lohdcc& + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::midi7Range.to())) + ccTriggers[opcode.parameters.back()].setStart(normalizeCC(*value)); + break; + case hash("start_hihdcc&"): // also on_hihdcc& + if (opcode.parameters.back() >= config::numCCs) + return false; + if (auto value = readOpcode(opcode.value, Default::midi7Range.to())) + ccTriggers[opcode.parameters.back()].setEnd(normalizeCC(*value)); + break; // Performance parameters: amplifier case hash("volume"): // also gain diff --git a/src/sfizz/SfzHelpers.h b/src/sfizz/SfzHelpers.h index 5cd49aad..3d017980 100644 --- a/src/sfizz/SfzHelpers.h +++ b/src/sfizz/SfzHelpers.h @@ -194,6 +194,16 @@ namespace literals { return normalize7Bits(value); } + + inline float operator""_norm(long double value) + { + if (value < 0) + value = 0; + if (value > 127) + value = 127; + + return normalize7Bits(value); + } } /** diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 0f438686..5bc5c376 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -158,7 +158,9 @@ void sfz::Synth::clear() void sfz::Synth::handleGlobalOpcodes(const std::vector& members) { - for (auto& member : members) { + for (auto& rawMember : members) { + const Opcode member = rawMember.cleanUp(kOpcodeScopeGlobal); + switch (member.lettersOnlyHash) { case hash("sw_default"): setValueFromOpcode(member, defaultSwitch, Default::keyRange); @@ -176,7 +178,9 @@ void sfz::Synth::handleGroupOpcodes(const std::vector& members, const st absl::optional groupIdx; unsigned maxPolyphony { config::maxVoices }; - const auto parseOpcode = [&](const Opcode& member) { + const auto parseOpcode = [&](const Opcode& rawMember) { + const Opcode member = rawMember.cleanUp(kOpcodeScopeGroup); + switch (member.lettersOnlyHash) { case hash("group"): setValueFromOpcode(member, groupIdx, Default::groupRange); @@ -199,9 +203,10 @@ void sfz::Synth::handleGroupOpcodes(const std::vector& members, const st void sfz::Synth::handleControlOpcodes(const std::vector& members) { - for (auto& member : members) { + for (auto& rawMember : members) { + const Opcode member = rawMember.cleanUp(kOpcodeScopeControl); + switch (member.lettersOnlyHash) { - case hash("Set_cc&"): // fallthrough case hash("set_cc&"): if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) { const auto ccValue = readOpcode(member.value, Default::midi7Range); @@ -209,7 +214,13 @@ void sfz::Synth::handleControlOpcodes(const std::vector& members) resources.midiState.ccEvent(0, member.parameters.back(), normalizeCC(*ccValue)); } break; - case hash("Label_cc&"): // fallthrough + case hash("set_hdcc&"): + if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) { + const auto ccValue = readOpcode(member.value, Default::normalizedRange); + if (ccValue) + resources.midiState.ccEvent(0, member.parameters.back(), *ccValue); + } + break; case hash("label_cc&"): if (Default::ccNumberRange.containsWithEnd(member.parameters.back())) ccLabels.emplace_back(member.parameters.back(), std::string(member.value)); @@ -218,8 +229,6 @@ void sfz::Synth::handleControlOpcodes(const std::vector& members) if (Default::keyRange.containsWithEnd(member.parameters.back())) keyLabels.emplace_back(member.parameters.back(), std::string(member.value)); break; - case hash("Default_path"): - // fallthrough case hash("default_path"): defaultPath = absl::StrReplaceAll(trim(member.value), { { "\\", "/" } }); DBG("Changing default sample path to " << defaultPath); diff --git a/tests/FilesT.cpp b/tests/FilesT.cpp index 0ae8f068..5831210b 100644 --- a/tests/FilesT.cpp +++ b/tests/FilesT.cpp @@ -408,6 +408,24 @@ TEST_CASE("[Files] Set CC applies properly") REQUIRE(midiState.getCCValue(61) == 122_norm); } +TEST_CASE("[Files] Set HDCC applies properly") +{ + sfz::Synth synth; + const auto& midiState = synth.getResources().midiState; + synth.loadSfzFile(fs::current_path() / "tests/TestFiles/set_hdcc.sfz"); + REQUIRE(midiState.getCCValue(142) == Approx(0.5678)); + REQUIRE(midiState.getCCValue(61) == Approx(0.1234)); +} + +TEST_CASE("[Files] Set RealCC applies properly") +{ + sfz::Synth synth; + const auto& midiState = synth.getResources().midiState; + synth.loadSfzFile(fs::current_path() / "tests/TestFiles/set_realcc.sfz"); + REQUIRE(midiState.getCCValue(142) == Approx(0.5678)); + REQUIRE(midiState.getCCValue(61) == Approx(0.1234)); +} + TEST_CASE("[Files] Note and octave offsets") { sfz::Synth synth; diff --git a/tests/OpcodeT.cpp b/tests/OpcodeT.cpp index 733a185c..78ce2d87 100644 --- a/tests/OpcodeT.cpp +++ b/tests/OpcodeT.cpp @@ -161,8 +161,12 @@ TEST_CASE("[Opcode] Derived names") TEST_CASE("[Opcode] Normalization") { - REQUIRE(sfz::Opcode("foo_cc7", "").cleanUp(sfz::kOpcodeScopeGeneric).opcode == "foo_oncc7"); + // *_ccN + REQUIRE(sfz::Opcode("foo_cc7", "").cleanUp(sfz::kOpcodeScopeRegion).opcode == "foo_oncc7"); + REQUIRE(sfz::Opcode("foo_cc7", "").cleanUp(sfz::kOpcodeScopeControl).opcode == "foo_cc7"); + + // static const std::pair regionSpecific[] = { // LFO SFZv1 @@ -202,6 +206,10 @@ TEST_CASE("[Opcode] Normalization") {"gain_foobar", "volume_foobar"}, {"tune", "pitch"}, {"tune_foobar", "pitch_foobar"}, + {"lorealcc24", "lohdcc24"}, + {"hirealcc25", "hihdcc25"}, + {"on_lohdcc26", "start_lohdcc26"}, + {"on_hihdcc27", "start_hihdcc27"}, // SFZv2 aliases {"on_hicc22", "start_hicc22"}, {"on_locc23", "start_locc23"}, @@ -219,4 +227,22 @@ TEST_CASE("[Opcode] Normalization") REQUIRE(sfz::Opcode(input, "").cleanUp(sfz::kOpcodeScopeRegion).opcode == expected); REQUIRE(sfz::Opcode(input, "").cleanUp(sfz::kOpcodeScopeGeneric).opcode == input); } + + // + + static const std::pair controlSpecific[] = { + // ARIA aliases + {"set_realcc1", "set_hdcc1"}, + }; + + for (auto pair : controlSpecific) { + absl::string_view input = pair.first; + absl::string_view expected = pair.second; + REQUIRE(sfz::Opcode(input, "").cleanUp(sfz::kOpcodeScopeControl).opcode == expected); + REQUIRE(sfz::Opcode(input, "").cleanUp(sfz::kOpcodeScopeGeneric).opcode == input); + } + + // case + + REQUIRE(sfz::Opcode("SaMpLe", "").cleanUp(sfz::kOpcodeScopeRegion).opcode == "sample"); } diff --git a/tests/RegionT.cpp b/tests/RegionT.cpp index c2efe488..b7f88d92 100644 --- a/tests/RegionT.cpp +++ b/tests/RegionT.cpp @@ -278,6 +278,34 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.ccConditions[127] == sfz::Range(0_norm, 127_norm)); } + SECTION("lohdcc, hihdcc") + { + region.parseOpcode({ "lohdcc7", "0.12" }); + REQUIRE(region.ccConditions[7].getStart() == Approx(0.12f)); + REQUIRE(region.ccConditions[7].getEnd() == 1.0f); + region.parseOpcode({ "lohdcc13", "-1.0" }); + REQUIRE(region.ccConditions[13] == sfz::Range(0.0f, 1.0f)); + region.parseOpcode({ "hihdcc64", "0.45" }); + REQUIRE(region.ccConditions[64].getStart() == 0.0f); + REQUIRE(region.ccConditions[64].getEnd() == Approx(0.45f)); + region.parseOpcode({ "hihdcc126", "1.2" }); + REQUIRE(region.ccConditions[126] == sfz::Range(0.0f, 1.0f)); + } + + SECTION("lorealcc, hirealcc") + { + region.parseOpcode({ "lorealcc8", "0.12" }); + REQUIRE(region.ccConditions[8].getStart() == Approx(0.12f)); + REQUIRE(region.ccConditions[8].getEnd() == 1.0f); + region.parseOpcode({ "lorealcc14", "-1.0" }); + REQUIRE(region.ccConditions[14] == sfz::Range(0.0f, 1.0f)); + region.parseOpcode({ "hirealcc63", "0.45" }); + REQUIRE(region.ccConditions[63].getStart() == 0.0f); + REQUIRE(region.ccConditions[63].getEnd() == Approx(0.45f)); + region.parseOpcode({ "hirealcc125", "1.2" }); + REQUIRE(region.ccConditions[125] == sfz::Range(0.0f, 1.0f)); + } + SECTION("sw_lokey, sw_hikey") { REQUIRE(region.keyswitchRange == sfz::Range(0, 127)); @@ -468,6 +496,21 @@ TEST_CASE("[Region] Parsing opcodes") REQUIRE(region.ccTriggers[4] == sfz::Range(0_norm, 47_norm)); } + SECTION("on_lohdcc, on_hihdcc") + { + for (int ccIdx = 1; ccIdx < 128; ++ccIdx) { + REQUIRE(!region.ccTriggers.contains(ccIdx)); + } + region.parseOpcode({ "on_lohdcc46", "15.9" }); + REQUIRE(region.ccTriggers.contains(46)); + REQUIRE(region.ccTriggers[46].getStart() == Approx(15.9_norm)); + REQUIRE(region.ccTriggers[46].getEnd() == 1.0f); + region.parseOpcode({ "on_hihdcc5", "47.3" }); + REQUIRE(region.ccTriggers.contains(5)); + REQUIRE(region.ccTriggers[5].getStart() == 0.0f); + REQUIRE(region.ccTriggers[5].getEnd() == Approx(47.3_norm)); + } + SECTION("volume") { REQUIRE(region.volume == 0.0f); diff --git a/tests/TestFiles/set_hdcc.sfz b/tests/TestFiles/set_hdcc.sfz new file mode 100644 index 00000000..02673b3b --- /dev/null +++ b/tests/TestFiles/set_hdcc.sfz @@ -0,0 +1,3 @@ + set_hdcc61=0.1234 + set_hdcc142=0.5678 + sample=snare.wav diff --git a/tests/TestFiles/set_realcc.sfz b/tests/TestFiles/set_realcc.sfz new file mode 100644 index 00000000..8ce9221d --- /dev/null +++ b/tests/TestFiles/set_realcc.sfz @@ -0,0 +1,3 @@ + set_realcc61=0.1234 + set_realcc142=0.5678 + sample=snare.wav