honeylab's blog

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

耳コピ支援ソフト ChordTrackerをごにょごにょする

数年前にリリースされ、一部界隈では非常に便利に使用されている

YAMAHA製のChordTrackerというアプリがあります。

 

jp.yamaha.com

 

このアプリは、手持ちのスマホに入っている音楽を解析し、
簡単にコード譜を作成してくれ、耳コピや弾き語りなどを強力に支援してくれるソフトで、私も大変便利に使用しています。

基本的にはスマホ専用のアプリですが、AndroidエミュレータをPCに入れることで、PC上で使用することもできます。


少し前までは自分でピアノを弾いて楽しむだけだったのですが、最近は
nana」という音楽コラボSNSに伴奏として音源をアップロードしたりしています。

nana-music.com

 

そんな便利なChordTrackerですが、一つだけどうしてもできないことがあります。
作成したコード譜を外部にファイルとして出力できないのです。

ごく一部のYAMAHAの電子楽器などに、データを送出することはできるようなのですが、該当楽器を持っていないため、試すことすらできません。

上の動画のように、コードを見ながら練習をする、という用途では十分なのかもしれませんが、この解析結果をもとに、別の楽譜ソフトにコードを打ち込んでアレンジ用の楽譜を作成したりしたい場合、画面を見ながらちまちま手入力する方法しかありません。

 

これは不便!!!

ということで、どうにかこの解析済みデータを取り出すことに挑戦しました。

まずは、純正の機能の、対応楽器への送信部分を解析してみました。

iOS版では、Blutooth-MIDI経由で楽器と接続する、ということなのでBLE-MIDI変換モジュールを購入して試してみました。

 

quiccosound.com

 

この基板を使用してMIDI出力を見ながら「対応楽器への送信」を選択すると、
SystemExclusiveメッセージ「ID Request」が送出されました。

どうやら、対応機種であるかどうかを確認しているようです。
試しに判明しているYAMAHAの電子楽器のIDをいくつか返してみましたが、接続が確立される様子はありませんでした。

 

対応しているという機器はPSR-SX600、SHS-500、SHS-300のわずか3機種、
また、これらの機種のマニュアルを調べてみたのですが、ID Requestに対するResponseが明確に記載されている部分はありませんでした。

さらに、実行バイナリをあれこれ覗いてみたのですが、機種との接続確立後も、なにやらめんどくさそうなプロトコルで通信していそうなため、あきらめることにしました。

 

さて、次の手段です。
このアプリ、ある曲を一度「解析」を行うためには多少時間がかかりますが、
二回目の読み込みからは解析済みのデータを参照しているようですぐにコードが表示されます。
ということは、端末内にキャッシュファイルが保存されているはずです。

これを探すために、Android端末に接続し、アプリからのデータを保存しているはずの場所を探してみましたが、OSの保護機能のため見ることができませんでした。

そこで、root化を試みます。
手元にroot化できるAndroid端末が無いため、ChordTrackerをインストールしたAndroidエミュレータ「BlueStacks」をroot化します。

その結果、/data/data以下のアプリストレージ領域に、解析済みのjsonファイルを発見しました!!!

サンプルのjsonファイルを一つおいておきます。

 

https://gist.github.com/bakueikozo/239bdab15367ffdc72a16c9acdd9784b

 

これを読んでいくと、こんな記述があります。

            "1": {
                "root": "10",
                "type": "0",
                "onBass": "127",
                "originalRoot": "10",
                "originalType": "0",
                "originalOnBass": "127",
                "accidentalRoot": "0",
                "accidentalOnBass": "0",
                "mahaRoot": "10",
                "mahaType": "0",
                "mahaOnBass": "127"
            },

これは、曲内の第一拍目のコードのルートが、C(ド)を基準とした10半音上、つまり「B♭」であること、typeはコードの形、ここでは(普通の)メジャーコードであることが示されています。

コードの形のIDはYAMAHAシンセサイザーなどで使用している定義順になっているようでした。(音楽理論的に、もしかしたらそれが定義されてるのかもしれませんが、私にはよくわかりませんでした。)

 

 

