تكوين برنامج Adobe Audition متعدد الجلسات مع تسجيلات صوتية للمكالمات الهاتفية

في المقالة السابقة ، كتبت عن إنشاء رسومات متجهة SVG باستخدام مخطط مكالمة هاتفية يشبه مخطط جانت. أخذت المعلومات المتعلقة بالمكالمات الهاتفية من التفاصيل ، والتي قمت بتنزيلها من خلال حسابي الشخصي على موقع الويب الخاص بمشغل الهاتف المحمول. كان ذلك قبل أربع سنوات تقريبًا. حاليًا ، لدي فكرة لجعل المشروع أكثر تعقيدًا: إنشاء جلسة متعددة في محرر الصوت Adobe Audition 1.5 من التسجيلات الصوتية للمحادثات الهاتفية. في الوقت نفسه ، يجب وضع هذه التسجيلات الصوتية في الجلسة المتعددة بدقة وفقًا للوقت ، بالإضافة إلى التواريخ التي ستتوافق معها المسارات. في الوقت نفسه ، ستشبه هذه الجلسة المتعددة بصريًا نفس المخطط الذي تم إنشاؤه في المقالة السابقة. بالإضافة إلى ذلك ، سيكون من الممكن توسيع نطاق تسجيلات المحادثات الهاتفية والاستماع إليها بسرعة ، سواء في الوضع "المزج" أو "المنفرد" في اليوم.



قررت إنشاء جلسة متعددة من التسجيلات الصوتية المتراكمة في شهر تقويمي واحد لتجنب الفوضى غير الضرورية لبرنامج Adobe Audition. بالطبع يمكن بناء مثل هذه الجلسة يدويًا ، لكنها عمل طويل ومضني. الاهتمام الرئيسي لهذه المهمة هو أتمتة إنشاء جلسة متعددة بواسطة البرنامج. بتعبير أدق ، اكتب برنامجًا ، استنادًا إلى قائمة ملفات تسجيل الصوت ، سينشئ ملف SES لجلسات Adobe Audition المتعددة. لأولئك الذين لا يعرفون: الجلسة المتعددة ، باختصار ، هي مشروع يتكون من العديد من التسجيلات الصوتية المختلفة الموزعة في الوقت المناسب وعلى المسارات (المسارات) ومصممة لخلق مزيج منها.



بادئ ذي بدء ، من المفيد مناقشة كيفية الحصول على التسجيلات الصوتية للمحادثات الهاتفية. لا يخفى على أحد أن الهواتف الذكية الحديثة لديها القدرة على تسجيل المكالمات الهاتفية باستخدام أدوات مختلفة ، سواء كانت مدمجة في النظام أو من جهات خارجية. أنا شخصياً أستخدم جهاز كمبيوتر لوحي Lenovo TAB3 (مع معالج MT8735P). يسمح لك الجهاز بعمل تسجيلات صوتية في الوضع اليدوي بتنسيق مضغوط ، واستلام الملفات بامتداد 3gpp. يتم الحصول على التسجيلات بنظام ستريو بقنوات منفصلة: يتم تسجيل صوت المشترك في قناة واحدة وصوته في القناة الأخرى. يؤثر التنسيق المضغوط للتسجيلات الصوتية على تشويهها أثناء التشغيل. لهذا السبب ، أستخدم تطبيقات تسجيل الصوت التابعة لجهات خارجية ، والتي يوجد منها عدد لا يحصى. أحد التطبيقات التي أحببتها أكثر هو "تسجيل مكالمتي".يسجل هذا التطبيق المكالمات في الوضع التلقائي ، ولديه العديد من الإعدادات المتعلقة ، على وجه الخصوص ، باختيار تنسيق وجودة التسجيل الصوتي. وأيضًا ، كمكافأة ، يحتوي التطبيق على سجل مكالمات مدمج لطيف ومريح للغاية ، والذي يتم حفظه في ملف قاعدة بيانات db (الشكل 1).





الشكل: 1. سجل المكالمات في تطبيق "Record My Call".



أفضل معلمات تسجيل الصوت لجودة الصوت هي WAV 8000Hz 16bit Stereo. باستخدام هذه الإعدادات ، لا يوجد تشويش في التسجيل ، ويبدو واضحًا ، على الرغم من أنه يشغل مساحة أكبر من الذاكرة. تم تكوين التطبيق بحيث يبدأ التسجيل الصوتي تلقائيًا حتى قبل بدء المحادثة الهاتفية: عند وصول مكالمة واردة قبل "التقاط جهاز الاستقبال" أو عند طلب رقم أثناء الرنين. وهذا يعني أنه يتم أيضًا تسجيل المكالمات الفائتة والتي لم يتم الرد عليها. يمكن تهيئتها لتسجيل المحادثة فقط. تنسيق اسم ملف تسجيل الصوت قابل للتكوين أيضًا. في حالتي ، قمت بتكوينه كما هو موضح في الشكل 2.





الشكل. 2. ضبط تنسيق اسم الملف في "تسجيل مكالمتي".



أثناء تطوير برنامج الجيل متعدد الجلسات ، سيكون من الضروري أخذ معلومات حول تاريخ ووقت التسجيل الصوتي للمكالمة الهاتفية. سيتم أخذ هذه المعلومات من اسم الملف في مواقع ثابتة.



قبل البدء في إنشاء ملف SES متعدد الجلسات ، تحتاج إلى فهم كيفية عمل هذا الملف. بالطبع ، لا يوجد توثيق على هذا الشكل في أي مكان ، لذلك كان علي حلها بنفسي ، بالاعتماد على الخبرة والمعرفة الشخصية. هذا الملف ليس ملفًا نصيًا ، لذلك لا فائدة من فتحه في برنامج Notepad. "WinHex" - محرر سداسي عشري يأتي للإنقاذ. لقد كتبت بالفعل عددًا من المقالات حول العمل مع البيانات الثنائية وفك تشفير المعلومات ، على وجه الخصوص ، مقالًا عن كتابة برنامج إعادة تغليف فيديو 264-avi. هناك كتبت أكثر أو أقل من التفاصيل حول جهاز ملف avi.



أولاً ، قمت بإنشاء جلسة متعددة تعسفية بسيطة في Adobe Audition 1.5 ، تتكون من مسار واحد وملف صوتي واحد (الشكل 3) ، وحفظه في ملف بامتداد ses. حجم الملف 2422 بايت. ثم فتحت هذا الملف في WinHex (الشكل 4).





الشكل: 3. منظر للجلسات المتعددة في Adobe Audition 1.5 - مثال 1.





الشكل. 4. فتح ملف الجلسة المتعددة في WinHex.



للوهلة الأولى ، لا يوجد شيء واضح على الإطلاق. في الجزء الرمزي من النافذة ، يمكنك رؤية الكلمات الدلالية "COOLNESS" ، "hdr" ، "Master". إذا قمت بالتمرير خلال المستند أدناه ، يمكنك رؤية النص الذي يحتوي على المسار الكامل للملف (وفي نسختين) ، والذي يتم استخدامه في الجلسة المتعددة. هذا موضح في الشكل 5 وموضح باللون الأخضر. من اللافت للنظر على الفور الكلمات الدلالية القصيرة المحاطة بدائرة في إطار أحمر في نفس الشكل.





