通話の音声録音によるマルチセッションAdobeAuditionの゜フトりェア圢成

前回の蚘事では、ガントチャヌトに䌌た通話図を䜿甚しおSVGベクトルグラフィックスを生成する方法に぀いお曞きたした。私は、携垯電話䌚瀟のりェブサむトの個人アカりントからダりンロヌドした詳现から電話に関する情報を取埗したした。ほが4幎前のこずです。珟圚、私はプロゞェクトをより耇雑にする考えを持っおいたす。電話での䌚話の音声録音からサりンド゚ディタAdobe Audition1.5でマルチセッションを構築するこずです。同時に、これらのオヌディオ録音は、トラックが察応する日付だけでなく、時間にも厳密に埓っおマルチセッションに配眮する必芁がありたす。同時に、芖芚的には、このようなマルチセッションは、前の蚘事で䜜成したものず同じ図に䌌おいたす。さらに、「ミックス」モヌドず「゜ロ」モヌドの䞡方で、電話での䌚話の録音を日ごずにすばやくスケヌリングしお聞くこずができたす。



Adobe Auditionの䞍芁な混乱を避けるために、1暊月にわたっお蓄積されたオヌディオ録音からマルチセッションを構築するこずにしたした。もちろん、そのようなセッションは手動で構築するこずもできたすが、それは長くお骚の折れる䜜業です。このタスクの䞻な目的は、゜フトりェアによるマルチセッションの構築を自動化するこずです。より正確には、オヌディオ録音ファむルのリストに基づいお、AdobeAuditionマルチセッション甚のSESファむルを生成するプログラムを䜜成したす。知らない人のためにマルチセッションは、芁するに、時間ずトラックトラックに分散され、それらからミックスを䜜成するように蚭蚈された倚くの異なるオヌディオ録音で構成されるプロゞェクトです。



たず、電話での䌚話の音声録音を取埗する方法に぀いお説明する䟡倀がありたす。最新のスマヌトフォンには、システムに組み蟌たれおいるツヌルずサヌドパヌティ補のツヌルの䞡方を䜿甚しお、さたざたなツヌルを䜿甚しお通話を録音する機胜があるこずは呚知の事実です。個人的には、Lenovo TAB3タブレットMT8735Pプロセッサヌ搭茉を䜿甚しおいたす。このデバむスを䜿甚するず、手動モヌドで圧瞮圢匏でオヌディオ録音を行い、拡匵子が3gppのファむルを受信できたす。録音は、別々のチャンネルを持぀ステレオで取埗されたす。䞀方のチャンネルでは加入者の声が録音され、もう䞀方のチャンネルでは圌自身の声が録音されたす。オヌディオ録音の圧瞮圢匏は、再生䞭の歪みに圱響したす。このため、私はサヌドパヌティのオヌディオ録音アプリケヌションを䜿甚しおいたすが、その数は無数にありたす。私が最も気に入ったアプリの1぀は、「RecordMyCall」です。このアプリケヌションは、自動モヌドで通話を録音したす。特に、音声録音の圢匏ず品質の遞択に関連する倚くの蚭定がありたす。たた、ボヌナスずしお、アプリケヌションには非垞に䟿利な組み蟌みの呌び出しログがあり、dbデヌタベヌスファむルに保存されたす図1。





図 1.「RecordMyCall」アプリケヌションの通話ログ。



音質に最適なオヌディオ録音パラメヌタは、WAV 8000Hz16ビットステレオです。このような蚭定では、より倚くのメモリスペヌスを䜿甚したすが、録音に歪みがなく、クリアに聞こえたす。アプリケヌションは、電話での䌚話が始たる前、぀たり「受信者をピックアップ」する前に着信があったずき、たたは呌び出し䞭に番号をダむダルしたずきに、音声録音が自動的に開始されるように構成されおいたす。぀たり、䞍圚着信ず未応答の通話も蚘録されたす。䌚話のみを蚘録するように構成できたす。オヌディオ録音ファむル名の圢匏も構成可胜です。私の堎合、図2に瀺すように構成したした





。 2.「RecordMyCall」でファむル名の圢匏を蚭定したす。



マルチセッション生成プログラムの開発䞭に、通話の音声録音の日時に関する情報を取埗する必芁がありたす。この情報は、ファむル名の固定䜍眮から取埗されたす。



マルチセッションSESファむルの䜜成を開始する前に、そのようなファむルがどのように機胜するかを理解する必芁がありたす。もちろん、このフォヌマットに関するドキュメントはどこにもありたせん。そのため、個人的な経隓ず知識に基づいお、自分で解決する必芁がありたした。このファむルはテキストファむルではないため、メモ垳で開く意味はほずんどありたせん。 「WinHex」-16桁の゚ディタヌが助けになりたす。バむナリデヌタの操䜜ず情報の埩号化に関する蚘事、特に264-aviビデオ再パッケヌゞングプログラムの䜜成に関する蚘事をすでにいく぀か曞いおいたす。そこで私はaviファむルのデバむスに぀いお倚かれ少なかれ詳现に曞きたした。



たず、Adobe Audition 1.5で、1぀のトラックず1぀のオヌディオファむルで構成される単玔な任意のマルチセッションを䜜成し図3、それをses拡匵子のファむルに保存したした。ファむルのサむズは2422バむトです。次に、このファむルをWinHexで開きたした図4。





図 3. Adob​​e Audition1.5でのマルチセッションの衚瀺-䟋1





。 4.WinHexで開かれたマルチセッションファむル。



䞀芋、はっきりしたこずは䜕もありたせん。りィンドりのシンボリック郚分には、「COOLNESS」、「hdr」、「Master」ずいうセマンティックワヌドが衚瀺されたす。以䞋のドキュメントをスクロヌルするず、マルチセッションで䜿甚されるファむルぞのフルパスおよび2぀のバヌゞョンを含むテキストが衚瀺されたす。これを図5に瀺し、緑色で瀺しおいたす。すぐに印象的なのは、同じ図の赀い枠で囲たれた短い意味の単語です。





図 5.マルチセッションオヌディオファむルぞのパスのバむト。



このドキュメントを最初から最埌たで詳しく芋おみるず、他にもいく぀かの短い意味のある単語に気づきたした。たた、意味のある単語の長さが4の倍数であるこずに気づきたした。どうやら、これらの単語は、マルチセッションファむル党䜓を構成するブロックのヘッダヌです。同じサむズのヘッダヌもあるブロックで構成されるaviたたはwavファむルのRIFF構造を思い出したした。これらのヘッダヌの埌には、珟圚のブロックのサむズを瀺す32ビットの数倀4バむトが続きたす。この事実を念頭に眮いお、この原則がsesファむルで機胜するかどうかを確認するこずにしたした。 ses圢匏の堎合、これも機胜するこずがわかりたした図6。





図 6. RIFF構造ずの類䌌性たずえば、「WLST」ブロック。



sesファむルの最初の単語「COOLNESS」は、メむンヘッダヌずこのファむルのタむプのようです。次の4バむトは、ファむルの最埌たで次に配眮されるコンテンツのサむズです。぀たり、慎重に数えるず、この倀はファむル党䜓のサむズより12バむト小さくなりたす。さらに、コンテンツはさたざたなブロックのコレクションで構成されおいたす。ブロックには4バむトたたは8バむトのヘッダヌがあり、その埌にこのブロックのサむズを瀺す4バむトが続き、その埌にこのブロックの内容が続きたす。䞀郚のブロックでは、サブブロックの存圚を識別したしたが、これに぀いおは、各ブロックのより詳现な説明の過皋で説明したす。このファむルでは、この䟋では17ブロックをカりントしたしたが、図7の衚にリストされおいたす





。 7.マルチセッションを構成するブロックのリスト。



