YMZ294のMIDI音源化と、YMZのピン数圧縮
お疲れ様です。高橋です。
YMZで使うピン数を11本から6本に減らす事によって、YMZ294のMIDI音源化が実現出来ました。
曲は、うろ覚えな箱根彫刻の森美術館のCMの音楽です。
YMZのピン数圧縮
下記が最新の実体配線図です。
Arduino側から74HC595に3本の線が伸びており、YMZには黄色い線が3本伸びています。
Arduinoの5,6,7が74HC595に、8,9,10がYMZ294に伸びています。
このミニブレッドボードに74HC595を実装し、Arduinoから来る5,6,7を受け付け、8本のパラレル線を出してます。
元々YMZとArduinoの間にあったパラレルな配線部分を、74HC595から供給しています。
最終的にはこんな感じのブレッドボード群になりました。
上から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;
}
}
}
電子ピアノの上にスペースが無いので、鍵盤の上に置きます。低オクターブ群の鍵盤が押せないです。。
次はこれに音階LEDを組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
-
Raspberry Pi2 model B
お疲れ様です。高橋です。 今年見た初夢、「猫×おもちゃ×動画×アプリ」の実現のた …
-
-
音階LED実装 #1
お疲れ様です。高橋です。 今日の進捗 音階LEDの半田付け 1日目です。 ICソ …
-
-
耳コピミキサー 半田付け #1
お疲れ様です。高橋です。 耳コピ用ミキサーの半田付けを行いました。 ブレッドボー …
-
-
FM音源YM2203をArduinoで鳴らしたい #3
お疲れさまです。高橋です。 昨年8月にブレッドボード上で動作したFM音源YM22 …
-
-
音階LED実装 #4
お疲れ様です。高橋です。 今日は音階LEDのIC-IC間、GNDの敷設、そして1 …
-
-
ブレッドボード上のYMZ294をユニバーサル基板化してみたが。
お疲れ様です。高橋です。 ArduinoからYMZを鳴らしているブレッドボードが …
-
-
【完成】 耳コピミキサー
お疲れ様です。高橋です。 作成途中だった耳コピミキサー、やっと完成しました。 思 …
-
-
音階LEDの再設計
お疲れ様です。高橋です。 本日帰宅途中に電車をぼーっと待っている時、ふと、音階L …
-
-
「びんぼうでいいの」を組み立ててみた。
お疲れ様です。高橋です。 懸案だったヘッドフォンの修理が片付き、やりたい事をやり …
-
-
無線モジュールでモールス信号
お疲れ様です。高橋です。 無線モジュールnRF24L01Pを使った、なんちゃって …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因