الشكل: 5. بايت من مسارات الملفات الصوتية متعددة الجلسات.



بالنظر إلى هذه الوثيقة عن كثب من البداية إلى النهاية ، لاحظت بعض الكلمات الدلالية القصيرة الأخرى. لقد لاحظت أيضًا أن طول أي كلمة ذات معنى هو مضاعف أربعة. على ما يبدو ، هذه الكلمات هي رؤوس الكتل التي تشكل ملف متعدد الجلسات بأكمله. ذكرني بهيكل RIFF لملف avi أو wav يتكون من كتل تحتوي أيضًا على رؤوس من نفس الحجم. وتبع هذه الرؤوس رقم 32 بت (4 بايت) يشير إلى حجم الكتلة الحالية. مع وضع هذه الحقيقة في الاعتبار ، قررت التحقق مما إذا كان هذا المبدأ يعمل مع ملف ses؟ اتضح أنه في حالة تنسيق ses ، يعمل هذا أيضًا (الشكل 6).





الشكل: 6. التشابه مع بنية RIFF (على سبيل المثال ، كتلة "WLST").



يبدو أن الكلمة الأولى "COOLNESS" في ملف ses هي العنوان الرئيسي ونوع هذا الملف. 4 بايت التالية هي حجم المحتوى ، الذي يتم وضعه بعد ذلك ، حتى نهاية الملف. أي ، إذا قمت بالحساب بعناية ، فهذه القيمة تقل بمقدار 12 بايت عن حجم الملف بأكمله. والمحتوى الإضافي يتكون من مجموعة من الكتل المختلفة. تحتوي الكتلة على رأس من أربعة أو ثمانية بايتات ، متبوعة بـ 4 بايت تشير إلى حجم هذه الكتلة ، وبعدها تتبع محتويات هذه الكتلة. في بعض الكتل ، حددت وجود كتل فرعية ، ولكن سيتم مناقشة هذا في سياق وصف أكثر تفصيلاً لكل كتلة. في هذا الملف ، الذي في المثال ، قمت بعد 17 كتلة ، تم سردها في الجدول في الشكل 7.





الشكل. 7. قائمة الكتل التي تتكون منها الجلسة المتعددة.



كما ترى من الجدول ، يتم تقديم بعض نفس المعلومات في إصدارات مختلفة بواسطة كتل مختلفة. ربما يتم ذلك من أجل توافق الإصدارات المختلفة من البرنامج. بالنظر إلى المستقبل ، يتم تمييز هذه الكتل باللون الأخضر ، والتي بدونها لا يمكن أن توجد الجلسة المتعددة المعروضة في المثال. تم تمييز كتلتين من 4 بايت باللون الرمادي ، وهما كتلتان وهميتان في هذه الجلسة. في الواقع ، كان لدي سؤال: ماذا سيحدث إذا قمت بحذف بعض الكتل من الملف؟ بعد كل شيء ، أنا ، على سبيل المثال ، لا أحتاج إلى معلومات حول بندول الإيقاع والإيقاع ، والمغلفات الموجودة على المقاطع (بتعبير أدق ، على مقطع واحد) مفقودة في المثال البسيط. الأظرف عبارة عن منحنيات أعلى مقطع صوتي تحدد ديناميكيات معلمات الصوت (الحجم والتوازن) بمرور الوقت. بدأت بشكل تسلسلي في قطع الكتل من الملف المحدد ،مع عدم نسيان إعادة حساب القيمة وتصحيحها بعد كلمة "التبريد". نتيجة لذلك ، تم افتتاح الدورة المتعددة بنجاح مع تمييز خمسة كتل على الأقل باللون الأخضر. تحتوي الجلسة على كتلتين من قائمة الملفات الصوتية. يمكن ترك أي منهم. أفضل الخيار الثاني (كتلة "LISTFILE") ، حيث يوجد في الخيار الأول (كتلة "WLST") وحدتا بايت لكل حرف في وصف مسار الملف. ربما تم ذلك للأبجدية الموسعة للحروف ، لكن أبجدية ASCII القياسية كافية بالنسبة لي. علاوة على ذلك ، فإن الشخصيات الروسية ، كما ترون ، مدعومة جيدًا. يتم تقديم وصف المقاطع الصوتية في ثلاثة إصدارات. اخترت الخيار الأول (بلوك "bk20") ، لأنني اكتشفت وصفه بشكل أسرع.تحتوي الجلسة على كتلتين من قائمة الملفات الصوتية. يمكن ترك أي منهم. أفضل الخيار الثاني (كتلة "LISTFILE") ، حيث يوجد في الخيار الأول (كتلة "WLST") وحدتا بايت لكل حرف في وصف مسار الملف. ربما تم القيام بذلك للأحرف الأبجدية الموسعة ، لكن أبجدية ASCII القياسية كافية بالنسبة لي. علاوة على ذلك ، فإن الشخصيات الروسية ، كما ترون ، مدعومة جيدًا. يتم تقديم أوصاف المقاطع الصوتية في ثلاثة إصدارات. اخترت الخيار الأول (بلوك "bk20") ، لأنني اكتشفت وصفه بشكل أسرع.تحتوي الجلسة على كتلتين من قائمة الملفات الصوتية. يمكن ترك أي منهم. أفضل الخيار الثاني (كتلة "LISTFILE") ، حيث يوجد في الخيار الأول (كتلة "WLST") وحدتا بايت لكل حرف في وصف مسار الملف. ربما تم القيام بذلك للأحرف الأبجدية الموسعة ، لكن أبجدية ASCII القياسية كافية بالنسبة لي. علاوة على ذلك ، فإن الشخصيات الروسية ، كما ترون ، مدعومة جيدًا. يتم تقديم وصف المقاطع الصوتية في ثلاثة إصدارات. اخترت الخيار الأول (بلوك "bk20") ، لأنني اكتشفت وصفه بشكل أسرع.لكن أبجدية ASCII القياسية كافية بالنسبة لي. علاوة على ذلك ، فإن الشخصيات الروسية ، كما ترون ، مدعومة جيدًا. يتم تقديم وصف المقاطع الصوتية في ثلاثة إصدارات. اخترت الخيار الأول (بلوك "bk20") ، لأنني اكتشفت وصفه بشكل أسرع.لكن أبجدية ASCII القياسية كافية بالنسبة لي. علاوة على ذلك ، فإن الشخصيات الروسية ، كما ترون ، مدعومة جيدًا. يتم تقديم أوصاف المقاطع الصوتية في ثلاثة إصدارات. اخترت الخيار الأول (بلوك "bk20") ، لأنني اكتشفت وصفه بشكل أسرع.



