เมื่อปีที่แล้ว ตอนไปเที่ยวค้างคืนกับโบสถ์ เพื่อนคนนึงที่กินกาแฟเยอะเกินมาบอกว่า "ต้องทำเครื่องดนตรีจากเลเซอร์ให้เท่ๆ สักอัน!" (เดี๋ยวพี่จะเอาโปรเจคนั้นมาให้ดูตอนเสร็จ) แต่ตอนนี้ มาดูวิธีที่พี่ค้นพบ (หลังจากกูเกิ้ลมานาน) ในการใช้ Arduino เป็นอุปกรณ์ MIDI กันก่อน
MIDI คืออะไร?
MIDI (Musical Instrument Digital Interface) เป็นโปรโตคอลที่ใช้ชุดคำสั่งเพื่อส่งโน้ตดนตรี คำสั่งพื้นฐานสุดคือ Note On ซึ่งจะส่งชื่อโน้ต (ระดับเสียง), ความเร็ว (ความแรงที่กดโน้ต) และช่องสัญญาณ คำสั่ง MIDI จะส่งผ่านสาย DIN หรือที่นิยมมากกว่าคือ USB จุดเด่นของ MIDI คือมันส่งแค่ระดับเสียงกับความเร็ว ไม่ได้ส่งประเภทของเสียงหรือระดับความดัง นี่เป็นประโยชน์เพราะเราสามารถมีคีย์บอร์ด MIDI ที่เชื่อมกับคอมพิวเตอร์ที่ลงซอฟต์แวร์ MIDI ไว้ แล้วค่อยไปตั้งค่าเสียงเครื่องดนตรีในนั้นได้
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เรากำลังจะทำ (อ่านหน่อยนะ):
- http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/?lang=en
- https://www.arduino.cc/en/Hacking/DFUProgramming8U2
- https://www.arduino.cc/en/Hacking/MidiWith8U2Firmware
1.0 เตรียมซอฟต์แวร์/บอร์ด
ก่อนเริ่ม ตรวจสอบให้แน่ใจว่าติดตั้ง Arduino IDE และ MIDI Keyboard (หรือแอพ MIDI อื่นๆ) เรียบร้อยแล้ว
หมายเหตุ: มีแค่ Arduino Uno กับ Arduino Mega เท่านั้นที่มีชิป 8u2 (หรือ 16u2)
2.0 แฟลช Arduino
ทำตามคำแนะนำ ที่นี่ เพื่อแฟลชไฟล์ dualMoco.hex ลง Arduino
ข้ามส่วนที่เขียนว่า "Download updated firmware" ไปเลย
และ ต้องแน่ใจว่าแฟลช dualMoco.hex ลงบอร์ดแล้วนะ!
2.5 ทดสอบและตั้งค่า Arduino
เมื่อเสียบ Arduino (หลังจากเปลี่ยนเฟิร์มแวร์แล้ว) คุณควรได้ข้อความประมาณ "We're setting up the device 'Moco/LUFA'." เมื่อ Arduino อยู่ในโหมด MIDI แล้ว เราจะอัปโหลดโค้ดผ่าน Arduino IDE ปกติไม่ได้
ต่อสายจัมเปอร์ระหว่างขา 4 กับ 6 บนหัว ICSP ตามภาพด้านล่าง:

การใส่จัมเปอร์นี้จะทำให้ Arduino กลับสู่โหมด "ปกติ" (เพื่อให้เราอัปโหลดโค้ดได้) เสียบกลับเข้าคอมพิวเตอร์ มันควรจะแสดงขึ้นมาเป็น Arduino ทีนี้เราก็อัปโหลดโค้ดได้แล้ว!
3.0 อัปโหลดโค้ด!
เราจะอัปโหลดโค้ดง่ายๆ ที่เล่นโน้ตเปิด-ปิด
#include <MIDI.h> // Include MIDI Library
#define C3 48 // Define some notes
MIDI_CREATE_DEFAULT_INSTANCE(); // Create an instance of the midi library
void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI); // Begin MIDI and listen to all channels
}
void loop() {
MIDI.sendNoteOn(C3, 120, 1); // Send note C3 on with a velocity of 120 and on channel 1
delay(500);
MIDI.sendNoteOff(C3, 0, 1);
delay(500);
}
ต่อไป ถอด Arduino ออกและถอดจัมเปอร์บนหัว ICSP ออก ตอนนี้มันกลับสู่โหมด "MIDI" แล้ว เสียบ Arduino กลับเข้าคอมพิวเตอร์และเปิดแอพ MIDI ที่ชอบ (เช่น Garage Band) ถ้าทุกอย่างถูกต้อง แอพของคุณควรตรวจจับ Arduino เป็นเครื่องดนตรี MIDI ได้ และมันจะเริ่มเล่นโน้ต C ซ้ำไปซ้ำมา
4.0+ ไปให้สุด
ไลบรารี Arduino MIDI นี่มันสุดยอดจริงๆ น้องเอ้ย (ขอบคุณ FortySevenEffects ด้วยนะ!) มันทำอะไรได้เพียบเลย อยากทำโปรเจคอะไรก็จัดไปได้หมดวัยรุ่น แค่จำให้ขึ้นใจ เวลาจะอัพโหลดโค้ดลงบอร์ดใหม่ อย่าลืมเอาจัมเปอร์กลับไปเสียบที่ ICSP ด้วยนะ! ห้ามช็อตนะตัวนี้
รายละเอียดทางเทคนิคแบบจัดเต็ม
การออกแบบเครื่องดนตรีดิจิทัล
โปรเจคนี้ทำให้ Arduino กลายเป็น "สมอง" ของ MIDI Controller ที่เราสร้างขึ้นเอง เป็นตัวกลางเชื่อมระหว่างปุ่มกดหรือเซ็นเซอร์บนฮาร์ดแวร์ ไปจนถึงซอฟต์แวร์อย่าง GarageBand หรือ Ableton
- MIDI Protocol Stack: Arduino จะทำหน้าที่จัดรูปแบบข้อมูลจากปุ่มหรือเซ็นเซอร์ให้กลายเป็นแพ็กเก็ต MIDI 3 ไบต์ (Status, Note, Velocity) พร้อมส่งออกไป
- Opto-Isolated Input: (สำหรับพอร์ต MIDI DIN 5 พิน) วงจรนี้ใช้ไอซี 6N138 เป็นตัวคั่นกลางทางไฟฟ้า (Opto-Isolator) เพื่อป้องกันปัญหา "Ground Loops" ระหว่างเครื่องดนตรีกับคอมพิวเตอร์ ทำให้ไม่มีเสียงรบกวนปนมาในสัญญาณเสียง
ออกแบบอินเทอร์เฟซให้ปัง
- USB-MIDI Emulation: สำหรับบอร์ดที่มีพอร์ต USB แบบ Native (เช่น Pro Micro) จะใช้ไลบรารี
MIDIUSBทำให้ Arduino ของเราถูกคอมพิวเตอร์มองเห็นเป็นคีย์บอร์ด MIDI แบบ "Plug-and-Play" ระดับโปรเลยทีเดียว ซอฟต์แวร์ดนตรีตัวไหนก็เชื่อมต่อได้สบายๆ