🧭 خلاصه (Summary)

MIDI Out CHOP رویدادهای MIDI را به هر دستگاه MIDI در دسترس ارسال می‌کند، زمانی‌که مقدار ورودی کانال‌هایش تغییر کند.
برای کنترل دقیق‌تر، می‌توان از کلاس پایتون midioutCHOP استفاده کرد تا هر نوع رویداد MIDI را از طریق همین CHOP به دستگاه ارسال کند.
در Tscript نیز دستور midi برای خروجی رویدادهای MIDI استفاده می‌شود.

دستگاه‌های مقصد می‌توانند نرم‌افزارهایی مثل midisynth یا سخت‌افزارهای متصل به پورت‌های سریال باشند.
کانال‌ها برای کنترل ارسال رویدادها استفاده می‌شوند و در آخرین بازه زمانی (از موقعیت قبلی تایم‌لاین تا موقعیت فعلی) ارزیابی می‌شوند.

MIDI Out CHOP فقط وقتی رویداد می‌فرستد که مقدار ورودی در همان بازه تغییر کرده باشد.
زمان‌بندی همه‌ی رویدادها حفظ می‌شود، به‌شرطی‌که تایم‌لاین در حالت Realtime باشد (پرچم “Realtime” در منوی بالا فعال باشد).


🎛️ نام‌گذاری کانال‌ها (Channel Naming)

کانال‌ها با نام خود به رویدادها نگاشت می‌شوند.
رویدادهایی مانند نت‌ها، کنترلرها و وِلاسیتی باید با شماره‌ی مربوط همراه باشند:

  • n65 → نت شماره ۶۵

  • c7 → کنترلر شماره ۷

  • اگر شماره حذف شود، مقدار کانال به عنوان شماره نت تفسیر می‌شود.

  • سایر رویدادها که کل کانال MIDI را هدف می‌گیرند (مثل Program Change یا Pitch Wheel) نیازی به شماره ندارند.

پیشوند ch برای تعیین شماره کانال MIDI استفاده می‌شود.
مثلاً:

  • ch1n45 → نت شماره ۴۵ روی کانال MIDI شماره ۱

  • ch14c7 → کنترلر ۷ (ولوم) در کانال ۱۴

می‌توان با Rename CHOP نام کانال‌ها را قبل از ورود به MIDI Out CHOP تغییر داد.


🎚️ وِلاسیتی (Velocity)

مقدار کانال‌های ورودی به‌عنوان وِلاسیتی نت‌ها ارسال می‌شود.
اگر Normalize = None، مقدار باید بین ۰ تا ۱۲۷ باشد.
اگر Normalize = 0→1، مقادیر بین ۰ تا ۱ به محدوده‌ی ۰ تا ۱۲۷ نگاشت می‌شوند.


⚙️ نکات عملی و عملکردی

  • گزینه‌ی Cook Every Frame باعث می‌شود CHOP در هر فریم اجرا شود، حتی اگر روی صفحه دیده نشود.

  • گزینه‌های All Volume Off / On رویدادهایی برای کنترلر شماره ۷ در هر ۱۶ کانال ایجاد می‌کنند.

  • خروجی MIDI در رشته‌ای جداگانه اجرا می‌شود تا کندی عملکرد TouchDesigner را کاهش دهد.

  • در حالت Time Slice برای رویدادهای Note و Controller فعال است (نه برای Program Change یا SysEx).

  • نت‌ها فقط زمانی Note On می‌فرستند که مقدار ورودی از ≤۰ به >۰ برسد.

  • به همین ترتیب، Note Off وقتی اتفاق می‌افتد که مقدار به ۰ برگردد.


📦 مثال‌ها

نام کانال توضیح
ch3n60 نت شماره ۶۰ در کانال ۳. وقتی مقدار از ۰ به بالاتر برود، Note On می‌فرستد.
ch5n مقدار کانال شماره نت است. وقتی عدد تغییر کند (مثلاً ۵۳ → ۷۸)، نت قبلی Off و نت جدید On می‌شود.
ch14c7 مقدار کانال به کنترلر ۷ (ولوم) در کانال ۱۴ ارسال می‌شود. مقادیر ۰ تا ۱ به ۰ تا ۱۲۷ نگاشت می‌شوند.

ویژگی‌های پیشرفته در حالت Time Slice

  • پیشوند کانال‌ها به‌صورت پیش‌فرض “ch” است (ch1 تا ch16).

  • نت‌ها با n و کنترلرها با c مشخص می‌شوند.

  • از نسخه‌های جدید، Aftertouch، Pressure و Pitch Wheel نیز پشتیبانی می‌شود.

  • نرمال‌سازی مقادیر نت‌ها بین ۰–۱۲۷ یا ۰–۱.

  • MIDI Clock از کانال ramp (مثلاً bar ramp) خوانده می‌شود و می‌تواند سیگنال زمان را به بیرون بفرستد.

  • Program Change از طریق کانال‌های pc.

  • از کنترلرهای ۷ بیتی و ۱۴ بیتی پشتیبانی می‌شود.

  • امکان گرفتن جریان MIDI و ذخیره در فایل وجود دارد.