ستكون الجلسة المتعددة من التسجيلات الصوتية للمحادثات الهاتفية مماثلة في التعقيد للجلسات المتعددة المعروضة في هذا المثال. الاختلاف الوحيد هو أنه سيكون أكثر ضخامة: سيكون عدد الملفات الصوتية كبيرًا جدًا ، وسيكون عدد المسارات مساويًا لعدد الأيام في الشهر. لمثل هذه الجلسات المتعددة ، لا حاجة إلى "أجراس وصفارات" أخرى. أحجام الكتلة "hdr" و "stat" ثابتة وتكون دائمًا 936 و 40 بايت ، على التوالي ، بغض النظر عن حجم الجلسة المتعددة. تعتمد أحجام كتلتي "trks" و "bk20" على عدد المسارات والمقاطع الصوتية في الجلسة المتعددة ، على التوالي. لكن حجم كتلة "LISTFILE" هو الأكثر صعوبة: فهو لا يعتمد فقط على عدد ملفات الصوت في جلسة متعددة ، ولكن أيضًا على طول أسمائها ومسارات مواقعها.



يعد فك تشفير وإنشاء وصف كامل لكتل ​​ملف متعدد الجلسات مهمة تستغرق وقتًا طويلاً. لذلك ، قمت بفك تشفير المعلومات جزئيًا ، مع الانتباه فقط إلى أقسام البايت التي يجب أخذها في الاعتبار عند تكوين جلسة متعددة من المحتوى المبسط. في هذه المقالة ، سأقدم وصفًا لمحتويات كل كتلة ، والتي تمكنت من فك شفرتها.



في محتوى كتلة الترويسة متعددة الجلسات "hdr" (توجد مسافة في النهاية فقط) ، تكون وحدات البايت الرئيسية هي أول 12 بايتًا ، أي 3 كلمات كل منها 4 بايت (الشكل 8). الكلمة الأولى هي معدل أخذ العينات في الجلسة المتعددة. بالنسبة لجلستي المتعددة ، هذه القيمة هي 8000 هرتز (0x1F40). في الشكل 8 تم تمييزه بالتعبئة الخضراء. اسمحوا لي أن أذكركم أن البايت في الكلمات للقيم الرقمية تتم قراءتها بشكل عكسي. الكلمة الثانية هي مدة (طول) الجلسة المتعددة ، معبراً عنها بعدد العينات (تعبئة باللون البرتقالي في الشكل). في هذا المثال ، هذه القيمة هي 0x1A365E (1717854). إذا تمت ترجمتها إلى دقائق ، تحصل على 1717854/8000/60 ، وهو ما يقرب من ثلاث دقائق ونصف. وهي كذلك: على نطاق محدود ، فإن الجلسات المتعددة لها هذه المدة بالضبط.ولجلسة متعددة من سجلات المكالمات الهاتفية ، يجب أن تكون المدة 24 * 3600 * 8000 = 691200000 = 0x2932E000 عينة. في هذه الحالة ، بالمناسبة ، فإن وقت التشغيل الحالي للجلسة المتعددة على اللوحة أدناه ، وهو وقت نسبي ، سيتطابق تمامًا مع قيمة الوقت المطلق للمكالمة الهاتفية الحالية (أو مجموعة مكالمات في اليوم). تشير الكلمة التالية المميزة باللون الأصفر إلى عدد المقاطع الصوتية في الجلسة المتعددة. في المثال ، هذه القيمة تساوي واحدًا ، ولكن في حالة المكالمات الهاتفية ، سيكون عدد هذه المقاطع مساويًا لعدد الملفات الصوتية. بالنظر إلى المستقبل ، فإن البيان الأخير ليس صحيحًا تمامًا. في الواقع ، قد يكون عدد المقاطع الصوتية أكثر قليلاً من عدد الملفات الصوتية. يمكن أن يحتوي ملف واحد على مقطعين في حالة حدوث ذلكإذا جاء يوم جديد خلال محادثة هاتفية. في هذه الحالة ، سيتعين عليك "نقل" التسجيل إلى مسار جديد ، ولن يعمل مقطع واحد. لكن مثل هذه الحالات نادرة في الممارسة العملية ، لأن الانتقال إلى يوم جديد يحدث في الليل ، عندما يكون نشاط المكالمات الهاتفية ضئيلًا. بالمناسبة ، لم أضع هذه النقطة في الحسبان عند تكوين مخطط SVG في المقالة السابقة. بعد كلمة قيمة عدد الكتل ، على الأرجح "نصف كلمة" من اثنين بايت 0x0020 ، أو 32 في شكل عشري. يمكن أيضًا تمييزه بتعبئة اللون ، لأنه ، على الأرجح ، يعني عمق البت للخلط. في Adobe Audition ، يقول شريط الحالة في الأسفل: 8000 هرتز ، خلط 32 بت. بالإضافة إلى الكلمات الثلاث الأكثر أهمية في محتوى "HDR" ، هناك بايتات أخرى غير مفهومة. على سبيل المثال ، لا أعرف حتى كلمة "سيد"ما تشير إليه. يبدو أن هذا هو اسم حافلة الخلط الرئيسية. لكن مجموعات البايت الأكثر إثارة للاهتمام التي أحاطتُ بها في إطار رمادي. الحقيقة هي أن هذا التسلسل يوجد غالبًا في كتل أخرى من ملف الجلسات المتعددة. ليس من قبيل المصادفة أنني جمعت 8 بايت بالضبط في مجموعة ، لأنه على الأرجح نوع بيانات حقيقي. على وجه الخصوص ، يتم تفسير هذا الثابت "00 00 00 00 00 F0 3F" HEX بواسطة المحرر في النوع المزدوج على أنه 1.0e + 0 ، أي كوحدة. على الأرجح هذه هي قيم مستويات الجهارة و "التقلبات" الأخرى ، ولكنها محددة ليس بالديسيبل ، ولكن في شكل مُعامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في الملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.لكن مجموعات البايت الأكثر إثارة للاهتمام حولت في إطار رمادي. الحقيقة هي أن هذا التسلسل يوجد غالبًا في كتل أخرى من ملف الجلسات المتعددة. ليس من قبيل المصادفة أنني جمعت 8 بايت بالضبط في مجموعة ، لأنه على الأرجح نوع بيانات حقيقي. على وجه الخصوص ، يتم تفسير هذا الثابت "00 00 00 00 00 F0 3F" HEX بواسطة المحرر في النوع المزدوج على أنه 1.0e + 0 ، أي كوحدة. من المرجح أن تكون هذه هي قيم مستويات الجهارة و "التقلبات" الأخرى ، ولكنها محددة ليس بالديسيبل ، ولكن في شكل معامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في الملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.لكن مجموعات البايت الأكثر إثارة للاهتمام حولت في إطار رمادي. الحقيقة هي أن هذا التسلسل يوجد غالبًا في كتل أخرى من ملف الجلسات المتعددة. ليس من قبيل المصادفة أنني جمعت 8 بايت بالضبط في مجموعة ، لأنه على الأرجح نوع بيانات حقيقي. على وجه الخصوص ، يتم تفسير هذا الثابت "00 00 00 00 00 F0 3F" HEX بواسطة المحرر في النوع المزدوج على أنه 1.0e + 0 ، أي كوحدة. من المرجح أن تكون هذه هي قيم مستويات الجهارة و "التقلبات" الأخرى ، ولكنها محددة ليس بالديسيبل ، ولكن في شكل معامل. يجب أن أقول على الفور أن جميع وحدات البايت الخاصة بأي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في الملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.ليس من قبيل المصادفة أنني جمعت 8 بايت بالضبط في مجموعة ، لأنه على الأرجح نوع بيانات حقيقي. على وجه الخصوص ، يتم تفسير هذا الثابت "00 00 00 00 00 F0 3F" HEX بواسطة المحرر في النوع المزدوج على أنه 1.0e + 0 ، أي كوحدة. من المرجح أن تكون هذه هي قيم مستويات الجهارة و "التقلبات" الأخرى ، ولكنها محددة ليس بالديسيبل ، ولكن في شكل معامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في ملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.ليس من قبيل المصادفة أنني جمعت 8 بايت بالضبط في مجموعة ، لأنه على الأرجح نوع بيانات حقيقي. على وجه الخصوص ، يتم تفسير هذا الثابت "00 00 00 00 00 F0 3F" HEX بواسطة المحرر في النوع المزدوج على أنه 1.0e + 0 ، أي كوحدة. على الأرجح هذه هي قيم مستويات الجهارة و "التقلبات" الأخرى ، ولكنها محددة ليس بالديسيبل ، ولكن في شكل مُعامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في الملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.وكمعامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في ملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.وكمعامل. يجب أن أقول على الفور أن جميع وحدات البايت من أي كتلة لم أتمكن من التعرف عليها (أو لم تكن ضرورية) ستتم كتابتها في ملف متعدد الجلسات الذي تم إنشاؤه بدون تغييرات ، كما في المثال.





