Pembentukan perangkat lunak Adobe Audition multisesi dengan rekaman audio panggilan telepon

Pada artikel sebelumnya, saya menulis tentang menghasilkan grafik vektor SVG dengan diagram panggilan telepon yang menyerupai grafik Gantt. Saya mengambil informasi tentang panggilan telepon dari detailnya, yang saya unduh melalui akun saya di situs web operator seluler. Itu hampir empat tahun lalu. Saat ini, saya punya ide untuk membuat proyek lebih rumit: membuat multisesi di editor suara Adobe Audition 1.5 dari rekaman audio percakapan telepon. Pada saat yang sama, tempatkan rekaman audio ini dalam multisesi secara ketat sesuai dengan waktu, serta tanggal yang sesuai dengan trek. Pada saat yang sama, secara visual, multisesi seperti itu akan menyerupai diagram yang sama yang dibuat di artikel sebelumnya. Selain itu, dimungkinkan untuk dengan cepat mengukur dan mendengarkan rekaman percakapan telepon, baik dalam mode "campuran" dan "solo" pada siang hari.



Saya memutuskan untuk membangun multisesi dari rekaman audio yang terakumulasi selama satu bulan kalender untuk menghindari kekacauan yang tidak perlu untuk Adobe Audition. Tentu saja, sesi seperti itu dapat dibuat secara manual, tetapi ini merupakan pekerjaan yang panjang dan melelahkan. Kepentingan utama dari tugas ini adalah untuk mengotomatiskan pembangunan multisesi dengan perangkat lunak. Lebih tepatnya, tulis program yang, berdasarkan daftar file rekaman audio, akan menghasilkan file SES untuk multisesi Adobe Audition. Bagi mereka yang tidak tahu: multisession, singkatnya, adalah proyek yang terdiri dari banyak rekaman audio berbeda yang didistribusikan dalam waktu dan lebih dari trek (trek) dan dirancang untuk membuat campuran darinya.



Pertama-tama, ada baiknya membahas bagaimana saya menerima rekaman audio percakapan telepon. Bukan rahasia lagi kalau smartphone modern memiliki kemampuan untuk merekam panggilan telepon dengan berbagai alat, baik yang terintegrasi dalam sistem maupun pihak ketiga. Secara pribadi, saya menggunakan tablet Lenovo TAB3 (dengan prosesor MT8735P). Perangkat ini memungkinkan Anda membuat rekaman audio dalam mode manual dalam format terkompresi, menerima file dengan ekstensi 3gpp. Rekaman diperoleh dalam stereo dengan saluran terpisah: suara pelanggan direkam di satu saluran, dan suaranya sendiri di saluran lain. Format terkompresi dari rekaman audio mempengaruhi distorsinya selama pemutaran. Karena itu, saya menggunakan aplikasi perekaman audio pihak ketiga, yang jumlahnya tak terhitung jumlahnya. Salah satu aplikasi yang paling saya suka adalah "Rekam Panggilan Saya".Aplikasi ini merekam panggilan dalam mode otomatis, memiliki banyak pengaturan yang terkait, khususnya, dengan pilihan format dan kualitas rekaman audio. Dan juga, sebagai bonus, aplikasi memiliki log panggilan built-in yang sangat nyaman, yang disimpan ke file database db (Gbr. 1).





Angka: 1. Log panggilan di aplikasi "Rekam Panggilan Saya".



Parameter perekaman audio terbaik untuk kualitas suara adalah Stereo WAV 8000Hz 16bit. Dengan pengaturan seperti itu, rekaman tidak mengalami distorsi, terdengar jernih, meski membutuhkan lebih banyak ruang memori. Aplikasi ini dikonfigurasi sedemikian rupa sehingga rekaman audio dimulai secara otomatis bahkan sebelum percakapan telepon dimulai: ketika panggilan masuk tiba sebelum "mengangkat penerima" atau saat memanggil nomor selama dering. Artinya, panggilan tak terjawab dan tak terjawab juga direkam. Dapat dikonfigurasi untuk merekam percakapan saja. Format nama file rekaman audio juga dapat dikonfigurasi. Dalam kasus saya, saya mengonfigurasinya seperti yang ditunjukkan pada Gambar 2.





Gambar. 2. Setting format nama file pada “Record My Call”.



Selama pengembangan program generasi multisesi, informasi tentang tanggal dan waktu rekaman audio panggilan telepon perlu dilakukan. Informasi ini akan diambil dari nama file pada posisi tetap.



Sebelum Anda mulai membuat file SES multisesi, Anda perlu memahami cara kerja file tersebut. Tentu saja, tidak ada dokumentasi dalam format ini di mana pun, jadi saya harus menyelesaikannya sendiri, dengan mengandalkan pengalaman dan pengetahuan pribadi. File ini bukan file teks, jadi tidak ada gunanya membukanya di Notepad. "WinHex" - editor heksadesimal datang untuk menyelamatkan. Saya telah menulis sejumlah artikel tentang bekerja dengan data biner dan mendekripsi informasi, khususnya, artikel tentang menulis program pengemasan ulang video 264-avi. Di sana saya menulis kurang lebih secara rinci tentang perangkat file avi.



Pertama, saya membuat multisesi arbitrer sederhana di Adobe Audition 1.5, terdiri dari satu trek dan satu file audio (Gbr. 3), menyimpannya ke file dengan ekstensi ses. File ini berukuran 2422 byte. Kemudian saya membuka file ini di WinHex (Gbr. 4).





Angka: 3. Tampilan multisesi dalam Adobe Audition 1.5 - Contoh 1.





Gambar. 4. File multisession dibuka di WinHex.



Sekilas, tidak ada yang jelas sama sekali. Di bagian simbolik jendela, Anda dapat melihat kata-kata semantik "KEREN", "hdr", "Master". Jika Anda menelusuri dokumen di bawah, Anda dapat melihat teks yang berisi jalur lengkap ke file (dan, dalam dua versi), yang digunakan dalam multisesi. Ini ditunjukkan pada Gambar 5 dan dilingkari dengan warna hijau. Yang langsung mencolok adalah kata-kata semantik pendek yang dilingkari dalam bingkai merah pada gambar yang sama.





Angka: 5. Byte jalur ke file audio multisesi.



