
221031_レトロなキャラクター時計は、電子オルゴール(PIC技術研修)[2022年11月15日(Tue)]
レトロなキャラクター時計は、電子オルゴール(PIC技術研修)
('22/12/29更新:設定SWを追加)
【経緯】
おもちゃドクター技術研修として、レトロなキャラクター時計を分解してみたら、目覚し音は電子オルゴール演奏だった。
元々が電子オルゴールだったら、PIC換装で同等機能の再現も簡単では?
しかし、甘い考えであったと思い知らされ、ブログ掲載が大幅に遅れてしまった。
約2か月前から試行錯誤した過程を、ここで(失敗談も含めて)報告する。
(投稿記事が長文になるが、ご容赦あれ。)
【オリジナルの演奏曲】
レトロなキャラクター時計の修理(ムーブメント交換)で、機能検証結果を報告済だが、修理完了後の見事なオルゴール演奏をフルコーラスで聴いて、正直、驚いた。
演奏途中、サビの部分でメロディーパートに何やらエフェクトが掛かっていて、それゆえ何回も反復繰り返し聴いても、飽きが来ない。
最初は、残響効果の「ディレイ」や「リバーブ」かなと思ったが、もしかしたら音量変調の「トレモロ」みたいな気がする。
しかも、「ビブラフォン風」の揺らぎとは異なり、マンドリン奏法のように一つ一つの変調がクリアに立っている。
言葉で説明するのは、難しいのだが、、、。
代表して、2曲目「小さな世界」のフルコーラス演奏を、ご試聴あれ。
PIC電子オルゴール orgel ver6_3 の開発者である 「つつじが丘おもちゃ病院」 Dr.大泉院長 によると、この音色は大昔のアーケードゲームに使われていた PSG音源 に近しく、その当時のレトロな音色のファンは今でも多いとのこと。
デューティ比50%の矩形波に簡易な減衰を施すことができて、初代ファミコンブームの要因の一つは PSG音源 だった、という トリビア情報 も。
私は、おもちゃ修理やリサイクルおもちゃへの応用では、PIC電子オルゴール を愛用。
LED点滅やモーター駆動などのアプリ機能が豊富で、プログラミング初心者でもカスタマイズが可能なサンプルが公開されているのが、大変ありがたい。
今回もまた、開発者に全面的に技術指導をいただき、この場を借りて感謝申し上げる。
いつも、ありがとうございます。
【再現機能の構想】
実物は時計ムーブメントを交換して完治したが、ここでは技術研修として同等機能を PICマイコン を使って再現させてみたい。
そして次のステップでは、音源や機能も見直して自分好みにアレンジしていく予定。
orgel ver6_3 では、エンベロープや音源波形は曲ごとに固定で、演奏途中でこれを切り替えるためには、少し工夫が必要。
まず演奏曲の方を前半・後半に2分割し、前半は通常の演奏で後半のサビ部分からはトレモロ変調の演奏を、連続して演奏すれば結果的には1曲の演奏に聴こえるはず。
もし、このように分割した演奏曲を連続演奏できたら、演奏表現の幅が広がるのだが、、、。
即日、開発者から回答あり。
orgel のさらなる機能追加(特に動的変更)は、とてもとても大変だが、1つの曲を複数の曲に分割して、連続演奏させることは現機能( orgel ver6_3 )で可能。
演奏終了時のコールバックで次の曲を開始すればいい。そうすると曲間が空かずに連続して演奏される。そのような使い方を意識して設計済みの機能である。
なるほど、それなら簡単と思いきや、完成までの道のりは長く、遠かった!
【トレモロ変調】
速攻で試作した、「マンドリン風」エンベロープのトレモロ変調だが、「ここぞ」というときのトレモロ演奏が、より効果的。
トレモロ波形や深さは、減衰曲線グラフからイメージをご想像あれ。
なお、トレモロ速度については、ソングファイルへの設定で自由に調整することができる。
【連続演奏】
オリジナルの実装曲が全4曲で、このうち2・3番目の曲だけを分割し、指定曲のみを連続演奏させてみたい。(実際の実装曲数は6曲になる)
1)ミッキーマウスマーチ
2)小さな世界 (トレモロあり)
3)エレクトリカルパレード (トレモロあり)
4)星に願いを
全曲の連続演奏は、流れるように曲がつながり大成功したが、指定した曲のみ連続演奏させるのは、失敗だった。
すぐに開発者にヘルプ。サポート依頼した翌日のご回答では、分割した曲はそれらを連続演奏し、分割しない曲は1曲で演奏を終える、ということをスマートに書く方法があるとのこと。
以降、数え切れぬほどの質問に対して、スピーディーかつ的確にアドバイスいただき、誠にありがたく恐縮であった。
おかげ様で何とか、指定したオルゴール曲の連続演奏が、できるようになった。
【トレモロ付き新曲】
オリジナルの曲目でレパートリーに無かった曲は、新たに1曲分の曲データを作ってから5分割、サビ部分にトレモロ効果を付けてから連続演奏させる。
実際に試聴していただくと、より演奏表現の違いが分かる。
試作段階で使った既存の2曲も、それぞれ前・後半に分割、連続演奏させる。
・小さな世界(トレモロ付き) SMALLWORLD
・アンニローリー(トレモロ付き) ANNNI
【アラーム機能】
目覚し時計なので、曲演奏が始まると、スイッチで STOP操作 するまで同一曲を反復繰り返すことが必須。
これは、曲演奏で「次へ進む」処理の直前に、今の曲番号を仮に目覚し曲として準備しておき、演奏終了時のコールバックでそれを演奏開始させることで、上手く実装できた。
次に、このレトロなキャラクター時計の最大の特徴である、目覚し曲目を選択プリセットする機能を実装したい。
これは、曲演奏で「停止する」処理の直前に、今の曲番号を EEPROM に記憶、自動開始を宣言しておくこととした。
次の電源オンで目覚し曲を呼び出し、自動で鳴り始める。電源を切るまで同じ曲目を反復繰り返す仕様。
これで、目覚し時刻に音が鳴り始めて目が覚めたら、音が鳴っている(接点オン状態の)間に、SW操作により翌朝の目覚し曲を選択プリセットすることが可能。
この仕様は苦肉の策で、時計のアラーム接点を「=電源スイッチ」として使ったものだが、、、。
開発者からは、この仕様は、なんか違和感がありますね、と落第点。
目覚し時計のアラーム接点は、オン・オフを交互に繰り返すオルタネートSWで、しかも長時間オン(オフ)状態が続く仕様となっている。
時計ムーブメントの構造上、アラーム接点の仕様を変えるわけにはいかず、実は(私の技術レベルでは)現時点でも、オルタネートSWの実装は未完成。
何しろ、「60の手習い」で定年後に独学で始めたプログラミング初心者が、あちこちのサンプルからソースコードを切り貼りするだけでは動くはずもない。
開発者からは、こんな初心者に何回もご指導いただき感謝しているが、とてもサポート継続をお願いするレベルには到達していない。
【成果と課題】
ここら辺で一息入れて現状分析、何か手掛かりを探して、今後の活動に活かしていく所存。
一連の技術研修の 成果 としては、逆回転時計の作成、オルゴール演奏の新曲追加、マンドリン風エンベロープでトレモロ効果を再現、1曲分を分割して実装し連続演奏を成功。
今後の 課題 としては、アラーム接点入力と曲選択プリセットSWとの両方を同時に実装すること。
やはり、目覚し時刻をセットするときに(就寝直前に)、翌朝の目覚し曲を選択プリセットできないと、おかしい。(後日、設定SWを追加)