. 8. «hdr ».



قررت عدم دراسة الكتلة "stat" لحالة تعدد الجلسات الحالية (الأقصر). لقد أنشأت نموذجًا آخر متعدد الجلسات من ملف صوتي واحد ، وقمت بتمديده لمدة 24 ساعة وعرضت العرض الكامل (الحجم) أفقيًا. وعموديًا ، تم قياس عرض المسارات بحيث يتم احتواء 31 مسارًا على شاشة FullHD عند توسيع نافذة Adobe Audition. هذا هو الحد الأقصى لعدد الأيام في شهر واحد. تم وضع المؤشر متعدد الجلسات في البداية. ثم حفظت هذه الجلسة المتعددة في ملف آخر ، ثم سحبت كتلة "stat" بكل رؤوسها. لقد قمت بحفظ هذه البايتات في ملف "stat_31_full.BLK" لاستخدامها مرة أخرى في تطوير البرنامج. يظهر عرض محتوى مثل هذا الملف في الشكل 9. وكان حجم هذا الملف 48 بايت (40 بايت من محتوى الكتلة + 4 بايت من الرأس + 4 بايت لوصف حجم المحتوى).





. 9. «stat» .



للحصول على وصف مرئي أكثر للكتل الثلاث التالية أثناء كتابة هذا المقال ، قررت إنشاء جلسة متعددة أكثر تعقيدًا ، تتكون من مسارين وملفين وثلاثة مقاطع (الشكل 10). تبلغ مدة الملف الأول "Incoming_Call - 20200622_124844 - + 74999545237.wav" 281280 عينة. تبلغ مدة الملف الثاني "Outgoing_Call - 20200621_231753 - + 79536170218.wav" 63360 عينة. يحتوي المسار الأول المسمى "First" (تمت إعادة تسميته) على مقطعين. يتم إزاحة المقطع الأول من بداية الجلسة بمقدار 10 ثوانٍ (بمقدار 80000 عينة). يتم تمثيل المقطع بالمحتويات الكاملة للملف الصوتي الأول ، أي أن مدة المقطع هي نفسها مدة الملف. يتم إزاحة المقطع الثاني بمقدار 50 ثانية من بداية الجلسة (بمقدار 50 * 8000 = 400000 عينة). يتم تمثيل المقطع بالمحتوى غير المكتمل لملف الصوت الثاني. داخل مقطع معين ، يبدأ الصوت من بداية الملف ،لكنها تدوم 5 ثوان فقط (40000 عينة). وهذا يعني أن طول المقطع هو 5 ثوان. المسار الثاني المسمى "الثاني" يحتوي على مقطع واحد. يتم إزاحته من بداية الجلسة بمقدار ثانية واحدة (بمقدار 8000 عينة). يتم تمثيل هذا المقطع بمحتويات غير كاملة للملف الصوتي الأول. ضمن هذا المقطع لا يبدأ الصوت من البداية بل بعد 3 ثوانٍ ولكنه يحتوي عليه حتى النهاية. وبالتالي ، فإن إزاحة البيانات الصوتية داخل هذا المقطع هي 3 ثوانٍ (24000 عينة). ويتم حساب طول مقطع معين على أنه الفرق بين مدة الصوت المقابل وإزاحة البيانات الصوتية داخل المقطع. في هذه الحالة ، يكون طول المقطع 281280-24000 = 257280 عينة.يتم تمثيل هذا المقطع بمحتويات غير كاملة للملف الصوتي الأول. ضمن هذا المقطع ، لا يبدأ الصوت من البداية ، ولكن بعد 3 ثوانٍ ، ولكنه يحتوي عليه حتى النهاية. وبالتالي ، فإن إزاحة البيانات الصوتية داخل هذا المقطع هي 3 ثوانٍ (24000 عينة). ويتم حساب طول مقطع معين على أنه الفرق بين مدة الصوت المقابل وإزاحة البيانات الصوتية داخل المقطع. في هذه الحالة ، يكون طول المقطع هو 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 بايت. إذا كان حجم الكتلة في المثال الأول (السابق) من مسار واحد هو 156 بايت ، وفي المثال الحالي - 308 بايت ، فيمكن استخلاص النتيجة التالية. نظرًا لافتراض التجانس وتكافؤ المسارات ، يجب أن يكون لمناطق الوصف لكل مسار نفس الحجم. هذه المناطق ، إذا جاز التعبير ، هي كتل فرعية من كتلة "trks".تم تحديدها باللون الأزرق في الشكل. اتضح أن حجم أحد هذه الكتلة الفرعية هو 152 بايت. وفي بداية المربعات الفرعية المتتالية ، يوجد عنوان فرعي مكون من أربعة بايت ، مُشار إليه في الشكل بتعبئة باللون الأصفر. هذه البايتات الأربعة ليست أكثر من قيمة عدد المسارات في جلسة متعددة ، أو عدد الكتل الفرعية. وهكذا ، يمكن حساب الحجم S لمحتويات كتلة "trks" بالصيغة S = 4 + 152 * n ، حيث n هو عدد المسارات في الجلسة. إذن فهي: 4 + 152 * 1 = 156 ، و 4 + 152 * 2 = 308.يمكن حساب الحجم S لمحتويات كتلة "trks" بالصيغة S = 4 + 152 * n ، حيث يمثل n عدد المسارات في الجلسة. إذن فهي: 4 + 152 * 1 = 156 ، و 4 + 152 * 2 = 308.يمكن حساب الحجم S لمحتويات كتلة "trks" بالصيغة S = 4 + 152 * n ، حيث يمثل n عدد المسارات في الجلسة. إذن فهي: 4 + 152 * 1 = 156 ، و 4 + 152 * 2 = 308.