Melihat lebih dekat dokumen ini dari awal sampai akhir, saya memperhatikan beberapa kata semantik pendek lainnya. Saya juga memperhatikan bahwa panjang kata yang bermakna adalah kelipatan empat. Rupanya, kata-kata ini adalah header dari blok yang menyusun seluruh file multisesi. Ini mengingatkan saya pada struktur RIFF dari file avi atau wav yang terdiri dari blok yang juga memiliki header dengan ukuran yang sama. Header ini diikuti oleh nomor 32-bit (4 byte) yang menunjukkan ukuran blok saat ini. Dengan mengingat fakta ini, saya memutuskan untuk memeriksa apakah prinsip ini berfungsi untuk file ses? Ternyata dalam kasus format ses, ini juga berfungsi (gbr. 6).





Angka: 6. Kesamaan dengan struktur RIFF (misalnya, blok "WLST").



Kata pertama "KEREN" dalam file ses tampaknya adalah header utama dan jenis file ini. 4 byte berikutnya adalah ukuran konten yang ditempatkan di sebelah, hingga akhir file. Artinya, jika Anda menghitung dengan cermat, nilai ini 12 byte lebih kecil dari ukuran seluruh file. Dan konten selanjutnya terdiri dari kumpulan blok yang berbeda. Blok tersebut memiliki header empat atau delapan byte, diikuti oleh 4 byte yang menunjukkan ukuran blok ini, dan setelah mereka isi blok ini mengikuti. Di beberapa blok, saya mengidentifikasi keberadaan subblok, tetapi ini akan dibahas dalam penjelasan yang lebih rinci dari setiap blok. Dalam file ini, yang dalam contoh, saya menghitung 17 blok, mereka terdaftar dalam tabel pada Gambar 7.





Gambar. 7. Daftar blok yang membentuk multisesi.



Seperti yang Anda lihat dari tabel, beberapa informasi yang sama disajikan dalam versi berbeda dengan blok yang berbeda. Ini mungkin dilakukan untuk kompatibilitas berbagai versi program. Ke depan, blok-blok itu disorot dengan warna hijau, tanpanya multisesi yang disajikan dalam contoh tidak akan ada. Dua blok 4-byte disorot dengan warna abu-abu, yang merupakan fiktif dalam sesi ini. Memang, saya punya pertanyaan: apa yang akan terjadi jika Anda menghapus beberapa blok dari file? Bagaimanapun, saya, misalnya, tidak memerlukan informasi tentang metronom dan tempo, dan amplop pada klip (lebih tepatnya, pada satu klip) tidak ada dalam contoh sederhana saya. Amplop adalah kurva di atas klip audio yang mengatur dinamika parameter suara (volume, keseimbangan) dari waktu ke waktu. Saya secara berurutan mulai memotong blok dari file yang diberikan,tidak lupa menghitung ulang dan mengoreksi nilai setelah kata "KEREN". Hasilnya, multisesi berhasil dibuka dengan setidaknya lima blok berwarna hijau. Sesi ini berisi dua blok dari daftar file audio. Salah satu dari mereka bisa ditinggalkan. Saya lebih suka opsi kedua (blok "LISTFILE"), karena pada opsi pertama (blok "WLST") ada dua byte per karakter dalam deskripsi jalur file. Ini mungkin telah dilakukan untuk karakter alfabet yang diperluas, tetapi alfabet ASCII standar sudah cukup bagi saya. Selain itu, karakter Rusia, seperti yang Anda lihat, didukung dengan baik. Deskripsi klip audio disajikan dalam tiga versi. Saya memilih opsi pertama (blok "bk20"), karena saya menemukan deskripsinya paling cepat.Sesi ini berisi dua blok dari daftar file audio. Salah satu dari mereka bisa ditinggalkan. Saya lebih suka opsi kedua (blok "LISTFILE"), karena pada opsi pertama (blok "WLST") ada dua byte per karakter dalam deskripsi jalur file. Ini mungkin telah dilakukan untuk alfabet karakter yang diperluas, tetapi alfabet ASCII standar sudah cukup bagi saya. Selain itu, karakter Rusia, seperti yang Anda lihat, didukung dengan baik. Deskripsi klip audio disajikan dalam tiga versi. Saya memilih opsi pertama (blok "bk20"), karena saya paling cepat menemukan deskripsinya.Sesi ini berisi dua blok dari daftar file audio. Salah satu dari mereka bisa ditinggalkan. Saya lebih suka opsi kedua (blok "LISTFILE"), karena pada opsi pertama (blok "WLST") ada dua byte per karakter dalam deskripsi jalur file. Ini mungkin telah dilakukan untuk alfabet karakter yang diperluas, tetapi alfabet ASCII standar sudah cukup bagi saya. Selain itu, karakter Rusia, seperti yang Anda lihat, didukung dengan baik. Deskripsi klip audio disajikan dalam tiga versi. Saya memilih opsi pertama (blok "bk20"), karena saya paling cepat menemukan deskripsinya.tetapi alfabet ASCII standar sudah cukup bagi saya. Selain itu, karakter Rusia, seperti yang Anda lihat, didukung dengan baik. Deskripsi klip audio disajikan dalam tiga versi. Saya memilih opsi pertama (blok "bk20"), karena saya paling cepat menemukan deskripsinya.tetapi alfabet ASCII standar sudah cukup bagi saya. Selain itu, karakter Rusia, seperti yang Anda lihat, didukung dengan baik. Deskripsi klip audio disajikan dalam tiga versi. Saya memilih opsi pertama (blok "bk20"), karena saya paling cepat menemukan deskripsinya.



Multisesi dari rekaman audio percakapan telepon akan memiliki kerumitan serupa dengan multisesi yang disajikan dalam contoh ini. Satu-satunya perbedaan adalah bahwa itu akan lebih banyak: jumlah file audio akan cukup besar, dan jumlah trek akan sama dengan jumlah hari dalam sebulan. Untuk multisesi seperti itu, tidak ada "bel dan peluit" lain yang diperlukan. Ukuran blok "hdr" dan "stat" statis dan selalu 936 dan 40 byte, terlepas dari ukuran multisesi. Ukuran blok "trks" dan "bk20" masing-masing bergantung pada jumlah trek dan klip audio dalam multisesi. Tetapi ukuran blok "LISTFILE" adalah yang paling tidak dapat diprediksi: ini tidak hanya bergantung pada jumlah file audio dalam multisesi, tetapi juga pada panjang nama dan jalur lokasinya.



