3
0

More than 1 year has passed since last update.

【obniz×圧電スピーカー】処理(曲)コードをまとめました。 #マンボ #Disney

Last updated at Posted at 2022-02-03

obniz1Yと圧電スピーカーを使って今まで実装してきた曲のコードのみを公開します。
自分で楽しんでもよし!他の事に使ってもよし!

実際に使った記事は以下になります。

※obnizの0と1へ圧電スピーカーをつないで使用するソースコードを記載します。

音符・休符の長さ、音階周波数について

音符・休符の長さ

音符・休符の長さは、全音符・全休符の長さを基準として定数にします。
【参考】バンド・スコアの小楽典 - 2. 音譜・休符・拍子

const sp1 = 20002000は曲の速さに合わせて変更します。

数字を大きくすると遅くなり、小さくすると速くなります。 数字を小さく(=速く)しすぎると圧電スピーカーで対応できず破損する恐れがありますのでご注意ください。

音階周波数

音階ごとに周波数を定数にします。

【参考】音階の周波数

低すぎる または 高すぎる 音はうまく作動しないことが多かったので、適度な音階(上記リンク先の4~5)を使用しています。

ソースコード

汎用で使用できる部分のコードを記載します。
音符・休符、音階周波数をそれぞれ定数化します。
曲ごとに使用する定数を挿入します。

汎用ソースコード

汎用で使用できる部分のコードを記載。

    const Obniz = require('obniz');
    const obniz = new Obniz('****-****'); // Obniz_IDに自分のIDを入れます
    //***************************ここから音符・休符の定数宣言***************************
    const sp1 = 2000                    // 全音符・全休符
    const sp2 = sp1 / 2                 // 2分音符・2分休符
    const sp4 = sp1 / 4                 // 4分音符・4分休符
    const sp8 = sp1 / 8                 // 8分音符・8分休符
    const sp16 = sp1 / 16               // 16分音符・16分休符
    const sp2_34 = sp2 + sp4            // 付点2分音符・付点2分休符  
    const sp4_34 = sp4 + sp8            // 付点4分音符・付点4分休符
    const sp8_34 = sp8 + sp16           // 付点8分音符・付点8分休符
    const sp16_34 = sp16 + (sp16 / 2)   // 付点16分音符・付点16分休符
    //***************************ここまで音符・休符の定数宣言***************************
    //***************************ここから音階周波数の定数宣言***************************
    const oto_do_4 = 261.626;           // ド4
    const oto_re_4 = 293.665;           // レ4
    const oto_mi_4 = 329.628;           // ミ4
    const oto_fa_4 = 349.228;           // ファ4
    const oto_so_4 = 391.995;           // ソ4
    const oto_ra_4 = 440.000;           // ラ4
    const oto_si_4 = 493.883;           // シ4
    const oto_do_5 = 523.251;           // ド5
    const oto_re_5 = 587.330;           // レ5
    const oto_mi_5 = 659.255;           // ミ5
    const oto_fa_5 = 698.456;           // ファ5
    const oto_so_5 = 783.991;           // ソ5
    const oto_ra_5 = 880.000;           // ラ5
    const oto_si_5 = 987.767;           // シ5
    const oto_do_6 = 1046.502;          // ド6

    const oto_fa_5S = 739.989;          // ファ#5
    const oto_so_5S = 830.609;          // ソ#5
    const oto_si_5F = 932.328;          // シb5(ラ#5)
    //***************************ここまで音階周波数の定数宣言***************************

    // obnizが接続済み
    obniz.onconnect = async function () {

       // 任意の秒数待つことができる関数
       // 参考: https://qiita.com/suin/items/99aa8641d06b5f819656
       const sleep = (msec) => new Promise(res => setTimeout(res, msec));
       // スピーカーを利用 obnizの0と1を使う +-どっちでも良い。
       const speaker = obniz.wired('Speaker', { signal: 0, gnd: 1 });

       //***************************ここから曲コードを挿入***************************

       //***************************ここまで曲コードを挿入***************************
    }