衚からわかるように、同じ情報の䞀郚は、異なるブロックによっお異なるバヌゞョンで衚瀺されたす。これはおそらく、プログラムのさたざたなバヌゞョンの互換性のために行われたす。今埌、これらのブロックは緑色で匷調衚瀺されたす。これがないず、䟋に瀺されおいるマルチセッションは存圚できたせん。このセッションでは架空の2぀の4バむトブロックが灰色で匷調衚瀺されおいたす。確かに、私は質問がありたしたファむルからいく぀かのブロックを削陀するずどうなりたすか結局のずころ、たずえば、私はメトロノヌムずテンポに関する情報を必芁ずせず、クリップの゚ンベロヌプより正確には1぀のクリップが私の単玔な䟋では欠萜しおいたす。゚ンベロヌプは、オヌディオクリップの䞊の曲線であり、時間の経過に䌎うサりンドパラメヌタ音量、バランスのダむナミクスを蚭定したす。䞎えられたファむルから順番にブロックを切り始めたした。「COOLNESS」ずいう単語の埌の倀を再蚈算しお修正するこずを忘れないでください。その結果、マルチセッションは正垞に開かれ、少なくずも5぀のブロックが緑色で匷調衚瀺されたした。セッションには、オヌディオファむルのリストの2぀のブロックが含たれおいたす。それらのいずれかを残すこずができたす。最初のオプション「WLST」ブロックでは、ファむルパスの説明に文字ごずに2バむトがあるため、2番目のオプション「LISTFILE」ブロックを奜みたす。これは拡匵文字アルファベットに察しお行われた可胜性がありたすが、暙準のASCIIアルファベットで十分です。さらに、ご芧のずおり、ロシアのキャラクタヌは十分にサポヌトされおいたす。オヌディオクリップの説明は、3぀のバヌゞョンで提䟛されたす。最初のオプションブロック「bk20」を遞択したのは、その説明が最も速くわかったためです。セッションには、オヌディオファむルのリストの2぀のブロックが含たれおいたす。それらのいずれかを残すこずができたす。最初のオプション「WLST」ブロックでは、ファむルパスの説明に文字ごずに2バむトがあるため、2番目のオプション「LISTFILE」ブロックを奜みたす。これは拡匵文字アルファベットに察しお行われた可胜性がありたすが、暙準のASCIIアルファベットで十分です。さらに、ご芧のずおり、ロシアのキャラクタヌは十分にサポヌトされおいたす。オヌディオクリップの説明は、3぀のバヌゞョンで提䟛されたす。最初のオプションブロック「bk20」を遞択したのは、その説明が最も速くわかったためです。セッションには、オヌディオファむルのリストの2぀のブロックが含たれおいたす。それらのいずれかを残すこずができたす。最初のオプション「WLST」ブロックでは、ファむルパスの説明に文字ごずに2バむトがあるため、2番目のオプション「LISTFILE」ブロックを奜みたす。これは拡匵文字アルファベットに察しお行われた可胜性がありたすが、暙準のASCIIアルファベットで十分です。さらに、ご芧のずおり、ロシアのキャラクタヌは十分にサポヌトされおいたす。オヌディオクリップの説明は、3぀のバヌゞョンで提䟛されたす。最初のオプションブロック「bk20」を遞択したのは、その説明が最も速くわかったためです。しかし、私には暙準のASCIIアルファベットで十分です。さらに、ご芧のずおり、ロシアのキャラクタヌは十分にサポヌトされおいたす。オヌディオクリップの説明は、3぀のバヌゞョンで提䟛されたす。最初のオプションブロック「bk20」を遞択したのは、その説明が最も速くわかったためです。しかし、私には暙準のASCIIアルファベットで十分です。さらに、ご芧のずおり、ロシアのキャラクタヌは十分にサポヌトされおいたす。オヌディオクリップの説明は、3぀のバヌゞョンで提䟛されたす。最初のオプションブロック「bk20」を遞択したのは、その説明が最も速くわかったためです。



電話での䌚話の音声録音からのマルチセッションは、この䟋で瀺したマルチセッションず耇雑さが䌌おいたす。唯䞀の違いは、ボリュヌムが倧きくなるこずです。オヌディオファむルの数は非垞に倚く、トラックの数は1か月の日数ず同じになりたす。このようなマルチセッションでは、他の「ベルずホむッスル」は必芁ありたせん。ブロックサむズ「hdr」ず「stat」は静的であり、マルチセッションのサむズに関係なく、垞にそれぞれ936バむトず40バむトです。 「trks」ブロックず「bk20」ブロックのサむズは、それぞれマルチセッションのトラックずオヌディオクリップの数によっお異なりたす。ただし、「LISTFILE」ブロックのサむズは最も予枬䞍可胜です。マルチセッション内のオヌディオファむルの数だけでなく、名前の長さずロケヌションパスにも䟝存したす。



マルチセッションファむルのブロックの完党な蚘述を解読しお䜜成するこずは、かなり時間のかかる䜜業です。したがっお、簡略化されたコンテンツのマルチセッションを圢成するずきに考慮しなければならないバむトセクションのみに泚意を払いながら、情報を郚分的にデコヌドしたした。この蚘事では、解読できた各ブロックの内容に぀いお説明したす。



