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ノイズの高性能が全然発揮出来ていません。次回はもっとピコピコさせてみたいと思います。
以上、よろしくお願い致します。
関連記事
-
-
異邦人・改 for Arduino+YMZ294
お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …
-
-
Arduino+YMZでドラクエ2の「Lovesong探して」を鳴らしてみた。
お疲れ様です。高橋です。 先日作った「DQ2 – Lovesong探して」for …
-
-
異邦人/久保田早紀 for Arduino+YMZ294
お疲れ様です。高橋です。 毎日プログラム書くのは疲れるので、今日は耳コピの日です …
-
-
「DQ2 – Lovesong探して」for Arduino+YMZ294
お疲れ様です。高橋です。 最近、音系を全然やってなかったので、久しぶりに耳コピし …
-
-
ファイナルファンタジー2 戦闘テーマ1
お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …
-
-
Pro Mini互換機でFF2戦闘音楽を使ったYMZ動作試験
お疲れ様です。高橋です。 電子オルゴールの最終形をイメージしてブレッドボード上で …
-
-
グラディウスの音楽をArduinoとYMZ294で3和音で鳴らしてみた。
お疲れ様です。高橋です。 先日、「スーパーの焼き芋製造機近くで鳴っている音楽をA …
-
-
シャロム グリーク城
お疲れ様です。高橋です。 シャロムから、グリーク城の楽曲です。 名曲で、opの次 …
-
-
グラディウス2の3面 古代惑星のテーマをArduino+YMZ294で鳴らしてみた。
お疲れ様です。高橋です。 グラディウス2の3面、古代惑星のテーマをArduino …
-
-
久々に耳コピ。FF4バトル2
お疲れ様です。高橋です。 超ひさしぶりに耳コピしました。 FF4のバトルテーマ2 …