MIDISTATS(1) General Commands Manual MIDISTATS(1)

midistats - برنامه‌ای برای خلاصه‌سازی ویژگی‌های آماری یک فایل midi

این یک راهنمای طولانی است زیرا برنامه بر اساس گزینه‌های انتخاب‌شده پارامترهای بسیار متفاوتی را از فایل midi استخراج می‌کند. این راهنما تلاش می‌کند این پارامترها و نحوه محاسبه آن‌ها را توصیف کند. این پارامترها به گونه‌ای قالب‌بندی شده‌اند که بتوانند توسط سایر برنامه‌ها مانند midiexplorer.tcl، runstats.tcl و اسکریپت‌های متعدد پایتون خوانده شوند.

بسیاری از گزینه‌ها به طور خاص برای تحلیل شیار (تِرَک) سازهای کوبه‌ای (percussion) فایل midi طراحی شده‌اند. آن‌ها در بخش جداگانه‌ای در زیر (گزینه‌های دیگر) توضیح داده شده‌اند.

اگر midistats را بدون هیچ گزینه‌ای جز نام فایل ورودی midi اجرا کنید، جدولی از مقادیر که در اینجا توصیف شده است تولید خواهد کرد. هر خط از خروجی با نام متغیر یا آرایه متغیر و مقادیر مرتبط با آن آغاز می‌شود.

ntrks تعداد ترک‌ها (ترک‌های صوتی) موجود در فایل midi را نشان می‌دهد.

ppqn تعداد پالس‌های midi در هر نت سیاه (quarter note).

keysig سرکلید، به همراه نشانگر ماژور/مینور، تعداد دیزها (مثبت) یا بمل‌ها (منفی) در کلید، و شماره ضربی که سرکلید در آن یافت شده است.

trk که به دنبال آن شماره تِرَکی می‌آید که اطلاعات بعدی برای آن اعمال می‌شود.

program که به دنبال آن شماره کانال و شماره برنامه General Midi می‌آید.

trkinfo آرایه‌ای از ۱۹ عدد است که ویژگی‌های آماری ترک مورد نظر را نشان می‌دهد. داده‌های زیر ارائه می‌شوند:
0 شماره کانال،
1 نخستین برنامه اختصاص‌یافته به این کانال،
2 تعداد نت‌های این کانال با احتساب آکوردها به عنوان یک نت،
3 تعداد نت‌های آکورد بدون احتساب نت باس،
4 مجموع زیروبمی‌های (pitches) MIDI برای تمام نت‌ها،
5 مجموع دیرند نت‌ها بر حسب واحدهای پالس MIDI،
6 تعداد پیام‌های تغییر زیروبمی (pitchbend)،
7 تعداد پیام‌های پارامتر کنترل،
8 تعداد پیام‌های فشار (aftertouch/pressure)،
9 تعداد الگوهای ریتم متمایز برای هر کانال،
10 تعداد پالس‌هایی که کانال غیرفعال بوده است،
11 کمترین مقدار زیروبمی،
12 بیشترین مقدار زیروبمی،
13 حداقل طول نت بر حسب پالس،
14 حداکثر طول نت بر حسب پالس،
15 تعداد شکاف‌ها (سکوت‌ها) در کانال،
16 آنتروپی هیستوگرام رده زیروبمی (pitch class) برای آن کانال،
17 تعداد نت‌هایی که زیروبمی آن‌ها با نت قبلی یکسان بوده است،
18 تعداد نت‌هایی که زیروبمی آن‌ها کمتر از ۴ نیم‌پرده تغییر کرده است،
19 تعداد نت‌هایی که زیروبمی آن‌ها ۴ نیم‌پرده یا بیشتر تغییر کرده است،
20 میانگین شدت ضربه نت (velocity)،
21 انحراف معیار شدت ضربه نت.

(در صورت وجود آکوردها، بیشترین زیروبمی‌ها مقایسه می‌شوند.)

پس از پردازش تمام ترک‌های منفرد، اطلاعات زیر برای کل فایل midi اعمال می‌شود:

npulses طول طولانی‌ترین ترک midi بر حسب واحدهای پالس midi است.

tempocmds تعداد دفعات تغییر تمپو در این فایل را مشخص می‌کند.