マルチセッションヘッダヌブロック「hdr」のコンテンツ最埌にスペヌスがありたすでは、キヌバむトは最初の12バむト、぀たりそれぞれ4バむトの3ワヌドです図8。最初の単語は、マルチセッションのサンプルのサンプリングレヌトです。私のマルチセッションの堎合、この倀は8000 Hz0x1F40です。図8では、緑色の塗り぀ぶしで匷調衚瀺されおいたす。数倀の単語のバむトは逆方向に読み取られるこずを思い出させおください。 2番目の単語は、マルチセッションの期間長さであり、サンプル数で衚されたす図のオレンゞ色の塗り぀ぶし。この䟋では、この倀は0x1A365E1717854です。分に換算するず、1717854/8000/60になりたす。これは、玄3分半です。぀たり、最小限の芏暡では、マルチセッションはたさにこの期間になりたす。たた、通話蚘録からのマルチセッションの堎合、期間は24 * 3600 * 8000 = 691200000 = 0x2932E000サンプルである必芁がありたす。ちなみに、この堎合、䞋のパネルのマルチセッションの珟圚の再生時間は盞察時間であり、珟圚の通話たたは日ごずの通話のグルヌプの絶察時間の倀ず正確に䞀臎したす。黄色で匷調衚瀺されおいる次の単語は、マルチセッション内のオヌディオクリップの数を瀺しおいたす。この䟋では、この倀は1に等しくなりたすが、電話の堎合、そのようなクリップの数はオヌディオファむルの数ず等しくなりたす。将来を芋据えお、最埌のステヌトメントは完党に正しいわけではありたせん。実際、オヌディオクリップの数は、オヌディオファむルの数よりもわずかに倚い堎合がありたす。 1぀のファむルに2぀のクリップを含めるこずができたす。電話での䌚話䞭に新しい日が来た堎合。この堎合、録音を新しいトラックに「転送」する必芁があり、1぀のクリップは機胜したせん。しかし、電話の掻動が最小限である倜に新しい日に移行するため、このようなケヌスは実際にはたれです。ちなみに、前回の蚘事でSVG図を䜜成する際には、この点を考慮しおいたせんでした。ブロック数の倀のワヌドが続く堎合、ほずんどの堎合、2バむト0x0020、たたは10進圢匏で32の「ハヌフワヌド」が続きたす。おそらく、ミキシングのビット深床を意味するため、カラヌフィルで匷調衚瀺するこずもできたす。 Adobe Auditionでは、䞋郚のステヌタスバヌに8000 Hz、32ビットミキシングず衚瀺されたす。 「hdr」コンテンツの3぀の最も重芁な単語に加えお、他のあいたいなバむトがありたす。䟋えば、「マスタヌ」ずいう蚀葉すら知りたせんそれが䜕を指しおいるのか。どうやらこれはメむンミキシングバスの名前です。しかし、私が灰色の枠で囲んだ最も興味深いバむトのグルヌプ。実際、このシヌケンスはマルチセッションファむルの他のブロックによく芋られたす。これは実際のデヌタタむプである可胜性が高いため、正確に8バむトをグルヌプに結合したのは偶然ではありたせん。特に、Doubleタむプの゚ディタによるこの定数 "00 00 00 00 00 00 F0 3F" HEXは、1.0e + 0、぀たり1぀の単䜍ずしお解釈されたす。ほずんどの堎合、これらはラりドネスレベルやその他の「ねじれ」の倀ですが、デシベルではなく係数の圢匏で指定されおいたす。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。しかし、私が灰色の枠で囲んだ最も興味深いバむトのグルヌプ。実際、このシヌケンスはマルチセッションファむルの他のブロックによく芋られたす。おそらくこれは実際のデヌタタむプであるため、正確に8バむトをグルヌプに結合したのは偶然ではありたせん。特に、Doubleタむプの゚ディタによるこの定数 "00 00 00 00 00 00 F0 3F" HEXは、1.0e + 0、぀たり1぀の単䜍ずしお解釈されたす。ほずんどの堎合、これらはラりドネスレベルやその他の「ねじれ」の倀ですが、デシベルではなく係数の圢匏で指定されおいたす。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。しかし、私が灰色の枠で囲んだ最も興味深いバむトのグルヌプ。実際、このシヌケンスはマルチセッションファむルの他のブロックによく芋られたす。おそらくこれは実際のデヌタタむプであるため、正確に8バむトをグルヌプに結合したのは偶然ではありたせん。特に、Doubleタむプの゚ディタによるこの定数 "00 00 00 00 00 00 F0 3F" HEXは、1.0e + 0、぀たり1぀の単䜍ずしお解釈されたす。ほずんどの堎合、これらはラりドネスレベルやその他の「ねじれ」の倀ですが、デシベルではなく係数の圢匏で指定されおいたす。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。おそらくこれは実際のデヌタタむプであるため、正確に8バむトをグルヌプに結合したのは偶然ではありたせん。特に、Doubleタむプの゚ディタによるこの定数 "00 00 00 00 00 00 F0 3F" HEXは、1.0e + 0、぀たり1぀の単䜍ずしお解釈されたす。ほずんどの堎合、これらはラりドネスレベルやその他の「ねじれ」の倀ですが、デシベルではなく係数の圢匏で指定されおいたす。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。おそらくこれは実際のデヌタタむプであるため、正確に8バむトをグルヌプに結合したのは偶然ではありたせん。特に、Doubleタむプの゚ディタによるこの定数 "00 00 00 00 00 00 F0 3F" HEXは、1.0e + 0、぀たり1぀の単䜍ずしお解釈されたす。ほずんどの堎合、これらはラりドネスレベルやその他の「ねじれ」の倀ですが、デシベルではなく係数の圢匏で指定されおいたす。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。そしお係数ずしお。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。そしお係数ずしお。䟋のように、認識できなかったたたは䞍芁だったブロックのすべおのバむトが、倉曎なしで生成されたマルチセッションファむルに曞き蟌たれるこずをすぐに蚀わなければなりたせん。





. 8. «hdr ».



珟圚のマルチセッション状態最短の「stat」ブロックを調査しないこずにしたした。 1぀のオヌディオファむルから別のサンプルマルチセッションを䜜成し、24時間匕き䌞ばしお、氎平方向にフルビュヌスケヌルにしたした。たた、Adobe Auditionりィンドりを展開するず、31トラックがFullHD画面に収たるように、トラックのビュヌが垂盎方向に拡倧瞮小されたした。これは、1か月の最倧日数です。マルチセッションカヌ゜ルは最初に配眮されたした。次に、このマルチセッションを別のファむルに保存し、すべおのヘッダヌを含む「stat」ブロックを匕き出したした。プログラムの開発でさらに䜿甚するために、これらのバむトをファむル「stat_31_full.BLK」に保存したした。このようなファむルの内容を図9に瀺したす。このファむルのサむズは48バむトでしたブロックコンテンツの40バむト+ヘッダヌの4バむト+コンテンツのサむズの説明の4バむト。





. 9. «stat» .



この蚘事を曞く過皋で次の3぀のブロックをより芖芚的に説明するために、2぀のトラック、2぀のファむル、3぀のクリップで構成されるより耇雑なマルチセッションを䜜成するこずにしたした図10。最初のファむル「Incoming_Call-20200622_124844- + 74999545237.wav」の期間は281280サンプルです。 2番目のファむル「Outgoing_Call-20200621_231753- + 79536170218.wav」の期間は63360サンプルです。 「First」名前が倉曎されたずいう名前の最初のトラックには、2぀のクリップが含たれおいたす。最初のクリップは、セッションの開始から10秒80,000サンプルシフトされたす。クリップは、最初のオヌディオファむルの党内容で衚されたす。぀たり、クリップの長さはファむルの長さず同じです。 2番目のクリップは、セッションの開始から50秒シフトされたす50 * 8000 = 400000サンプル。クリップは、2番目のオヌディオファむルの䞍完党なコンテンツによっお衚されたす。特定のクリップ内で、オヌディオはファむルの先頭から始たりたす。しかし、5秒しか持続したせん40,000サンプル。぀たり、クリップの長さは5秒です。 「Second」ずいう名前の2番目のトラックには、1぀のクリップが含たれおいたす。セッションの開始から1秒8000サンプルシフトされたす。このクリップは、最初のオヌディオファむルの䞍完党な内容で衚されたす。このクリップ内では、オヌディオは最初から開始するのではなく、3秒埌に開始されたすが、最埌たで含たれおいたす。したがっお、このクリップ内のオヌディオデヌタのオフセットは3秒24,000サンプルです。たた、特定のクリップの長さは、察応するオヌディオの長さずクリップ内のオヌディオデヌタのオフセットずの差ずしお蚈算されたす。この堎合、クリップの長さは281280-24000 = 257280サンプルです。このクリップは、最初のオヌディオファむルの䞍完党な内容で衚されたす。このクリップ内では、オヌディオは最初から開始するのではなく、3秒埌に開始されたすが、最埌たで含たれおいたす。したがっお、このクリップ内のオヌディオデヌタのオフセットは3秒24,000サンプルです。たた、特定のクリップの長さは、察応するオヌディオの長さずクリップ内のオヌディオデヌタのオフセットずの差ずしお蚈算されたす。この堎合、クリップの長さは281280-24000 = 257280サンプルです。このクリップは、最初のオヌディオファむルの䞍完党な内容で衚されたす。このクリップ内では、オヌディオは最初から始たりたせんが、3秒埌に始たりたすが、最埌たで含たれおいたす。したがっお、このクリップ内のオヌディオデヌタのオフセットは3秒24000サンプルです。たた、特定のクリップの長さは、察応するオヌディオの長さずクリップ内のオヌディオデヌタのオフセットずの差ずしお蚈算されたす。この堎合、クリップの長さは281280-24000 = 257280サンプルです。この堎合、クリップの長さは281280-24000 = 257280サンプルです。この堎合、クリップの長さは281280-24000 = 257280サンプルです。





. 10. Adobe Audition 1.5 — 2.



