honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

DAM カラオケコマンダ XG1000に自前BGV再生機能を追加

honeylab.hatenablog.jp

 

カラオケ、本人映像や専用アニメ映像が入っていると嬉しいですよね。
でも、皆さんがカラオケで歌うようなあまりメジャーではないアーティストや曲のBGVに
そういう専用映像が入ってくることは、公式ではほとんどないじゃないですか

せっかくなので、自分専用の映像を背景にカラオケしたいですよね。

多分、外部入力から入れる、っていう手ができる気もしますが、それだと同期が大変です。
ここは、本体を改造して自分用の映像を再生できたらいいなぁ、と30年ぐらい前から思っていました。

引き続きじわじわと逆コンパイルする日々の中、実現できそうな気がしたのでサクッと実装してみました。

大抵のカラオケ機では、曲のジャンルやアーティスト、事前設定されたパラメータなどから本体内に保存されている映像DBを参照し、専用映像があればそれを、なければ無難な映像を探し出して再生してくれます。

DAMでもそのようになっていて、ログを見るとその流れが確認できます。Image

まずはDBを見て、専用動画があるかを確認、なければさらに検索して動画を選択しているようです。

動画を検索する関数でファイル名リストを取得したあと、それぞれの動画が本当に存在しているかを「CMDVIndex::CheckPresentBGV」という関数でチェックし、OKならプレイリストに追加している、ということがわかりました。
ならば、この関数にファイル名が渡された時点でそのファイル名を自分専用の動画ファイル名に書き換えて仕舞えばそのファイルを再生してくれそうな気がします。

早速やっていきます。

CheckPresentBGVはファイル名を受け取りますが、実際にそのファイル名の格納されたフォルダを複数のフォルダ(304,305)から検索するようになっています。

見つかった場合、そのフォルダを引数で渡されたフォルダポインタ(LPWORD lpFolderNumber)に格納し、trueを返してくれるようになっていました。


なんと好都合。指定したフォルダから探す、として値渡しだった場合、関数一つ戻ってそっちで書き換える必要があるんですが、これならこの中で自分専用のフォルダを返してやればいいんじゃないでしょうか。
専用フォルダ番号は「666」とし、ファイル名に指定されたファイルを準備してやります。
動画ファイルは、あらかじめ曲番号に準じた形式で保存しておきます。
このファイルをコピーすると遅くなってしまいますので、シンボリックリンクで処理します。
対応しているファイル形式はいくつかありますが、とりあえずWMVがうまくいったためこれでやっていきます。

ついでに、同じ曲でも複数のBGV、バージョン違いが存在する場合、ランダムに選択されるようにしてみました。これなら最大10個のバージョンを準備できます。素敵!

で、この関数をどうやって書き換えるか、という話なんですが、よく私の使う

「LD_PRELOAD」でライブラリを読み込ませる、という方法を使います。

qiita.com

ATOMCamなどのハックもこの手法でやっています。

実際に記述した関数はこんな感じになります。

gist.github.com

大変ヘンテコな関数名「_ZN9CMDVIndex15CheckPresentBGVEPtmP15tagVSTREAM_TYPE」になっていますが、これは

「bool __thiscall CMDVIndex::CheckPresentBGV(CMDVIndex *this,LPWORD lpFolderNumber,DWORD dwFileNumber,VSTREAM_TYPE *type)」

C言語名前空間に配置した時に行われる「名前マングリング」という処理の結果です。

C++のクラス関数を上書きする際には、この名前で関数を書く必要があります。
また、引数にクラスオブジェクトのポインタが渡される場合、型情報は自分で定義するか、
ポインタを自分でインクリメントして型を設定し、アクセスする必要があります。
今回は本来の関数へ橋渡しするのと、数値を書き換えるだけなのでそこまでめんどくさいことをする必要はありません。

 

で、できたーーーーー

これでマジで好きな動画ファイルでカラオケができるぞ素敵すぎる!

 

 

 

DAMカラオケコマンダXG1000の便利隠し機能を発見した

honeylab.hatenablog.jp

前のブログからの続きでもあります。

センター室モードで採点機能が使えず消沈しつつ、新たな手法を探していると、
おそらくデバッグか開発・設定用と思われる新たな入力方法を見つけました

何と、起動時にコンソールにしてたシリアル入力、標準入力をパネルボタンと同じように扱ってくれることを発見しました。

 

 

これは便利!!!!!

これならマジでマイデンモクが自作できます!

 

