Hobby Science&Experiment

愛と工作の日々

趣味でやっている工作や勉強したことのレポートです。

Arduino UnoのMIDI LibraryでDAWのドラムパターンを鳴らす

Arduino MIDI Libraryを使ってDAWのドラムやシンセを鳴らす試みです。これが出来ればArduinoベースのMIDIコントローラーや電子ドラム、シンセなどが作れるようになるはずです。Arduino MIDI controller等で検索するとヒットするこのかっこいいプロジェクトのコード・回路は試したところ動作したのですが、ポットから信号が出続けたりして制御が難しかったのと、コードが長くモディファイしにくかったため別途書き直すことにしました。

準備

・Arudino Uno (USB MIDIバイス化済み→こちらもしくはこちら参考)
・何かしらのDAW
 (本記事ではWaveform FreeもしくはWeb audio synthesizerで動作確認しました。)

コードについて

コードは主に下記の2記事を参考にしました。
Arduino MIDI Library の使い方 - Qiita
超簡単!Arduino UNOをMIDIコントローラーにしよう! <Arduino MIDI Library 4.2対応版> - Qiita
MIDI.sendNoteOn(pitch, velocity, channel)というコマンドでドラム(もしくはシンセ)を鳴らします。 pitchの部分が0~127までの数字で鍵盤の最低音~最高音に対応しているようです。私の使用したDAWでは鍵盤のC#3(pitch=49)がクラッシュシンバル、C2がKICKというように対応していますので、クラッシュ→キック→ハンドクラップ→スネアの順に鳴らすようにしました。

#include <MIDI.h> //MIDIライブラリ使用のためのヘッダファイル読み込み
MIDI_CREATE_DEFAULT_INSTANCE(); // MIDIクラスのインスタンスとして"MIDI"を生成する。
#define CRASH 49 //C#3
#define KICK 36 //C2
#define CLAP 39 //D#2
#define SNARE 38 //D2
int DRUM[] = {CRASH, KICK, CLAP, SNARE};
int NUM_DRUM = sizeof(DRUM)/sizeof(DRUM[0]);
int i=0;

void setup()
{   
    Serial.begin(115200);
    MIDI.begin(4); // MIDIインスタンスの初期化、その際チャンネル4のみをlisten
}

void loop(){
  for (i = 0; i < NUM_DRUM; i++){
    MIDI.sendNoteOn(DRUM[i],127,1);  // ノートオン(pitch, velo, channel) 
    delay(500);    
    MIDI.sendNoteOff(DRUM[i],0,1);   // ノートオフ
    delay(500);          
    }
}

動作


プログラム通りの順にドラム音が出ました。ここまで出来たら原理的には何でも作れそうな感じがしちゃいますね。
パターン化することでドラムマシンや電子ドラムが作れます。プラグインをシンセにすればシンセがそのまま鳴らせるので自動演奏器のようにしても面白いかもしれません。

今後

ドラムマシン、電子ドラム、自動演奏器、MIDIコントローラー的な奴を少しずつ進めていきたいと思います。