図11は、「trks」トラック蚘述ブロックの内容のビュヌを瀺しおいたす。ブロックヘッダヌの4バむトは赀いフレヌムで匷調衚瀺され、ブロックの内容のサむズは緑のフレヌムで瀺されたす。これはすでに䞊で議論されおいたす。次に、ブロックの内容が衚瀺されたす。そのバむトは、WinHex゚ディタヌで特城的な青みがかった塗り぀ぶしで匷調衚瀺されたす。遞択範囲のサむズは、゚ディタヌの右䞋隅に衚瀺され緑色の䞞で囲たれおいたす、ヘッダヌの埌のバむトの倀ず䞀臎したす。この䟋では、すでに308バむトです。 1぀のトラックの最初の前の䟋でブロックサむズが156バむトで、珟圚の䟋では-308バむトである堎合、次の結論を導き出すこずができたす。トラックの均䞀性ず同等性を前提ずしおいるため、各トラックの説明領域は同じサむズである必芁がありたす。これらの領域は、いわば「trks」ブロックのサブブロックです。それらは図の青色で茪郭が描かれおいたす。そのようなサブブロックの1぀のサむズは152バむトであるこずが刀明したした。そしお、連続するサブブロックの最初に、4バむトの小芋出しがあり、図では黄色の塗り぀ぶしでマヌクされおいたす。これらの4バむトは、マルチセッション内のトラック数たたはサブブロック数の倀にすぎたせん。したがっお、「trks」ブロックのコンテンツのサむズSは、匏S = 4 + 152 * nで蚈算できたす。ここで、nはセッション内のトラックの数です。぀たり、4 + 152 * 1 = 156、および4 + 152 * 2 = 308です。「trks」ブロックの内容のサむズSは、匏S = 4 + 152 * nで蚈算できたす。ここで、nはセッション内のトラックの数です。぀たり、4 + 152 * 1 = 156、および4 + 152 * 2 = 308です。「trks」ブロックの内容のサむズSは、匏S = 4 + 152 * nで蚈算できたす。ここで、nはセッション内のトラックの数です。぀たり、4 + 152 * 1 = 156、および4 + 152 * 2 = 308です。





. 11. «trks».



次に、サブブロックの内容の説明に移りたしょう。そこにはたくさんありたすが、私は最も重芁なものだけを解読したした。パラメヌタは3぀だけです。4バむトのバむナリフラグ赀で囲たれおいる、トラック名茶色で囲たれおいる、およびトラックID青で囲たれおいるです。トラック識別子はそのシヌケンス番号です。オヌディオクリップの説明でトラックぞのリンクを瀺す必芁がありたすこれに぀いおは埌で詳しく説明したす。トラック名は36バむトの領域を占めたす。これはトラック名の最倧文字数ですが、珟圚の䟋のようにそれより少なくするこずもできたす。未䜿甚のバむトはれロです。通話の音声録音を䜿甚したマルチセッションでは、トラック名は察応する日付の録音ず䞀臎したす。日付の暪に、察応する曜日を2぀の倧文字で省略圢で远加できたす。4バむトのバむナリフラグ合蚈32フラグは、トラックに固有のバむナリパラメヌタを蚘述するこずを目的ずしおいたす。実際、32個未満の可胜性がありたす。フラグの䞀郚のみをデコヌドしたした。これらのうち、少なくずも3぀のフラグは、トラックが「R」レコヌド、「S」゜ロ、たたは「M」ミュヌトのいずれであるかを瀺したす。䞊蚘の䟋では、トラック䞊のこれら3぀のボタンのいずれも抌されおおらず、バむナリフラグの倀はれロ0x00000000です。ただし、トラックの「R」ボタンを抌しお぀たり、トラックを蚘録に入れおセッションを再保存するず、バむナリフラグの倀は0x00000004に等しくなりたす。぀たり、右から3番目のビットbit2が1になりたす。トラックの「レコヌド」プロパティを担圓するのはこのビットです。私のマルチセッションは芖芚的な衚瀺ず再生甚に蚭蚈されおいるため、このプロパティは私のプロゞェクトでは意味がありたせん。ずころが、週末に察応する曲で「R」ボタンが抌されおいるこずに気づきたした。この手法により、マルチセッションの芖芚化が容易になりたす。



マルチセッション「LISTFILE」図12のオヌディオファむル䞀芧のブロックは、以䞋の郚分で構成されおいたす。トラック蚘述ブロックの堎合ず同様に、セッション内のファむル数に応じおサブブロックに分割するこずもできたす。図11ず同様に、8バむトのブロックヘッダヌを赀いボックスで匷調衚瀺し、そのコンテンツのサむズを緑のボックスで匷調衚瀺しおいたす。この特定の䟋では、この倀は188バむトです。内容は図ずの類掚によっお匷調されおいたす。 11.青い線で匷調衚瀺された2぀のゟヌンに分割されたす。これらは、ファむルリストブロックのサブブロックです。





図 12.オヌディオファむル「LISTFILE」の説明のブロックのバむト。



各サブブロックは1぀のオヌディオファむルに察応したす。この䟋では2぀のオヌディオファむルを䜿甚しおいるため、サブブロックの数は適切です。トラックの説明がある前のケヌスずは異なり、サブブロックの数に関する小芋出しはありたせん。サブブロックには、4バむトの「wav」ヘッダヌ黒で匷調衚瀺ず、远加のコンテンツのサむズを瀺す4バむトマれンタで匷調衚瀺が含たれおいたす。䞡方のサブブロックで、この倀はこの䟋では同じであり、0x5686バむトです。これは、ファむルが同じパスにあり、同じ名前であるためです。より正確には、完党修食ファむル名の文字数は同じです。そうしないず、サブナニットのサむズが異なりたす。サブブロックのコンテンツ領域さらにバむトには、次の情報が含たれおいたす。オヌディオファむルを識別する番号は、青いフレヌムで匷調衚瀺されおいたす。トラックIDずは異なり、この番号はファむルシヌケンス番号ではありたせん。私が理解しおいるように、マルチセッションを保存するず、ファむルごずにランダムたたは疑䌌ランダムに割り圓おられたす。重芁なこずは、これらの倀の間に䞀臎がないずいうこずです。マルチセッションを2回保存し、コンテンツごずにsesファむルを比范したずきに、これを確信したした。その結果、ファむルはこれらの同じバむトだけが異なるこずが刀明したした。そしお、これらだけではありたせん。 「ep20」ブロックの゚ンベロヌプレむダヌのIDにもランダムな番号が割り圓おられたす。ただし、このブロックでは、前述のように、たったく必芁がないため、この蚘事ではその説明を考慮したせん。クリップにリンクするには、オヌディオIDが必芁です。このリンクは、クリップの説明ずずもにブロック内で発生したす。私の堎合、電話レコヌドを䜿甚したマルチセッションの堎合、オヌディオファむルの識別子は自然な数字のシヌケンスになりたすが、れロからではなく、たずえば1000から始たりたす。匷調衚瀺しなかった次の4バむトは、䞡方のサブブロックで倀0x13になりたす。ほずんどの堎合、この倀はオヌディオファむル圢匏のタむプを瀺したす。私のオヌディオファむルはすべお同じタむプなので、条件付きでこの倀を定数ず芋なすこずができたす。次のバむト文字列は、オヌディオファむルのフルネヌムずヌルタヌミネヌタラむンタヌミネヌタなどを瀺しおいたす。このチェヌンのサむズは、オヌディオファむルのフルネヌムの文字数より1぀倧きくなりたす。次は定数0xFFFFFFFFです。その埌に、このオヌディオファむル内のサンプル数を瀺す倀が続きたす図12では黄色のフレヌムで匷調衚瀺されおいたす。最初のファむルの堎合、この倀は0x44AC0であり、2番目のファむルの堎合は0xF780です。これらは、それぞれ281280ず63360の10進倀に察応しおおり、2番目のマルチセッションの䟋の説明ですでに説明されおいたす。



最埌に、最も難しいブロック、぀たりオヌディオクリップ「bk20」を説明するためのブロックの説明を怜蚎する必芁がありたす図13。前の2぀の図ず同様に、ブロックコンテンツのタむトルずサむズが匷調衚瀺されおいたす。





図 13.オヌディオクリップ「bk20」の説明のブロックのバむト。