4曲分

マンボNo.5

繰り返す回数をランダムにするところがあるので、特別に曲コードの前に定数を追加する必要があります。

    //繰り返す回数はランダムにするか固定、どちらかを//より下のconstを挿入する。
    //ランダム回数 ※以下songNoとsongFlgを使用して配列に入った数字をランダム回数として使用する
    const songNo = [2,3,4,5]; //繰り返す回数を配列に入れる
    const songFlg = (songNo[Math.floor(Math.random() * songNo.length)]);   //ランダム回数
    //固定回数 ※ランダムが嫌なら、以下2を繰り返したい回数へ変更する
    const songFlg = 2

コード(クリックで開きます)
//マンボNo.5
    //最初4
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(sp8);            // ラ4
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8+sp2);        // レ5
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);              // ラ4
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);              // ラ4
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);              // ラ4
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp4);            // レ5
    for (c = 1 ; c <= 2 ; c += 1 ) {
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);          // ラ4
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);          // ラ4
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);          // ラ4
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(0);          // ラ4
        switch (c){
            case 1 : //1回目
                speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // レ5
                break;
            case 2 : //2回目
                speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8+sp2+sp1); // レ5
                break;
        }
    }
    //繰り返す回数指定してマンボを実行
    for ( c= 1 ; c <= songFlg ; c += 1 ) {
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(sp8+sp8);    // ラ4 ★
        speaker.play(oto_do_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ド5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // レ5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(sp8);        // ラ4 ★
        speaker.play(oto_do_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ド5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // ミ5
        speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // レ5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_so_4); await sleep(sp8); speaker.stop(); await sleep(sp8+sp8);    // ソ4 ★
        speaker.play(oto_si_4); await sleep(sp8); speaker.stop(); await sleep(0);          // シ4
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // レ5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_so_4); await sleep(sp8); speaker.stop(); await sleep(sp8);        // ソ4 ★
        speaker.play(oto_si_4); await sleep(sp8); speaker.stop(); await sleep(0);          // シ4
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // ミ5
        speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);        // レ5
        speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
    }
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(sp8+sp8);        // ラ4 ★
    speaker.play(oto_do_5); await sleep(sp8); speaker.stop(); await sleep(0);              // ド5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);              // ミ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);            // レ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);              // ミ5
    speaker.play(oto_ra_4); await sleep(sp8); speaker.stop(); await sleep(sp8);            // ラ4 ★
    speaker.play(oto_do_5); await sleep(sp8); speaker.stop(); await sleep(0);              // ド5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(sp8);            // ミ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);            // レ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);              // ミ5
    for (c = 1 ; c <= 2 ; c += 1 ) {
        speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);          // ミ5
        speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(sp4+sp8);    // ミ5
    }

Part of your world(映画「リトルマーメイド」より)

コード(クリックで開きます)
//Part of your world
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);        // レ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_fa_5); await sleep(sp4_34); speaker.stop(); await sleep(sp4);   // ファ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_so_5); await sleep(sp4_34); speaker.stop(); await sleep(sp4);   // ソ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);        // レ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_fa_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_mi_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_so_5); await sleep(sp4); speaker.stop(); await sleep(sp4);      // ソ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_so_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_fa_5); await sleep(sp4_34); speaker.stop(); await sleep(sp8);   // ファ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);        // レ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ファ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_ra_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ラ5
    speaker.play(oto_ra_5); await sleep(sp4); speaker.stop(); await sleep(0);        // ラ5
    speaker.play(oto_so_5); await sleep(sp8); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_so_5); await sleep(sp8+sp2); speaker.stop(); await sleep(sp1);  // ソ5

【オクタヴィネル寮】お店を切り盛りしよう!一部抜粋(ゲーム「Twisted Wonderland」より)

