このブログにはあんまり出てきませんでしたが、私の家には呼び込み君が2体います。
世の中にはこの呼び込み君に魂を奪われてしまった人、特に子供が多く、
100Vモバイルバッテリーに刺した呼び込み君持って現れる絵面面白すぎやろ #呼び込み君https://t.co/twim6bSGhI pic.twitter.com/6As5nUOAjW
— ひろみつ (@bakueikozo) November 19, 2021
呼び込み君フリークの息子、高頻度でこの動画を見てケタケタ笑ってるんだが、これワタナベマホトと相馬トランジスタだったのか。マホトはともかく、相馬氏風貌変わり過ぎて一年以上気づかなかったわ。(言われてみれば面影はちゃんとあるんだけど) pic.twitter.com/zsSp8ovY3g
— ひろみつ (@bakueikozo) October 19, 2021
どういうわけかうちの息子もその術にはまってしまい
新しい家族が増えました
— ひろみつ (@bakueikozo) August 5, 2020
呼び込み君です!
いやもう、なんか店に行くたびにこいつに息子が捕まって離れないし、トミカを買おうって言ってもお菓子を買おうって言ってもヤダっつって帰れないし抱っこさせられる始末だったので、そこまで言うならと買いました。
モウオモチャナシダゾ pic.twitter.com/8NDYJuUr9b
日々家の中で呼び込みサウンドが鳴り響いているのです…
そんな呼び込み君、仕様についてはまず適当な動画でも見てもらうことにして
基本的な機能としては、音源カードに内蔵された2曲のうちの一曲(もしくは無音)と、録音ボタンを押しながら吹き込んだアナウンス2本のうち一本、を延々とループ再生する機能があります。
呼び込み君の特徴的な「ポポーポポポポ」は、背面に差し込む音源カードに内蔵された曲で、このカードを抜いてしまうと聞くことができません。
ベビーカー売り場の呼び込み君 pic.twitter.com/rthu76wada
— ひろみつ (@bakueikozo) December 31, 2020
初期状態のシステムで、子供たちが大好きなドン・キホーテBGMに合わせたアナウンスを再現するためには、録音ボタンを押しながら携帯などでドン・キホーテの曲を流しながらアナウンスを録音する必要があり、結構めんどくさいです。
実際のドン・キホーテの店頭の一部では、特注で製造される専用BGMの入った音源カードを使用しており、これを使うとBGMとは別に単体でアナウンスを録音することができます。
しかし、特注ですから子供たちが簡単に手に入れることはでき…ないはずなんですが、
なぜかメルカリで結構売っているようです…なんで?闇?
そんな子供たちのあこがれ特注BGMカード、うちの息子も絶対に欲しいと言ってききません。かといってこのような闇取引に手を出すのはいかがなものか
というわけで、ドン・キホーテの曲にとどまらず、自分で好きな音源を録音できる音源カードを自作できるようにしてしまえばいいじゃないかプロジェクト~~!
↓これはどっかの店で見たAdoの曲と一緒に録音されたアナウンスを再現しようとする息子
呼び込み君で遊ぶということ pic.twitter.com/FfuHAcF4oR
— ひろみつ (@bakueikozo) January 22, 2022
まずは、既存の音源カードについて調べることにします。
音源カードの中身です
IC1~IC4まで実装パターンがありますが、実際に実装されているのはIC1のみでした。
IC1はMicrochip製のSPIフラッシュメモリ 32MBit(4メガバイト) 26F032 です。
この中に音源データが入っているはずです。
ピン配置とパターンを追って模式回路図を書いてみました。
呼び込み君では一つのICに入った曲2曲の選択式ですが、
基板の端子にはあと3つのICを選択できるような拡張があるようです。
この端子を使う場合、IC5に74138が実装されるように見えます。
呼び込み君ではIC1しか使用されないため、J1で直接選択することで
74138の実装を不要としているようでした。
しかし、この拡張を使った機器、他にあるんですかね…?
吸い出すために、Arduino XIAOで読出しプログラムを作ってテキストでダンプし、
これをシリアルで受信してからバイナリファイルに落とすことにします。
Flashの上限電圧が3.6Vですので、5V系Arduinoは使用できませんので注意です。
無事バイナリファイルができましたので、ざっと眺めながら解析していきます。
ファイルの先頭部分のヘッダ部分に情報が詰まっていそうです。
解析を楽にするため、ImHexというソフトを使ってみることにしました。
最近は「ImHex」というクロスプラットフォームでOSSなイケてるバイナリエディタが出ています。もちろん動的な構造体定義が可能(RT先のような日本語変数の定義はできないけど)。
— しゅーと (@shutingrz) July 6, 2022
オススメ!https://t.co/S9HZY4JYBK https://t.co/12BE4FYfMB pic.twitter.com/SflDwcUYoP
構造体定義を書いていくことで、ファイル全体を構造体として解析できる優れものです。
解析を進めていった結果、構造体定義は以下のように書けることがわかりました。
struct songheader_t{
u32 magic;
u16 unknown1;
u16 unknown2;
u32 addr_start;
u32 addr_stop;
};struct song_t{
songheader_t header;
padding[0x400-16];
u8 songdata[header.addr_stop-header.addr_start+1];
};struct globalheader {
u32 magic;
u32 val1;
u32 val2;
u16 u1;
u16 u2;
u32 songaddr[2];
padding[0x40-24];
song_t song1@songaddr[0];
song_t song2@songaddr[1];
};globalheader data@0;
この構造体定義にて読み込むと、以下のようなテーブルが生成され、中身が一目瞭然です。
4MByteあるフラッシュメモリ中、使用しているのは2578432バイト、2.5MBほどのようです。
音源データ部のフォーマットはどうなっているでしょうか。
普通の非圧縮フォーマットであれば無音部分は0やFFなどが続くはず。それが無いということは何らかの圧縮フォーマットである可能性が高いです。
しかし、再生に使用しているのはかなり小スペックのマイコンであり、そんなに複雑ではないはず。ええいADPCMに違いない、とあたりを付けてGoldwaveであれこれ開いていると、ついに正解を見つけました!
前回リーダにパラメータが無くて適当に合わせて読んだので化てたようだ。今回はきちんと読めてるようでノイズのないきれいな呼び込み君音源をメモリから直接吸い出すことに成功した。マイク録音ではない、本当の生音源の抽出は初めてではないだろうか。フォーマットはADPCM 4bit 44.1kHzだった pic.twitter.com/ifuwTO9M9q
— ひろみつ (@bakueikozo) November 28, 2022
全くノイズのない、生のポポーポポポポを手に入れたのです。
それを手に入れてもしゃぁないねん。
いや、ここまでわかったということは、これと同じフォーマットでここに自分の好きな音源を書き込んでやれば、好きな音源のカードが作成できる、という技術の裏付けができました。
しかし、このFlashメモリに音源を書き込むためには専用の回路やエンコード用のソフトを作らなければなりません。できるだけ低コストで、さらにユーザーフレンドリーに仕上げるため、設計を進めていきたいと思います。
いや、誰が使うねん!!!!!!
(※ある程度、少人数ですが需要はあると思います。しかし、部品代、基板製造代、など子供のお小遣いの範囲に納まる気はしません…)
書き込み機の作成の記事はこちらです!