ブロックの内容には、たず、それぞれ4バむトの2぀の小芋出しがありたす。それらはマれンタずシアンの塗り぀ぶしで匷調衚瀺されたす。最初のサブタむトルは、セッション内のクリップの数です。䟋には3぀ありたす。 2番目のサブタむトルは定数0x4872です。どうやらそれは各サブブロックのサむズを瀺しおおり、それらはさらに進んでいたす。それらの数は、セッション内のクリップの数ず䞀臎したす。このような各サブブロックは、1぀のクリップのパラメヌタヌを蚘述したす。ちなみに、ブロック「bk20」のコンテンツのサむズDは、匏D = 8 + 72 * bで蚈算できたす。ここで、bはマルチセッション内のオヌディオクリップの数です。この図では、必芁なパラメヌタヌが倚数あるため、サブブロック内に説明的なバむト割り圓おはありたせん。それらは別の衚にリストされおいたす図14。青い塗り぀ぶしは私のプロゞェクトで必芁なパラメヌタを瀺し、灰色の塗り぀ぶしは認識されない定数です。この衚には、最埌の䟋の3぀のマルチセッションクリップのそれぞれのパラメヌタヌ倀も瀺されおいたす。





. 14. .



最初の単語4バむトのグルヌプぱンベロヌプぞの参照であり、これは必芁ありたせん。 2番目のパラメヌタヌは、オヌディオファむルぞのリンクです。このパラメヌタの倀は、このオヌディオクリップが察応するオヌディオファむルの識別子の倀ず同じです。次に、2぀の実定数がありたす。これらはすでに以前に衚瀺されおいたす。これらの埌には、サンプル数で衚される3぀の調敎パラメヌタヌが続きたす。セッションの開始からのクリップのオフセット、セッション内のクリップの長さ期間、およびクリップ内のオヌディオのオフセットです。これらのパラメヌタの名前からすべおが明確である必芁がありたす。以前、マルチセッションの2番目の䟋を詳现に説明するずきに、すべおのオフセットず期間の数倀を瀺したした。図14の衚は、各クリップのパラメヌタヌを16進圢匏で瀺しおいたす。これらの倀を図13から盎接曞き盎しお、テヌブルに入力したした。しかし、それらを10進圢匏に倉換するず、2番目の䟋の説明からの察応する倀ず䞀臎したす個別にチェックされたす。最初ず3番目のクリップのオヌディオファむルぞのリンクは同じ倀0x3F5B050であるこずに泚意しおください。これは、䞡方のクリップが察応する識別子を持぀同じオヌディオファむルを参照しおいるためです。この埌に、バむナリパラメヌタのバむトのブロック4バむトが続きたす。トラックの説明の堎合ず同様に、ビットの䞀郚のみをデコヌドしたした。デフォルト倀は0x00080000です。぀たり、バむナリに倉換された堎合、1぀のビット19のみが1に「レむズ」され、残りの31ビットはれロに等しくなりたす。このシングルビットがないず、実際に瀺されおいるように、マルチセッションはロヌドを拒吊したす。珟圚の䟋では、この倀は1番目ず2番目のクリップの特性ですが、3番目のクリップでは、䜕らかの理由で、フラグの倀は0x000A0000に等しくなりたす。数えるず、この倀では2぀のビットが「発生」したす。それでもbit19ず別のbit17です。なぜ起こったのかわかりたせん。隣接するクリップず同様に、ビット17をれロにリセットし、パラメヌタヌ党䜓の倀を0x00080000に倉曎しおみたした。その結果、Adobe Auditionのセッションは、目に芋える倉曎なしで開始されたした。 Adobe Auditionで䜜業しおいるずきに、「FixinTime」や「FixforPlaybackOnly」などのクリッププロパティに気づきたした。バむナリパラメヌタのブロック内の特定のビットがこれらのプロパティの栌玍に関䞎しおいるず想定するのは論理的です。クリップには他のバむナリプロパティもありたすが、それらは必芁ありたせん。そしお、リストされた2぀のプロパティは非垞に䟿利です。 「Fixintime」プロパティは、クリップがマりスポむンタの氎平方向ぞの偶発的な移動の可胜性から保護されるため䟿利です。しかし、そのようなクリップでは、円のロックの圢のシンボルが巊䞋隅に芖芚的に描かれ、これは衚瀺するための䞍芁なグラフィック情報です。クリップの2番目のプロパティ「再生専甚に修正」は、察応するトラックで「R」レコヌドパラメヌタがアクティブになっおいる堎合、クリップが匷制的に赀色を取埗しないずいう点で䟿利です。私がいく぀かのトラックでパラメヌタ「R」を䜿甚するこずに決めたもののために-それは䞊に曞かれおいたす。経隓的に、bit1がクリップの最初のプロパティを担圓し、bit3が2番目のプロパティを担圓するこずがわかりたした。以䞊のこずから、次のようになりたす。 Clip in Timeプロパティを蚭定するには、倀0x00080002をバむナリパラメヌタに曞き蟌む必芁がありたす。 [再生専甚のコミット]プロパティは0x00080008です。䞡方のプロパティで、それらの論理合蚈は0x0008000Aです。バむナリパラメヌタを扱いたす。これらのバむトの埌に、クリップが配眮されおいるトラックぞのリンクがありたす。実際には、シリアル番号ず䞀臎するトラック識別子が登録されおいたす。ちなみに、Adobe Audition 1.5は128トラック以䞋をサポヌトしおいるため、この識別子は32ビット倀ずしおリストされおいたすが、1バむトに収たりたす。次に、解読されおいないれロ定数がありたす4぀の定数、それぞれ4バむト。最埌に、最埌の重芁なパラメヌタはクリップの色です。 Adobe Audition 1.5゚ディタヌでは、察応するダむアログボックスのクリップに0〜239のカラヌ倀を蚭定するか、パレットから遞択するこずができたす図15。カラヌパレットは特に魅力的ではありたせんが、他のオプションは提䟛されおいたせん。デフォルトのクリップカラヌは1020x66緑です。ちなみに、サポヌトするトラックは128を超えないため、このような識別子は32ビット倀ずしおリストされおいたすが、1バむトに収たりたす。次に、解読されおいないれロ定数4぀の定数、それぞれ4バむトがありたす。最埌に、最埌の重芁なパラメヌタはクリップの色です。 Adobe Audition 1.5゚ディタヌでは、察応するダむアログボックスのクリップに0〜239のカラヌ倀を蚭定するか、パレットから遞択するこずができたす図15。カラヌパレットは特に魅力的ではありたせんが、他のオプションは提䟛されおいたせん。デフォルトのクリップカラヌは1020x66緑です。ちなみに、サポヌトするトラックは128トラック以䞋なので、32ビット倀ずしおリストされおいたすが、このような識別子は1バむトに収たりたす。次に、解読されおいないれロ定数がありたす4぀の定数、それぞれ4バむト。最埌に、最埌の重芁なパラメヌタはクリップの色です。 Adobe Audition 1.5゚ディタヌでは、察応するダむアログボックスのクリップに0〜239のカラヌ倀を蚭定するか、パレットから遞択するこずができたす図15。カラヌパレットは特に魅力的ではありたせんが、他のオプションは提䟛されおいたせん。デフォルトのクリップカラヌは1020x66緑です。5を䜿甚するず、察応するダむアログボックスのクリップに0〜239のカラヌ倀を蚭定するか、パレットから遞択できたす図15。カラヌパレットは特に魅力的ではありたせんが、他のオプションは提䟛されおいたせん。デフォルトのクリップカラヌは1020x66緑です。5を䜿甚するず、察応するダむアログボックスのクリップに0〜239のカラヌ倀を蚭定するか、パレットから遞択できたす図15。カラヌパレットは特に魅力的ではありたせんが、他のオプションは提䟛されおいたせん。デフォルトのクリップカラヌは1020x66緑です。





. 15. Adobe Audition 1.5.



sesファむルのcolorパラメヌタは32ビットであり、実際には240色しかなく、1バむトに収たりたす。他の3぀の最䞊䜍バむトはれロです。これらのバむトを異なる倀に線集しようずするず、マルチセッションを開くず、クリップに新しい色が衚瀺されるず思いたした。しかし、このトリックは機胜したせんでした。前の蚘事で説明したように、チャヌトの色は、通話の特定の機胜を芖芚的に匷調するのに圹立ちたす。通話の音声録音のマルチセッションは同様の図に䌌おいるため、クリップの色は非垞に圹立ちたす。クリップの色パラメヌタの埌には、2ワヌドのれロが続きたす。これでサブナニットの説明は完了です。これらの8バむトのれロは、最埌のブロックのサブブロックの最埌です。したがっお、それらはsesファむル党䜓の最埌にもなりたす。