コード(クリックで開きます)
// TWISTED-WONDERLAND Mostro Lounge by Disney
    speaker.play(oto_si_5); await sleep(sp8_34); speaker.stop(); await sleep(0);        // シ5
    speaker.play(oto_si_5F); await sleep(sp16); speaker.stop(); await sleep(0);         // シb5
    speaker.play(oto_ra_5); await sleep(sp8_34); speaker.stop(); await sleep(0);        // ラ5
    speaker.play(oto_fa_5S); await sleep(sp16); speaker.stop(); await sleep(0);         // ファ5
    speaker.play(oto_so_5); await sleep(sp8_34); speaker.stop(); await sleep(0);        // ソ5
    speaker.play(oto_mi_5); await sleep(sp16+sp4); speaker.stop(); await sleep(0);      // ミ5
    speaker.play(oto_ra_5); await sleep(sp4); speaker.stop(); await sleep(sp8_34);      // ラ5
    speaker.play(oto_si_5F); await sleep(sp16+sp4); speaker.stop(); await sleep(sp4);   // シb5
    speaker.play(oto_fa_5); await sleep(sp4); speaker.stop(); await sleep(sp8_34);      // ファ5
    speaker.play(oto_fa_5S); await sleep(sp16+sp4); speaker.stop(); await sleep(0);     // ファ#5
    speaker.play(oto_re_5); await sleep(sp4); speaker.stop(); await sleep(0);           // レ5
    speaker.play(oto_mi_5); await sleep(sp4); speaker.stop(); await sleep(0);           // ミ5
    speaker.play(oto_fa_5S); await sleep(sp4); speaker.stop(); await sleep(0);          // ファ#5
    speaker.play(oto_so_5); await sleep(sp16); speaker.stop(); await sleep(sp16_34);    // ソ5
    speaker.play(oto_ra_5); await sleep(sp16); speaker.stop(); await sleep(sp16);       // ラ5
    speaker.play(oto_do_6); await sleep(sp8_34); speaker.stop(); await sleep(sp8);      // ド6

【スケアリーモンスターズ】ハロウィーンを楽しもう!一部抜粋(ゲーム「Twisted Wonderland」より)

コード(クリックで開きます)
// TWISTED-WONDERLAND SCREAMING HALLOWEEN by Disney
    speaker.play(oto_ra_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // ラ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);           // レ5
    speaker.play(oto_mi_5); await sleep(sp8); speaker.stop(); await sleep(0);           // ミ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);           // ファ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // レ5
    speaker.play(oto_ra_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // ラ5
    speaker.play(oto_si_5F); await sleep(sp8); speaker.stop(); await sleep(sp8);        // シ♭5
    speaker.play(oto_ra_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // ラ5
    speaker.play(oto_so_5); await sleep(sp4); speaker.stop(); await sleep(0);           // ソ5
    speaker.play(oto_so_5S); await sleep(sp8); speaker.stop(); await sleep(0);          // ソ#5
    speaker.play(oto_ra_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // ラ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);           // ファ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);           // レ5
    speaker.play(oto_fa_5); await sleep(sp8); speaker.stop(); await sleep(0);           // ファ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(sp8);         // レ5
    speaker.play(oto_fa_5); await sleep(sp4); speaker.stop(); await sleep(0);           // ファ5
    speaker.play(oto_re_5); await sleep(sp8); speaker.stop(); await sleep(0);           // レ5
    speaker.play(oto_so_5S); await sleep(sp8); speaker.stop(); await sleep(0);          // ソ#5
    speaker.play(oto_ra_5); await sleep(sp8); speaker.stop(); await sleep(0);           // ラ5
    speaker.play(oto_do_6); await sleep(sp16); speaker.stop(); await sleep(sp16);       // ド6
    speaker.play(oto_si_5); await sleep(sp4); speaker.stop(); await sleep(sp8);         // シ5

さいごに

音符・休符・音階周波数を定数化していますので、汎用的に使うことができると思います。
これからobnizと圧電スピーカーを使って音を鳴らしたい方の役に立てると嬉しいです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0