スタートボタンだけハンドルされないんですが、
演奏モードを連続にしていればどうやらスタートボタンを押す機会はないようです。

DAMカラオケコマンダの遠隔制御モードを掌握した

前のブログで、うっかり買い集めたDAMのカラオケ機(専門用語で「コマンダー」というらしい)を買っていじっている話をしましたが

 

honeylab.hatenablog.jp

色々いじっていたところ「センター室モード」という特殊モードを発見しました。

Image

これは、外部の機器から曲番号をセットしたりして再生できる特別なモードです。

何のために実装されているのか。

カラオケマニアの人なら知っているかもしれませんが、一部の店舗では
各部屋にこのコマンダーを設置しているわけではなく、数室で共有するシステム、
カラオケの鉄人や、カラオケ館「Σシステム」などで使われているあのシステムです。

ja.wikipedia.org

中身を見てみると、「HotelSystem」というクラス名がついていました。

Image
ホテルとは。

よくあるラブなホテルなんかにある「カラオケ」と書いてる設備の一部は
各部屋にコマンダーが設置されているわけではなく、ホテル設備として準備されているテレビ一体型の配信システムにカラオケ予約キューがあり、そこにキューが入るとシステム内に番号を発信し、部屋のテレビでカラオケができる、というシステムを採用しています。

(最近は普通に部屋にコマンダがあることも多いみたいですが)


なんでそんなめんどくさいことをするのか。

こいつがバカ高いからです。

本体定価は200万〜300万円、加えて配信料や利用料など、
常に利用されることが前提のカラオケルームとは違い、これを常設したらとんでもないコストになってしまいますね。そうならないために、このシステムがあるわけです。

が、メーカーはこの使い方はOKなんですな。もしかしたら、これを利用するために別途契約がいるのかもしれませんが。

そう、利用する、と書いてありますが、使い方は説明書に書いてありません。

というわけで、解析していきます。

まず、コマンダが起動したら「8295ー00」をセットします。
すると「センター室モード」に入り、以後、本体は全く操作できません。

接続するのはカラオケ機背面のシリアルポート。
コマンド(通信プロトコル)は全く不明です。契約なりNDAしたら貰えるんじゃないですかね。

 

コンパイル

Image

そのほか大変省略!(約1週間の睡眠不足と数十ページのプリンタ印刷)

 

解析できました!

シリアルポートから好きな曲番号でカラオケの曲を再生することができました

 

が…

これ、遠隔で使用することが前提なこともあって採点機能が使えないんです…
(あとちょっとで解析完了というところで気づきました)

ええええええー、これ使ってマイセットリストを予約キューにブチ込む便利なアプリを作ろうと思っていたのにーーーーーーーーぴえんぴえん

完全にオプション込みで放り込むにはデンモク系のインターフェイスを使わないかんのか…
買って解析するか???高いな…逆コンパイルだけでいけないかなぁ

 

あーーーん

まぁ、このモード、ちょっと頑張ればシステムごっこできるので
その辺は時間のある時にやってみたいと思います。

 

せっかくなので、実験に使ったクソC言語コード置いときますね。

 

gist.github.com

 

あーーーん。デンモク、そもそもまともにペアリングから使ったことないから通信のイメージが湧かないんだよな。

DAM XG1000に入っているLinuxで遊ぶ方法

前回、うっかりJOYSOUNDのマシンを買って色々遊べたので、

honeylab.hatenablog.jp


続いてDAMの XG1000を買ったのですが、いじり過ぎてしまい壊してしまいました。

満を持して、もう一台XG1000を買ったので丁寧にいじっています。

DAM XG1000はLinuxが使用され、その上でカラオケシステムが動作しています。
せっかくLinuxが入っているのですが、自動でそのような動きをしているため、自由に使うことができません。

HDDを引っこ抜いて書き換えてあれやこれやする、というところで壊したので、
今回はできるだけ分解せず、ソフトウェアだけであれこれする方法が確立できたので
こっそり紹介します。

 

背面、コントロール端子のこの2ピンがそれぞれRS-232C(ttyS0)のRXとTXです。
TTLCMOSの5V/3V - 0V ではなく、RS-232Cレベルですので気をつけましょう

ブートローダの起動中、のメッセージを見ながら、徐にスペースキーを押すと
YAMON> のプロンプトで停止します。

Image
ここで

YAMON> pflash probe
YAMON> xrpc 0xac080090
YAMON> load zbf 0xb3000000
を実行すると、Linuxカーネルが読み込まれます。
ここで、
YAMON> go . "console=ttyS0 rdinit=/bin/sh"

