กลับไปหน้ารวมไฟล์
midi-keypad-c37858.md

ชื่อโปรเจกต์: Midi Keypad

อยากลองทำเครื่องดนตรี MIDI (พวกเครื่องดนตรีที่เอาไว้ใช้กับโปรแกรมทำเพลงน่ะ) พี่เลยลองเอาปุ่มกดมาต่อกับ Arduino Micro ดู

ไปๆ มาๆ พี่ว่าใช้ Keypad ไปเลยง่ายกว่า ได้ตั้ง 16 ปุ่มแน่ะ! ถึงแม้ Keypad มันจะไม่ได้เทพขนาดที่กดพร้อมกันหลายๆ ปุ่มได้ลื่นไหลสุดๆ แต่บอกเลยว่าทำเล่นเองโคตรสนุก

ลองเทสตัว Prototype กับ VST plugin อย่าง Prominy V-Metal ดูสักหน่อย

การต่อสาย (Wiring)

การต่อ Keypad กับหน้าจอนี่พื้นฐานมากน้อง ใช้ Pins ตั้งแต่ 2 ถึง 11 จัดไปอย่าให้เสีย

บัดกรี Header

อันดับแรกไปตัด Female Header ขนาด 17 Pins มา 2 อัน (เอาไว้เสียบ Arduino) และขนาด 4 Pins อีกอัน (สำหรับจอ OLED)

บัดกรี Header ลงบน Strip Board ได้เลยวัยรุ่น เอา Arduino Micro มาลองวางเทียบดูด้วยนะว่าตรงมั้ย (เว้นระยะห่างระหว่าง Header ไว้ 5 ช่องพอดิบพอดี)

ส่วนตัวพี่ไม่ได้ใช้ Header สำหรับจอ OLED นะ เพราะพี่ถอน Pins เดิมออกแล้วบัดกรีตรงลงบอร์ดไปเลย

การจัดวางอุปกรณ์

จะใช้ปืนกาวอัด หรือจะเจาะรูบน Strip Board แล้วขันสกรูยึด Keypad ก็เอาที่สบายใจ

พี่แนะนำให้ยึด Keypad ให้แน่นก่อนจะเริ่มบัดกรีสายนะ จะได้กะความยาวสายได้แม่นๆ ไม่ต้องมานั่งแก้ใหม่

บัดกรี Keypad

มาเข้าเรื่องกันเลย นี่คือวิธีบัดกรี Keypad

ระวังหน่อยนะน้อง อย่าเผลอทำพลาดล่ะ ตอนเช็คว่า Pins ไหนเสียบตรงไหนบน Arduino เพราะพอมันพลิกด้านแล้วเดี๋ยวมันจะกลับด้านกัน (Reverse) ดูดีๆ

เริ่มบัดกรีจาก Pin 11 ก่อน แล้วค่อยไล่ไปอันถัดๆ ไป

บัดกรีหน้าจอ OLED

มาต่อกันที่หน้าจอ OLED

จอนี้ใช้ Protocol แบบ I2C เพราะฉะนั้นต้องต่อเข้ากับ Pin 2 (SDA) และ Pin 3 (SCL) (บอร์ดที่ใช้ชิป ATmega32U4 จะเป็นแบบนี้ทุกตัวแหละ)

ส่วนสาย GND กับ 5V ก็จัดให้อยู่ในแถวเดียวกันไปเลย

และแล้ว Prototype ของเราก็เสร็จเรียบร้อย! สุดท้าย อย่าลืมเสียบ Arduino Micro ให้ถูกด้านนะ (เอาช่อง USB ไว้ทางด้านขวา)

พวกภาพวาดที่ใช้ในนี้มาจาก usini cards เป็น Public Domain เอาไปใช้กันได้เต็มที่เลยน้อง!

ตัว Code

พอ Keypad เราหล่อเท่พร้อมใช้งานแล้ว ก็ถึงเวลาอัปโหลด Sketch ลง Arduino Micro กันแล้วล่ะ

