MIDI

Musical Instrument Digital Interface (MIDI) คือโปรโตคอลมาตรฐานสำหรับการเชื่อมต่อคอมพิวเตอร์กับเครื่องดนตรี แสงบนเวที และสื่ออื่นๆ ที่เน้นเวลา

ตั้งแต่ Android 13 เป็นต้นไป ระบบจะเพิ่มการรองรับ MIDI 2.0 ลงในการรับส่ง USB MIDI 2.0 เป็นมาตรฐาน MIDI ที่ใหม่กว่าที่กำหนดในปี 2020 โปรโตคอลนี้เพิ่มฟีเจอร์ต่างๆ เช่น การสื่อสาร 2 ทาง ความละเอียดที่สูงขึ้น และการแลกเปลี่ยนพร็อพเพอร์ตี้ ระบบจะเปิดใช้ MIDI 2.0 ผ่านโหมดโฮสต์ USB เสมอเมื่อเปิดใช้การรองรับ MIDI ในแพลตฟอร์ม

ความจริงแล้ว MIDI ไม่ได้เกี่ยวข้องกับเสียง แต่เนื่องจาก MIDI มักใช้กับเพลง เราจึงจัดบทความนี้ไว้ในส่วนเสียง

MIDI สำหรับ NDK

Android 10 ช่วยให้พอร์ตแอปเสียงระดับมืออาชีพที่ใช้ MIDI ไปยังแพลตฟอร์ม Android ได้ง่ายขึ้น

AMidi เป็น NDK API ที่ช่วยนักพัฒนาแอปสามารถส่งและรับข้อมูล MIDI ด้วยโค้ด C/C++

โดยปกติแล้วแอป MIDI ของ Android จะใช้ midi API เพื่อสื่อสารกับบริการ MIDI ของ Android แอป MIDI จะใช้คลาส MidiManager เป็นหลักในการค้นพบ เปิด และปิดออบเจ็กต์ MidiDevice อย่างน้อย 1 รายการ และส่งข้อมูลไปยังและจากอุปกรณ์แต่ละเครื่องผ่านพอร์ตอินพุตและเอาต์พุต MIDI ของอุปกรณ์

การขนส่ง

เลเยอร์การรับส่งที่ระบุใน MIDI 1.0 เวอร์ชันเดิมคือลูปกระแสไฟฟ้าที่มีตัวเชื่อมต่อ DIN 5 พิน

ตั้งแต่ MIDI 1.0 ได้มีการกำหนดการรับส่งเพิ่มเติม ซึ่งรวมถึง MIDI ผ่าน USB และ MIDI ผ่านบลูทูธพลังงานต่ำ (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 ในการกำหนดค่าเคอร์เนล ดูการกำหนดค่าเคอร์เนล Android

การรับส่ง MIDI ผ่าน USB ได้รับการกําหนดอย่างเป็นทางการโดยมาตรฐาน คำจำกัดความคลาสอุปกรณ์ Universal Serial Bus สำหรับอุปกรณ์ MIDI เวอร์ชัน 1.0 วันที่ 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

แพตช์แสดงตามลำดับที่คอมมิตสำหรับทรีเคอร์เนลที่โปรเจ็กต์ 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 ในกล่องโต้ตอบเลือกการกำหนดค่า USB
  • ในขณะที่เชื่อมต่อกับโฮสต์ USB ให้ดึงลงจากด้านบนของหน้าจอ เลือกรายการ USB สำหรับ แล้วเลือก 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