curious4dev

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

*

グラディウスの音楽をArduinoとYMZ294で3和音で鳴らしてみた。

 

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

先日、「スーパーの焼き芋製造機近くで鳴っている音楽をArduinoとYMZ294で鳴らしてみた。」をPOSTしましたが、その時の大きな課題として、

  1. 3和音+1ノイズな音源なはずなのに、2和音しか鳴らない。
  2. 同じ音が連続して鳴ると、音が繋がってしまう。

がありました。

配線の確認

今日は最初の「2和音しか鳴らない」問題を解決すべく、まずは配線の確認から。

ymz02

ArduinoとYMZ294を繋ぐ9本のジャンパー線は、ブレッドボード側が少しグラついていたくらいで、他はなんともありませんでした。念のため全て抜き差し。

回路は前回と全く同じです。

ar01

スケッチの確認

スケッチの中で、音を出す基本部分は、安ギターさんのサイトからDLしたYMZ294のArduino用ライブラリを使い、ライブラリを使う部分も同じく安ギターさんのサイトのサンプルスケッチをコピペし、CH_Cが鳴るような感じで修正していました。安ギターさんのサンプルではCH_AとBしか使っていなかったので、単純にCH_Cの記述を追加すれば良いだろう、と考えたのです。

それが下記です。

#include <YMZ294.h>

#define ADDR_FREQ_A CH_A
#define ADDR_FREQ_B CH_B
#define ADDR_FREQ_C CH_C

// 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.SetEnable(CH_A, true);
 ymz.SetEnable(CH_B, true);
 ymz.SetEnable(CH_C, true);

 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);

 playOpening();
}

void loop() {

 playMain();
}

void set_ch(Channel ch, int note) {
 ymz.SetFrequency(ch, noteFreq[note]);
}

void playOpening(){
 set_ch(ADDR_FREQ_A,76);
 set_ch(ADDR_FREQ_B,64);
 set_ch(ADDR_FREQ_C,59);
 delay(107);
 (以下略)
}
void playMain(){
 set_ch(ADDR_FREQ_A,0);
 set_ch(ADDR_FREQ_A,80);
 set_ch(ADDR_FREQ_B,0);
 set_ch(ADDR_FREQ_B,59);
 set_ch(ADDR_FREQ_C,0);
 set_ch(ADDR_FREQ_C,52);
 delay(124);
 (以下略)
}

よくわかりませんが、あんまり問題無さそうに見えます。

YMZ294のデータシートを確認

秋月電子で何かしらのICを買うと、大抵データシートというものが付いてきます。良くわからなかったので全然読んでませんでしたが、改めて中身を真剣に読んでみました。すると、

ymz01

というように、ミキサーの設定でレジスタに「0」を書き込むと音を出力します、とあります。

再度スケッチの確認

YMZ294のミキサーの設定をしているのが、下記の記述です。

 ymz.SetMixer(0b111, 0b100);

そして、ライブラリ側のメソッドの中身が下記です。

// ------ Mixer Functions ---------------------------------------- */
void YMZ294::SetMixer(byte noise, byte square)
{
 mixer = ((noise & 0b111) << 3) | (square & 0b111);
 set_register(REG_MIXER, mixer);
}

引数としてノイズのビットと音のビットが別れて設定出来るようになっており、ビットシフトさせて一度に書き込んでいます。音部分のビットは ‘000’ じゃないと、CH_Cが鳴らないという事なので、

 ymz.SetMixer(0b111, 0b100);

こうなっている所を、

 ymz.SetMixer(0b111, 0b000);

こう直しました。

折角なので新楽曲

この修正でおそらく3和音鳴るようになるので、その感動をグラディウスの音楽で体験したいと思い、頭の中に残っている記憶を頼りに耳コピ&SMF作成。

waon01

そして、出来た物がこちらです。


3和音、無事に鳴りました。

今後

同じノートの音が繋がる問題の解決は、また後日。

前はオペアンプ LM386の事をディスっていましたが、やっぱりあったほうが音が良いような気もするので、買ってこようかどうか悩み中です。

ステレオジャックも買ってこようかどうか悩み中です。これは50円なので、多分買います。LM386買うなら、これも必須です。主に妻からの嫌味対策です。

この問題が片付いたら、別の事にブレッドボードを使いたいんだけど、YMZもたまに使いたいので、きちんと半田ごて使って基板作るかどうか悩み中。ただ、半田ごては800円くらいするし。面倒だし、半田も必要だし基板も必要だし、本当に悩み中。

 

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

 - 耳コピArduino

Comment

  1. […] 配線とかソフトとかは高橋さんの記事を参考というかコピペしています。 変更点としてはwp.hrmux.comさんのサイトのライブラリを少し変更しました。 Edisonでは出力などを一括で変更する […]

  関連記事

久しぶりに耳コピ。FF4バトルテーマ。

お疲れ様です。高橋です。 とても久しぶりに耳コピしました。ファイナルファンタジー …

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

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

ファイナルファンタジー2 戦闘テーマ1

お疲れ様です。高橋です。 最近耳コピしてなかったので、耳コピしました。 3和音し …

異邦人をArduino+YMZ294で演奏させてみた

お疲れ様です。高橋です。 Arduino+YMZ294で、久保田早紀の異邦人(1 …

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

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

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

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

グラディウス モーニングミュージックをArduino+YMZ294用に耳コピしてみた。

お疲れ様です。高橋です。 アーケード版グラディウスの磁気バブルメモリが暖まるまで …

音階に合わせてLEDを光らせてみた。

お疲れ様です。高橋です。 主旋律に合わせてLEDを光らせてみる実験を行いました。 …

「FF5/ビッグブリッヂの死闘」をArduino+YMZ294で鳴らしてみた。

お疲れ様です。高橋です。 先日「YMZ294で鳴らすためのビッグブリッヂの死闘を …

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

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