/**************************************************************************** * apps/examples/mml_parser/mml_parser_main.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #ifndef CONFIG_AUDIOUTILS_MMLPARSER_LIB #error "This example needs to enable config of AUDIOUTILS_MMLPARSER_LIB," \ " please enable it" #endif #include /**************************************************************************** * Private Data ****************************************************************************/ #define SIMPLE_SCORE \ "O0 CC+DD+EE+FF+GG+AA+BB+" \ "O1 CC-DD-EE-FF-GG-AA-BB-" \ "O2 CC#DD#EE#FF#GG#AA#BB#" #define TEST_SCORE \ "T240L0O3D>F+>E8 V8{R [CE O7 < G] C+#- C >B}8 [G B > C]16" \ "T120 D> C A8 B. A8+4 C+8.D#+4+4 E- C.+4." #define FLOH_WALZER_RIGHT \ "T120 L4 O4" \ "R8 {D#C#}8" \ "R8{[F#][F#]}{D#C#}8 R8{[F#][F#]}{D#C#}8" \ "R8[F#]8R8[F#]8 R8{[F][F]} {D#C#}8" \ "R8{[F][F]}{D#C#}8 R8{[F][F]}{D#C#}8" \ "R8[F]8R8[F]8 R8{[F#][F#]} {D#C#}8" \ "R8{[F#][F#]}{D#C#}8 R8{[F#][F#]}{D#C#}8" \ "R8[F#]8R8[F#]8 R8{[F][F]} {D#C#}8" \ "R8{[F][F]}{D#C#}8 R8{[F][F]}{D#C#}8" \ "R8[F]8R8[F]8 R8{[F#][F#]} {D#C#}8" \ "R8[F#]8R8[F#]8 R8[F#]8R8[F#]8" \ "R2 R8{[F][F]} {D#C#}8" \ "R8[F]8R8[F]8 R8[F]8R8[F]8" \ "R2 R8{[F#][F#]} {D#C#}8" \ "R8{[F#][F#]}{D#C#}8 R8{[F#][F#]}{D#C#}8" \ "R8[F#]8R8[F#]8 R8{[F][F]} {D#C#}8" \ "R8{[F][F]}{D#C#}8 R8{[F][F]}{D#C#}8" \ "R8[F]8R8[F]8 R8{[F#][F#]} {D#C#}8" \ "[F#]8{CC}8{C#C} R8[F]8[F#]8R8" #define FLOH_WALZER_LEFT \ "T120 L4 O3" \ "R4" \ "F#.R8 F#.R8 F#D# C#.R8" \ "C#.R8 C#.R8 C#D# F#.R8" \ ">A#.R8 A#.R8 A#>C# D#.R8" \ "D#.R8 D#.R8 D#C# note_idx[0], result->length); passed_tick += result->length; break; case MML_TYPE_REST: printf("Rest : length = %d\n", result->length); passed_tick += result->length; break; case MML_TYPE_TEMPO: printf("Tempo : length = %d\n", result->length); break; case MML_TYPE_LENGTH: printf("Length : length = %d\n", result->length); break; case MML_TYPE_OCTAVE: printf("Octave : length = %d\n", result->length); break; case MML_TYPE_TUPLETSTART: printf("Tuplet B : length = %d\n", result->length); break; case MML_TYPE_TUPLETDONE: printf("Tuplet D :\n"); break; case MML_TYPE_VOLUME: printf("Volume : length = %d\n", result->length); break; case MML_TYPE_CHORD: printf("Chord : length = %d, chord_num = %d\n", result->length, result->chord_notes); printf(" : Notes "); { int i; for (i = 0; i < result->chord_notes; i++) { printf("%d ", result->note_idx[i]); } printf("\n"); } passed_tick += result->length; break; } return passed_tick; } /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: main ****************************************************************************/ int main(void) { int i; int ret; int total_tick; FAR char *score; struct music_macro_lang_s mml; struct mml_result_s result; for (i = 0; i < TEST_SCORES_NUM; i++) { init_mml(&mml, 48000, 1, 0, 4); score = (char *)test_scores[i]; printf("===================================\n"); printf("Test Score :\n%s\n\n", score); total_tick = 0; while ((ret = parse_mml(&mml, &score, &result)) > 0) { total_tick += print_parse_result(ret, &result); } if (ret < 0) { printf("\nret = %d\n", ret); printf("Error was occured below:\n"); printf("%s\n", score); break; } printf("\n=== Total Tick : %d\n\n", total_tick); } return 0; }