Mengartikan dan menyusun deskripsi lengkap dari blok file multisesi adalah tugas yang memakan waktu. Oleh karena itu, saya menerjemahkan sebagian informasi, hanya memperhatikan bagian-bagian byte yang harus diperhitungkan saat membentuk multisesi konten yang disederhanakan. Pada artikel ini saya akan memberikan gambaran tentang isi setiap blok yang dapat saya pecahkan.



Dalam konten blok header multisesi "hdr" (hanya ada spasi di akhir), byte kunci adalah 12 byte pertama, yaitu, 3 kata masing-masing 4 byte (Gbr. 8). Kata pertama adalah tingkat pengambilan sampel sampel dalam multisesi. Untuk multisesi saya, nilainya adalah 8000 Hz (0x1F40). Pada Gambar 8 itu disorot dengan isian hijau. Izinkan saya mengingatkan Anda bahwa byte dalam kata untuk nilai numerik dibaca secara terbalik. Kata kedua adalah durasi (panjang) multisesi, dinyatakan dalam jumlah sampel (isi oranye pada gambar). Dalam contoh ini, nilai ini adalah 0x1A365E (1717854). Jika diterjemahkan ke dalam menit, Anda mendapatkan 1717854/8000/60, yang kira-kira tiga setengah menit. Dan begitulah: dalam skala minimal, multisesi memiliki durasi yang persis sama.Dan untuk multisesi dari catatan panggilan telepon, durasinya harus 24 * 3600 * 8000 = 691200000 = 0x2932E000 sampel. Dalam situasi ini, waktu pemutaran multisesi saat ini pada panel di bawah ini, yang merupakan waktu relatif, akan persis sama dengan nilai waktu absolut panggilan telepon saat ini (atau grup panggilan berdasarkan hari). Kata berikutnya yang disorot dengan warna kuning menunjukkan jumlah klip audio dalam multisesi. Dalam contoh, nilai ini sama dengan satu, tetapi dalam kasus panggilan telepon, jumlah klip tersebut akan sama dengan jumlah file audio. Ke depan, pernyataan terakhir tidak sepenuhnya benar. Faktanya, jumlah klip audio mungkin sedikit lebih banyak daripada jumlah file audio. Satu file dapat memiliki dua klip jikajika hari baru telah tiba selama percakapan telepon. Dalam kasus ini, Anda harus "mentransfer" rekaman ke trek baru, dan satu klip tidak akan berfungsi. Tetapi kasus seperti itu jarang terjadi dalam praktiknya, karena transisi ke hari baru terjadi pada malam hari, ketika aktivitas panggilan telepon minimal. Ngomong-ngomong, saya tidak memperhitungkan hal ini saat membentuk diagram SVG di artikel sebelumnya. Setelah kata nilai jumlah blok berikut, kemungkinan besar "setengah kata" dari dua byte 0x0020, atau 32 dalam bentuk desimal. Itu juga bisa disorot dengan isian warna, karena, kemungkinan besar, itu berarti kedalaman pencampuran. Di Adobe Audition, bilah status di bagian bawah mengatakan: 8000 Hz, pencampuran 32-bit. Selain tiga kata paling penting dari konten "hdr", ada byte lain yang tidak jelas. Misalnya, saya bahkan tidak tahu kata "Master"apa yang dimaksud. Ternyata inilah nama bus pencampur utamanya. Tetapi kelompok byte paling menarik yang saya lingkari dalam bingkai abu-abu. Faktanya adalah urutan ini sering ditemukan di blok lain dari file multisesi. Bukan kebetulan bahwa saya telah menggabungkan tepat 8 byte ke dalam grup, karena, kemungkinan besar, ini adalah tipe data nyata. Khususnya, HEX konstanta "00 00 00 00 00 00 F0 3F" ini oleh editor dalam tipe Ganda diinterpretasikan sebagai 1.0e + 0, yaitu, sebagai satu unit. Kemungkinan besar ini adalah nilai tingkat kenyaringan dan "putaran" lainnya, tetapi ditentukan bukan dalam desibel, tetapi dalam bentuk koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak diperlukan) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.Tetapi kelompok byte paling menarik yang saya lingkari dalam bingkai abu-abu. Faktanya adalah urutan ini sering ditemukan di blok lain dari file multisesi. Bukan kebetulan saya telah menggabungkan tepat 8 byte ke dalam sebuah grup, karena, kemungkinan besar, ini adalah tipe data nyata. Khususnya, HEX konstanta "00 00 00 00 00 00 F0 3F" ini oleh editor dalam tipe Ganda diinterpretasikan sebagai 1.0e + 0, yaitu, sebagai satu unit. Kemungkinan besar ini adalah nilai tingkat kenyaringan dan "putaran" lainnya, tetapi ditentukan bukan dalam desibel, tetapi dalam bentuk koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.Tetapi kelompok byte paling menarik yang saya lingkari dalam bingkai abu-abu. Faktanya adalah urutan ini sering ditemukan di blok lain dari file multisesi. Bukan kebetulan saya telah menggabungkan tepat 8 byte ke dalam sebuah grup, karena, kemungkinan besar, ini adalah tipe data nyata. Khususnya, HEX konstanta "00 00 00 00 00 00 F0 3F" ini oleh editor dalam tipe Ganda diinterpretasikan sebagai 1.0e + 0, yaitu, sebagai satu unit. Kemungkinan besar ini adalah nilai tingkat kenyaringan dan "putaran" lainnya, tetapi ditentukan bukan dalam desibel, tetapi dalam bentuk koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.Bukan kebetulan saya telah menggabungkan tepat 8 byte ke dalam sebuah grup, karena, kemungkinan besar, ini adalah tipe data nyata. Khususnya, HEX konstanta "00 00 00 00 00 00 F0 3F" ini oleh editor dalam tipe Ganda diinterpretasikan sebagai 1.0e + 0, yaitu, sebagai unit. Kemungkinan besar ini adalah nilai tingkat kenyaringan dan "putaran" lainnya, tetapi ditentukan bukan dalam desibel, tetapi dalam bentuk koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.Bukan kebetulan bahwa saya telah menggabungkan tepat 8 byte ke dalam grup, karena, kemungkinan besar, ini adalah tipe data nyata. Khususnya, HEX konstanta "00 00 00 00 00 00 F0 3F" ini oleh editor dalam tipe Ganda diinterpretasikan sebagai 1.0e + 0, yaitu, sebagai satu unit. Kemungkinan besar ini adalah nilai tingkat kenyaringan dan "putaran" lainnya, tetapi ditentukan bukan dalam desibel, tetapi dalam bentuk koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.dan sebagai koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.dan sebagai koefisien. Saya harus segera mengatakan bahwa semua byte dari blok mana pun yang tidak dapat saya kenali (atau tidak perlu) akan ditulis ke file multisesi yang dihasilkan tanpa perubahan, seperti pada contoh.