Libraries

Code นี้ใช้ Libraries ทั้งหมด 3 ตัว

  • MidiUSB โดย Gary Grewal (เอาไว้จัดการ USB MIDI)
  • U8g2 โดย olikraus (สำหรับแสดงผลจอ OLED)
  • Keypad โดย NullKraft (สำหรับอ่านค่า Keypad)

ตัว MidiUSB กับ U8g2 น้องไปกดติดตั้งผ่าน Library Manager ในโปรแกรม Arduino ได้เลย

ส่วนตัว Keypad นี่จะ มีความกวนนิดนึง เพราะพี่ใช้เวอร์ชันที่เขาโมดิฟายมาจากตัวต้นฉบับของ Mark Stanley และ Alexander Brevig อีกที

ตัวนี้มันจะเทพตรงที่กดหลายปุ่มพร้อมกันได้ (Multiple-key input)

คือมันกดหลายปุ่มได้แหละ แต่มันก็ทำงานได้ประมาณนึงนะ เพราะเป้าหมายพี่คือทำเครื่องดนตรีแบบ Monophonic (เล่นทีละโน้ต) มันเลยทำงานได้เนียนๆ แต่ถ้าจะเอาไปเล่นแบบคอร์ด (Chords) มันจะมี ความหน่วง (Delay) เล็กน้อยระหว่างแต่ละโน้ตนะน้อง

วิธีการติดตั้ง Library Keypad:

  • โหลดไฟล์ Keypad-master.zip มา
  • แตกไฟล์ลงใน Folder arduino/libraries ในเครื่องของน้อง ให้มี Folder ชื่อ Keypad-Master อยู่ข้างในนั้นเป็นอันจบ

การตั้งค่า Preset ของน้อง

พี่พยายาม Comment ใน Code ไว้ให้เยอะที่สุดเท่าที่จะทำได้แล้ว เพราะงั้นพี่คงไม่อธิบายลงลึกมากนะ มีอะไรสงสัยถามทิ้งไว้ใน Comment ได้เลย

ค่าพารามิเตอร์ส่วนใหญ่จะกองอยู่ช่วงต้นๆ ของ Code ตรงนั้นแหละที่เราจะตั้งค่าตัวโน้ต (Notes) และน้ำหนักเสียง (Velocity - หรือความดังของโน้ตนั่นแหละ)

ปัญหาเรื่อง Memory

พี่เจอปัญหาเรื่อง Memory เกือบเต็มเหมือนกัน ส่วนใหญ่มาจากจอนี่แหละ

Library U8g2 มันกิน RAM (Dynamic Memory) ไปเยอะมาก

จริงๆ จะหนีไปใช้ u8x8 หรือ Library ของ Adafruit สำหรับ SSD1306 ก็ได้นะ แต่ Font มันมีให้เลือกน้อย ไม่เล็กไปก็ใหญ่เกิน พี่ไม่ค่อยชอบ

พี่เลยต้องจำกัด Preset ไว้แค่ 8 อันพอ แต่ถ้าน้องอยากได้มากกว่านั้น ลองไป Optimize Code ดูนะ เช่น ตัดส่วนที่ตั้งค่า Velocity แยกแต่ละโน้ตทิ้งไป ก็น่าจะช่วยได้เยอะ

ชื่อ Preset

ชื่อจะเก็บอยู่ใน Array นี้เลย:

String preset_name [PRESET] = {"Du Riechst So Gut", "FF - Replica", "DrumKit", "A", "4", "5", "6", "B"};

ตัวโน้ต (Notes)

โน้ตจะเก็บอยู่ใน Array 2 มิติ เรียงตามลำดับปุ่มเลย (ปุ่มที่ 1 คือ 1, ปุ่มที่ 2 คือ 2 ไปเรื่อยๆ)

