楽器をつくる:簡易midiモジュール制作

はじめに

Arduinoで音を鳴らすには様々なやり方が存在します.最もシンプルなものはPWMを利用して正弦波を作成し,直接スピーカーに つなげることで,任意の音高を鳴らすことが可能です.しかしこれは学習用には楽しいものではありますが, プロトタイピングでは少し物足りなく感じます.このページでは任意の音声ファイルをArduinoから再生する方法, さらに読み込んだファイルを基に任意のNoteをMIDIショートメッセージのように再生可能な機能を実現します.

音声ファイルの再生

Arduinoを利用して音声ファイルを再生するにはすでにインターネット上で情報が見つかります.通常490Hzの3,11pinのPwd周期を 16Mhzの場合,最大で約65kHzにし,各サンプリングビッ値自体もduty比で表現するものです.細かい話は説明しませんが, まずは http://highlowtech.org/?p=1963を参照して,サンプルを動作 させてみます.

音声ファイルを再生することはできましたが,それではこれを楽器の様に,任意の音高(Note),任意の音量(Velocity)で発音させるには どうしたらよいでしょうか?Arduino単体ではFlashメモリが32KBしかなく,ここにデータを保存するやり方では 3秒程度しか音声データを保存できません.ピアノの音域はもちろんのこと,1オクターブさえ表現するこができません.

音声ファイルの音高と音量を制御する

普通はここで外部モジュールを利用するなどして,別の解決方法を探りますが,いちいちプロトタイプするのに そんなことするのは煩わしいので,どうにかATMEGA328で数種類の楽器の音量,音高を制御できるようしてみます. すでに音声ファイル再生サンプルがあるので,これを改造して簡単なMIDIクラスを作成します.実際に作成したプログラムが 動作している様子は下記動画で確認してください.音質はよろしくありませんが,木琴,ピアノ,グロッケンの一つの発音データを 基にNote番号55 - 80 までの音を順番に発音させています.

highlowtechのウェブサイトで紹介されているコードを基に,割り込みタイミングと読み込みデータを動的に 音高,音量を制御しています.オリジナルのPCM.cと見比べるとよく分かるかと思います.

ショートメッセージ

まずはサンプルファイルをダウンロードして実際に 動作させてみます.スピーカはArduino 11pinへ,もう一方はグランドへ接続してください.

MIDIの発音命令であるショートメッセージと同じ形式で音高や音量を調整できるようになりました. ショートメッセージとは携帯メッセージではなく,MIDIの規格によって定められた3バイトで構成される 31250bpsのシリアル通信です.ユーザは発音したいチャンネル,音高,音量を関数の引数として渡すことで 発音を行うことが出来ます.通常は sendShortMessage(channel, note, velocity);のような関数名で よく実装されています.例えばピアノに座って,真ん中辺りのドの鍵盤を強めに打鍵して,1秒後に鍵盤を離す. とします,この場合,これは下記のようにプログラムで記述することが出来ます.

sendShortMessage(channel, 60, 100);
delay(1000);
sendShortMessage(channel, 60, 0);

channelは演奏でいうところのパートを指します.例えばchannel:0にピアノ,channel:1にフルート,といった具合に channelごとに音色を用意して演奏を行います.MIDIでは0-15までの16channelに好きな楽器を割り当てて利用します. ただしどのchannelに何の楽器,音色を割り当てるかは音源側で自由に決めることができます.0:piano, 8:drum set等が 一般的です.今回のサンプルではArduinoのFlashメモリの制約があるため,3秒程度までしか音声データを利用できません. つまり,一つ辺り500ms程度のサンプリング音源を利用すると3000/500 = 6 種類の音源を最大で利用できます.サンプル プログラムでは3つの音色(0:Marimba, 1:Piano, 2: Glocken)を割り当てました.録音は馬場が作成したものです.

/*
順番に音色を変えて音を鳴らすサンプル
(C)2015 Tetsuaki Baba
*/
#include "PCM.h"
#include "arMIDI.h"

MIDI midi;

void setup()
{
}

void loop()
{
  midi.play(0, 55, 127);
  delay(500);
  midi.play(1, 55, 127);
  delay(500);
  midi.play(2, 55, 127);
  delay(500);
}

Noteは音高を指します.つまり,ドレミファソラシ,,のことです.MIDIではこの音高に対して明確なノート番号というものを 割り当てており,その対応関係は下記のとおりです.ピアノに座って,真ん中辺りのドの音はNote番号60に当たります.ピアノは一部を除き 一般的には88鍵ですが,それをカバーする音高域が0-127で割り振られています.音高は0-127で割り当てられています.

*音楽研究所ウェブサイトより転載(http://www.asahi-net.or.jp/~HB9T-KTD/music/Japan/Research/DTM/freq_map.html

Velocityは音の強弱(音量)を指定するパラメータです.Noteと同様に0-127の範囲で値を設定します.なお,velocity=0の場合は 0の強さで打鍵する,という意味ではなく,発音を停止する(Note OFF)の意味になりますので注意してください.

  • /home/users/2/lolipop.jp-4404d470cd64c603/web/ws/data/pages/楽器をつくる/簡易midiモジュール制作.txt
  • 最終更新: 2018/12/29 15:42
  • by baba