プロゞェクトに぀いお考えおいるずきに、別のアむデアを思い぀きたした。マルチセッションにマヌカヌキュヌポむントを远加し、1時間ごずに配眮しお、適切なマヌクに眲名するこずです。この考えを前の蚘事ず比范するず、これは1時間ごずに描かれる図の垂盎線の完党な類䌌物です。マルチセッションにキュヌポむントが存圚するためには、「キュヌ」ず呌ばれる6番目のブロックを考慮する必芁がありたす。私はこのブロックのバむトを理解し始めたせんでした。 「stat」ブロックず同様に、䜜成された24時間のマルチセッションで、1時間ごずに23のキュヌポむントを手動で配眮し、適切な名前を付けたした。次に、マルチセッションを別のsesファむルずしお保存し、「cues」ブロックの内容を切り取っお、「cues_24h.BLK」ファむルに保存したした。このファむルは、プログラムの開発時に考慮されたす。このファむルのバむトを図16に瀺したす。理由はわかりたせんが、ただし、タむトルずコンテンツサむズフィヌルドを䜿甚せずに、コンテンツを正確に保存したした "stat_31_full.BLK"ではありたせん。これらの2぀の単語はプログラムコヌドに远加されたす。たた、コンテンツサむズは556バむトです。これらのうち、4バむトはサブタむトルキュヌポむントの数ずそれぞれ24バむトの23のサブブロックによっお占められおいたす。図16では、最初のサブブロックのコンテンツバむトが入力されおいたす。キュヌポむントラベルの名前を01h、02h、 、23hのようにするこずにしたした。





. 16. «cues» .



これで、マルチセッション圢匏の説明は終わりです。これで、マルチセッションを䜜成するためのプログラムの䜜成を開始するために必芁な知識ベヌスができたした。プログラムの䜜成は、ses圢匏を孊習しお埩号化するよりも簡単な䜜業です。私は2晩でプログラムを完了し、少なくずも1週間はフォヌマットの研究に費やしたした。さらに、以前に䜿甚した関数、特にファむルやディレクトリの操䜜を䜿甚しおプログラムを䜜成したした。したがっお、プログラムを䜜成するための䞻なサポヌトは、参考曞やむンタヌネットではなく、Habréで曞いた過去のプロゞェクトでした。むンタヌネットから、曜日を日付で返す関数を1぀だけ取埗したした。しかし、プログラムのテキストを匕甚する前に、私は最初はこの蚘事で曞きたくなかったいく぀かの情報を共有するこずにしたした。



ASIOを介したオヌディオ入力/出力をサポヌトするAdobeAudition 3.0の最新バヌゞョンで䜜業しおいたずきに、電話の録音からマルチセッションを圢成するずいうアむデアが思い浮かびたした。マルチセッションを保存するず、通垞の埓来のSESず以前のバヌゞョンのプログラムでは䜿甚できなかった新しいXML圢匏の2぀の異なる圢匏で保存できるこずがわかりたした。セッションをXML圢匏で保存した埌、すぐにこのファむルをメモ垳で開きたした。そこで、耇雑な階局構造でリンクされた䞀連のパラメヌタヌの説明が芋぀かりたした。この階局を衚瀺しやすくするために、WMHelpXmlPadプログラムを䜿甚したした。図17は、このプログラムのスクリヌンショットを瀺しおおり、詊甚版の単玔なマルチセッションファむルが開かれおいたす。巊偎はドキュメント階局です。階局のアクティブな遞択された芁玠は、最初のオヌディオファむルの長さパラメヌタです。オヌディオファむル蚘述ブロックの最初のサブナニットに立っおいたす。





. 17. XML Adobe Audition 3.0.



私はこの特定の圢匏を研究するこずに決めたした。将来、プログラムで必芁なXMLテキストを生成し、出力で目的のマルチセッションを取埗したす。この目的のためにExcelを䜿甚するずいうアむデアさえありたした。問題は、XMLファむル党䜓の玄95がトラック蚘述ブロックによっお占められおいるこずでした。膚倧な数のパラメヌタヌがあり、マルチセッションを損なうこずなく陀倖するこずはできたせんでした。事実、このバヌゞョンのAdobe Auditionには、トラックに関連する倚くの機胜がありたす。論理的には、私の単玔なマルチセッションではこれらの関数は必芁ありたせん。ただし、察応するフィヌルドをXMLドキュメントから陀倖するず、セッションは終了したす。そしお、最も単玔なセッションでは、各トラックの説明にあるこの巚倧なテキストのチャンクを「プル」する必芁がありたす。これは、マルチセッションXMLファむルを生成する際の唯䞀の䞍䟿です。知識、もちろん、テキストXMLの研究䞭に埗られたマルチセッションバリアントは、バむナリsesの研究䞭に有甚でした。たた、XMLでも、䞀郚のパラメヌタヌを埩号化できたせんでした。各パラメヌタヌのフィヌルドは英語で省略名が付けられおいたすが、それでも、このパラメヌタヌが䜕であるかを垞に理解しおいるずは限りたせんでした。重芁なこずは、基本的な必芁なパラメヌタヌ、それらの階局ブロックおよびフィヌルドを調査および解読できたこずです。それから私は質問に長い間苊しめられたした叀いバヌゞョンのAdobeAuditionでそのようなセッションを開く方法はプログラムの新しいバヌゞョンは非垞に掗緎されたむンタヌフェヌスほが3Dを備えおおり、図のようなマルチセッションを芖芚化するには非垞に䞍䟿です。たた、FullHD画面にりィンドりが完党に拡匵されたAdobe Audition 3.0のこの「スリヌテ」により、最倧最小スケヌルで28トラックが適合したす。たた、Adobe Audition 1.5では、37が適合したす図。18、スケヌル12。合蚈31トラックを画面に衚瀺する必芁がありたす。





. 18. Adobe Audition .



しかし、䜕よりも、新しいバヌゞョンのプログラムで8000 Hzの呚波数でマルチセッションを再生したずきに、音質を仕䞊げたした。音はあたり良くなく、調和のずれた歪みがありたす。これは、サりンドが異なるサンプルレヌト48 kHzで出力されるためであり、ASIOはそれ以倖の方法では出力できたせん。蚭定で別の出力デバむス「Audition3.0Windows Sound」を遞択しおも、状況は倉わりたせん。プログラムの新しいバヌゞョンは、埓来の「DirectSound」出力デバむスをサポヌトしおいたせん私はバヌゞョン3.0を新しいず呌びたす。図19は、逆スペクトル高調波歪みが存圚する状態でAdobe Audition3.0で8kHzオヌディオたたはセッションを再生したずきのオヌディオスペクトルを瀺しおいたす。これらの呚波数は緑色で囲たれおいたす。これは理想的に聞こえるはずです他には䜕もありたせん。そしお、呚波数は赀で囲たれおいたす、これは远加の歪みです。この圱響は、アップサンプリング手順埌のフィルタリングが䞍足しおいるこずが原因である可胜性がありたす。この埌、私はよりシンプルでより快適なAdobe Audition1.5プログラムのSESバむナリ圢匏の研究を始めるこずにしたした。新しいバヌゞョンのプログラムから「人間の」XML圢匏を孊んだ埌、バむナリファむルの経隓を考えるず、それを理解するのは難しくないこずを望んでいたした。そしお、それが起こりたした。私はすぐにSESフォヌマットを「宣䌝」したした。そしお重芁なこずは、将来を芋据えた埌方互換性がうたく機胜するこずです。バヌゞョン1.5甚に圢成されたセッションは、バヌゞョン3.0で正垞に開かれたす。䞊蚘で、音質ずグラフィックむンタヌフェむスに関連するAdobe Audition3.0の欠点を指摘したした。しかし、このバヌゞョンのプログラムには、マルチセッションナビゲヌションに利点がありたす。䟋えば、マルチセッションで1぀のオヌディオクリップをマりスでクリックしおから右にシフトするず、操䜜で1぀のオヌディオクリップを聞く可胜性がありたす。





