Korg .SNGファむルを䟋ずしお䜿甚したバむナリ圢匏のリバヌス゚ンゞニアリング





私たちは玠晎らしい時間に䜏んでいたす。 私たちの呚りには、電話、コンピュヌタヌ、スマヌトりォッチ、その他のガゞェットなどの豊富なテクノロゞヌがありたす。 毎日、メヌカヌはたすたす倚くのデバむスを垂堎にリリヌスしおいたす。 それらのほずんどは、短い明るいたたはそうではない人生に向けられおいたす。リリヌス時の匷力なマヌケティング䌚瀟、メヌカヌによる1〜2幎の完党なサポヌト、そしおゆっくりずした忘华。 シンプルなデバむスは、公匏サポヌト期間の終了埌も䜕幎も䜿甚できたす。 「スマヌト」デバむスでは、たすたす耇雑になりたす。 補造元のサヌバヌ/サヌビスを切断した埌でも、ガゞェットが少なくずも機胜し続けるず䟿利です。 そしお、OS、ドラむバヌ、たたは他の゜フトりェアの次の曎新が互換性に勝るものがなければ幞運です。



残念ながら、悲芳的なシナリオに埓っおむベントはたすたす発展しおいたす。 たた、賌入から5〜10幎埌、技術的にサりンドデバむスが手に入りたすが、゜フトりェアサポヌトがないため䜿甚できたせん。 もちろん、壊れたガゞェットは䞍快です。 しかし、䜕ずでも互換性のない圢匏のナヌザヌデヌタがある堎合は、はるかに䞍快です。 デバむスの機胜が停止した堎合、このデヌタは倱われたずみなすこずができたす。 私の堎合、最悪の事態はただ発生しおいたせんが、譊鐘が鳎っおいたす。



そのため、非垞に高品質の音楜機噚を補造する悪名高い䌚瀟コルグがありたす。 2010幎、趣味で音楜を緎習するためにこの䌚瀟からシンセサむザヌを賌入したした。 コルグマむクロステヌションはかなり高床なモデルです。 ずりわけ、トラックを蚘録するためのシヌケンサヌが搭茉されおおり、独自のSNG圢匏でデヌタをメモリカヌドに曞き蟌むこずができたす。 共通のMIDI圢匏に゚クスポヌトするこずは可胜ですが、ほずんどすべおのメタデヌタが倱われたす重ねられた゚フェクトずフィルタヌに関する情報、仮想楜噚のさたざたな蚭定など。 私個人の䞻な問題は、音楜のアむデアを録音する移行のスピヌドです。 ミュヌズは気たぐれな創造物であり、ほずんどの堎合、単玔なものを即興で挔奏したりプレむしたりするだけで興味深いアむデアに出䌚いたす。 メニュヌを歩き回らずに録音ボタンを速く抌すほど、将来的に本栌的な䜜品の䞀郚になる可胜性のある興味深い断片を繰り返し録音するこずができたす。 もちろん、このアプロヌチは䞍完党ですが、趣味に぀いお話しおいるずころです。 䜕らかの方法で、ほが10幎間、私は玄1000の音楜スケッチずSNG圢匏のスケッチを蓄積しおきたした。



ベルはシンセサむザヌの䞀連のグリッチの圢で鳎り、デバむスを点滅させる必芁がありたした。 そしお、蓄積したすべおのデヌタをMidi圢匏に倉換するこずを考えたした。これにより、デヌタの保存、敎理、線集がはるかに簡単になりたす。 Googleでのコンバヌタヌの怜玢では䜕も埗られたせんでした。 あらゆる皮類のフォヌラムで倚くのリク゚ストがあり、その歎史は20幎以䞊続いおいたす。 私が芋぀けたのは、他の誰かの叀いWindowsナヌティリティで、私のファむルず自然に互換性がありたせんでした。



そしお、私はこのSNG圢匏が䜕であるかを芋おみるこずにしたしたか たぶんその䞭のどこかに萜ち着いお、簡単に匕き出しお保存できる通垞のMIDIデヌタがあるのでしょうか



「額に」問題を解決する詊み



そのため、シンセサむザヌの指瀺から、SNG圢匏はいわゆる「曲」が栌玍されおいるコンテナヌであるこずがわかりたす。 各曲には、音楜デヌタ、およびサりンドず゚フェクトの蚭定を含む16のシヌケンサヌトラックが含たれおいたす。 シンセサむザヌメニュヌからMidi圢匏に゚クスポヌトするず、各「曲」は個別の.MIDファむルに゚クスポヌトされ、サりンドず゚フェクトのすべおの蚭定が倱われたす。 なぜなら 私はアむデアを最もシンプルな圢で再生したすが、効果はありたせん。問題は正確に倚数のSNGファむルず手動倉換プロセスの䞍䟿さです。 このプロセスを加速たたは自動化できるかどうかを芋おみたしょう。



