ATOMS3でできること 〜「M5Stack用MIDIシンセサイザユニット」で音を鳴らす

スポンサーリンク
ATOMS3

特にこれといった目的はないのですが、以前より、M5Stackなどのマイコンデバイスで音を鳴らしたいと思っていました。
ビープ音程度なら割と簡単に鳴らすことができますが、もしも音色を変えたり和音を鳴らしたりすることができれば、電子楽器のようなものをつくることもできそうで、そのようなものがつくれれば結構楽しそうです。

今回、「M5Stack用MIDIシンセサイザユニット」という製品を見つけたので、これを使ってどんな音を鳴らせるのか試してみることにしました。


マイコンデバイスは「ATOMS3」を使います。「ATOMS3」と「シンセサイザユニット」のGROVEコネクタ同士をつなぎ、音を鳴らしてみたいと思います。


和音を鳴らしたいので、「C(ドミソ)」→「F(ドファラ)」→「C(ドミソ)」→「G(シレソ)」をずっと繰り返すことにします。また、音色も変えたいので、ボタンを押すと音色が変わるようにします。

「Arduino IDE」でスケッチをつくります。
最初に「シンセサイザユニット」用ライブラリをインストールします。「ツール」>「ライブラリを管理」でライブラリマネージャを開き、検索ウィンドウで「M5UnitSynth by M5Stack」を探してインストールします。

スケッチは以下のとおりです。

#include <M5Unified.h>
#include "M5UnitSynth.h"

M5UnitSynth synth;

int w, h;
unsigned long prevTime=millis();
int inst=0;
int chord=0;

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  M5.Display.setTextColor(TFT_WHITE);
  M5.Display.setTextDatum(MC_DATUM);
  w = M5.Display.width();
  h = M5.Display.height();

  synth.begin(&Serial2, UNIT_SYNTH_BAUD, 1, 2);
  setInst(inst);
}

void loop() {
  M5.update();
  if(M5.BtnA.wasPressed()) setInst(++inst % 128);

  int currentTime = millis();
  if(currentTime-prevTime >= 1000) {
    playChord(++chord % 4);
    prevTime = currentTime;
  }
}

void setInst(int number) {
  synth.setInstrument(0, 0, number+1);
  M5.Display.fillScreen(TFT_BLACK);
  M5.Display.drawNumber(number+1, w/2, h/2, 6);
}

void playChord(int number) {
  synth.setNoteOff(0, NOTE_B3, 0);
  synth.setNoteOff(0, NOTE_C4, 0);
  synth.setNoteOff(0, NOTE_D4, 0);
  synth.setNoteOff(0, NOTE_E4, 0);
  synth.setNoteOff(0, NOTE_F4, 0);
  synth.setNoteOff(0, NOTE_G4, 0);
  synth.setNoteOff(0, NOTE_A4, 0);

  switch(number) {
    case 0:
      synth.setNoteOn(0, NOTE_C4, 127);
      synth.setNoteOn(0, NOTE_E4, 127);
      synth.setNoteOn(0, NOTE_G4, 127);
      break;
    case 1:
      synth.setNoteOn(0, NOTE_C4, 127);
      synth.setNoteOn(0, NOTE_F4, 127);
      synth.setNoteOn(0, NOTE_A4, 127);
      break;
    case 2:
      synth.setNoteOn(0, NOTE_C4, 127);
      synth.setNoteOn(0, NOTE_E4, 127);
      synth.setNoteOn(0, NOTE_G4, 127);
      break;
    case 3:
      synth.setNoteOn(0, NOTE_B3, 127);
      synth.setNoteOn(0, NOTE_D4, 127);
      synth.setNoteOn(0, NOTE_G4, 127);
      break;
  }
}

「playChord」という関数で和音を鳴らします。この関数が呼び出されると、最初にこれまでに鳴らしていた音を全て消し、引数の数値(0〜3)に従って和音を鳴らします。
「setInst」という関数で音色を設定します。「シンセサイザユニット」では「setInstrument」コマンドで128種類の音色を設定できるので、引数の数値(0〜127)に従って音色を設定します。同時にLCD画面に設定した音色の数値を表示します。
「loop」では、1秒毎に和音を鳴らしています。また、ボタンが押されると音色が変わります。

「シンセサイザユニット」についているスピーカーは小さいものですが、それなりの音量で鳴っており、音質も思っていたよりは良好でした。
これなら、電子楽器など、なにか面白いものをつくることもできそうです。

 

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。