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を組み合わせてみます。

 

 

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

 - 電子工作

  関連記事

FM音源 FB-01の動作試験

お疲れ様です。高橋です。 先日、会社の大大大先輩からFB-01を貰ったので、本日 …

上司の離着席状態をクラウドに飛ばし、スマホで見れるようにした。

お疲れ様です。高橋です。 前回ブレッドボード上に構築した上司離着席検知システムで …

YMZシールドの作成 #2

お疲れ様です。高橋です。 先日から作っていたYMZシールドですが、本日完成しまし …

抵抗が焼けた – Arduinoで赤外線リモコン

お疲れ様です。高橋です。 今日の実験中、抵抗が焼けてしまいました。 なんか異臭が …

ルンバにスピッツを演奏させてみた

お疲れ様です。高橋です。 家にあるルンバにArduinoを挿して、スピッツの「涙 …

Raspberry Pi2 model B

お疲れ様です。高橋です。 今年見た初夢、「猫×おもちゃ×動画×アプリ」の実現のた …

YMZシールドの基板設計 #2

お疲れ様です。高橋です。 先日行ったYMZシールドの基板設計の設計図を元に、部品 …

bluetoothモジュールHC-06とAndroid

お疲れ様です。高橋です。 先日AliExpressで購入したbluetoothモ …

【完成】 耳コピミキサー

お疲れ様です。高橋です。 作成途中だった耳コピミキサー、やっと完成しました。 思 …

シフトレジスタLED付きのYMZ294回路をFritzingに起こしてみた。

お疲れ様です。高橋です。 ユニバーサル基板で作ったYMZボードと、音階LED及び …