する


と、直接busyboxのshが立ち上がります。

何が起きたかというと、内蔵Flashに記録されているLinuxカーネルにはrootfsとしてinitrdというミニファイルシステムが添付されています。

(initrdの中身)

 

何も指定しなければinitrdの中のinitが起動して、/etc/init.d/ からカラオケシステムが起動しますが、それをやめさせるためにrdinit=/bin/sh つまり、busyboxのシェルだけを起動させています。

initされてないのでマウントとかがされていませんが、ログイン不要でなんでもできるプロンプトになります。マウントが動いてないので /procとかも使えません。最低限。

 

で、ここで 

# exec init

すると、通常のカラオケシステムの起動ルーチンに戻ります。
それ以外の作業をしたければ、別途準備した rootfsにchrootする
rm /etc/init.d/S50NK1000
してから exec init すると、普通にマウントとかができてますが、/etc/shadowが使われたgettyが起動してしまうので、その前に/etc/passwdのroot行を上書きしてパスワードを無効化しましょう。

(R/Wマウントですが、これはRAMDISKなので次回起動時には影響しません。永続化されない。)

 /proc/versionとcpuinfoはこんな感じでした

 

参考までに、どっかから落としてきたこのCPU用のtoolchainでビルドした自前rootfs、自前ビルドbusyboxchrootした画面を置いておきます。
普通のLinuxですので、普通に作ったプログラムが動きます。

残念ながらお腹のLCDはそのままfbになったりはしていないようです。
頑張ってあれやこれやしたら何か出るかもしれませんが、今のところ難しそうです。

 

Image

 

もし何かしたければ、上記の S50NK1000の中で、 HDD-A、HDD-B、PATA HDD(搭載されていない)の順で /Data/MODUL/module.sh というスクリプトがあれば起動してくるようになっていますので、そこに引っ掛けるようにしてやれば永続化した自分専用の起動スクリプトを割り込ませることができます。フラッシュメモリをダンプするとか。

カラオケシステムが立ち上がると、telnetサービスも動きますが、そのままではパスワードがかかっていてログインできません。上記の流れの中で、/etc/passwdを上書きして、パスワードを無効化するといいです。(同様に、永続化はされません)

 

HDD-A、HDD-Bのp1はext3で、それぞれ/NK1000,/NK2000というマウントポイントにマウントされ、カラオケシステムから参照され、アップグレードなどのために二重化されています。そのため、スペック表記にある”RAID1”というのは実は正しくないと思われます。

カーネル上はRAIDもサポートされてますが、使ってないように見えます)

HDD p2にはOSMFという独自のファイルシステムがあるようですが、なんかよくわかりません。

 

p3はext3ファイルシステムですが、一部のバイトを書き換えてあり、XG1000以外のマシンに持っていっても認識されないようになっていました。


XG1000のLinux上ではおそらくカーネルにパッチがあってext3として認識されるようになっています。他で読みたいなら該当部分を書き換えてもいいです。
もし書き換えたものを戻しても、同じようにext3として認識されます。
注意点ですが、ext3は認識するのに、ext2がサポートされてないので、自前で作ったrootfsなどを読み込むときは注意が必要です。そのせいなのか、mount に -t ext3をつけないとダメなことがありました。

このようにすると、XG1000を普通のMIPS Linux環境として使用することができます。

 

できます!!

 

中古のカラオケ機材を買ってみた話のさわりだけ

近場のハードオフHyperJOY V2の筐体を発見しました。

知ってる人は知ってますが、私はカラオケとかの機器への執着が強く、
過去にこいつの先代機種をあれやこれやとしたような記憶があります。

ここであったが100年目(多分5倍サバ読んだ)
ジャンクコーナーで一通り動作確認を行い、大枚叩いて買ってきました。

 

 

早速分解といきます。
その前に背面端子を眺めてみます。実は店舗にこいつがある時から気になってたんですが、この外部楽器、っていう端子、Macのシリアルと同じコネクタなんですよね。
なので、実はここからMIDIが出てたりしないのかな、と思っていたことがあるのですが、果たしてどうなるか。

 

では分解です。

結構むずい。あちこち開けてみていたところ、フロントパネルを開けると割と簡単にバラせることがわかりました。手遅れ。

Image

主要基板はスロットに差し込む形式で重ねられており、多ピンケーブルで接続されていました。

