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を組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
-
USBやDCジャックからの5Vを3.3Vにする物を作った
お疲れ様です。高橋です。 前にesp8266の動作試験を行った時、とても面倒だと …
-
-
ルンバにスピッツを演奏させてみた
お疲れ様です。高橋です。 家にあるルンバにArduinoを挿して、スピッツの「涙 …
-
-
【完成】 電子オルゴール
お疲れ様です。高橋です。 電子オルゴールの制作が佳境に入り、とうとうカルトナージ …
-
-
Arduino電源ON/OFF機
お疲れ様です。高橋です。 Arduinoを使っている時、特に2個とか複数同時に使 …
-
-
秋月製ESP-WROOM-02が動いた
お疲れ様です。高橋です。 秋月で買ったESP-WROOM-02が動きました。AT …
-
-
赤外線リモコンをケースに格納
お疲れ様です。高橋です。 先日作ったATtiny13Aの赤外線リモコンを、ケース …
-
-
クオーツ時計を100倍速&リバースモード付きに改造してみた。
お疲れ様です。高橋です。 今日、奥さんから壊れた時計を貰いました。電池を入れ替え …
-
-
猫×おもちゃ×動画×アプリ
お疲れ様です。高橋です。 金魚水槽 先日フラフラとネットサーフィンしていて目に入 …
-
-
Arduino+EEPROM+YMZ294で曲の抜き差し
お疲れ様です。高橋です。 I2Cの256KBitなEEPROMに曲データを書き込 …
-
-
YMZ294の基板が動いた。
お疲れ様です。高橋です。 先日「ブレッドボード上のYMZ294をユニバーサル基板 …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因