wemosでmml


概要

wemosでmml鳴らしてみた。

配線

出力は、D9を、そのまま。
パソコン用スピーカーで鳴らす。

写真

波形

利用したライブラリー

tiny mml parser

サンプルコード

#include "mml.h"

const byte SND_OUT = 2;

MML mml;
MML_OPTION mmlopt;
char * text = "t110 l8 r4rcf4.ffedcd4.ccr>a<cd4dddfde>a2 r4a<cd4dfg4fef4edd4rcd4rddafg2. r4rcf4.ffedcd4.ccr>a<cd4dddfde>a2 r4a<cd4dfg4fef4edd4rcd4rddafg2.";

const int notes[] = {
    0, 9, 9, 10, 10, 11,  12, 12, 13, 14, 15, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 28, 29, 31,
    33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62, 65, 69, 73, 78, 82, 87, 93, 98, 104, 110, 117, 124,
    131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
    523, 554, 587, 622, 659, 699, 740, 784, 831, 880, 932, 988, 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
    2093, 2218, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
    4186, 4435, 4699, 4978, 5274, 5587, 5920, 6272, 6645, 7040, 7459, 7902,
    8372, 8870, 9397, 9956, 10548, 11175, 11840, 12544
};

static void mml_callback(MML_INFO * p, void * extobj)
{
    switch (p->type)
    {
    case MML_TYPE_NOTE:
    {
        MML_ARGS_NOTE * args = &(p->args.note);
        snd(notes[args->number], args->ticks * 2);
    }
    break;
    case MML_TYPE_REST:
    {
        MML_ARGS_REST * args = &(p->args.rest);
        delay(args->ticks);
    }
    break;
    }
}
void snd(int hz, int ms)
{
    int len = ms / 4 * 3;
    tone(SND_OUT, hz, len);
    delay(ms);
}
void setup()
{
    Serial.begin(115200);
    mml_init(&mml, mml_callback, 0);
    MML_OPTION_INITIALIZER_DEFAULT(&mmlopt);
    Serial.println("start");
}
void loop()
{
    mml_setup(&mml, &mmlopt, text);
    while (mml_fetch(&mml) == MML_RESULT_OK);
}

動画

以上。