このレトロ時計は、おもちゃドクターには良い教材だったと思う。
オルタネートSWの応用は、ラジコンのターボ、
クルマおもちゃのクラクション、キーボードなど、
今後も必ず直面する課題だと考えると、
何とか最後まで、頑張るしかない!
【ダウンロード】
落第点をいただきながら、未完成のプロジェクトを、敢えて 失敗例 として公開する。
先輩おもちゃドクターから、お前は技術者のプライドがないのか! と叱られそうだが、事務畑出身の私には皆無。
逆転時計のアイデアしかり、「失敗は成功の母」と言うではないか、その後に「君たちはどう生きるか?」だ。
開発は、orgel ver6_3 のサンプルプロジェクト orgel_1705.x をベースに、過去の試作プロジェクトのソースコードを参照しながら、トレモロ効果入りの限定版プロジェクトを試作。
当方の公開フォルダに圧縮保存済で、下記リンク先からダウンロードできる。
苦肉の策で作った、アラーム接点を電源スイッチとして使うモデルも、他のデバイスに横展開して同梱している。
目覚し時計としては少し違和感があるが、SPI音声再生も実装可能で、リサイクルおもちゃへの応用サンプルとしては面白い。
リサイクルおもちゃでは自動開始は不要、音声の選択に傾斜SWを使うなど、アイデア次第。
限定版プロジェクト(音源データ含む)Zip (72MB)は、ココから ダウンロード
プロジェクト名
・Alarm_1572.x (アラーム接点=電源スイッチ)
・Alarm_1705.x ( 同 上 )
・Alarm_1822.x ( 同 上 )
・Alarm_1840.x ( 同 上 )
・Alarm_18313.x ( 同 上 )
・DisnyClock_1705.x (一部未完成、冒頭コメントを抜粋)
//【追加したい機能】未完成のため、宣言をコメントアウトしてあるが、
//オルタネート動作のアラームSW1を、RC3ポートに追加実装したい。
//SW1オン評価でオンと認識されている間は、同じ曲・同じ音声を反復継続する。
//SW1オン評価でオンと認識されなくなったら、演奏中断、再生中断する。
//再びSW1オン評価でオンと認識すると、次の曲・次の音声を反復継続する。
;#define SW1_ALT //オルタネートSW1入力によるオン・オフ機能を実装するときに宣言(未完成のためコメントアウト)
以上、長文にお付き合いいただき感謝する。