. 11. «trks».



الآن دعنا ننتقل إلى وصف محتويات الكتلة الفرعية. يوجد الكثير هناك ، لكنني قمت بفك شيفرة الأكثر أهمية فقط. هناك ثلاث معلمات فقط: 4 بايت من الأعلام الثنائية (محاطة بدائرة باللون الأحمر) ، واسم المسار (محاط بدائرة باللون البني) ، ومعرف المسار (محاط بدائرة باللون الأزرق). معرف المسار هو رقم التسلسل الخاص به. من الضروري الإشارة إلى ارتباط إلى مسار في وصف المقاطع الصوتية (المزيد حول هذا لاحقًا). يحتل اسم المسار مساحة 36 بايت. هذا هو الحد الأقصى لعدد الأحرف في اسم المسار ، ولكن يمكن أن يكون أقل ، كما في المثال الحالي. البايت غير المستخدمة هي صفر. في جلسة متعددة مع التسجيلات الصوتية للمكالمات الهاتفية ، ستطابق أسماء المسار تسجيل التواريخ المقابلة. يمكنك إضافة اليوم المقابل من الأسبوع بجوار التاريخ في حرفين كبيرين في شكل مختصر.أربعة بايتات من الأعلام الثنائية (إجمالي 32 علامة) تستخدم لوصف المعلمات الثنائية الخاصة بالمسار. في الواقع ، قد يكون هناك أقل من 32 منهم ، لقد قمت بفك تشفير جزء من الأعلام فقط. من بين هؤلاء ، تشير ثلاثة أعلام على الأقل إلى ما إذا كان المسار "R" (تسجيل) أو "S" (منفرد) أو "M" (كتم الصوت). في المثال أعلاه ، لم يتم الضغط على أي من هذه الأزرار الثلاثة الموجودة على المسارات ، وقيمة العلامات الثنائية هي صفر (0x00000000). ولكن إذا ضغطت على الزر "R" على المسار (أي ، قم بتسجيل المسار) وأعدت حفظ الجلسة ، فستكون قيمة الأعلام الثنائية مساوية لـ 0x00000004 ، بمعنى آخر ، ستصبح البتة الثالثة من اليمين (بت 2) واحدة. هذا الجزء هو المسؤول عن خاصية "السجل" للمسار. هذه الخاصية ليس لها معنى في مشروعي ، لأن جلستي المتعددة مصممة للعرض المرئي والتشغيل.ومع ذلك ، خطرت لي فكرة الضغط على الزر "R" على تلك المسارات التي تتوافق مع عطلة نهاية الأسبوع. ستجعل هذه التقنية من السهل تصور الجلسة المتعددة.



تتكون كتلة قائمة الملفات الصوتية لـ "LISTFILE" متعددة الجلسات (الشكل 12) من الأجزاء التالية. كما في حالة كتلة وصف المسار ، يمكن أيضًا تقسيمها إلى كتل فرعية وفقًا لعدد الملفات في الجلسة. على غرار الشكل 11 ، قمت أيضًا بتمييز رأس كتلة 8 بايت في مربع أحمر وحجم محتواه في مربع أخضر. في هذا المثال بالذات ، هذه القيمة هي 188 بايت. يتم تمييز المحتوى بالقياس مع الشكل. 11. وهي مقسمة إلى منطقتين مظللتين بخط أزرق. هذه هي الكتل الفرعية لقائمة الملفات.





الشكل: 12. بايت من كتلة وصف الملفات الصوتية "LISTFILE".



تتوافق كل مجموعة فرعية مع ملف صوتي واحد. يستخدم المثال ملفين صوتيين ، لذا فإن عدد الكتل الفرعية مناسب. على عكس الحالة السابقة مع أوصاف المسار ، لا يوجد عنوان فرعي حول عدد الكتل الفرعية. تحتوي الكتلة الفرعية على 4 بايت من رأس "wav" (مميز باللون الأسود) و 4 بايت تشير إلى حجم المحتوى الإضافي (المميز باللون الأرجواني). لكلتا الكتلتين الفرعيتين ، هذه القيمة هي نفسها في هذا المثال وهي 0x56 (86) بايت. هذا يرجع إلى حقيقة أن الملفات موجودة في نفس المسار ولها نفس الاسم. بتعبير أدق ، تحتوي أسماء الملفات المؤهلة بالكامل على نفس عدد الأحرف. خلاف ذلك ، سيكون للوحدات الفرعية أحجام مختلفة. تحتوي منطقة محتوى الكتلة الفرعية (مزيد من البايتات) على المعلومات التالية. يتم تمييز الرقم الذي يعرف ملف صوتي في إطار أزرق.على عكس معرف المسار ، فإن هذا الرقم ليس رقم تسلسل ملف. كما أفهمها ، عند حفظ جلسة متعددة ، يتم تعيينها بشكل عشوائي أو شبه عشوائي لكل ملف. الشيء الرئيسي هو أنه لا توجد مصادفة بين هذه القيم. لقد اقتنعت بهذا عندما قمت بحفظ الجلسة المتعددة مرتين وقارنت ملفات ses حسب المحتوى. نتيجة لذلك ، اتضح أن الملفات تختلف فقط بنفس وحدات البايت. وليس هؤلاء فقط. يتم أيضًا تعيين رقم عشوائي لمعرف طبقات الغلاف في كتلة "ep20". لكن في هذه الكتلة كما ذكرنا أعلاه ، لا داعي لها إطلاقاً ، ولن يتم النظر في وصفها في هذه المقالة. هناك حاجة إلى معرفات الصوت لربطها بالمقاطع. يحدث هذا الارتباط في الكتلة مع وصف المقاطع.في حالتي ، بالنسبة لجلسة متعددة مع محادثات هاتفية ، ستكون معرفات الملفات الصوتية عبارة عن سلسلة من الأرقام الطبيعية ، ولكن لا تبدأ من الصفر ، ولكن ، على سبيل المثال ، من 1000. البايتات الأربعة التالية ، التي لم أقم بتمييزها ، في كلا الكتلتين الفرعيتين لها القيمة 0x13. على الأرجح ، تشير هذه القيمة إلى نوع تنسيق ملف الصوت. يمكنك اعتبار هذه القيمة ثابتة بشكل مشروط ، لأن جميع ملفاتي الصوتية من نفس النوع. تصف سلسلة البايت التالية الاسم الكامل لملف الصوت ، مع فاصل فارغ (مثل فاصل سطر). يزيد حجم هذه السلسلة بمقدار واحد عن عدد الأحرف في الاسم الكامل لملف الصوت. يأتي بعد ذلك الثابت 0xFFFFFFFF. تليها قيمة تشير إلى عدد العينات في هذا الملف الصوتي (في الشكل 12 مظلل بإطار أصفر). بالنسبة للملف الأول ، هذه القيمة هي 0x44AC0 ، والثانية هي 0xF780.إنها تتوافق فقط مع القيم العشرية 281280 و 63360 ، على التوالي ، والتي ظهرت بالفعل أعلاه في وصف المثال الثاني متعدد الجلسات.



