CH32Vマイコンプログラミング(5)|ChatGPTに演奏プログラムを作らせてみた!

以前のプログラムのおさらい

今回の内容は以前私が投稿したCH32Vマイコンプログラミング(2)|Arduino ide環境、電子オルゴールで紹介したプログラムを使用します。内容の把握のため以前の投稿を読んでいただくことをお勧めします。

私は以前の投稿で、自作PWMを使用したCH32Vマイコンの演奏プログラムを紹介しました。

今回これを応用すれば自由に好きな曲を演奏するプログラムが作成できるのではないかと考えました。

ただし自分ですべてを調べてプログラミングするのは大変なのでChatGPT君を使用することにします。

ChatGPT君とのやり取り

今回の肝は自作PWMプログラムによる音階の再現です。ChatGPT君にはこの部分を維持したまま曲を演奏するプログラムを作ってもらう必要があると考えました。

そこで依頼と共に私が作ったtone_selfmake.inoのプログラムを追記します。ChatGPT君にはこれをもとに曲を作成してもらうというわけです。

以下のような流れでやり取りを行いました。青い吹き出しは私の入力、黄色の吹き出しはChatGPT君の回答です。

下のプログラムは0.2秒開けてド・レ・ミと発音し、ミの後は1秒開けて再度ドから発音するプログラムだ。
使用したマイコンはCH32V003J4M6
プログラムの開発環境はArduino ideです。

このプログラムを参考にどんぐりころころの歌の錆の部分を演奏し続けるプログラムを作ってください。

(これより下に以前投稿した”tone_selfmake.ino”のプログラムをのせる)

以下に、「どんぐりころころ」のサビ部分(「どんぐりころころどんぶりこ〜」)を演奏するプログラムを示します。
CH32V003J4M6用に、あなたの元コードと同じ方式(f(int n)で音を出す)を使っています。
(これより下に自動生成されたプログラムが出力されます(都合により省略))

ここでCH32Vの容量が小さいことを思い出し、ちゃんと書き込めるか聞きました。

CH32V003J4M6のメモリなら曲のどこまで演奏できますか?

CH32V003J4M6のリソースを考慮して、「どんぐりころころ」のどこまで演奏できるかを判断するには、以下のハードウェアスペックとプログラムの使用メモリ量を見積もる必要があります。


🧠 CH32V003J4M6 の主なメモリ仕様

種類 容量
フラッシュROM 16 KB
SRAM(RAM) 2 KB

📦 メモリ消費の見積もり

あなたのコードのような単純なメロディ再生で使うリソースは非常に軽量です:

1. メロディデータ配列

  • 1音符 ≒ int(2バイト)× 音階1つ = 2バイト
  • もし長さも一緒に保持するなら、2バイト追加(合計4バイト)

例:

  • 100音符分:100音 × 4バイト = 400バイト
  • 2KB RAMのうち400バイト使用 →まだまだ余裕!

2. プログラムコード(Flash使用量)

  • シンプルなforループとトーン出力のみ → 数KB以下
  • 実測例ではこのような音楽再生コードは概ね4~8KB以内に収まる

🎵 実際にどこまで演奏できるか?

「どんぐりころころ」のメロディ全体は、以下のような構造になっています(例として音数を概算):

◾1番の歌詞(例)

どんぐりころころ どんぶりこ (14音)
おいけにはまって さあたいへん(14音)
どじょうがでてきて こんにちは(14音)
ぼっちゃんいっしょに あそびましょ(14音)
→ 合計 約56音

◾配列として保持する場合

  • 56音 × 4バイト(音階+長さ)= 224バイト

✅ 結論:演奏可能な範囲

🎶 どんぐりころころ 1番のフル演奏は
👉 十分CH32V003J4M6の2KB RAMに収まります!

さらに言えば、2~3番までのメロディや、他の短い童謡数曲分も格納可能です。


📌 補足アドバイス

  • 音階を配列ではなく、PROGMEMのようにFlash側に格納すれば、さらに多くの楽曲が保存可能になります(ただしArduino環境でCH32V003に使えるかは検証が必要)。
  • コードを極力簡潔に保つことで、音階変換・リズムも組み込めます。

必要なら、1番まるごと演奏するコードの実装例もお手伝いできます!

著作権に引っかからないか不安になったので確認しました。

さっきのプログラムをブログに掲載しようと思うんだが、どんぐりころころの著作権として問題はないか?

とても良い視点です!
「どんぐりころころ」の楽曲をブログに掲載する際の著作権に関して、以下にわかりやすく解説します。


✅ 「どんぐりころころ」の著作権について

🎵 結論:問題なく掲載可能です(パブリックドメイン)


🔍 理由と根拠

1. 作詞・作曲者と制作年

項目 内容
作詞 青木存義(あおき ありよし)
作曲 梁田貞(やなだ ただし)
制作年 1919年(大正8年)ごろ

2. 著作権の保護期間

日本の著作権法では以下の通り:

著作権の保護期間=著作者の死後 70年

  • 作詞者:青木存義(1870年生、1930年没)→ 2000年末に著作権消滅
  • 作曲者:梁田貞(1885年生、1959年没)→ 2029年末に著作権消滅

👉 重要ポイント

  • 2003年以前は「死後50年」で消滅済み(延長は遡及されないため既にパブリックドメイン化した曲はそのまま)
  • よって 「どんぐりころころ」は現在パブリックドメイン扱い

✅ つまり…

あなたがブログに載せる

  • 🎼 楽譜の一部
  • 🎵 音の再現プログラム(Arduinoコード)
  • 📝 歌詞の一部引用(サビ部分程度)