. 8. «hdr ».



Saya memutuskan untuk tidak mempelajari blok "stat" dari status multisesi saat ini (yang terpendek). Saya membuat multisesi sampel lain dari satu file audio, merentangkannya selama 24 jam dan membuat tampilan penuh (skala) secara horizontal. Dan secara vertikal, tampilan trek diskalakan sehingga ketika jendela Adobe Audition diperluas, 31 trek akan muat di layar FullHD. Ini adalah jumlah hari maksimum dalam satu bulan. Kursor multisesi diposisikan di awal. Kemudian saya menyimpan multisesi ini ke file lain, dan kemudian mengeluarkan blok "stat" dengan semua headernya. Saya menyimpan byte ini di file "stat_31_full.BLK" untuk digunakan lebih lanjut dalam mengembangkan program. Tampilan dari isi file tersebut ditunjukkan pada Gambar 9. Ukuran file ini adalah 48 byte (40 byte konten blok + 4 byte header + 4 byte deskripsi ukuran konten).





. 9. «stat» .



Untuk penjelasan yang lebih visual dari tiga blok berikutnya selama penulisan artikel ini, saya memutuskan untuk membuat multisesi yang lebih kompleks, yang terdiri dari dua trek, dua file, dan tiga klip (Gbr. 10). File pertama "Incoming_Call - 20200622_124844 - + 74999545237.wav" memiliki durasi 281280 sampel. File kedua "Outgoing_Call - 20200621_231753 - + 79536170218.wav" memiliki durasi 63360 sampel. Lagu pertama bernama "Pertama" (berganti nama) berisi dua klip. Klip pertama digeser dari awal sesi sebesar 10 detik (dengan 80.000 sampel). Klip diwakili oleh konten lengkap dari file audio pertama, yaitu durasi klip sama dengan durasi file. Klip kedua bergeser 50 detik dari awal sesi (dengan 50 * 8000 = 400000 sampel). Klip diwakili oleh konten yang tidak lengkap dari file audio kedua. Dalam klip tertentu, audio dimulai dari awal file,tetapi hanya bertahan 5 detik (40.000 sampel). Artinya, panjang klip adalah 5 detik. Lagu kedua berjudul "Second" berisi satu klip. Itu bergeser dari awal sesi dengan satu detik (dengan 8000 sampel). Klip ini diwakili oleh konten yang tidak lengkap dari file audio pertama. Dalam klip ini, audio tidak dimulai dari awal, tetapi setelah 3 detik, tetapi memuatnya sampai akhir. Jadi, offset data audio dalam klip ini adalah 3 detik (24.000 sampel). Dan panjang klip tertentu dihitung sebagai perbedaan antara durasi audio yang sesuai dan offset data audio dalam klip tersebut. Dalam hal ini, panjang klip adalah 281280-24000 = 257280 sampel.Klip ini diwakili oleh konten yang tidak lengkap dari file audio pertama. Dalam klip ini, audio tidak dimulai dari awal, tetapi setelah 3 detik, tetapi memuatnya hingga akhir. Jadi, offset data audio dalam klip ini adalah 3 detik (24.000 sampel). Dan panjang klip tertentu dihitung sebagai perbedaan antara durasi audio yang sesuai dan offset data audio dalam klip tersebut. Dalam hal ini, panjang klip adalah 281280-24000 = 257280 sampel.Klip ini diwakili oleh konten yang tidak lengkap dari file audio pertama. Dalam klip ini, audio tidak dimulai dari awal, tetapi setelah 3 detik, tetapi memuatnya hingga akhir. Jadi, offset data audio dalam klip ini adalah 3 detik (24.000 sampel). Dan panjang klip tertentu dihitung sebagai perbedaan antara durasi audio yang sesuai dan offset data audio dalam klip tersebut. Dalam hal ini, panjang klip sama dengan 281280-24000 = 257280 sampel.Dalam hal ini, panjang klip adalah 281280-24000 = 257280 sampel.Dalam hal ini, panjang klip adalah 281280-24000 = 257280 sampel.





. 10. Adobe Audition 1.5 — 2.



Gambar 11 menunjukkan tampilan dari isi blok deskripsi trek "trks". 4 byte dari header blok disorot dalam bingkai merah, dan ukuran konten blok di hijau. Ini sudah dibahas di atas. Berikutnya adalah konten blok, byte yang disorot di editor WinHex dengan isi kebiruan yang khas. Ukuran pilihan, yang nilainya ditampilkan di sudut kanan bawah editor (juga dilingkari hijau), sesuai dengan nilai dari byte setelah header, dan sudah dalam contoh ini adalah 308 byte. Jika pada contoh pertama (sebelumnya) dari satu trek ukuran blok adalah 156 byte, dan pada yang sekarang - 308 byte, maka kesimpulan berikut dapat ditarik. Karena asumsi homogenitas dan ekuivalensi lintasan, maka wilayah deskripsi tiap lintasan harus memiliki ukuran yang sama. Area ini, bisa dikatakan, adalah sub-blok dari blok "batang".Mereka diuraikan dengan warna biru pada gambar. Ternyata ukuran satu subblock tersebut adalah 152 byte. Dan di awal subblok yang berurutan ada subpos empat byte, ditandai pada gambar dengan isian kuning. Keempat byte ini tidak lebih dari nilai jumlah trek dalam multisesi, atau jumlah sub-blok. Jadi, ukuran S dari isi blok "batang" dapat dihitung dengan rumus S = 4 + 152 * n, di mana n adalah jumlah trek dalam sesi tersebut. Jadi itu adalah: 4 + 152 * 1 = 156, dan 4 + 152 * 2 = 308.ukuran S dari isi blok "batang" dapat dihitung dengan rumus S = 4 + 152 * n, di mana n adalah jumlah trek dalam sesi tersebut. Jadi itu adalah: 4 + 152 * 1 = 156, dan 4 + 152 * 2 = 308.ukuran S dari isi blok "batang" dapat dihitung dengan rumus S = 4 + 152 * n, di mana n adalah jumlah trek dalam sesi tersebut. Jadi itu adalah: 4 + 152 * 1 = 156, dan 4 + 152 * 2 = 308.





