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を組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
-
LEDドライバなる物の存在
お疲れ様です。高橋です。 本日、同僚とLED周りについて雑談していると、「LED …
-
-
【完成】 電子オルゴール
お疲れ様です。高橋です。 電子オルゴールの制作が佳境に入り、とうとうカルトナージ …
-
-
音階LED仮組み
お疲れ様です。高橋です。 先日設計し直した音階LEDを、B型基板上に部品を載せて …
-
-
満員電車内でのオナラと検知 #5
お疲れ様です。高橋です。 マイコンと5V給電 先日実験に成功した硫化水素センサー …
-
-
ルネサス RX621でLチカするまで
お疲れ様です。高橋です。 とある事情のため購入した、ルネサスのRX621マイコン …
-
-
100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。
お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …
-
-
aitendoで買った375円のバックライト付きI2C LCDで文字を表示してみた。
お疲れ様です。高橋です。 ちょっと前にaitendoで買ったバックライト付きのL …
-
-
FM音源YM2203をArduinoで鳴らしたい #2
お疲れ様です。高橋です。 先に結論 FM楽曲及びPSG楽曲の演奏に成功しました。 …
-
-
赤外線リモコンをケースに格納
お疲れ様です。高橋です。 先日作ったATtiny13Aの赤外線リモコンを、ケース …
-
-
大掃除を終え、aitendoで30円で売ってたタクトスイッチ基板でクリスマス
お疲れ様です。高橋です。 aitendoで店頭限定30円だったタクトスイッチ基板 …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因





