ArduinoでPSG音源を弄るメモ

こっそりこんなモノを作ってました.

参考URLなどメモしておきます.気が向いたらスケッチを公開するかも.

YMZ294関連

YMZ294は秋月で手に入るPSG音源で,MSX等に載っていたモノ相当品らしい. 結構まえから安定的に手に入るモノのようで,PICとかArduinoとかで鳴らしておられる先達方々の記事を参考にさせていただきました.

私はオペアンプの使い方をよく分かっていないのですが(汗),この部分がYMZ294の音を合成してさらにローパスフィルタとして作用している,んでしょうか…(この部分を介さないときれいに鳴らない)

MIDIシールド

最初はMIDIのデータを変換してArduinoのプログラムメモリに直接焼き込んでたのだけど,途中からMIDIシールドを使ってMIDIメッセージを PCから送って鳴らすようにしました.

  • MIDI-OX
    • MIDIメッセージをモニタリングしたりPC内でMIDI-IN,MIDI-OUTを結線したりするためのソフトウェア
  • Ruby – Standard MIDI File module
    • RubyでMIDIデータを読み出すためのライブラリ
  • MIDI Breakout – SparkFun Electronics
  • MIDI Message Table 1
    • MIDIメッセージの仕様.Note ONとかNote OFFのときに複数のノートが来る場合,ノートナンバーとベロシティが連続してくる,というあたりを理解して無くてハマったのは内緒.

余談

ブレッドボードは案外デリケート

ジャンプワイヤの森
結構な配線量になってしまいました.中盤からはピンセットを使って慎重に配線しました.

さすがにこのレベルになるとちょっと触っただけでバスに接触不良が生じたりして大変でした.
あとGNDに使うジャンプワイヤを複数張っておかないと電流容量が足らなくなることがあるようです.

ユニバーサル基板+スズメッキ線でちゃんとしたボードにしたいけど大変そうです.

Arduinoのプログラムメモリに配列を配置する

最初は,MIDIデータを変換してArduinoのプログラムメモリに配列として焼き込んでたんだけど,それに関連する話題.

2.8” TFT TouchShieldのライブラリのなかで見かけたのだけど 以下のような書き方をすると配列をArduinoのプログラムメモリに配置できるみたい.

#include <avr/pgmspace.h>

int hogeData[] = PROGMEM {
  /* ... */
};

void func()
{
    /* 読み込むとき */
    int someData = pgm_read_word(&hogeData[0]); 
}

この方法ならかなり大きい配列でも焼き込めるようです.
2.8” Touch Shieldのライブラリでは8×8のASCIIフォントをこの方法で 格納していました.ただ,プログラムメモリを食いつぶすようなデカイものは当然弾かれるみたいです (Arduino UNO(ATMega328P)ならプログラムメモリは32KB.実際は28KBくらいしか焼き込めない).

参考:
<avr/pgmspace.h>: Program Space Utilities

Leave a Reply