. 11. «trks».



Sekarang mari kita lanjutkan dengan mendeskripsikan isi subblock. Ada banyak hal di sana, tetapi saya hanya menguraikan yang paling penting. Hanya ada tiga parameter: 4 byte bendera biner (dilingkari merah), nama trek (dilingkari coklat), dan ID trek (dilingkari biru). Pengenal trek adalah nomor urutnya. Diperlukan untuk menunjukkan tautan ke trek dalam deskripsi klip audio (lebih lanjut tentang ini nanti). Nama trek menempati area seluas 36 byte. Ini adalah jumlah maksimum karakter dalam nama trek, tetapi bisa lebih sedikit, seperti pada contoh saat ini. Byte yang tidak digunakan adalah nol. Dalam multisesi dengan rekaman audio panggilan telepon, nama trek akan cocok dengan rekaman pada tanggal yang sesuai. Anda dapat menambahkan hari yang sesuai dalam seminggu di sebelah tanggal dalam dua huruf kapital dalam bentuk singkatan.Empat byte bendera biner (total 32 bendera) dimaksudkan untuk menggambarkan parameter biner yang melekat pada trek. Faktanya, mungkin ada kurang dari 32. Saya menerjemahkan hanya sebagian dari benderanya. Dari jumlah tersebut, setidaknya tiga bendera menunjukkan apakah trek itu "R" (Rekam), "S" (Solo), atau "M" (Bisu). Dalam contoh yang diberikan, tidak satu pun dari ketiga tombol ini di trek yang ditekan, dan nilai bendera biner adalah nol (0x00000000). Tetapi jika Anda menekan tombol "R" pada trek (yaitu, letakkan trek pada catatan) dan simpan kembali sesi tersebut, maka nilai bendera biner akan menjadi 0x00000004, dengan kata lain, bit ketiga dari kanan (bit2) akan menjadi tunggal. Bit inilah yang bertanggung jawab atas properti "record" dari trek. Properti ini tidak memiliki nilai dalam proyek saya, karena multisesi saya dirancang untuk tampilan visual dan pemutaran.Namun, saya mendapat ide bahwa tombol "R" ditekan pada trek yang sesuai dengan akhir pekan. Teknik ini akan mempermudah visualisasi multisesi.



Blok dari daftar file audio dari "LISTFILE" multisesi (Gbr. 12) terdiri dari bagian-bagian berikut. Seperti dalam kasus blok deskripsi trek, itu juga dapat dibagi menjadi sub-blok sesuai dengan jumlah file dalam sesi. Mirip dengan Gambar 11, saya juga menyoroti header blok 8-byte dalam kotak merah dan ukuran isinya dalam kotak hijau. Dalam contoh khusus ini, nilainya adalah 188 byte. Konten tersebut disorot oleh analogi dengan Gambar. 11. Ini dibagi menjadi dua area yang disorot dengan garis biru. Ini adalah sub-blok dari blok daftar file.





Angka: 12. Byte dari blok deskripsi file audio "LISTFILE".



Setiap sub-blok berhubungan dengan satu file audio. Contoh ini menggunakan dua file audio, jadi jumlah sub-bloknya sesuai. Berbeda dengan kasus sebelumnya dengan deskripsi track, tidak ada subheading tentang jumlah subblock. Subblock berisi 4 byte dari header "wav" (disorot dalam warna hitam) dan 4 byte yang menunjukkan ukuran konten selanjutnya (disorot dalam warna magenta). Untuk kedua sub-blok, nilai ini sama dalam contoh ini dan adalah 0x56 (86) byte. Hal ini disebabkan oleh fakta bahwa file tersebut berada di jalur yang sama dan memiliki nama yang sama. Lebih tepatnya, nama file yang memenuhi syarat memiliki jumlah karakter yang sama. Jika tidak, subunit akan memiliki ukuran yang berbeda. Area konten sub-blok (byte lebih lanjut) berisi informasi berikut. Nomor yang mengidentifikasi file audio disorot dalam bingkai biru.Berbeda dengan track ID, nomor ini bukanlah nomor urut file. Seperti yang saya pahami, saat menyimpan multisesi, itu ditetapkan secara acak atau pseudo-random untuk setiap file. Hal utama adalah bahwa tidak ada kebetulan di antara nilai-nilai ini. Saya yakin akan hal ini ketika saya menyimpan multisesi dua kali dan membandingkan file ses berdasarkan konten. Hasilnya, ternyata file berbeda hanya pada byte yang sama ini. Dan tidak hanya ini. Nomor acak juga diberikan ke ID dari lapisan amplop di blok "ep20". Tetapi di blok ini, seperti yang disebutkan di atas, tidak perlu sama sekali, dan uraiannya tidak akan dipertimbangkan dalam artikel ini. ID Audio diperlukan untuk menghubungkannya ke klip. Tautan ini berlangsung di blok dengan deskripsi klip.Dalam kasus saya, untuk multisesi dengan catatan telepon, pengenal untuk file audio akan berupa urutan bilangan asli, tetapi tidak dimulai dari nol, tetapi, misalnya, dari 1000. 4 byte berikutnya, yang tidak saya soroti, di kedua sub-blok memiliki nilai 0x13. Kemungkinan besar, nilai ini menunjukkan jenis format file audio. Anda dapat secara kondisional menganggap nilai ini sebagai konstanta, karena semua file audio saya memiliki tipe yang sama. String byte berikut menjelaskan nama lengkap file audio, dengan terminator null (seperti terminator baris). Ukuran rantai ini satu lebih banyak dari jumlah karakter di nama lengkap file audio. Berikutnya adalah 0xFFFFFFFF konstan. Diikuti dengan nilai yang menunjukkan jumlah sampel dalam file audio ini (pada Gambar 12 disorot dalam bingkai kuning). Untuk file pertama, nilainya adalah 0x44AC0, dan untuk file kedua adalah 0xF780.Mereka hanya sesuai dengan nilai desimal 281280 dan 63360, yang telah muncul di atas dalam deskripsi contoh multisesi kedua.



Akhirnya, tetap mempertimbangkan deskripsi blok yang paling sulit - blok untuk mendeskripsikan klip audio "bk20" (Gbr. 13). Dengan analogi dengan dua gambar sebelumnya, judul dan ukuran konten blok disorot.





