curious4dev

中国旅行、Arduinoなどを使った電子工作、その他色々。

*

ArduinoでPSG音源(YAMAHA YMZ294)を鳴らしてみた。

 

お疲れ様です。高橋です。

先日秋葉原にて「Arduino」という物を買ってきました。

Arduinoって?

Arduinoは「アルデュイーノ」と読むようです。

ar0

 

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のスピーカーも買いました。

IMG_4954

中にはソケットとYMZ294と水晶が入っています。そしてこれらを、上述したサイトの回路図通りに組みます。

IMG_4955

参考サイトにはスピーカーの事が書いてありませんでしたが、YMZ294側のS0とArduino側のGNDを繋げば良いだけっぽいので、繋げます。本当はこの間にLM386というオーディオアンプを挟むと音が大きくなるようですが、既に十分大きすぎるくらい大きく、寝かけていた妻から嫌味を言われたので、LM386は買いません。

秋月電子のwebサイトを見ていたらLM386よりも出力が大きいアンプが50円で売っていたのですが、高橋家にアンプは不要です。金額の問題ではありません。ar03

上記の配線だとさすがにアレなので、回路図作図ツールを使って作図します。

ar01

本当はスピーカーと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ノイズの高性能が全然発揮出来ていません。次回はもっとピコピコさせてみたいと思います。

 

 

以上、よろしくお願い致します。

 - 耳コピArduino

  関連記事

シャロム 名前入力画面

お疲れ様です。高橋です。 前回に引き続き、シャロムを耳コピ。 今回は16小節の2 …

「DQ2 – Lovesong探して」for Arduino+YMZ294

お疲れ様です。高橋です。 最近、音系を全然やってなかったので、久しぶりに耳コピし …

異邦人/久保田早紀 for Arduino+YMZ294

お疲れ様です。高橋です。 毎日プログラム書くのは疲れるので、今日は耳コピの日です …

【完全版】グラディウスメドレー by Arduino+YMZ294

お疲れ様です。高橋です。 前に作ったグラディウスメドレーを増強したものを作りまし …

FF3のオープニングをArduino+YMZシールドで鳴らしてみた

お疲れ様です。高橋です。 ファイナルファンタジー3のオープニング曲を耳コピし、こ …

Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験

お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …

Arduino+YMZでドラクエ2の「Lovesong探して」を鳴らしてみた。

お疲れ様です。高橋です。 先日作った「DQ2 – Lovesong探して」for …

Castlevania SotN “Dance of Pales”を耳コピ

お疲れ様です。高橋です。 久々に耳コピ。Castlevania Symphony …

グラディウス2の3面 古代惑星のテーマをArduino+YMZ294で鳴らしてみた。

お疲れ様です。高橋です。 グラディウス2の3面、古代惑星のテーマをArduino …

シャロム オープニング

お疲れ様です。高橋です。   もう30年以上昔、MSX2を持っていた私 …