いずれも著作権上の問題はありません


⚠ 注意すべき点(参考)

項目 注意点
楽譜画像の転載 市販の楽譜をスキャンして載せるのはNG(出版社の著作権)
歌詞の全文掲載 問題ないが、必要以上の長文掲載は避けると無難
音源の使用 自分で鳴らしたものならOK。他人の演奏音源は権利確認が必要

💡まとめ

🔓「どんぐりころころ」はパブリックドメインの楽曲。
🎵 Arduinoでの演奏コードや歌詞の一部引用をブログに掲載しても著作権の問題なし!


ご希望があれば、ブログ掲載用に見やすいコード整形や、図解・演奏動画のアイデアもお手伝いできます!

CH32Vならもっと多く書き込めるとわかったので全曲追加します。

どんぐりころころの全曲を演奏するプログラムを作成して

了解しました!
以下に、「どんぐりころころ」1番フルコーラスCH32V003J4M6 + Arduino IDE環境向けに演奏するプログラムを提供します。


🎵「どんぐりころころ」1番(歌詞と音階)

歌詞(1番)

どんぐり ころころ どんぶりこ
お池にはまって さあ大変
どじょうが出てきて こんにちは
坊っちゃん一緒に 遊びましょ

🎼 簡易メロディ(音階)

こちらはリズムと調を簡略化した童謡風アレンジです:

歌詞 音階(簡易ドレミ)
どんぐり ころころ どんぶりこ ド ド ソ ソ ラ ラ ソー
お池にはまって さあ大変 ファ ファ ミ ミ レ レ ドー
どじょうが出てきて こんにちは ソ ソ ファ ファ ミ ミ レー
坊っちゃん一緒に 遊びましょ ソ ソ ファ ファ ミ レ ドー

(ChatGPT君の作成したプログラム(後述します))

🧠 メモリ使用量(安心)

  • int melody[28]:56バイト
  • int durations[28]:56バイト
  • 合計 ≒ 112バイト(2KBのRAM中、わずか5%程度)

👉 CH32V003J4M6で余裕で動作可能です!


💡補足アドバイス(ブログ掲載向け)

  • 🎨 楽譜画像ブレッドボード回路図を付けると読みやすくなります
  • 🎧 実際のスピーカー(圧電ブザー)で鳴らす動画を載せると効果的です
  • 🔁 loop()を繰り返すことでずっと演奏し続けることもできます

ご希望であれば、
🔁 「ボタンで再生/停止」
🔊 「複数曲切り替え」
なども対応可能です!

ChatGPT君の作成したプログラム

上記のやり取りの結果以下のプログラムが出力されました。

//donguri.ino
void setup() {
  pinMode(PD6, OUTPUT);
}


void loop() {
  // 簡易メロディ(delayMicrosecondsの半周期値)
  int melody[] = {
    955,955,638,638,568,568,638,     // どんぐりころころどんぶりこ
    716,716,758,758,853,853,955,     // お池にはまってさあたいへん
    638,638,716,716,758,758,853,     // どじょうがでてきてこんにちは
    638,638,716,716,758,853,955      // ぼっちゃんいっしょにあそびましょ
  };


  // 各音の長さ(ms)  ー:400ms, 他:200ms
  int durations[] = {
    200,200,200,200,200,200,400,
    200,200,200,200,200,200,400,
    200,200,200,200,200,200,400,
    200,200,200,200,200,200,400
  };


  for (int i = 0; i < sizeof(melody) / sizeof(melody[0]); i++) {
    playTone(melody[i], durations[i]);
    delay(50); // 音符間の隙間(休符)
  }


  delay(2000); // 曲の終わりに2秒休止
}


// 指定周波数を指定時間鳴らす関数
void playTone(int halfPeriodUs, int durationMs) {
  int elapsed = 0;
  while (elapsed < durationMs) {
    digitalWrite(PD6, HIGH);
    delayMicroseconds(halfPeriodUs);
    digitalWrite(PD6, LOW);
    delayMicroseconds(halfPeriodUs);
    elapsed += 2 * halfPeriodUs / 1000;
  }
}

この曲を演奏してみます。

CH32Vの配線は以前と同じで以下のように配線しました。

いざ演奏

これを書き込んで演奏しました。とくにスタートボタンなどは設けておらず、書き込みが完了次第即演奏します。

見事、どんぐりころころが演奏されま、せんでした(笑)。

ちゃんと音は出ます。音階も区別して発音されてましたが、何度聞いてもどんぐりころころの曲には聞こえませんでした。

むしろきらきら星に聞こえます。(きらきら星も著作権的に問題ないと確認しました。)

なんど書き直しを依頼しても、ChatGPT君からの回答はきらきら星になってしまいます。

元にした私の自作PWMプログラムでは不十分なのか、生成Aiの限界なのか、使用した他励式ブザーではどんぐりころころときらきら星の区別が難しいのか、結局原因は不明です。

まとめ

「自分が作ったプログラムをもとに生成Aiにプログラムを作ってもらう」という一連の流れはできたと思います、成功したかは別として💦

今回はCH32VマイコンのC++プログラムで行いましたが、生成Aiに「例を提示して、要望を生成してもらう」という手法は広く使用されるものです。私もexcel VBAのプログラムをChatGPTに依頼するときによく使用しています。

今回の私がいい例ですが、生成Aiもまだ完ぺきではないので成功することもあれば、失敗することはよくあります。そういう時はトライ&エラーで地道に教えていくしかないです。

成功すれば業務の助けになるので効率化に貢献できます。皆さんも挑戦してみてはいかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



reCaptcha の認証期間が終了しました。ページを再読み込みしてください。