ArduinoからYMZ294いじくるライブラリ作りました。
YMZ294
解凍すると.hファイルと.cppファイルが入ったYMZ294フォルダが出来ます。Arduinoのライブラリフォルダに放り込むと使えます。
使えるんですが、すべての関数をちゃんとテストしてるわけでも無いので、そんなにはちゃんと使えない部分も多いかと。矩形波3音、ノイズは割と鳴りますが、エンベロープ関連は分からんところが多く、あんましテストしてないです。
あらゆる無保証です。壊れやしないとは思いますが。
配線はこんな感じ
D0~D7につなぐのはPORTD(DIGITALの0~7)固定です。Arduino上で8ビットそのままOutputに使えるところが他にないので。
/WR, /CS, A0, /IC(RESET)につなぐピンはArduinoのスケッチ側から指定可能。
ここでは
- /WR(1),/CS(2) – DIGITAL8
- A0(3) – DIGITAL9
- /IC(9) – DIGITAL10
という感じで指定してます。
5VとGNDはArduinoから供給します。
音はYMZ294の5ピンのSOから出ます。本来はこの出力にLM386などのオペアンプ回路をかますべきなんですが、面倒なので省略。
SOとGNDから直接音を録ります。
スケッチはこんなです。
#include <YMZ294.h> // Output Pins const byte WRCS_PIN = 8; const byte A0_PIN = 9; const byte RESET_PIN = 10; YMZ294 ymz(WRCS_PIN, A0_PIN, RESET_PIN); void setup() { DDRD = 0b11111111; pinMode(WRCS_PIN, OUTPUT); pinMode(A0_PIN, OUTPUT); pinMode(RESET_PIN, OUTPUT); ymz.Reset(); ymz.SetMixer(0b111, 0b100); ymz.SetVolume(CH_A, 0b00001111); ymz.SetFreqBit(CH_A, 0); ymz.SetVolume(CH_B, 0b00001111); ymz.SetFreqBit(CH_B, 0); pipo(); delay(300); } word Duration = 2; void loop() { Duration = (analogRead(0) >> 6); static word state = 0b000000000001; static bool lr = true; state += (lr? 1: -1); if (state == 0x03ff || state == 1) lr = !lr; ymz.SetFreqBit(CH_A, state); ymz.SetFreqBit(CH_B, state); delay(Duration); } void pipo(){ ymz.SetFrequency(CH_A, CalcFreqByMML(8, 'C')); ymz.SetFrequency(CH_B, CalcFreqByMML(8, 'C') - 1); delay(100); ymz.SetFrequency(CH_A, CalcFreqByMML(7, 'C')); ymz.SetFrequency(CH_B, CalcFreqByMML(7, 'C') - 1); delay(100); ymz.SetFreqBit(CH_A, 0); ymz.SetFreqBit(CH_B, 0); }
やってることは前回のナイトライダー風LEDと大して変わりません。
前回は8bitの範囲を1が左右に移動していました。
(000000001 → 00000010 → 00000100……と移動して、左にぶつかったら今度は10000000 → 01000000 → 00100000と右に移動)
今回はYMZ294が出せる矩形波の範囲12bit(0x0001 – 0x03ff)を数ミリ秒(Duration これはANALOG0で指定)挟んで順次再生してます。
1chで鳴らしてもファミスタで高いフライを上げた時のような音がして楽しいんですが、せっかくなので2ch使ってデチューンさせてみました。2ch目は1ch目より1bit小さい値で音を出してます。
予想以上に音がうねってます。PSGのこういうところがたまらんですね。
8 thoughts on “Arduino+YMZ294でPSGデチューンしてうにょんうにょん”