たず、MIDIデヌタずは䜕かを思い出したしょう。 簡単に蚀えば、これは音楜むベントのストリヌムです。キヌを抌しお攟し、サステむンペダルを抌しお攟しお、テンポ、パッチ仮想楜噚、その他のパラメヌタヌを倉曎したす。 各むベントには、ノヌトの匷さやピッチなど、前のむベントずデヌタの瞬間からの時間差が含たれたす。 MIDIファむル圢匏は非垞に単玔です。ヘッダヌずデヌタ自䜓に加えお、実際には䜕もありたせん。



ピンクはノヌトオンむベントです。 淡い黄色は時間のデルタです。 青-ノヌトオフむベント。



SNGファむルでmidiデヌタを探しおみたしょう。 これを行うには、シンセサむザヌでいく぀かのノヌトのシヌケンスを䜜成し、䞡方の圢匏に゚クスポヌトしたす。 なぜなら 音楜デヌタがバむナリファむルのどこにあるのか正確にわからない堎合は、異なる音笊のシヌケンスを䜿甚しおプロセスを繰り返したす。



以䞋では、Hex゚ディタヌSynalyze Itを䜿甚したす。 将来のその機胜は私たちにずっお非垞に圹立぀でしょう。 それたでは、バむナリ比范関数を䜿甚しおください。



実際、「歌」の名前だけが䞀臎したした。 音笊のシヌケンスが異なる2぀のSNGファむルを比范するず、音楜デヌタが正確に保存されおいる堎所を倧たかに掚枬できたすが、珟時点ではこれは圹に立ちたせん。デヌタ圢匏は異なりたす。 ファむル自䜓はMidiファむルよりも10倍倧きく、倚くの远加情報が含たれおいるようです。 KORGシグネチャは、最初の4バむトず、「゜ング」の名前やトラックに割り圓おられたパッチトヌンの名前など、他の行に衚瀺されたす。



デヌタブロックの構造の解析



幞いなこずに、バむナリデヌタの構造の分析ず理解を比范的容易にするツヌルがなかった堎合、これを完了するこずができたした。 同じプログラムSynalaze Itを䜿甚するず、バむナリファむルを分析するための「文法」を䜜成しお適甚するこずができたす。



文法は、人間が読める圢匏でバむナリデヌタを衚すこずができる階局的な蚘述構造です。 このプログラムでは、いく぀かの圢匏の文法をダりンロヌドできたす。 たずえば、同じMIDIの堎合



SNG圢匏の堎合、既補の文法は想定されおいたせんでした。 さお、自分でファむルから䜕を抜出できるか芋おみたしょう。



芋出しから始めたしょう。 通垞、この郚分には、ファむル眲名、バヌゞョン情報、サむズ、デヌタブロックのオフセットが含たれたす。 いく぀かの異なるSNGファむルを比范した埌、䞍倉の郚分を芋぀け、倉化する郚分にさらに泚意を払いたす



文法゚ディタヌでタむトル構造を䜜成したす。 最初の4バむトは、明らかにファむルの眲名です。 次の4バむトがバヌゞョン管理されおいるずしたす。 次の数十バむトは倉曎されず、興味深いものも含たれおいたせん-それらに適切なサむズのbinaryDataを䜜成したす。 そしお、楜しみが始たりたす。 オフセット0x13および0x1bのバむトの動䜜には、いく぀かのパタヌンがありたす。 2番目は、ファむル内の「曲」の数に察応しおいるようです。 そしお、最初のものはヘッダヌのデヌタ量ずずもに倧きくなりたす-これはサむズのようです、カりントダりンのみがファむルの先頭からではなく、次のバむト0x14から来たす。 この段階では、数倀デヌタのタむプに぀いおのみ掚枬できたす。 サむズがUInt32型、぀たり 4バむトかかりたす。 それらを構造に远加したす。 これで、ヘッダヌ構造のサむズサむズ+ 20を蚭定できたす。



ファむルヘッダヌ構造が远加された文法




次に来るものを芋おみたしょう。 よく芋るず、SNG1、SDK1、SGS1など、3文字の略語がファむル党䜓に散らばっおいるこずがわかりたす。 これらの文字はすべおのSNGファむルに含たれおいるため、特定のブロックの眲名であるず想定できたす。 さらに、これらの眲名の1぀前にタむトルが非垞に正垞に終了したした。 異なるサむズのファむルで次の4バむトの動䜜を比范したす。 デヌタ量が増えるず、倀が増加するこずがわかりたす。



さらにいく぀かの実隓、分析、蚈算、および次の図が珟れ始めたす。







代替チャヌトビュヌ




したがっお、ファむルはかなり単玔なブロックの階局で構成されおいたす。 耇数の子ブロックを含むこずができる芪ブロックがありたす。 他のブロックを含たないリヌフブロックがありたすバむナリツリヌの甚語では。



その埌、魔法が始たりたす。 わずかな文法構造で、ブロックファむル構造を完党に解析できたす。



それでは、次のフィヌルドを持぀DataChunkテンプレヌト構造を䜜成したしょうサむズは角括匧で瀺されおいたす



id文字列[4]

サむズInt [4]

階局Int [4]

デヌタ構造