أخيرًا ، يبقى أن ننظر في وصف الكتلة الأكثر صعوبة - وهي الكتلة لوصف المقاطع الصوتية "bk20" (الشكل 13). عن طريق القياس مع الشكلين السابقين ، يتم تمييز عنوان وحجم محتوى الكتلة.





الشكل: 13. بايت من كتلة وصف المقاطع الصوتية "bk20".



في محتوى الكتلة ، أولاً وقبل كل شيء ، هناك عنوانان فرعيان ، كل منهما 4 بايت. يتم تمييزها بتعبئات أرجوانية وسماوية. العنوان الفرعي الأول هو عدد المقاطع في الجلسة. هناك ثلاثة منهم في المثال. العنوان الفرعي الثاني هو الثابت 0x48 (72). يبدو أنه يشير إلى حجم كل كتلة فرعية ، ويذهبون إلى أبعد من ذلك. يتطابق عددهم مع عدد المقاطع في الجلسة. يصف كل مقطع فرعي من هذا القبيل معلمات مقطع واحد. بالمناسبة ، اتضح أن حجم D لمحتوى كتلة "bk20" يمكن حسابه بالصيغة D = 8 + 72 * b ، حيث b هو عدد المقاطع الصوتية في جلسة متعددة. في الشكل ، لا توجد تخصيصات تفسيرية للبايت داخل الكتل الفرعية ، نظرًا لوجود الكثير من المعلمات الضرورية. تم سردها في جدول منفصل (الشكل 14). يحدد التعبئة الزرقاء تلك المعلمات الضرورية في مشروعي ، والتعبئة الرمادية - ثوابت غير معروفة.يعرض هذا الجدول أيضًا قيم المعلمات لكل مقطع من المقاطع الثلاثة متعددة الجلسات من المثال الأخير.





. 14. .