int notes [PRESET] [NB_BUTTONS] = {
{38, 38, 39, 39, 43, 46, 38, 38, 48, 46, 45, 45, 57, 60, 60, 57}, //Preset 1
{37, 40, 42, 39, 40, 38, 41, 40, 48, 46, 45, 45, 57, 60, 60, 57}, // Preset 2
{35, 35, 38, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 55, 57}, // Preset 3
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  //Preset A
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  //Preset 4
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  //Preset 5
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  //Preset 6
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  //Preset B
};

โน้ตพวกนี้จะถูกเก็บเป็น MIDI Notes (ค่าตั้งแต่ 0 ถึง 127) ลองไปเปิดตารางเทียบกับตัวโน้ตดนตรีดูเอาเองนะวัยรุ่น

น้ำหนักเสียง (Velocity)

อันนี้ก็เหมือนกับโน้ตเลย

int velocity [PRESET] [NB_BUTTONS] = {
{70, 70, 70, 70, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, //Preset 1
{70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70}, //Preset 2
{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100}, //Preset 3
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset A
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 4
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 5
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset 6
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //Preset B
};

ตัวเปลี่ยน Velocity

พี่ทำระบบให้เปลี่ยน Velocity ได้เวลาที่กด ปุ่ม D

น้องสามารถเลือกได้ว่าจะใช้ฟีเจอร์นี้ใน Preset ไหนบ้าง โดยการไปแก้ค่า Boolean ใน Array velocity_changer

const int velocity_button = 15; //ใช้ปุ่ม D เปลี่ยน Velocity ถ้าตั้งค่า velocity changer เป็น true
const int VELOCITY_CHANGE = 100; //ค่า Velocity ตอนกดปุ่ม D
bool velocity_changer [PRESET] = {false, true, false, false, false, false, false, false};

เปลี่ยนชื่อ MIDI Device ของตัวเอง

ปกติ MIDI Keypad ของน้องจะชื่อว่า Arduino Micro

ถ้าอยากเปลี่ยนชื่อให้มันดูเท่ๆ ของเราเอง น้องต้องเข้าไปสร้าง Board ใหม่ในไฟล์ boards.txt แล้ว Rename มันซะ (หลักการสั้นๆ คือแบบนี้)

วิธีการใช้งาน MIDI Keypad

ถ้ายังไม่มีโปรแกรมทำเพลง พี่แนะนำให้ลองใช้ LMMS ดู ฟรีและดีแบบ Open Source ด้วยนะ

แต่ละปุ่มจะเล่นโน้ตตามที่ตั้งไว้ใน Code ยกเว้นปุ่ม *

ปุ่ม * เอาไว้เปิดโหมดเลือก Preset: พอกดปุ่มนี้แล้ว ให้กดปุ่ม 1 ถึง B เพื่อเลือก Preset ที่ต้องการ แล้ว กดปุ่ม * อีกรอบ เพื่อออกจากโหมดเลือก Preset

ชุดอุปกรณ์กีตาร์ของพี่ (Guitar Rig)

สุดท้าย พี่จะแชร์สั้นๆ ว่าพี่ใช้ Keypad นี้เล่นเป็นกีตาร์ไฟฟ้าได้ยังไง

พี่ใช้โปรแกรม Reason ในการรันพวก VST Plugins (ปลั๊กอินสำหรับสร้าง/แต่งเสียง) แต่น้องจะใช้โปรแกรมอื่นก็ได้นะ ขอแค่ให้มันรองรับ VST ก็พอ

นี่คือรายชื่อ Plugins ที่พี่ใช้:

  • Native Instrument Kontakt: เป็นโปรแกรมหลักที่เอาไว้รัน Plugin กีตาร์
  • Prominy V-Metal: Plugin เสียงกีตาร์ (เสียงโคตรดี)
  • Guitar Rig 5: Plugin สำหรับทำ Effect กีตาร์

พี่ใช้กีตาร์สองตัวผสมกันเพื่อให้ได้เสียงที่มันหนักแน่น (Heavy) ขึ้น ตัวแรกเล่นทีละโน้ต (No legato) ส่วนตัวที่สองเล่นเป็นคอร์ด (Power Chords)

ส่วนพวก Effect พี่ใช้ Shredder Solo ที่เอามาโมดิฟายต่อนิดหน่อย

พี่กำลังคิดจะทำเวอร์ชันแบบง่ายๆ (Light version) ที่ใช้งานกับ LMMS หรือ SamplerBox ได้เลยโดยใช้พวกไฟล์ Samples ใครสนใจก็บอกกันมาได้ใน Comment หรือทักทายมาทาง Twitter พี่ได้นะ

แต่อาจจะเท่น้อยกว่านี้นิดนึงนะ ฮ่าๆ :-(

ข้อมูลทางเทคนิคแบบจัดเต็ม (EXPANDED TECHNICAL DETAILS)

ตรรกะ MIDI over Serial

ไอ้ตัว MIDI Keypad นี้จะเปลี่ยน Arduino ของน้องให้กลายเป็นเครื่องดนตรี Custom หรือ DAW controller สุดเท่

  • Button Matrix: เพื่อความประหยัด Pins เราเลยจัดปุ่มแบบ Matrix (เช่น 4x4 ได้ 16 ปุ่ม) หรือจะใช้ Resistor Ladder เพื่ออ่านค่าปุ่มหลายปุ่มผ่าน Analog Pin เดียวก็ได้
  • Protocol: พอกดปุ่มปุ๊บ Arduino จะส่งข้อความ MIDI Note-ON (ขนาด 3 Bytes: 0x90, เลขโน้ต, Velocity) ผ่าน Serial Port ที่ Baud Rate 31,250

การเชื่อมต่อและการปรับแต่ง

  • DAW Connectivity: ข้อมูล Serial สามารถส่งให้คอมพิวเตอร์เห็นเป็น Virtual MIDI Port ได้ (ใช้พวก Software อย่าง Hairless MIDI-to-Serial ช่วย)
  • Control Features: ตัว Firmware สามารถโมดิฟายให้ส่งข้อความ Control Change (CC) แทนตัวโน้ตได้นะ เอาไว้ไปคุมสไลด์ปรับความดัง (Volume), แพนเสียง (Panning) หรือคุมค่า Effect ในโปรแกรมทำเพลงระดับโปรได้สบายๆ เลยน้อง!

ข้อมูล Frontmatter ดั้งเดิม

title: "Midi Keypad"
description: "Making music with a keypad? Seems like a weird idea! But we will see with the good software, we can even make an electric guitar out of it!"
author: "usini"
category: "Audio & Sound"
tags:
  - "midi"
  - "music"
  - "guitar"
views: 18551
likes: 6
price: 2450
difficulty: "Intermediate"
components:
  - "1x 36-pin 0.1\" Female header - pack of 5!"
  - "1x Soldering iron (generic)"
  - "1x Monochrome 128x32 I2C OLED graphic display"
  - "1x 4x4 Matrix Keypad"
  - "1x Arduino Micro"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://github.com/maditnerd/keypad_midi"
  - "https://github.com/maditnerd/keypad_midi"
documentationLinks: []
passwordHash: "6a58d3a68edb03da6e2a1faa322f59b338ef18ba90ab88241e9a6fcddb968884"
encryptedPayload: "U2FsdGVkX19v/Ms/40ZmUyXmShTNSXCV4+61PNfT1CUA9v/MTHB2RBOHfzHne4kQJ0E78b0yTx71M7PTwM9y9dglbg29WL/nX6y1NZn3mXU="
seoDescription: "Build a Midi Keypad with Arduino and software to create music or even an electric guitar. Fun DIY project guide."
videoLinks:
  - "https://www.youtube.com/embed/Hx9eIiDx2Bc"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/midi-keypad-c37858_cover.jpg"
lang: "th"