ภาพรวมโปรเจกต์
โปรเจกต์ "Unopad Performance Controller" นี้คือฮาร์ดแวร์อินเทอร์เฟซแบบสั่งทำพิเศษ ที่เชื่อมโยงระหว่างการ "ฟิงเกอร์ดรัมมิ่ง" แบบสัมผัสได้ กับโปรแกรมสร้างเสียงระดับโปรอย่าง Ableton Live เข้าด้วยกัน ในขณะที่โปรเจกต์ MIDI ส่วนใหญ่หยุดแค่ขั้นตอน "Serial Print" โปรเจกต์นี้จัดเต็มให้เห็นภาพครบวงจร ตั้งแต่การเปลี่ยน Arduino UNO ให้กลายเป็นอุปกรณ์ MIDI ที่ระบบรู้จัก ไปจนถึงใช้งานได้จริง ด้วยการออกแบบ ตัวจัดการปุ่มแบบ Object-Oriented และใช้ระบบ Virtual MIDI Routing ทำให้ Unopad นี้ตอบสนองเร็วฉับไว (zero-latency) พร้อมให้คุณเอาไปใช้ทริกเกอร์เสียง, เปิดคลิป หรือเล่นเครื่องดนตรีเสมือนได้ทันที
เทียบกับบทสอนทำ MIDI controller ทั่วไปที่มักจบแค่โค้ด [Arduino](https://s.shopee.co.th/7fUgFAWSki) แต่ไม่สอนต่อยอดใน DAW เลย บทสอนนี้พี่รวบรวมทุกขั้นตอนที่จำเป็นมาไว้ในที่เดียว ช่วยให้น้องๆ มือใหม่เข้าใจกระบวนการทั้งหมด ตั้งแต่ต่อวงจรจนถึงสร้างสรรค์ผลงานได้เลย
ลงลึกเรื่องเทคนิค
- โปรโตคอล MIDI Message: Unopad ของเราสื่อสารด้วยโปรโตคอลมาตรฐาน MIDI 1.0 โดยส่งข้อมูลเป็นแพ็กเก็ต 3 ไบต์:
- Status Byte (0x90): บ่งบอกว่าเป็นเหตุการณ์ "Note On" บน MIDI Channel 1
- Data Byte 1 (Note Number): ค่าของโน้ตดนตรีเฉพาะ (เช่น 36 คือ C1 ซึ่งเป็นค่า MIDI note มาตรฐานของเสียง Kick Drum)
- Data Byte 2 (Velocity): ความแรงของการกด เนื่องจากสวิตช์มาตรฐานเป็นแบบไบนารี (เปิด/ปิด) ระบบจึงส่งค่า Velocity คงที่ที่ 127 (ค่าสูงสุด) ไปแทนความแรง
- วิธีแก้ข้อจำกัดของ USB-HID: Arduino UNO ใช้ชิป ATMega16U2 ในการสื่อสารผ่าน USB ซึ่งปกติแล้วมันจะระบุตัวเป็นพอร์ต Serial COM แทนที่จะเป็นอุปกรณ์ MIDI Class เพื่อแก้ปัญหานี้ โปรเจกต์ของเราจึงใช้ Hairless MIDI-Serial Bridge มันจะคอยฟังข้อมูลจากสตรีม Serial ความเร็วสูง (38,400 หรือ 115,200 Baud) แล้วนำมาแพ็กใหม่ให้เป็นแพ็กเก็ต MIDI ที่ระบบปฏิบัติการเข้าใจ
- การเชื่อมต่อด้วย Virtual MIDI (loopMIDI): เนื่องจากซอฟต์แวร์ DAW ไม่สามารถ "เชื่อมต่อ" ตรงๆ กับตัวแปลง Serial-to-MIDI ได้ เราจึงใช้ loopMIDI สร้างพอร์ตฮาร์ดแวร์เสมือนขึ้นมา มันทำหน้าที่เหมือน "สายเคเบิลซอฟต์แวร์" ที่รับข้อมูลจาก Hairless แล้วส่งต่อไปให้ Ableton Live เห็นเสมือนเป็นอินพุต MIDI จากฮาร์ดแวร์จริงๆ วิธีนี้คือการ "หลอก" DAW ให้เห็นคอนโทรลเลอร์ระดับโปรเลยทีเดียว
- สถาปัตยกรรม Firmware (แบบใช้ Class):
- การจัดการสถานะ: โค้ดของเราใช้คลาส
Buttonเพื่อติดตามสถานะล่าสุด (_lastState) ของแต่ละพิน สิ่งนี้สำคัญมาก เพราะถ้า Arduino ส่งข้อความ "Note On" ออกไปทุกมิลลิวินาทีที่ปุ่มถูกกดค้าง มันจะทำให้ DAW รวนเพราะเกิด "MIDI Feedback Loop" ได้ - ลอจิกเกต: ระบบจะส่งข้อความออกไป ก็ต่อเมื่อ
state != _lastStateเท่านั้น วิธีนี้รับประกันว่าจะส่งแพ็กเก็ต "NoteOn" 3 ไบต์ ออกไปแค่ครั้งเดียวตอนกด และส่ง "NoteOff" ออกไปแค่ครั้งเดียวตอนปล่อยปุ่ม
- การจัดการสถานะ: โค้ดของเราใช้คลาส
- ลอจิก Internal Pull-Up: การใช้โหมด
INPUT_PULLUPในโปรเจกต์นี้ ช่วยให้เราตัดความจำเป็นต้องใช้ตัวต้านทาน 10k ภายนอกทั้งหมด 9 ตัวออกไปได้ เนื่องจากซิลิกอนภายใน Arduino จะดึงพินให้ขึ้นไปที่ 5V ให้เอง พอเรากดปุ่ม มันก็จะต่อลง Ground (สถานะ LOW) การลดความซับซ้อนของฮาร์ดแวร์นี้ทำให้การเดินสายภายใน Unopad เรียบร้อยและน่าเชื่อถือขึ้นมาก
วิศวกรรมและการประกอบ
- การออกแบบตัวเรือนแบบยั่งยืน: Unopad ใช้ กล่องลำโพงเก่า มาเป็นโครงสร้าง วัสดุไม้ให้การลดทอนเสียงสะท้อนภายในได้ดีเยี่ยม (สำคัญมากสำหรับการฟิงเกอร์ดรัมมิ่งหนักๆ) และมีพื้นที่ภายในเพียงพอสำหรับวาง Arduino และมัดสายไฟให้เรียบร้อย
- การแมปสำหรับการแสดง: ใน Ableton เราแมปคอนโทรลเลอร์นี้เข้ากับ Drum Rack เนื่องจากปุ่มทั้ง 9 ปุ่มสัมพันธ์กับ MIDI notes 36-45 ซึ่งตรงเป๊ะกับ 9 แพดแรกของชุด Drum Kit มาตรฐานใน Ableton ทำให้ผู้สร้างบีตสามารถใช้งานแบบ "Plug and Play" ได้ทันที
- ความสามารถในการขยายและ UI: โปรเจกต์นี้มีแผ่นพลาสติกสองชั้นเป็นหน้าปก ช่วยปิดซ่อนสายไฟที่ดูรกๆ ไว้ข้างใต้ ในขณะเดียวกันก็ให้พื้นผิวเรียบๆ ระดับโปรสำหรับติดตั้งสวิตช์ ส่วนแผนขยายในอนาคตจะเพิ่ม โพเทนชิโอมิเตอร์แบบ Control Change (CC) และลอจิกการกดค้างเพื่อสลับช่วงเสียง (octave) ของเครื่องดนตรี
- การดีบั๊กสัญญาณ MIDI Sync: การใช้ Hairless MIDI debug log ช่วยให้นักพัฒนาสามารถตรวจสอบความสมบูรณ์ของสัญญาณได้ก่อนเปิด DAW ทำให้การหาปัญหาจากการเด้งของสวิตช์ (switch bounce) หรือการลัดวงจรของสายไฟทำได้ง่ายขึ้น