الكلمة الأولى (مجموعة من 4 بايت) هي إشارة إلى المغلف ، والتي لا نحتاجها. المعلمة الثانية هي ارتباط إلى ملف الصوت. قيمة هذه المعلمة تساوي قيمة معرف ملف الصوت الذي يتوافق معه مقطع الصوت هذا. ثم هناك ثابتان حقيقيتان ظهرتا من قبل. ويتبعها ثلاثة معلمات تنسيق معبر عنها في عدد العينات: إزاحة المقطع من بداية الجلسة ، وطول (مدة) المقطع في الجلسة ، وإزاحة الصوت داخل المقطع. يجب أن يكون كل شيء واضحًا من أسماء هذه المعلمات. قبل ذلك بقليل ، عند وصف المثال الثاني من الجلسات المتعددة بالتفصيل ، أشرت إلى القيم العددية لجميع عمليات الإزاحة والمدد. في الشكل 14 ، يسرد الجدول المعلمات لكل مقطع في شكل سداسي عشري. لقد أدخلت هذه القيم في الجدول بإعادة كتابتها مباشرة من الشكل 13.ولكن إذا قمت بتحويلها إلى شكل عشري ، فسوف تتطابق مع القيم المقابلة من وصف المثال الثاني (تم التحقق منها بشكل منفصل). وتجدر الإشارة إلى أن الروابط إلى الملف الصوتي للمقطعين الأول والثالث لها نفس القيمة 0x3F5B050 ، لأن كلا المقطعين يشيران إلى نفس الملف الصوتي مع المعرف المقابل. ويتبع ذلك كتلة بايت من المعلمات الثنائية (4 بايت). كما في حالة وصف المسارات ، قمت بفك تشفير جزء فقط من البتات. القيمة الافتراضية هي 0x00080000 ، أي إذا تمت ترجمتها إلى ثنائي ، فسيتم "رفع" بت 19 واحد فقط إلى واحد ، والباقي 31 بت يساوي الصفر. بدون هذه القطعة الفردية ، كما أظهرت الممارسة ، ترفض الجلسة المتعددة التحميل. في المثال الحالي ، هذه القيمة مميزة للمقطعين الأول والثاني ، ولكن بالنسبة للمقطع الثالث ، لسبب ما ، فإن قيمة العلامات تساوي 0x000A0000.إذا كنت تحسب ، فسيتم "رفع" بتين في هذه القيمة: لا يزال bit19 و bit17 آخر. لا أعرف لماذا حدث ذلك. حاولت إعادة تعيين bit17 إلى الصفر ، مع تغيير قيمة المعلمة بالكامل إلى 0x00080000 ، كما هو الحال في المقاطع المجاورة. نتيجة لذلك ، تم فتح الجلسة في Adobe Audition دون أي تغييرات مرئية. أثناء العمل في Adobe Audition ، لاحظت خصائص مقطع مثل "Fix in Time" و "Fix for Playback Only". من المنطقي أن نفترض أن بعض البتات في كتلة المعلمات الثنائية مسؤولة عن تخزين هذه الخصائص. هناك أيضًا خصائص ثنائية أخرى للمقاطع ، لكننا لسنا بحاجة إليها. وستكون الخصائص المدرجة في القائمة مفيدة للغاية. تعد خاصية "الإصلاح في الوقت المناسب" مفيدة لأن المقطع سيتم حمايته من إمكانية الحركة العرضية لمؤشر الماوس في الاتجاه الأفقي.ولكن في مثل هذا المقطع ، سيتم رسم رمز على شكل قفل في دائرة بشكل مرئي في الزاوية اليسرى السفلية ، وهذه معلومات رسومية غير ضرورية للعرض. الخاصية الثانية للمقطع "Fix for playback only" مفيدة في أنه عندما يتم تنشيط المعلمة "R" (تسجيل) على المسار المقابل ، لن يكتسب المقطع اللون الأحمر القسري. لما قررت استخدام المعلمة "R" في بعض المسارات - فهي مكتوبة أعلاه. من الناحية التجريبية ، اكتشفت أن bit1 مسؤول عن الخاصية الأولى للمقطع ، و bit3 للثانية. من كل ما قيل ما يلي. لتعيين خاصية Clip in Time ، تحتاج إلى كتابة القيمة 0x00080002 إلى المعلمات الثنائية. الخاصية Commit For Playback Only هي 0x00080008. لكلتا الخاصيتين ، مجموعها المنطقي هو 0x0008000A. التعامل مع المعلمات الثنائية.بعد هذه البايتات يوجد ارتباط بالمسار الذي يوجد عليه المقطع. في الواقع ، تم تسجيل معرف المسار ، والذي يتزامن مع رقمه التسلسلي. بالمناسبة ، لا يدعم Adobe Audition 1.5 أكثر من 128 مسارًا ، لذلك يتناسب هذا المعرف في بايت واحد ، على الرغم من إدراجه كقيمة 32 بت. ثم هناك ثوابت صفرية غير مفككة (4 ثوابت ، 4 بايت لكل منها). أخيرًا ، المعلمة الأخيرة المهمة هي لون المقطع. يسمح لك محرر Adobe Audition 1.5 بتعيين قيمة لون من 0 إلى 239 لمقطع في مربع الحوار المقابل أو تحديده من لوحة (الشكل 15). لوحة الألوان ليست مرضية بشكل خاص ، ولكن لم يتم تقديم خيارات أخرى. لون المقطع الافتراضي هو 102 (0x66) (أخضر).بالمناسبة ، لا يدعم أكثر من 128 مسارًا ، لذا فإن مثل هذا المعرف يناسب بايت واحد ، على الرغم من أنه مدرج كقيمة 32 بت. ثم هناك ثوابت صفرية غير مفككة (4 ثوابت ، 4 بايت لكل منها). أخيرًا ، المعلمة الأخيرة المهمة هي لون المقطع. يسمح لك محرر Adobe Audition 1.5 بتعيين قيمة لون من 0 إلى 239 لمقطع في مربع الحوار المقابل أو تحديده من لوحة (الشكل 15). لوحة الألوان ليست مرضية بشكل خاص ، ولكن لا يتم تقديم خيارات أخرى. لون المقطع الافتراضي هو 102 (0x66) (أخضر).بالمناسبة ، لا يدعم أكثر من 128 مسارًا ، لذا فإن مثل هذا المعرف يناسب بايت واحد ، على الرغم من أنه مدرج كقيمة 32 بت. ثم هناك ثوابت صفرية غير مفككة (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 هي 32 بت ، وفي الواقع لا يوجد سوى 240 لونًا ، والتي تتناسب مع بايت واحد. البايتات الثلاثة الأخرى الأكثر أهمية هي صفر. كانت لدي فكرة أنه إذا حاولت تعديل هذه البايت لقيم مختلفة ، فعند فتح جلسة متعددة ، ستظهر ألوان جديدة على المقطع. لكن هذه الحيلة لم تنجح. كما تمت مناقشته في المقالة السابقة ، تعد الألوان في المخطط مفيدة لإبراز ميزة معينة في مكالمة هاتفية بشكل مرئي. ستشبه الجلسة المتعددة من التسجيلات الصوتية للمكالمات الهاتفية مخططًا مشابهًا ، لذا سيكون لون المقاطع مفيدًا جدًا. يتبع معلمة لون المقطع كلمتين من الأصفار. هذا يكمل وصف الوحدة الفرعية. هذه البايتات الثمانية من الأصفار هي الأخيرة في الكتلة الفرعية للكتلة الأخيرة. لذلك ، ستكون أيضًا الأخيرة في ملف ses بأكمله.



أثناء التفكير في المشروع ، توصلت إلى فكرة أخرى: إضافة علامات (نقاط تلميح) إلى الجلسة المتعددة ، ووضعها كل ساعة وتوقيع العلامات المقابلة لها. إذا قارنا هذه الفكرة بالمقال السابق ، فهذا تشبيه كامل للخطوط الرأسية على الرسم التخطيطي ، المرسومة كل ساعة. من أجل أن تكون النقاط الأساسية حاضرة في الجلسة المتعددة ، من الضروري مراعاة الكتلة السادسة المسماة "الإشارات". لم أكلف نفسي عناء فهم وحدات بايت هذه الكتلة. بالتشابه مع كتلة "stat" ، في الجلسة المتعددة التي تم إنشاؤها لمدة 24 ساعة ، قمت بوضع 23 نقطة رئيسية يدويًا كل ساعة وأعطيتهم الأسماء المناسبة. ثم قمت بحفظ الجلسة المتعددة كملف ses منفصل ، وقمت بقص محتويات كتلة "الإشارات" وحفظها في ملف "cues_24h.BLK". سيؤخذ هذا الملف في الاعتبار عند تطوير البرنامج. وحدات بايت هذا الملف موضحة في الشكل 16. لا أعرف لماذا ،لكنني قمت بحفظ المحتوى بالضبط ، بدون العنوان ومجال حجم المحتوى (على عكس "stat_31_full.BLK"). ستتم إضافة هاتين الكلمتين إلى رمز البرنامج. وحجم المحتوى 556 بايت. من بين هذه ، 4 بايت يشغلها العنوان الفرعي (عدد نقاط التلميح) و 23 كتلة فرعية من 24 بايت لكل منها. في الشكل 16 ، يتم ملء وحدات بايت المحتوى الخاصة بالكتلة الفرعية الأولى. قررت أن أجعل أسماء النقاط الأساسية (الملصقات) على النحو التالي: 01h ، 02h ،… ، 23h.





. 16. «cues» .



هذا يختتم وصف تنسيق الجلسات المتعددة. الآن لدينا قاعدة المعرفة اللازمة لبدء كتابة برنامج لإنشاء جلسة متعددة. تعد كتابة برنامج مهمة أسهل من تعلم تنسيق ses وفك تشفيره. أكملت البرنامج في أمسيتين ، وقضيت أسبوعًا واحدًا على الأقل في دراسة التنسيق. علاوة على ذلك ، قمت بكتابة البرنامج باستخدام الوظائف المستخدمة سابقًا ، على وجه الخصوص ، العمل مع الملفات والأدلة. لذلك ، لم يكن الدعم الأساسي لكتابة البرنامج هو الكتب المرجعية أو الإنترنت ، ولكن مشاريعي السابقة ، التي كتبت عنها أيضًا على حبري. من الإنترنت ، أخذت وظيفة واحدة فقط تُرجع يوم الأسبوع بالتاريخ. لكن قبل الاستشهاد بنص البرنامج ، قررت مشاركة المزيد من المعلومات ، التي لم أرغب في الكتابة عنها في هذه المقالة في البداية.



خطرت لي فكرة تشكيل جلسة متعددة من تسجيلات الهاتف عندما كنت أعمل في إصدار أحدث من Adobe Audition 3.0 ، والذي يدعم إدخال / إخراج الصوت عبر ASIO. عند حفظ الجلسة المتعددة ، وجدت أنه يمكن حفظها بتنسيقين حسب الاختيار: تنسيق SES الكلاسيكي المعتاد وتنسيق XML الجديد ، والذي لم يكن موجودًا في الإصدارات السابقة من البرنامج. بعد حفظ الجلسة بتنسيق XML ، فتحت هذا الملف على الفور في المفكرة ، حيث وجدت وصفًا لمجموعة من المعلمات المرتبطة معًا في بنية هرمية معقدة. لتسهيل عرض هذا التسلسل الهرمي ، استخدمت برنامج WMHelp XmlPad. يوضح الشكل 17 لقطة شاشة لهذا البرنامج مع ملف تجريبي بسيط متعدد الجلسات مفتوح فيه. على اليسار هو التسلسل الهرمي للمستند. العنصر النشط (المحدد) للتسلسل الهرمي هو معلمة الطول لملف الصوت الأول ،يقف في الوحدة الفرعية الأولى من كتلة وصف الملف الصوتي.





. 17. XML Adobe Audition 3.0.



قررت دراسة هذا التنسيق المعين ، وفي المستقبل إنشاء نص XML المطلوب برمجيًا ، والحصول على الجلسة المتعددة المرغوبة في الإخراج. كانت هناك فكرة لاستخدام Excel لهذا الغرض. تكمن الصعوبة في أن حوالي 95٪ من ملف XML بأكمله يشغلها كتلة وصف المسار. هناك عدد هائل من المتغيرات ، التي لم أستطع استبعادها دون الإضرار بتعدد الجلسات. الحقيقة هي أنه في هذا الإصدار من Adobe Audition ، هناك العديد من الوظائف المتعلقة بالمسارات. منطقيا ، ليست هناك حاجة لهذه الوظائف لجلستي المتعددة البسيطة. ومع ذلك ، من خلال استبعاد الحقول المقابلة من وثيقة XML ، تتوقف الجلسة عن العمل. وسأضطر إلى "سحب" هذا الجزء الضخم من النص في وصف كل مسار لأبسط جلسة. هذا هو الإزعاج الوحيد عند إنشاء ملف XML متعدد الجلسات. المعرفه،كانت المتغيرات متعددة الجلسات التي تم الحصول عليها أثناء دراسة XML النصية مفيدة بالطبع أثناء دراسة البرامج الثنائية. وحتى في XML ، لم أتمكن من فك تشفير بعض المعلمات. تحتوي حقول كل معلمة على اسم مختصر باللغة الإنجليزية ، ولكن مع ذلك ، لم أفهم دائمًا ماهية هذه المعلمة. الشيء الرئيسي هو أنني تمكنت من دراسة وفك رموز المعلمات الأساسية الضرورية ، وكتلها الهرمية ومجالاتها. ثم شعرت بالعذاب لفترة طويلة من السؤال: كيف أفتح مثل هذه الجلسة في إصدار أقدم من Adobe Audition؟ تحتوي الإصدارات الجديدة من البرامج على واجهة معقدة للغاية (تقريبًا ثلاثية الأبعاد) ، وهو أمر غير مريح للغاية لتصور جلسات متعددة مثل الرسوم البيانية. وبسبب هذا "three-te" في Adobe Audition 3.0 مع نافذة ممتدة بالكامل على شاشة FullHD ، فإن الحد الأقصى (على مقياس أدنى) من 28 مسارًا مناسبًا. وفي Adobe Audition 1.5 ، سيكون 37 مناسبًا (الشكل.18 ، مقياس 1: 2). في المجموع ، يلزم عرض 31 مسارًا على الشاشة.





. 18. Adobe Audition .



لكن الأهم من ذلك كله أنني أنهيت جودة الصوت عند تشغيل جلسة متعددة بتردد 8000 هرتز في الإصدار الجديد من البرنامج. الصوت ليس جيدًا جدًا ، هناك تشويه متناسق. ويرجع ذلك إلى حقيقة أن الصوت يخرج بمعدل عينة مختلف (48 كيلو هرتز) ، ولا يمكن لـ ASIO القيام بخلاف ذلك. إذا حددت جهاز إخراج آخر "Audition 3.0 Windows Sound" في الإعدادات ، فلن يتغير الموقف. الإصدار الجديد من البرنامج لا يدعم أجهزة الإخراج "DirectSound" الكلاسيكية (أسمي الإصدار 3.0 الجديد). يوضح الشكل 19 طيف الصوت عند تشغيل صوت 8 كيلو هرتز (أو جلسة) في Adobe Audition 3.0 مع وجود تشويه توافقي للطيف معكوس. هذه الترددات محاطة بدائرة باللون الأخضر ، والتي يجب أن تبدو مثالية (ولا شيء غير ذلك). والترددات محاطة بدائرة باللون الأحمر ،وهي تشويه إضافي. هذا التأثير على الأرجح بسبب عدم وجود تصفية بعد إجراء أخذ العينات. بعد ذلك قررت أن أتولى دراسة التنسيق الثنائي SES لبرنامج Adobe Audition 1.5 الأبسط والأكثر متعة. كنت آمل أنه بعد تعلم تنسيق XML "البشري" من إصدار أحدث من البرنامج ، لن يكون من الصعب علي فهمه ، نظرًا لتجربتي مع الملفات الثنائية. وقد حدث ذلك: لقد "روّجت" سريعًا لتنسيق SES. والشيء الرئيسي هو أن التوافق مع الإصدارات السابقة ، بالنظر إلى المستقبل ، يعمل بشكل جيد: تم فتح جلسة مكونة للإصدار 1.5 بنجاح في الإصدار 3.0. أعلاه ، أشرت إلى عيوب Adobe Audition 3.0 المتعلقة بجودة الصوت والواجهة الرسومية. لكن هذا الإصدار من البرنامج له مزايا في التنقل متعدد الدورات. على سبيل المثال،هناك إمكانية الاستماع المنطوق لمقطع صوتي واحد في جلسة متعددة بالضغط عليه بالماوس ثم الانتقال إلى اليمين.





الشكل: 19. تشويه متناسق أثناء التشغيل.



الآن سأقدم نص البرنامج تحت المفسد. البرنامج ، بالطبع ، ليس لديه واجهة رسومية ، لأنه غير مطلوب لهذه المهمة. تم تزويد نص البرنامج بتعليقات مفصلة ، لذلك لا حاجة إلى شرح إضافي. يتم تشغيل البرنامج على سطر الأوامر وفي غضون ثانية يعالج قائمة من أربعمائة ملف ، وتشكيل ملف متعدد الجلسات. داخل البرنامج ، هناك أربعة متغيرات حدية ، إذا رغبت في ذلك ، تسمح لك بعدم إنشاء علامات تلميح ، وليس وضع "R" على المسارات في عطلات نهاية الأسبوع ، وليس لتعيين خاصية "الإصلاح في الوقت المناسب" على المقاطع ، وتحديد معيار مقاطع التلوين (حسب نوع المكالمة أو عن طريق أرقام الهاتف) ... يجب استبعاد هذه المتغيرات الثلاثة من نص البرنامج و "إخراجها" ، أي في ملف منفصل مع معلمات البرنامج.



كود المصدر لبرنامج سي
/********************************************************************
  "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" قيد المعالجة ، أي سجلات شهر مايو من العام الحالي. تم معالجة ما مجموعه 446 سجلاً. عدد الكتل هو نفسه ، حيث لا توجد سجلات مع الانتقال إلى يوم جديد.





الشكل: 20. منظر للجلسة المتعددة بمقياس كامل مع التلوين بالهاتف. أعداد.





الشكل: 21. عرض متعدد الجلسات بمقياس كامل مع التلوين حسب نوع المكالمة.





الشكل: 22. نوع الدورة المتعددة على نطاق متوسط.





الشكل: 23. عرض متعدد الجلسات على نطاق واسع.





الشكل: 24. عرض نفس الجلسة المتعددة في Adobe Audition 3.0.






All Articles