====== はじめに ====== 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と見比べるとよく分かるかと思います. ====== ショートメッセージ ====== まずは[[https://www.dropbox.com/home/myarduino/bbSamples/ArduinoAsEasyMIDIModuleSample|サンプルファイル]]をダウンロードして実際に 動作させてみます.スピーカはArduino 11pinへ,もう一方はグランドへ接続してください. MIDIの発音命令であるショートメッセージと同じ形式で音高や音量を調整できるようになりました. ショートメッセージとは携帯メッセージではなく,MIDIの規格によって定められた3バイトで構成される 31250bpsのシリアル通信です.ユーザは発音したいチャンネル,音高,音量を関数の引数として渡すことで 発音を行うことが出来ます.通常は sendShortMessage(channel, note, velocity);のような関数名で よく実装されています.例えばピアノに座って,真ん中辺りのドの鍵盤を強めに打鍵して,1秒後に鍵盤を離す. とします,この場合,これは下記のようにプログラムで記述することが出来ます. sendShortMessage(channel, 60, 100); delay(1000); sendShortMessage(channel, 60, 0); ===== Channel ===== 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 ===== Noteは音高を指します.つまり,ドレミファソラシ,,のことです.MIDIではこの音高に対して明確なノート番号というものを 割り当てており,その対応関係は下記のとおりです.ピアノに座って,真ん中辺りのドの音はNote番号60に当たります.ピアノは一部を除き 一般的には88鍵ですが,それをカバーする音高域が0-127で割り振られています.音高は0-127で割り当てられています. {{ :arduino:keyboard_midi.png?nolink |}} *音楽研究所ウェブサイトより転載(http://www.asahi-net.or.jp/~HB9T-KTD/music/Japan/Research/DTM/freq_map.html) ===== Velocity ===== Velocityは音の強弱(音量)を指定するパラメータです.Noteと同様に0-127の範囲で値を設定します.なお,velocity=0の場合は 0の強さで打鍵する,という意味ではなく,発音を停止する(Note OFF)の意味になりますので注意してください.