Angka: 13. Byte dari blok deskripsi klip audio "bk20".



Dalam konten blok, pertama-tama, ada dua subpos, masing-masing 4 byte. Mereka disorot dengan isian magenta dan cyan. Subtitle pertama adalah jumlah klip dalam sesi tersebut. Ada tiga di antaranya dalam contoh. Subtitle kedua adalah konstanta 0x48 (72). Rupanya ini menunjukkan ukuran setiap sub-blok, dan mereka melangkah lebih jauh. Jumlahnya sama dengan jumlah klip dalam sesi tersebut. Setiap subblock menjelaskan parameter dari satu klip. Ngomong-ngomong, ukuran D konten blok "bk20" ternyata bisa dihitung dengan rumus D = 8 + 72 * b, di mana b adalah jumlah klip audio dalam multisesi. Pada gambar, tidak ada alokasi byte penjelas di dalam subblock, karena ada banyak parameter yang diperlukan. Mereka terdaftar dalam tabel terpisah (Gbr. 14). Isi biru menandai parameter yang diperlukan dalam proyek saya, dan isian abu-abu - konstanta yang tidak dikenali.Tabel ini juga menunjukkan nilai parameter untuk masing-masing dari tiga klip multisesi dari contoh terakhir.





. 14. .



Kata pertama (grup 4 byte) adalah referensi ke amplop, yang tidak kita butuhkan. Parameter kedua adalah tautan ke file audio. Nilai parameter ini sama dengan nilai pengenal file audio yang sesuai dengan klip audio ini. Lalu ada dua konstanta nyata, yang telah muncul sebelumnya. Mereka diikuti oleh tiga parameter koordinasi, yang dinyatakan dalam jumlah sampel: offset klip dari awal sesi, panjang (durasi) klip dalam sesi, dan offset audio dalam klip. Semuanya harus jelas dari nama parameter ini. Sebelumnya, ketika menjelaskan secara rinci contoh kedua dari multisesi, saya menunjukkan nilai numerik dari semua offset dan durasi. Pada Gambar 14, tabel mencantumkan parameter untuk setiap klip dalam bentuk heksadesimal. Saya memasukkan nilai-nilai ini ke dalam tabel dengan menulis ulang langsung dari Gambar 13.Tetapi jika Anda mengubahnya menjadi bentuk desimal, maka mereka akan sesuai dengan nilai yang sesuai dari deskripsi contoh kedua (dicentang secara terpisah). Perlu diperhatikan bahwa tautan ke file audio untuk klip pertama dan ketiga memiliki nilai yang sama 0x3F5B050, karena kedua klip merujuk ke file audio yang sama dengan pengenal yang sesuai. Ini diikuti oleh blok byte parameter biner (4 byte). Seperti dalam kasus dengan deskripsi trek, saya hanya menerjemahkan sebagian dari bit. Nilai defaultnya adalah 0x00080000, artinya, jika diterjemahkan ke dalam biner, maka hanya satu bit19 yang "dinaikkan" menjadi satu, dan 31 bit sisanya sama dengan nol. Tanpa bit tunggal ini, seperti yang telah ditunjukkan oleh praktik, multisesi menolak untuk dimuat. Dalam contoh saat ini, nilai seperti itu adalah karakteristik dari klip pertama dan kedua, tetapi untuk yang ketiga, karena alasan tertentu, nilai dari flag-nya sama dengan 0x000A0000.Jika Anda menghitung, maka dalam nilai ini dua bit "dimunculkan": masih bit19 dan bit17 lainnya. Saya tidak tahu mengapa itu terjadi. Saya mencoba mengatur ulang bit17 menjadi nol, mengubah nilai seluruh parameter menjadi 0x00080000, seperti klip yang berdekatan. Hasilnya, sesi di Adobe Audition dibuka tanpa perubahan yang terlihat. Saat bekerja di Adobe Audition, saya melihat properti klip seperti "Fix in Time" dan "Fix for Playback Only". Adalah logis untuk mengasumsikan bahwa bit tertentu dalam blok parameter biner bertanggung jawab untuk menyimpan properti ini. Ada juga properti biner lain untuk klip, tetapi kami tidak membutuhkannya. Dan dua properti yang terdaftar akan sangat berguna. Properti "Fix in time" berguna karena klip akan dilindungi dari kemungkinan pergerakan penunjuk mouse yang tidak disengaja ke arah horizontal.Tetapi pada klip seperti itu, simbol dalam bentuk kunci dalam lingkaran akan digambar secara visual di sudut kiri bawah, dan ini adalah informasi grafik yang tidak perlu untuk dilihat. Properti kedua dari klip "Perbaiki untuk pemutaran saja" berguna karena ketika parameter "R" (Rekam) diaktifkan pada trek yang sesuai, klip tidak akan mendapatkan warna merah yang dipaksakan. Untuk apa saya memutuskan untuk menggunakan parameter "R" di beberapa trek - ada tertulis di atas. Secara empiris, saya menemukan bahwa bit1 bertanggung jawab atas properti pertama klip, dan bit3 untuk properti kedua. Berikut ini dari semua yang telah dikatakan. Untuk menyetel properti Clip in Time, Anda perlu menulis nilai 0x00080002 ke parameter biner. Properti Komit Untuk Pemutaran Saja adalah 0x00080008. Untuk kedua properti, jumlah logisnya adalah 0x0008000A. Berurusan dengan parameter biner.Setelah byte ini, ada tautan ke trek tempat klip itu berada. Faktanya, pengenal trek terdaftar, yang sesuai dengan nomor serinya. Omong-omong, Adobe Audition 1.5 mendukung tidak lebih dari 128 trek, jadi pengenal ini cocok dengan satu byte, meskipun terdaftar sebagai nilai 32-bit. Lalu ada konstanta nol yang tidak teruraikan (4 konstanta, masing-masing 4 byte). Terakhir, parameter penting terakhir adalah warna klip. Editor Adobe Audition 1.5 memungkinkan Anda menyetel nilai warna dari 0 hingga 239 ke klip di kotak dialog terkait atau memilihnya dari palet (Gbr. 15). Palet warna tidak terlalu menyenangkan, tetapi opsi lain tidak diberikan. Warna klip default adalah 102 (0x66) (hijau).Ngomong-ngomong, ini mendukung tidak lebih dari 128 trek, sehingga pengenal seperti itu cocok dengan satu byte, meskipun terdaftar sebagai nilai 32-bit. Lalu ada konstanta nol yang tidak teruraikan (4 konstanta, masing-masing 4 byte). Terakhir, parameter penting terakhir adalah warna klip. Editor Adobe Audition 1.5 memungkinkan Anda menyetel nilai warna dari 0 hingga 239 ke klip di kotak dialog terkait atau memilihnya dari palet (Gbr. 15). Palet warna tidak terlalu menyenangkan, tetapi opsi lain tidak diberikan. Warna klip default adalah 102 (0x66) (hijau).Ngomong-ngomong, ini mendukung tidak lebih dari 128 trek, jadi pengenal seperti itu cocok dengan satu byte, meskipun terdaftar sebagai nilai 32-bit. Lalu ada konstanta nol yang tidak teruraikan (4 konstanta, masing-masing 4 byte). Terakhir, parameter penting terakhir adalah warna klip. Editor Adobe Audition 1.5 memungkinkan Anda menyetel nilai warna dari 0 hingga 239 ke klip di kotak dialog terkait atau memilihnya dari palet (Gbr. 15). Palet warna tidak terlalu menyenangkan, tetapi opsi lain tidak diberikan. Warna klip default adalah 102 (0x66) (hijau).5 memungkinkan Anda menyetel nilai warna dari 0 hingga 239 ke klip di kotak dialog terkait atau memilihnya dari palet (Gbr. 15). Palet warna tidak terlalu menyenangkan, tetapi opsi lain tidak diberikan. Warna klip default adalah 102 (0x66) (hijau).5 memungkinkan Anda menyetel nilai warna dari 0 hingga 239 ke klip di kotak dialog terkait atau memilihnya dari palet (Gbr. 15). Palet warna tidak terlalu menyenangkan, tetapi opsi lain tidak diberikan. Warna klip default adalah 102 (0x66) (hijau).





