🧭 خلاصه (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 0CHOP ورودی شامل داده‌های 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، و غیره) استفاده کن.