このようにして、解析済みの画面に表示された内容と、jsonファイルを照らし合わせながら内容を解読していきます。

解読ができたら、これをエクスポートします。
界隈で、楽譜の清書によく使われるオープンソースの「MuseScore」というアプリがあります。

musescore.org

 

このソフトで読み込めるように、ソースコードを解析していくと、どうやら普通のSMFに出力してやるのがよさそうだ、という結論になりました。
ソースコードによると、YAMAHA独自のシステムエクスクルーシブのバイナリデータで、タイムスタンプに対してコード情報を付けられるように読めるのですが、どうにもうまくいきません。

仕方がないので、とりあえずは「歌詞」としてコードネームを入れていきます。

変換プログラムはC#で記述しています。

JSONの読み込みはNewtonsoft.json

blog.hiros-dot.net

SMFファイルの書き出しにはdrywetmidiというライブラリを使用しています。

github.com

 

コード名だけを入れると、突然難しいコードで躓くかもしれませんので、
実際に押さえる音符も入れることにします。

コード名(ID)から和音の生成のために、コード表を見ながらこんなテーブルを作成します。

                    int chordtype_member = {
                          new int{ 0,4,7 },           // Maj
                            new int
{ 0,4,7,9},          // Maj6
                            new int{ 0,4,7,11},
                            new int
{ 0,4,6,7,11 },    // Maj7(#11)
                            new int{ 0,2,4,7,11},       // Maj(9)
                            new int
{ 0,2,4,5,9 },       // Maj7(9)
                            new int{ 0,2,4,7,9},       // Maj6(9)
                            new int
{ 0,4,8 },
                            new int{ 0,3,7},          // min
                            new int
{ 0,3,9},         // min6
                            new int{ 0,3,7,10} ,         // min7
                            new int
{ 0,3,6,10} ,       // min7b5
                            new int{ 0,2,3,7},         // min(9)
                            new int
{ 0,2,3,7,10},         // min7(9)
                            new int{ 0,3,5,7,10},     // min7(11)
                            new int
{ 0,3,7,11},      // minMaj7
                            new int{ 0,2,3,7,11} ,      // minMaj7(9)
                            new int
{ 0,3,6 },
                            new int{ 0,3,6,9 },
                            new int
{ 0,4,7,10},          // 7th
                            new int{ 0,5,7,10},
                            new int
{ 0,4,6,10},
                            new int{ 0,2,4,7,10},          // 7(9)
                            new int
{ 0,4,6,7,10} ,       // 7(#11)
                            new int{ 0,4,7,9,10 } ,
                            new int
{ 0,1,4,7,11},        // 7(b9)
                            new int{ 0,4,7,8,10 },       // 7(b13)
                            new int
{ 0,3,4,7,10},        // 7(#9)
                            new int{ 0,4,8,11},     // Maj7aug
                            new int
{ 0,4,8,10},        // 7aug
                            new int{ 0,8},           // 1+8
                            new int
{ 0,7},          // 1+5
                            new int{ 0,5,7},
                            new int
{ 0,2,7},       // 1+2+5

                    };

 

このようにしてSMFにして出力し、MuseScoreで読み込み、

段数や繰り返し記号などを入れていくと…

 

あっという間にコード譜の出来上がりです。
リズムは1拍基準のため、細かいプレイのアレンジは反映されていませんが、
これをもとに修正していくだけで完成するのは非常に便利です。

何しろ、今までは目で見ながら小節にコードを配置していくことしかできなかったんですから。

ここに、例えばイントロのメロを拾って追加してやる、とかコメントを追加する、と化すれば、あっという間に伴奏用の楽譜が完成します。

 

さて、そんな便利なソフトを作っているわけですが、まだまだ調整中です。
もしもこういうソフトがホントにリリースされたら絶対使う!という声があればリリースは考えますが、今のところ自分で使うぐらいしかないですかねw

 

ここまでの解析のつぶやきのTwitterをここに貼っておきます。

もうちょっと詳しく見たい方はこちらへ。