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を組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
-
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及び …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因