図19.再生䞭の調和歪み。



次に、スポむラヌの䞋でプログラムのテキストを瀺したす。もちろん、このタスクには必芁ないため、プログラムにはグラフィカルむンタヌフェむスがありたせん。プログラムのテキストには詳现なコメントが付いおいるので、远加の説明は必芁ありたせん。プログラムはコマンドラむンで起動され、1秒以内に400個のファむルのリストを凊理しお、マルチセッションファむルを圢成したす。プログラム内には、必芁に応じお、キュヌマヌカヌを生成したり、週末にトラックに「R」を付けたり、クリップに「Fix in time」プロパティを蚭定したり、クリップの色付けの基準を遞択したりできないようにする4぀のパラメトリック倉数がありたす通話タむプたたは電話番号による ..。これらの3぀の倉数は、プログラムテキストから陀倖しお「抜出」する必芁がありたす。぀たり、プログラムパラメヌタを含む別のファむルに入れる必芁がありたす。



Cプログラムの゜ヌスコヌド
/********************************************************************
  "RMC"     ,  
  wav    .   
 ,    .
       yyyy-mn, 
  .      .
      (.. -),  
   .  
    ,    ,
    "RMC"   "I:".
*********************************************************************/
#include <windows.h>
#include <stdio.h>
#include <string.h>

DWORD wr; // ,   ;
DWORD ww; // ,   ;
DWORD wi; // ,   ;

//    (     );
int Date( int D, int M, int Y ){
    int a, y, m, R;
    a = ( 14 - M ) / 12;
    y = Y - a;
    m = M + 12 * a - 2;
    R = 6999 + ( D + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12 );
    return R % 7;
}

//   ;
HANDLE openInputFile(const char * filename) {
       return CreateFile ( filename,      // Open Two.txt.
            GENERIC_READ,          // Open for writing
            0,                      // Do not share
            NULL,                   // No security
            OPEN_ALWAYS,            // Open or create
            FILE_ATTRIBUTE_NORMAL,  // Normal file
            NULL);                  // No template file       
}

//   ;
HANDLE openOutputFile(const char * filename) {
       return CreateFile ( filename,      // Open Two.txt.
            GENERIC_WRITE,          // Open for writing
            0,                      // Do not share
            NULL,                   // No security
            OPEN_ALWAYS,            // Open or create
            FILE_ATTRIBUTE_NORMAL,  // Normal file
            NULL);                  // No template file       
}

//    ;
void filepos(HANDLE f, __int64 p){
  LONG HPos;
  LONG LPos;
  HPos = p>>32;
  LPos = p;
  SetFilePointer (f, LPos, &HPos, FILE_BEGIN);
}

// 32-  ;
void write32(HANDLE f, signed long int a){
  WriteFile(f, &a, 4, &ww, NULL);  
}

//  ;
void fill(HANDLE f, signed long int a, unsigned char c){
  unsigned char i;
  for(i=0;i<c;i++){
    write32(f,a);
  }
}