Imageメイン基板。CPUはIBMのDigitalSetTopBox用としてリリースされたものらしいです。
CPUの左側には映像出力用のNTSCデコーダ、SAAなんとか、あとは下の方に16ピンのJTAGっぽいものが出ていますが、ちょっとどうにかできる気はしません。
ハードディスクが2台とコンパクトフラッシュ、そして謎のメモリカードが取り付けられています。

 

そして!前々から気になっていたこと、そう、HyperJoyはバリバリRolandのGS音源の音がするんです。つまり、こいつの中には絶対Rolandの音源互換基板が入っていると何年も思っていました。その答えがここ!

 

正解!

いや確かにRolandの基板だわ。ICだけじゃなくて、基板にもRolandって書いてあるので
この単位で部品として納品されてるのかな。おもろい。
乗っている主要なICの型番

・H8/510(よくメインマイコンとして乗ってる)

Roland RA09-002 → Roland XV-1010というやつに乗ってる

・そのほかI/O

・裏面にはTIのDSPとAKのA/D 類

この基板は、カラオケプレイヤーから送られてきたMIDI信号とマイクにエコーなどをかけるDSP回路が詰め込まれているようです。
そしてお楽しみなんですが、
なんと、カラオケ音源再生中にこの基板には31.25KHzの生MIDI信号が入ってきていました。

Image
つまり、これを分配してやるとMIDIストリームがそのまま保存できますw

なお、先に書いたMacシリアルと同じコネクタからは何も出てきませんでした。
特別なモード、曲、などで反応するのかもしれません。ざんねん。

さて、ハードの面白いところはこんなもんか。

HDDが2本挿さっていて、No.1の方にはパーティションが二つ、先頭パーティションにはLinuxカーネルが書かれていました。2ndパーティションは普通にext3で、Linuxのパソコンに繋いだところ中身は普通に読めました…まじか

Image

Image

で、私が欲しかったのは実は、カラオケ中に流れてくる背景動画、
あれ、なんかストーリーっぽかったり、ちょっと気になる女の子が出てきたりして続きが気になったりしましたよね?(断定)

HDDの中を調べていると、どうやらVOBファイルが点在していて、これをカラオケ中にジャンルなどから自動的に拾ってきて再生しているようです。
VOBファイル、みんながよく知っているDVDからリップした時に付く拡張子ですね。
…しかし、VLCにそのまま食わせても再生できませんでした。
改めてバイナリエディタで見てみると、しらんヘッダがついています。

Image
どうやら、DVDから取り出したMPEG2PSに先頭ヘッダをつけた上、
MPEG2のヘッダ付近を特定のビット列でxorしていて、そのままでは読めないようになっているようです。

あれやこれやといじっていると、特定のビット列はまさにそのVOBファイルの先頭部分に埋まっていて、これを使うとデコードできることがわかりました。

Image

 

けっこうたくさん入っていて、私はこの映像を自由に眺めることができるようになりました。うれしい。

さて、これが取れたので、あとはカラオケデータからMIDIを抽出するだけ。

 

あぁそうだ、こいつ、HDDがext3なので当然、OSとしてLinuxが採用されていました。
このSTB用CPU、ベースはPowerPC 450で、それ用のLinuxがあったようです。
カラオケデータの再生は、CPUでシーケンサーを回してデータを送っているのかと思っていたのですが、先ほど出てきたRolandの基板の上にもう一枚、SH3を使用したサブ基板があり、LinuxからはUSBデバイスとして見えています。

このUSBデバイスにあらかじめMIDIデータを送っておいて、プログラムからは再生コマンドを送ることで、LinuxみたいなRT性が保証されないシーケンサではなく、ハードウェア再生デバイスで安定した音楽を流す、という仕組みになっていました。
なお、前面パネルとCPUの接続もUSBでした。

 

こんな感じで、中身はもうほぼ解析が完了して、あとは好きなようにできるとわかってしまったので……………うえーえええん、、もうやることがないよう!!!!

 

あ、ところで、これは元々「通信カラオケ」システムを利用するための筐体なので、
本来はメーカと配信契約を結んで使用する必要がありますが、当然契約が解除された状態でハードオフに買い取られていました。(閉局状態と呼ぶらしい)

閉局状態では、稼働日数が30日、または再生曲数が3000曲を超えるまでは、カラオケとして使用することができますが、それ以上はシステムがロックされ、カラオケ機能が封印されます。

Image

