【ｽﾀｯｸﾁｬﾝ】ﾃﾞｽｸﾄｯﾌﾟﾁｬﾝのおくちの開き方のセッティング

# 1. 少し改修して、おくちの開き方を調整可能に…

　まっくです。昨日の続きを書きます。先日はPCにｽﾀｯｸﾁｬﾝを召喚するやり方を記事として投稿しましたが、その続きと言いますか？せっかくなのでおくちの開き方の調整ができればと思ったです。

https://qiita.com/tmac116/items/9493110c85559abd46ff

　くうねるさんのソースをあまり大きく変更せずに、PCの音量とリップシンクの動作の調整をできるようにしました。PCの音量は、環境により異なると思いますので、そちらは極力いじりたくないと思います。そこで【ゲイン(強度)値】を用いて、物理的な取得値を増幅させるようにしたいと思いました。変更箇所はmain.cppの112行目以降の `void loop()` の中身です。今回は下記のようにしてみました。

``` main.cpp
// ----------------------------------------------------------
using lgfx::v1::delay;
void loop() {
    M5.update();
    float volumeLevel = getVolumeLevel();
    if (volumeLevel >= 0) {
        float gain = 3.0f;                 // ゲイン値
        float minVolumeThreshold = 0.15f;  // 最小しきい値（音量がこれ以下なら無視）

        if (volumeLevel < minVolumeThreshold) {
            volumeLevel = 0.0f;  // 小さな音量は無視
        }

        float scaledVolumeLevel = volumeLevel * gain;
        scaledVolumeLevel = std::min(1.0f, std::max(0.0f, scaledVolumeLevel));
        avatar.setMouthOpenRatio(scaledVolumeLevel);
    } else {
        avatar.setMouthOpenRatio(0);  // 取得に失敗したら口を閉じる
    }
    delay(100);
}
```

　ワイのPC環境はWindows音量を **30%** にしています。なので、ここで取得する物理値を3倍にさせ、ﾃﾞｽｸﾄｯﾌﾟﾁｬﾝとしては音量90%として認識するようにしました。そんでもって、PCから出てくる音量で、BGMとしゃべり音の違いを見分ける…なんていうのはなかなかできないのですが、最小しきい値を前後させて、ちょうど良いところを見つけてみましょう。ばっちり決まれば、正にしゃべっているようにおくちを動かす事ができるものと思います。
```
        float gain = 3.0f;                 // ゲイン値
        float minVolumeThreshold = 0.15f;  // 最小しきい値（音量がこれ以下なら無視）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/c5e5b397-d220-7b36-ea9d-bf7624e29cc9.png)

　多分、もっと頭の良いやり方はあるかもしれませんが、ワイはただのキモヲタオッサンでカリスマプログラマーとかじゃないため、ぜひ他のヒトの改変やフォークに期待したいところであります。(今回も、やりたい事をちょっとまとめてChatGPTさんに処々書いてもらいましたｗｗｗ)

# 2. アバターのフレームについて

　昨日、全部を表現しきれておらず申し訳ありません。(っていうか、1ページにまとめても見づらいものと思いますし) ちょっとｽﾀｯｸﾁｬﾝアバターのフレーム表示に関して書き残しておきます。
 
編集するのは `platformio.ini` を修正します。
``` platformio.ini
build_flags = -O0 -xc++ -std=c++14
    -lSDL2                               ; for Display avatar
    -DM5GFX_SHOW_FRAME                   ; M5Stack/Stick/Dial等のフレーム表示有無
    ; -DM5GFX_BOARD=board_M5Stack        ; for Display avatar M5Stack
    -DM5GFX_BOARD=board_M5StackCore2     ; for Display avatar M5StackCore2
    ; -DM5GFX_BOARD=board_M5StackCoreS3  ; for Display avatar M5StackCoreS3
    ; -DM5GFX_BOARD=board_M5StackCoreInk ; for Display avatar M5StackInk
    ; -DM5GFX_BOARD=board_M5StickCPlus   ; for Display avatar M5StickCPlus
    ; -DM5GFX_BOARD=board_M5StickCPlus2  ; for Display avatar M5StickCPlus2
    ; -DM5GFX_BOARD=board_M5Dial         ; for Display avatar M5Dial
    -DM5GFX_SCALE=1                      ; for Display avatar size 1 - 3
    -lmmdevapi -luuid -lole32            ; for Get Desktop Volume
```

下記のようにフレーム表示のオプションをつけて、ボードの種類として7つのうちのどれかを採用すればOKっす。
```
    -DM5GFX_SHOW_FRAME                   ; M5Stack/Stick/Dial等のフレーム表示有無
    -DM5GFX_BOARD=board_M5StackCore2     ; for Display avatar M5StackCore2
```

出てくるｽﾀｯｸﾁｬﾝのお顔はこんな感じｗ

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/ec22336e-c7a9-6d2d-f06b-30f8ba96f10f.png)

なんか…電柱の影からチラッとしている印象で、良い感じっすねｗｗｗ
当然ここは気に入らないものと思いますが、この座標は `src/BaseFace.h` 149行目以下を編集する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/dc366b87-862a-cd62-d425-910195fabadc.png)

ごめんなさい…ここはお絵描き職人さんの出番かな？と思いますのでベストな座標を是非ともX投稿してくれると嬉しいっすー。みなさまも遊んでみてください。

``` src/BaseFace.h

  /**
   * Faceクラスを継承したBase顔描画用のクラス
  */
  class BaseFace : public Face
  {
  public:
    BaseFace()
        : Face(new BaseMouth(50, 90, 4, 60), new BoundingRect(148, 163),
              new BaseEye(8, false),         new BoundingRect(93, 90),
              new BaseEye(8, true),          new BoundingRect(96, 230),
              new BaseEyeblow(32, 0, false), new BoundingRect(67, 96),
              new BaseEyeblow(32, 0, true),  new BoundingRect(72, 230)) {}
  };

```

ではではー！