pitchbends تعداد کل تغییرات زیروبمی (pitchbend) را در این فایل مشخص می‌کند.

pitchbendin c n تعداد n تغییر زیروبمی را در کانال c مشخص می‌کند.

progs فهرستی از تمام برنامه‌های midi آدرس‌دهی‌شده است.

progsact میزان فعالیت برای هر یک از برنامه‌های midi فوق است. فعالیت، مجموع دیرند نت‌ها بر حسب واحدهای پالس midi است.

progcolor برداری ۱۷ بعدی است که هر مؤلفه آن به گروه خاصی از برنامه‌های MIDI نگاشت می‌شود. برخی از این گروه‌ها عبارتند از: سازهای کلاویه‌ای، سازهای بادی برنجی، سازهای بادی چوبی و غیره. اطلاعات بیشتر را می‌توان در مستندات midiexplorer یافت.

drums فهرستی از تمام سازهای کوبه‌ای (کانال 9) است که استفاده شده‌اند.

drumhits تعداد نت‌ها را برای هر یک از سازهای کوبه‌ای فوق نشان می‌دهد.

pitches هیستوگرامی برای ۱۱ رده زیروبمی (C, C#, D ... B) است که در فایل midi رخ می‌دهند.

key کلید موسیقی، تعداد دیزها (مثبت) یا بمل‌ها (منفی) در سرکلید و معیاری از اطمینان به این سرکلید را نشان می‌دهد. کلید از روی هیستوگرام زیروبمی فوق با کانولوشن با مدل Craig Sapp تخمین زده شده است. قله rmaj یا rmin (در زیر) نشان‌دهنده کلید است. همبستگی کمتر از 0.4 نشان می‌دهد که هیستوگرام زیروبمی از هیستوگرام گام ماژور یا مینور پیروی نمی‌کند (ممکن است نتیجه ترکیبی از دو سرکلید باشد).

rmaj ضرایب همبستگی متقابل با مدل کلید ماژور Craig Sapp برای هر یک از ۱۱ کلید (C, C#, D, ..., B).

rmin ضرایب همبستگی متقابل با مدل کلید مینور Craig Sapp برای هر یک از ۱۱ کلید (C, C#, D, ..., B).

pitchact هیستوگرامی مشابه است اما با طول نت‌ها وزن‌دهی شده است.

chanvol مقدار دستورات تنظیم بلندی صدا (control volume) در فایل midi را برای هر یک از ۱۶ کانال نشان می‌دهد. بیشترین مقدار ۱۲۷ است. این دستور بلندی صدای نت‌ها (velocity) را با مقدار خود مقیاس‌بندی می‌کند.

chnact میزان فعالیت نت‌ها را در هر کانال بازمی‌گرداند.

trkact تعداد نت‌ها را در هر ترک بازمی‌گرداند.

totalrhythmpatterns تعداد کل الگوهای ریتم میزان برای تمام کانال‌ها به جز کانال سازهای کوبه‌ای است.

collisions. ابزار Midistats الگوهای ریتم میزان را با استفاده از یک تابع درهم‌سازی (hashing) می‌شمارد. در حال حاضر برخوردها نادیده گرفته می‌شوند، بنابراین گاهی دو الگوی ریتم متمایز به عنوان یک الگو شمرده می‌شوند.

ابزار Midistats تعدادی آرایه را چاپ می‌کند که ممکن است در تعیین اینکه آیا موسیقی در ترک یک خط ملودی است یا پشتیبانی ریتمیک آکوردی، مفید باشند. این آرایه‌ها ویژگی‌های هر یک از ۱۶ کانال را نشان می‌دهند (کانال سازهای کوبه‌ای ۹ حاوی صفر است). در صورتی که همان کانال در چند ترک تکرار شود، این اعداد مجموع تمام ترک‌های حاوی آن کانال هستند. در اینجا شرحی از این ویژگی‌ها آمده است:

programs: نگاشت کانال به برنامه midi

cnotes: تعداد کل نت‌ها در هر کانال

nnotes: تعداد نت‌ها در هر کانال بدون احتساب نت‌هایی که در یک بازه زمانی یکسان نواخته می‌شوند.
nzeros: تعداد نت‌هایی که زیروبمی نت قبلی آن‌ها یکسان بوده است.
nsteps: تعداد نت‌هایی که اختلاف زیروبمی آن‌ها با نت قبلی کمتر از ۴ نیم‌پرده بوده است.
njumps: تعداد نت‌هایی که اختلاف زیروبمی آن‌ها با نت قبلی ۴ نیم‌پرده یا بیشتر بوده است.
rpats: تعداد الگوهای ریتم برای هر کانال. این یک تکرار از داده‌های چاپ‌شده قبلی است.
pavg: میانگین زیروبمی تمام نت‌ها برای هر کانال.
spread: درصد زمانی از ترک که هر کانال فعال است.

اگر برخی از کانال‌ها در بیش از یک ترک ظاهر شوند، ممکن است برخی از مقادیر فوق نادرست باشند.

علاوه بر این، midistats ممکن است کدهای دیگری را بازگرداند که ویژگی‌های دیگر را توصیف می‌کنند، از جمله:

unquantized - زمان‌های شروع نت‌ها کوانتیزه نشده‌اند
triplets - تریپلت‌ها (۳ نت در زمان ۲ نت) وجود دارند
qnotes - ریتم اساساً ساده است
clean_quantization - شروع نت‌ها به واحدهای زمانی ۱/۴، ۱/۸، ۱/۱۶ کوانتیزه شده است.
dithered_quantization - تغییرات جزئی در زمان‌های شروع کوانتیزه‌شده نت‌ها.
Lyrics - ترانه در فراداده‌ها وجود دارد
programcmd - ممکن است چندین تغییر برنامه در یک کانال midi وجود داشته باشد
ntimesig - تعداد دستورات کسر میزان (time signature)

توصیه می‌شود تنها یکی از گزینه‌های شرح داده‌شده در اینجا را انتخاب کنید زیرا این برنامه برای مدیریت همزمان چندین گزینه طراحی نشده است.

اگر midistats را با گزینه -CSV اجرا کنید، نتایج را در قالبی از مقادیر جداشده با کاما بازمی‌گرداند که می‌تواند در یک دیتافریم پانداز پایتون بارگذاری شود. هر خط به یکی از ۱۶ کانال midi اشاره دارد. کد پایتون ۳ زیر نحوه بارگذاری خروجی midistats را در یک دیتافریم نشان می‌دهد:

import pandas as pd
import io
import subprocess
cmd = ("midistats", "-CSV" , inputmidifilepath)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
csv = io.StringIO(process.stdout.read().decode())
df = pd.read_csv(csv)

که در آن inputmidifilepath مسیر فایل midi مورد استفاده شما است (مثلاً 'clean_midi/Zero/Chi sei.mid').

فایل MIDI کانال ۹ را به سازهای کوبه‌ای اختصاص می‌دهد و بیش از ۶۰ ساز کوبه‌ای در استاندارد MIDI تعریف شده است. اگرچه تنوع زیادی در شیار سازهای کوبه‌ای وجود دارد، برای اکثر فایل‌های MIDI تنها حدود ۱۰ ساز کوبه‌ای اول در تعریف ویژگی شیار مهم هستند. برنامه Midiexplorer ابزارهای مختلفی برای نمایش کانال سازهای کوبه‌ای دارد که در مستندات آن شرح داده شده است. هدف در اینجا یافتن ویژگی‌های اساسی شیار سازهای کوبه‌ای است که فایل‌های MIDI را متمایز می‌کند. این کار در برنامه midistats انجام شده است. در اینجا شرح کوتاهی آورده شده است.

تعدادی ابزار آزمایشی برای تحلیل کانال (ترک) سازهای کوبه‌ای به midistats اضافه شده و از طریق آرگومان‌های زمان اجرا قابل دسترسی هستند. هنگامی که از این ابزارها در اسکریپتی استفاده می‌شود که مجموعه‌ای از فایل‌های midi را پیمایش می‌کند، می‌توانید پایگاه‌داده‌ای از توصیف‌کننده‌های سازهای کوبه‌ای ایجاد کنید.

-corestats
خطی با ۵ عدد جدا شده با تب چاپ می‌کند، به عنوان مثال:
1 8 384 4057 375
تعداد ترک‌ها، تعداد کانال‌ها، تعداد تقسیمات در هر ضرب نت سیاه (ppqn)، تعداد شروع‌های نت در فایل midi، و حداکثر تعداد ضرب‌های نت سیاه در فایل midi را بازمی‌گرداند.

-pulseanalysis
تعداد شروع نت‌ها را به عنوان تابعی از زمان شروع آن‌ها نسبت به ضرب می‌شمارد، آن‌ها را در ۱۲ بازه دسته‌بندی می‌کند و نتیجه را به عنوان یک تابع چگالی احتمال گسسته بازمی‌گرداند. به طور کلی، توزیع شامل چند قله مربوط به نت‌های سیاه یا چنگ است. اگر توزیع یکنواخت باشد، نشان می‌دهد که زمان وقوع نت‌ها به ضرب‌ها و کسرها کوانتیزه نشده است. در اینجا یک نمونه خروجی آورده شده است:
0.349,0.000,0.000,0.160,0.000,0.000,0.298,0.000,0.000,0.191,0.000,0.000

-panal
تعداد شروع‌های نت را برای هر ساز کوبه‌ای می‌شمارد. عدد اول کد (زیروبمی) ساز و عدد دوم تعداد رخدادها است، به عنوان مثال:
35 337 37 16 38 432 39 208 40 231 42 1088 46 384 49 42 54 1104 57 5 70 1040 85 16

-ppatfor n
که در آن n شماره کد ساز کوبه‌ای است. هر ضرب با یک عدد ۴ بیتی نشان داده می‌شود که در آن موقعیت بیتِ روشن، زمان شروع ضربه درام را در آن ضرب نشان می‌دهد. بیت‌ها از چپ به راست مرتب شده‌اند (بیت‌های با مرتبه بالاتر به بیت‌های با مرتبه پایین‌تر). این ترتیبی از بیت‌ها است که در یک سری زمانی انتظار دارید. بنابراین ۰ نشان می‌دهد که هیچ شروع نتی در آن ضرب وجود نداشته است، ۱ نشان‌دهنده شروع نت در انتهای ضرب است، ۴ نشان‌دهنده شروع نت در وسط ضرب است، و غیره. این تابع رشته‌ای از اعداد از ۰ تا ۷ را بازمی‌گرداند که نشان‌دهنده وجود شروع نت‌ها برای ساز کوبه‌ای انتخاب‌شده در توالی ضرب‌های فایل midi است. در اینجا نمونه کوتاه‌شده‌ای از خروجی آورده شده است:
11 71 c1 1 11 51 f1 c1 1 11 51 e1 1 11 d1 c1 31 1 1 1 21 b1 d1 d1 51
51 51 51 51 41 71 c1 11 1 11 41 11 1 11 41 11 1 11 41 11 31 51 41 11

-ppat
برنامه midistats تلاش می‌کند دو ساز کوبه‌ای را در فایل midi بیابد که نزدیک‌ترین عملکرد را به طبل بزرگ (bass drum) و اسنیر (snare drum) دارند. اگر ناموفق باشد، پیامی مبنی بر شکست بازمی‌گرداند. در غیر این صورت، موقعیت شروع این درام‌ها را در یک بایت ۸ بیتی برای هر ضرب نت سیاه در فایل midi کدگذاری می‌کند. ۴ بیت پایینی (راست) طبل بزرگ و ۴ بیت بالایی (چپ) اسنیر را به همان روشی که در بالا برای -ppatfor توصیف شد کدگذاری می‌کنند. اعداد صحیح در مبنای شانزده (هگزادسیمال) چاپ می‌شوند.
02 88 20 02 a0 08 80 02 82 08 80 02 82 08 80 02 82 08 80 02 82 08
80 02 82 08 80 02 82 08 80 02 82 08 20 a0 0a 08 80 02 82 08 80 02

-ppathist
هیستوگرام مقادیری را که هنگام اجرای -ppat ظاهر می‌شوند محاسبه کرده و نمایش می‌دهد، به عنوان مثال:
bass 35 337
snare 38 432
1 (0.1) 64 32 (2.0) 8 33 (2.1) 136 144 (9.0) 8 145 (9.1) 136
کد ساز کوبه‌ای باس، تعداد شروع‌ها، و کد ساز کوبه‌ای اسنیر و تعداد شروع‌ها در دو خط اول آورده شده است. در خط بعدی تعداد دفعات وقوع هر مقدار در فهرست -ppat ارائه می‌شود. عدد درون پرانتز دو مقدار ۴ بیتی را با یک نقطه جدا می‌کند؛ بنابراین 33 = (2*16 + 1).

-pitchclass
توزیع رده زیروبمی را برای کل فایل midi بازمی‌گرداند.

-keystability
فایل midi را به واحدهای ۸ ضربی (احتمالاً ۲ میزان) قطعه‌بندی می‌کند و برای هر بخش از الگوریتم Craig Sapp برای تعیین سرکلید بر اساس توزیع رده‌های زیروبمی استفاده می‌کند. این گزینه تعداد دیزها (عدد مثبت) یا تعداد بمل‌ها (عدد منفی) را برای آن سرکلید بازمی‌گرداند. به عنوان مثال، کلید سل ماژور یا می مینور با مقدار 1 نشان داده می‌شود.
فهرست دیزها/بمل‌ها در خط زیر بازگردانده می‌شود:
localkeysf 0 0 0 0 0 1 0 0 0 0 0 0 3 0 0 0 0 0 -1 -5 -5 -5 -5
به عنوان مثال در توالی بالا (ABBA/Money, Money, Money.7.mid) سرکلید با لا مینور آغاز می‌شود اما در ۸ میزان آخر به سی بمل مینور تغییر می‌یابد.
مراقب کلیدهای مترادف (enharmonic) باشید. به عنوان مثال، سی ماژور (۵ دیز) و دو بمل ماژور (۷ بمل) حاوی نت‌های یکسانی هستند. به همین ترتیب فا دیز ماژور (۶ دیز) و سل بمل ماژور (۶ بمل)، و دو دیز ماژور (۷ دیز) و ر بمل ماژور (۵ بمل)، و تمام معادل‌های کلید مینور آن‌ها.

-nseqfor n
توالی نت برای کانال n. این گزینه رشته‌ای از بایت‌ها را تولید می‌کند که نشان‌دهنده وجود نت در یک واحد زمانی متناظر با نت چنگ است؛ بنابراین هر ضرب نت سیاه با دو بایت نشان داده می‌شود. رده زیروبمی با شماره خط روی حامل نشان داده می‌شود که در آن ۰ نت دو (C) است. بدین ترتیب نت‌ها در یک گام با ۷ عدد نشان داده می‌شوند و دیزها و بمل‌ها نادیده گرفته می‌شوند. شماره خط سپس به موقعیت بیتی در بایت تبدیل می‌شود تا رده‌های زیروبمی با اعداد ۱، ۲، ۴، ۸ و غیره نشان داده شوند. یک آکورد متشکل از دو شروع نت، دو بیت متناظر را فعال می‌کند. اگر می‌خواستیم گام کامل کروماتیک متشکل از ۱۲ زیروبمی را نمایش دهیم، به اعداد صحیح دو بایتی یا دو برابر حافظه نیاز داشتیم.
اگرچه دقت تفکیک زیروبمی برای تشخیص آکوردهای ماژور یا مینور کافی نیست، اما باید برای شناسایی برخی الگوهای تکرارشونده کافی باشد.

-nseq
مشابه گزینه بالا است با این تفاوت که برای تمام کانال‌ها به جز کانال سازهای کوبه‌ای اعمال می‌شود.

-nseqtokens تعداد عناصر توالی متمایز را برای هر کانال بازمی‌گرداند. شماره کانال و تعداد عناصر متمایز جداشده با کاما در فهرستی جداشده با تب برای تمام کانال‌های فعال به جز کانال سازهای کوبه‌ای بازگردانده می‌شود. در اینجا یک مثال آورده شده است:
2,3 3,4 4,11 5,6 6,3 7,3 8,6 9,3 11,2 12,1

-ver (شماره نسخه)

Seymour Shlien <fy733@ncf.ca>

22 February 2026