curious4dev

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

*

YMZ294のMIDI音源化と、YMZのピン数圧縮

 

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

YMZで使うピン数を11本から6本に減らす事によって、YMZ294のMIDI音源化が実現出来ました。

曲は、うろ覚えな箱根彫刻の森美術館のCMの音楽です。

YMZのピン数圧縮

下記が最新の実体配線図です。
041901Arduino側から74HC595に3本の線が伸びており、YMZには黄色い線が3本伸びています。

Arduinoの5,6,7が74HC595に、8,9,10がYMZ294に伸びています。

IMG_5415

このミニブレッドボードに74HC595を実装し、Arduinoから来る5,6,7を受け付け、8本のパラレル線を出してます。

IMG_5416

元々YMZとArduinoの間にあったパラレルな配線部分を、74HC595から供給しています。

IMG_5417

最終的にはこんな感じのブレッドボード群になりました。

IMG_5418

上からMIDI関連、YMZ294関連、74HC595関連です。

ライブラリの修正

こちらを実装するにあたり、使わせてもらってるインパクトドリルさんのYMZ294ライブラリの修正が必要です。

まずYMZ294という名前を全体的にYMZ294RSっていうふうに変えて、既存のものと被らないようにします。ファイルもコピった上でリネームします。

コンストラクタに引数を3つ追加します。

YMZ294RS::YMZ294RS(byte wrcs_pin, byte a0_pin, byte reset_pin, byte data_pin, byte latch_pin, byte clock_pin)
 : WRCS_PIN(wrcs_pin), A0_PIN(a0_pin), RESET_PIN(reset_pin), DATA_YMZ(data_pin), LATCH_YMZ(latch_pin), CLOCK_YMZ(clock_pin)
{
 param_reset();
}

そして、set_registerというライブラリ内のset_registerメソッドを74HC595対応します。

void YMZ294RS::set_register(byte addr, byte value)
{
 // addr
 digitalWrite(WRCS_PIN, LOW);
 digitalWrite(A0_PIN, LOW);
 digitalWrite(LATCH_YMZ, LOW);
 shiftOut(DATA_YMZ, CLOCK_YMZ, MSBFIRST, addr);
 digitalWrite(LATCH_YMZ, HIGH);
 digitalWrite(WRCS_PIN, HIGH);

 // value
 digitalWrite(WRCS_PIN, LOW);
 digitalWrite(A0_PIN, HIGH);
 digitalWrite(LATCH_YMZ, LOW);
 shiftOut(DATA_YMZ, CLOCK_YMZ, MSBFIRST, value);
 digitalWrite(LATCH_YMZ, HIGH);
 digitalWrite(WRCS_PIN, HIGH);
}

プライベートメンバ変数に3つ追加(DATA, LATCH, CLOCK)します。

private:
 // Arduino Pins
 const byte WRCS_PIN;
 const byte A0_PIN;
 const byte RESET_PIN;
 const byte DATA_YMZ;
 const byte LATCH_YMZ;
 const byte CLOCK_YMZ;

これでOK。

最終的なスケッチは下記の通りです。

#include <YMZ294RS.h>
#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

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

// YMZ595 Pins
const byte DATA_YMZ = 5;
const byte LATCH_YMZ = 6;
const byte CLOCK_YMZ = 7;

// Output Pins
const byte WRCS_PIN = 8;
const byte A0_PIN = 9;
const byte RESET_PIN = 10;

const int MIDI_IN_CHANNEL = 1;
int BEFORE_NOTE_A = 0;
int BEFORE_NOTE_B = 0;
int BEFORE_NOTE_C = 0;
int note;
Channel ch;

//-----------------------------------------------
//-- for YMZ294
//-----------------------------------------------
YMZ294RS ymz(WRCS_PIN, A0_PIN, RESET_PIN, DATA_YMZ, LATCH_YMZ, CLOCK_YMZ);

