ArduinoでPSG音源(YAMAHA YMZ294)を鳴らしてみた。
お疲れ様です。高橋です。
先日秋葉原にて「Arduino」という物を買ってきました。
Arduinoって?
Arduinoは「アルデュイーノ」と読むようです。
PC上でC++ライクな言語で書いたプログラムを無料コンパイラでコンパイルし、USB接続したArduinoのマイコンに書き込めます。世にある様々なInputセンサ、Outputセンサ等を自由に簡単に使うことが出来ます。詳しくはググって下さい。
私はAndroidアプリの開発を進めていくにあたり、各種情報をググりながら進めているのですが、そんな中ピクッと来たキーワードの中に「IoT」というものがあります。今後は世の中、IoTらしいです。
IoTとはなんぞや
Internet Of Thingsとのことです。センサやネットに接続出来る機械や部品が安くなり、消費電力が低くなり、あらゆるデバイスがネットと繋がれるそうです。昔から言われている事のような気もしますが、それは置いておきます。
AndroidケータイはUSBやらBluetoothやらWi-Fiで様々なデバイスを繋げることが出来ますが、上述したArduinoで作ったハードウェアも繋げることが出来るそうなのです。Arduino側で様々なセンサてんこ盛りな物を作り、それをAndroidと協調させる事が出来れば楽しそうなので、まずはArduinoでどんな事が出来るのか実験してみたくなりました。
YMZ294とは?
Arduino関連のページをググりまくって興味が出てきたのが「ARDUINO+YMZ294でPSGデチューンしてうにょんうにょん」というサイトに書かれてある事です。MSXやファミコンで育ってきた世代にとっては、これでギュインギュインにPSG音を鳴らしてみたくなるのは、必然といって良いでしょう。
というわけで先日秋葉原の秋月電子に行き、500円出して買ってきました。ICだけでは音が鳴らないので、スピーカーも必要です。100円で8Ω8Wのスピーカーも買いました。
中にはソケットとYMZ294と水晶が入っています。そしてこれらを、上述したサイトの回路図通りに組みます。
参考サイトにはスピーカーの事が書いてありませんでしたが、YMZ294側のS0とArduino側のGNDを繋げば良いだけっぽいので、繋げます。本当はこの間にLM386というオーディオアンプを挟むと音が大きくなるようですが、既に十分大きすぎるくらい大きく、寝かけていた妻から嫌味を言われたので、LM386は買いません。
秋月電子のwebサイトを見ていたらLM386よりも出力が大きいアンプが50円で売っていたのですが、高橋家にアンプは不要です。金額の問題ではありません。
上記の配線だとさすがにアレなので、回路図作図ツールを使って作図します。
本当はスピーカーとYMZ294の間にLM386を入れると、スピーカーから出てくる音が大きくなるようです。原理は不明ですが、何か不思議な力が働いているのだと思われます。
YMZ294と一緒についてきた水晶を表すアイコンがなかったのでICアイコンで代用しています。本当は8pinではなく4pinです。
スケッチ
回路を繋げたら、次はスケッチ(プログラム)です。Arduino業界ではプログラムコードの事をスケッチというそうです。
プログラムを書く前に参考サイトからYMZ294用ライブラリをダウンロードし、includeし、あとは曲をプログラムしていきます。YMZ294は3和音1ノイズが出せるようなのですが、最初からそんなに飛ばせないので、出来る事からコツコツと(サイトのコピペ&修正)始めるのが鉄則です。
#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);
ymz.SetVolume(CH_C, 0b00001111);
ymz.SetFreqBit(CH_C, 0);
pipo();
}
void loop() {
}
void pipo(){
int len = 150;
for(int j = 0; j < 2; j++) {
for (int i = 4; i < 8; i++) {
talk(CH_A, CalcFreqByMML(i, 'C'), len);
talk(CH_A, CalcFreqByMML(i, 'D'), len);
talk(CH_A, CalcFreqByMML(i, 'E'), len);
talk(CH_A, CalcFreqByMML(i, 'G'), len);
}
for (int i = 7; i > 3; i--) {
talk(CH_A, CalcFreqByMML(i+1, 'C'), len);
talk(CH_A, CalcFreqByMML(i, 'G'), len);
talk(CH_A, CalcFreqByMML(i, 'E'), len);
talk(CH_A, CalcFreqByMML(i, 'D'), len);
}
for (int i = 4; i < 8; i++) {
talk(CH_A, CalcFreqByMML(i-1, 'A'), len);
talk(CH_A, CalcFreqByMML(i-1, 'B'), len);
talk(CH_A, CalcFreqByMML(i, 'C'), len);
talk(CH_A, CalcFreqByMML(i, 'E'), len);
}
for (int i = 7; i > 3; i--) {
talk(CH_A, CalcFreqByMML(i, 'A'), len);
talk(CH_A, CalcFreqByMML(i, 'E'), len);
talk(CH_A, CalcFreqByMML(i, 'C'), len);
talk(CH_A, CalcFreqByMML(i-1, 'B'), len);
}
}
}
void talk(Channel ch, word freq, int len) {
ymz.SetFrequency(ch, freq);
delay(len);
ymz.SetFreqBit(ch, 0);
}
楽曲は、{ドレミソ}*n, {ドソミレ}*n, {ラシドミ}*n, {ラミドシ}*nを2回繰り返す単純な物です。
仕上げ
スケッチを書いたら、USBケーブルでパソコンとArduinoを接続し、コンパイル&書き込みボタンを押すだけです。
3和音1ノイズの高性能が全然発揮出来ていません。次回はもっとピコピコさせてみたいと思います。
以上、よろしくお願い致します。
関連記事
-
-
「FF5/ビッグブリッヂの死闘」をArduino+YMZ294で鳴らしてみた。
お疲れ様です。高橋です。 先日「YMZ294で鳴らすためのビッグブリッヂの死闘を …
-
-
シャロム エンディング前
お疲れ様です。高橋です。 またシャロムを耳コピしました。元の世界に戻った直後の曲 …
-
-
シャロム グリーク城
お疲れ様です。高橋です。 シャロムから、グリーク城の楽曲です。 名曲で、opの次 …
-
-
久しぶりに耳コピ。FF4バトルテーマ。
お疲れ様です。高橋です。 とても久しぶりに耳コピしました。ファイナルファンタジー …
-
-
Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験
お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …
-
-
Castlevania SotN “Dance of Pales”を耳コピ
お疲れ様です。高橋です。 久々に耳コピ。Castlevania Symphony …
-
-
シャロム 名前入力画面
お疲れ様です。高橋です。 前回に引き続き、シャロムを耳コピ。 今回は16小節の2 …
-
-
グラディウスのメドレーをArduino+YMZ294で演奏してみた。
お疲れ様です。高橋です。 Arduino+YMZ294で、グラディウスの空中戦の …
-
-
【完全版】グラディウスメドレー by Arduino+YMZ294
お疲れ様です。高橋です。 前に作ったグラディウスメドレーを増強したものを作りまし …
-
-
ファイナルファンタジー2 戦闘テーマ1
お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …




