nuttx-apps/examples/mml_parser/mml_parser_main.c
Takayoshi Koizumi 5040719911 audioutils/mml_parser: Add mml_parser library
Add Music Macro Language parser library in audioutils.
audioutils is also created for several audio utilities
not only mml_parser.
2022-05-07 13:56:53 +08:00

196 lines
6.3 KiB
C

/****************************************************************************
* 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 <nuttx/config.h>
#include <stdio.h>
#ifndef CONFIG_AUDIOUTILS_MMLPARSER_LIB
#error "This example needs to enable config of AUDIOUTILS_MMLPARSER_LIB," \
" please enable it"
#endif
#include <audioutils/mml_parser.h>
/****************************************************************************
* 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{[<A#>F#][<A#>F#]}{D#C#}8 R8{[<A#>F#][<A#>F#]}{D#C#}8" \
"R8[<A#>F#]8R8[<A#>F#]8 R8{[<B>F][<B>F]} {D#C#}8" \
"R8{[<B>F][<B>F]}{D#C#}8 R8{[<B>F][<B>F]}{D#C#}8" \
"R8[<B>F]8R8[<B>F]8 R8{[<A#>F#][<A#>F#]} {D#C#}8" \
"R8{[<A#>F#][<A#>F#]}{D#C#}8 R8{[<A#>F#][<A#>F#]}{D#C#}8" \
"R8[<A#>F#]8R8[<A#>F#]8 R8{[<B>F][<B>F]} {D#C#}8" \
"R8{[<B>F][<B>F]}{D#C#}8 R8{[<B>F][<B>F]}{D#C#}8" \
"R8[<B>F]8R8[<B>F]8 R8{[<A#>F#][<A#>F#]} {D#C#}8" \
"R8[<A#>F#]8R8[<A#>F#]8 R8[<A#>F#]8R8[<A#>F#]8" \
"R2 R8{[<B>F][<B>F]} {D#C#}8" \
"R8[<B>F]8R8[<B>F]8 R8[<B>F]8R8[<B>F]8" \
"R2 R8{[<A#>F#][<A#>F#]} {D#C#}8" \
"R8{[<A#>F#][<A#>F#]}{D#C#}8 R8{[<A#>F#][<A#>F#]}{D#C#}8" \
"R8[<A#>F#]8R8[<A#>F#]8 R8{[<B>F][<B>F]} {D#C#}8" \
"R8{[<B>F][<B>F]}{D#C#}8 R8{[<B>F][<B>F]}{D#C#}8" \
"R8[<B>F]8R8[<B>F]8 R8{[<A#>F#][<A#>F#]} {D#C#}8" \
"[<A#>F#]8{CC}8{C#C} R8[<B>F]8[<A#>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# <A#.R8" \
"<F#C# F#C# {F#F}{F#G} G#R" \
"G#C# G#C# {G#G}{G#A} A#R" \
"F#.R8 F#.R8 F#D# C#.R8" \
"C#.R8 C#.R8 C#D# F#.R8" \
"C#8R8R R8C#8<F#8R8"
static const char *test_scores[] =
{
SIMPLE_SCORE, TEST_SCORE, FLOH_WALZER_RIGHT, FLOH_WALZER_LEFT,
};
#define TEST_SCORES_NUM (sizeof(test_scores)/sizeof(test_scores[0]))
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: print_parse_result
****************************************************************************/
int print_parse_result(int ret_code, FAR struct mml_result_s *result)
{
int passed_tick = 0;
switch (ret_code)
{
case MML_TYPE_NOTE:
printf("Note(%2d) : length = %d\n",
result->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;
}