MIDI

ממשק דיגיטלי לכלים מוזיקליים (MIDI) הוא פרוטוקול סטנדרטי לחיבור מחשבים לכלים מוזיקליים, לתאורה של במות ולמדיה אחרת שמבוססת על זמן.

החל מגרסה 13 של Android, נוספה תמיכה ב-MIDI 2.0 להעברת הנתונים ב-USB. MIDI 2.0 הוא תקן MIDI חדש יותר שהוגדר בשנת 2020. הפרוטוקול הזה מוסיף תכונות כמו תקשורת דו-כיוונית, רזולוציה גבוהה יותר והעברת נכסים. כשהתמיכה ב-MIDI מופעלת בפלטפורמה, תמיד מופעל גם מצב המארח של MIDI 2.0 דרך USB.

למעשה, MIDI לא קשור לאודיו. עם זאת, מכיוון ש-MIDI משמש בדרך כלל ליצירת מוזיקה, המאמר הזה מופיע בקטע 'אודיו'.

MIDI ל-NDK

ב-Android 10 קל יותר להעביר אפליקציות אודיו מקצועיות באמצעות MIDI לפלטפורמת Android.

AMidi הוא NDK API שמאפשר למפתחי אפליקציות לשלוח ולקבל נתוני MIDI באמצעות קוד C/C++.

אפליקציות MIDI ל-Android בדרך כלל משתמשות ב-API ‏ midi כדי לתקשר עם שירות ה-MIDI ל-Android. אפליקציות MIDI מסתמכות בעיקר על הכיתה MidiManager כדי לזהות, לפתוח ולסגור אובייקט MidiDevice אחד או יותר, ולהעביר נתונים אל כל מכשיר וממנו דרך יציאות הקלט והפלט של MIDI במכשיר.

אמצעי תחבורה

שכבת התעבורה הפיזית שצוינה ב-MIDI 1.0 המקורי היא לולאת זרם עם מחבר DIN 5-pin.

מאז MIDI 1.0, הוגדרו דרכים נוספות להעברה, כולל MIDI דרך USB ו-MIDI דרך Bluetooth עם צריכת אנרגיה נמוכה (BLE).

MIDI ל-Android

ב-Android יש תמיכה ב-USB On-The-Go, שמאפשרת למכשיר Android לשמש כמארח USB כדי להפעיל ציוד היקפי USB. ממשקי ה-API של מצב מארח USB מאפשרים למפתחים להטמיע MIDI דרך USB ברמת האפליקציה, אבל עד לאחרונה לא היו ממשקי API מובנים לפלטפורמה ל-MIDI.

החל מהגרסה Android 6.0‏ (Marshmallow), יצרני המכשירים יכולים להפעיל תמיכה אופציונלית ב-MIDI בפלטפורמה. מערכת Android תומכת ישירות ב-USB, ב-BLE ובתעבורה וירטואלית (בין אפליקציות). Android תומך ב-MIDI 1.0 באמצעות מתאם חיצוני.

לפרטים על תכנות אפליקציות באמצעות ממשקי ה-MIDI API, ראו את החבילה android.media.midi.

בהמשך המאמר נסביר איך יצרני מכשירי Android יכולים להפעיל תמיכה ב-MIDI בפלטפורמה.

הפעלת תעבורת MIDI 1.0

הטמעת MIDI 1.0 תלויה ב-ALSA להעברות במצב מארח USB ובמצב USB היקפי. ה-ALSA לא משמש להעברות BLE וווירטואליות.

מצב מארח USB

כדי להפעיל MIDI במצב מארח USB, קודם צריך לתמוך במצב מארח USB באופן כללי, ואז להפעיל את CONFIG_SND_RAWMIDI ו-CONFIG_SND_USB_MIDI בהגדרות הליבה.

התעבורה של MIDI דרך USB מוגדרת באופן רשמי לפי התקן Universal Serial Bus Device Class Definition for MIDI Devices Release 1.0 Nov 1, 1999 שפורסם על ידי USB Implementers Forum, Inc.

מצב ציוד היקפי ב-USB

כדי להפעיל את MIDI במצב USB היקפי, יכול להיות שתצטרכו להחיל תיקונים בליבה של Linux כדי לשלב את drivers/usb/gadget/f_midi.c במנהל ההתקן של גאדג'ט ה-USB. התיקונים האלה זמינים לליבה של Linux בגרסה 3.10. התיקונים האלה עדיין לא עודכנו עבור ConfigFs (ארכיטקטורה חדשה למנהלי התקני USB), וגם לא מוזגו ב-upstream‏ kernel.org.

התיקונים מוצגים לפי סדר ההוספה (commit) שלהם לעץ הליבה בפרויקט kernel/common, בהסתעפות android-3.10:

  1. https://android-review.googlesource.com/#/c/127450/
  2. https://android-review.googlesource.com/#/c/127452/
  3. https://android-review.googlesource.com/#/c/143714/

בנוסף, צריך לבצע אחת מהפעולות הבאות:

  • עוברים אל הגדרות > אפשרויות למפתחים > רשתות ומסמנים את התיבה של MIDI בתיבת הדו-שיח Select USB Configuration.
  • כשהמכשיר מחובר למארח ה-USB, מחליקים למטה מהחלק העליון של המסך, בוחרים את האפשרות USB for ואז בוחרים באפשרות MIDI.

BLE

MIDI דרך BLE תמיד מופעל, בתנאי שהמכשיר תומך ב-BLE.

וירטואלי (בין אפליקציות)

התעבורה הווירטואלית (בין האפליקציות) תמיד מופעלת.

תביעת בעלות על התכונה

אפליקציות יכולות לבדוק אם יש תמיכה ב-MIDI באמצעות התכונה android.software.midi.

כדי להצהיר על תמיכה ב-MIDI, מוסיפים את השורה הבאה לקובץ device.mk:

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.software.midi.xml:system/etc/permissions/android.software.
midi.xml

למידע על הדרישות לשימוש בתכונה, אפשר לעיין במסמך ההגדרה של תאימות ל-Android‏ (CDD).

ניפוי באגים במצב מארח

במצב מארח USB, לא ניתן לבצע ניפוי באגים ב-Android Debug Bridge (adb) דרך USB. אפשרות חלופית מפורטת בקטע שימוש אלחוטי במאמר בנושא Android Debug Bridge.