今は買ってきたばかりなのでカラオケができていますが、その上限に当たってしまった場合、こいつはカラオケができなくなってしまいます。

が、まぁ、この機械、ある程度のセキュリティは持たせてあるとは思いますが、そもそも定価がクッソ高いため(250万円ぐらい)、入手が難しい、という強めの制限によって想定外の使用を避けているように感じました。毎回サーバに問い合わせるようなガチガチの設定ではないのです。
 閉局・認証情報がハードディスクに保存されているため、特定の状態をクローンして戻してやればその時点まで戻せる、という噂を耳にしましたが、まぁそんなことしなくても、ガチのガチでハックすれば、そんな制限は攻略すること可能です。

 

が、そんなことをここに書くと、サングラスの黒服のお兄さんとかに攫われる可能性があるので、書きませんけどね。

 

ところで、ヤフオクとかをみると、最新状態のハードディスクです、とかそう言うのが売ってたりもするので、一定の数でのイリーガルな状態の環境、と言うのも存在しているのかな、と思いますが、関わりたくはないですよね。

 

さーて、どうやら17万曲入っているらしいこの中から、スーパーオレオレMIDIコレクションを作り出すのだ。コンバータ書かないとな。

※果たしてこれが合法なのか、違法なのか。おそらくメーカーはこの状態を想定はしていないでしょう。そして、この機器を中古品として流すこと自体、前のオーナーがどう言う契約をメーカとしていたのかはわかりませんが、私はこれを売っていた人(ハードオフ)から正式に購入したため、このデータの所有に関してはなんの制限もあるとは思っていません。コンバートして何かするとちょっとグレーになるかな。再配布したら真っ黒だろうけど。

 

まぁ、上の話は、全部私の妄想ですけどね。

 

あ、そうだ。データは曲番号でしか管理されてないので、元データを参考に自分で打ち込んだデータを入れたら再生するのは全然簡単にできそうでした。
そっちの方が面白いよね。

 

返事が来たぞぉぉぉぉ!

honeylab.hatenablog.jp

 

↑の続き、メール送信から5日後

 

そうきたかw

 

ちなみに、お客様からのご返信内容、というのはこちらです

Image

この内容について、販売元と連絡を取れと言われても…
というか、販売元はキミなのではw

まぁ、ドンキとしては仕入れて売っただけで、
中身はわからんので丸投げされてるんでしょうか。

販売元に連絡を取ったとして、もし技適アウトなら対応するのはドンキなので、
ドンキに対して販売元が何か指示ができる可能性があるのかな?なくね?

あー、あれ?これメール送信先選択の際に購入した三郷店にしか行ってないのかなもしかして。

返答についてる肩書きが三郷店、なんだよね。
なんか使えるシステムがあって、店単位なのかな。


本部にエスカレーションされてんのかな。されてない気がしないかな。
ちょっと他の連絡先も探してみるか。

 

ドンキはこいつが適法だっていうけど、そんなわけないやんって返事したら返事がなかなか返ってこなくなっちゃった

honeylab.hatenablog.jp

前回のブログの最後で、ドンキに送ったメールを書いておきましたが、
そのお返事が届きました。

 

 

(;゚д゚)(つд⊂)ゴシゴシ(;゚Д゚)…?!

技適(電波法)番号ですが、日本では商品に対して技適を取ることが多いですが、中国では工場部品に対して技適を取ることが多く、日本で検索するとその部品を使った別の商品が検索されることがあります。

またそういった所を含め、諸々クリアした上で輸入されているので特別問題無いです。」

何を言っているんだお前は」の検索結果 - Yahoo!検索(画像 ...

 

えーと、そうきたかw

まぁ、そういう言い訳で通る場合もあるかもしれませんが、

(この場合もアウトなこともあります)

これは ぜんぜん 部品単位の あれこれ とかじゃ ないのでwww

 

細かいことは置いといて、この技適番号に対する免許はBT EDRとBLEだけなんですが、
こいつ、WiFiカメラを名乗ってWiFiの電波だしているので…

とりあえず、このやりとりを含めて総務省技適担当に電話で念の為確認したところ、

明確に「違反状態」です、とコメントいただきました。

というわけで、問い合わせに対する返信として

Image

というお勧め対応を書いて送っておいたのですが、なかなか返事が返ってきません。

メールの返信元は普通のinfoだし、今までもこの返信スタイルでやり取りしてるので届いてると思うんですが…念の為にこれに追記でもっかいお問い合わせフォームから送っておきますかね。

 

 

送信ぽちー