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では出力などを一括で変更する […]

  関連記事

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

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

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

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

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

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

シャロム 海の音楽

お疲れ様です。高橋です。 長きに渡ったシャロムの耳コピは、この曲でそろそろ終わり …

シャロム グリーク城

お疲れ様です。高橋です。 シャロムから、グリーク城の楽曲です。 名曲で、opの次 …

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

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

シャロム エンディング前

お疲れ様です。高橋です。 またシャロムを耳コピしました。元の世界に戻った直後の曲 …

異邦人・改 for Arduino+YMZ294

お疲れ様です。高橋です。 先日耳コピした異邦人、なんとなくYMZ294に合わない …

YMZ294で鳴らすためのビッグブリッヂの死闘を作ってみた。

お疲れ様です。高橋です。 Arduino+YMZ294で鳴らすため、「ビッグブリ …

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

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