Arduino UNO+MIDIキーボードで3和音鳴らしてみる

YMZ294のMIDI音源化と、YMZのピン数圧縮 | curious4dev
ArduinoでMIDI音源を作ってみた(改) | メモとか倉庫とか(仮)
こちらの記事を読んで興味が出たので、自分でもMIDIキーボードをつなげて、とりあえずArduino Tone Libraryで矩形波を3音鳴らしてみました。

回路図はこんな感じです。
MIDI_SquareWaves_ブレッドボード MIDI_SquareWaves_回路図 MIDI_SquareWaves_photo
フォトカプラTLP552とMIDI端子の配線はこちらのサイトが分かりやすかったです。
TETRASTYLE-dev-BLOG: MIDI 受信回路
220Ωの抵抗が手元になかったので200Ωの抵抗使ったりとか、ダイオードをつけるの忘れてたりとかしても、まあとりあえずは動きます。
……というか、curious4devさんも書かれているのですが

結局はMIDIの5番をArduinoのRXに、MIDIの4番をGNDに刺し、ピエゾスピーカーを2番とGNDに刺しただけで動きました。

確かにこれでも動きました。
MIDIキーボード側に何か問題が起こると困るので、フォトカプラ経由で動かしてますが。

スケッチは以下の通り。MIDI Libraryと、Arduino Tone Libraryが必要になります。
3音は別々のピン(2,3,4)から出力されるので、1kΩの抵抗アレイをかませてミキシングしてます。
※このスケッチを書き込む際は、D0(RX)に接続しているピンを抜かないとエラーが出ます

#include <Tone.h>
#include <MIDI.h>
#include "freq.h"

// MIDI IN Channel
const int MIDI_CH = 1;

// Tones
const int CH_CNT = 3;
int intervals[CH_CNT] = {0,0,0};
Tone tones[CH_CNT];
const byte SND_PINS[CH_CNT] = {2,3,4};

MIDI_CREATE_DEFAULT_INSTANCE();

void setup()
{
  for (int i = 0; i < CH_CNT; i++){
    pinMode(SND_PINS[i], OUTPUT);
    tones[i].begin(SND_PINS[i]);
  }
  MIDI.begin();
}

void loop()
{
  uint8_t data1, data2;
  if (MIDI.read()) {
    MIDI.setInputChannel(MIDI_CH);

    switch (MIDI.getType()) {
      case midi::NoteOn:
        data1 = MIDI.getData1();    // note no
        data2 = MIDI.getData2();    // velocity
        if (data2 > 0){
          for (int i = 0; i < CH_CNT; i++){
            if (intervals[i] == 0){
              intervals[i] = data1;
              tones[i].play(noteFreq[data1]);
              break;
            }
          }
        }
        break;

      case midi::NoteOff:
        data1 = MIDI.getData1();	// note no
        for (int i = 0; i < CH_CNT; i++){
          if (intervals[i] == data1){
            intervals[i] = 0;
            tones[i].stop();
            break;
          }
        }
        break;
    }
  }
}

YMZ294 Libraryの周波数の配列部分をfreq.hというヘッダファイルに書き出して使います。

const word noteFreq[] = {
  0,  9,  9, 10,  10, 11,   12,	12,	13,	14,	15,	15,
  16,  17, 18, 19,  21, 22,  23,	25,	26,	28,	29,	31,
  33,  35, 37,	39,  41, 44,  46,	49,	52,	55,	58,	62,
  65,	69, 73,	78,  82, 87,  93,	98,	104,	110,	117,	124,
  131, 139, 147, 156, 165, 175, 185,	196,	208,	220,	233,	247,
  262, 277, 294, 311, 330, 349, 370,	392,	415,	440,	466,	494,
  523, 554, 587, 622, 659, 699, 740,	784,	831,	880,	932,	988,
  1047, 1109, 1175, 1245, 1319, 1397,	1480,	1568,	1661,	1760,	1865,	1976,
  2093, 2218, 2349, 2489, 2637,	2794,	2960,	3136,	3322,	3520,	3729,	3951,
  4186, 4435, 4699, 4978, 5274,	5587,	5920,	6272,	6645,	7040,	7459,	7902,
  8372, 8870, 9397, 9956, 10548,11175,	11840,	12544
};

このスケッチを書き込んで、MIDIキーボードから矩形波を鳴らせるようになったところで致命的な問題に気付きます。
そういや私、楽器は持ってるけど全然弾けない人だったなあ、と。

そんなわけで、大変お粗末なオチで申し訳ありませんが、どうにか弾いてみたMOTHERのタイトル画面の曲の最初の方だけ。

コメントを残す