特にこれといった目的はないのですが、以前より、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の使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。