4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Arduinoを使った自動ピアノ演奏装置を作成する

Posted at

目的

Arduino+ソレノイド+ピアノを使えば自動ピアノ演奏装置ができるのではと
思い立ち作成しました。

最終的に下記のように自動で曲を再生できました。

準備

Arduino Uno
Arduino Midiシールド
Midi USB
ソレノイドコイル 6個
トランジスタ(ソレノイドコイル スイッチON/OFF用)

過去に利用したものを再利用します。
Arduino+MIDIシールドでMIDI信号通信する
Arduinoで2つのTone信号を同時に再生する
Arduinoを用いてソレノイドを動かす

PC側にMidiPlayerをインストールします
ピアノはCASIOのピアノをamazonで購入しました

接続図

簡単な図
スクリーンショット 2019-06-22 19.32.05.png

接続後の図
スクリーンショット 2019-06-22 19.32.19.png

コード

Arduino+MIDIシールド側のソースコードです。

sample.ino
#include <MIDI.h>

// MIDI IN Channel
const int MIDI_CH = 1;

// Tones
const int CH_CNT = 2;
int intervals[CH_CNT] = {0,0};
int intervals_PIN[CH_CNT] = {0,0};

MIDI_CREATE_DEFAULT_INSTANCE();

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
};

#define PIN_A 44
#define PIN_B 45
#define PIN_C 46
#define PIN_D 47
#define PIN_E 48
#define PIN_F 49

void setup()
{
 
  MIDI.begin();
  pinMode(PIN_A, OUTPUT);
  pinMode(PIN_B, OUTPUT);
  pinMode(PIN_C, OUTPUT);
  pinMode(PIN_D, OUTPUT);
  pinMode(PIN_E, OUTPUT);
  pinMode(PIN_F, OUTPUT);

  delay(500);
  digitalWrite(PIN_A, HIGH);
  delay(100);
  digitalWrite(PIN_A, LOW);
  delay(100);
  digitalWrite(PIN_B, HIGH);
  delay(100);
  digitalWrite(PIN_B, LOW);
  delay(100);
  digitalWrite(PIN_C, HIGH);
  delay(100);
  digitalWrite(PIN_C, LOW);
  delay(100);
  digitalWrite(PIN_D, HIGH);
  delay(100);
  digitalWrite(PIN_D, LOW);
  delay(100);
  digitalWrite(PIN_E, HIGH);
  delay(100);
  digitalWrite(PIN_E, LOW);
  delay(100);
  digitalWrite(PIN_F, HIGH);
  delay(100);
  digitalWrite(PIN_F, LOW);
}

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]);
              
              if (data1 == 67) { //
                digitalWrite(PIN_A, HIGH);
                //delay(100);
                //digitalWrite(PIN_A, LOW);
                intervals_PIN[i] = PIN_A;
              }
              if (data1 == 69) { //
                digitalWrite(PIN_B, HIGH);
                //delay(100);
                //digitalWrite(PIN_B, LOW);
                intervals_PIN[i] = PIN_B;
              }
              if (data1 == 71) { //
                digitalWrite(PIN_C, HIGH);
                //delay(100);
                //digitalWrite(PIN_C, LOW);
                intervals_PIN[i] = PIN_C;
              }
              if (data1 == 72) { //ファ
                digitalWrite(PIN_D, HIGH);
                //delay(100);
                //digitalWrite(PIN_D, LOW);
                intervals_PIN[i] = PIN_D;
              }
              if (data1 == 74) { //
                digitalWrite(PIN_E, HIGH);
                //delay(100);
                //digitalWrite(PIN_E, LOW);
                intervals_PIN[i] = PIN_E;
              }
              if (data1 == 76) { //
                digitalWrite(PIN_F, HIGH);
                //delay(100);
                //digitalWrite(PIN_F, LOW);
                intervals_PIN[i] = PIN_F;
              }
             
              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;
            digitalWrite(intervals_PIN[i], LOW);
            delay(50);
            
           break;
          }
        }
        break;
    }
  }
}

テスト

ミッキーマウスマーチが再生できればOK

FAQ

MIDIデータ毎にMIDI信号とソレノイドの対応が変わることがあると思いますのでデバッグの際は注意

参考

Arduino+MIDIシールドでMIDI信号通信する
Arduinoで2つのTone信号を同時に再生する
Arduinoを用いてソレノイドを動かす

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?