. 15. Adobe Audition 1.5.



Parameter warna pada file ses adalah 32-bit, padahal hanya ada 240 warna yang muat dalam satu byte. Tiga byte terpenting lainnya adalah nol. Saya punya ide bahwa jika saya mencoba mengedit byte ini untuk nilai yang berbeda, maka saat membuka multisesi, warna baru akan muncul di klip. Tapi trik ini tidak berhasil. Seperti yang telah dibahas di artikel sebelumnya, warna dalam bagan berguna untuk menyoroti fitur tertentu dari panggilan telepon secara visual. Rekaman audio panggilan telepon multisesi akan menyerupai diagram yang serupa, jadi warna klip akan sangat membantu. Parameter warna klip diikuti oleh dua kata nol. Ini melengkapi deskripsi subunit. Delapan byte nol ini adalah yang terakhir di sub-blok dari blok terakhir. Oleh karena itu, mereka juga akan menjadi yang terakhir di seluruh file ses.



Saat memikirkan proyek tersebut, saya mendapatkan ide lain: untuk menambahkan penanda (titik isyarat) ke multisesi, menempatkannya setiap jam dan menandatangani tanda yang sesuai untuk mereka. Jika kita membandingkan ide ini dengan artikel sebelumnya, maka ini adalah analogi lengkap dari garis vertikal pada diagram yang digambar setiap jam. Agar titik isyarat hadir dalam multisesi, perlu memperhitungkan blok keenam yang disebut "isyarat". Saya tidak mulai memahami byte dari blok ini. Dengan analogi dengan blok "stat", dalam multisession yang dibuat selama 24 jam, saya menempatkan 23 cue point secara manual setiap jam dan memberi mereka nama yang sesuai. Kemudian saya menyimpan multisession sebagai file ses terpisah, memotong isi dari blok "isyarat" dan menyimpannya ke file "cues_24h.BLK". File ini akan diperhitungkan saat mengembangkan program. Byte dari file ini ditunjukkan pada Gambar 16. Saya tidak tahu kenapa,tapi saya menyimpan persis konten, tanpa judul dan bidang ukuran konten (sebagai lawan dari "stat_31_full.BLK"). Kedua kata ini akan ditambahkan ke kode program. Dan ukuran konten adalah 556 byte. Dari jumlah tersebut, 4 byte ditempati oleh subtitle (jumlah titik tanda) dan 23 subblock masing-masing 24 byte. Pada Gambar 16, byte konten dari sub-blok pertama diisi. Saya memutuskan untuk membuat nama titik isyarat (label) sebagai berikut: 01h, 02h,…, 23h.





. 16. «cues» .



Ini menyimpulkan deskripsi format multisesi. Sekarang kami memiliki basis pengetahuan yang diperlukan untuk mulai menulis program untuk membuat multisesi. Menulis program adalah tugas yang lebih mudah daripada mempelajari dan mendekripsi format ses. Saya menyelesaikan program dalam dua malam, dan saya menghabiskan setidaknya satu minggu mempelajari formatnya. Selain itu, saya menulis program menggunakan fungsi yang digunakan sebelumnya, khususnya, bekerja dengan file dan direktori. Oleh karena itu, dukungan utama untuk menulis program ini bukanlah buku referensi atau Internet, tetapi proyek-proyek saya sebelumnya, yang juga saya tulis di Habré. Dari Internet, saya hanya mengambil satu fungsi yang mengembalikan hari dalam seminggu berdasarkan tanggal. Tetapi sebelum mengutip teks program, saya memutuskan untuk membagikan beberapa informasi lagi, yang awalnya tidak ingin saya tulis di artikel ini.



Ide untuk membentuk multisesi dari rekaman telepon datang kepada saya ketika saya bekerja di versi yang lebih baru dari Adobe Audition 3.0, yang mendukung input / output audio melalui ASIO. Saat menyimpan multisesi, saya menemukan bahwa multisesi dapat disimpan dalam dua format sesuai pilihan: SES klasik biasa dan format XML baru, yang tidak ada di versi program sebelumnya. Setelah menyimpan sesi dalam format XML, saya segera membuka file ini di notepad, di mana saya menemukan deskripsi sekelompok parameter yang terhubung bersama dalam struktur hierarki yang kompleks. Untuk kenyamanan melihat hierarki ini, saya menggunakan program WMHelp XmlPad. Gambar 17 menunjukkan tangkapan layar program ini dengan file multisesi percobaan sederhana yang terbuka di dalamnya. Di sebelah kiri adalah hierarki dokumen. Elemen aktif (dipilih) dari hierarki adalah parameter panjang file audio pertama,di sub-blok pertama dari blok deskripsi file audio.