⚙️ پارامترها — صفحه Dest

پارامتر توضیح
Active روشن/خاموش‌کردن خروجی MIDI.
MIDI Destination انتخاب مقصد ارسال (به‌صورت پیش‌فرض MIDI Mapper).
Device Table مسیر Table DAT دستگاه MIDI.
Device ID شناسه‌ی دستگاه.
One Based Index ایندکس یک‌مبنایی (به‌جای صفر).
MIDI File نام فایل خروجی MIDI (در صورت ذخیره روی دیسک).
Write MIDI File نوشتن داده‌ها در فایل MIDI.
Channel Prefix پیشوند مورد انتظار برای تشخیص شماره کانال (مثل "ch" در ch1n44).
Cook Every Frame اجرای CHOP در تمام فریم‌ها، حتی بدون نمایش.

⚙️ پارامترها — صفحه Output

پارامتر توضیح
Automatic Note Off ارسال خودکار پیام “All Note Off” هنگام شروع یا پایان پخش.
All Notes Off ارسال پیام خاموشی تمام نت‌ها.
All Volume Off / On ارسال پیام کنترلر ۷ برای قطع یا فعال‌سازی ولوم.
Send Start/Stop/Continue Events ارسال رویدادهای هم‌زمان با توقف یا شروع تایم‌لاین.
Send MIDI Timecode ارسال MIDI Timecode (MTC) به‌صورت جریان پیام‌های quarter-frame.
Timecode Object/CHOP/DAT منبع زمان برای MTC (می‌تواند CHOP، DAT یا شیء Timecode باشد).

🎵 پارامترها — صفحه Note

پارامتر توضیح
Note Name نام پایه‌ی کانال نت‌ها (اگر عددی پس از آن باشد، به‌عنوان شماره نت استفاده می‌شود).
Aftertouch Name نام کانال Aftertouch.
Pressure Name نام کانال Channel Pressure.
Normalize نرمال‌سازی مقادیر بین ۰–۱ به MIDI ۰–۱۲۷.
Pitch Wheel Name نام کانال Pitch Wheel.

🎚️ پارامترها — صفحه Control

پارامتر توضیح
Controller Name نام پایه‌ی کانال‌های کنترلر.
Controller Format انتخاب بین کنترلرهای ۷ بیتی یا ۱۴ بیتی.
Normalize نرمال‌سازی مقادیر به محدوده‌ی ۰–۱۲۷.
Program Change نام کانال تغییر برنامه.
Bar Ramp Name کانال ramp (۰ تا ۱) برای تولید MIDI Clock ticks در هر چهار ضرب.
Ticks per Bar تعداد تیک در هر بار (پیش‌فرض ۹۶ = ۴ بیت × ۲۴ تیک).

⚙️ پارامترها — صفحه Common

پارامتر توضیح
Time Slice فقط تغییرات بین cook قبلی و فعلی پردازش می‌شود.
Scope تعیین کانال‌هایی که تحت تأثیر قرار می‌گیرند.
Sample Rate Match نحوه‌ی هماهنگ‌سازی نرخ نمونه‌برداری چند ورودی.
Export Method / Root / Table تنظیمات خروجی داده‌ها (Export) برای پارامترها یا DATها.

🔌 ورودی‌ها (Operator Inputs)

ورودی توضیح
Input 0 CHOP ورودی شامل داده‌های MIDI برای ارسال.

📊 Info CHOP Channels

نام توضیح
events_sent تعداد رویدادهای MIDI ارسال‌شده.
start / length / sample_rate / num_channels اطلاعات عمومی CHOP.
time_slice / export_sernum وضعیت‌های داخلی و شمارش export.
cook_time / cook_frame / errors / warnings اطلاعات زمان cook و خطاها.

💡 نکات کاربردی برای استفاده در پروژه بابک

  1. اتصال TouchDesigner به سینت نرم‌افزاری یا سخت‌افزار MIDI
    مثلاً برای کنترل نورها یا سینت فیزیکی از طریق پارامترهای صوتی یا بصری.

  2. تبدیل داده‌های بصری به MIDI برای اجراهای زنده
    با Mapping مقادیر تصویر یا صدا به کانال‌های ch1c1, ch1n36 و … می‌توان داده‌های حرکتی را به صدا تبدیل کرد.

  3. هماهنگی با تایم‌لاین و BPM پروژه
    از Bar Ramp Name برای ایجاد MIDI Clock Sync با سایر نرم‌افزارها (Ableton Live، Logic، و غیره) استفاده کن.