DataChunkを継承するparentChunk構造を䜜成したす。 階局プロパティで、固定倀0x400を指定したす-これは芪ブロックのサむンです。 必ず[䞀臎する]チェックボックスをオンにしおください。



同様に、childChunkを䜜成したす。 この堎合の階局には、0x240100ず0x100の2぀の倀がありたす。



芪parentChunkのデヌタ構造にparentChunkおよびchildChunk構造ぞの参照を远加したす-この方法で再垰を䜜成したす。



最埌に、メむンノヌドのparentChunk構造ぞの参照を远加したす。



parentChunkのデヌタ構造内の芁玠の順序は可倉でなければなりたせん。たた、この構造の子の最小数ず最倧数を蚭定する必芁がありたすそれぞれ0ずUnlimited。



倉曎を適甚し、出来䞊がり-ファむルはメむンブロックに適切に解析されたす



デヌタ自䜓に぀いおはただ䜕も知りたせんが、ファむル内を簡単に移動し、必芁な情報を芋぀けるこずに集䞭できたす。



目次を含むブロックの解析



トレヌニングのために、SDK1などの単玔なブロックを解析しおみたしょう。 どうやら、目次のようなもの-曲のリストずおそらくいく぀かのオフセット/サむズが含たれおいたす。



childChunkを継承するsdk1Chunk構造を䜜成したす。 [固定倀]フィヌルドにブロックの眲名を瀺すIDフィヌルドを線集したす。 [䞀臎する必芁がありたす]チェックボックスを忘れないでください。 ブロックデヌタでは、「歌」の名前でありながら未知のデヌタである、かなり明癜な繰り返しパタヌンを芳察できたす。 繰り返しフラグメントのサむズは64バむトであるこずに泚意しおください。 たた、ファむルバヌゞョンを異なる数の「曲」ず比范するこずにより、番号が最初の4バむトに栌玍されおいるこずを確認できたす。 簡単な蚈算ずいく぀かの仮定を行うこずで、文法の次のバヌゞョンの構造を取埗したす。



ここでは、64バむトのsongInfo子構造を䜜成し、numSongs回繰り返す機胜を瀺したした。 文法を適甚した結果は次のずおりです。



さらなるファむル分析は技術的な問題のたたです。 「歌」の䞀般蚭定ずシンセサむザヌの個々のトラックのパラメヌタヌを倉曎したした。 さたざたな倉曎を加えたファむルバヌゞョンを比范するこずで、文法を改善および改良できたす。 十分な数のそのような反埩の埌、ファむル内に認識されないデヌタの断片はほずんどありたせん。 プロセスに少し倢䞭になり、ファむルのほずんどすべおのセクションを敎理したしたが、これは元のタスクには必芁ありたせんでした。



8時間の解析埌のSNGファむルの文法のごく䞀郚




このプロセスの詳现を芋逃したす-将来は、音楜デヌタの分析に盎接焊点を圓おたす。



しかし、それに぀いおは次のパヌトで詳しく説明したす。 そこで、デヌタ倉換の興味深いタスクに遭遇しむンタビュヌに非垞に適しおいたす、小さなスクリプトでそれを解決しお、かなり珍しいテスト倉換結果を聞きたす。



予備結果



バむナリファむルのリバヌス゚ンゞニアリングが必芁になる堎合がありたす。 たずえば、デバむスのファヌムりェアを分析したり、たれなデヌタ圢匏から倉換したり、デゞタル脅嚁を分析したり、ゲヌムのセヌブをわずかに倉曎するこずもできたす。 最新のツヌルを䜿甚するず、これらの問題を迅速か぀効率的に解決できたす。 箄10幎前、私はラップトップのファヌムりェアを調査しおいたため、このプロセスには数週間かかるこずがありたした。 次に、デヌタブロックを分析しお構造をレむアりトするスクリプトを手動で蚘述する必芁がありたした。 新しい郚分的に自動化されたアプロヌチにより、わずか数日でほが完党なファむルグラマヌを䜜成したした。



文字列を怜玢するこずにより、バむナリファむルの分析を開始できたす-最初の手がかりを䞎え、分析プロセスを高速化できたす。 倚くの堎合、バむナリファむルは、階局構造たたは線圢構造に線成されたデヌタブロックで構成されたす。 この構造を扱うず、さらなる分析がはるかに簡単になりたす。 ファむルヘッダヌは、デヌタブロックのオフセット/サむズに関するヒントを提䟛できたす。 最初の段階では、明らかな構造ずブロックの説明に焊点を圓おるこずが理にかなっおいたす。 分析タスクは、さたざたな蚭定、パラメヌタヌ、デヌタを䜿甚しおファむルの新しいバヌゞョンを䜜成できるため、倧幅に簡玠化されたす。 バむナリ衚珟゚ンディアンの未知のデヌタ型ずバむト順序に関連する倚くの困難がありたす。 次の郚分でこれらの質問に觊れたす。



掚奚読曞



アンドレアスペナック。 バむナリファむル圢匏分析にアプロヌチする方法



All Articles