void set_ch(Channel ch, int note) {

 if ( note == 0) {
 ymz.SetVolume(ch, 0b00000000);
 ymz.SetFrequency(ch, noteFreq[0]);
 } else {
 ymz.SetVolume(ch, 0b00001110);
 ymz.SetFrequency(ch, noteFreq[note]);

 }

}

void setup() {
 MIDI.begin(0);
 //-- for 74HC595
 pinMode(DATA_YMZ, OUTPUT);
 pinMode(LATCH_YMZ, OUTPUT);
 pinMode(CLOCK_YMZ, OUTPUT);

 //-- for YMZ294
 DDRD = 0b11111111;
 pinMode(WRCS_PIN, OUTPUT);
 pinMode(A0_PIN, OUTPUT);
 pinMode(RESET_PIN, OUTPUT);
 ymz.Reset();
 ymz.SetMixer(0b111, 0b000);
 ymz.SetVolume(CH_A, 0b00001110);
 ymz.SetFreqBit(CH_A, 0);
 ymz.SetVolume(CH_B, 0b00001110);
 ymz.SetFreqBit(CH_B, 0);
 ymz.SetVolume(CH_C, 0b00001110);
 ymz.SetFreqBit(CH_C, 0);

 ymz.SetEnvEnable(CH_A, false);
 ymz.SetEnvEnable(CH_B, false);
 ymz.SetEnvEnable(CH_C, false);

}

void loop() {
 if (MIDI.read()) {
 MIDI.setInputChannel(MIDI_IN_CHANNEL); // Channel

 switch (MIDI.getType()) {
 case midi::NoteOn:
 note = MIDI.getData1(); // note no
 if(BEFORE_NOTE_A == 0) {
 BEFORE_NOTE_A = note;
 ch = CH_A;
 } else if(BEFORE_NOTE_B == 0) {
 BEFORE_NOTE_B = note;
 ch = CH_B;
 } else {
 BEFORE_NOTE_C = note;
 ch = CH_C;
 }
 set_ch(ch, note);
 break;
 case midi::NoteOff:
 note = MIDI.getData1(); // note no
 if(BEFORE_NOTE_A == note) {
 BEFORE_NOTE_A = 0;
 ch = CH_A;
 } else if(BEFORE_NOTE_B == note) {
 BEFORE_NOTE_B = 0;
 ch = CH_B;
 } else {
 BEFORE_NOTE_C = 0;
 ch = CH_C;
 }
 set_ch(ch, 0);
 break;
 default:
 break;
 }
 }
}

電子ピアノの上にスペースが無いので、鍵盤の上に置きます。低オクターブ群の鍵盤が押せないです。。

IMG_5435

次はこれに音階LEDを組み合わせてみます。

 

 

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

 - 電子工作

  関連記事

PCとArduino間でのシリアル通信を介したEEPROM書き込み(難航)

お疲れ様です。高橋です。 Arduino Pro MiniでI2C EEPROM …

FM音源YM2203をArduinoで鳴らしたい #2

お疲れ様です。高橋です。 先に結論 FM楽曲及びPSG楽曲の演奏に成功しました。 …

100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。

お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …

電子オルゴール 基板実装 #1

お疲れ様です。高橋です。 Pro Mini互換機を贅沢に使った電子オルゴールの仮 …

音階LED実装 #1

お疲れ様です。高橋です。 今日の進捗 音階LEDの半田付け 1日目です。 ICソ …

iPhoneでルンバを操作してみたい

お疲れ様です。高橋です。 突然ですがiPhoneでルンバを操作したいと思います。 …

【完成】ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン

お疲れ様です。高橋です。 苦戦していたArduinoIDE1.6.4を使ったAT …

音階LED実装 #2

お疲れ様です。高橋です。 本日も昨日に引き続き半田付け。 今日の進捗 昨日の残り …

EEPROM書き込みシールドの作成

お疲れ様です。高橋です。 先日成功したPCからのEEPROM書き込みですが、ジャ …

満員電車内でのオナラと検知 #3

お疲れ様です。高橋です。 先日秋月で購入した音声合成LSIのATP3011。やっ …