ATmega32U4ボードでMIDIライブラリを堪能
以前、ATmega32U4はMIDIライブラリの使用でUSB-MIDI機器として認識されるという耳寄り情報を入手しました。
> ATMEGA32U4の機能で、USB-MIDI機器として認識します(重要)
知らなかった。。。
Moco for LUFAもUSBホストシールドもいらなくなるのか。。 https://t.co/w6JXdo5tqA— HomeMadeGarbage (@H0meMadeGarbage) August 8, 2019
これまではMoco for LUFAというファームを使用してArduinoマイコンをMIDI機器化してMIDIでのマシン制御を楽しんでおりました。
ATmega32U4であればArduino IDEでLEDライブラリを使うような感覚でMIDIライブラリを簡単に使用することができます。
↓家にあったATmega 32u4搭載ボード Adafruit Feather 32u4 Bluefruit LEで試してみましたが、本当に簡単にMIDI制御を楽しめました。
ホントに簡単にMIDI音源デバイスができちゃった♪
とりあえずNoteOnでLED光らすだけだけど。家にある唯一のATmega 32u4搭載ボード Adafruit Feather 32u4 Bluefruit LEを使用しました。
スイッチサイエンス の Adafruit Feather 32u4 Bluefruit LE を Amazon でチェック! https://t.co/tq6YcZ8JGc pic.twitter.com/yAz9UH2GwS
— HomeMadeGarbage (@H0meMadeGarbage) August 8, 2019
ここではATmega32U4開発ボードを用いてMIDIコントローラでLEDやサーボモータを制御してみました。
目次
構成
ATmega32U4開発ボードをUSB-MIDI機器化してでLEDとサーボモータを制御します。
部品
- ATmega32U4開発ボード
- サーボモータ MG995
- 赤LED & 100 Ohm抵抗
MIDIライブラリ
以下のATmega32U4とARMボード専用のArduino用MIDIライブラリを使用します。
マイコンをUSB-MIDI機器化してDAWやMIDIコントローラからnoteオンやコントロールチェンジ(CC)などのMIDI信号を取得したり出力したりすることができます。
非常にありがたく有用なライブラリでございます。ありがとうございます。
Arduinoコード
MIDIライブラリのサンプルコード MIDIUSB_read.ino を参考にプログラミングしました。
MIDIコントローラのチャンネルと数値を取得してLEDとサーボを操作します。
LED:Ch1 Control mode change(0xB0)のデータ0でOFF、127でON
サーボ:Ch1 Pitch wheel range(0xE0)のデータ0~127で制御
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#include "MIDIUSB.h" #include <Servo.h> const int ledPin = 4; Servo myservo; int pos = 0; void noteOn(byte channel, byte pitch, byte velocity) { midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity}; MidiUSB.sendMIDI(noteOn); } void noteOff(byte channel, byte pitch, byte velocity) { midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity}; MidiUSB.sendMIDI(noteOff); } void setup() { Serial.begin(115200); myservo.attach(10); pinMode(ledPin, OUTPUT); } // First parameter is the event type (0x0B = control change). // Second parameter is the event type, combined with the channel. // Third parameter is the control number number (0-119). // Fourth parameter is the control value (0-127). void controlChange(byte channel, byte control, byte value) { midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value}; MidiUSB.sendMIDI(event); } void loop() { midiEventPacket_t rx; do { rx = MidiUSB.read(); if (rx.header != 0) { //LED if(rx.byte1 == 0xB0){ Serial.print("LED: "); Serial.println(rx.byte3, DEC); if(rx.byte3 == 127){ digitalWrite(ledPin, HIGH); }else{ digitalWrite(ledPin, LOW); } } //Servo if(rx.byte1 == 0xE0){ Serial.print("Servo: "); Serial.println(rx.byte3, DEC); myservo.write(map(rx.byte3,0,127,0,180)); } } } while (rx.header != 0); } |
MIDI制御
DAWは Reason 10を使用しました。Reasonの外部MIDIインストゥルメントで”SparkFun Pro Micro”を選択します。
MIDIコントローラはKORG USB MIDIキーボード NANOKEY2を使用し、ボタンとスライダをわりふりました。
動作
MIDIコントローラ
せっかく家にあるので活用しない手はない pic.twitter.com/mDaf2HFlG6— HomeMadeGarbage (@H0meMadeGarbage) November 24, 2019
MIDIコントローラって本当にいいコントローラで、音楽だけに使うのはもったいないです。
【ロボティクス】
私も長期計画でロボットを育成していこうと思います。
“オルタナ ティブ夫” です。よろしくお願いします。
まだ機能は全然少ないですが。
10年後の自律動作を目指します。#MIDI #萌え軸 #オルタナティブ夫 pic.twitter.com/nqTExoXdIo— HomeMadeGarbage (@H0meMadeGarbage) November 10, 2019
ATmega32U4のおかげでMIDIをもっと拡張し、生活をよりよくできそうです。
電子工作において物理コントローラを製作したりするのは大変で高価だったりするのでMIDIコントローラを気軽に利用できることは幸せなことです。