5040719911
Add Music Macro Language parser library in audioutils. audioutils is also created for several audio utilities not only mml_parser.
196 lines
6.3 KiB
C
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;
|
|
}
|