int main(){
  HANDLE out; //   Adobe Audition;
  HANDLE stat; //     "stat" (+ );
  HANDLE cues; //     "cues";
  HANDLE lf; //     "LISTFILE";
  HANDLE blk; //     "bk20";
  char* week[7]={"", "", "", "", "", "", ""}; //  -;
  unsigned char dm[]={31,29,31,30,31,30,31,31,30,31,30,31}; //   ;
  unsigned char p_cues=1; //:    (cues);
  unsigned char p_R=1; //:   "R" (  )    ;
  unsigned char p_lock=1; //:    ;
  unsigned char p_color=2; //   ;
  unsigned char flg; // ,    .   ;
  unsigned long int lfsize=0; //  "LISTFILE";
  unsigned long int blksize=0; //  "bk20";
  unsigned long int smp; //   ;
  unsigned long int offset; //    ;
  unsigned int cfile=0; //  ;
  unsigned int cblk=0; //  ;
  char name[100]; //   (  ...);
  char fullname[100]; //      ;
  char infld[8]; //  ;
  char number[11]; //    . ;
  unsigned char len; //    ;
  printf("Input yyyy-dd name of folder:\n"); //   ;
  scanf("%s",infld); //      ;
  WIN32_FIND_DATA fld; //       ;
  HANDLE hf; //  (   ,     );
  char buf1[48],buf2[556]; //     "stat"  "cues";
  char str[16]; //   ;
  unsigned long int outpos=0; //   ;
  unsigned char byte; //      "LISTFILE"  "bk20";
  unsigned char i; //  ;
  unsigned char mn,d,dw,h,m,s; // -;
  unsigned char cdm; //    ;
  int yy; //  ;
  yy=2000+(infld[2]-48)*10+(infld[3]-48); //    ;
  mn=(infld[5]-48)*10+(infld[6]-48); //    ;
  sprintf(name,"I:\\RMC\\%s.ses",infld); //     ( );
  out=openOutputFile(name); //    ;
  WriteFile(out, "COOLNESS", 8, &wi, NULL); // :    ;
  write32(out,0); //   (  ,     );
  WriteFile(out, "hdr ", 4, &wi, NULL); //,    :  ;
  write32(out,936); //   ,  936;
  write32(out,8000); //   ;
  write32(out,24*3600*8000); //    (. 24 );
  write32(out,0); //    ( );
  write32(out,0x00010020);
  write32(out,0);
  write32(out,0x3ff00000);
  write32(out,0);
  write32(out,0x3ff00000);
  filepos(out,328); //   ;
  write32(out,0x20);
  WriteFile(out, "", 6, &wi, NULL); //  ;
  filepos(out,376); //   ;
  write32(out,0x3ff00000);
  filepos(out,892); //   ;
  write32(out,0x0430041c);
  write32(out,0x04420441);
  write32(out,0x04400435);
  filepos(out,956); //   ;
  stat=openInputFile("stat_31_full.BLK"); //     ,
  ReadFile(stat, &buf1, 48, &wr, NULL); //       ;
  WriteFile(out, buf1, 48, &wi, NULL);
  CloseHandle(stat);
  if(mn==2){ // ,
    if(!(yy%4)){ //   ,
      cdm=29; // 29 ,
    }else{
      cdm=28; // - 28;
    }
  }else{ //  ,
    cdm=dm[mn-1]; //       ;
  }
  WriteFile(out, "trks", 4, &wi, NULL); //    ;
  write32(out,4+cdm*152); //      ;
  write32(out,cdm); //       ;
  outpos=1016; //     ;
  for(i=0;i<cdm;i++){ //      
    dw=Date(i+1,mn,yy); //     ;
    write32(out,0); //      ses,       ;
    write32(out,0x3ff00000); 
    write32(out,0); //   8-  double;
    write32(out,0x3ff00000);
    if((dw%7==5||dw%7==6)&&p_R){ //   -  ,      "R",
      write32(out,4); //     "R",
    }else{
      write32(out,0); // -   ;
    }
    sprintf(str,"%02d.%02d.%i %s",i+1,mn,yy,week[dw]); //  ,    ;
    WriteFile(out, str, strlen(str), &wi, NULL);
    filepos(out,1072+152*i); //      (i+1)- ;
    write32(out,1); //  ,     ;
    write32(out,1);
    write32(out,4);
    write32(out,0);
    write32(out,0);
    write32(out,0x40590000);
    write32(out,0);
    write32(out,0);
    write32(out,0xffffff9d);
    write32(out,0xffffff9d);
    write32(out,i+1); //  ,    ;
    fill(out,0,11);
    write32(out,4);
    write32(out,0);
    outpos+=152; //  ;
  }
  if(p_cues){ //        ,    "cues";
    WriteFile(out, "cues", 4, &wi, NULL); //  ,
    write32(out,556); //  -  ;
    cues=openInputFile("cues_24h.BLK"); //   ,   ;
    ReadFile(cues, &buf2, 556, &wr, NULL); //(    ,   "stat");
    WriteFile(out, buf2, 556, &wi, NULL);
    CloseHandle(cues);
    outpos+=564;
  }
  DeleteFile("LISTFILE"); //  (      )
  DeleteFile("bk20"); //  "LISTFILE"  "bk20",
  lf=openOutputFile("LISTFILE"); // ()    
  blk=openOutputFile("bk20"); //      ;
  WriteFile(lf, "LISTFILE", 8, &wi, NULL); //     ;
  WriteFile(blk, "bk20", 4, &wi, NULL);
  write32(lf,0);
  write32(blk,0);
  write32(blk,0);
  write32(blk,0x48); //  ,      ;
  sprintf(name,"I:\\RMC\\%s\\*.wav",infld); //   wav    ;
  hf=FindFirstFile(name,&fld); //  ;
  do{ //  ;
    len=strlen(fld.cFileName); //    ;
    for(i=10;i>=1;i--){ //  10      ;
      number[10-i]=fld.cFileName[len-i-4]; //  ;
    }
    number[10]=0; //   ,    ;
    cfile+=1; //   ;
    sprintf(fullname,"I:\\RMC\\%s\\%s",infld,fld.cFileName); //     ;
    d=(fld.cFileName[22]-48)*10+(fld.cFileName[23]-48); //  ()   ;
    h=(fld.cFileName[25]-48)*10+(fld.cFileName[26]-48); //    ;
    m=(fld.cFileName[27]-48)*10+(fld.cFileName[28]-48); //    ;
    s=(fld.cFileName[29]-48)*10+(fld.cFileName[30]-48); //    ;
    offset=(h*3600+m*60+s)*8000; //    ;
    smp=(fld.nFileSizeLow-44)/4; //     (   );
    WriteFile(lf, "wav ", 4, &wi, NULL); //     ;
    write32(lf,17+strlen(fullname)); //   (    );
    write32(lf,1000+cfile); //  ( ,      1000   );
    write32(lf,0x14); //  ( );
    WriteFile(lf, fullname, strlen(fullname), &wi, NULL); //   ( );
    WriteFile(lf, "\0", 1, &wi, NULL); //   ;
    write32(lf,0xffffffff); //;
    write32(lf,smp); //   ;
    lfsize+=(25+strlen(fullname)); //   "LISTFILE";
    cblk+=1; //     ;
    write32(blk,0); //     ,       ;
    write32(blk,1000+cfile); //   ();
    write32(blk,0); //   ;
    write32(blk,0x3ff00000);
    write32(blk,0);
    write32(blk,0x3ff00000);
    write32(blk,offset); //    ;
    if(((24*3600*8000)-offset)>smp){ //  ( )     ,
      write32(blk,smp); //     ,
    }else{
      write32(blk,(24*3600*8000)-offset); //       ;
    }
    write32(blk,0); //     ;
    if(p_lock){ //       ,
      write32(blk,0x0008000a); //     (3   32 ),
    }else{
      write32(blk,0x00080008); //    (2   32 );
    } //     -   "   ";
    write32(blk,d); //   ( );
    fill(blk,0,4); // ;
    switch(p_color){ //   ;
      case 1: //   ;
        switch(fld.cFileName[0]){ //     ;
          case 'I': // "I" (   ),
            write32(blk,0); //  ;
          break;
          case 'O': // "O" (   ),
            write32(blk,102); //   (  );
          break;
          default: //  - ,
            write32(blk,102); //   ;
          break;
        }
      break;
      case 2: //  ;
        flg=0; // ;
        if(!strcmp("9530000000",number)){ // - - ,
          write32(blk,05); //  - -,
          flg=1; //( );
        }
        #include "numbers_and_colors.cpp" //      -    ();
        if(!flg){ //     (     ),
          write32(blk,102); //    ;
        }
      break;
    }
    write32(blk,0);
    write32(blk,0);
    if(((24*3600*8000)-offset)<=smp){ //  ( )     ( ),
      cblk+=1; //      ;
      write32(blk,0); //   ,  ;
      write32(blk,1000+cfile);
      write32(blk,0);
      write32(blk,0x3ff00000);
      write32(blk,0);
      write32(blk,0x3ff00000);
      write32(blk,0); //        ,
      write32(blk,smp-((24*3600*8000)-offset)); //    ,
      write32(blk,(24*3600*8000)-offset); //    ,     ;
      if(p_lock){
        write32(blk,0x0008000a);
      }else{
        write32(blk,0x00080008);
      }
      write32(blk,d+1); //  ()     ();
      fill(blk,0,4);
      switch(p_color){ //     ;
        case 1: //   ;
          switch(fld.cFileName[0]){ //       ( );
            case 'I': // ,
              write32(blk,0); //  ;
            break;
            case 'O': // ,
              write32(blk,102); //  ,   ;
            break;
            default: //  -  (  ),
              write32(blk,102); //   ;
            break;
          }
        break;
        case 2: //  ;
          flg=0;
          if(!strcmp("9530000000",number)){ // - - ,
            write32(blk,05); //  - -,
            flg=1; //( );
          }
          #include "numbers_and_colors.cpp" //      ( );
          if(!flg){ //   ,
            write32(blk,102); //   ;
          }
        break;
      }
      write32(blk,0);
      write32(blk,0);
    }  
  }while(FindNextFile(hf,&fld)); //    wav ;
  filepos(lf,8);
  write32(lf,lfsize); //   "LISTFILE",    ;
  filepos(blk,4);
  blksize=8+72*cblk; //   "bk20",   ;
  write32(blk,blksize); //   "bk20";
  write32(blk,cblk); //  ;
  blksize+=8; //   "bk20",     .  ;
  lfsize+=12; //   "LISTFILE",     .  ;
  CloseHandle(lf); // . ;
  CloseHandle(blk); // . ;
  lf=openInputFile("LISTFILE"); // .       ;
  do{ //  ,     (   );
    ReadFile(lf, &byte, 1, &wr, NULL);
    if(wr){
      WriteFile(out, &byte, 1, &wi, NULL);
    }
  }while(wr);
  CloseHandle(lf); // . ;
  blk=openInputFile("bk20"); // .       ;
  do{ //  ,     (   );
    ReadFile(blk, &byte, 1, &wr, NULL);
    if(wr){
      WriteFile(out, &byte, 1, &wi, NULL);
    }
  }while(wr);
  CloseHandle(blk); // . ;
  outpos=outpos+blksize+lfsize; //    ;
  filepos(out,8);
  write32(out,outpos-12); //      ;
  filepos(out,28);
  write32(out,cblk); //      ;
  CloseHandle(out); //   !  ;
  printf("c_files: %i\nc_block: %i\n",cfile,cblk); //    (   );
  system("PAUSE");
  return 0;
}




これで、結果を含むスクリヌンショットを衚瀺できたす。それらのいく぀かがありたす異なる衚瀺スケヌルで、プログラムの異なるバヌゞョンで、そしお異なる着色基準で。カタログ「2020-05」が凊理されたした。぀たり、今幎の5月のレコヌドです。合蚈446件のレコヌドが凊理されたした。新しい日に移行したレコヌドがないため、ブロック数は同じです。





図20.電話による着色を䌎う実物倧のマルチセッションの衚瀺。数字。





図21.コヌルタむプごずに色分けされたフルスケヌルのマルチセッションの衚瀺。





図22.䞭芏暡でのマルチセッションの衚瀺。





図23.倧芏暡なマルチセッションの衚瀺。





図24. Adob​​e Audition3.0での同じマルチセッションの衚瀺。






All Articles