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を組み合わせてみます。
以上、よろしくお願い致します。
関連記事
-
PCとArduino間でのシリアル通信を介したEEPROM書き込み(難航)
お疲れ様です。高橋です。 Arduino Pro MiniでI2C EEPROM …
-
FM音源YM2203をArduinoで鳴らしたい #2
お疲れ様です。高橋です。 先に結論 FM楽曲及びPSG楽曲の演奏に成功しました。 …
-
100均で買ったボリュームコントロール付きステレオ延長コードを、バブ型スピーカーに搭載してみた。
お疲れ様です。高橋です。 先日作ったバブ型スピーカーですが、実は裏側がとても汚い …
-
電子オルゴール 基板実装 #1
お疲れ様です。高橋です。 Pro Mini互換機を贅沢に使った電子オルゴールの仮 …
-
音階LED実装 #1
お疲れ様です。高橋です。 今日の進捗 音階LEDの半田付け 1日目です。 ICソ …
-
iPhoneでルンバを操作してみたい
お疲れ様です。高橋です。 突然ですがiPhoneでルンバを操作したいと思います。 …
-
【完成】ArduinoIDE1.6.4+ATTiny13Aで赤外線リモコン
お疲れ様です。高橋です。 苦戦していたArduinoIDE1.6.4を使ったAT …
-
音階LED実装 #2
お疲れ様です。高橋です。 本日も昨日に引き続き半田付け。 今日の進捗 昨日の残り …
-
EEPROM書き込みシールドの作成
お疲れ様です。高橋です。 先日成功したPCからのEEPROM書き込みですが、ジャ …
-
満員電車内でのオナラと検知 #3
お疲れ様です。高橋です。 先日秋月で購入した音声合成LSIのATP3011。やっ …
- PREV
- MIDI INの実験
- NEXT
- 遅刻の言い訳アプリのDL数が急増した原因