diff --git a/scripts/generate_re2c.sh b/scripts/generate_re2c.sh new file mode 100755 index 00000000..4f65b9e1 --- /dev/null +++ b/scripts/generate_re2c.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +if ! test -d "src"; then + echo "Please run this in the project root directory." + exit 1 +fi + +for src in src/sfizz/OpcodeCleanup.re; do + re2c -o "${src%.re}.cpp" "$src" +done diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e786dae3..03f976d2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -45,7 +45,7 @@ sfizz_add_simd_sources (SFIZZ_SOURCES ".") # Parser core library add_library (sfizz_parser STATIC) target_sources (sfizz_parser PRIVATE - sfizz/Parser.cpp sfizz/Opcode.cpp sfizz/SfzHelpers.cpp + sfizz/Parser.cpp sfizz/Opcode.cpp sfizz/OpcodeCleanup.cpp sfizz/SfzHelpers.cpp sfizz/parser/Parser.cpp sfizz/parser/ParserPrivate.cpp) target_include_directories (sfizz_parser PUBLIC sfizz) target_include_directories (sfizz_parser PUBLIC external) diff --git a/src/sfizz/Opcode.h b/src/sfizz/Opcode.h index 189aca0b..b6f64e09 100644 --- a/src/sfizz/Opcode.h +++ b/src/sfizz/Opcode.h @@ -36,6 +36,18 @@ enum OpcodeCategory { kOpcodeSmoothCcN, }; +/** + * @brief A scope where an opcode may appear. + */ +enum OpcodeScope { + //! unknown scope or other + kOpcodeScopeGeneric, + //! region scope + kOpcodeScopeRegion, + //! effect scope + kOpcodeScopeEffect, +}; + /** * @brief Opcode description class. The class parses the parameters * of the opcode on construction. @@ -51,6 +63,15 @@ struct Opcode { std::vector parameters; OpcodeCategory category; + /* + * @brief Normalize in order to make the ampersand-name unique, and + * facilitate subsequent processing. + * + * @param scope scope where this opcode appears + * @return normalized opcode + */ + Opcode cleanUp(OpcodeScope scope) const; + /* * @brief Get the derived opcode name to convert it to another category. * diff --git a/src/sfizz/OpcodeCleanup.cpp b/src/sfizz/OpcodeCleanup.cpp new file mode 100644 index 00000000..e14b9017 --- /dev/null +++ b/src/sfizz/OpcodeCleanup.cpp @@ -0,0 +1,1651 @@ +/* Generated by re2c 1.3 on Mon May 4 19:13:10 2020 */ +#line 1 "src/sfizz/OpcodeCleanup.re" +/* -*- mode: c++; -*- */ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "Opcode.h" +#include "absl/strings/string_view.h" +#include "absl/strings/str_cat.h" +#include + +namespace sfz { + +static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope scope) +{ + std::string opcode { rawOpcode }; + + #line 23 "src/sfizz/OpcodeCleanup.re" + + #define YYMAXNMATCH 4 + + + const char* YYCURSOR; + const char* YYMARKER; + const char* yypmatch[2 * YYMAXNMATCH]; + size_t yynmatch; + + const char* yyt1; const char* yyt2; const char* yyt3; + + auto group = [&yypmatch](size_t i) -> absl::string_view { + const char *beg = yypmatch[2 * i]; + const char *end = yypmatch[2 * i + 1]; + return absl::string_view(beg, end - beg); + }; + + #line 44 "src/sfizz/OpcodeCleanup.re" + + + //-------------------------------------------------------------------------- + + YYCURSOR = opcode.c_str(); + + +#line 48 "src/sfizz/OpcodeCleanup.cpp" +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy2; + case '_': + yyt1 = YYCURSOR; + goto yy5; + default: + yyt1 = YYCURSOR; + goto yy4; + } +yy2: + ++YYCURSOR; +yy3: +#line 57 "src/sfizz/OpcodeCleanup.re" + { + goto end_generic; + } +#line 68 "src/sfizz/OpcodeCleanup.cpp" +yy4: + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 0x00) goto yy3; + goto yy7; +yy5: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0x00: goto yy3; + case 'c': goto yy11; + default: goto yy7; + } +yy6: + yych = *++YYCURSOR; +yy7: + switch (yych) { + case 0x00: goto yy8; + case '_': goto yy9; + default: goto yy6; + } +yy8: + YYCURSOR = YYMARKER; + goto yy3; +yy9: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy8; + case '_': goto yy9; + case 'c': goto yy11; + default: goto yy6; + } +yy11: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy8; + case '_': goto yy9; + case 'c': goto yy12; + default: goto yy6; + } +yy12: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy8; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt2 = YYCURSOR; + goto yy13; + case '_': goto yy9; + default: goto yy6; + } +yy13: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy15; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy13; + case '_': goto yy9; + default: goto yy6; + } +yy15: + ++YYCURSOR; + yynmatch = 3; + yypmatch[2] = yyt1; + yypmatch[4] = yyt2; + yypmatch[0] = yyt1; + yypmatch[1] = YYCURSOR; + yypmatch[3] = yyt2 - 3; + yypmatch[5] = YYCURSOR - 1; +#line 52 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "_oncc", group(2)); + goto end_generic; + } +#line 157 "src/sfizz/OpcodeCleanup.cpp" +} +#line 61 "src/sfizz/OpcodeCleanup.re" + + +end_generic: + /* end */; + + //-------------------------------------------------------------------------- + + if (scope == kOpcodeScopeRegion) { + + YYCURSOR = opcode.c_str(); + + +#line 172 "src/sfizz/OpcodeCleanup.cpp" +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case 'a': + yyt1 = YYCURSOR; + goto yy21; + case 'b': goto yy22; + case 'e': + yyt1 = YYCURSOR; + goto yy23; + case 'f': + yyt1 = YYCURSOR; + goto yy24; + case 'g': + yyt1 = YYCURSOR; + goto yy25; + case 'l': + yyt1 = YYCURSOR; + goto yy26; + case 'o': goto yy27; + case 'p': + yyt1 = YYCURSOR; + goto yy28; + case 't': + yyt1 = YYCURSOR; + goto yy29; + default: goto yy19; + } +yy19: + ++YYCURSOR; +yy20: +#line 141 "src/sfizz/OpcodeCleanup.re" + { + goto end_region; + } +#line 209 "src/sfizz/OpcodeCleanup.cpp" +yy21: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'm': goto yy30; + default: goto yy20; + } +yy22: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'e': goto yy32; + default: goto yy20; + } +yy23: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'q': goto yy33; + default: goto yy20; + } +yy24: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'i': goto yy34; + default: goto yy20; + } +yy25: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'a': goto yy35; + default: goto yy20; + } +yy26: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'f': goto yy36; + case 'o': goto yy37; + default: goto yy20; + } +yy27: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'f': goto yy38; + case 'n': goto yy39; + default: goto yy20; + } +yy28: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'i': goto yy40; + case 'o': goto yy41; + default: goto yy20; + } +yy29: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 'u': goto yy42; + default: goto yy20; + } +yy30: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy43; + default: goto yy31; + } +yy31: + YYCURSOR = YYMARKER; + goto yy20; +yy32: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy44; + default: goto yy31; + } +yy33: + 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 yy45; + default: goto yy31; + } +yy34: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy47; + default: goto yy31; + } +yy35: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy48; + default: goto yy31; + } +yy36: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy49; + default: goto yy31; + } +yy37: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy50; + default: goto yy31; + } +yy38: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy51; + default: goto yy31; + } +yy39: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy52; + default: goto yy31; + } +yy40: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy53; + default: goto yy31; + } +yy41: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy54; + default: goto yy31; + } +yy42: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy55; + default: goto yy31; + } +yy43: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy56; + case 'l': goto yy57; + default: goto yy31; + } +yy44: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy58; + default: goto yy31; + } +yy45: + 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 yy45; + case '_': goto yy59; + default: goto yy31; + } +yy47: + 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 yy60; + case '_': goto yy62; + case 'e': goto yy56; + case 'l': goto yy57; + case 't': goto yy63; + default: goto yy31; + } +yy48: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy64; + default: goto yy31; + } +yy49: + 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 yy65; + default: goto yy31; + } +yy50: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy67; + default: goto yy31; + } +yy51: + yych = *++YYCURSOR; + switch (yych) { + case 'b': + yyt1 = YYCURSOR; + goto yy68; + case 'm': + yyt1 = YYCURSOR; + goto yy69; + default: goto yy31; + } +yy52: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy70; + case 'l': goto yy71; + default: goto yy31; + } +yy53: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy72; + default: goto yy31; + } +yy54: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy73; + default: goto yy31; + } +yy55: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy74; + default: goto yy31; + } +yy56: + yych = *++YYCURSOR; + switch (yych) { + case 'g': goto yy75; + default: goto yy31; + } +yy57: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy76; + default: goto yy31; + } +yy58: + yych = *++YYCURSOR; + switch (yych) { + case 'd': + yyt1 = YYCURSOR; + goto yy77; + case 'u': + yyt1 = YYCURSOR; + goto yy78; + default: goto yy31; + } +yy59: + yych = *++YYCURSOR; + switch (yych) { + case 'b': + yyt2 = YYCURSOR; + goto yy79; + case 'f': + yyt2 = YYCURSOR; + goto yy80; + case 'g': + yyt2 = YYCURSOR; + goto yy81; + default: goto yy31; + } +yy60: + 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 yy60; + case 't': goto yy82; + default: goto yy31; + } +yy62: + yych = *++YYCURSOR; + yyt1 = YYCURSOR; + goto yy86; +yy63: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy87; + default: goto yy31; + } +yy64: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + yyt2 = yyt3 = NULL; + goto yy88; + case '_': + yyt3 = YYCURSOR; + goto yy90; + default: goto yy31; + } +yy65: + 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 yy65; + case '_': goto yy92; + default: goto yy31; + } +yy67: + yych = *++YYCURSOR; + switch (yych) { + case 'e': + yyt1 = YYCURSOR; + goto yy93; + case 'm': + yyt1 = YYCURSOR; + goto yy94; + case 's': + yyt1 = YYCURSOR; + goto yy95; + default: goto yy31; + } +yy68: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy96; + default: goto yy31; + } +yy69: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy97; + default: goto yy31; + } +yy70: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy98; + default: goto yy31; + } +yy71: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy98; + default: goto yy31; + } +yy72: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy43; + default: goto yy31; + } +yy73: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy99; + default: goto yy31; + } +yy74: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + yyt2 = yyt3 = NULL; + goto yy100; + case '_': + yyt3 = YYCURSOR; + goto yy102; + default: goto yy31; + } +yy75: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy104; + default: goto yy31; + } +yy76: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy105; + default: goto yy31; + } +yy77: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy106; + default: goto yy31; + } +yy78: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy107; + default: goto yy31; + } +yy79: + yych = *++YYCURSOR; + switch (yych) { + case 'w': goto yy108; + default: goto yy31; + } +yy80: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy109; + default: goto yy31; + } +yy81: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy110; + default: goto yy31; + } +yy82: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy111; + default: goto yy31; + } +yy83: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 4; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 1; +#line 131 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("fil1_", group(1)); + goto end_region; + } +#line 675 "src/sfizz/OpcodeCleanup.cpp" +yy85: + yych = *++YYCURSOR; +yy86: + if (yych <= 0x00) goto yy83; + goto yy85; +yy87: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy112; + default: goto yy31; + } +yy88: + ++YYCURSOR; + yynmatch = 2; + yypmatch[0] = yyt1; + yypmatch[2] = yyt3; + yypmatch[3] = yyt2; + yypmatch[1] = YYCURSOR; +#line 122 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("volume", group(1)); + goto end_region; + } +#line 699 "src/sfizz/OpcodeCleanup.cpp" +yy90: + yych = *++YYCURSOR; + if (yych <= 0x00) { + yyt2 = YYCURSOR; + goto yy88; + } + goto yy90; +yy92: + yych = *++YYCURSOR; + switch (yych) { + case 'o': + yyt2 = YYCURSOR; + goto yy113; + case 'r': + yyt2 = YYCURSOR; + goto yy114; + case 's': + yyt2 = YYCURSOR; + goto yy115; + case 'w': + yyt2 = YYCURSOR; + goto yy116; + default: goto yy31; + } +yy93: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy117; + default: goto yy31; + } +yy94: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy118; + default: goto yy31; + } +yy95: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy119; + default: goto yy31; + } +yy96: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy120; + goto yy31; +yy97: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy122; + default: goto yy31; + } +yy98: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy123; + default: goto yy31; + } +yy99: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy124; + default: goto yy31; + } +yy100: + ++YYCURSOR; + yynmatch = 2; + yypmatch[0] = yyt1; + yypmatch[2] = yyt3; + yypmatch[3] = yyt2; + yypmatch[1] = YYCURSOR; +#line 126 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("pitch", group(1)); + goto end_region; + } +#line 776 "src/sfizz/OpcodeCleanup.cpp" +yy102: + yych = *++YYCURSOR; + if (yych <= 0x00) { + yyt2 = YYCURSOR; + goto yy100; + } + goto yy102; +yy104: + yych = *++YYCURSOR; + switch (yych) { + case 'a': + yyt2 = YYCURSOR; + goto yy125; + case 'd': + yyt2 = YYCURSOR; + goto yy126; + case 'h': + yyt2 = YYCURSOR; + goto yy127; + case 'r': + yyt2 = YYCURSOR; + goto yy128; + case 's': + yyt2 = YYCURSOR; + goto yy129; + default: goto yy31; + } +yy105: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy130; + default: goto yy31; + } +yy106: + yych = *++YYCURSOR; + switch (yych) { + case 'w': goto yy131; + default: goto yy31; + } +yy107: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy132; + goto yy31; +yy108: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy134; + default: goto yy31; + } +yy109: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy135; + default: goto yy31; + } +yy110: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy136; + default: goto yy31; + } +yy111: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy137; + default: goto yy31; + } +yy112: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy138; + default: goto yy31; + } +yy113: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy139; + default: goto yy31; + } +yy114: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy140; + default: goto yy31; + } +yy115: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy141; + default: goto yy31; + } +yy116: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy142; + default: goto yy31; + } +yy117: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy143; + default: goto yy31; + } +yy118: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy144; + default: goto yy31; + } +yy119: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy145; + default: goto yy31; + } +yy120: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 3; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 1; +#line 100 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("off_", group(1)); + goto end_region; + } +#line 904 "src/sfizz/OpcodeCleanup.cpp" +yy122: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy96; + default: goto yy31; + } +yy123: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy146; + default: goto yy31; + } +yy124: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy147; + default: goto yy31; + } +yy125: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy148; + default: goto yy31; + } +yy126: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy149; + default: goto yy31; + } +yy127: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy150; + default: goto yy31; + } +yy128: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy151; + default: goto yy31; + } +yy129: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy152; + case 'u': goto yy153; + default: goto yy31; + } +yy130: + yych = *++YYCURSOR; + switch (yych) { + case 'd': + yyt2 = YYCURSOR; + goto yy154; + case 'f': + yyt2 = YYCURSOR; + goto yy155; + default: goto yy31; + } +yy131: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy107; + default: goto yy31; + } +yy132: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 4; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 1; +#line 104 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("bend_", group(1)); + goto end_region; + } +#line 983 "src/sfizz/OpcodeCleanup.cpp" +yy134: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy156; + default: goto yy31; + } +yy135: + yych = *++YYCURSOR; + switch (yych) { + case 'q': goto yy108; + default: goto yy31; + } +yy136: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy108; + default: goto yy31; + } +yy137: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy157; + default: goto yy31; + } +yy138: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy158; + goto yy31; +yy139: + yych = *++YYCURSOR; + switch (yych) { + case 'f': goto yy160; + default: goto yy31; + } +yy140: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy161; + default: goto yy31; + } +yy141: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy162; + default: goto yy31; + } +yy142: + yych = *++YYCURSOR; + switch (yych) { + case 'v': goto yy163; + default: goto yy31; + } +yy143: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy164; + goto yy31; +yy144: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy143; + default: goto yy31; + } +yy145: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy166; + default: goto yy31; + } +yy146: + 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 yy167; + default: goto yy31; + } +yy147: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy169; + default: goto yy31; + } +yy148: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy170; + default: goto yy31; + } +yy149: + yych = *++YYCURSOR; + switch (yych) { + case 'c': + case 'l': goto yy171; + default: goto yy31; + } +yy150: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy172; + default: goto yy31; + } +yy151: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy173; + default: goto yy31; + } +yy152: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy174; + default: goto yy31; + } +yy153: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy175; + default: goto yy31; + } +yy154: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy176; + default: goto yy31; + } +yy155: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy177; + case 'r': goto yy178; + default: goto yy31; + } +yy156: + 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 yy179; + default: goto yy31; + } +yy157: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy181; + goto yy31; +yy158: + ++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 1156 "src/sfizz/OpcodeCleanup.cpp" +yy160: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy183; + default: goto yy31; + } +yy161: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy184; + default: goto yy31; + } +yy162: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy163; + default: goto yy31; + } +yy163: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy185; + default: goto yy31; + } +yy164: + ++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 1193 "src/sfizz/OpcodeCleanup.cpp" +yy166: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy143; + default: goto yy31; + } +yy167: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy186; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy167; + default: goto yy31; + } +yy169: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy188; + default: goto yy31; + } +yy170: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy189; + default: goto yy31; + } +yy171: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy190; + default: goto yy31; + } +yy172: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy191; + default: goto yy31; + } +yy173: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy192; + default: goto yy31; + } +yy174: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy193; + default: goto yy31; + } +yy175: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy194; + default: goto yy31; + } +yy176: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy195; + default: goto yy31; + } +yy177: + yych = *++YYCURSOR; + switch (yych) { + case 'd': goto yy196; + default: goto yy31; + } +yy178: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy197; + default: goto yy31; + } +yy179: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy198; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy179; + default: goto yy31; + } +yy181: + ++YYCURSOR; + yynmatch = 2; + yypmatch[2] = yyt1; + yypmatch[0] = yyt1 - 3; + yypmatch[1] = YYCURSOR; + yypmatch[3] = YYCURSOR - 5; +#line 112 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("fil", group(1), "_type"); + goto end_region; + } +#line 1304 "src/sfizz/OpcodeCleanup.cpp" +yy183: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy200; + default: goto yy31; + } +yy184: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy185; + default: goto yy31; + } +yy185: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy201; + goto yy31; +yy186: + ++YYCURSOR; + yynmatch = 3; + yypmatch[4] = yyt1; + yypmatch[0] = yyt1 - 7; + yypmatch[1] = YYCURSOR; + yypmatch[2] = yyt1 - 4; + yypmatch[3] = yyt1 - 2; + yypmatch[5] = YYCURSOR - 1; +#line 136 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat("start_", group(1), "cc", group(2)); + goto end_region; + } +#line 1335 "src/sfizz/OpcodeCleanup.cpp" +yy188: + yych = *++YYCURSOR; + switch (yych) { + case '_': goto yy203; + default: goto yy31; + } +yy189: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy204; + default: goto yy31; + } +yy190: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy191; + default: goto yy31; + } +yy191: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy205; + default: goto yy31; + } +yy192: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy206; + default: goto yy31; + } +yy193: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy191; + default: goto yy31; + } +yy194: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy207; + default: goto yy31; + } +yy195: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy208; + default: goto yy31; + } +yy196: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy209; + default: goto yy31; + } +yy197: + yych = *++YYCURSOR; + switch (yych) { + case 'q': goto yy209; + default: goto yy31; + } +yy198: + ++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 87 "src/sfizz/OpcodeCleanup.re" + { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } +#line 1412 "src/sfizz/OpcodeCleanup.cpp" +yy200: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy185; + default: goto yy31; + } +yy201: + ++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 1433 "src/sfizz/OpcodeCleanup.cpp" +yy203: + yych = *++YYCURSOR; + switch (yych) { + case 'g': goto yy210; + default: goto yy31; + } +yy204: + yych = *++YYCURSOR; + switch (yych) { + case 'k': goto yy191; + default: goto yy31; + } +yy205: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy211; + default: goto yy31; + } +yy206: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy212; + default: goto yy31; + } +yy207: + yych = *++YYCURSOR; + switch (yych) { + case 'i': goto yy213; + default: goto yy31; + } +yy208: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy209; + default: goto yy31; + } +yy209: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy214; + default: goto yy31; + } +yy210: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy215; + default: goto yy31; + } +yy211: + 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 yy216; + default: goto yy31; + } +yy212: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy191; + default: goto yy31; + } +yy213: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy191; + default: goto yy31; + } +yy214: + yych = *++YYCURSOR; + switch (yych) { + case 'c': goto yy218; + default: goto yy31; + } +yy215: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy219; + default: goto yy31; + } +yy216: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy220; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy216; + default: goto yy31; + } +yy218: + 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 yy222; + default: goto yy31; + } +yy219: + yych = *++YYCURSOR; + switch (yych) { + case 'u': goto yy224; + default: goto yy31; + } +yy220: + ++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 1578 "src/sfizz/OpcodeCleanup.cpp" +yy222: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy225; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy222; + default: goto yy31; + } +yy224: + yych = *++YYCURSOR; + switch (yych) { + case 'p': goto yy227; + default: goto yy31; + } +yy225: + ++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 1617 "src/sfizz/OpcodeCleanup.cpp" +yy227: + yych = *++YYCURSOR; + if (yych >= 0x01) goto yy31; + ++YYCURSOR; + yynmatch = 1; + yypmatch[0] = YYCURSOR - 16; + yypmatch[1] = YYCURSOR; +#line 117 "src/sfizz/OpcodeCleanup.re" + { + opcode = "group"; + goto end_region; + } +#line 1630 "src/sfizz/OpcodeCleanup.cpp" +} +#line 145 "src/sfizz/OpcodeCleanup.re" + + +end_region: + /* end */; + + } // scope == kOpcodeScopeRegion + + //-------------------------------------------------------------------------- + + #undef YYMAXNMATCH + + return opcode; +} + +Opcode Opcode::cleanUp(OpcodeScope scope) const +{ + return Opcode(cleanUpOpcodeName(opcode, scope), value); +} + +} // namespace sfz diff --git a/src/sfizz/OpcodeCleanup.re b/src/sfizz/OpcodeCleanup.re new file mode 100644 index 00000000..fec5f89b --- /dev/null +++ b/src/sfizz/OpcodeCleanup.re @@ -0,0 +1,164 @@ +/* -*- mode: c++; -*- */ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "Opcode.h" +#include "absl/strings/string_view.h" +#include "absl/strings/str_cat.h" +#include + +namespace sfz { + +static std::string cleanUpOpcodeName(absl::string_view rawOpcode, OpcodeScope scope) +{ + std::string opcode { rawOpcode }; + + /*!re2c + re2c:flags:posix-captures = 1; + re2c:define:YYCTYPE = char; + re2c:yyfill:enable = 0; + */ + /*!maxnmatch:re2c*/ + + const char* YYCURSOR; + const char* YYMARKER; + const char* yypmatch[2 * YYMAXNMATCH]; + size_t yynmatch; + + /*!stags:re2c format = "const char* @@; "; */ + + auto group = [&yypmatch](size_t i) -> absl::string_view { + const char *beg = yypmatch[2 * i]; + const char *end = yypmatch[2 * i + 1]; + return absl::string_view(beg, end - beg); + }; + + /*!re2c + digit = [0-9]; + number = digit+; + any = [^\x00]*; + END = [\x00]; + */ + + //-------------------------------------------------------------------------- + + YYCURSOR = opcode.c_str(); + + /*!re2c + + (any) "_cc" (number) END { + opcode = absl::StrCat(group(1), "_oncc", group(2)); + goto end_generic; + } + + * { + goto end_generic; + } + + */ + +end_generic: + /* end */; + + //-------------------------------------------------------------------------- + + if (scope == kOpcodeScopeRegion) { + + YYCURSOR = opcode.c_str(); + + /*!re2c + + lfoV1 = "amplfo"|"fillfo"|"pitchlfo"; + egV1 = "ampeg"|"fileg"|"pitcheg"; + eqV1 = "eq" number; + lfoV2 = "lfo" number; + + (lfoV1) "_" ("depth"|"freq"|"fade") "cc" (number) END { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } + (egV1) "_" ("delay"|"start"|"attack"|"hold"|"decay"|"sustain"|"release") "cc" (number) END { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } + (eqV1) "_" ("bw"|"freq"|"gain") "cc" (number) END { + opcode = absl::StrCat(group(1), "_", group(2), "_oncc", group(3)); + goto end_region; + } + (lfoV2) "_" ("wave"|"offset"|"ratio"|"scale") END { + opcode = absl::StrCat(group(1), "_", group(2), "1"); + goto end_region; + } + + "loop" ("mode"|"start"|"end") END { + opcode = absl::StrCat("loop_", group(1)); + goto end_region; + } + "off" ("by"|"mode") END { + opcode = absl::StrCat("off_", group(1)); + goto end_region; + } + "bend" ("up"|"down") END { + opcode = absl::StrCat("bend_", group(1)); + goto end_region; + } + "filtype" END { + opcode = absl::StrCat("fil1_type"); + goto end_region; + } + "fil" (number) "type" END { + opcode = absl::StrCat("fil", group(1), "_type"); + goto end_region; + } + + "polyphony_group" END { + opcode = "group"; + goto end_region; + } + + "gain" ("_" any)? END { + opcode = absl::StrCat("volume", group(1)); + goto end_region; + } + "tune" ("_" any)? END { + opcode = absl::StrCat("pitch", group(1)); + goto end_region; + } + + "fil_" (any) END { + opcode = absl::StrCat("fil1_", group(1)); + goto end_region; + } + + "on_" ("hi"|"lo") "cc" (number) END { + opcode = absl::StrCat("start_", group(1), "cc", group(2)); + goto end_region; + } + + * { + goto end_region; + } + + */ + +end_region: + /* end */; + + } // scope == kOpcodeScopeRegion + + //-------------------------------------------------------------------------- + + #undef YYMAXNMATCH + + return opcode; +} + +Opcode Opcode::cleanUp(OpcodeScope scope) const +{ + return Opcode(cleanUpOpcodeName(opcode, scope), value); +} + +} // namespace sfz