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を組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
-
上司離着席検知システムの作り方
お疲れ様です。高橋です。 上司離着席検知システムの作り方は下記の通りです。 必要 …
-
-
YMZシールドの作成 #2
お疲れ様です。高橋です。 先日から作っていたYMZシールドですが、本日完成しまし …
-
-
Arduino電源ON/OFF機
お疲れ様です。高橋です。 Arduinoを使っている時、特に2個とか複数同時に使 …
-
-
aitendoで買った375円のバックライト付きI2C LCDで文字を表示してみた。
お疲れ様です。高橋です。 ちょっと前にaitendoで買ったバックライト付きのL …
-
-
【完成】PCからシリアル通信でEEPROM書き込み
お疲れ様です。高橋です。 PCからシリアル通信を介して楽曲データをEEPROMに …
-
-
音階LED実装 #2
お疲れ様です。高橋です。 本日も昨日に引き続き半田付け。 今日の進捗 昨日の残り …
-
-
遠隔でRaspberryPi+DCモーターを制御 #2
お疲れ様です。高橋です。 WiMAXが上限オーバー 私の家の自宅回線はWiMAX …
-
-
aitendoで買った4桁7セグLEDを使う
お疲れ様です。高橋です。 aitendoの4桁7セグLED aitendoで1個 …
-
-
満員電車内でのオナラと検知 #5
お疲れ様です。高橋です。 マイコンと5V給電 先日実験に成功した硫化水素センサー …
-
-
電子オルゴール 基板実装 #2 ~ワイヤストリッパー~
お疲れ様です。高橋です。 先日秋葉原でワイヤーストリッパーを買ってきました。 被 …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因