. 17. XML Adobe Audition 3.0.



Saya memutuskan untuk mempelajari format khusus ini, dan di masa depan secara terprogram menghasilkan teks XML yang diperlukan, mendapatkan multisesi yang diinginkan pada keluarannya. Bahkan ada ide untuk menggunakan Excel untuk tujuan ini. Kesulitannya adalah sekitar 95% dari seluruh file XML ditempati oleh blok deskripsi trek. Ada sejumlah besar parameter, yang tidak dapat saya kecualikan tanpa merusak multisesi. Faktanya adalah dalam versi Adobe Audition ini masih banyak lagi fungsi yang berhubungan dengan trek. Secara logis, fungsi ini tidak diperlukan untuk multisesi sederhana saya. Namun, dengan mengecualikan bidang terkait dari dokumen XML, sesi berhenti berjalan. Dan saya harus "menarik" potongan besar teks ini dalam deskripsi setiap lagu untuk sesi yang paling sederhana. Ini adalah satu-satunya ketidaknyamanan saat membuat file XML multisesi. Pengetahuan,varian multisesi yang diperoleh selama studi XML tekstual, tentu saja, berguna selama studi ses biner. Dan bahkan dalam XML, saya tidak dapat mendekripsi beberapa parameter. Kolom dari setiap parameter memiliki nama yang disingkat dalam bahasa Inggris, tetapi meskipun demikian, saya tidak selalu memahami apa parameter ini. Hal utama adalah saya dapat mempelajari dan menguraikan parameter dasar yang diperlukan, blok hierarki dan bidangnya. Kemudian saya tersiksa untuk waktu yang lama oleh pertanyaan: bagaimana membuka sesi seperti itu di versi Adobe Audition yang lebih lama? Versi baru program memiliki antarmuka yang sangat canggih (hampir 3D), yang sangat merepotkan untuk memvisualisasikan multisesi seperti diagram. Dan karena ini "tiga-te" di Adobe Audition 3.0 dengan jendela yang sepenuhnya diperluas pada layar FullHD, maksimum (pada skala minimum) 28 lagu cocok. Dan di Adobe Audition 1.5, 37 akan cocok (Gbr.18, skala 1: 2). Secara total, 31 trek perlu ditampilkan di layar.





. 18. Adobe Audition .



Tetapi yang terpenting, saya menghabiskan kualitas suara saat memutar multisesi dengan frekuensi 8000 Hz di versi baru program. Suara tidak terlalu bagus, ada distorsi harmonik. Hal ini disebabkan oleh fakta bahwa suara dikeluarkan pada laju sampel yang berbeda (48 kHz), dan ASIO tidak dapat melakukan sebaliknya. Situasi ini tidak berubah ketika Anda memilih perangkat keluaran lain "Audition 3.0 Windows Sound" dalam pengaturan. Versi baru dari program ini tidak mendukung perangkat keluaran klasik "DirectSound" (saya sebut versi 3.0 baru). Gambar 19 menunjukkan spektrum audio saat memutar audio 8 kHz (atau sesi) di Adobe Audition 3.0 dengan hadir distorsi harmonik spektrum terbalik. Frekuensi tersebut dilingkari dengan warna hijau, yang seharusnya terdengar ideal (dan tidak ada yang lain). Dan frekuensinya dilingkari merah,yang merupakan distorsi tambahan. Efek ini kemungkinan besar disebabkan kurangnya penyaringan setelah prosedur upsampling. Setelah itu saya memutuskan untuk mempelajari format biner SES dari program Adobe Audition 1.5 yang lebih sederhana dan menyenangkan. Saya berharap bahwa setelah mempelajari format XML "manusia" dari versi program yang lebih baru, tidak akan sulit bagi saya untuk mengetahuinya, mengingat pengalaman saya dengan file biner. Dan begitulah yang terjadi: Saya dengan cepat "mempromosikan" format SES. Dan yang utama adalah kompatibilitas ke belakang, di masa depan, berfungsi dengan baik: sesi yang dibentuk untuk versi 1.5 berhasil dibuka di versi 3.0. Di atas, saya menunjukkan kelemahan Adobe Audition 3.0 terkait kualitas suara dan antarmuka grafis. Tetapi versi program ini memiliki keunggulan dalam navigasi multisesi. Misalnya,ada kemungkinan untuk mengoperasikan mendengarkan satu klip audio dalam multisesi dengan mengkliknya dengan mouse dan kemudian menggeser ke kanan.





Angka: 19. Distorsi harmonik selama pemutaran.



Sekarang saya akan memberikan teks program di bawah spoiler. Program, tentu saja, tidak memiliki antarmuka grafis, karena tidak diperlukan untuk tugas ini. Teks program dilengkapi dengan komentar rinci, jadi tidak diperlukan penjelasan tambahan. Program diluncurkan pada baris perintah dan dalam proses kedua daftar empat ratus file, membentuk file multisesi. Di dalam program, ada empat variabel parametrik yang, jika diinginkan, memungkinkan Anda untuk tidak menghasilkan penanda isyarat, tidak meletakkan "R" pada trek pada akhir pekan, tidak untuk mengatur properti "Fix in time" pada klip, dan untuk memilih kriteria untuk klip pewarnaan (berdasarkan jenis panggilan atau nomor telepon) ... Ketiga variabel ini harus dikeluarkan dari teks program dan "dibawa keluar", yaitu dalam file terpisah dengan parameter program.



Kode sumber program 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;
}




Sekarang Anda dapat menampilkan tangkapan layar dengan hasilnya. Akan ada beberapa di antaranya: pada skala tampilan yang berbeda, dalam versi program yang berbeda dan dengan kriteria pewarnaan yang berbeda. Katalog "2020-05" sedang diproses, yaitu catatan untuk Mei tahun berjalan. Sebanyak 446 catatan diproses. Jumlah blok sama, karena tidak ada catatan dengan transisi ke hari baru.





Angka: 20. Tampilan multisesi dalam skala penuh dengan pewarnaan melalui telepon. nomor.





Angka: 21. Tampilan multisesi dalam skala penuh dengan pewarnaan menurut jenis panggilan.





Angka: 22. Jenis multisesi dalam skala menengah.





Angka: 23. Tampilan multisesi dalam skala besar.





Angka: 24. Tampilan multisesi yang sama dalam Adobe Audition 3.0.






All Articles